{"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","&","&","<","<",">",">","'","'",""",""","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":"oKAIaA,UACXC,gBAEIC,2BACJC,iBAEID,mCAIOE,QACXC,gBAEIH,mCACJI,gBAEIJ,mCACJK,iBAEIL,wCAGOM,OACXC,eAAgBP,IAChBQ,eAAgBR,IAChBS,gBAAiBT,KAINU,aAEXC,YAAgBb,EAAKC,gBAArB,0BACAa,YAAgBd,EAAKC,gBAArB,6BACAc,cAAkBf,EAAKG,iBAAvB,oCACAa,YAAgBhB,EAAKG,iBAArB,+BACAc,SAAajB,EAAKG,iBAAlB,iCAGWe,YACXC,mBAAoB,WAAY,WAChCC,eAAgB,OAAQ,WAAY,WACpCC,SAAU,WACVC,UAAW,YACXC,MAAO,SAGIC,oBACXC,mBAAoB,WAAY,SAChCC,OAAQ,UAGGC,mBACX,iBACA,KACA,0BACA,QACA,kBACA,iBACA,SACA,MACA,mBACA,QAGWC,oBACX,iBACA,wBACA,mBACA,SACA,kBACA,WACA,cACA,0BAGWC,uBACX,0BACA,yBACA,wBACA,wBACA,sBACA,uBACA,yBACA,qBACA,kBACA,6BAGWC,6BACX,KACA,qBACA,uBACA,QACA,oBAGWC,iBACXC,GAAI,wDACJC,KAAM,wCACNC,GAAI,yCAGOC,cAAc,QACdC,qBAAqB,QAGrBC,cACXC,OAAQ,IACRC,OAAQ,IACRC,QAAS,KACTC,KAAM,2FCjFQC,OAAT,SAAgBC,GACrB,OAAOC,EAAQC,KAAKF,EAAGG,EAAUC,MAEnBC,SAAT,SAAkBL,GACvB,OAAOC,EAAQC,KAAKF,EAAGM,EAAYC,IAnCrC,IAAMJ,EAAW,WACXG,EAAa,iDACbE,GACJC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,QACLC,IAAK,UAEDC,GACJC,QAAS,IACTC,QAAS,IACTC,OAAQ,IACRC,QAAS,IACTC,OAAQ,IACRC,QAAS,IACTC,SAAU,IACVC,QAAS,IACTC,SAAU,IACVC,QAAS,KAELvB,EAAUwB,OAAOC,UAAUzB,QAEjC,SAASG,EAASuB,GAChB,OAAOnB,EAAQmB,GAGjB,SAASpB,EAAWoB,GAClB,OAAOb,EAAUa,yFC3BHC,MAAT,SAAeC,GAIpB,IAHA,IAAIC,EAASD,EAAO,GACdE,KAAmBC,MAAM9B,KAAK+B,UAAW,GAEvCC,EAAI,EAAGA,EAAIH,EAAcI,SAAUD,EACzCJ,IAAU,EAAAM,EAAArC,QAAOgC,EAAcG,IAAML,EAAOK,EAAI,GAGlD,OAAOJ,KAGOO,KAAT,SAAcR,GAInB,IAHA,IAAIC,EAASD,EAAO,GACdE,KAAmBC,MAAM9B,KAAK+B,UAAW,GAEvCC,EAAI,EAAGA,EAAIH,EAAcI,SAAUD,EACzCJ,GAAUC,EAAcG,GAAKL,EAAOK,EAAI,GAG1C,OAAOJ,GAtBT,IAAAM,EAAAE,EAAA,0FCEgBC,QAAT,SAAiBC,EAAKC,GAC3B,IACE,IAAMC,EAAWC,KAAKC,UAAUH,GAChCI,eAAeN,QAAQC,EAAKE,GAC5B,MAAOI,GACPC,QAAQD,MAAR,gBAA8BN,EAA9B,qBAAuDM,OAI3CE,QAAT,SAAiBR,GACtB,IAAME,EAAWG,eAAeG,QAAQR,GAExC,IAAKE,EACH,OAAO,KAGT,IACE,OAAOC,KAAKM,MAAMP,GAClB,MAAOI,GAEP,OADAC,QAAQD,MAAR,iBAA+BN,EAA/B,uBAA0DM,GACnD,4ZCLJ,SAAAI,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAA2BC,EAA3BtB,UAAAE,OAAA,QAAAqB,IAAAvB,UAAA,GAAAA,UAAA,aAAAwB,mBAAAC,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,UACDV,GAAW,EAAAW,EAAAd,SAAQe,GACrBX,EAAMnF,YAAUC,YAEbiF,EAJA,CAAAQ,EAAAE,KAAA,gBAKCR,EALDW,KAKaC,GAEZV,EAAQF,OACVA,OAAYE,EAAQF,KAASY,IAE3BV,EAAQH,MACVA,EAAMG,EAAQH,KAGVE,EAdHU,GAeDE,KAAM,MACNC,SAAU,QACPZ,GACHH,MACAC,SAnBCM,EAAAE,KAAA,EAsBcO,UAAEC,KAAKf,GAtBrB,OAsBHH,EAtBGQ,EAAAW,MAuBH,EAAAR,EAAAvB,SAAQwB,EAAoBZ,GAvBzB,eAAAQ,EAAAY,OAAA,SA0BEpB,GA1BF,yBAAAQ,EAAAa,SAAAtB,EAAAuB,kIAoDA,SAAAC,EAAsCC,GAAtC,OAAAlB,mBAAAC,KAAA,SAAAkB,GAAA,cAAAA,EAAAhB,KAAAgB,EAAAf,MAAA,cAAAe,EAAAL,OAAA,SACEH,UAAEC,MACPjB,gCAAiCuB,EACjCT,KAAM,MACNC,SAAU,UAJP,wBAAAS,EAAAJ,SAAAE,EAAAD,0HAQA,SAAAI,EACLzB,GADK,IAAA0B,EAAAC,EAAA9C,UAAAE,OAAA,QAAAqB,IAAAvB,UAAA,GAAAA,UAAA,MAEH+C,EAFGD,EAEHC,KAAMC,EAFHF,EAEGE,GAAIC,EAFPH,EAEOG,cAAeC,EAFtBJ,EAEsBI,WAFtB,OAAA1B,mBAAAC,KAAA,SAAA0B,GAAA,cAAAA,EAAAxB,KAAAwB,EAAAvB,MAAA,cAIDiB,EAAU7G,YAAUG,cAEpBgF,IACF0B,EAAU1B,GAPPgC,EAAAb,OAAA,SAUEH,UAAEiB,QAAWP,EAAb,IAAwBE,EAAxB,IAAgCC,GACrCK,OAAQ7H,OAAKG,iBACb2H,MAAO1H,MAAIG,gBACXkH,gBACAC,gBAdG,wBAAAC,EAAAZ,SAAAK,EAAAJ,wHAkBA,SAAAe,IAAA,IAAAC,EAAArC,EAAAsC,EAAA,OAAAjC,mBAAAC,KAAA,SAAAiC,GAAA,cAAAA,EAAA/B,KAAA+B,EAAA9B,MAAA,UACD4B,GAAc,EAAA3B,EAAAd,SAAQ4C,GADrB,CAAAD,EAAA9B,KAAA,eAIGT,EAAMnF,YAAUI,YAJnBsH,EAAA9B,KAAA,EAKoBO,UAAEiB,QAAF,GAAajC,GAClCkC,OAAQ7H,OAAKG,iBACb2H,MAAO1H,MAAIG,kBAPV,OAKG0H,EALHC,EAAArB,KASHmB,EAAcC,EAASG,OAAO,SAACC,EAAKC,GAElC,OADAD,EAAIC,EAAQC,MAAQD,EACbD,QAGT,EAAAhC,EAAAvB,SAAQqD,EAAoBH,GAdzB,cAAAE,EAAApB,OAAA,SAiBEkB,GAjBF,wBAAAE,EAAAnB,SAAAgB,EAAAf,gEAjDStG,YAAT,WAAwD,IAAA8H,EAAAhE,UAAAE,OAAA,QAAAqB,IAAAvB,UAAA,GAAAA,UAAA,MAAjCiE,EAAiCD,EAAjCC,QAAS9C,EAAwB6C,EAAxB7C,IAAQG,yHAAgB4C,CAAAF,GAAA,kBACzD5C,OAAY+C,GACdtB,EAAU7G,YAAUE,YAElBiF,IACF0B,EAAU1B,GAGRG,EAAQF,OACVA,OAAYE,EAAQF,KAASY,IAK/B,OAFAa,EAAaA,EAAb,IAAwBoB,EAEjB9B,UAAEC,KAAFL,GACLZ,IAAK0B,EACLZ,KAAM,MACNC,SAAU,QACPZ,GACHF,aAkDYgD,eAAT,SAAwBC,EAAOC,GAAQ,IACpCvB,EAAwCuB,EAAxCvB,KAAMC,EAAkCsB,EAAlCtB,GAAIC,EAA8BqB,EAA9BrB,cAAeC,EAAeoB,EAAfpB,WACzBqB,EAA4DF,EAA5DE,0BAA2BC,EAAiCH,EAAjCG,KAAMC,EAA2BJ,EAA3BI,uBAErCC,EAAW,MACbC,EAAS,MACTC,EAAc,KACdC,EAAY,KAEd,GAAIL,GAAQA,EAAKtE,OAAQ,CACvB,IAAM4E,EAAWN,EAAK,GAChBO,EAAUP,EAAKA,EAAKtE,OAAS,GAEnCwE,EAAWI,EAASE,mBAAqB,MACzCL,EAASI,EAAQE,iBAAmB,MACpCL,EAAcE,EAASI,sBAAwB,KAC/CL,EAAYE,EAAQI,oBAAsB,KAG5C,IAAMC,GAAK,UACC5J,OAAKG,iBADN,SAEAC,MAAIG,gBAFJ,QAGDgH,EAHC,MAIHC,EAJG,YAKG0B,EALH,UAMCC,EAND,eAOMC,EAPN,aAQIC,EARJ,iBASQ5B,EATR,0BAUiBwB,GAExBvB,GACFkC,EAAGC,KAAH,cAAsBnC,GAExB,OAAUlH,YAAUK,SAApB,IAAgCkI,EAAhC,IAA6Da,EAAGE,KAAK,QAGvDC,kBAAT,SAA2BpE,GAChC,OAAOgB,UAAEC,MACPjB,MACAc,KAAM,MACNC,SAAU,YAIEsD,iBAAT,SAAAC,GAA+C,IAAnBtE,EAAmBsE,EAAnBtE,IAAKc,EAAcwD,EAAdxD,KAAMb,EAAQqE,EAARrE,KAC5C,OAAOe,UAAEC,MACPjB,MACAc,OACAC,SAAU,OACVd,UArKJ,wDAAAf,EAAA,KACAqF,EAAArF,EAAA,KACAwB,EAAAxB,EAAA,gSAEA,IAAM2B,GACJ2D,OAAQ/J,MAAIC,eACZ+J,QAASpK,OAAKE,iBAGVyI,GACJwB,OAAQ/J,MAAIE,eACZ8J,QAASpK,OAAKC,iBAGHqG,uBAAqB,cAC5B6B,EAAqB,qkBCf3BkC,EAAAxF,EAAA,wDACAA,EAAA,MACAyF,EAAAzF,EAAA,KAEA,IAAM0F,GAAS,SAAU,SAAU,SAQ7BvK,GAPa,GACF,GACG,GACD,GACL,GACF,EACE,IAYRwK,grBAAqBC,wDAEvBzD,KAAK0D,MAAQ1D,KAAK2D,iBAEd3D,KAAK0D,QACP1D,KAAK4D,KACHC,UAAWlE,EAAEmE,UACbC,OAAQ/D,KAAKgE,IAAIC,KAAK,wBACtBC,MAAOlE,KAAKgE,IAAIC,KAAK,wBAGvBjE,KAAKgE,IAAIG,OArBTC,4KAuBApE,KAAK4D,KACHS,SAAUrE,KAAKgE,IAAIC,KAAK,aAG1BjE,KAAKsE,qDAKHtE,KAAK0D,QACP1D,KAAK4D,IAAIG,OAAOQ,GAAG,UAAavE,KAAKwE,eAArCC,KAAgCzE,OAChCA,KAAK4D,IAAIG,OAAOQ,GAAG,SAAS,EAAAG,EAAAC,SAAW3E,KAAK4E,YAAhBH,KAAWzE,MAAkB,KACzDA,KAAK4D,IAAIM,MAAMK,GAAG,QAAS,sBAAyBvE,KAAK6E,YAAzDJ,KAAoDzE,OACpDA,KAAK4D,IAAIM,MAAMK,GACb,aACA,sBACEvE,KAAK8E,iBAHTL,KAGIzE,OAEJA,KAAK4D,IAAIC,UAAUU,GAAG,QAAWvE,KAAK+E,mBAAtCN,KAAiCzE,+CAItBgF,GACb,OAAQA,EAAEC,SACV,KAtDa,GAwDX,OADAjF,KAAKkF,YACE,EACT,KAvDe,GAyDb,OADAlF,KAAKmF,YACE,EACT,KAzDU,GA2DR,OADAnF,KAAKoF,cACE,EACT,QACE,OAAO,4WAIOJ,uFACZhM,EAAKqM,QAAQC,SAASN,EAAEC,QAAS,KAAO,oCAExCjF,KAAKgE,IAAIuB,SAAS,WAClBvF,KAAK4D,IAAIS,SAASkB,SAAS,sBACTvF,KAAKwF,QAAQR,EAAES,cAAczH,cAA/CgC,KAAKpB,YACLoB,KAAK0F,gEAELpH,QAAQD,MAARa,EAAAyG,YAEF3F,KAAKgE,IAAI4B,YAAY,WACrB5F,KAAK4D,IAAIS,SAASuB,YAAY,8JAItBZ,GACV,IAAMa,EAAQlG,EAAEqF,EAAES,eACZK,EAAQ9F,KAAK4D,IAAIM,MAAM6B,WAAWD,MAAMD,GAC9C7F,KAAKgG,YAAcF,EACnB9F,KAAKoF,6CAGCpH,GACN,OAAOgC,KAAKiG,MAAMC,OAAOlI,wCAIzBgC,KAAKmG,YACLnG,KAAK4D,IAAIM,MAAMkC,QACfpG,KAAKqG,eAAiB,EACtBrG,KAAKgG,aAAe,wCAGR,IAAAM,EAAAtG,KAGZ,GAFAA,KAAKsE,aAEAiC,MAAMC,QAAQxG,KAAKpB,MAAxB,CAIA,IAAM6H,EAAQzG,KAAKpB,KAAK8H,IACtB,SAAAC,GAAA,SAAQ/I,QAARgJ,EACmCN,EAAKL,MAAMY,OAAOF,MAInDF,EAAM/I,QACRsC,KAAK8G,WAEP9G,KAAK4D,IAAIM,MAAMtG,KAAK6I,EAAM3D,KAAK,yCAI3B9C,KAAKgG,YAAc,EACrBhG,KAAKgG,cAELhG,KAAKgG,YAAchG,KAAK4D,IAAIM,MAAM6B,WAAWrI,OAAS,EAExDsC,KAAK+G,cAAc/G,KAAKgG,gDAIpBhG,KAAKgG,YAAchG,KAAK4D,IAAIM,MAAM6B,WAAWrI,OAAS,EACxDsC,KAAKgG,cAELhG,KAAKgG,YAAc,EAErBhG,KAAK+G,cAAc/G,KAAKgG,mDAGZF,GACZ,IAAMkB,EAAShH,KAAK4D,IAAIM,MAAM6B,WACxBF,EAAQmB,EAAOC,GAAGnB,GACxBkB,EAAOpB,YAAY,8BACnBC,EAAMN,SAAS,8BAEf,IAAM2B,EAAarB,EAAMsB,cACnBC,EAAYpH,KAAK4D,IAAIM,MAAMkD,YAC3BC,EAAWD,EAAYpH,KAAK4D,IAAIM,MAAMiD,cACtCG,EAASJ,EAAapB,GAExBwB,EAASF,GAAaE,EAASJ,EAAaG,IAC9CrH,KAAK4D,IAAIM,MAAMkD,UAAUE,4CAIZtC,GACf,IAAMa,EAAQlG,EAAEqF,EAAES,eACZK,EAAQ9F,KAAK4D,IAAIM,MAAM6B,WAAWD,MAAMD,GAC9C7F,KAAK+G,cAAcjB,wCAInB,IAAMkB,EAAShH,KAAK4D,IAAIM,MAAM6B,WACxBY,EAAO3G,KAAKpB,KAAKoB,KAAKgG,aACtBhI,EAAQgC,KAAKiG,MAAMjI,MAAM2I,GAC/B3G,KAAKqG,cAAgBrG,KAAKgG,YAE1BgB,EAAOpB,YAAY,8BACnB5F,KAAK4D,IAAIG,OAAOwD,IAAIvJ,GACpBgC,KAAK4D,IAAIG,OAAOyD,QAChBxH,KAAKmG,sDAIL,GAAInG,KAAKqG,cAAgB,EACvB,OAAO,KAET,IAAMM,EAAO3G,KAAKpB,KAAKoB,KAAKqG,eAC5B,OAAKM,EAGEA,EAAKA,KAFH,6CAKKA,GACd,IAAM3I,EAAQgC,KAAKiG,MAAMjI,MAAM2I,GAE/B3G,KAAKsE,aACLtE,KAAKqG,cAAgB,EACrBrG,KAAKpB,MAAQ+H,GACb3G,KAAK4D,IAAIG,OAAOwD,IAAIvJ,GAEpBgC,KAAKmG,+CAILnG,KAAK4D,IAAIM,MAAMqB,SAAS,kEAIxBvF,KAAK4D,IAAIM,MAAM0B,YAAY,yEAGVZ,GACZrF,EAAEqF,EAAEyC,QAAQC,QAAQ1H,KAAKgE,KAAKtG,QACjCsC,KAAKmG,qDAIQ,IAAAwB,EAAA3H,KACT4H,EAAcrE,EAAM2C,OAAO,SAAAnI,GAAA,OAAQ4J,EAAK1B,MAAMlI,KAIpD,OAHI6J,EAAYlK,QACdY,QAAQD,MAAR,mBAAiCuJ,EAAjC,qBAEK,qBAIIpE,kRCrNCqE,OAAT,SAAgBjJ,EAAMkJ,EAAUhJ,GACrC,IAAMiJ,KACAlJ,OACDmJ,EACAlJ,GAUL,OAPAF,EAAKqJ,QAAQ,SAACtB,EAAMb,GAClB,IAAMoC,EAAUC,EAAML,EAAUnB,EAAM9H,GAClCqJ,EAAQxK,QACVqK,EAAQlF,MAAO8D,OAAMuB,UAASpC,YAI3BiC,EAAQK,KAAK,SAACC,EAAOC,GAC1B,IAAMC,EAAID,EAAMJ,QAAQxK,OAAS2K,EAAMH,QAAQxK,OAC/C,OAAU,IAAN6K,EACKF,EAAMvC,MAAQwC,EAAMxC,MAEtByC,OAIKC,cAqBAC,eAAT,SAAwB7J,EAAMkJ,GACnC,IAAMC,KAoBN,OAlBAnJ,EAAKqJ,QAAQ,SAACtB,EAAMb,GAElB,IAAM4C,EAAcP,EAAML,EAAUnB,EAAhBpH,KACfyI,GACHW,SAAU,SAAAhC,GAAA,OAAQA,EAAKiC,SAInBC,EAAcV,EAAML,EAAUnB,EAAhBpH,KACfyI,GACHW,SAAU,SAAAhC,GAAA,OAAWA,EAAKmC,KAAhB,IAAwBnC,EAAKoC,UAGrCL,EAAYhL,QAAUmL,EAAYnL,SACpCqK,EAAQlF,MAAO8D,OAAM+B,cAAaG,cAAa/C,YAI5CiC,EAAQK,KAAK,SAACC,EAAOC,GAC1B,IAAIC,EAAI,EAYR,OAJU,IALRA,EADED,EAAMI,YAAYhL,QAAU2K,EAAMK,YAAYhL,OAC5C2K,EAAMK,YAAY,GAAG,GAAKJ,EAAMI,YAAY,GAAG,GAE/CJ,EAAMI,YAAYhL,OAAS2K,EAAMK,YAAYhL,UAIjD6K,EAAID,EAAMO,YAAYnL,OAAS2K,EAAMQ,YAAYnL,QAGzC,IAAN6K,EACKF,EAAMvC,MAAQwC,EAAMxC,MAEtByC,OAIKS,kBAAT,SAA2BrC,GAAM,IAAAsC,EAKlCtC,EAHFA,KAAcmC,GAFsBG,EAE5BL,KAF4BK,EAEtBH,MAEdD,GACElC,EAFF+B,YAEE/B,EADFkC,aAGF,UAAUA,EAAYnL,OAAS8K,EAAUM,EAAMD,GAAeC,IAtGhE,IAGMd,GACJkB,aAJoB,8CAKpBC,eAJsB,aAKtBC,YAAY,EACZT,SAAU,iBAAM,KA0BX,SAASH,EAAUxK,EAAOkK,GAC/B,OAAOA,EAAQ9G,OACb,SAACC,EAAKgI,EAAKvD,EAAOwD,GAahB,OAZAjI,EAAIhE,OAAYgE,EAAIhE,OAClBW,EAAMT,MAAM8D,EAAIkI,UAAWF,EAAI,IADjC,MAC0CrL,EAAMT,MAC9C8L,EAAI,GACJA,EAAI,IAHN,OAMIC,EAAK5L,SAAWoI,EAAQ,IAC1BzE,EAAIhE,OAASgE,EAAIhE,OAASW,EAAMT,MAAM8L,EAAI,KAG5ChI,EAAIkI,UAAYF,EAAI,GAEbhI,IAEPkI,UAAW,EAAGlM,OAAQ,KACxBA,OAsDJ,SAAS8K,EAAML,EAAUnB,EAAM9H,GAC7B,IAAM2K,EAAO3K,EAAO8J,SAAShC,GACvB8C,EAAS3B,EACZ4B,OACAC,MAAM9K,EAAOsK,gBACbjD,OAAO,SAAA0D,GAAA,OAAQA,EAAKlM,OAAS,IAC5BmM,SACFC,EAAa,EAET5B,EAAUuB,EAAOrI,OAAO,SAAC/D,EAAQ0M,GAMrC,OALAF,EAeJ,SAAoB7L,EAAO+L,EAAOlL,GAChC,IAAMxB,KACFmM,EAAOxL,EACT8J,EAAWiC,EAAMvO,QAAQqD,EAAOqK,aAAc,IAC9CpD,SACAkE,SACAC,SAEF,IAAKnC,EACH,OAAOzK,EAGLwB,EAAOuK,aACTI,EAAOA,EAAKU,cACZpC,EAAWA,EAASoC,eAGtB,MAAOpE,EAAQ0D,EAAKnE,QAAQyC,KAAc,GACxCkC,EAAYlE,EAAQgC,EAASpK,OAC7BuM,EAAMD,EAAYlE,EAElBzI,EAAOwF,MAAMiD,EAAOkE,IAEpBR,EACEA,EAAKjM,MAAM,EAAGuI,GACd,IAAIS,MAAM0D,EAAM,GAAGnH,KAAK,KACxB0G,EAAKjM,MAAMyM,GAEf,OAAO3M,EA3CY8M,CAAWX,EAAMO,EAAOlL,IACtBnB,SACjBoM,IACAzM,EAAOwF,KAAPuH,MAAA/M,wHAAAgN,CAAeR,KAEVxM,OAGT,OAAIyM,IAAeL,EAAO/L,UAInBwK,EAAQE,KAAK,SAACkC,EAAIC,GAAL,OAAYD,EAAG,GAAKC,EAAG,kVC/H7ClH,EAAAxF,EAAA,IACA2M,EAAA3M,EAAA,yDACAA,EAAA,MACA4M,EAAA5M,EAAA,oSAEM6M,grBAAoBjH,wDAEtBzD,KAAK4D,KACH+G,MAAO3K,KAAKgE,IAAIC,KAAK,0BACrB2G,UAAW5K,KAAKgE,IAAIC,KAAK,kBAG3BjE,KAAK6K,YAAc7K,KAAK4D,IAAI+G,MAAM/L,KAAK,eACvCoB,KAAK8K,YAAc9K,KAAK4D,IAAI+G,MAAM/L,KAAK,gBACvCoB,KAAK+K,aAAe/K,KAAK4D,IAAI+G,MAAM/L,KAAK,kBACxCoB,KAAKgL,2BAA6BhL,KAAK4D,IAAI+G,MAAM/L,KAAK,iCAEtDoB,KAAKiL,SAAW,IAAIzH,UAAaxD,KAAK4D,IAAIgH,WACxC1E,OAAUlG,KAAKkL,eAAfzG,KAAUzE,MACV6G,OAAQmC,oBACRhL,MAASgC,KAAKmL,gBAAd1G,KAASzE,QAGXA,KAAKoL,wDAILpL,KAAK4D,IAAI+G,MAAMpG,GAAG,SAAYvE,KAAKqL,aAAnC5G,KAA8BzE,gDAI9B,GAAIA,KAAKgL,2BAA4B,CAEnC,IACMC,EADY,IAAIK,gBAAgBC,OAAON,SAASpD,QAC3B2D,IAAI,YAE/B,GAAIP,GAAYjL,KAAK8K,YAAa,CAChC,IAAMW,EAASzL,KAAK+K,aAAL,IAAwB/K,KAAK+K,aAAiB,GAC7DQ,OAAON,SAASS,KAAU1L,KACvB8K,YADH,aAC2BG,EAAWQ,wFAKvBzN,2FACdA,KAASA,EAAMN,OAAS,wEAGN,EAAA+M,EAAAhR,cACrBkF,IAAKqB,KAAK6K,4BADNnM,4BAGC,EAAA8L,EAAA/B,gBAAe/J,EAAUV,+IAGlB2I,GACd,SAAUA,EAAKA,KAAKmC,0CAGT9D,GACXA,EAAE2G,iBACF,IAAM/M,KACAgN,EAAe5L,KAAKiL,SAASY,kBAMnC,GAJID,IACFhN,EAAKqM,SAAWW,EAAahD,MAG3B5I,KAAKiG,MAAM6F,SAAW9L,KAAK8K,YAC7B9K,KAAKiG,MAAM6F,OAAOlN,OACb,CACL,IAAM6M,EAASzL,KAAK+K,aAAL,IAAwB/K,KAAK+K,aAAiB,GAC7DQ,OAAON,SAASS,KAAU1L,KACvB8K,YADH,aAC2BlM,EAAKqM,SAAWQ,uFAI1BlK,yGACI,EAAAkJ,EAAAhR,cAAckF,IAAKqB,KAAK6K,4BAAzCnM,2BACCA,EAASuF,KAAK,SAAA0C,GAAA,OAAQA,EAAKiC,OAASrH,yLAG3BA,wGACGvB,KAAK+L,eAAexK,EAAKyK,sBAAtCrF,SACN3G,KAAKiL,SAASgB,iBAAkBtF,+HAIrB+D","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 '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''',\n '\"': '"'\n};\nconst oUnescape = {\n '&': '&',\n '&': '&',\n '<': '<',\n '<': '<',\n '>': '>',\n '>': '>',\n ''': \"'\",\n ''': \"'\",\n '"': '\"',\n '"': '\"'\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
\n
\n \n \n \n
\n
\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
  • ${this.props.render(item)}
  • \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])}${value.slice(\n pos[0],\n pos[1]\n )}`;\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":""}