{"version":3,"file":"bundle-desktop.js","sources":["../../../client/js/src2/filters/generateRange.js","../../../client/js/src2/services/resource.ts","../../../client/js/src2/filters/occupancy.ts","../../../client/js/src2/filters/replaceLineBreaks.js","../../../client/js/src2/filters/resourceFilter.js","../../../client/js/src2/services/http.ts","../../../client/js/src2/services/adHoc.ts","../../../client/js/src2/services/arrayUtils.ts","../../../client/js/src2/services/basketCrossSell.ts","../../../client/js/src2/services/broker.ts","../../../client/js/src2/services/cookie.js","../../../client/js/src2/services/currentUser.js","../../../client/js/src2/services/decimalAdjust.js","../../../client/js/src2/services/enum.ts","../../../client/js/src2/services/fieldFilterParser.js","../../../client/js/src2/services/fieldGroup.ts","../../../client/js/src2/services/flightDetail.ts","../../../client/js/src2/services/flightsTerminal.ts","../../../client/js/src2/services/guid.ts","../../../client/js/src2/services/logging.ts","../../../client/js/src2/services/objectType.js","../../../client/js/src2/services/image.js","../../../client/js/src2/services/rootPath.ts","../../../client/js/src2/services/language.ts","../../../client/js/src2/services/modal.js","../../../client/js/src2/services/loader.js","../../../client/js/src2/services/occupancy.ts","../../../client/js/src2/services/paymentsUtil.ts","../../../client/js/src2/services/paging.ts","../../../client/js/src2/services/supportedProducts.js","../../../client/js/src2/services/urlUtils.js","../../../client/js/src2/filters/frontPad.js","../../../client/js/src2/filters/hoursAndMinutes.js","../../../client/js/src2/filters/replace.js","../../../client/js/src2/filters/toText.js","../../../client/js/src2/services/desktop/localStorageProvider.js","../../../client/js/src2/services/abTest.js","../../../client/js/src2/services/agentMode.js","../../../client/js/src2/services/animationUtils.ts","../../../client/js/src2/services/componentUtils.ts","../../../client/js/src2/services/bookingStatus.js","../../../client/js/src2/services/cms.js","../../../client/js/src2/services/currency.js","../../../client/js/src2/services/destinationAirport.js","../../../client/js/src2/services/discounts.ts","../../../client/js/src2/services/extraProducts.js","../../../client/js/src2/services/filterUtil.js","../../../client/js/src2/services/flightSeatPlan.js","../../../client/js/src2/services/flightStatic.ts","../../../client/js/src2/services/getPropertyTypeResKey.js","../../../node_modules/tslib/tslib.es6.js","../../../client/js/src2/services/globalisation.ts","../../../client/js/src2/services/googleStaticMap.js","../../../client/js/src2/services/hotelFilterQueryStringParser.js","../../../client/js/src2/services/hotelsFilter.js","../../../client/js/src2/services/location.ts","../../../client/js/src2/services/optionsUtils.js","../../../client/js/src2/services/paymentsCalculator.js","../../../client/js/src2/services/postcode.js","../../../client/js/src2/services/preferencesHttpProvider.js","../../../client/js/src2/services/publicityMessaging.js","../../../client/js/src2/services/primaryNavigation.js","../../../client/js/src2/services/regExpRoutes.ts","../../../client/js/src2/services/searchTypes.js","../../../client/js/src2/services/scroller.js","../../../client/js/src2/services/scrollTo.js","../../../client/js/src2/services/tokeniser.ts","../../../client/js/src2/services/urgencyMessaging.js","../../../client/js/src2/services/validation.js","../../../client/js/src2/services/windowUtil.js","../../../client/js/src2/services/deepLinkService.ts","../../../client/js/src2/components/products/services/products.ts","../../../client/js/src2/angularExports.all.ts","../../../client/js/src2/services/desktop/authRedirection.ts","../../../client/js/src2/services/mapLabel.js","../../../client/js/src2/services/hotelStaticMap.js","../../../client/js/src2/services/desktop/accountMenu.ts","../../../client/js/src2/angularExports.desktop.ts","../../../client/js/src2/components/products/directives/productsGridShowcase.ts","../../../client/js/src2/components/products/directives/productsGridItem.ts","../../../client/js/src2/components/rtlSlider.jQuery.ts"],"sourcesContent":["export default function(input, min, max) {\n return _.range(parseInt(min), parseInt(max) + 1);\n}\n","const resources: {[id:string]: string } = {};\n\n// this returns a function that will return the resource. Useful\n// for lazy evaluation which can avoid the race condition\n// that occurs sometimes when we try to use a resource before it has been added\nexport function getDeferred(key: string): () => string {\n return () => get(key);\n}\n\nfunction _get(input: string): string {\n return resources[input] || input;\n}\n\nexport function get(input: T): T {\n if(input instanceof Array) {\n return (input).map(key => _get(key));\n }\n\n if(typeof input === 'string') {\n return _get(input);\n }\n\n return input;\n}\n\nexport function set(dict: {}): void {\n for (var p in dict) {\n if (dict.hasOwnProperty(p)) {\n resources[p] = dict[p];\n }\n }\n}\n","import * as resourceService from '../services/resource';\n\nexport default function(adults, children, infants) {\n let result = '';\n\n if (adults) {\n const adultString = adults > 1 ? 'ADULTS' : 'ADULT';\n result = `${adults} ${resourceService.get(adultString).toLowerCase()}`;\n }\n\n if (children) {\n const childString = children > 1 ? 'CHILDREN' : 'CHILD';\n result = `${result}, ${children} ${resourceService.get(childString).toLowerCase()}`;\n }\n\n if (infants) {\n const infantString = infants > 1 ? 'INFANTS' : 'INFANT';\n result = `${result}, ${infants} ${resourceService.get(infantString).toLowerCase()}`;\n }\n\n return result;\n}\n","export default function(value) {\n return value.replace(/&\\w+;br ?\\/&\\w+;/g, ',');\n}\n","import * as resourceService from '../services/resource';\n\nexport default function(input) {\n return resourceService.get(input);\n}\n","interface IHttpOptions {\n cache?: boolean;\n logErrors?: boolean;\n}\n\nconst timerThreshold = 20000;\nconst retryCodes = [444, 500, 503, 12002, 12019, 12029, 12030, 12031, 12041, 12152];\nconst cache = new Map>();\n\nfunction fetchData(url: string, req, opts: IHttpOptions = {}, isRetry = false): Promise {\n // Default options:\n opts = Object.assign({\n cache: false,\n logErrors: true\n }, opts);\n const startTime = Date.now();\n\n return fetch(url, req).then(res => {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime > timerThreshold) {\n logOverThreshold(elapsedTime / 1000, url);\n }\n\n const contentType = res.headers.get('content-type');\n if (contentType && contentType.startsWith('application/json;')) {\n const promise = res.json();\n\n if (!res.ok) {\n return promise.then(json => Promise.reject(json));\n }\n\n if (opts.cache) {\n cache.set(url, promise);\n }\n\n return promise;\n }\n\n if (res.ok) {\n return;\n }\n\n if (!isRetry && retryCodes.indexOf(res.status) !== -1) {\n return fetchData(url, req, opts, true);\n }\n\n if (opts.logErrors) {\n logError(req, res);\n }\n\n if (res.status === 401) {\n agentRedirect(res);\n }\n\n throw new Error(`Non-JSON error: ${res.status} ${res.statusText} ${res.url}`);\n });\n}\n\nexport function getData(url: string, opts?: IHttpOptions): Promise {\n if (opts && opts.cache) {\n const prom: Promise|undefined = cache.get(url);\n if (prom) {\n return prom;\n }\n }\n return fetchData(url, { credentials: 'same-origin' }, opts);\n}\n\nexport function postData(url: string, body?, opts?: IHttpOptions): Promise {\n const req = {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body)\n };\n return fetchData(url, req, opts);\n}\n\nfunction logError(req, res: Response) {\n const { userAgent } = window.navigator;\n if (/googlebot|prerender/i.test(userAgent)) {\n return;\n }\n\n try {\n const utmId = JSON.parse(document.body.getAttribute('user') || '').UtmId;\n const obj = JSON.stringify({\n utmId,\n userAgent,\n body: req.body\n });\n const msg = `Network error: ${res.status} ${res.statusText} ${req.method} ${res.url} ${obj}`;\n const r = new XMLHttpRequest();\n r.open('POST', 'website/logging/log');\n r.setRequestHeader('Content-Type', 'application/json');\n r.send(JSON.stringify({ LogLevel: 'Warn', Message: msg }));\n } catch (e) {}\n}\n\nfunction logOverThreshold(elapsedTime: number, url: string) {\n try {\n const utm = JSON.parse(document.body.getAttribute('user') || '').UtmId;\n const { userAgent } = window.navigator;\n const msg = `OVERTHRESHOLD | ${elapsedTime}s | ${url} | ${utm} | ${userAgent}`;\n const r = new XMLHttpRequest();\n r.open('POST', 'website/logging/log');\n r.setRequestHeader('Content-Type', 'application/json');\n r.send(JSON.stringify({ LogLevel: 'Warn', Message: msg }));\n } catch (e) {}\n}\n\nfunction agentRedirect(res:Response) {\n const $location = angular.element(document).injector().get('$location');\n const path = $location.path();\n const absUrl = $location.absUrl();\n const redirectUrl = String.format(TRPCONFIG.Domain.AgentLogonUrl, absUrl);\n\n const header = res.headers.get('www-authenticate');\n if (header && header.indexOf('realm=\"Agent\"') !== -1 && (path !== '/agents/signin')) {\n window.location.href = redirectUrl;\n }\n}\n","import {getData, postData} from './http';\n\ntype AdHoc = Core.AdHoc.AdHoc;\ntype AdHocAvailabilityType = Core.AdHoc.AdHocAvailabilityType;\ntype AdHocProductTypesRequest = Core.AdHoc.AdHocProductTypesRequest;\ntype AdHocAvailabilityRequest = Core.AdHoc.AdHocAvailabilityRequest;\ntype AdHocDetailsGetRequest = Core.AdHoc.AdHocDetailsGetRequest;\ntype AdHocDetailsGetResponse = Core.AdHoc.AdHocDetailsGetResponse;\n\nconst availabilityApiUrl: string = '/api/adhoc/availability';\nconst detailsApiUrl: string = '/api/adhoc/details';\nconst promiseCache = new Map();\n\nexport function getProductTypes(request: AdHocProductTypesRequest): Promise {\n return postData(`${availabilityApiUrl}/getproducttypes`, request, { logErrors: false })\n .then(data => data ? data.AvailableTypes : []);\n}\n\nexport function get(request: AdHocAvailabilityRequest): Promise {\n return postData(`${availabilityApiUrl}/get`, request, { logErrors: false });\n}\n\nexport function getFromSession(availabilityId: string): Promise {\n return getData(`${availabilityApiUrl}/getfromsession?availabilityId=${availabilityId}`);\n}\n\nexport function getDetails(detailsRequest: AdHocDetailsGetRequest): Promise {\n return postData(`${detailsApiUrl}/get`, detailsRequest, { logErrors: false });\n}\n\nexport function getDetailsFromSession(detailsId: string): Promise {\n return getData(`${detailsApiUrl}/getfromsession?detailsId=${detailsId}`);\n}\n\nexport function rehydrate(detailsId: string): Promise {\n if (promiseCache.has(detailsId)) {\n return promiseCache.get(detailsId);\n }\n const promise = getDetailsFromSession(detailsId);\n promiseCache.set(detailsId, promise);\n return promise;\n}\n","import ListIterator = _.ListIterator;\nimport MemoIterator = _.MemoIterator;\n\n//this is often fed into the reduce function which is why it is defined in here.\nexport function sum(a: number, b: number): number {\n return a + b;\n}\n\nexport function addOrRemove(arr: T[], newLength: number, insertFn: () => T) : void {\n const diff = newLength - arr.length;\n if (diff > 0) {\n for (let i = 0; i < diff; i++) {\n arr.push(insertFn());\n }\n }\n if (diff < 0) {\n arr.splice(arr.length + diff, -diff);\n }\n}\n\nexport function indexOf(arr: T[], matchFn: ListIterator) : number {\n return _.findIndex(arr, matchFn);\n}\n\nexport function enqueue(item: T, array: T[], max: number): T[] {\n const l = array.unshift(item);\n if (l > max) {\n array.splice(array.length - 1, 1);\n }\n return array;\n}\n\nexport function numberArray(from: number, to: number): number[] {\n const arr: number[] = [];\n if (from > to) {\n for (let i = from; i >= to; i--) {\n arr.push(i);\n }\n } else {\n for (let i = from; i <= to; i++) {\n arr.push(i);\n }\n }\n return arr;\n}\n\nexport function map(arr: T[], func: ListIterator) : R[]{\n return _.map(arr, func);\n}\n\nexport function filter(array: T[], predicate: ListIterator): T[] {\n return _.filter(array, predicate);\n}\n\nexport function first(arr: T[], func: ListIterator): T {\n return _.head(_.filter(arr, func));\n}\n\nexport function any(arr: T[], func: ListIterator) : boolean {\n return _.some(arr, func);\n}\n\nexport function count(arr: T[], func: ListIterator): number {\n return _.filter(arr, func).length;\n}\n\nexport function reduce(fn: MemoIterator, arr: T[], agg?: R) : R {\n return agg ? _.reduce(arr, fn, agg) : _.reduce(arr, fn);\n}\n\nexport function sort(arr: T[], key: string) : T[] {\n return arr.sort((a: T, b: T) => {\n const x = a[key];\n const y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n}\n\nexport function toDict(arr: T[], keyfn: (T: T) => any, valfn?: (T: T) => any) {\n return _.reduce(arr, (agg, x) => {\n agg[keyfn(x)] = valfn ? valfn(x) : x;\n return agg;\n }, {});\n}\n\nexport function createRange(maxValue, initialValue) {\n if (isNaN(parseInt(maxValue, 10))) {\n return [];\n }\n\n const init = parseInt(initialValue, 10);\n const start = isNaN(init) ? 1 : init;\n const arr:any = [];\n\n for (let i = start; i <= maxValue; i++) {\n arr.push(i);\n }\n\n return arr;\n}\n\nexport function chunk(obj: string, chunkSize: number) : string[] {\n const arr:any = [];\n for (let i = 0; i < obj.length; i += chunkSize) {\n arr.push(obj.slice(i, i + chunkSize));\n }\n\n return arr;\n}\n\nexport function removeDuplicates(arr: T[]) : T[] {\n const filtered: T[] = [];\n arr.forEach((val: T) => {\n if (filtered.indexOf(val) === -1) {\n filtered.push(val);\n }\n });\n return filtered;\n}\n\nexport function mapToInt(numbers: string[]): number[] {\n return _.map(numbers, n => parseInt(n, 10));\n}\n\nexport function wrapNonArray(valOrArray: T|T[]|null|undefined) : T[] {\n // Normalise single vals and arrays e.g. for `forEach()`\n // An empty array is returned if `null` or `undefined` is passed in\n return (valOrArray == null) ? [] : _.flatten([valOrArray]);\n}\n\nexport function difference(arr1: T[], arr2: T[], predicate?: (a: T, b: T) => boolean) : T[] {\n return _.filter(arr1, function (a) {\n return !_.find(arr2, function (b) {\n return predicate === undefined\n ? angular.equals(a, b)\n : predicate(a, b);\n });\n });\n}\n\nexport function promiseSeries(fnArray) {\n // Run an array of functions as `then` statements in series\n // e.g. http requests one after the other, not in parallel\n return fnArray.reduce(\n (promise, fn) => promise.then(res => fn(res)),\n Promise.resolve()\n );\n}\n","import { postData } from './http';\n\nimport ProductType = Core.Booking.ProductType;\n\nconst baseUrl: string = '/api2/basketcrosssell/';\nconst cache = new Map();\nconst urlFragments = {\n [ProductType.Transfer]: 'ranktransferoptions',\n [ProductType.Parking]: 'rankparkingoptions',\n [ProductType.CarHire]: 'rankcarhireoptions'\n};\n\nclass EnhancedRanking {\n Key: string;\n Rank: number;\n Price: number;\n}\n\nclass RankingRequest {\n BasketId: string;\n ApplicationType: number;\n DomainId: number;\n Product: any[];\n}\n\nfunction createRankingRequest(basketId: string,\n type: ProductType,\n products: any[]): RankingRequest {\n let req = new RankingRequest();\n req.BasketId = basketId;\n req.ApplicationType = TRPCONFIG.ApplicationType;\n req.DomainId = TRPCONFIG.Domain.DomainId;\n\n //nasty bit\n switch (type) {\n case ProductType.Transfer:\n req.Product = _.map(products, t => ({ Type: t.Type }));\n break;\n case ProductType.Parking:\n req.Product = _.map(products, p => ({ Title: p.CarPark }));\n break;\n case ProductType.CarHire:\n req.Product = _.map(products, p => ({ Description: p.Description }));\n break;\n default:\n throw new Error('Unsupported ProductType:' + type);\n }\n\n return req;\n}\n\nfunction rankProducts(url: string,\n request: RankingRequest,\n type: ProductType,\n products: any[]) {\n return postData(url, request, { logErrors: false }).then(function(data) {\n if (!data || data.length === 0) {\n throw new Error('No rankings to order by :' + url);\n }\n\n let rankings;\n\n switch (type) {\n case ProductType.Transfer:\n data.Transfers.forEach(function(r) {\n r.Key = r.Type;\n delete r.Type;\n r.Price = _.find(products, { Type: r.Key }).TotalPrice;\n });\n\n let transfers:any = [];\n rankings = sortRankings(data.Transfers);\n for (let i = 0; i < rankings.length; i++) {\n const idx = _.findIndex(products, t => t.Type === rankings[i].Key);\n transfers.push(products[idx]);\n products.splice(idx, 1);\n }\n return transfers;\n\n case ProductType.Parking:\n data.Parking.forEach(function(r) {\n r.Key = r.Title;\n delete r.Title;\n r.Price = _.find(products, { CarPark: r.Key }).Price;\n });\n\n let parking:any = [];\n rankings = sortRankings(data.Parking);\n for (let i = 0; i < rankings.length; i++) {\n const idx = _.findIndex(products, p => p.CarPark === rankings[i].Key);\n parking.push(products[idx]);\n products.splice(idx, 1);\n }\n return parking;\n\n case ProductType.CarHire:\n data.CarHire.forEach(function(r) {\n r.Key = r.Description;\n delete r.Description;\n r.Price = _.find(products, { Description: r.Key}).Price;\n });\n\n let carhire:any = [];\n rankings = sortRankings(data.CarHire);\n for (let i = 0; i < rankings.length; i++) {\n const idx = _.findIndex(products, c => c.Description === rankings[i].Key);\n carhire.push(products[idx]);\n products.splice(idx, 1);\n }\n return carhire;\n }\n\n throw new Error('Unsupported ProductType:' + type);\n });\n}\n\nfunction compare(x, y, asc) {\n if (x === y) {\n return 0;\n }\n const m = asc ? 1 : -1;\n return (x > y) ? 1 * m : -1 * m;\n};\n\n// Method to help us sort the ranking results\nfunction sortRankings(rankings: EnhancedRanking[]): EnhancedRanking[] {\n const sorted = _.clone(rankings);\n\n sorted.sort(function(x, y) {\n const r1 = x.Rank;\n const r2 = y.Rank;\n\n if (r1 !== r2) {\n return compare(r1, r2, false);\n } else {\n return compare(x.Price, y.Price, true);\n }\n });\n\n return sorted;\n}\n\nexport function rankProductResults(basketId: string,\n type: ProductType,\n availabilityId: string,\n products: any[]): Promise {\n if (!products || products.length === 0) {\n return Promise.resolve(products);\n }\n\n if (availabilityId && cache.has(availabilityId)) {\n return Promise.resolve(cache.get(availabilityId));\n }\n\n const request = createRankingRequest(basketId, type, products);\n\n return rankProducts(baseUrl + urlFragments[type], request, type, products)\n .then(data => {\n cache.set(availabilityId, data);\n return data;\n })\n .catch(() => products);\n}\n","const empty = () => {\n // do nothing\n};\nconst subscribers: { [id: string] : any } = {};\nlet muteExcept: string[]|null;\n\nfunction objectify(subscriber: string): any {\n return { _id: subscriber, detachEvent: empty, removeEventListener: empty };\n}\n\nfunction notMuted(sub: string) {\n return muteExcept == null || muteExcept.indexOf(sub) >= 0;\n}\n\nfunction checkTelProtocol(e: any): boolean {\n if (e.target.activeElement.protocol === 'tel:') {\n return true;\n } else {\n return false;\n }\n}\n\nexport function publish(topic: string, data?: any): void {\n topic = topic.toLowerCase();\n for (const sub in subscribers) {\n if (notMuted(sub)) {\n subscribers[sub].triggerHandler(topic, { data });\n }\n }\n}\n\nexport function subscribe(subscriber: string, topic: string, callback: (any) => void) : void {\n const s = objectify(subscriber);\n if (subscribers[s._id] === undefined) {\n subscribers[s._id] = $(s);\n }\n if (topic == null) {\n throw new Error('cannot call subscribe without providing a topic');\n }\n topic = topic.toLowerCase();\n subscribers[s._id].unbind(topic).bind(topic, (e, data) => {\n e = $.extend(e, data);\n callback.call(this, e);\n });\n}\n\nexport function subscribeOnce(subscriber: string, topic: string, callback: (...any) => void): void {\n // Unsubscribe automatically after topic is published once\n subscribe(subscriber, topic, (...args) => {\n callback(...args);\n unsubscribe(subscriber, topic);\n });\n}\n\nexport function unsubscribe(subscriber: string, topic?: string): void {\n const s = objectify(subscriber);\n if (subscribers[s._id] === undefined) { return; }\n\n if (topic == null) {\n subscribers[s._id].unbind();\n delete subscribers[s._id];\n } else {\n topic = topic.toLowerCase();\n subscribers[s._id].unbind(topic);\n }\n}\n\nexport function mute(except: string|string[]): void {\n muteExcept = except instanceof Array ? except : [except];\n}\n\nexport function unmute(): void {\n muteExcept = null;\n}\n\nwindow.addEventListener('beforeunload', (e) => {\n if (checkTelProtocol(e)) {\n return;\n }\n for (const s in subscribers) {\n if (subscribers.hasOwnProperty(s)) {\n subscribers[s].unbind();\n delete subscribers[s];\n }\n }\n});\n","export function get(key, cookies = document.cookie) {\n if (!key) {\n return null;\n }\n return decodeURIComponent(cookies.replace(new RegExp(`(?:(?:^|.*;)\\\\s*${encodeURIComponent(key).replace(/[-.+*]/g, '\\\\$&')}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`), '$1')) || null;\n}\n\nexport function set(key, val, end, domain, secure, sameSite) {\n if (!key || /^(expires|max-age|path|domain|secure)$/i.test(key)) {\n return false;\n }\n\n let expires = '';\n if (end) {\n switch (end.constructor) {\n case Number:\n expires = end === Infinity\n ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n : `; max-age=${end}`;\n break;\n case String:\n expires = `; expires=${end}`;\n break;\n case Date:\n expires = `; expires=${end.toUTCString()}`;\n break;\n }\n }\n\n document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(val)}${expires}${domain ? `; domain=${domain}` : ''}${secure ? '; secure' : ''}${sameSite ? `; SameSite=${sameSite}` : ''}; path=/`;\n return true;\n}\n","import * as broker from './broker';\n\nlet user = null;\n\nexport function get() {\n return user;\n}\n\nexport function set(u) {\n user = u;\n broker.publish('userSet');\n}\n","/*\n * Decimal adjustment of a number.\n * Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n *\n * @param {String} type The type of adjustment.\n * @param {Number} value The number.\n * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base).\n * @returns {Number} The adjusted value.\n */\nexport default function(type, value, exp) {\n // If the exp is undefined or zero...\n if (typeof exp === 'undefined' || +exp === 0) {\n return Math[type](value);\n }\n value = +value;\n exp = +exp;\n // If the value is not a number or the exp is not an integer...\n if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {\n return NaN;\n }\n // Shift\n value = value.toString().split('e');\n value = Math[type](+(`${value[0]}e${value[1] ? (+value[1] - exp) : -exp}`));\n // Shift back\n value = value.toString().split('e');\n return +(`${value[0]}e${value[1] ? (+value[1] + exp) : exp}`);\n}\n","export const ProductType = Core.Booking.ProductType;\nexport const CrossSellType = Core.Booking.CrossSellType;\nexport const CarHireSortOrder = Core.CarHire.SortOrder;\n","function prependRoot(root, prop) {\n return root ? `${root}.${prop}` : prop;\n}\n\nfunction encode(val, root) {\n if (val == null) {\n return '';\n }\n\n if (typeof val === 'string') {\n return prependRoot(root, val);\n }\n\n if (val instanceof Array) {\n return val\n .map(v => encode(v, root))\n .join(',');\n }\n\n if (val instanceof Object) {\n return Object.keys(val)\n .map(prop => encode(val[prop], prependRoot(root, prop)))\n .join(',');\n }\n}\n\nexport function parse(obj) {\n if (obj == null) {\n return;\n }\n\n return ['fields', 'fieldsX']\n .filter(prop => obj[prop] != null)\n .map(prop => `${prop}=${encode(obj[prop])}`)\n .join('&');\n}\n","enum FieldType {\n Global,\n Titles,\n IndicativePrice,\n ReviewSnippets,\n Description,\n UrgencyMessaging,\n Url,\n Summary,\n Characteristics,\n Distances,\n Facilities,\n Destinations,\n EstabGroupIds,\n RoomNightsBooked,\n LegacyFacilities,\n RoomDetails,\n Pricing,\n RoomAvailability,\n HolidayDeals,\n Airports,\n Weather,\n Recommendations,\n TransferTimes,\n UserClicks,\n UserBookings,\n AltTitles,\n HotelDeals,\n HotelAwards\n};\n\nexport function getFieldGroup(...args: FieldType[]) {\n return _.flattenDeep(args)\n .reduce((fPrev, fCurrent) => fPrev + (FieldType[fCurrent] ? 1 << fCurrent : 0), 0);\n}\n\nexport function getFieldTypes() {\n return FieldType;\n}\n","import {getData, postData} from './http';\nimport * as broker from './broker';\n\nimport Flights = Core.Flights;\nimport Flight = Core.Flights.Flight;\nimport Leg = Core.Flights.Leg;\nimport Segment = Core.Flights.Segment;\n\nconst webUrl = 'website/flights/';\nconst promiseCache:Map> = new Map();\n\nexport function getFlightDetails(\n tripId:string,\n continueV2FlightDetailsRequest: boolean,\n request: Flights.DetailsRequest\n ): Promise {\n\n if(!continueV2FlightDetailsRequest) {\n // Exit flight details call for v3 Handover\n broker.publish('handOverToV3', tripId);\n return Promise.resolve(null);\n }\n\n return getData(`${webUrl}details?${$.param(request)}`, {logErrors: false})\n .then(function(data) {\n if (data.ResponseCode === 1) {\n broker.publish('flightNotAvailable', tripId);\n return null;\n }\n return data;\n })\n .catch(function() {\n broker.publish('flightNotAvailable', tripId);\n return null;\n });\n}\n\nexport function getBrandSpecificFlightDetails(BrandSpecificFlightId: string): Promise {\n return getData(`${webUrl}detailsbrandspecific?${$.param({\n BrandSpecificFlightId\n })}`, {logErrors: false});\n}\n\nexport function rehydrate(id:string): Promise {\n if (promiseCache.has(id)) {\n return >promiseCache.get(id);\n }\n\n const promise = getData(`${webUrl}detailsfromsession?${$.param({ DetailsSessionId: id })}`);\n promiseCache.set(id, promise);\n return promise;\n}\n\nexport function isHFlightType(flight: Flight): boolean {\n let isHFlight = false;\n const legs = _.get(flight, 'Legs', []);\n legs.forEach((leg: Leg) => {\n const segments = _.get(leg, 'Segments', []);\n segments.forEach((segment: Segment) => {\n if (segment.SupplierFareClass === 'H') {\n isHFlight = true;\n }\n });\n });\n return isHFlight;\n}\n\n//this is just a hack requried by quotes at the moment\nexport function mapLegs(req: Flights.IPartialFlight): Promise<{}> {\n return postData(`${webUrl}maplegs`, req)\n .then(f => _.omit(_.assign(req, f), ['OutboundLeg', 'InboundLeg']));\n}\n","import {getData, postData} from './http';\n\nconst url = '/api2/flightsnew/static';\nconst terminals: Core.AirportTerminalInformation[] = [];\n\ninterface ApiAirportTerminal {\n Id: number;\n AirportCode: string;\n Code: string;\n Title: string;\n}\n\nexport function getTerminalForFlight(airportCode: string, flightCode: string, fromDate: string) {\n const req = {\n CultureCode: TRPCONFIG.Domain.CultureCode,\n AirportCode:airportCode,\n FlightCode:flightCode,\n Date:fromDate\n };\n\n return postData(`${url}/getterminalforflight`, req, { logErrors: false })\n .then((res: any) => {\n if (res && res.Terminal) {\n return res.Terminal;\n }\n return null;\n });\n}\n\n\nexport function getTerminalsForAirport(airportCode: string): Promise {\n const req = { CultureCode: TRPCONFIG.Domain.CultureCode };\n\n const getTerminal = (airportCode: string): Core.AirportTerminalInformation => {\n return _.find(terminals, t => t.AirportCode === airportCode);\n };\n\n if (terminals.length === 0) {\n //get and set the terminals\n return postData(`${url}/getterminals`, req, { logErrors: false })\n .then((res: any) => {\n if (res && res.Terminals) {\n\n _.forEach(res.Terminals, (v: ApiAirportTerminal) => {\n let t = getTerminal(v.AirportCode);\n if (!t) {\n t = { AirportCode: v.AirportCode, Terminals:[] };\n terminals.push(t);\n }\n\n t.Terminals.push({Code: v.Code, Title: v.Title});\n });\n }\n return getTerminal(airportCode);\n });\n } else {\n return Promise.resolve(getTerminal(airportCode));\n }\n}\n\n","export function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n","import { postData } from './http';\n\nconst googlebot: boolean = /googlebot/i.test(navigator.userAgent);\nconst prerender:boolean = /prerender/i.test(navigator.userAgent);\n\nfunction baseLogger(level: string, message: any): Promise {\n if (googlebot || prerender) {\n return Promise.resolve(false);\n }\n\n const req = {\n LogLevel: level,\n Message: message\n };\n\n return postData('website/logging/log', req, { logErrors: false });\n}\n\nexport function logFatal(message) {\n return baseLogger('Fatal', message);\n}\n\nexport function logError(message) {\n return baseLogger('Error', message);\n}\n\nexport function logWarn(message) {\n return baseLogger('Warn', message);\n}\n\nexport function logInfo(message) {\n return baseLogger('Info', message);\n}\n\nexport function logDebug(message) {\n return baseLogger('Debug', message);\n}\n","import { logWarn } from './logging';\n\nexport const destType = {\n None: 0,\n Estab: 1,\n Location: 2,\n Province: 3,\n Country: 4,\n Place: 5,\n Polygon: 10\n};\n\nexport function getObjectTypeAndId(d) {\n if (d.Type && d.Id) {\n return {\n Type: d.Type,\n Id: d.Id\n };\n }\n\n const type = get(d);\n return {\n Type: type,\n Id: getId(type, d)\n };\n}\n\nfunction getId(type, d) {\n if (d.ObjectId != null) {\n return d.ObjectId;\n }\n switch (type) {\n case destType.None: return null;\n case destType.Estab: return d.EstablishmentId || d.Id;\n case destType.Location: return d.LocationId;\n case destType.Province: return d.ProvinceId;\n case destType.Country: return d.CountryId;\n case destType.Place: return d.PlaceId;\n case destType.Polygon: return d.PolygonId;\n }\n}\n\nexport function get(d) {\n if (d.Type) {\n return d.Type;\n }\n if (d.ObjectTypeId != null) {\n return d.ObjectTypeId;\n }\n if (d.EstablishmentId) {\n return destType.Estab;\n }\n if (d.PlaceId) {\n return destType.Place;\n }\n if (d.LocationId) {\n return destType.Location;\n }\n if (d.ProvinceId) {\n return destType.Province;\n }\n if (d.PolygonId) {\n return destType.Polygon;\n }\n if (d.CountryId) {\n return destType.Country;\n }\n logWarn(`Cannot determine object type from destination object: ${JSON.stringify(d)}`);\n return destType.None;\n}\n\nexport function populateObjectTypeAndId(d) {\n if (d) {\n const typeAndId = getObjectTypeAndId(d);\n d.Type = typeAndId.Type;\n d.Id = typeAndId.Id;\n }\n}\n","import { destType, getObjectTypeAndId } from './objectType';\n\nconst imageSizes = [180, 190, 200, 280, 282, 400, 470, 650, 930, 1200, 1980];\nconst pixelRatios = [1, 1.5, 2];\n\nfunction getClosestValue(baseValue, candidates) {\n let i = candidates.length;\n let selectedVal = candidates[i - 1];\n\n baseValue = parseFloat(baseValue);\n\n while (i--) {\n if (baseValue <= candidates[i]) {\n selectedVal = candidates[i];\n }\n }\n\n return selectedVal;\n}\n\nfunction estabIdToPath(estabId) {\n return estabId.toString().split('').join('/');\n}\n\nexport function getImageDomain() {\n return `https://${TRPCONFIG.Domain.PhotoDomains}`;\n}\n\nexport function getImageUrl(estabId, width, height, sequence, crop) {\n if (TRPCONFIG.Domain.HotelImageCDN) {\n return `https://${TRPCONFIG.Domain.HotelImageCDN}/images/hotels/${estabId}/${sequence}?width=${width}&height=${height}&crop=${!!crop}`;\n }\n let url = `${getImageDomain()}/ei/${estabIdToPath(estabId)}/${sequence}_${width}_${height}`;\n if (crop) {\n url += '_c';\n }\n return `${url}.jpg`;\n}\n\nexport function getMainImageUrl(estabId, width, height, crop) {\n return getImageUrl(estabId, width, height, 0, crop);\n}\n\nexport function getLandingPageImage(d) {\n if (d == null) {\n return null;\n }\n\n const [w] = getAppropriateSize($(window).width());\n\n if (TRPCONFIG.Domain.DeviceType !== 'Mobile') {\n const objectTypeAndId = getObjectTypeAndId(d);\n if (objectTypeAndId.Type === destType.Estab) {\n return getImageUrl(\n objectTypeAndId.Id,\n TRPCONFIG.DeviceSettings.LandingImageHeight,\n w,\n 1,\n false\n );\n }\n }\n\n return getDestinationImage(d, w, TRPCONFIG.DeviceSettings.LandingImageHeight);\n}\n\nexport function getDestinationImage(destination, width, height) {\n const IMG_API = `${TRPCONFIG.DestinationImagesClientDomain}/api2/destination/images/getfromobject`;\n const objectTypeAndId = getObjectTypeAndId(destination);\n const params = new URLSearchParams();\n params.set('v', TRPCONFIG.CurrentVersion);\n for (const key in objectTypeAndId) {\n params.set(key, objectTypeAndId[key]);\n }\n // only apply width and height if specified\n // if used, lazy-src directive will overwrite these\n if (width) {\n params.set('width', width);\n }\n if (height) {\n params.set('height', height);\n }\n return `${IMG_API}?${params}`;\n}\n\nexport function getAppropriateSize(...size) {\n const pr = getClosestValue((window.devicePixelRatio || 1), pixelRatios);\n return size.map(s => getClosestValue(s, imageSizes) * pr);\n}\n","export function getRootPath(): string {\n let rootPath = TRPCONFIG.RootPath;\n return /\\/$/.test(rootPath) ? rootPath : rootPath + '/';\n}\n","import { postData } from './http';\nimport { getRootPath } from './rootPath';\n\nconst apiUrl = 'website/language';\n\nexport function setLanguage(lang: string, id: string): Promise<{}> {\n return postData(`${getRootPath()}${apiUrl}/setlanguage`,\n { language: lang, domainid: id },\n { logErrors: false });\n}\n","import * as broker from './broker';\n\nconst settings = {};\nlet launcher;\nlet closer;\n\nexport function close() {\n if (closer) {\n closer();\n }\n}\n\nexport function get(name) {\n return settings[name];\n}\n\nexport function launch(path, options, preventClose = false, hideHeaderBar = false) {\n if (options) {\n Object.keys(options).forEach(function(k) {\n set(k, options[k]);\n });\n }\n if (launcher) {\n launcher(path, preventClose, hideHeaderBar);\n }\n}\n\nfunction set(name, val) {\n if (val === null) {\n delete settings[name];\n } else {\n settings[name] = val;\n }\n broker.publish(`modal:set:${name}`, val);\n}\n\nexport function onSet(name, fn) {\n broker.subscribe('modalService', `modal:set:${name}`, function(ev) {\n fn(ev.data);\n });\n}\n\nexport function destroy(name) {\n broker.unsubscribe('modalService', `modal:set:${name}`);\n}\n\nexport function onLaunch(fn) {\n launcher = fn;\n}\n\nexport function onClose(fn) {\n closer = fn;\n}\n","export function loadJS(doc, elemType, id, src, force, callback) {\n const el = doc.querySelectorAll(`#${id}`);\n if (el.length > 0) {\n if (!force) {\n return;\n }\n for (let i = 0; i < el.length; i++) {\n const parent = el[i].parentNode;\n parent.removeChild(el[i]);\n }\n }\n\n const fjs = doc.getElementsByTagName(elemType)[0];\n const js = doc.createElement(elemType);\n js.id = id;\n js.src = src;\n fjs.parentNode.insertBefore(js, fjs);\n if (callback) {\n js.onload = callback;\n }\n}\n","import * as resourceService from './resource';\nimport * as arrayUtil from './arrayUtils';\n\ntype Occupancy = Core.Occupancy;\ntype OccupantRange = Core.OccupantRange;\n\nconst minAdults: number = TRPCONFIG.Domain.MinimumAdultOccupancy || 2;\nconst minParkingPassengerCount: number = 1;\nlet occupancy: Occupancy[] = [{\n Adults: minAdults,\n ChildAges: []\n}];\nlet passengerCount: number = minParkingPassengerCount;\nlet callback: (occ:Occupancy[]) => void;\n\nexport const ages = arrayUtil.numberArray(0, 17);\n\nexport function getNumberOfNonInfantsForRoom(index: number): number {\n return getNumberOfNonInfantPassengers(occupancy[index]);\n}\n\nexport function addRoom(): Occupancy[] {\n occupancy.push({Adults: minAdults, ChildAges: []});\n return occupancy;\n}\n\nexport function removeRoom(index: number): Occupancy[] {\n occupancy.splice(index, 1);\n return occupancy;\n}\n\nexport function getOccupancy(): Occupancy[] {\n return occupancy;\n}\n\nexport function setOccupancy(o: Occupancy[]): Occupancy[] {\n occupancy = o.map(function(r: Occupancy|undefined|null) {\n return _.assign({}, {\n ChildAges: [],\n Adults: minAdults\n }, r);\n });\n return o;\n}\n\nexport function enforceAreaLimits(area: string): void {\n const limits = getLimits(area);\n if (limits == null) {\n return;\n }\n\n occupancy.forEach(function(o) {\n o.Adults = o.Adults > limits.maxAdults ?\n limits.maxAdults :\n o.Adults;\n\n if (Array.isArray(o.ChildAges) && o.ChildAges.length > limits.maxChildren) {\n o.ChildAges.splice(limits.maxChildren);\n }\n });\n}\n\nexport function adultRange(area: string): OccupantRange {\n return {\n min: 1,\n max: getLimits(area).maxAdults\n };\n}\n\nexport function childRange(area: string): OccupantRange {\n return {\n min: 0,\n max: getLimits(area).maxChildren\n };\n}\n\n//this will take the array of occupancies and reduce them down to a single one\n//useful for the cases where we don't care about the split into rooms.\nexport function reduceOccupancy(occ?: Occupancy[]): Occupancy {\n return arrayUtil.reduce(function(o1, o2) {\n return {\n Adults: o1.Adults + o2.Adults,\n ChildAges: (o1.ChildAges||[]).concat(o2.ChildAges||[])\n };\n }, occ || _.cloneDeep(getOccupancy()));\n}\n\nexport function getNumberOfNonInfantPassengers(occ?: Occupancy): number {\n function nonInfants(occupancy: Occupancy): number {\n return (occupancy.ChildAges||[]).filter(a => a >= 2).length;\n }\n\n const $location = angular.element(document).injector().get('$location');\n if ($location.search().occ) {\n const o = parseOccupancyString($location.search().occ);\n if (!o) { return 0; }\n const occupancy = _.first(o);\n return _.get(occupancy, 'Adults') + nonInfants(occupancy);\n }\n\n const o = occ || reduceOccupancy();\n return o.Adults + nonInfants(o);\n}\n\nexport function moreInfantsThanAdults(): boolean {\n const o = reduceOccupancy();\n\n function countInfants(value) {\n return value < 2;\n }\n\n return o.Adults < arrayUtil.count(o.ChildAges||[], countInfants);\n}\n\nexport function childAgesPopulated(occupancy: Occupancy[]): boolean {\n occupancy = occupancy || getOccupancy();\n for (let r = occupancy.length - 1; r >= 0; r--) {\n const ages = occupancy[r].ChildAges || [];\n for (let ca = ages.length - 1; ca >= 0; ca--) {\n if (ages[ca] == null) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport function applyOccupancy(): void {\n if (callback) {\n callback(getOccupancy());\n }\n}\n\nexport function onApplyOccupancy(fn: (occ:Occupancy[]) => void): void {\n callback = fn;\n}\n\nexport function getOccupancyStringForRoom(index: number, occ: Occupancy[]): string {\n const str = `${resourceService.get('ROOM')} ${index + 1}`;\n return `${str} (${getOccupancyString([occ ? occ[index] : occupancy[index]])})`;\n}\n\nexport function getRoomOccupancyString(occ: Occupancy[]): string {\n occ = (occ || occupancy);\n\n let str = occupancyProposition(\n occ.length,\n resourceService.get('ROOM'),\n resourceService.get('ROOMS')\n );\n\n str += ` (${getOccupancyString(occ)})`;\n return str;\n}\n\nexport function getOccupancyString(occ: Occupancy[]): string {\n let str;\n const counts = getTotalPeopleCounts(occ);\n\n str = occupancyProposition(\n counts.adults,\n resourceService.get('ADULT'),\n resourceService.get('ADULTS')\n );\n\n if (counts.children) {\n str += ', ';\n str += occupancyProposition(\n counts.children,\n resourceService.get('CHILD'),\n resourceService.get('CHILDREN')\n );\n }\n\n return str;\n}\n\nexport function getTotalPeopleCounts(occ: Occupancy[]): {adults: number, children: number} {\n const result = {\n adults: 0,\n children: 0\n };\n (occ || occupancy).forEach(o => {\n result.adults += o.Adults;\n result.children += _.get(o, 'ChildAges.length', 0);\n });\n return result;\n}\n\nexport function parseOccupancyString(o: string|undefined|null): Occupancy[]|undefined {\n if (!o) { return; }\n const rooms = _(o.toLowerCase()).split('a').tail().value();\n return _.map(rooms, r => {\n const [ adults, ...childAges ] = _.split(r.toLowerCase(), 'c');\n return {\n Adults: parseInt(adults, 10),\n ChildAges: _.map(childAges, v => parseInt(v, 10))\n };\n });\n}\n\nexport function setPassengerCount(n: number): void {\n // Passenger count where age is not a factor i.e. airport parking\n // Not currently synced with `occupancy`\n passengerCount = n || minParkingPassengerCount;\n}\n\nexport function getPassengerCount(): number {\n return passengerCount;\n}\n\nexport function serialise(occ: Occupancy[] = []): string {\n return _.reduce(occ, (serialized, o) => {\n serialized += `A${o.Adults || 0}`;\n _.each(o.ChildAges||[], ca => serialized += `C${ca || 0}`);\n return serialized;\n }, '');\n}\n\nexport function deserialise(o: string): {adults:number, children:number, infants:number} {\n const raw = /A(\\d*)C(\\d*)I(\\d)$/.exec(o);\n if (raw) {\n return {\n adults: parseInt(raw[1] || '0', 10),\n children: parseInt(raw[2] || '0', 10),\n infants: parseInt(raw[3] || '0', 10)\n };\n }\n return {\n adults: 2,\n children: 0,\n infants: 0\n };\n}\n\nexport function isRoomKidsFree(index: number): boolean {\n const o = _.get(occupancy, `[${index}].ChildAges`);\n const num = _.size(o);\n return num > 0 && num <= 3;\n}\n\nexport function getOnlyAdultsPerRoom(i: number): number {\n return _.get(occupancy, `[${i}].Adults`) || 0;\n}\n\nexport function getOnlyPayingIndividuals(): number {\n return _.reduce(occupancy, (sum, room) => {\n const numChildren = _.filter(room.ChildAges || [], ca => ca > 2).length;\n const numAdults = _.get(room, 'Adults') || 0;\n if (numChildren <= 3) {\n return sum + numAdults;\n }\n return sum + numChildren + numAdults;\n }, 0);\n}\n\nfunction getLimits(area: string) {\n return TRPCONFIG.Domain.OccupancyLimits[area];\n}\n\nfunction occupancyProposition(number: number, singular: string, plural: string): string {\n return `${number} ${number > 1 ? plural : singular}`;\n}\n","enum MasterType {\n Maestro = 13,\n PayPal = 28\n}\n\nenum PaymentType {\n CreditCard = 1,\n DebitCard = 2,\n PayPal = 14\n}\n\ntype BookingPaymentOption = Core.BookingPaymentOption;\ntype BookingSavedCardOption = Core.BookingSavedCardOption;\ntype BookingPaymentDetails = Core.BookingPaymentDetails;\ntype MybPaymentOption = Core.MybPaymentOption;\ntype MybSavedCardOption = Core.MybSavedCardOption;\ntype PaymentOption = Core.PaymentOption;\ntype SavedCardOption = Core.SavedCardOption;\ntype ExternalFopDetail = Core.ExternalFopDetail;\ntype PaymentModel = Core.PaymentModel;\n\nexport function createEmptyPaymentModel(): PaymentModel {\n return {\n cardDetail: {\n cardNumber: '',\n cardTypeId: undefined,\n expiryDate: {month: 0, year: 0},\n issueNumber: '',\n maskedNumber: '',\n paymentOptionId: 0,\n paymentTypeId: 0,\n securityCode: '',\n startDate: {month: 0, year: 0},\n isSavedCard: false,\n savedCardId: ''\n },\n externalFop: undefined,\n fee: 0,\n isPayPalPayment: false,\n saveCard: false\n };\n}\n\nexport function createEmptyExternalFop(): ExternalFopDetail {\n return {authorisationCode: '', note: ''};\n}\n\nexport function convertBookingPaymentOptions(options: BookingPaymentOption[]): PaymentOption[] {\n return _.map(options, o => {\n return {\n AdminOverride: o.AdminOverride,\n CardTypeId: o.CardTypeId, //To keep mapping in payment service working\n FeeAmount: o.FeeAmount,\n FeePercent: o.FeePercent,\n FullDetailsRequired: o.FullDetails,\n Id: o.CardTypeId,\n Name: o.Title,\n PaymentType: o.PaymentTypeId,\n Title: o.Title, //To keep mapping in payment service working\n IsExternalFop: o.IsExternalFop,\n IsPayPal: o.PaymentTypeId === PaymentType.PayPal || o.CardTypeId === MasterType.PayPal\n };\n });\n}\n\nexport function convertBookingSavedCards(savedOptions: BookingSavedCardOption[],\n paymentOptions: BookingPaymentOption[]): SavedCardOption[] {\n let options: SavedCardOption[] = [];\n\n _.each(savedOptions, so => {\n const paymentOption = _.find(paymentOptions, {'CardTypeId': so.CardTypeId});\n\n if (paymentOption) {\n options.push({\n CardId: so.CardId,\n CardName: so.CardName,\n CardType: so.CardTypeId,\n ExpiryMonth: so.ExpiryMonth,\n ExpiryYear: so.ExpiryYear,\n FeeAmount: paymentOption.FeeAmount, //why is this not from the API\n FeePercent: paymentOption.FeePercent, //why is this not from the API\n FullDetailsRequired: paymentOption.FullDetails,\n IsExpired: so.IsExpired,\n LogoName: so.LogoName,\n MaskedNumber: so.MaskedNumber,\n MasterCardTypeId: so.MasterCardTypeId,\n PaymentTypeId: paymentOption.PaymentTypeId\n });\n }\n });\n\n return options;\n}\n\nexport function convertMybPaymentOptions(options: MybPaymentOption[]): PaymentOption[] {\n return _.map(options, o => {\n return {\n AdminOverride: o.AdminOverride,\n CardTypeId: o.CardType, //To keep mapping in payment service working\n FeeAmount: o.FeeAmount,\n FeePercent: o.FeePercent,\n FullDetailsRequired: o.CardType === MasterType.Maestro,\n Id: o.Id,\n IsExternalFop: o.IsExternalFop,\n Name: o.Name,\n PaymentType: o.PaymentType,\n Title: o.Name, //To keep mapping in payment service working\n IsPayPal: o.PaymentType === PaymentType.PayPal || o.CardType === MasterType.PayPal\n };\n });\n}\n\nexport function convertMybSavedCards(savedOptions: MybSavedCardOption[],\n paymentOptions: MybPaymentOption[]): SavedCardOption[] {\n let options: SavedCardOption[] = [];\n\n _.each(savedOptions, so => {\n //check we can find the card type info (why does the api not give us this??)\n const paymentOption = _.find(paymentOptions, {'CardType': so.MasterCardTypeId});\n\n if (paymentOption) {\n options.push({\n CardId: so.CardId,\n CardName: so.CardName,\n CardType: paymentOption.Id, //crazy\n ExpiryMonth: so.ExpiryMonth,\n ExpiryYear: so.ExpiryYear,\n FeeAmount: paymentOption.FeeAmount, //why is this not from the API\n FeePercent: paymentOption.FeePercent, //why is this not from the API\n FullDetailsRequired: so.FullDetailsRequired,\n IsExpired: so.IsExpired,\n LogoName: so.LogoName,\n MaskedNumber: so.MaskedNumber,\n MasterCardTypeId: so.MasterCardTypeId,\n PaymentTypeId: paymentOption.PaymentType //why is this not from the API\n });\n }\n });\n\n return options;\n}\n\nexport function addPaymentDetailsToClearRequest(source: PaymentModel, target: any): void {\n var valueOrDefault = (v,d) => !_.isEmpty(v) ? v : d;\n var toStringOrDefault = (v,d) => v !== 0 ? v.toString() : d;\n\n //add our card details to the Clear Request object that is sent to the API where\n //we are allowed to use nulls\n let card = source.cardDetail;\n\n target.CardFeeAmount = source.fee;\n target.PaymentTypeId = card.paymentTypeId;\n target.PaymentOptionId = card.paymentOptionId;\n target.CardNumber = valueOrDefault(card.cardNumber, null);\n target.CardNumberMasked = valueOrDefault(card.maskedNumber, null);\n target.CardStartMonth = toStringOrDefault(card.startDate.month, null);\n target.CardStartYear = toStringOrDefault(card.startDate.year, null);\n target.CardEndMonth = toStringOrDefault(card.expiryDate.month, null);\n target.CardEndYear = toStringOrDefault(card.expiryDate.year, null);\n target.CardIssueNumber = valueOrDefault(card.issueNumber, null);\n target.CardCvc = valueOrDefault(card.securityCode, null);\n target.IsSavedCard = card.isSavedCard;\n target.SavedCardId = valueOrDefault(card.savedCardId, null);\n target.RetainCard = source.saveCard;\n target.ExternalAuthorisationCode = valueOrDefault(source.externalFop\n && source.externalFop.authorisationCode, null);\n target.ExternalPaymentNote = valueOrDefault(source.externalFop && source.externalFop.note, null);\n}\n\nexport function copyCardDetailsToUserData(source: PaymentModel, target: BookingPaymentDetails): void {\n //use our payment model to fill the booking payment details that we use on the booking\n //form. Not ideal but until we can make the objects expected in MYB and the BookingForm\n //the same we will have to provide this transform\n let t = target.CardDetails;\n let s = source.cardDetail;\n\n t.CardNumber = (s.cardNumber && s.cardNumber.length > 0 ? s.cardNumber : null);\n t.CardType = s.paymentOptionId;\n t.CardId = s.savedCardId;\n t.ExpiryDate = {\n Month: s.expiryDate.month,\n Year: s.expiryDate.year\n };\n t.IssueNumber = (s.issueNumber.length > 0 ? s.issueNumber : null);\n t.MaskedCardNumber = s.maskedNumber;\n t.PaymentTypeId = s.paymentTypeId;\n t.SecurityCode = (s.securityCode && s.securityCode.length > 0 ? s.securityCode : null);\n t.StartDate = {\n Month: s.startDate.month,\n Year: s.startDate.year\n };\n target.SaveThisCard = source.saveCard;\n}\n","export function data(page: number, size: number, total: number): Core.PagingData {\n const start = (size * page) - size + 1;\n const stop = (start + size - 1) > total ? total : (start + size - 1);\n return {start, stop, total, size, page};\n}\n","export const products = {\n hotels: 1,\n flights: 2,\n holidays: 4,\n transfers: 8,\n carHire: 16,\n marhaba: 32,\n attractions: 64,\n parking: 128,\n insurance: 256\n};\n\nexport function isProductSupported(product) {\n // eslint-disable-next-line no-bitwise\n return (TRPCONFIG.Domain.SupportedProducts & product) > 0;\n}\n","const REGEXP_PARSE_URL = /(.*)(\\?(.*))/;\n\nexport function stripLeadingSlash(url) {\n if (url == null) {\n return url;\n }\n return url.indexOf('/') === 0 ? url.substring(1) : url;\n}\n\nexport function splitQs(qs) {\n const qsObj = {};\n qs.split('&').forEach(function(pair) {\n const splitPair = pair.split('=');\n qsObj[splitPair[0]] = splitPair[1];\n });\n return qsObj;\n}\n\nexport function appendExistingQueryString(url) {\n const $location = angular.element(document).injector().get('$location');\n const parsed = parse(url);\n const search = $location.search();\n parsed.qs = Object.assign(parsed.qs, search);\n return format(parsed);\n}\n\nexport function parse(str) {\n const result = {\n url: str,\n qs: {}\n };\n\n if (str == null) { return result; }\n\n const match = str.match(REGEXP_PARSE_URL);\n if (match == null) { return result; }\n result.url = match[1];\n result.qs = splitQs(match[3]);\n return result;\n}\n\nfunction formatQs(qs) {\n const keys = Object.keys(qs);\n if (qs == null || keys.length === 0) {\n return null;\n }\n const params = keys.map(function(k) {\n return `${k}=${qs[k]}`;\n });\n return `?${params.join('&')}`;\n}\n\nexport function format(parsed) {\n const qs = formatQs(parsed.qs);\n return qs ? parsed.url + qs : parsed.url;\n}\n\nexport function getOrigin() {\n const $window = angular.element(document).injector().get('$window');\n\n if (!$window.location.origin) {\n return `${$window.location.protocol}//${$window.location.hostname}${$window.location.port ? `:${$window.location.port}` : ''}`;\n }\n return $window.location.origin;\n}\n\nexport function parseIdBasedUrls(str) {\n const result = {\n url: str\n };\n if (str == null) { return result; }\n const match = result.url.match(/(\\d(?:-\\d+){1,3})\\/(.*)/i);\n if (match == null) { return result; }\n result.idPart = match[1];\n result.urlText = match[2];\n return result;\n}\n\nexport function parseFullUrl(url) {\n const aElem = document.createElement('a');\n aElem.href = url;\n const { host, port, protocol, pathname } = aElem;\n const pathnameWithoutCulture = pathname.replace(/^\\/?[^/]{2}_[^/]{2}\\//, '');\n return {\n host,\n port,\n protocol,\n pathname,\n pathnameWithoutCulture\n };\n}\n\n","export default function(amount) {\n return amount < 10 ? `0${amount}` : `${amount}`;\n}\n","export default function(total) {\n if (total == null) {\n return '00:00';\n }\n const hours = Math.floor(total / 60);\n const minutes = total % 60;\n return `${hours < 10 ? `0${hours}` : hours}:${minutes < 10 ? `0${minutes}` : minutes}`;\n}\n","export default function(original, regExp, newSubString, single) {\n if (typeof original === 'string') {\n return original.replace(new RegExp(regExp, single ? undefined : 'g'), newSubString);\n }\n}\n","export default function(html) {\n const div = document.createElement('div');\n div.innerHTML = html;\n return div.textContent;\n}\n","// @ts-nocheck\nlet storage;\n\nconst initilised = new Promise(function(resolve) {\n localforage.getItem('trpPreferences', function(err, value) {\n if (err) {\n console.log(`error retrieving preferences:${err}`);\n } else {\n storage = value || {};\n }\n resolve();\n });\n});\n\nfunction localForageSet(cb) {\n localforage.setItem('trpPreferences', storage, function(err) {\n if (err) {\n console.log(`error setting preferences:${err}`);\n }\n cb();\n });\n}\n\nexport function get(cb) {\n initilised.then(() => cb(storage));\n}\n\nexport function set(cb, prefs) {\n initilised.then(() => {\n Object.assign(storage, prefs);\n localForageSet(cb);\n });\n}\n\nexport function remove(cb, key) {\n initilised.then(() => {\n delete storage[key];\n localForageSet(cb);\n });\n}\n\nexport function getItem(key, callback) {\n return localforage.getItem(key, callback);\n}\n\nexport function setItem(key, value, callback) {\n return localforage.setItem(key, value, callback);\n}\n\nexport function removeItem(key, callback) {\n return localforage.removeItem(key, callback);\n}\n","// @ts-nocheck\nimport * as currentUser from './currentUser';\n\nexport function recordRevenue(value) {\n const user = currentUser.get();\n if (!TRPCONFIG.Domain.VWOTestingEnabled || !!(user && user.Agent)) {\n return;\n }\n\n // eslint-disable-next-line camelcase\n window._vis_opt_queue = window._vis_opt_queue || [];\n /* global _vis_opt_revenue_conversion: false */\n window._vis_opt_queue.push(function() { _vis_opt_revenue_conversion(value); });\n}\n\nexport function registerConversion(goalId, testId) {\n const user = currentUser.get();\n if (!TRPCONFIG.Domain.VWOTestingEnabled || !!(user && user.Agent)) {\n return;\n }\n\n // eslint-disable-next-line camelcase\n window._vis_opt_queue = window._vis_opt_queue || [];\n /* global _vis_opt_register_conversion: false */\n window._vis_opt_queue.push(function() { _vis_opt_register_conversion(goalId, testId); });\n}\n\n/* eslint-disable */ //some dodgy JS from VWO, way too many issues with eslint so just ignoring it\nexport function executeTrackingCode(hide) {\n const user = currentUser.get();\n if (!TRPCONFIG.Domain.VWOTestingEnabled || !!(user && user.Agent)) {\n return;\n }\n\n const $ = window.vwo_$ || window.$ || window.jQuery;\n $ && $('.vwo_loaded').removeClass('vwo_loaded');\n if (window._vwo_code) {\n     return;\n }\n window._vwo_code = (function() {\n const account_id = TRPCONFIG.Domain.VWOAccountId;\n const settings_tolerance = 2000;\n const library_tolerance = 2500;\n const url = window._vis_opt_url || document.URL;\n const use_existing_jquery = true;\n // DO NOT EDIT BELOW THIS LINE\n const d = document;\n let f = false;\n let mpTimeout = null;\n return {\n use_existing_jquery: function() { return use_existing_jquery; },\n library_tolerance: function() { return library_tolerance; },\n finish: function () {\n if (!f) {\n f = true;\n const a = d.getElementById('_vis_opt_path_hides');\n if (a) a.parentNode.removeChild(a);\n }\n\n clearTimeout(mpTimeout);\n mpTimeout = setTimeout(this.pushToMixpanel, 500);\n },\n finished: function() { return f; },\n load: function(a) {\n const b = d.createElement('script');\n b.src = a;\n b.type = 'text/javascript';\n b.innerText;\n b.onerror = function() { _vwo_code.finish(); };\n d.getElementsByTagName('head')[0].appendChild(b);\n },\n init: function() {\n const settings_timer = setTimeout('_vwo_code.finish()', settings_tolerance);\n this.load('//dev.visualwebsiteoptimizer.com/j.php?a=' + account_id + '&u=' + encodeURIComponent(url) + '&r=' + Math.random());\n\n //DK: have seen issues in dev where the style is added multiple times (bad code, but we want to avoid this in live)\n //so have added a check for the style before adding it again. Users won't get stuck with a blank white screen.\n if (TRPCONFIG.Domain.VWOShowOverlay){\n if (!d.getElementById('_vis_opt_path_hides')) {\n const a = d.createElement('style'),\n b = hide ? hide + '{filter:contrast(50%) !important; -webkit-filter:contrast(50%) !important; opacity:0.55 !important;filter:alpha(opacity=0.55) !important;background:none !important; pointer-events: none !important;}' : '',\n h = d.getElementsByTagName('head')[0];\n a.setAttribute('id', '_vis_opt_path_hides');\n a.setAttribute('type', 'text/css');\n if (a.styleSheet) a.styleSheet.cssText = b;\n else a.appendChild(d.createTextNode(b));\n h.appendChild(a);\n }\n }\n\n return settings_timer;\n },\n pushToMixpanel: function() {\n let _vis_opt_queue = window._vis_opt_queue || [], _vis_counter = 0, mixpanel = window.mixpanel;\n if (mixpanel) {\n _vis_opt_queue.push(function () {\n try {\n if (!_vis_counter) {\n var _vis_data = {}, _vis_combination, _vis_id, _vis_l = 0;\n for (; _vis_l < _vwo_exp_ids.length; _vis_l++) {\n _vis_id = _vwo_exp_ids[_vis_l];\n if (_vwo_exp[_vis_id].ready) {\n _vis_combination = _vis_opt_readCookie('_vis_opt_exp_' + _vis_id + '_combi');\n if (typeof(_vwo_exp[_vis_id].combination_chosen) != \"undefined\")\n _vis_combination = _vwo_exp[_vis_id].combination_chosen;\n if (typeof(_vwo_exp[_vis_id].comb_n[_vis_combination]) != \"undefined\") {\n _vis_data['VWO-Test-ID-' + _vis_id] = _vwo_exp[_vis_id].comb_n[_vis_combination];\n _vis_counter++;\n }\n }\n }\n // Use the _vis_data object created above to fetch the data,\n // key of the object is the Test ID and the value is Variation Name\n if (_vis_counter) {\n mixpanel.register_once(_vis_data);\n }\n }\n }\n catch (err) {\n }\n });\n }\n }\n };\n }());\n window._vwo_settings_timer = _vwo_code.init();\n}\n/* eslint-enable */\n\nexport function progressiveHotelSearchEnabled(isHotel) {\n // When this ab-test is unpicked, then will need to decide if it should still be hotel only,\n // and what is the best way to detect that.\n\n if (!TRPCONFIG.Domain.ProgressiveHotelSearchEnabled || window.location.pathname.indexOf('holiday') > -1) {\n return false;\n }\n return isHotel || window.location.pathname.indexOf('hotel') > -1;\n}\n","import { getData, postData } from './http';\nimport { getRootPath } from './rootPath';\nimport { logError } from './logging';\nimport { wrapNonArray } from './arrayUtils';\nimport { removeItem } from './desktop/localStorageProvider';\nimport * as currentUser from './currentUser';\n\nconst errorToIgnore = 'Station exists but recording not in progress';\nconst cardFeeOverridePermission = 59;\nconst root = getRootPath();\nconst debugApiUrl = `${root}website/debug`;\nlet paused = false;\nlet activeExtension;\n\nexport function loginOverride(username, password) {\n const parameters = $.param({\n Username: username,\n Password: password\n });\n\n return getData(`/api2/agents/get?${parameters}`, { logErrors: false })\n .then(function(agentInfo) {\n if (agentInfo.Permissions.indexOf(cardFeeOverridePermission) === -1) {\n return Promise.reject({ status: 401 });\n }\n return agentInfo;\n });\n}\n\nexport function hasOverridePermission(agent) {\n if (!agent) { return false; }\n\n return agent.Permissions.indexOf(cardFeeOverridePermission) !== -1;\n}\n\nexport function getBookingUserData(bookingId) {\n return getData(`/api2/bookings/getuserdata?BookingId=${bookingId}&DomainId=${TRPCONFIG.Domain.DomainId}`, { logErrors: false });\n}\n\nexport function getBookingContact(bookingId) {\n return getData(`/api2/bookings/getbookingcontact?BookingId=${bookingId}&DomainId=${TRPCONFIG.Domain.DomainId}`, { logErrors: false });\n}\n\nexport function signin(signinRequest) {\n return postData('/api2/agents/signin', signinRequest);\n}\n\nexport function signout() {\n return postData('/api2/agents/signout').then(function() {\n removeItem('trackingTag');\n currentUser.set(Object.assign({}, currentUser.get(), { Agent: null }));\n });\n}\n\nexport function buildProvidersString(basket) {\n const providers = {};\n _.forEach(basket, entry => {\n wrapNonArray(entry).forEach(product => {\n if (!product || !product.CostBreakdown) { return; }\n\n for (let i = 0, ii = product.CostBreakdown.length; i < ii; i++) {\n const sp = product.CostBreakdown[i].SupplierName;\n if (sp) { providers[sp] = true; }\n }\n });\n });\n return Object.keys(providers).join(', ');\n}\n\nexport function getAgentInformation() {\n return getData('/api2/agents/getsignedinuser', { logErrors: false });\n}\n\nexport function setOfficeLocation(officeLocation) {\n return postData('/api2/agents/setcurrentofficelocation', { CurrentOfficeLocation: officeLocation }, { logErrors: false });\n}\n\nexport function changePassword(oldPassword, newPassword) {\n return postData('/api2/agents/changepassword', { OldPassword: oldPassword, NewPassword: newPassword }, { logErrors: false });\n}\n\nexport function resetPasswordInitiate(username) {\n return postData('/api2/agents/passwords/requestchange', { Username: username, CultureCode: TRPCONFIG.Domain.CultureCode, DomainId: TRPCONFIG.Domain.DomainId }, { logErrors: false });\n}\n\nexport function resetPassword(newPassword, token) {\n return postData('/api2/agents/passwords/changewithtoken', { NewPassword: newPassword, Token: token }, { logErrors: false });\n}\n\nexport function getCoworkers() {\n return getData('/api2/agents/getcoworkers', { logErrors: false });\n}\n\nexport function getCreditCheck(customerId, amountRequested) {\n return postData('/api2/bookings/creditcheck', { CustomerId: customerId, AmountRequested: amountRequested }, { logErrors: false });\n}\n\nexport function checkExtensionStatus(ext) {\n if (paused) {\n return Promise.reject(null);\n }\n if (ext == null) {\n return Promise.resolve(false);\n }\n const promises = [];\n\n for (let i = 0, ii = ext.length; i < ii; i++) {\n promises.push(_sendSabioCommand('Status', ext[i]));\n }\n\n return Promise.all(promises).then(function(extensionsStatus) {\n const activeExtensionStatus = extensionsStatus.filter(data => data.Error !== true)[0];\n if (activeExtensionStatus) {\n activeExtension = activeExtensionStatus.Extension;\n }\n\n return !!activeExtension;\n });\n}\n\nexport function pauseCall() {\n if (paused || !activeExtension) {\n return Promise.reject('ABORT');\n }\n return _sendSabioCommand('Pause', activeExtension)\n .then(_errorInChain)\n .catch(_logError)\n .catch(_abortCallPauseProcess)\n .then(_togglePaused(true));\n}\n\nexport function resumeCall() {\n if (!paused || !activeExtension) {\n return Promise.reject('ABORT');\n }\n return _sendSabioCommand('Resume', activeExtension)\n .then(_errorInChain)\n .catch(_logError)\n .catch(_abortCallPauseProcess)\n .then(_togglePaused(false))\n .then(_unsetActiveExtension);\n}\n\nexport function getDebugSettings() {\n return getData(`${debugApiUrl}/getdebugsettings`, { logErrors: false });\n}\n\nexport function updateDebugSettings(settings) {\n return postData(`${debugApiUrl}/setdebugcookie`, settings, { logErrors: false });\n}\n\nexport function getSuppliers() {\n return getData('/api/search/suppliers');\n}\n\nexport function logFatalError(type) {\n let errorMessage = `Call Pause Exception on extension ${\n activeExtension\n }: Fatal unable to ${\n type}`;\n errorMessage += '| SiteName: MLT2';\n errorMessage += `| UserAgent: ${navigator.userAgent}`;\n\n logError(errorMessage);\n}\n\nfunction _sendSabioCommand(command, extension) {\n const parameters = {\n User: '',\n Host: '',\n Extension: extension,\n InteractionId: '',\n IpAdresses: '',\n Command: command,\n Sequence: ''\n };\n return postData(TRPCONFIG.Domain.SabioUrl, parameters, { logErrors: false }).then(data => Object.assign({}, data, { Extension: extension }));\n}\n\n// The server is not returning errors properly, this additional step let us force errors in the\n// error chain, in order to handle them properly.\nfunction _errorInChain(data) {\n if (data.Error === true) {\n return Promise.reject(data);\n }\n return data;\n}\n\n// If there is no active call we abort the whole process and return to the initial state.\nfunction _abortCallPauseProcess(data) {\n if (data.ErrorMessage === errorToIgnore) {\n paused = false;\n activeExtension = undefined;\n return Promise.reject('ABORT');\n }\n return Promise.reject(data.ErrorMessage);\n}\n\nfunction _logError(data) {\n let errorMessage = `Call Pause Exception on extension ${activeExtension}: `;\n if (data) {\n errorMessage += data.ErrorMessage;\n } else {\n errorMessage += 'Unknown Error';\n }\n errorMessage += '| SiteName: MLT2';\n errorMessage += `| UserAgent: ${navigator.userAgent}`;\n logError(errorMessage);\n return Promise.reject(data);\n}\n\nfunction _togglePaused(val) {\n return function() {\n paused = val;\n };\n}\n\nfunction _unsetActiveExtension() {\n activeExtension = undefined;\n}\n","const html: JQuery = $('html');\nconst transitionEvents: string = 'webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend';\n\nexport function isElementHidden($el: JQuery): boolean {\n return $el.hasClass('visually-hidden') && $el.hasClass('hidden');\n}\n\nexport function waitForTransition($el: JQuery): Promise {\n if (!$el.is(':visible')) {\n return Promise.resolve($el);\n }\n return new Promise(resolve => {\n $el.one(transitionEvents, e => {\n e.stopPropagation();\n resolve($el);\n });\n });\n}\n\nexport function addCssWithTransition($el: JQuery, property: string, value: string): Promise {\n $el.css(property, value);\n return waitForTransition($el);\n}\n\nexport function addClassWithTransition($el: JQuery, className: string): Promise {\n if ($el.hasClass(className)) {\n return Promise.resolve($el);\n }\n $el.addClass(className);\n return waitForTransition($el);\n}\n\nexport function removeClassWithTransition($el: JQuery, className: string): Promise {\n if (!$el.hasClass(className)) {\n return Promise.resolve($el);\n }\n $el.removeClass(className);\n return waitForTransition($el);\n}\n\nexport function showElement($el: JQuery): Promise {\n if (!isElementHidden($el)) {\n return Promise.resolve($el);\n }\n\n $el.removeClass('hidden');\n return new Promise(resolve => {\n setTimeout(() => {\n removeClassWithTransition($el, 'visually-hidden').then(() => {\n resolve($el);\n });\n }, 20);\n });\n}\n\nexport function hideElement($el: JQuery): Promise {\n if (isElementHidden($el)) {\n return Promise.resolve($el);\n }\n\n return addClassWithTransition($el, 'visually-hidden').then(() => {\n $el.addClass('hidden');\n return $el;\n });\n}\n\nexport function lockScroll(): void {\n html.addClass('hide-vertical-scrollbar');\n}\n\nexport function restoreScroll(): void {\n html.removeClass('hide-vertical-scrollbar');\n}\n","\nexport function getRandomID(prefix: string): string {\n return `${prefix}${Math.random().toString(36).substr(2, 7)}`;\n}\n","export const Complete = 1;\nexport const Alert = 2;\nexport const ThreeDs = 3;\nexport const Error = 4;\nexport const ValidationError = 5;\nexport const TimedOut = 6;\nexport const BookingError = 7;\nexport const PayPalVerification = 8;\nexport const PayPalVerified = 9;\nexport const Cpg = 10;\nexport const Refresh = 13;\n","import { getData } from './http';\n\nconst url = 'website/cms/';\n\nexport function getHotelInformation(estabId) {\n return getData(`${url}hotel?componentName=${estabId}`);\n}\n\nexport function getUrlForPage(name) {\n return getData(`${url}geturlforpage?name=${encodeURIComponent(name)}`);\n}\n","import { getDeferred } from './resource';\n\nexport function getCurrencies() {\n return {\n GBP: getDeferred('GBP'),\n GIP: getDeferred('GIP'),\n EUR: getDeferred('EUR'),\n USD: getDeferred('USD'),\n INR: getDeferred('INR'),\n AED: getDeferred('AED'),\n SAR: getDeferred('SAR'),\n OMR: getDeferred('OMR'),\n BHD: getDeferred('BHD'),\n QAR: getDeferred('QAR'),\n KWD: getDeferred('KWD'),\n JOD: getDeferred('JOD'),\n EGP: getDeferred('EGP'),\n ZAR: getDeferred('ZAR'),\n RUB: getDeferred('RUB'),\n SEK: getDeferred('SEK'),\n DKK: getDeferred('DKK'),\n XOF: getDeferred('XOF'),\n THB: getDeferred('THB'),\n HKD: getDeferred('HKD'),\n SGD: getDeferred('SGD'),\n MYR: getDeferred('MYR')\n };\n}\n\nexport function getSymbol(code) {\n const currencies = getCurrencies();\n return currencies[code] && currencies[code]();\n}\n","import { getData, postData } from './http';\nimport { getObjectTypeAndId } from './objectType';\n\nexport function getTopEstabsForAirport(AirportCode) {\n const params = $.param({\n AirportCode\n });\n\n return getData(`/api2/destination/airports/getdestinationservedbyairport?${params}`, {\n cache: true,\n logErrors: false\n }).then(function(data) {\n const objectTypeAndId = getObjectTypeAndId(data);\n\n const request = {\n DestinationType: objectTypeAndId.Type,\n DestinationId: objectTypeAndId.Id,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n SortCriterion: 1,\n Paging: {\n Index: 0,\n Size: 3\n },\n FieldFlags: 0\n };\n\n return postData('/api/hotels/static/gethotelsbydestination?fields=Hotels.Id', request, { logErrors: false });\n });\n}\n","import { getData, postData } from './http';\n\nexport function referFriends(friends: TR.Friend[]) {\n return postData('/api2/private/users/discounts/referfriends', {\n Friends: friends,\n DomainId: TRPCONFIG.Domain.DomainId\n });\n}\n\nexport function getDiscountCodeForUser() {\n return getData('website/discounts/getdiscountcodeforuser')\n .then(data => TRPCONFIG.DiscountCode = data);\n}\n\nexport function validate(): Promise {\n if (!TRPCONFIG.DiscountCode) {\n return Promise.resolve();\n }\n\n const params = new URLSearchParams();\n params.set('code', TRPCONFIG.DiscountCode);\n return getData(`website/discounts/validate?${params}`).then(data => {\n if (!data) {\n TRPCONFIG.DiscountCode = null;\n }\n });\n}\n","export function filterQuotes(ctrl, index, model, noneModel, val, limit, currentLimit, moreQuotes) {\n if (model === noneModel && !moreQuotes) {\n ctrl[currentLimit] = limit;\n }\n if (index < ctrl[currentLimit]) {\n if (angular.equals(model, val) && !moreQuotes) {\n ctrl[currentLimit] = limit;\n }\n return true;\n }\n if (angular.equals(model, val)) {\n ctrl[currentLimit] = limit - 1;\n return true;\n }\n return false;\n}\n","\nexport default class FilterUtil {\n constructor(filter) {\n this.filter = filter;\n }\n\n filterSet(filterName) {\n return this.filter[filterName] != null &&\n this.filter[filterName].length > 0;\n }\n\n rangeFilterSet(results, compareTo, filterName, range) {\n let value = _.chain(this.filter).get(filterName).get(range).value();\n return value != null && results && value !== compareTo[filterName][range];\n }\n\n bitFilterSet(filterName) {\n return this.filter[filterName] !== false;\n }\n\n resetRangeFilter(results, resetFrom, filterName, range) {\n if (this.filter[filterName] !== null && results !== null) {\n this.filter[filterName] = copyRange(this.filter[filterName]);\n if (!(range instanceof Array)) {\n range = [range];\n }\n range.forEach(function(r) {\n this.filter[filterName][r] = _.chain(resetFrom)\n .get(filterName)\n .get(r, null)\n .value();\n }, this);\n let isAllNull = _.every(this.filter[filterName], x => x == null);\n if (isAllNull) {\n this.filter[filterName] = null;\n }\n }\n }\n\n removeArrayFilter(filterName, item) {\n if (this.filter[filterName] != null) {\n const index = this.filter[filterName].indexOf(item);\n if (index >= 0) {\n this.filter[filterName].splice(index, 1);\n }\n }\n }\n\n removeFiltersIn(filterName, vals) {\n if (this.filter[filterName] != null) {\n this.filter[filterName] = this.filter[filterName].filter(function(v) {\n return vals.indexOf(v) < 0;\n });\n }\n }\n\n resetArrayFilter(filterName) {\n if (this.filter[filterName] != null) {\n this.filter[filterName].splice(0, this.filter[filterName].length);\n }\n }\n\n resetBooleanFilter(filterName) {\n this.filter[filterName] = false;\n }\n\n removeFilter(filterName) {\n this.filter[filterName] = null;\n }\n\n resetBitFilter(filterName) {\n this.filter[filterName] = false;\n }\n\n copyFilterFrom(filterName, copyFrom) {\n if (!this.filter[filterName] && copyFrom[filterName] != null) {\n this.filter[filterName] = copyRange(copyFrom[filterName]);\n }\n }\n\n setToNullIfMatches(filter, filterName, compareTo) {\n if (rangesMatch(filter[filterName], compareTo[filterName])) {\n filter[filterName] = null;\n }\n }\n\n getFilter() {\n return this.filter;\n }\n}\n\nfunction copyRange(r) {\n return { Min: r.Min, Max: r.Max };\n}\n\nfunction rangesMatch(r1, r2) {\n return (r1 === null && r2 === null) ||\n (r1 !== null && r2 !== null && r1.Min === r2.Min && r1.Max === r2.Max);\n}\n","import { postData } from './http';\n\nexport function getSeatPlan(request) {\n return postData('/api2/flights/seatplan/getseatplan', request, { logErrors: false })\n .then(addMinCostPerPerson);\n}\n\nexport function addMinCostPerPerson(seatPlan) {\n const segments = seatPlan.Segments;\n const outbound = segments && segments.Outbound || [];\n const inbound = segments && segments.Inbound || [];\n const flights = [].concat(outbound, inbound);\n seatPlan.minCostPerPerson = _.sumBy(flights, getMinSeatPriceFromflight);\n return seatPlan;\n}\n\nfunction getMinSeatPriceFromflight(flight) {\n let seats = [];\n flight.SeatPlan.Rows.forEach(row => {\n row.Blocks.forEach(block => {\n seats = seats.concat(block.Seats);\n });\n });\n const minSeat = _.minBy(_.filter(seats, { IsAvailable: true }), seat => seat.AdultPrice);\n return minSeat.AdultPrice;\n}\n","import { postData } from './http';\n\nconst url: string = '/api2/flightsnew/static';\n\nexport function getFlightDurations(departureAirportGroups: TR.CsvString[],\n destinationAirportGroups: TR.CsvString[]): Promise {\n const request = {\n DepartureAirportGroups: departureAirportGroups,\n DestinationAirportGroups: destinationAirportGroups,\n };\n return postData(url + '/getflightdurations', request)\n .then(data => data.GroupDurations);\n}\n","const propertyTypeMap = {\n 1: 'ROOMSFROM',\n 2: ['APARTMENTSFROM', 'APARTMENTFROM'],\n 3: 'CAMPINGFROM',\n 5: 'ROOMSFROM',\n 6: 'ROOMSFROM',\n 7: 'RURALHOUSEFROM',\n 8: ['VILLASFROM', 'VILLAFROM'],\n 9: ['BUNGALOWSFROM', 'BUNGALOWFROM'],\n 10: ['CONDOMINIUMSFROM', 'CONDOMINIUMFROM'],\n 11: 'ROOMSFROM',\n 12: 'ROOMSFROM',\n 13: 'ROOMSFROM',\n 14: 'ROOMSFROM',\n 15: 'ROOMSFROM',\n 16: 'ROOMSFROM',\n 17: 'ROOMSFROM',\n 18: 'ROOMSFROM',\n 19: ['TOWNHOUSESFROM', 'TOWNHOUSEFROM'],\n 21: 'ROOMSFROM',\n 22: ['COTTAGESFROM', 'COTTAGEFROM'],\n 23: ['CHALETSFROM', 'CHALETFROM'],\n 25: 'APARTMENTSFROM'\n};\n\nexport default function(typeId, isPrivate = false) {\n const entity = propertyTypeMap[typeId || '1'];\n\n if (!_.isArray(entity)) {\n return entity;\n }\n\n return isPrivate ? entity[1] : entity[0];\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","import {getData, postData} from './http';\n\ntype IRegionalContext = TR.IRegionalContext;\ntype IRegion = TR.IRegion;\ntype IPointOfSale = TR.IPointOfSale;\ntype ILanguage = TR.ILanguage;\ntype IRegionalContextResponse = TR.IRegionalContextResponse;\n\nconst tenantUrl = 'website/tenants';\nconst pointOfSaleUrl = 'website/pointofsale';\nconst domainUrl = '/api2/globalisation/domains';\nconst countryUrl = '/api2/globalisation/countries';\nconst cultureCode = TRPCONFIG.Domain.CultureCode || 'en';\nlet regionalContext: IRegionalContext;\n\nexport function getRegions(tenantId: number, domainId: number) : Promise {\n if (regionalContext) {\n domainId = domainId === 0\n ? TRPCONFIG.Domain.DomainId\n : regionalContext.ParentDomainId;\n }\n\n const getUrl = `${tenantUrl}/${tenantId}/domains/${domainId}/culture/${cultureCode}`;\n\n return getData(getUrl, { logErrors: false, cache: true });\n}\n\nexport interface ILegacyDomain{\n Id: number;\n}\n\nexport async function getAllDomains() {\n const data = await getData(domainUrl, { logErrors: false }) as ILegacyDomain[];\n const turnedOffDomains = TRPCONFIG.Domain2.ADv1BlockedDomains;\n return Promise.resolve(data.filter(d => turnedOffDomains.indexOf(d.Id) === -1));\n}\n\nexport function getStates(countryCode: string) {\n const getUrl = `${countryUrl}/${countryCode}/states`;\n return getData(getUrl, { logErrors: false });\n}\n\nexport function getCountries() {\n const getUrl = `${countryUrl}?cultureCode=${cultureCode}`;\n return getData(getUrl, { logErrors: false });\n}\n\nfunction regionContainingPos(regions: IRegion[], posId: number): IRegion {\n return regions[_.findIndex(regions, r =>\n null != _.find(r.PointsOfSale, p => p && p.Id === posId)\n )];\n}\n\nfunction findPosInRegion(region: IRegion, posId: number): IPointOfSale {\n return region.PointsOfSale[_.findIndex(region.PointsOfSale, p => p.Id === posId)];\n}\n\nfunction findLanguageInPos(pos: IPointOfSale, cultureCode: string): ILanguage | null {\n if (pos == null) {\n return null;\n }\n const lang = pos.Context.Languages[_.findIndex(pos.Context.Languages, l => l.Code === cultureCode)];\n return lang ? lang : pos.Context.Languages[0];\n}\n\nexport function getSelectedRegionalContext(): Promise {\n if (regionalContext != null) {\n return Promise.resolve(regionalContext);\n }\n\n const regContext = TRPCONFIG.SelectedRegionalContext;\n const tenantId = TRPCONFIG.Domain.TenantId;\n const domainId = regContext == null || regContext.ParentDomainId === 0\n ? TRPCONFIG.Domain.DomainId\n : regContext.ParentDomainId;\n\n return getRegions(tenantId, domainId).then(regions => {\n const region = regionContainingPos(regions, regContext.PointOfSaleId);\n const pos = findPosInRegion(region, regContext.PointOfSaleId);\n const lang = findLanguageInPos(pos, regContext.CultureCode);\n regionalContext = {\n PointOfSale: pos,\n Language: lang,\n Region: region,\n Inferred: false,\n ParentDomainId: regContext.ParentDomainId,\n TenantId: tenantId\n };\n return regionalContext;\n });\n}\n\nexport function setRegionalContext(request: TR.IRegionalContextRequest): Promise {\n return postData(`${pointOfSaleUrl}/setregionalcontext`, request).then(data => {\n if (data.Success) {\n if (data.Redirecturl) {\n window.location.href = window.location.protocol === 'https:'\n ? data.Redirecturl.replace('http://', 'https://')\n : data.Redirecturl;\n } else {\n window.location.reload();\n }\n }\n return data;\n });\n}\n","import { getData } from './http';\n\nconst url = '/api2/destination/maps/google';\n\nexport function getStaticMapUrl(mapUrl) {\n return getData(`${url}/signstaticmapurl?url=${encodeURIComponent(mapUrl)}`,\n { cache: true, logErrors: false });\n}\n","const map = [\n ['fname', 'HotelName'],\n ['fbt', 'BoardTypes'],\n ['fstr', 'Stars'],\n ['fpt', 'PropertyTypes'],\n ['ffac', 'FacilityCodes'],\n ['fcd', 'ChildDestinations'],\n ['pr', 'PriceRange'],\n ['rr', 'RatingRange'],\n ['gsl', 'GeneralSaleDealsOnly']\n];\n\nexport function format(filter) {\n const $injector = angular.element(document).injector();\n const $location = $injector.get('$location');\n const search = $location.search();\n\n map.forEach(function([queryStringName, filterName]) {\n let filterVal = filter[filterName];\n if (_.isObject(filterVal)) {\n filterVal = _.values(filterVal);\n }\n if (_.isArray(filterVal)) {\n filterVal = filterVal.join();\n }\n if (_.isBoolean(filterVal)) {\n if (filterVal) {\n search[queryStringName] = 1;\n } else {\n delete search[queryStringName];\n }\n } else if (filterVal && filterVal.length > 0) {\n search[queryStringName] = filterVal;\n } else {\n delete search[queryStringName];\n }\n });\n $location.search(search).replace();\n}\n\nexport function parse() {\n const $injector = angular.element(document).injector();\n let $location = null;\n let search = [];\n if ($injector !== undefined) {\n $location = $injector.get('$location');\n search = $location.search();\n }\n const filter = {};\n\n map.forEach(function([queryStringName, filterName]) {\n const searchVal = search[queryStringName];\n if (queryStringName === 'fname') {\n filter[filterName] = searchVal;\n } else if (queryStringName === 'gsl') {\n filter[filterName] = searchVal === '1';\n } else if (searchVal && searchVal.length > 0) {\n const input = searchVal.split(',');\n filter[filterName] = isRange(queryStringName) ? minMax(input) : input;\n }\n });\n\n return filter;\n}\n\nfunction isRange(queryStringName) {\n return _.indexOf(['rr', 'pr'], queryStringName) > -1;\n}\n\nfunction minMax(input) {\n input = _.map(input, x => x ? parseFloat(x) : null);\n return {\n Min: input[0],\n Max: input[1],\n };\n}\n","let limitedFilters;\n\nexport const config = {\n HotelsByStar: { sorter: sorter('name', 'desc'), limit: 10 },\n HotelsByPropertyType: { sorter: sorter('count', 'desc'), limit: 5 },\n HotelsByBoardType: { sorter: sorter('title', 'asc'), limit: 6 },\n HotelsByChildDestination: { sorter: sorter('count', 'desc'), limit: 5 }\n};\n\nfunction configFacilities(agg) {\n limitedFilters = ['HotelsByStar', 'HotelsByPropertyType', 'HotelsByBoardType', 'HotelsByChildDestination'];\n for (const group in agg.HotelsByFacility) {\n agg[group] = agg.HotelsByFacility[group];\n limitedFilters.push(group);\n config[group] = { sorter: sorter('title'), limit: 5 };\n }\n}\n\nexport function getFilterLimits() {\n const limits = {};\n limitedFilters.forEach(function(f) {\n limits[f] = config[f].limit;\n });\n return limits;\n}\n\nfunction sorter(prop, dir) {\n const multi = dir === 'desc' ? -1 : 1;\n return function compare(a, b) {\n return multi * (a[prop] < b[prop] ? -1 : (a[prop] > b[prop] ? 1 : 0));\n };\n}\n\nfunction arrayifyAggregates(dict) {\n for (let i = 0; i < limitedFilters.length; i++) {\n const prop = limitedFilters[i];\n if (dict[`${prop}Array`]) {\n continue;\n }\n const arr = [];\n for (const p in dict[prop]) {\n if (dict[prop].hasOwnProperty(p)) {\n arr.push({\n name: p,\n title: dict[prop][p].Title,\n count: dict[prop][p].Count != null ? dict[prop][p].Count : dict[prop][p],\n minPrice: dict[prop][p].MinPrice,\n cheapest: false\n });\n }\n }\n dict[`${prop}Array`] = arr.sort(config[prop].sorter);\n\n // flag the cheapest\n const filtered = _.filter(dict[`${prop}Array`], function(f) {\n return f.count > 0;\n });\n const min = _.minBy(filtered, function(x) {\n return x.minPrice;\n });\n if (_.isObject(min)) {\n min.cheapest = true;\n }\n }\n}\n\nexport function enhanceAggregates(aggregates) {\n configFacilities(aggregates);\n arrayifyAggregates(aggregates);\n return aggregates;\n}\n","export function home() {\n const $injector = angular.element(document).injector();\n const $rootScope = $injector.get('$rootScope');\n $injector.get('$location').path('/');\n if (!$rootScope.$$phase) {\n $rootScope.$apply();\n }\n}\n","// @ts-nocheck\nimport * as arrayUtil from './arrayUtils';\n\nexport function isCheckInOption(flightSectorOptionalExtras, option) {\n if (!flightSectorOptionalExtras || !flightSectorOptionalExtras.length) {\n return false;\n }\n let result = false;\n angular.forEach(flightSectorOptionalExtras, function(sector) {\n if (sector.CheckInOptions && sector.CheckInOptions.length) {\n const checkInOptions = sector.CheckInOptions[0].MultiOptionalExtras[0].Options;\n if (arrayUtil.any(checkInOptions, o => o.OptionId === option.OptionId)) {\n result = true;\n }\n }\n });\n return result;\n}\n\nexport function findOptionInDetails(sector, o) {\n let pos = null;\n angular.forEach(sector.NonCheckInOptions, function(oe, oei) {\n angular.forEach(oe.MultiOptionalExtras, function(mo, mi) {\n const i = arrayUtil.indexOf(mo.Options, function(opt) {\n return angular.equals(opt.Key, o);\n });\n pos = pos || (i >= 0 ? { groupIndex: oei, optionIndex: mi, key: mo.Options[i].Key } : null);\n });\n });\n return pos;\n}\n\nexport function isSingleOption(sector, o) {\n let s = false;\n angular.forEach(sector.OptionalExtras, function(oe) {\n s = s || (arrayUtil.indexOf(oe.SingleOptionalExtras, function(so) {\n return angular.equals(so.Key, o);\n }) >= 0);\n });\n return s;\n}\n\nexport function parseMultiOptions(sector, opts) {\n const selected = [];\n angular.forEach(sector.NonCheckInOptions, function() {\n selected.push([]);\n });\n angular.forEach(opts, function(o) {\n const pos = findOptionInDetails(sector, o);\n if (pos) {\n if (selected[pos.groupIndex] == null) {\n selected[pos.groupIndex] = [];\n }\n selected[pos.groupIndex][pos.optionIndex] = pos.key;\n }\n });\n return selected;\n}\n\nfunction parseSeatOptions(opts) {\n return arrayUtil.filter(opts, function(o) {\n return o.OptionId.indexOf('Seat::') === 0;\n });\n}\n\nexport function parseSingleOptions(sector, opts) {\n return arrayUtil.filter(opts, function(o) {\n return isSingleOption(sector, o);\n });\n}\n\nexport function baggageSelected(sector, selected) {\n let ok = true;\n\n angular.forEach(arrayUtil.filter(sector.OptionalExtras, function(oe) { return oe.Type === 0; }), function(oe) {\n //make sure that *all* single baggage options are selected\n angular.forEach(oe.SingleOptionalExtras, function(soe) {\n ok = ok && arrayUtil.any(selected, function(s) {\n return s.OptionId === soe.Key.OptionId;\n });\n });\n\n //make sure one of each multi baggage options are selected\n angular.forEach(oe.MultiOptionalExtras, function(moe) {\n let mok = false;\n angular.forEach(moe.Options, function(o) {\n mok = mok || arrayUtil.any(selected, function(s) {\n return s.OptionId === o.Key.OptionId;\n });\n });\n ok = ok && mok;\n });\n });\n\n return ok;\n}\n\nexport function parseSelectedOptions(sector, opts) {\n return {\n selectedMultiOptions: parseMultiOptions(sector, opts),\n selectedOptions: parseSingleOptions(sector, opts),\n selectedSeats: parseSeatOptions(opts)\n };\n}\n","let future;\nlet data;\n\nexport function init(paymentData, deposit, payFullAmount) {\n data = paymentData;\n data.totalDeposit = deposit;\n\n future = [];\n angular.forEach(paymentData.products, function(prod) {\n angular.forEach(prod.schedule, function(s) {\n future.push({\n schedule: s,\n prod\n });\n });\n });\n\n future.sort(function(p1, p2) {\n return p1.schedule.due - p2.schedule.due;\n });\n\n return change(payFullAmount);\n}\n\nexport function change(payingFullAmount) {\n angular.forEach(future, function(f) {\n if (payingFullAmount) {\n f.schedule.balance = 0;\n f.prod.currentDeposit = f.prod.cost;\n } else {\n f.schedule.balance = f.schedule.amount;\n f.prod.currentDeposit = f.prod.initialDeposit;\n }\n });\n\n data.totalBalances = 0;\n data.balanceSchedules = [];\n\n const balancesByDate = {};\n\n angular.forEach(data.products, function(prod) {\n prod.balance = 0;\n angular.forEach(prod.schedule, function(s) {\n prod.balance += s.balance;\n data.totalBalances += s.balance;\n if (s.balance) {\n if (balancesByDate[s.due] == null) {\n balancesByDate[s.due] = {\n balance: 0,\n due: s.due\n };\n }\n balancesByDate[s.due].balance += s.balance;\n }\n });\n });\n\n data.balanceSchedules = Object.keys(balancesByDate).map(k => balancesByDate[k]);\n\n return data;\n}\n","import { getData } from './http';\n\nlet key;\n\nconst FINDURL = 'https://api.addressy.com/Capture/Interactive/Find/v1.10/json3.ws';\nconst RETRIEVEURL = 'https://api.addressy.com/Capture/Interactive/Retrieve/v1.20/json3.ws';\n\nfunction request(url, obj) {\n const params = new URLSearchParams();\n for (const key in obj) {\n params.set(key, obj[key]);\n }\n return getData(`${url}?${params}`);\n}\n\nexport function find(term, countryCode, id) {\n return request(FINDURL, {\n Key: key,\n Countries: countryCode,\n Text: term,\n Container: id\n });\n}\n\nexport function retrieve(id) {\n return request(RETRIEVEURL, {\n Key: key,\n Id: id\n });\n}\n\nexport function setKey(newKey) {\n key = newKey;\n}\n","import { getData, postData } from './http';\n\n// It is important that this service matches mobile/localStorageProvider and desktop/localStorageProvider.\n// They all need similar interfaces and similar behavour:\n// When saving, they should merge the new values into the old ones, NOT splat them.\n// This is important so that preferences can behave consistantly, for SignedIn and SignedOut users.\nconst preferenceServiceUrl = '/api2/useraccounts/preferences';\n\n//string test functions\nfunction isBool(val) {\n return /^(true|false)$/.test(val);\n}\n\nfunction isNull(val) {\n return val === 'null';\n}\n\nfunction isInt(val) {\n return /^\\d+$/.test(val);\n}\n\nfunction isFloat(val) {\n return /^[0-9]*[.][0-9]+$/.test(val);\n}\n\nfunction isUndef(val) {\n return val === 'undefined';\n}\n//end string test functions\n\nfunction parseObjectValues(data) {\n for (const i in data) {\n let val = data[i];\n\n try {\n val = JSON.parse(val);\n } catch (e) {\n if (isBool(val)) {\n val = val === 'true';\n } else if (isNull(val)) {\n val = null;\n } else if (isUndef(val)) {\n val = undefined;\n } else if (isInt(val)) {\n val = parseInt(val);\n } else if (isFloat(val)) {\n val = parseFloat(val);\n }\n }\n\n data[i] = val;\n }\n\n return data;\n}\n\nexport function get(user, cb) {\n if (!user || !user.SignedIn || user.ImpersonatedSignedIn) {\n cb();\n return;\n }\n\n getData(`${preferenceServiceUrl}/get`, { logErrors: false })\n .then(function(data) {\n if (Object.keys(data).length) {\n cb(parseObjectValues(data));\n } else {\n cb();\n }\n })\n .catch(() => cb());\n}\n\nexport function set(user, cb, prefs) {\n if (!user || !user.SignedIn) {\n cb();\n return;\n }\n\n const preferences = {};\n\n angular.forEach(prefs, function(val, key) {\n if (typeof val !== 'undefined' && val !== '[object Object]') {\n if (typeof val === 'string') {\n preferences[key] = val;\n } else {\n const json = angular.toJson(val);\n if (json.length < 2000) {\n preferences[key] = json;\n }\n }\n }\n });\n\n const url = `${preferenceServiceUrl}/set`;\n const httpBody = { Preferences: preferences };\n\n postData(url, httpBody, { logErrors: false })\n .then(() => cb())\n .catch(() => cb());\n}\n\nexport function remove(user, cb, key) {\n if (!user || !user.SignedIn) {\n cb();\n return;\n }\n\n const url = `${preferenceServiceUrl}/remove`;\n const httpBody = { PreferenceName: key };\n\n postData(url, httpBody, { logErrors: false })\n .then(() => cb())\n .catch(() => cb());\n}\n","import { postData } from './http';\n\nlet promise;\n\nexport function getStats(statsRequest) {\n if (promise) {\n return promise;\n }\n\n statsRequest.CultureCode = TRPCONFIG.Domain.CultureCode;\n statsRequest.TenantId = TRPCONFIG.Domain.TenantId;\n promise = postData('/api2/publicity/getstats', statsRequest, { logErrors: false });\n return promise;\n}\n","import * as resourceService from './resource';\n\nexport function getMenu() {\n const hotelItem = {\n Text: resourceService.get('MENUHOTELS'),\n Url: '/hotels',\n PrimaryItem: true\n };\n const transferItem = {\n Text: resourceService.get('MENUTRANSFERS'),\n Url: 'transfers',\n PrimaryItem: true\n };\n const marhabaItem = {\n Text: resourceService.get('MENUMARHABA'),\n Url: '/marhaba',\n PrimaryItem: true\n };\n const holidayItem = {\n Text: resourceService.get('MENUHOLIDAYS'),\n Url: '/holidays',\n PrimaryItem: true\n };\n const flightItem = {\n Text: resourceService.get('MENUFLIGHTS'),\n Url: '/flights',\n PrimaryItem: true\n };\n const dealItem = {\n Text: resourceService.get('MENUDEALS'),\n Url: 'deals',\n PrimaryItem: true\n };\n const insuranceItem = {\n Text: resourceService.get('MENUINSURANCE'),\n Url: '/insurance',\n PrimaryItem: true\n };\n const cruiseItemForNewWindow = {\n Text: resourceService.get('MENUCRUISE'),\n Url: TRPCONFIG.Domain.CruiseRootUrl,\n PrimaryItem: true,\n NewWindow: true\n };\n const carhireItem = {\n Text: resourceService.get('MENUCARHIRE'),\n Url: 'http://www.hertz-gsa.ae/',\n PrimaryItem: true\n };\n const dailysalesreportItem = {\n Text: resourceService.get('DAILYSALESREPORT'),\n Url: '/Reports/conDailySalesReport.aspx',\n PrimaryItem: true\n };\n const faqItem = {\n Text: resourceService.get('MENUFAQ'),\n Url: '/faq/faqhome.aspx',\n PrimaryItem: true\n };\n const contactusItem = {\n Text: resourceService.get('MENUCONTACTUS'),\n Url: '/help/contact-us.aspx',\n PrimaryItem: true\n };\n\n const menus = {\n 1: {\n Items: [\n hotelItem,\n holidayItem,\n flightItem,\n dealItem,\n {\n Text: resourceService.get('MENUALLINCLUSIVE'),\n Url: '/all-inclusive',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUTRANSFERS'),\n Url: 'transfers',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUCARHIRE'),\n Url: '/car-hire',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUPARKING'),\n Url: 'parking',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUATTRACTIONS'),\n Url: '/attractions',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUCRUISE'),\n Url: 'https://cruise.travelrepublic.co.uk/',\n PrimaryItem: false\n }\n ]\n },\n 2: {\n Items: [\n hotelItem,\n holidayItem,\n flightItem,\n dealItem,\n {\n Text: resourceService.get('MENUALLINCLUSIVE'),\n Url: '/all-inclusive',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUTRANSFERS'),\n Url: 'transfers',\n PrimaryItem: false\n },\n {\n Text: resourceService.get('MENUATTRACTIONS'),\n Url: '/attractions',\n PrimaryItem: false\n }\n ]\n },\n 11: {\n Items: [\n {\n Text: resourceService.get('MENUABOUTUS'),\n Url: '/help/acerca-de-travel-republic.aspx',\n PrimaryItem: true\n },\n {\n Text: resourceService.get('MENUPRICEPROMISE'),\n Url: '/help/pricepromise.aspx',\n PrimaryItem: true\n },\n {\n Text: resourceService.get('MENUCUSTOMERINFORMATION'),\n Url: '/importantinfo.aspx',\n PrimaryItem: true\n }\n ]\n },\n 16: {\n Items: [\n {\n Text: resourceService.get('MENUABOUTUS'),\n Url: '/help/chi-siamo.aspx',\n PrimaryItem: true\n },\n {\n Text: resourceService.get('MENUPRICEPROMISE'),\n Url: '/help/pricepromise.aspx',\n PrimaryItem: true\n },\n {\n Text: resourceService.get('MENUCUSTOMERINFORMATION'),\n Url: '/importantinfo.aspx',\n PrimaryItem: true\n }\n ]\n },\n 34: {\n Items: [\n hotelItem,\n flightItem,\n holidayItem,\n transferItem,\n cruiseItemForNewWindow,\n insuranceItem,\n marhabaItem\n ]\n },\n 35: {\n Items: [\n hotelItem,\n flightItem,\n holidayItem,\n transferItem,\n marhabaItem\n ]\n },\n 36: {\n Items: [\n hotelItem,\n transferItem,\n marhabaItem,\n flightItem,\n holidayItem\n ]\n },\n 37: {\n Items: [\n hotelItem,\n transferItem,\n marhabaItem,\n flightItem,\n holidayItem\n ]\n },\n 66: {\n Items: [\n hotelItem,\n transferItem,\n marhabaItem,\n flightItem,\n holidayItem\n ]\n },\n 55: {\n Items: [\n hotelItem,\n flightItem,\n holidayItem,\n transferItem,\n insuranceItem,\n marhabaItem\n ]\n }\n\n };\n\n //handling dnata-domains\n [31, 32, 33, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 106].forEach(function(domain) {\n menus[domain] = {\n Items: TRPCONFIG.Domain.isAgentMode ? [\n dailysalesreportItem,\n contactusItem,\n faqItem\n ] : []\n };\n });\n\n [62, 63, 64, 65].forEach(function(domain) {\n menus[domain] = {\n Items: TRPCONFIG.Domain.isAgentMode ? [\n dailysalesreportItem,\n contactusItem,\n faqItem,\n carhireItem\n ] : []\n };\n });\n\n [30, 38, 39, 40, 41].forEach(function(domain) {\n menus[domain] = {\n Items: TRPCONFIG.Domain.isAgentMode ? [\n dailysalesreportItem,\n contactusItem,\n faqItem,\n insuranceItem,\n carhireItem\n ] : []\n };\n });\n\n // mock http call with promise\n return Promise.resolve(menus[TRPCONFIG.Domain.DomainId]);\n}\n","export const conversionCase = [\n 'booking\\/complete'\n];\n\nexport const categoryCases = [\n 'holidays$', 'offers$', 'hotels$', 'flights$', 'destinations$'\n];\n\nexport const idBasedPageV2 = ['^(\\\\d+-\\\\d+(?:-\\\\d+)?)$'];\nexport const idBasedPageV3 = ['^(\\\\d+-\\\\d+-\\\\d+-\\\\d+)$'];\n\nexport const holidayDeals = [\n '(offers\\/early-summer-holidays)$',\n '(offers\\/winter-sun)$',\n];\n\nexport const listingCases = [\n // 'holidays'\n 'holidays\\/flights\\/(?:(.{8}-.{4}-.{4}-.{4}-.{12}))$',\n 'holidays\\/hotels\\/(?:(.{8}-.{4}-.{4}-.{4}-.{12}))$',\n '(\\\\d+-\\\\d+-\\\\d+-\\\\d+)\\/([a-zA-Z-_]+)(?:(\\\\?[a-zA-Z-_]+)?)$', // same for hotels & holidays\n // 'hotels'\n 'hotels\\/(?:(.{8}-.{4}-.{4}-.{4}-.{12}))$',\n // flights\n 'flights\\/(?:(.{8}-.{4}-.{4}-.{4}-.{12}))$'\n];\n\nexport const offerCases = [\n // holidays\n '(\\\\d+-\\\\d+(?:-\\\\d+)?\\/)([a-zA-Z-_]+)(?:(\\\\?[a-zA-Z-_]+)?)$',\n 'holidays\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))\\/(\\\\d+)\\?(.+)$',\n // hotels\n 'hotels\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))\\/(\\\\d+)\\?(.+)$',\n // flights\n 'holidays\\/options\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))$'\n];\n\nexport const cartCases = [\n // holidays\n 'holidays\\/options\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))\\?(.+)$',\n // hotels\n 'hotels\\/book\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))\\?(.+)$',\n // flights\n 'holidays\\/book\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))$',\n];\n\nexport const bookingCases = [\n 'holidays\\/book\\/(.{8}-.{4}-.{4}-((?:.{4}-)?)(.{12}|.{16}))\\?(.+)$'\n];\n","import { products, isProductSupported } from './supportedProducts';\n\nexport const searchType = {\n Flight: 1,\n Hotels: 2,\n Holidays: 3,\n Transfers: 4,\n CarHire: 5,\n Parking: 6,\n Insurance: 8\n};\n\nexport function supportedTypes() {\n return isProductSupported(products.holidays) ? [searchType.Flight, searchType.Holidays, searchType.Hotels, searchType.Transfers, searchType.Parking, searchType.Insurance] : [searchType.Hotels];\n}\n","const win = $(window);\nconst defaults = {\n offset: 20,\n animate: false,\n container: 'html, body',\n duration: 1000\n};\nlet targetSelector;\n\nexport function setScrollTarget(selector) {\n targetSelector = selector;\n}\n\nexport function getScrollTarget() {\n const s = targetSelector;\n targetSelector = null;\n return s;\n}\n\nfunction getTargetTop(selector, target, options) {\n if (selector === 'top') {\n return 0;\n }\n if (options.offset != null) {\n return target.offset().top - options.offset;\n }\n return target.offset().top;\n}\n\nexport function scrollTo(selector, options) {\n const map = (v, k) => (options && options[k] != null) ? options[k] : v;\n options = _.mapValues(defaults, map);\n const target = $(selector);\n\n if (selector !== 'top' && target.length === 0) {\n return Promise.resolve();\n }\n\n const top = getTargetTop(selector, target, options);\n const container = $(options.container);\n\n return new Promise(function(resolve) {\n if (!options.animate) {\n setTimeout(function() {\n container.scrollTop(top);\n resolve();\n }, 50);\n return;\n }\n\n if (options.duration === defaults.duration) {\n const diff = Math.round(top - container.scrollTop());\n options.duration = Math.abs(Math.round(diff * 0.3));\n }\n if (options.duration > 1000) {\n options.duration = 1000; // cap at 1 second\n }\n container\n .stop()\n .animate({ scrollTop: top }, {\n easing: 'swing',\n duration: options.duration,\n complete() {\n const targetTop = getTargetTop(selector, target, options);\n // Check final position\n // Scrolling may cause images with unspecified dimensions to load, pushing target down\n if (top !== targetTop) {\n container.stop().animate({ scrollTop: targetTop }, {\n duration: 100,\n complete: resolve\n });\n } else {\n resolve();\n }\n }\n });\n });\n}\n\nexport function getScrollOffsets(window) {\n // Use the specified window or the current window if no argument\n const w = window || win;\n\n // This works for all browsers except IE versions 8 and before\n if (w.pageXOffset != null) {\n return {\n x: w.pageXOffset,\n y: w.pageYOffset\n };\n }\n\n // For IE (or any browser) in Standards mode\n const d = w.document;\n if (document.compatMode === 'CSS1Compat') {\n return {\n x: d.documentElement.scrollLeft,\n y: d.documentElement.scrollTop\n };\n }\n\n // For browsers in Quirks mode\n return {\n x: d.body.scrollLeft,\n y: d.body.scrollTop\n };\n}\n","export default function(whereTo) {\n $('html, body').animate({\n scrollTop: $(whereTo).offset().top - 70\n }, 200);\n}\n","const fns: any[] = [];\n\nexport function register(fn) {\n fns.push(fn);\n\n return function() {\n _.pull(fns, fn);\n };\n}\n\nexport function execute(expiry) {\n return Promise.all(fns.map(f => f(expiry)));\n}\n","import * as broker from './broker';\nimport * as arrayUtil from './arrayUtils';\nimport { postData } from './http';\n\nconst url = '/api2/urgencymessaging/';\nconst cache = {};\nlet promise;\n\nif (TRPCONFIG.Domain.UrgencyMessaging) {\n broker.subscribe('urgencyMessaging', 'hotelsReturnedFromSearch', function(e) {\n promise = _get(arrayUtil.map(arrayUtil.filter(e.data, function(hotel) {\n return cache[hotel.Id] == null;\n }), hotel => hotel.Id));\n });\n}\n\nfunction _get(estabIds) {\n if (!_.get(estabIds, '[0]')) {\n return Promise.resolve();\n }\n\n const fields = 'EstabId,CurrentViewsText,LastBookedDateText,ShortlistCountText';\n const req = {\n EstabIds: estabIds,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId\n };\n\n return postData(`${url}getestabstats?fields=${fields}`, req, { logErrors: false })\n .then(function(data) {\n angular.forEach(data, function(d) {\n cache[d.EstabId] = d;\n });\n });\n}\n\nexport function get(estabId) {\n if (promise == null) {\n return _get([estabId]).then(function() {\n return cache[estabId];\n });\n }\n return promise.then(function() {\n return cache[estabId];\n });\n}\n\nexport function getUrl() {\n return url;\n}\n","import { getDeferred } from './resource';\n\nconst defaultMsg = getDeferred('ISNOTVALID');\nconst msgs = {\n lettersOnly: getDeferred('LETTERSONLY'),\n numbersOnly: getDeferred('NUMBERSONLY'),\n notDefault: getDeferred('PLEASEENTERREQUIRED'),\n required: getDeferred('PLEASEENTERREQUIRED'),\n requiredIf: getDeferred('PLEASEENTERREQUIRED'),\n notDefaultIf: getDeferred('PLEASEENTERREQUIRED'),\n requiredGuest: getDeferred('PLEASEENTERREQUIRED'),\n email: getDeferred('MUSTBEEMAIL'),\n flightNumber: getDeferred('MUSTBEFLIGHTNUMBER'),\n ageCheck: getDeferred('MUSTMATCHDATEOFBIRTH'),\n oneMainDriver: getDeferred('MUSTHAVEONEDRIVER'),\n numberOfAdditionalDrivers: getDeferred('NUMBEROFADDITIONALDRIVERSMUSTEQUAL'),\n mustPassCreditCheck: getDeferred('MUSTPASSCREDITCHECK'),\n emailAllowed: getDeferred('MUSTBEVALIDEMAILFORDOMAIN')\n};\n\nexport function translateField(field, e, map) {\n return translateFieldLabel(field.label, e, map);\n}\n\nexport function translateFieldLabel(label, e, map) {\n let msg = defaultMsg();\n\n if (map && map[e]) {\n msg = map[e];\n } else if (msgs[e]) {\n msg = msgs[e]();\n }\n\n if (msg.indexOf('{0}') !== -1) {\n msg = String.format(msg, label || '');\n } else {\n msg = (label ? `${label} ` : '') + msg;\n }\n\n return msg;\n}\n","import { getRootPath } from './rootPath';\n\nexport const location = {\n href(url) {\n const $window = angular.element(document).injector().get('$window');\n $window.location.href = getRootPath() + url;\n }\n};\n\nexport function open(url) {\n const $window = angular.element(document).injector().get('$window');\n return $window.open(getRootPath() + url, '_blank');\n}\n","import { postData } from './http';\nimport { getOrigin, parseFullUrl } from './urlUtils';\n\nconst HOTELS_SEARCH_API_URL = '/api/search/ext/getdeeplink';\n\nexport default class DeepLinkService implements DeepLink.IDeepLinkService {\n public getSearchDeepLink(reqParams: DeepLink.ISearchHotelsGetDeepLinkParams): Promise {\n const url = `${getOrigin()}${HOTELS_SEARCH_API_URL}`;\n return postData (url, reqParams)\n .then((resData) => {\n return resData.DeepLink;\n });\n }\n\n public parseFullUrl(url: string) {\n return parseFullUrl(url);\n }\n}\n\nangular\n .module('deepLink')\n .service('deepLinkService', DeepLinkService);\n","import { postData } from '../../../services/http';\nimport { toDict } from '../../../services/arrayUtils';\n\n/**\n * An Interface which describes the teaser price api response data.\n */\nexport interface IApiProductsResponseItem {\n ErrorMessage: string;\n Request: {\n Id: string,\n DomainId: number,\n Currency: string,\n Tags: any\n };\n Prices: {\n Price: number,\n Currency: string,\n Type: string\n }[];\n}\nexport type ProductsDict = { [key: string]: IApiProductsResponseItem };\n\nconst url = '/api2/attractions/bookingfunnel/getteaserprices';\n\nexport function getTeaserPrices(productType: string, productIds: any) {\n /// TODO add other product endpoints, for now only attractions are available\n if ('attraction' === productType) {\n return postData(url, productIds, { logErrors: false })\n .then(transformTeaserPriceResponse);\n }\n}\n\n/**\n * Transform the response objects in a form which will be easier to handle on the frontend. Response array is\n * transformed into a dictionary, where each key is a product id, data on each key is product data. Prices array\n * for each item is ordered in a specific way, depending on the product type.\n */\nfunction transformTeaserPriceResponse(data?: IApiProductsResponseItem[]): ProductsDict | void {\n if (!data) {\n return;\n }\n\n const pricesOrder = ['adult', 'child'];\n const items = data.filter(item => !!(item.Request && item.Request.Id));\n\n function keyFn(item: IApiProductsResponseItem) {\n const tags = item.Request.Tags || {};\n let tagKey = '';\n for (const i in tags) {\n if (tags.hasOwnProperty(i)) {\n tagKey += `:${i}:${tags[i]}`;\n }\n }\n return `${item.Request.Id}${tagKey}`;\n }\n\n function valFn(item:IApiProductsResponseItem) {\n item.Prices.sort(function(a, b) {\n const indexA = pricesOrder.indexOf(a.Type.toLocaleLowerCase());\n const indexB = pricesOrder.indexOf(b.Type.toLocaleLowerCase());\n if (indexA < indexB || (-1 === indexB && -1 !== indexA)) {\n return -1;\n }\n if (indexB < indexA || (-1 === indexA && -1 !== indexB)) {\n return 1;\n }\n return 0;\n });\n return item;\n }\n\n return toDict(items, keyFn, valFn);\n}\n","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\nimport generateRange from './filters/generateRange';\nimport occupancyFilter from './filters/occupancy';\nimport replaceLineBreaks from './filters/replaceLineBreaks';\nimport resourceFilter from './filters/resourceFilter';\nimport * as adHoc from './services/adHoc';\nimport * as arrayUtils from './services/arrayUtils';\nimport * as basketCrossSell from './services/basketCrossSell';\nimport * as broker from './services/broker';\nimport * as cookieService from './services/cookie';\nimport * as currentUser from './services/currentUser';\nimport decimalAdjust from './services/decimalAdjust';\nimport * as enumService from './services/enum';\nimport * as fieldFilterParser from './services/fieldFilterParser';\nimport * as fieldGroup from './services/fieldGroup';\nimport * as flightDetail from './services/flightDetail';\nimport * as flightsTerminal from './services/flightsTerminal';\nimport * as guid from './services/guid';\nimport * as imageService from './services/image';\nimport * as language from './services/language';\nimport * as loader from './services/loader';\nimport * as logging from './services/logging';\nimport * as modal from './services/modal';\nimport * as occupancy from './services/occupancy';\nimport * as paging from './services/paging';\nimport * as paymentsUtil from './services/paymentsUtil';\nimport * as resource from './services/resource';\nimport * as rootPath from './services/rootPath';\nimport * as supportedProducts from './services/supportedProducts';\nimport * as urlUtils from './services/urlUtils';\n\nimport frontPad from './filters/frontPad';\nimport hoursAndMinutes from './filters/hoursAndMinutes';\nimport replace from './filters/replace';\nimport toText from './filters/toText';\nimport * as abTest from './services/abTest';\nimport * as agentModeService from './services/agentMode';\nimport * as animationUtils from './services/animationUtils';\nimport * as componentUtils from './services/componentUtils';\nimport * as bookingStatus from './services/bookingStatus';\nimport * as cmsService from './services/cms';\nimport * as currency from './services/currency';\nimport * as destinationAirport from './services/destinationAirport';\nimport * as discountsService from './services/discounts';\nimport * as extraProductsService from './services/extraProducts';\nimport filterUtil from './services/filterUtil';\nimport * as flightSeatPlanService from './services/flightSeatPlan';\nimport * as flightStaticService from './services/flightStatic';\nimport getPropertyTypeFromResKey from './services/getPropertyTypeResKey';\nimport * as globalisationService from './services/globalisation';\nimport * as googleStaticMap from './services/googleStaticMap';\nimport * as hotelFilterQueryStringParser from './services/hotelFilterQueryStringParser';\nimport * as hotelsFilter from './services/hotelsFilter';\nimport * as location from './services/location';\nimport * as objectTypeService from './services/objectType';\nimport * as optionsUtil from './services/optionsUtils';\nimport * as paymentsCalculator from './services/paymentsCalculator';\nimport * as postcodeService from './services/postcode';\nimport * as preferencesHttpProvider from './services/preferencesHttpProvider';\nimport * as primaryNavigationService from './services/primaryNavigation';\nimport * as publicityService from './services/publicityMessaging';\nimport * as regExpRoutes from './services/regExpRoutes';\nimport * as searchTypesService from './services/searchTypes.js';\nimport * as scrollService from './services/scroller';\nimport scrollTo from './services/scrollTo';\nimport * as tokeniser from './services/tokeniser';\nimport * as urgencyMessaging from './services/urgencyMessaging';\nimport * as validationService from './services/validation';\nimport * as windowUtil from './services/windowUtil';\nimport './services/deepLinkService';\n\nimport * as productService from './components/products/services/products';\n\nangular\n .module('core')\n .filter('generateRange', () => generateRange)\n .filter('occupancy', () => occupancyFilter)\n .filter('replaceLineBreaks', () => replaceLineBreaks)\n .filter('resource', () => resourceFilter)\n .filter('unformattedString', () => String.format)\n .service('adHocService', (): Core.AdHoc.AdHocService => adHoc)\n .factory('arrayUtil', (): Core.ArrayUtil => arrayUtils)\n .service('basketCrossSellService', (): Core.BasketCrossSellService => basketCrossSell)\n .factory('broker', (): Core.Broker => broker)\n .factory('cookieService', () => cookieService)\n .factory('currentUser', () => currentUser)\n .factory('decimalAdjust', () => decimalAdjust)\n .service('enumService', () => enumService)\n .factory('fieldFilterParser', () => fieldFilterParser)\n .service('fieldGroupService', (): Core.FieldGroupService => fieldGroup)\n .service('flightDetail', (): Core.Flights.IFlightDetailService => flightDetail)\n .service('flightsTerminalService', (): Core.FlightsTerminalService => flightsTerminal)\n .service('guidService', (): Core.GuidService => guid)\n .factory('imageService', () => imageService)\n .service('languageService', (): Core.LanguageService => language)\n .factory('loaderService', () => loader)\n .service('loggingService', (): Core.ILoggingService => logging)\n .factory('modalService', () => modal)\n .service('occupancyService', (): Core.OccupancyService => occupancy)\n .service('pagingService', (): Core.PagingService => paging)\n .service('paymentsUtilService', (): Core.PaymentsUtilService => paymentsUtil)\n .service('resourceService', (): Core.ResourceService => resource)\n .service('rootPath', (): Core.RootPath => rootPath)\n .service('supportedProducts', () => supportedProducts)\n .factory('urlUtils', () => urlUtils);\n\nangular\n .module('TR')\n .filter('frontPad', () => frontPad)\n .filter('hoursAndMinutes', () => hoursAndMinutes)\n .filter('replace', () => replace)\n .filter('toText', () => toText)\n .service('abTest', () => abTest)\n .factory('agentModeService', () => agentModeService)\n .service('animationUtil', (): TR.AnimationUtil => animationUtils)\n .service('componentUtil', (): TR.ComponentUtil => componentUtils)\n .service('bookingStatus', () => bookingStatus)\n .service('cmsService', () => cmsService)\n .service('currencyService', () => currency)\n .service('destinationAirport', () => destinationAirport)\n .service('discountsService', (): TR.DiscountsService => discountsService)\n .service('extraProductsService', () => extraProductsService)\n .service('FilterUtils', () => filterUtil)\n .service('flightSeatPlanService', () => flightSeatPlanService)\n .service('flightStaticService', (): TR.FlightStaticService => flightStaticService)\n .factory('getPropertyTypeFromResKey', () => getPropertyTypeFromResKey)\n .service('globalisationService', (): TR.IGlobalisationService => globalisationService)\n .service('googleStaticMap', () => googleStaticMap)\n .service('hotelFilterQueryStringParser', () => hotelFilterQueryStringParser)\n .service('hotelsFilter', () => hotelsFilter)\n .service('locationService', (): TR.LocationService => location)\n .service('objectTypeService', () => objectTypeService)\n .service('optionsUtil', () => optionsUtil)\n .service('paymentsCalculator', () => paymentsCalculator)\n .service('postcodeService', () => postcodeService)\n .service('preferencesHttpProvider', () => preferencesHttpProvider)\n .service('primaryNavigationService', () => primaryNavigationService)\n .service('publicityService', () => publicityService)\n .service('regExpRoutes', () => regExpRoutes)\n .service('scrollService', () => scrollService)\n .factory('scrollTo', () => scrollTo)\n .service('searchTypesService', () => searchTypesService)\n .service('tokeniser', (): TR.TokeniserService => tokeniser)\n .service('urgencyMessaging', () => urgencyMessaging)\n .service('validationService', () => validationService)\n .service('windowUtil', () => windowUtil)\n .service('productService', () => productService);\n\n","import * as modalService from '../modal';\nimport * as locationService from '../location';\n\nexport function authRedirect(url: string, popupUrl: any = null, params = {}): void {\n const $injector = angular.element(document).injector();\n const $rootScope = $injector.get('$rootScope');\n popupUrl = popupUrl || 'partials/auth/SignInPopUp';\n locationService.home();\n setTimeout(() => {\n const tab = url === 'bookingsignin' ? 'signin' : url;\n modalService.launch(popupUrl, {\n tab,\n cb: null,\n ...params\n });\n if (!$rootScope.$$phase) {\n $rootScope.$apply();\n }\n });\n}\n","// @ts-nocheck\nimport * as broker from './broker';\n\nexport default function(go) {\n function Label(options, key) {\n this.setValues(options);\n\n // Label text container\n const span = this.span_ = document.createElement('span');\n span.className = getClusterClass(this.text);\n\n // Label box\n const div = this.div_ = document.createElement('div');\n div.appendChild(span);\n div.className = `countinfo_${key}`;\n div.style.cssText = 'position: absolute; display: none;';\n\n this.key = key;\n }\n\n Label.prototype = new go.maps.OverlayView();\n\n Label.prototype.onAdd = function() {\n const pane = this.getPanes().overlayMouseTarget;\n\n broker.subscribe(\n `mapLabel_${this.key}`,\n 'CHANGEDLABELVISIBILITY',\n () => { this.draw(); }\n );\n\n pane.appendChild(this.div_);\n };\n\n Label.prototype.draw = function() {\n const projection = this.getProjection();\n const position = projection.fromLatLngToDivPixel(this.get('position'));\n\n const div = this.div_;\n div.style.left = `${position.x}px`;\n div.style.top = `${position.y}px`;\n div.style.zIndex = -50;\n\n const visible = this.get('visible');\n div.style.display = visible ? 'block' : 'none';\n\n this.span_.innerHTML = this.get('text').toString();\n\n const clickHandler = this.clickHandler;\n google.maps.event.addDomListener(div, 'click', clickHandler);\n };\n\n return Label;\n}\n\nfunction getClusterClass(num) {\n switch (true) {\n case num >= 10000:\n return 'clustersize5';\n case num >= 1000:\n return 'clustersize4';\n case num >= 100:\n return 'clustersize3';\n case num >= 10:\n return 'clustersize2';\n case num >= 2:\n return 'clustersize1';\n default:\n return 'hotel-map-pin-static';\n }\n}\n","import { getData } from './http';\n\nexport function getMarkers(params) {\n return getData(`/api/hotels/maps/getmarkers${params}`, { cache: true });\n}\n","import {launch} from '../modal';\n\nexport function launchOption(path: string, options: Object): void {\n launch('partials/auth/SignInPopUp', _.extend({ tab: path, cb: null }, options));\n}\n\nexport function launchNotification(a: any): void {\n launch('partials/Dashboard/NotificationsPopup', { alerts: a });\n}\n","/// \n\nimport * as authRedirection from './services/desktop/authRedirection';\nimport mapLabel from './services/mapLabel';\n\nimport * as hotelStaticMapService from './services/hotelStaticMap';\nimport * as accountMenuService from './services/desktop/accountMenu';\nimport * as localStorageProvider from './services/desktop/localStorageProvider';\n\nangular\n .module('core')\n .service('authRedirection', (): Core.AuthRedirection => authRedirection)\n .factory('mapLabel', () => mapLabel);\n\nangular\n .module('TR')\n .constant('popupAuth', true)\n .service('hotelStaticMapService', () => hotelStaticMapService)\n .service('accountMenuService', () => accountMenuService)\n .service('localStorageProvider', () => localStorageProvider);\n","import {ProductsDict, getTeaserPrices} from '../services/products';\n\n/**\n * Class used as a controller for products grid showcase directive.\n */\nexport default class ProductsShowcase {\n productType: string;\n products: any[];\n apiPromise: Promise | void;\n\n constructor(\n $scope,\n private $location,\n private broker: Core.Broker,\n ) {\n if (Array.isArray(this.products) && this.products.length > 0) {\n this.products.forEach(item => {\n item.DomainId = TRPCONFIG.Domain.DomainId;\n item.Currency = TRPCONFIG.Domain.CurrencyCode;\n });\n this.apiPromise = getTeaserPrices(this.productType, this.products);\n if (this.apiPromise != null) {\n this.apiPromise.then(res => {\n $scope.$apply();\n return res;\n });\n }\n }\n\n if (this.productType === 'attraction') {\n this.publishAttractionsNewPerson();\n }\n }\n\n publishAttractionsNewPerson() {\n const area: string = 'attractions';\n const currentPath: string = this.$location.path().substring(1);\n const title: string[] = currentPath.split('/');\n\n title.push((currentPath === area && 'homepage') || 'Destination');\n }\n\n getTeaserPrices() {\n return this.apiPromise;\n }\n}\n\nangular\n .module('TR')\n .directive('productsGridShowcase', (): ng.IDirective => ({\n restrict: 'E',\n replace: true,\n scope: {},\n bindToController: {\n productType: '@',\n products: '='\n },\n controller: ['$scope', '$location', 'broker', ProductsShowcase],\n controllerAs: 'ProductsShowcase'\n }));\n\n","import ProductsShowcase from './productsGridShowcase';\nimport { getSymbol } from '../../../services/currency';\n\n/**\n * Class used as a controller for individual grid showcase items.\n */\nexport default class ProductsItem {\n productId: string;\n pricingOptions: any;\n fromTextOne: string;\n fromTextTwo: string;\n prices: {}[];\n showItem: boolean = false;\n parentCtrl: ProductsShowcase;\n modal: boolean = false;\n\n constructor() {\n /// Default values if prices are not available.\n this.prices = [\n { text: this.fromTextOne, amount: -1 },\n { text: this.fromTextTwo, amount: -1 }\n ];\n }\n\n /**\n * Method used to attach a handler to a promise in the parent controller. This promise is resolved once the api\n * response is received.\n */\n onItemInitialized() {\n const teaserPricesPromise = this.parentCtrl.getTeaserPrices();\n\n if (!teaserPricesPromise || !this.productId) {\n return;\n }\n\n let tagKey = '';\n if (this.pricingOptions) {\n for (const i in this.pricingOptions) {\n if (this.pricingOptions.hasOwnProperty(i)) {\n tagKey += `:${i}:${this.pricingOptions[i]}`;\n }\n }\n }\n const priceIndex = `${this.productId}${tagKey}`;\n teaserPricesPromise.then(data => {\n if (!data) {\n return;\n }\n const item = data[priceIndex];\n if (item && item.Prices.length) {\n this.prices = item.Prices.map(price => ({\n text: price.Type,\n currency: getSymbol(price.Currency),\n amount: price.Price\n }));\n }\n });\n };\n}\n\nangular\n .module('TR')\n .directive('productsGridItem', (): ng.IDirective => ({\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {},\n bindToController: {\n productId: '@',\n pricingOptions: '=',\n fromTextOne: '@',\n fromTextTwo: '@'\n },\n controller: ProductsItem,\n controllerAs: 'pi',\n require: '^productsGridShowcase',\n link(scope, el, attr, ctrl:ProductsShowcase, transclude) {\n transclude(scope, (clone:any) => {\n el.append(clone);\n });\n scope.pi.parentCtrl = ctrl;\n scope.pi.onItemInitialized();\n }\n }));\n","/*\nThis is a facade of the jQueryUI slider plugin. It's goals are:\n 1. Encapsulate all rtl rendering logic.\n 2. Consistently return Min and Max values, rather than sometimes returning a values array or sometimes single value.\n 3. Validate Min and Max values.\n*/\n\n(function () {\n const rtl = (values: number[]) => TRPCONFIG.Rtl ? _.chain(values).reverse().map(x => -x).value() : values;\n const withMinMax = func => ['Min', 'Max'].forEach(func);\n\n jQuery.fn.rtlSlider = function(setup) {\n const $elem = $(this);\n const oldSlide = setup.slide;\n withMinMax(prop => setup[prop] = setup[prop.toLowerCase()]);\n setup.slide = function(event, ui) {\n ui.model = toModel(setup.dual ? ui.values : ui.value);\n oldSlide.apply(setup, arguments);\n };\n // range can be either true/min/max.\n setup.range = setup.range === undefined ? setup.dual : setup.range;\n if (TRPCONFIG.Rtl) {\n setup.range = { min: 'max', max: 'min' }[setup.range] || setup.range;\n }\n $elem.slider(setup);\n setSliderPosition();\n return setSliderPosition;\n\n function validateModel(model) {\n model = angular.copy(model || {});\n withMinMax(prop => {\n let value = model[prop];\n let isValid = angular.isNumber(value) && value >= setup.min && value <= setup.max;\n model[prop] = isValid ? value : setup[prop];\n });\n return model;\n }\n function toModel(values) {\n if (!angular.isArray(values)) {\n values = [values, values];\n }\n values = rtl(values);\n let model = { Min: values[0], Max: values[1] };\n model = validateModel(model);\n withMinMax(prop => {\n let edgesBecomeNull = setup.edgesBecomeNull[prop];\n if (edgesBecomeNull && model[prop] === setup[prop]) {\n model[prop] = null;\n }\n });\n return model.Min === null && model.Max === null ? null : model;\n }\n function fromModel(model) {\n model = validateModel(model);\n let values = [model.Min, model.Max];\n values = rtl(values);\n return setup.dual ? values : values[0];\n }\n function setSliderPosition(model?) {\n let values = fromModel(model);\n let type = setup.dual ? 'values' : 'value';\n $elem.slider(type, values);\n }\n };\n})();\n"],"names":["input","min","max","_","range","parseInt","resources","key","get","Array","map","_get","dict","p","hasOwnProperty","adults","children","infants","result","resourceService.get","toLowerCase","value","replace","timerThreshold","retryCodes","cache","Map","url","req","opts","isRetry","Object","assign","logErrors","startTime","Date","now","fetch","then","res","elapsedTime","utm","JSON","parse","document","body","getAttribute","UtmId","userAgent","msg","r","XMLHttpRequest","open","setRequestHeader","send","stringify","LogLevel","Message","e","logOverThreshold","contentType","headers","startsWith","promise","json","ok","set","Promise","reject","indexOf","status","fetchData","$location","path","absUrl","redirectUrl","header","test","utmId","obj","statusText","method","logError","angular","element","injector","String","format","TRPCONFIG","Domain","AgentLogonUrl","window","location","href","Error","prom","credentials","Content-Type","availabilityApiUrl","detailsApiUrl","promiseCache","detailsId","getData","request","postData","data","AvailableTypes","availabilityId","detailsRequest","has","getDetailsFromSession","arr","matchFn","findIndex","from","to","i","push","func","array","predicate","filter","some","length","fn","agg","reduce","keyfn","valfn","x","valOrArray","flatten","a","b","newLength","insertFn","diff","splice","item","unshift","head","sort","y","maxValue","initialValue","isNaN","init","chunkSize","slice","filtered","forEach","val","numbers","n","arr1","arr2","find","undefined","equals","fnArray","resolve","ProductType","Core","Booking","baseUrl","urlFragments","Transfer","_a","Parking","CarHire","asc","m","rankings","sorted","clone","r1","Rank","r2","compare","Price","muteExcept","basketId","type","products","RankingRequest","BasketId","ApplicationType","DomainId","Product","t","Type","Title","CarPark","Description","createRankingRequest","Transfers","Key","TotalPrice","transfers","sortRankings","idx","parking","carhire","c","catch","empty","subscribers","subscriber","_id","detachEvent","removeEventListener","topic","sub","triggerHandler","callback","s","objectify","$","unbind","bind","extend","call","_this","addEventListener","target","activeElement","protocol","subscribe","_i","args","unsubscribe","except","cookies","cookie","decodeURIComponent","RegExp","encodeURIComponent","end","domain","secure","sameSite","expires","constructor","Number","Infinity","toUTCString","user","u","broker.publish","exp","Math","NaN","toString","split","CrossSellType","CarHireSortOrder","SortOrder","root","prop","FieldType","prependRoot","v","encode","join","keys","flattenDeep","fPrev","fCurrent","webUrl","tripId","continueV2FlightDetailsRequest","param","ResponseCode","BrandSpecificFlightId","id","DetailsSessionId","flight","isHFlight","leg","segment","SupplierFareClass","f","omit","terminals","airportCode","flightCode","fromDate","CultureCode","AirportCode","FlightCode","Terminal","getTerminal","Terminals","Code","random","googlebot","navigator","prerender","level","message","baseLogger","destType","None","Estab","Location","Province","Country","Place","Polygon","d","Id","ObjectId","EstablishmentId","LocationId","ProvinceId","CountryId","PlaceId","PolygonId","getId","ObjectTypeId","logWarn","typeAndId","getObjectTypeAndId","imageSizes","pixelRatios","baseValue","candidates","selectedVal","parseFloat","PhotoDomains","estabId","width","height","sequence","crop","HotelImageCDN","getImageDomain","destination","IMG_API","DestinationImagesClientDomain","objectTypeAndId","params","URLSearchParams","CurrentVersion","size","pr","getClosestValue","devicePixelRatio","getImageUrl","w","DeviceType","DeviceSettings","LandingImageHeight","getDestinationImage","rootPath","RootPath","apiUrl","lang","getRootPath","language","domainid","launcher","closer","doc","elemType","src","force","el","querySelectorAll","parentNode","removeChild","fjs","getElementsByTagName","js","createElement","insertBefore","onload","settings","options","preventClose","hideHeaderBar","k","name","broker.subscribe","ev","broker.unsubscribe","minAdults","MinimumAdultOccupancy","minParkingPassengerCount","occupancy","Adults","ChildAges","passengerCount","ages","arrayUtil.numberArray","occ","arrayUtil.reduce","o1","o2","concat","cloneDeep","getOccupancy","search","o_1","parseOccupancyString","occupancy_1","first","nonInfants","o","reduceOccupancy","str","counts","getTotalPeopleCounts","occupancyProposition","rooms","tail","childAges","area","OccupancyLimits","number","singular","plural","index","getNumberOfNonInfantPassengers","limits","getLimits","maxAdults","isArray","maxChildren","arrayUtil.count","ages_1","ca","getOccupancyString","serialized","each","raw","exec","num","sum","room","numChildren","numAdults","MasterType","PaymentType","page","total","start","stop","cardDetail","cardNumber","cardTypeId","expiryDate","month","year","issueNumber","maskedNumber","paymentOptionId","paymentTypeId","securityCode","startDate","isSavedCard","savedCardId","externalFop","fee","isPayPalPayment","saveCard","authorisationCode","note","AdminOverride","CardTypeId","FeeAmount","FeePercent","FullDetailsRequired","FullDetails","Name","PaymentTypeId","IsExternalFop","IsPayPal","PayPal","savedOptions","paymentOptions","so","paymentOption","CardId","CardName","CardType","ExpiryMonth","ExpiryYear","IsExpired","LogoName","MaskedNumber","MasterCardTypeId","Maestro","source","valueOrDefault","isEmpty","toStringOrDefault","card","CardFeeAmount","PaymentOptionId","CardNumber","CardNumberMasked","CardStartMonth","CardStartYear","CardEndMonth","CardEndYear","CardIssueNumber","CardCvc","IsSavedCard","SavedCardId","RetainCard","ExternalAuthorisationCode","ExternalPaymentNote","CardDetails","ExpiryDate","Month","Year","IssueNumber","MaskedCardNumber","SecurityCode","StartDate","SaveThisCard","hotels","flights","holidays","carHire","marhaba","attractions","insurance","product","SupportedProducts","REGEXP_PARSE_URL","qs","qsObj","pair","splitPair","match","splitQs","parsed","$window","origin","hostname","port","aElem","host","pathname","pathnameWithoutCulture","substring","idPart","urlText","amount","hours","floor","minutes","original","regExp","newSubString","single","html","div","innerHTML","textContent","storage","currentUser.get","VWOTestingEnabled","Agent","_vis_opt_queue","_vis_opt_revenue_conversion","goalId","testId","_vis_opt_register_conversion","hide","account_id","mpTimeout","vwo_$","jQuery","removeClass","_vwo_code","VWOAccountId","_vis_opt_url","URL","use_existing_jquery","library_tolerance","finish","getElementById","clearTimeout","setTimeout","this","pushToMixpanel","finished","load","innerText","onerror","appendChild","settings_timer","VWOShowOverlay","h","setAttribute","styleSheet","cssText","createTextNode","_vis_counter","mixpanel","_vis_combination","_vis_id","_vis_data","_vis_l","_vwo_exp_ids","_vwo_exp","ready","_vis_opt_readCookie","combination_chosen","comb_n","register_once","err","_vwo_settings_timer","isHotel","ProgressiveHotelSearchEnabled","initilised","localforage","getItem","console","log","cb","setItem","removeItem","activeExtension","prefs","localForageSet","errorToIgnore","cardFeeOverridePermission","debugApiUrl","paused","command","extension","parameters","User","Host","Extension","InteractionId","IpAdresses","Command","Sequence","SabioUrl","ErrorMessage","errorMessage","username","password","Username","Password","agentInfo","Permissions","agent","bookingId","signinRequest","currentUser.set","basket","providers","entry","wrapNonArray","CostBreakdown","ii","sp","SupplierName","officeLocation","CurrentOfficeLocation","oldPassword","newPassword","OldPassword","NewPassword","token","Token","customerId","amountRequested","CustomerId","AmountRequested","ext","promises","_sendSabioCommand","all","extensionsStatus","activeExtensionStatus","_errorInChain","_logError","_abortCallPauseProcess","_togglePaused","_unsetActiveExtension","transitionEvents","$el","hasClass","is","one","stopPropagation","className","addClass","waitForTransition","property","css","isElementHidden","removeClassWithTransition","addClassWithTransition","prefix","substr","GBP","getDeferred","GIP","EUR","USD","INR","AED","SAR","OMR","BHD","QAR","KWD","JOD","EGP","ZAR","RUB","SEK","DKK","XOF","THB","HKD","SGD","MYR","code","currencies","getCurrencies","DestinationType","DestinationId","SortCriterion","Paging","Index","Size","FieldFlags","friends","Friends","DiscountCode","ctrl","model","noneModel","limit","currentLimit","moreQuotes","FilterUtil","filterName","results","compareTo","chain","resetFrom","copyRange","every","vals","copyFrom","Min","Max","seatPlan","segments","Segments","outbound","Outbound","inbound","Inbound","minCostPerPerson","sumBy","getMinSeatPriceFromflight","seats","SeatPlan","Rows","row","Blocks","block","Seats","minBy","IsAvailable","seat","AdultPrice","addMinCostPerPerson","departureAirportGroups","destinationAirportGroups","DepartureAirportGroups","DestinationAirportGroups","GroupDurations","propertyTypeMap","1","2","3","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","21","22","23","25","typeId","isPrivate","entity","__assign","arguments","prototype","thisArg","g","label","sent","trys","ops","next","verb","throw","return","Symbol","iterator","op","TypeError","done","pop","step","regionalContext","tenantUrl","pointOfSaleUrl","domainUrl","countryUrl","cultureCode","tenantId","domainId","ParentDomainId","generator","turnedOffDomains","Domain2","ADv1BlockedDomains","P","_arguments","fulfilled","rejected","apply","countryCode","regContext","SelectedRegionalContext","TenantId","getRegions","regions","posId","region","PointOfSaleId","PointsOfSale","pos","Context","Languages","l","findLanguageInPos","PointOfSale","Language","Region","Inferred","Success","Redirecturl","reload","mapUrl","limitedFilters","queryStringName","filterVal","isObject","values","isBoolean","$injector","searchVal","config","HotelsByStar","sorter","HotelsByPropertyType","HotelsByBoardType","HotelsByChildDestination","dir","multi","aggregates","group","HotelsByFacility","configFacilities","title","count","Count","minPrice","MinPrice","cheapest","arrayifyAggregates","$rootScope","$$phase","$apply","sector","NonCheckInOptions","oe","oei","MultiOptionalExtras","mo","mi","arrayUtil.indexOf","Options","opt","groupIndex","optionIndex","OptionalExtras","SingleOptionalExtras","selected","findOptionInDetails","arrayUtil.filter","isSingleOption","future","flightSectorOptionalExtras","option","CheckInOptions","arrayUtil.any","OptionId","soe","moe","mok","selectedMultiOptions","parseMultiOptions","selectedOptions","parseSingleOptions","selectedSeats","payingFullAmount","schedule","balance","prod","currentDeposit","cost","initialDeposit","totalBalances","balanceSchedules","balancesByDate","due","paymentData","deposit","payFullAmount","totalDeposit","p1","p2","change","FINDURL","RETRIEVEURL","key_1","term","Countries","Text","Container","newKey","preferenceServiceUrl","SignedIn","ImpersonatedSignedIn","parseObjectValues","preferences","toJson","Preferences","PreferenceName","hotelItem","Url","PrimaryItem","transferItem","marhabaItem","holidayItem","flightItem","dealItem","insuranceItem","cruiseItemForNewWindow","CruiseRootUrl","NewWindow","carhireItem","dailysalesreportItem","faqItem","contactusItem","menus","Items","34","35","36","37","66","55","isAgentMode","statsRequest","searchType","Flight","Hotels","Holidays","Insurance","targetSelector","isProductSupported","win","defaults","offset","animate","container","duration","selector","top","mapValues","getTargetTop","round","scrollTop","abs","easing","complete","targetTop","pageXOffset","pageYOffset","compatMode","documentElement","scrollLeft","whereTo","fns","pull","expiry","estabIds","EstabIds","EstabId","UrgencyMessaging","arrayUtil.map","hotel","defaultMsg","msgs","lettersOnly","numbersOnly","notDefault","required","requiredIf","notDefaultIf","requiredGuest","email","flightNumber","ageCheck","oneMainDriver","numberOfAdditionalDrivers","mustPassCreditCheck","emailAllowed","field","translateFieldLabel","DeepLinkService","reqParams","getOrigin","resData","DeepLink","parseFullUrl","module","service","productType","productIds","transformTeaserPriceResponse","pricesOrder","toDict","Request","tags","Tags","tagKey","Prices","indexA","toLocaleLowerCase","indexB","generateRange","occupancyFilter","replaceLineBreaks","resourceFilter","adHoc","factory","arrayUtils","basketCrossSell","broker","cookieService","currentUser","decimalAdjust","enumService","fieldFilterParser","fieldGroup","flightDetail","flightsTerminal","guid","imageService","loader","logging","modal","paging","paymentsUtil","resource","supportedProducts","urlUtils","frontPad","hoursAndMinutes","toText","abTest","agentModeService","animationUtils","componentUtils","bookingStatus","cmsService","currency","destinationAirport","discountsService","extraProductsService","filterUtil","flightSeatPlanService","flightStaticService","getPropertyTypeFromResKey","globalisationService","googleStaticMap","hotelFilterQueryStringParser","hotelsFilter","objectTypeService","optionsUtil","paymentsCalculator","postcodeService","preferencesHttpProvider","primaryNavigationService","publicityService","regExpRoutes","scrollService","scrollTo","searchTypesService","tokeniser","urgencyMessaging","validationService","windowUtil","productService","popupUrl","locationService.home","modalService.launch","tab","go","setValues","span","span_","getClusterClass","text","div_","style","Label","maps","OverlayView","onAdd","pane","getPanes","overlayMouseTarget","draw","position","getProjection","fromLatLngToDivPixel","left","zIndex","visible","display","clickHandler","google","event","addDomListener","launch","alerts","authRedirection","mapLabel","constant","hotelStaticMapService","accountMenuService","localStorageProvider","$scope","Currency","CurrencyCode","apiPromise","getTeaserPrices","publishAttractionsNewPerson","ProductsShowcase","currentPath","directive","restrict","scope","bindToController","controller","controllerAs","rtl","withMinMax","prices","fromTextOne","fromTextTwo","ProductsItem","teaserPricesPromise","parentCtrl","productId","pricingOptions","priceIndex","price","getSymbol","transclude","require","link","attr","append","pi","onItemInitialized","Rtl","reverse","rtlSlider","setup","$elem","oldSlide","slide","ui","validateModel","edgesBecomeNull","toModel","dual","slider","setSliderPosition","copy","isValid","isNumber"],"mappings":"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"}