{"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/globalisation.ts","../../../client/js/src2/services/getPropertyTypeResKey.js","../../../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","../../../node_modules/tslib/tslib.es6.js","../../../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(tripId:string, request: Flights.DetailsRequest): Promise {\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\n let intvl = setInterval(function() {\n if (TRPCONFIG.Domain.BrandedFareCancellations) {\n clearInterval(intvl);\n sessionStorage.setItem('BrandedFareDetailsSessionId', id);\n }\n }, 100);\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}\nexport function flightmiles(origin: string, destination: string, cabinCode: string, journeyType: string): Promise {\n return getData(`${webUrl}flightmiles?${$.param({\n origin, destination, cabinCode,journeyType\n })}`, { logErrors: false })\n .then(function (data) {\n if (data.ResponseCode === 404) {\n return null;\n }\n return data;\n })\n .catch(function () {\n return null;\n });\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 CAD: getDeferred('CAD'),\n AUD: getDeferred('AUD')\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 if (r1 && r2) {\n return (r1 === null && r2 === null) ||\n (r1 !== null && r2 !== null && r1.Min === r2.Min && r1.Max === r2.Max);\n }\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","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 function getAllDomains() {\n return getData(domainUrl, { logErrors: false });\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","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","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 ['hpr', 'HolidayPriceRange']\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 const $location = $injector ? $injector.get('$location') : '';\n const search = $location.search();\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', 'hpr'], 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 (e === 'dobcheck') {\n label = '';\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","/*! *****************************************************************************\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 * 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 modalService.launch(popupUrl, {\n tab: url,\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\nexport function launchContactForm(path: string, options: Object): void {\n launch('partials/auth/ContactFormPopUp', _.extend({ tab: path, cb: null }, options));\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","param","ResponseCode","BrandSpecificFlightId","id","DetailsSessionId","intvl","setInterval","BrandedFareCancellations","clearInterval","sessionStorage","setItem","flight","isHFlight","leg","segment","SupplierFareClass","f","omit","origin","destination","cabinCode","journeyType","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","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","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","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","CAD","AUD","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","rangesMatch","seatPlan","segments","Segments","outbound","Outbound","inbound","Inbound","minCostPerPerson","sumBy","getMinSeatPriceFromflight","seats","SeatPlan","Rows","row","Blocks","block","Seats","minBy","IsAvailable","seat","AdultPrice","addMinCostPerPerson","regionalContext","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","tenantUrl","pointOfSaleUrl","domainUrl","countryUrl","cultureCode","tenantId","domainId","ParentDomainId","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","label","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","__assign","arguments","prototype","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","apply","slider","setSliderPosition","copy","isValid","isNumber"],"mappings":"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"}