{"version":3,"sources":["webpack:///./src/js/constants/index.js","webpack:///./src/js/helpers/escape.js","webpack:///./src/js/helpers/html.js","webpack:///./src/js/helpers/storage.js","webpack:///./src/js/service/oneworld.js","webpack:///./src/js/components/Autocomplete.js","webpack:///./src/js/helpers/search.js","webpack:///./src/js/modules/FindLounges.js"],"names":["URLS","ONETREE_API_URL","process","ONEWORLD_API_URL","KEYS","LOUNGES_APP_KEY","AIRPORT_APP_KEY","ONEWORLD_APP_KEY","IDS","AIRPORT_APP_ID","LOUNGES_APP_ID","ONEWORLD_APP_ID","ENDPOINTS","getAirports","findLounges","searchFlights","getAirlines","deepLink","TIERSMAP","SapphireAndHigher","RubyAndHigher","Emerald","Sapphire","Ruby","ACCESS_CLASS_MAP","BusinessAndHigher","First","AMENITIES_ARRAY","FACILITIES_ARRAY","FOOD_BEVERAGE_ARRAY","ENTERTAINMENT_COMMS_ARRAY","AIRLINE_LOGOS","KA","4M","XL","DATE_FORMAT","FLIGHT_DATE_FORMAT","BREAKPOINT","mobile","tablet","desktop","wide","escape","s","replace","call","reEscape","fnEscape","unescape","reUnescape","fnUnescape","oEscape","&","<",">","'","\"","oUnescape","&amp;","&#38;","&lt;","&#60;","&gt;","&#62;","&apos;","&#39;","&quot;","&#34;","String","prototype","m","shtml","pieces","result","substitutions","slice","arguments","i","length","_escape","html","__webpack_require__","setItem","key","value","jsonText","JSON","stringify","sessionStorage","error","console","getItem","parse","_callee","airports","url","data","config","options","undefined","regeneratorRuntime","wrap","_context","prev","next","_storage","AIRPORTS_CACHE_KEY","_extends","AIRPORTS_APP","type","dataType","$","ajax","sent","abrupt","stop","this","_callee2","airportCode","_context2","_callee3","baseUrl","_ref5","from","to","departureDate","returnDate","_context3","getJSON","appKey","appId","_callee4","airlinesObj","airlines","_context4","AIRLINES_CACHE_KEY","reduce","acc","airline","code","_ref2","airport","_objectWithoutProperties","LOUNGES_APP","getDeepLinkUrl","route","params","routeOperatingCarrierCode","legs","routeDepartureDateCode","cityFrom","cityTo","countryFrom","countryTo","firstLeg","lastLeg","departureCityCode","arrivalCityCode","departureCountryCode","arrivalCountryCode","qs","push","join","getFlightBookForm","getFlightBookUrl","_ref7","_constants","app_id","app_key","_core","_html","PROPS","Autocomplete","Component","ready","validateConfig","dom","$document","document","$input","$el","find","$list","append","SPINNER","$spinner","resetItems","on","handleKeypress","bind","_debounce2","default","handleKeyup","handleClick","handleMouseEnter","handleClickOutside","e","keyCode","prevItem","nextItem","selectItem","indexOf","parseInt","addClass","getData","currentTarget","renderItems","t0","removeClass","$item","index","children","activeIndex","props","filter","closeList","empty","selectedIndex","_this2","Array","isArray","items","map","item","_templateObject","render","openList","setActiveItem","$items","eq","itemHeight","outerHeight","scrollTop","viewport","offset","val","focus","target","closest","_this3","missingProp","search","criteria","results","defaultOptions","forEach","matches","match","sort","item1","item2","r","highlight","searchAirports","matchesCode","getValue","Code","matchesName","Name","City","highlightAirports","_item$item","specialChars","tokenSeparator","ignoreCase","pos","self","prevIndex","text","tokens","trim","split","word","matchesByToken","numMatches","token","lastIndex","len","toLowerCase","matchToken","apply","_toConsumableArray","m1","m2","_search","_oneworld","FindLounges","$form","$location","airportsUrl","redirectUrl","loungeListId","redirectWhenLocationParams","location","filterAirports","getAirportValue","handleRedirect","handleSubmit","URLSearchParams","window","get","listId","href","preventDefault","locationItem","getSelectedItem","onFind","findItemByCode","toUpperCase","setSelectedItem"],"mappings":"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","file":"2.4a4254a4433d846c5539.bundle.js","sourcesContent":["const { NODE_ENV } = process.env;\nconst dev = NODE_ENV === 'development';\n\n//urls\nexport const URLS = {\n  ONETREE_API_URL: dev\n    ? process.env.ONETREE_API_STAGING_URL\n    : process.env.ONETREE_API_PROD_URL,\n  ONEWORLD_API_URL: dev\n    ? process.env.ONEWORLD_API_STAGING_ENDPOINT\n    : process.env.ONEWORLD_API_PROD_ENDPOINT\n};\n\n//keys\nexport const KEYS = {\n  LOUNGES_APP_KEY: dev\n    ? process.env.LOUNGES_STAGING_APP_KEY\n    : process.env.LOUNGES_PROD_APP_KEY,\n  AIRPORT_APP_KEY: dev\n    ? process.env.AIRPORT_STAGING_APP_KEY\n    : process.env.AIRPORT_PROD_APP_KEY,\n  ONEWORLD_APP_KEY: dev\n    ? process.env.ONEWORLD_STAGING_APP_KEY\n    : process.env.ONEWORLD_PROD_APP_KEY\n};\n\nexport const IDS = {\n  AIRPORT_APP_ID: process.env.AIRPORT_APP_ID,\n  LOUNGES_APP_ID: process.env.LOUNGES_APP_ID,\n  ONEWORLD_APP_ID: process.env.ONEWORLD_APP_ID\n};\n\n// endpoints\nexport const ENDPOINTS = {\n  // GET\n  getAirports: `${URLS.ONETREE_API_URL}/wayfinding/v1/Airports`,\n  findLounges: `${URLS.ONETREE_API_URL}/lounge/v1/lounges/airport`,\n  searchFlights: `${URLS.ONEWORLD_API_URL}/onetree-api/api/v1/flight-search`,\n  getAirlines: `${URLS.ONEWORLD_API_URL}/onetree-api/api/v1/airlines`,\n  deepLink: `${URLS.ONEWORLD_API_URL}/onetree-api/api/v1/deep-link`\n};\n\nexport const TIERSMAP = {\n  SapphireAndHigher: ['Sapphire', 'Emerald'],\n  RubyAndHigher: ['Ruby', 'Sapphire', 'Emerald'],\n  Emerald: ['Emerald'],\n  Sapphire: ['Sapphire'],\n  Ruby: ['Ruby']\n};\n\nexport const ACCESS_CLASS_MAP = {\n  BusinessAndHigher: ['Business', 'First'],\n  First: ['First']\n};\n\nexport const AMENITIES_ARRAY = [\n  'BusinessCenter',\n  'TV',\n  'FoodBeverageSnackBuffet',\n  'Phone',\n  'PreFlightDinner',\n  'RelaxationRoom',\n  'Shower',\n  'SPA',\n  'WheelchairAccess',\n  'WiFi'\n];\n\nexport const FACILITIES_ARRAY = [\n  'BusinessCenter',\n  'FoodBeverageHotBuffet',\n  'WheelchairAccess',\n  'Shower',\n  'AirConditioning',\n  'Restroom',\n  'RunwayViews',\n  'FlighInformationScreen'\n];\n\nexport const FOOD_BEVERAGE_ARRAY = [\n  'FoodBeverageSnackBuffet',\n  'FoodBeveragesAlcoholic',\n  'FoodBeverageChampagne',\n  'FoodBeverageHotBuffet',\n  'FoodBeverageHotFood',\n  'FoodBeverageAlaCarte',\n  'FoodBeverageVegetarian',\n  'FoodBeverageWaiter',\n  'PreFlightDinner',\n  'FoodBeverageSpecialCoffee'\n];\n\nexport const ENTERTAINMENT_COMMS_ARRAY = [\n  'TV',\n  'EthernetConnection',\n  'ChargingFacticilites',\n  'Phone',\n  'ReadingMaterials'\n];\n\nexport const AIRLINE_LOGOS = {\n  KA: '/images/airlines/cathay-dragon/cathay-dragon-logo.png',\n  '4M': '/images/airlines/latam/latam-logo.png',\n  XL: '/images/airlines/latam/latam-logo.png'\n};\n\nexport const DATE_FORMAT = 'm/d/Y';\nexport const FLIGHT_DATE_FORMAT = 'd/M/Y';\n\n// breakpoints\nexport const BREAKPOINT = {\n  mobile: 320,\n  tablet: 768,\n  desktop: 1025,\n  wide: 1440\n};\n","// see https://developers.google.com/web/updates/2015/01/ES6-Template-Strings\n\nconst reEscape = /[&<>'\"]/g;\nconst reUnescape = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\nconst oEscape = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  \"'\": '&#39;',\n  '\"': '&quot;'\n};\nconst oUnescape = {\n  '&amp;': '&',\n  '&#38;': '&',\n  '&lt;': '<',\n  '&#60;': '<',\n  '&gt;': '>',\n  '&#62;': '>',\n  '&apos;': \"'\",\n  '&#39;': \"'\",\n  '&quot;': '\"',\n  '&#34;': '\"'\n};\nconst replace = String.prototype.replace;\n\nfunction fnEscape(m) {\n  return oEscape[m];\n}\n\nfunction fnUnescape(m) {\n  return oUnescape[m];\n}\n\nexport function escape(s) {\n  return replace.call(s, reEscape, fnEscape);\n}\nexport function unescape(s) {\n  return replace.call(s, reUnescape, fnUnescape);\n}\n","import { escape } from './escape';\n\n// Tagged template function\nexport function shtml(pieces) {\n  let result = pieces[0];\n  const substitutions = [].slice.call(arguments, 1);\n\n  for(let i = 0; i < substitutions.length; ++i) {\n    result += escape(substitutions[i]) + pieces[i + 1];\n  }\n\n  return result;\n}\n\nexport function html(pieces) {\n  let result = pieces[0];\n  const substitutions = [].slice.call(arguments, 1);\n\n  for(let i = 0; i < substitutions.length; ++i) {\n    result += substitutions[i] + pieces[i + 1];\n  }\n\n  return result;\n}\n","/* global sessionStorage */\n\nexport function setItem(key, value) {\n  try {\n    const jsonText = JSON.stringify(value);\n    sessionStorage.setItem(key, jsonText);\n  } catch (error) {\n    console.error(`Error adding ${key} to sessionStorage`, error);\n  }\n}\n\nexport function getItem(key) {\n  const jsonText = sessionStorage.getItem(key);\n\n  if (!jsonText) {\n    return null;\n  }\n\n  try {\n    return JSON.parse(jsonText);\n  } catch (error) {\n    console.error(`Error getting ${key} from sessionStorage`, error);\n    return null;\n  }\n}\n","import $ from 'jquery';\nimport { KEYS, IDS, ENDPOINTS } from '../constants';\nimport { getItem, setItem } from '../helpers/storage';\n\nconst AIRPORTS_APP = {\n  app_id: IDS.AIRPORT_APP_ID,\n  app_key: KEYS.AIRPORT_APP_KEY\n};\n\nconst LOUNGES_APP = {\n  app_id: IDS.LOUNGES_APP_ID,\n  app_key: KEYS.LOUNGES_APP_KEY\n};\n\nexport const AIRPORTS_CACHE_KEY = 'OW_AIRPORTS';\nconst AIRLINES_CACHE_KEY = 'OW_AIRLINES';\n\nexport async function getAirports(options = {}) {\n  let airports = getItem(AIRPORTS_CACHE_KEY),\n    url = ENDPOINTS.getAirports;\n\n  if (!airports) {\n    let data = { ...AIRPORTS_APP };\n\n    if (options.data) {\n      data = { ...options.data, ...AIRPORTS_APP };\n    }\n    if (options.url) {\n      url = options.url;\n    }\n\n    const config = {\n      type: 'GET',\n      dataType: 'JSON',\n      ...options,\n      url,\n      data\n    };\n\n    airports = await $.ajax(config);\n    setItem(AIRPORTS_CACHE_KEY, airports);\n  }\n\n  return airports;\n}\n\nexport function findLounges({ airport, url, ...options } = {}) {\n  let data = { ...LOUNGES_APP },\n    baseUrl = ENDPOINTS.findLounges;\n\n  if (url) {\n    baseUrl = url;\n  }\n\n  if (options.data) {\n    data = { ...options.data, ...AIRPORTS_APP };\n  }\n\n  baseUrl = `${baseUrl}/${airport}`;\n\n  return $.ajax({\n    url: baseUrl,\n    type: 'GET',\n    dataType: 'JSON',\n    ...options,\n    data\n  });\n}\n\nexport async function searchAirportFastTrack(airportCode) {\n  return $.ajax({\n    url: `/api/airport?airportCode=${airportCode}`,\n    type: 'GET',\n    dataType: 'JSON'\n  })\n}\n\nexport async function searchFlights(\n  url,\n  { from, to, departureDate, returnDate } = {}\n) {\n  let baseUrl = ENDPOINTS.searchFlights;\n\n  if (url) {\n    baseUrl = url;\n  }\n\n  return $.getJSON(`${baseUrl}/${from}/${to}`, {\n    appKey: KEYS.ONEWORLD_APP_KEY,\n    appId: IDS.ONEWORLD_APP_ID,\n    departureDate,\n    returnDate\n  });\n}\n\nexport async function getAirlines() {\n  let airlinesObj = getItem(AIRLINES_CACHE_KEY);\n\n  if (!airlinesObj) {\n    const url = ENDPOINTS.getAirlines;\n    const airlines = await $.getJSON(`${url}`, {\n      appKey: KEYS.ONEWORLD_APP_KEY,\n      appId: IDS.ONEWORLD_APP_ID\n    });\n    airlinesObj = airlines.reduce((acc, airline) => {\n      acc[airline.code] = airline;\n      return acc;\n    }, {});\n\n    setItem(AIRLINES_CACHE_KEY, airlinesObj);\n  }\n\n  return airlinesObj;\n}\n\nexport function getDeepLinkUrl(route, params) {\n  const { from, to, departureDate, returnDate } = params;\n  const { routeOperatingCarrierCode, legs, routeDepartureDateCode } = route;\n\n  let cityFrom = 'XXX',\n    cityTo = 'XXX',\n    countryFrom = 'XX',\n    countryTo = 'XX';\n\n  if (legs && legs.length) {\n    const firstLeg = legs[0];\n    const lastLeg = legs[legs.length - 1];\n\n    cityFrom = firstLeg.departureCityCode || 'XXX';\n    cityTo = lastLeg.arrivalCityCode || 'XXX';\n    countryFrom = firstLeg.departureCountryCode || 'XX';\n    countryTo = lastLeg.arrivalCountryCode || 'XX';\n  }\n\n  const qs = [\n    `appKey=${KEYS.ONEWORLD_APP_KEY}`,\n    `appId=${IDS.ONEWORLD_APP_ID}`,\n    `from=${from}`,\n    `to=${to}`,\n    `cityFrom=${cityFrom}`,\n    `cityTo=${cityTo}`,\n    `countryFrom=${countryFrom}`,\n    `countryTo=${countryTo}`,\n    `departureDate=${departureDate}`,\n    `routeDepartureDateCode=${routeDepartureDateCode}`\n  ];\n  if (returnDate) {\n    qs.push(`returnDate=${returnDate}`);\n  }\n  return `${ENDPOINTS.deepLink}/${routeOperatingCarrierCode}?${qs.join('&')}`;\n}\n\nexport function getFlightBookForm(url) {\n  return $.ajax({\n    url,\n    type: 'GET',\n    dataType: 'html'\n  });\n}\n\nexport function getFlightBookUrl({ url, type, data }) {\n  return $.ajax({\n    url,\n    type,\n    dataType: 'JSON',\n    data\n  });\n}\n","import { Component } from '@verndale/core';\nimport debounce from 'lodash/debounce';\nimport { html } from '../helpers/html';\n\nconst PROPS = ['filter', 'render', 'value'];\nconst ARROW_LEFT = 37;\nconst ARROW_UP = 38;\nconst ARROW_RIGHT = 39;\nconst ARROW_DOWN = 40;\nconst ENTER = 13;\nconst TAB = 9;\nconst SHIFT = 16;\nconst KEYS = [ARROW_LEFT, ARROW_UP, ARROW_RIGHT, ARROW_DOWN, ENTER, TAB, SHIFT];\nconst SPINNER = `\n  <div class=\"autocomplete__spinner\">\n    <div class=\"spinner\">\n      <svg>\n        <use xlink:href=\"#spinner-of-dots\"></use>\n      </svg>\n    </div>\n  </div>\n`;\n\nclass Autocomplete extends Component {\n  setupDefaults() {\n    this.ready = this.validateConfig();\n\n    if (this.ready) {\n      this.dom = {\n        $document: $(document),\n        $input: this.$el.find('.autocomplete__input'),\n        $list: this.$el.find('.autocomplete__list')\n      };\n\n      this.$el.append(SPINNER);\n\n      this.dom = {\n        $spinner: this.$el.find('.spinner')\n      };\n\n      this.resetItems();\n    }\n  }\n\n  addListeners() {\n    if (this.ready) {\n      this.dom.$input.on('keydown', ::this.handleKeypress);\n      this.dom.$input.on('keyup', debounce(::this.handleKeyup, 50));\n      this.dom.$list.on('click', '.autocomplete__item', ::this.handleClick);\n      this.dom.$list.on(\n        'mouseenter',\n        '.autocomplete__item',\n        ::this.handleMouseEnter\n      );\n      this.dom.$document.on('click', ::this.handleClickOutside);\n    }\n  }\n\n  handleKeypress(e) {\n    switch (e.keyCode) {\n    case ARROW_UP:\n      this.prevItem();\n      return false;\n    case ARROW_DOWN:\n      this.nextItem();\n      return false;\n    case ENTER:\n      this.selectItem();\n      return false;\n    default:\n      return true;\n    }\n  }\n\n  async handleKeyup(e) {\n    if (KEYS.indexOf(parseInt(e.keyCode, 10)) < 0) {\n      try {\n        this.$el.addClass('loading');\n        this.dom.$spinner.addClass('is-active');\n        this.data = await this.getData(e.currentTarget.value);\n        this.renderItems();\n      } catch (error) {\n        console.error(error);\n      }\n      this.$el.removeClass('loading');\n      this.dom.$spinner.removeClass('is-active');\n    }\n  }\n\n  handleClick(e) {\n    const $item = $(e.currentTarget);\n    const index = this.dom.$list.children().index($item);\n    this.activeIndex = index;\n    this.selectItem();\n  }\n\n  getData(value) {\n    return this.props.filter(value);\n  }\n\n  resetItems() {\n    this.closeList();\n    this.dom.$list.empty();\n    this.selectedIndex = -1;\n    this.activeIndex = -1;\n  }\n\n  renderItems() {\n    this.resetItems();\n\n    if (!Array.isArray(this.data)) {\n      return;\n    }\n\n    const items = this.data.map(\n      item => html`\n        <li class=\"autocomplete__item\">${this.props.render(item)}</li>\n      `\n    );\n\n    if (items.length) {\n      this.openList();\n    }\n    this.dom.$list.html(items.join(''));\n  }\n\n  prevItem() {\n    if (this.activeIndex > 0) {\n      this.activeIndex--;\n    } else {\n      this.activeIndex = this.dom.$list.children().length - 1;\n    }\n    this.setActiveItem(this.activeIndex);\n  }\n\n  nextItem() {\n    if (this.activeIndex < this.dom.$list.children().length - 1) {\n      this.activeIndex++;\n    } else {\n      this.activeIndex = 0;\n    }\n    this.setActiveItem(this.activeIndex);\n  }\n\n  setActiveItem(index) {\n    const $items = this.dom.$list.children();\n    const $item = $items.eq(index);\n    $items.removeClass('autocomplete__item--active');\n    $item.addClass('autocomplete__item--active');\n\n    const itemHeight = $item.outerHeight();\n    const scrollTop = this.dom.$list.scrollTop();\n    const viewport = scrollTop + this.dom.$list.outerHeight();\n    const offset = itemHeight * index;\n\n    if (offset < scrollTop || offset + itemHeight > viewport) {\n      this.dom.$list.scrollTop(offset);\n    }\n  }\n\n  handleMouseEnter(e) {\n    const $item = $(e.currentTarget);\n    const index = this.dom.$list.children().index($item);\n    this.setActiveItem(index);\n  }\n\n  selectItem() {\n    const $items = this.dom.$list.children();\n    const item = this.data[this.activeIndex];\n    const value = this.props.value(item);\n    this.selectedIndex = this.activeIndex;\n\n    $items.removeClass('autocomplete__item--active');\n    this.dom.$input.val(value);\n    this.dom.$input.focus();\n    this.closeList();\n  }\n\n  getSelectedItem() {\n    if (this.selectedIndex < 0) {\n      return null;\n    }\n    const item = this.data[this.selectedIndex];\n    if (!item) {\n      return null;\n    }\n    return item.item;\n  }\n\n  setSelectedItem(item) {\n    const value = this.props.value(item);\n\n    this.resetItems();\n    this.selectedIndex = 0;\n    this.data = [item];\n    this.dom.$input.val(value);\n    // this.dom.$input.focus();\n    this.closeList();\n  }\n\n  openList() {\n    this.dom.$list.addClass('autocomplete__list--active');\n  }\n\n  closeList() {\n    this.dom.$list.removeClass('autocomplete__list--active');\n  }\n\n  handleClickOutside(e) {\n    if (!$(e.target).closest(this.$el).length) {\n      this.closeList();\n    }\n  }\n\n  validateConfig() {\n    const missingProp = PROPS.filter(key => !this.props[key]);\n    if (missingProp.length) {\n      console.error(`Autocomponent - ${missingProp} must be defined`);\n    }\n    return true;\n  }\n}\n\nexport default Autocomplete;\n","const SPECIAL_CHARS = /[`~!@#$%^&*()_|+\\-=?;:'\".,<>\\{\\}\\[\\]\\\\\\/]/gi;\nconst TOKEN_SEPARATOR = /[\\s()-.]+/g;\n\nconst defaultOptions = {\n  specialChars: SPECIAL_CHARS,\n  tokenSeparator: TOKEN_SEPARATOR,\n  ignoreCase: true,\n  getValue: () => ''\n};\n\nexport function search(data, criteria, options) {\n  const results = [];\n  const config = {\n    ...defaultOptions,\n    ...options\n  };\n\n  data.forEach((item, index) => {\n    const matches = match(criteria, item, config);\n    if (matches.length) {\n      results.push({ item, matches, index });\n    }\n  });\n\n  return results.sort((item1, item2) => {\n    const r = item2.matches.length - item1.matches.length;\n    if (r === 0) {\n      return item1.index - item2.index;\n    }\n    return r;\n  });\n}\n\nexport function highlight(value, matches) {\n  return matches.reduce(\n    (acc, pos, index, self) => {\n      acc.result = `${acc.result +\n        value.slice(acc.prevIndex, pos[0])}<b>${value.slice(\n        pos[0],\n        pos[1]\n      )}</b>`;\n\n      if (self.length === index + 1) {\n        acc.result = acc.result + value.slice(pos[1]);\n      }\n\n      acc.prevIndex = pos[1];\n\n      return acc;\n    },\n    { prevIndex: 0, result: '' }\n  ).result;\n}\n\nexport function searchAirports(data, criteria) {\n  const results = [];\n\n  data.forEach((item, index) => {\n    // Check if code matches\n    const matchesCode = match(criteria, item, {\n      ...defaultOptions,\n      getValue: item => item.Code\n    });\n\n    // Check if name matches\n    const matchesName = match(criteria, item, {\n      ...defaultOptions,\n      getValue: item => `${item.Name} ${item.City}`\n    });\n\n    if (matchesCode.length || matchesName.length) {\n      results.push({ item, matchesCode, matchesName, index });\n    }\n  });\n\n  return results.sort((item1, item2) => {\n    let r = 0;\n\n    if (item2.matchesCode.length && item1.matchesCode.length) {\n      r = item1.matchesCode[0][0] - item2.matchesCode[0][0];\n    } else {\n      r = item2.matchesCode.length - item1.matchesCode.length;\n    }\n\n    if (r === 0) {\n      r = item2.matchesName.length - item1.matchesName.length;\n    }\n\n    if (r === 0) {\n      return item1.index - item2.index;\n    }\n    return r;\n  });\n}\n\nexport function highlightAirports(item) {\n  const {\n    item: { Code, Name },\n    matchesCode,\n    matchesName\n  } = item;\n\n  return `${matchesName.length ? highlight(Name, matchesName) : Name}`;\n}\n\nfunction match(criteria, item, config) {\n  const text = config.getValue(item);\n  const tokens = criteria\n    .trim()\n    .split(config.tokenSeparator)\n    .filter(word => word.length > 1);\n  let matchesByToken,\n    numMatches = 0;\n\n  const matches = tokens.reduce((result, token) => {\n    matchesByToken = matchToken(text, token, config);\n    if (matchesByToken.length) {\n      numMatches++;\n      result.push(...matchesByToken);\n    }\n    return result;\n  }, []);\n\n  if (numMatches !== tokens.length) {\n    return [];\n  }\n\n  return matches.sort((m1, m2) => m1[0] - m2[0]);\n}\n\nfunction matchToken(value, token, config) {\n  const result = [];\n  let text = value,\n    criteria = token.replace(config.specialChars, ''),\n    index,\n    lastIndex,\n    len;\n\n  if (!criteria) {\n    return result;\n  }\n\n  if (config.ignoreCase) {\n    text = text.toLowerCase();\n    criteria = criteria.toLowerCase();\n  }\n\n  while((index = text.indexOf(criteria)) >= 0) {\n    lastIndex = index + criteria.length;\n    len = lastIndex - index;\n\n    result.push([index, lastIndex]);\n\n    text =\n      text.slice(0, index) +\n      new Array(len + 1).join(' ') +\n      text.slice(lastIndex);\n  }\n  return result;\n}\n","import { Component } from '@verndale/core';\nimport { searchAirports, highlightAirports } from '../helpers/search';\nimport Autocomplete from '../components/Autocomplete';\nimport { getAirports } from '../service/oneworld';\n\nclass FindLounges extends Component {\n  setupDefaults() {\n    this.dom = {\n      $form: this.$el.find('.js-find-lounges__form'),\n      $location: this.$el.find('.autocomplete')\n    };\n\n    this.airportsUrl = this.dom.$form.data('airportsUrl');\n    this.redirectUrl = this.dom.$form.data('redirect-url');\n    this.loungeListId = this.dom.$form.data('lounge-list-id');\n    this.redirectWhenLocationParams = this.dom.$form.data('redirect-when-location-params');\n\n    this.location = new Autocomplete(this.dom.$location, {\n      filter: ::this.filterAirports,\n      render: highlightAirports,\n      value: ::this.getAirportValue\n    });\n\n    this.handleRedirect();\n  }\n\n  addListeners() {\n    this.dom.$form.on('submit', ::this.handleSubmit);\n  }\n\n  handleRedirect() {\n    if (this.redirectWhenLocationParams) {\n      // eslint-disable-next-line no-undef\n      const urlParams = new URLSearchParams(window.location.search);\n      const location = urlParams.get('location');\n\n      if (location && this.redirectUrl) {\n        const listId = this.loungeListId ? `#${this.loungeListId}` : '';\n        window.location.href = `${this\n          .redirectUrl}?location=${location}${listId}`;\n      }\n    }\n  }\n\n  async filterAirports(value) {\n    if (!value || value.length < 2) {\n      return [];\n    }\n    const airports = await getAirports({\n      url: this.airportsUrl\n    });\n    return searchAirports(airports, value);\n  }\n\n  getAirportValue(item) {\n    return `${item.item.Name}`;\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n    const data = {};\n    const locationItem = this.location.getSelectedItem();\n\n    if (locationItem) {\n      data.location = locationItem.Code;\n    }\n\n    if (this.props.onFind && !this.redirectUrl) {\n      this.props.onFind(data);\n    } else {\n      const listId = this.loungeListId ? `#${this.loungeListId}` : '';\n      window.location.href = `${this\n        .redirectUrl}?location=${data.location}${listId}`;\n    }\n  }\n\n  async findItemByCode(code) {\n    const airports = await getAirports({ url: this.airportsUrl });\n    return airports.find(item => item.Code === code);\n  }\n\n  async setLocation(code) {\n    const item = await this.findItemByCode(code.toUpperCase());\n    this.location.setSelectedItem({ item });\n  }\n}\n\nexport default FindLounges;\n"],"sourceRoot":""}