{"version":3,"sources":["client/js/src/mobile/attractions/attractions.config.ts","build/js/desktop/bundle.desktop.ekh.js","client/js/src/mobile/app.js","client/js/src/mobile/shims.js","client/js/src/mobile/routes.js","client/js/src/mobile/trp/services/customHttp.config.js","client/js/src/mobile/ekh/bootstrap/ekh.config.js","client/js/src/mobile/quote/quote.config.js","client/js/src/mobile/dashboard/dashboard.config.js","client/js/src/mobile/cms/cms.config.js","client/js/src/mobile/liveChatModule/liveChat.config.ts","client/js/src/mobile/core/seoKnowledgeGraph.directive.ts","client/js/src/mobile/deepLink/deepLinkController.ts","client/js/src/desktop/core/directives/deviceMeta.ts","client/js/src/desktop/core/directives/languageSwitcher.ts","client/js/src/mobile/cms/services/cmsUtils.service.ts","client/js/src/mobile/core/directives/modalLink.directive.ts","client/js/src/mobile/core/directives/payment.directive.ts","client/js/src/mobile/core/services/quoteManager.service.ts","client/js/src/mobile/dashboard/services/mybTrack.service.ts","client/js/src/mobile/ekh/directives/validateCvvTokenErrors.ts","client/js/src/mobile/insurance/controllers/insuranceResults.controller.ts","client/js/src/mobile/liveChatModule/services/liveChat.service.ts","client/js/src/mobile/quote/directives/notes.directive.ts","client/js/src/mobile/quote/directives/quoteCreator.directive.ts","client/js/src/mobile/search/services/unifiedSearch.service.ts","client/js/src/mobile/searchUnit/directives/fixedDepartureDropdown.directive.ts","client/js/src/mobile/searchUnit/services/area.factory.ts","client/js/src/mobile/deepLink/deepLinkRoutesConfig.ts","client/js/src/mobile/attractions/services/attractionDetails.service.ts","client/js/src/mobile/carHire/controllers/carHire.ts","client/js/src/mobile/carHire/services/carHire.service.ts","client/js/src/mobile/searchUnit/directives/dealsSearchUnit.directive.ts","client/js/src/mobile/searchUnit/directives/insuranceSearchUnit.directive.ts","client/js/src/mobile/settingsDesktop/settings.constants.ts","client/js/src/desktop/core/directives/agentCorrelationId.directive.ts","client/js/src/desktop/core/directives/agentNetInfo.directive.ts","client/js/src/desktop/core/directives/agentNetInfoTable.directive.ts","client/js/src/mobile/core/directives/AutocompleterField.ts","client/js/src/desktop/core/directives/airportMultiSelect.directive.ts","client/js/src/desktop/core/directives/airportMultiSelectUnified2.directive.ts","client/js/src/desktop/core/directives/bookingExtrasCarHireOption.directive.ts","client/js/src/desktop/core/directives/bookingExtrasOptionOld.directive.ts","client/js/src/desktop/core/directives/bookingFormHeader.ts","client/js/src/desktop/core/directives/bookingFormSummary.ts","client/js/src/desktop/core/directives/bookingSummaryBreakdown.ts","client/js/src/desktop/core/directives/canonicalTags.js","client/js/src/desktop/core/directives/datepickerMkc.directive.js","client/js/src/desktop/core/directives/discountMessage.directive.ts","client/js/src/desktop/core/directives/flightBookingSummary.directive.ts","client/js/src/desktop/core/directives/hotelList.directive.ts","client/js/src/desktop/core/directives/loaderPanel.directive.ts","client/js/src/desktop/core/directives/manySelect.directive.ts","client/js/src/desktop/core/directives/monthPicker.directive.ts","client/js/src/desktop/core/directives/noIndexFollow.directive.ts","client/js/src/desktop/core/directives/pauseCall.directive.js","client/js/src/desktop/core/directives/scrollToTopWhen.directive.ts","client/js/src/desktop/core/services/agentNetInfo.service.ts","client/js/src/desktop/core/services/crossSell.service.js","client/js/src/desktop/core/services/postBookingLookup.service.ts","client/js/src/desktop/dashboard/services/bookingActionLink.service.ts","client/js/src/desktop/dashboard/services/dashboardAvailability.constant.ts","client/js/src/desktop/dashboard/services/notificationLink.service.ts","client/js/src/desktop/dashboard/services/v1Redirection.service.ts","client/js/src/desktop/trp/controllers/holidayDealsPromo.controller.ts","client/js/src/desktop/trp/controllers/loading.controller.ts","client/js/src/desktop/trp/directives/acceptanceText.directive.js","client/js/src/desktop/trp/directives/accordion.directive.js","client/js/src/desktop/trp/directives/agentAutofill.directive.js","client/js/src/desktop/trp/directives/boardTypeFilter.directive.ts","client/js/src/desktop/trp/directives/childDestinationFilter.directive.ts","client/js/src/desktop/trp/directives/chooseDifferentHotel.directive.ts","client/js/src/desktop/trp/directives/clickTripz.directive.ts","client/js/src/desktop/trp/directives/cruiseListing.directive.ts","client/js/src/desktop/trp/directives/directPaymentInformation.directive.ts","client/js/src/desktop/trp/directives/facilitiesFilter.directive.ts","client/js/src/desktop/trp/directives/fieldImport.directive.js","client/js/src/desktop/trp/directives/filtersBox.directive.ts","client/js/src/desktop/trp/directives/filtersLabels.directive.ts","client/js/src/desktop/trp/directives/formSubmit.js","client/js/src/desktop/trp/directives/hiddenContent.directive.js","client/js/src/desktop/trp/directives/hideMenuBar.directive.js","client/js/src/desktop/trp/directives/holidayDealPromoListing.ts","client/js/src/desktop/trp/directives/hotelReviewsBrowser.directive.ts","client/js/src/desktop/trp/directives/hotelStats.directive.js","client/js/src/desktop/trp/directives/imageGallery.js","client/js/src/desktop/trp/directives/linklist.directive.ts","client/js/src/desktop/trp/directives/newsletterBanner.directive.js","client/js/src/desktop/trp/directives/occupancy.directive.js","client/js/src/desktop/trp/directives/openNewTab.directive.js","client/js/src/desktop/trp/directives/pageTitle.directive.js","client/js/src/desktop/trp/directives/priceFilter.directive.ts","client/js/src/desktop/trp/directives/priceToken.directive.ts","client/js/src/desktop/trp/directives/primaryNavigationList.directive.ts","client/js/src/desktop/trp/directives/propertyTypeFilter.directive.ts","client/js/src/desktop/trp/directives/publicityData.directive.js","client/js/src/desktop/trp/directives/ratingFilter.directive.ts","client/js/src/desktop/trp/directives/reviewSnippetBrowser.directive.ts","client/js/src/desktop/trp/directives/scrollIntoView.directive.js","client/js/src/desktop/trp/directives/shortlistToggle.directive.js","client/js/src/desktop/trp/directives/simpleImageGallery.directive.ts","client/js/src/desktop/trp/directives/starsfilter.directive.ts","client/js/src/desktop/trp/directives/textFader.directive.ts","client/js/src/desktop/trp/directives/tooltip.directive.js","client/js/src/desktop/trp/directives/tooltipUi.directive.js","client/js/src/desktop/trp/directives/trustpilotLogo.directive.ts","client/js/src/desktop/trp/directives/validationErrors.directive.js","client/js/src/desktop/trp/directives/validationMessage.directive.ts","client/js/src/desktop/trp/directives/validationStatus.directive.ts","client/js/src/desktop/trp/jqueryControls/trp.modal.js","client/js/src/desktop/trp/jqueryControls/trp.popup.js","client/js/src/desktop/trp/services/breadcrumbDetails.service.js","client/js/src/desktop/trp/services/trustpilot.service.ts","client/js/src/mobile/attractions/controllers/attractions.controller.ts","client/js/src/mobile/attractions/controllers/attractionsBasket.controller.ts","client/js/src/mobile/attractions/controllers/attractionsBasketModal.controller.ts","client/js/src/mobile/attractions/directives/attractionsHeaderPanel.directive.ts","client/js/src/mobile/attractions/directives/attractionsProductForm.directive.ts","client/js/src/mobile/attractions/directives/attractionsSearch.directive.ts","client/js/src/mobile/attractions/directives/themeParkCombo.directive.ts","client/js/src/mobile/attractions/services/attraction.service.ts","client/js/src/mobile/attractions/services/attractionSearchValidator.service.ts","client/js/src/mobile/cms/components/mobileHero.component.ts","client/js/src/mobile/cms/directives/analyticsEvent.directive.ts","client/js/src/mobile/cms/directives/cmsComponent.directive.ts","client/js/src/mobile/cms/directives/seoMetaData.directive.ts","client/js/src/mobile/core/contracts/adhoc.contracts.ts","client/js/src/mobile/core/contracts/booking.contracts.ts","client/js/src/mobile/core/contracts/bookingsManager.contracts.ts","client/js/src/mobile/core/contracts/carhire.contracts.ts","client/js/src/mobile/core/contracts/customerDashboard.contracts.ts","client/js/src/mobile/core/contracts/destination.contracts.ts","client/js/src/mobile/core/contracts/flights.contracts.ts","client/js/src/mobile/core/contracts/hotels.contracts.ts","client/js/src/mobile/core/contracts/manageBooking.contracts.ts","client/js/src/mobile/core/contracts/quote.contracts.ts","client/js/src/mobile/core/contracts/trip.contracts.ts","client/js/src/mobile/core/controllers/bookingComplete.controller.ts","client/js/src/mobile/core/controllers/dynamicRouting.controller.ts","client/js/src/mobile/core/directives/CmsPageProps.directive.ts","client/js/src/mobile/core/directives/MultiSectorFlights.ts","client/js/src/mobile/core/directives/abTestSelector.directive.ts","client/js/src/mobile/core/directives/addFlightDetailsModal.ts","client/js/src/mobile/core/directives/atolCostBreakdown.ts","client/js/src/mobile/core/directives/autoSearch.directive.ts","client/js/src/mobile/core/directives/autocompleter.directive.ts","client/js/src/mobile/core/directives/autocompleterRecommendations.directive.ts","client/js/src/mobile/core/directives/baggageOptions.component.ts","client/js/src/mobile/core/directives/baseStaticMap.js","client/js/src/mobile/core/directives/basicContentCard.directive.ts","client/js/src/mobile/core/directives/blogSection.directive.ts","client/js/src/mobile/core/directives/bookingExtrasOption.directive.ts","client/js/src/mobile/core/directives/bookingSummary.directive.ts","client/js/src/mobile/ekh/services/brandedFareTypes.service.ts","client/js/src/mobile/core/directives/brandedFare.directive.ts","client/js/src/mobile/core/directives/brandedFareTypes.directive.ts","client/js/src/mobile/core/directives/breakdownTable.directive.ts","client/js/src/mobile/core/directives/callToBookModal.ts","client/js/src/mobile/core/directives/canonicalTag.directive.ts","client/js/src/mobile/core/directives/checkUserPrefs.directive.js","client/js/src/mobile/core/directives/checkbox-popup.derective.ts","client/js/src/mobile/core/directives/confidenceMessages.ts","client/js/src/mobile/core/directives/contactForm.js","client/js/src/mobile/core/directives/costBreakdown.js","client/js/src/mobile/core/directives/crossSellCard.directive.ts","client/js/src/mobile/core/directives/currentTripCard.directive.ts","client/js/src/mobile/core/directives/customerDashboard.directive.ts","client/js/src/mobile/core/directives/dateOrMonthPicker.directive.ts","client/js/src/mobile/core/directives/destinationContentCard.directive.ts","client/js/src/mobile/core/directives/expander.js","client/js/src/mobile/core/directives/extendableTagList.directive.ts","client/js/src/mobile/core/directives/extraFocusTracker.directive.ts","client/js/src/mobile/core/directives/fieldOptions.directive.ts","client/js/src/mobile/core/directives/fieldOptions2.directive.ts","client/js/src/mobile/core/directives/flightExtrasSummary.directive.ts","client/js/src/mobile/core/directives/gtm.directive.ts","client/js/src/mobile/core/directives/hotelContentCard.directive.ts","client/js/src/mobile/core/directives/hotelStaySummary.ts","client/js/src/mobile/core/directives/howToGetThere.directive.ts","client/js/src/mobile/core/directives/imageResize.directive.ts","client/js/src/mobile/core/directives/inputDirective.js","client/js/src/mobile/core/directives/isolateForm.directive.ts","client/js/src/mobile/core/directives/isolatedNestedForm.js","client/js/src/mobile/core/directives/lazyImageSrc.directive.js","client/js/src/mobile/core/directives/loadingSpinner.js","client/js/src/mobile/core/directives/modalCancellationsBasketDetails.ts","client/js/src/mobile/core/directives/modalCancellationsDetails.ts","client/js/src/mobile/core/directives/modalFlightDetails.ts","client/js/src/mobile/core/directives/modalTransferDetails.ts","client/js/src/mobile/core/directives/modalUspPopupDetails.ts","client/js/src/mobile/core/directives/newsflash.ts","client/js/src/mobile/core/directives/payLater.ts","client/js/src/mobile/core/directives/paymentAmountSelection.ts","client/js/src/mobile/core/directives/priceInfo.directive.ts","client/js/src/mobile/core/directives/pricingModals.ts","client/js/src/mobile/core/directives/recentSearchCard.directive.ts","client/js/src/mobile/core/directives/refreshView.directive.ts","client/js/src/mobile/core/directives/reviewHotelCard.directive.ts","client/js/src/mobile/core/directives/sash.directive.ts","client/js/src/mobile/core/directives/scrollAndClick.directive.ts","client/js/src/mobile/core/directives/scrollPage.directive.js","client/js/src/mobile/core/directives/scroller.directive.ts","client/js/src/mobile/core/directives/selectedAttractionSummary.ts","client/js/src/mobile/core/directives/selectedCarHireSummary.ts","client/js/src/mobile/core/directives/selectedFlightSummary.ts","client/js/src/mobile/core/directives/selectedInsuranceSummary.ts","client/js/src/mobile/core/directives/selectedParkingSummary.ts","client/js/src/mobile/core/directives/selectedTransferSummary.ts","client/js/src/mobile/core/directives/signInDashboard.directive.ts","client/js/src/mobile/core/directives/stickyElement.directive.ts","client/js/src/mobile/core/directives/telephoneNumber.directive.ts","client/js/src/mobile/core/directives/uniqueSellingPoint.directive.ts","client/js/src/mobile/core/directives/urlDiscount.directive.ts","client/js/src/mobile/core/directives/voucherModal.ts","client/js/src/mobile/core/filters/currencyFilters.js","client/js/src/mobile/core/filters/insuranceBandFilter.js","client/js/src/mobile/core/filters/parseUtilityClassesFilter.js","client/js/src/mobile/core/filters/unadjustedDateFilter.js","client/js/src/mobile/core/filters/uniqueFilter.js","client/js/src/mobile/core/services/auth.service.js","client/js/src/mobile/core/services/booking.service.ts","client/js/src/mobile/core/services/bookingsManager.service.ts","client/js/src/mobile/core/services/crossSellCommon.service.ts","client/js/src/mobile/core/services/customerDashboard.service.ts","client/js/src/mobile/core/services/domainIdHeaderInterceptor.ts","client/js/src/mobile/core/services/fidParser.ts","client/js/src/mobile/core/services/fieldGroup.service.ts","client/js/src/mobile/core/services/funcUtil.service.js","client/js/src/mobile/core/services/hotel.service.ts","client/js/src/mobile/core/services/hotelFromSesssion.service.ts","client/js/src/mobile/core/services/payments.service.js","client/js/src/mobile/core/services/paymentsUtil.service.ts","client/js/src/mobile/core/services/promiseDecorator.js","client/js/src/mobile/core/services/quote.service.ts","client/js/src/mobile/core/services/retryInterceptor.service.js","client/js/src/mobile/core/services/taxation.service.ts","client/js/src/mobile/core/services/timerInterceptor.service.js","client/js/src/mobile/core/services/trip.service.ts","client/js/src/mobile/core/utils/Dictionary.ts","client/js/src/mobile/core/utils/prerenderLogging.js","client/js/src/mobile/dashboard/controllers/Dashboard.controller.ts","client/js/src/mobile/dashboard/controllers/Notifications.controller.ts","client/js/src/mobile/dashboard/controllers/addAPI.controller.ts","client/js/src/mobile/dashboard/controllers/dashboardAddOption.controller.ts","client/js/src/mobile/dashboard/controllers/addBaggage.controller.ts","client/js/src/mobile/dashboard/controllers/contactDetail.js","client/js/src/mobile/dashboard/controllers/csrCtrl.js","client/js/src/mobile/dashboard/controllers/csrDetailsCtrl.js","client/js/src/mobile/dashboard/controllers/dashboardBookingCtrl.js","client/js/src/mobile/dashboard/controllers/dashboardBookingDetails.controller.ts","client/js/src/mobile/dashboard/controllers/dashboardResendVoucher.js","client/js/src/mobile/dashboard/controllers/dashboardReviewCtrl.js","client/js/src/mobile/dashboard/controllers/dashboardSeatSelection.controller.ts","client/js/src/mobile/dashboard/controllers/dashboardSettingsCtrl.js","client/js/src/mobile/dashboard/controllers/memberDetailsCtrl.js","client/js/src/mobile/dashboard/controllers/onlineCheckinCtrl.js","client/js/src/mobile/dashboard/controllers/payBalance.js","client/js/src/mobile/dashboard/controllers/payBalanceComplete.js","client/js/src/mobile/dashboard/directives/amendBookingPreviousSummary.ts","client/js/src/mobile/dashboard/directives/dashboardBookingItinerary.component.ts","client/js/src/mobile/dashboard/directives/dashboardBookingSummary.js","client/js/src/mobile/dashboard/directives/dashboardBreadcrumb.directive.ts","client/js/src/mobile/dashboard/directives/dashboardCarousel.directive.ts","client/js/src/mobile/dashboard/directives/dashboardCsrConversation.component.ts","client/js/src/mobile/dashboard/directives/dashboardCsrSummary.directive.ts","client/js/src/mobile/dashboard/directives/gravatarImage.js","client/js/src/mobile/dashboard/directives/inputElastic.directive.ts","client/js/src/mobile/dashboard/directives/visitedHotelItem.js","client/js/src/mobile/dashboard/services/addAPI.service.ts","client/js/src/mobile/dashboard/services/bookingStatus.ts","client/js/src/mobile/dashboard/services/dashBoardReview.service.js","client/js/src/mobile/dashboard/services/dashboard.service.js","client/js/src/mobile/dashboard/services/dashboardBooking.service.js","client/js/src/mobile/dashboard/services/dashboardBookingsErrorMessage.ts","client/js/src/mobile/dashboard/services/dashboardBreadCrumbDetails.service.ts","client/js/src/mobile/dashboard/services/dashboardCsr.service.js","client/js/src/mobile/dashboard/services/dashboardNotification.service.ts","client/js/src/mobile/dashboard/services/deliveryAddress.service.js","client/js/src/mobile/dashboard/services/flightExtras.service.ts","client/js/src/mobile/dashboard/services/onlineCheckin.service.js","client/js/src/mobile/dashboard/services/paymentDetails.service.js","client/js/src/mobile/dashboard/services/userSettings.service.js","client/js/src/mobile/deals/directives/dealTypeCards.directive.js","client/js/src/mobile/ekh/controllers/emiratesHome.js","client/js/src/mobile/ekh/controllers/emiratesOffers.js","client/js/src/mobile/ekh/controllers/emiratesSingleOffers.js","client/js/src/mobile/ekh/directives/NewsLetterSignUpFullForm.ts","client/js/src/mobile/ekh/directives/NewsLetterSignUpPopupForm.ts","client/js/src/mobile/ekh/directives/boardTypeFilters.directive.js","client/js/src/mobile/ekh/services/countryPicker.service.ts","client/js/src/mobile/ekh/directives/cardBinMessages.directive.ts","client/js/src/mobile/ekh/directives/clearBasketAlert.directive.ts","client/js/src/mobile/ekh/directives/countryPickerDropdown.ts","client/js/src/mobile/ekh/directives/countryPickerPopup.ts","client/js/src/mobile/ekh/directives/deviceDataCollector.directive.ts","client/js/src/mobile/ekh/directives/dropdownMultiSelect.directive.js","client/js/src/mobile/ekh/directives/emailMyQuote.ts","client/js/src/mobile/ekh/directives/footerCookies.ts","client/js/src/mobile/ekh/directives/formState.ts","client/js/src/mobile/ekh/directives/hideSubmenuOnClick.js","client/js/src/mobile/ekh/directives/metaOverride.js","client/js/src/mobile/ekh/directives/navToolbar.ts","client/js/src/mobile/ekh/directives/phoneNumberInput.ts","client/js/src/mobile/ekh/directives/productCarousel.js","client/js/src/mobile/quote/controllers/quotePublic.controller.ts","client/js/src/mobile/ekh/directives/publicQuoteSummary.ts","client/js/src/mobile/ekh/directives/quoteStatusMessages.ts","client/js/src/mobile/ekh/directives/selectedHotel.ts","client/js/src/mobile/ekh/directives/sticky.directive.ts","client/js/src/mobile/ekh/directives/validateCardType.ts","client/js/src/mobile/ekh/services/cmsPageMapping.js","client/js/src/mobile/insurance/services/insurance.service.js","client/js/src/mobile/liveChatModule/directives/liveChat.directive.ts","client/js/src/mobile/liveChatModule/directives/liveChatButton.directive.ts","client/js/src/mobile/parking/controllers/parking.js","client/js/src/mobile/parking/controllers/parkingResults.js","client/js/src/mobile/parking/controllers/parkingSearchUnit.js","client/js/src/mobile/parking/services/parking.service.js","client/js/src/mobile/parking/services/parkingDetails.service.js","client/js/src/mobile/parking/services/parkingSearchValidator.service.js","client/js/src/mobile/quote/controllers/quoteCtrl.js","client/js/src/mobile/quote/directives/advancedQuoteSearch.directive.ts","client/js/src/mobile/search/contracts/search.contracts.ts","client/js/src/mobile/search/contracts/unifiedSearch.contracts.ts","client/js/src/mobile/search/directives/dateRangePicker.directive.ts","client/js/src/mobile/search/directives/durationPicker.directive.ts","client/js/src/mobile/search/directives/errorFocusHandler.directive.ts","client/js/src/mobile/search/directives/inputWithIcon.directive.ts","client/js/src/mobile/search/directives/integratedSearch.directive.ts","client/js/src/mobile/search/directives/occupancyPicker.directive.ts","client/js/src/mobile/search/directives/search.directive.ts","client/js/src/mobile/search/directives/selectBox.directive.ts","client/js/src/mobile/search/directives/unifiedSearch.directive.ts","client/js/src/mobile/search/services/searchQueryString.service.ts","client/js/src/mobile/search/services/searchUnit.service.ts","client/js/src/mobile/searchUnit/controllers/sharedSearchUnit.controller.js","client/js/src/mobile/searchUnit/directives/datesSearchUnit.directive.js","client/js/src/mobile/searchUnit/directives/flightSearchUnit.directive.js","client/js/src/mobile/searchUnit/directives/marhabaSearchUnit.directive.js","client/js/src/mobile/searchUnit/directives/parkingSearchUnit.directive.js","client/js/src/mobile/searchUnit/directives/resortField.directive.js","client/js/src/mobile/searchUnit/directives/roomSearchUnit.directive.js","client/js/src/mobile/searchUnit/directives/transferSearchUnit.directive.js","client/js/src/mobile/searchUnit/services/sharedSearchUnit.service.js","client/js/src/mobile/transfers/controllers/resortsCtrl.js","client/js/src/mobile/transfers/controllers/transferAirportsCtrl.js","client/js/src/mobile/transfers/controllers/transferDirectionCtrl.js","client/js/src/mobile/transfers/controllers/transferSearchCtrl.js","client/js/src/mobile/transfers/services/transferDetail.service.js","client/js/src/mobile/transfers/services/transferSearch.service.js","client/js/src/mobile/transfers/services/transferSearchValidator.service.js","client/js/src/mobile/trp/controllers/appPromo.controller.ts","client/js/src/mobile/trp/controllers/homeCtrl.js","client/js/src/mobile/trp/controllers/landingPageCtrl.js","client/js/src/mobile/trp/controllers/loadingScreenCtrl.js","client/js/src/mobile/trp/controllers/notFoundCtrl.js","client/js/src/mobile/trp/controllers/occupancyCtrl.js","client/js/src/mobile/trp/controllers/promotionTerms.controller.ts","client/js/src/mobile/trp/controllers/rootCtrl.js","client/js/src/mobile/trp/controllers/searchUnitCtrl.js","client/js/src/mobile/trp/controllers/selectDomain.controller.ts","client/js/src/mobile/trp/controllers/selectOffice.controller.ts","client/js/src/mobile/trp/controllers/testDestinationCtrl.js","client/js/src/mobile/trp/controllers/testHomeCtrl.js","client/js/src/mobile/trp/controllers/testPageCtrl.js","client/js/src/mobile/trp/directives/CountBadge.ts","client/js/src/mobile/trp/directives/FilterAllButton.ts","client/js/src/mobile/trp/directives/attractionsCalendar.directive.ts","client/js/src/mobile/trp/directives/acceptCookiesBanner.directive.js","client/js/src/mobile/trp/directives/accountMenu.directive.js","client/js/src/mobile/trp/directives/accountSignIn.directive.ts","client/js/src/mobile/trp/directives/advert.directive.js","client/js/src/mobile/trp/directives/attractionSelection.directive.ts","client/js/src/mobile/trp/directives/basketBar.directive.js","client/js/src/mobile/trp/directives/basketToolbar.directive.ts","client/js/src/mobile/trp/directives/bookingCompleteTracking.directive.ts","client/js/src/mobile/trp/directives/bookingLookup.directive.ts","client/js/src/mobile/trp/directives/bookingTracker.js","client/js/src/mobile/trp/directives/breadcrumb.js","client/js/src/mobile/trp/directives/cardCvv.directive.js","client/js/src/mobile/trp/directives/carhireSelection.directive.ts","client/js/src/mobile/trp/directives/carousel.directive.ts","client/js/src/mobile/trp/directives/checkbox.js","client/js/src/mobile/trp/directives/checkboxAll.directive.ts","client/js/src/mobile/trp/directives/checkboxArray.directive.ts","client/js/src/mobile/trp/directives/clickPublisher.directive.ts","client/js/src/mobile/trp/directives/combobox.js","client/js/src/mobile/trp/directives/contactFormpopup.directive.ts","client/js/src/mobile/trp/directives/crossSellAttractions.ts","client/js/src/mobile/trp/directives/crossSellCarHire.ts","client/js/src/mobile/trp/directives/crossSellInsurance.ts","client/js/src/mobile/trp/directives/crossSellParking.ts","client/js/src/mobile/trp/directives/crossSellTransfers.ts","client/js/src/mobile/trp/directives/datepicker.js","client/js/src/mobile/trp/directives/destination.js","client/js/src/mobile/trp/directives/destinationContent.directive.js","client/js/src/mobile/trp/directives/destinationPromoMessage.directive.ts","client/js/src/mobile/trp/directives/navigationDrawer.directive.ts","client/js/src/mobile/enhancements/tr/directives/airportMultiSelectUnified.directive.ts","client/js/src/mobile/trp/controllers/booking/bookingConfirmationCtrl.ts","client/js/src/mobile/trp/controllers/holidayDeals/seasonalDeals.controller.ts","client/js/src/mobile/trp/directives/destinationTitle.directive.js","client/js/src/mobile/trp/directives/dobPicker.js","client/js/src/mobile/trp/directives/dropdownCheckboxList.directive.ts","client/js/src/mobile/trp/directives/emailAllowed.directive.ts","client/js/src/mobile/trp/directives/eventTracker.directive.js","client/js/src/mobile/trp/directives/fareRulesLink.directive.ts","client/js/src/mobile/trp/directives/fareRulesText.directive.ts","client/js/src/mobile/trp/directives/filterCriterion.js","client/js/src/mobile/trp/directives/flashMessage.js","client/js/src/mobile/trp/directives/footerCarousel.directive.js","client/js/src/mobile/trp/directives/footerToolbar.directive.js","client/js/src/mobile/trp/directives/globalWaiverText.directive.js","client/js/src/mobile/trp/directives/googleMap.js","client/js/src/mobile/trp/directives/headingOverlayBanner.ts","client/js/src/mobile/trp/directives/heroImage.js","client/js/src/mobile/trp/directives/holidayDealListing.directive.ts","client/js/src/mobile/trp/directives/hotelOptionsSearchUnit.component.ts","client/js/src/mobile/trp/directives/hotelReview.js","client/js/src/mobile/trp/directives/imageLoader.directive.ts","client/js/src/mobile/trp/directives/importantInfo.js","client/js/src/mobile/trp/directives/injectParams.js","client/js/src/mobile/trp/directives/insuranceSelection.directive.ts","client/js/src/mobile/trp/directives/internalLink.directive.ts","client/js/src/mobile/trp/directives/leafletMap.js","client/js/src/mobile/trp/directives/lightbox.directive.js","client/js/src/mobile/trp/directives/listbutton.js","client/js/src/mobile/trp/directives/loading.js","client/js/src/mobile/trp/directives/loadingScreenNumbers.js","client/js/src/mobile/trp/directives/mailingListSignUp.directive.ts","client/js/src/mobile/trp/directives/mailingListUnsubscribe.ts","client/js/src/mobile/trp/directives/monthYearPicker.ts","client/js/src/mobile/trp/directives/navigationDrawerToggle.directive.js","client/js/src/mobile/trp/directives/newHomeRecommenders.component.ts","client/js/src/mobile/trp/directives/newsletterModal.ts","client/js/src/mobile/trp/directives/newsletterSignUp.js","client/js/src/mobile/trp/directives/numberPicker.ts","client/js/src/mobile/trp/directives/packagePrice.js","client/js/src/mobile/trp/directives/paginator.directive.js","client/js/src/mobile/trp/directives/parkingSelection.directive.ts","client/js/src/mobile/trp/directives/passengerSelection.directive.ts","client/js/src/mobile/trp/directives/platform195ConvTracking.directive.js","client/js/src/mobile/trp/directives/platform195Pill.directive.js","client/js/src/mobile/trp/directives/platform195tracking.directive.js","client/js/src/mobile/trp/directives/postcode.js","client/js/src/mobile/trp/directives/preloader.directive.js","client/js/src/mobile/trp/directives/priceMode.directive.js","client/js/src/mobile/trp/directives/priorityBoarding.component.ts","client/js/src/mobile/trp/directives/publicityMessages.js","client/js/src/mobile/trp/directives/radioButton.js","client/js/src/mobile/trp/directives/rating.directive.js","client/js/src/mobile/trp/directives/recentSearches.js","client/js/src/mobile/trp/directives/resourceStrings.js","client/js/src/mobile/trp/directives/salesBanner.directive.js","client/js/src/mobile/trp/directives/seatPlanUnit.component.ts","client/js/src/mobile/trp/directives/seatSelection.directive.js","client/js/src/mobile/trp/directives/selectedflight.directive.ts","client/js/src/mobile/trp/directives/seoRoomGrid.directive.js","client/js/src/mobile/trp/directives/similarHotels.directive.js","client/js/src/mobile/trp/directives/slider.directive.js","client/js/src/mobile/trp/directives/starRating.directive.ts","client/js/src/mobile/trp/directives/staticBreadcrumb.directive.js","client/js/src/mobile/trp/directives/staticMap.directive.js","client/js/src/mobile/trp/directives/sticky.js","client/js/src/mobile/trp/directives/strandSwap.directive.js","client/js/src/mobile/trp/directives/strengthGauge.js","client/js/src/mobile/trp/directives/tabset.directive.ts","client/js/src/mobile/trp/directives/textCropper.directive.js","client/js/src/mobile/trp/directives/threedsBridge.js","client/js/src/mobile/trp/directives/timePicker.js","client/js/src/mobile/trp/directives/toggleSwitch.directive.ts","client/js/src/mobile/trp/directives/tokenisingField.directive.ts","client/js/src/mobile/trp/directives/translateKey.js","client/js/src/mobile/trp/directives/trustPilotSeoDirective.ts","client/js/src/mobile/trp/directives/uniqueSellingPoints.directive.ts","client/js/src/mobile/trp/directives/urgencyMessages.js","client/js/src/mobile/trp/directives/user.js","client/js/src/mobile/trp/directives/validation.js","client/js/src/mobile/trp/directives/validpassword.js","client/js/src/mobile/trp/filters/relativeCurrency.js","client/js/src/mobile/trp/services/actionTemplate.service.js","client/js/src/mobile/trp/services/advert.service.js","client/js/src/mobile/trp/services/analytics.service.js","client/js/src/mobile/trp/services/autocompleter.service.js","client/js/src/mobile/trp/services/baggage.service.js","client/js/src/mobile/trp/services/basket.service.js","client/js/src/mobile/trp/services/basketStore.service.js","client/js/src/mobile/trp/services/bookingCompleteTracking.service.ts","client/js/src/mobile/trp/services/bootstrapper.service.js","client/js/src/mobile/trp/services/canceller.service.js","client/js/src/mobile/trp/services/componentUtils.service.ts","client/js/src/mobile/trp/services/country.service.js","client/js/src/mobile/trp/services/criteo.service.js","client/js/src/mobile/trp/services/currentDestination.service.js","client/js/src/mobile/trp/services/dateUtils.service.js","client/js/src/mobile/trp/services/dealsBox.service.ts","client/js/src/mobile/trp/services/destination.service.js","client/js/src/mobile/trp/services/destinationContent.service.js","client/js/src/mobile/trp/services/discounts.service.ts","client/js/src/mobile/trp/services/ecommerce.service.js","client/js/src/mobile/trp/services/errInterceptor.service.js","client/js/src/mobile/trp/services/exceptionLogging.service.js","client/js/src/mobile/trp/services/filterIdUtils.service.js","client/js/src/mobile/trp/services/filtering.service.ts","client/js/src/mobile/trp/services/flightSearch.service.js","client/js/src/mobile/trp/services/flightSearchValidator.service.js","client/js/src/mobile/trp/services/flightsFilter.service.ts","client/js/src/mobile/trp/services/geo.service.js","client/js/src/mobile/trp/services/holidayDeals.service.ts","client/js/src/mobile/trp/services/holidayDealsGrouped.service.ts","client/js/src/mobile/trp/services/holidayDealsPromo.service.ts","client/js/src/mobile/trp/services/holidaySearch.service.ts","client/js/src/mobile/trp/services/hotelRehydrator.service.js","client/js/src/mobile/trp/services/hotelResolver.service.js","client/js/src/mobile/trp/services/hotelSearch.service.js","client/js/src/mobile/trp/services/hotelSearchValidator.service.js","client/js/src/mobile/trp/services/hotelsSitemap.service.js","client/js/src/mobile/trp/services/insuranceSearchValidator.service.ts","client/js/src/mobile/trp/services/mandatoryTtransfer.service.js","client/js/src/mobile/trp/services/marhaba.service.js","client/js/src/mobile/trp/services/marhabaSearch.service.js","client/js/src/mobile/trp/services/marhabaSearchValidator.service.js","client/js/src/mobile/trp/services/multiSectorSearch.service.js","client/js/src/mobile/trp/services/multiSectorSearchValidator.service.js","client/js/src/mobile/trp/services/pageStrand.service.js","client/js/src/mobile/trp/services/preferences.service.js","client/js/src/mobile/trp/services/pricing.service.ts","client/js/src/mobile/trp/services/priorityBoarding.service.ts","client/js/src/mobile/trp/services/recentHotels.service.js","client/js/src/mobile/trp/services/responseInterceptor.service.js","client/js/src/mobile/trp/services/review.service.js","client/js/src/mobile/trp/services/savedSearch.service.js","client/js/src/mobile/trp/services/shortlist.service.js","client/js/src/mobile/trp/services/sortCriteria.service.js","client/js/src/mobile/trp/services/trackingPixels.service.js","client/js/src/mobile/trp/services/urlStore.service.js","client/js/src/mobile/trp/services/voucherModal.service.ts","client/js/src/desktop/trp/controllers/agentMode/agentBookingForm.js","client/js/src/desktop/trp/controllers/agentMode/agentPaymentBox.js","client/js/src/desktop/trp/controllers/booking/flightCaptureCtrl.js","client/js/src/desktop/trp/controllers/flights/seatPlanCtrl.js","client/js/src/desktop/trp/controllers/holidayDeals/holidayDealsResults.controller.ts","client/js/src/desktop/trp/controllers/hotels/countryCtrl.js","client/js/src/desktop/trp/controllers/hotels/hotelsFilterCtrl.js","client/js/src/mobile/core/services/popup-services/basePopup.service.ts","client/js/src/mobile/core/services/popup-services/changeDurationPopup.service.ts","client/js/src/mobile/core/services/popup-services/confirmPopup.service.ts","client/js/src/mobile/core/services/popup-services/signUpPopup.service.ts","client/js/src/mobile/enhancements/core/directives/baseMap.directive.js","client/js/src/mobile/enhancements/core/directives/comboboxMkc.directive.js","client/js/src/mobile/enhancements/core/directives/flightLeg.directive.ts","client/js/src/mobile/enhancements/core/directives/flightListing.directive.ts","client/js/src/mobile/enhancements/core/directives/flightStops.directive.ts","client/js/src/mobile/enhancements/core/directives/infoWindow.directive.js","client/js/src/mobile/enhancements/core/directives/lightboxMap.directive.js","client/js/src/mobile/enhancements/core/directives/lightboxMapTrigger.directive.js","client/js/src/mobile/enhancements/core/directives/modalParkingDetails.ts","client/js/src/mobile/enhancements/core/services/clientMap.service.js","client/js/src/mobile/enhancements/flights/controllers/flightsFilterCtrl.js","client/js/src/mobile/enhancements/flights/controllers/flightsSortCtrl.js","client/js/src/mobile/enhancements/tr/controllers/HotelsSortCtrl.js","client/js/src/mobile/enhancements/tr/controllers/availabilityMapCtrl.js","client/js/src/mobile/enhancements/tr/controllers/hotelsFilterCtrl.js","client/js/src/mobile/enhancements/tr/directives/compactRoomGrid.directive.js","client/js/src/mobile/enhancements/tr/directives/focusTracker.directive.ts","client/js/src/mobile/enhancements/tr/directives/lightboxConfirmation.directive.js","client/js/src/mobile/enhancements/tr/directives/lightboxGallery.directive.js","client/js/src/mobile/enhancements/tr/directives/occupancyUnified.directive.js","client/js/src/mobile/enhancements/tr/directives/productExpander.directive.js","client/js/src/mobile/enhancements/tr/directives/selfDestruct.directive.js","client/js/src/mobile/enhancements/tr/directives/showHideText.js","client/js/src/mobile/enhancements/tr/directives/slidePanel.directive.js","client/js/src/mobile/enhancements/tr/directives/sortButton.directive.js","client/js/src/mobile/enhancements/tr/directives/sortDropdown.directive.js","client/js/src/mobile/enhancements/tr/services/hotelCoordinates.service.js","client/js/src/mobile/enhancements/tr/services/hotelRoom.service.js","client/js/src/mobile/trp/controllers/agent/agent.controller.ts","client/js/src/mobile/trp/controllers/attractions/selectedAttractionCtrl.ts","client/js/src/mobile/trp/controllers/auth/authCtrl.js","client/js/src/mobile/trp/controllers/booking/bookingCtrl.js","client/js/src/mobile/trp/controllers/booking/hotelOptions.ts","client/js/src/mobile/trp/controllers/booking/optionsCtrl.js","client/js/src/mobile/trp/controllers/booking/priceRefresh.ts","client/js/src/mobile/trp/controllers/dashboard/AmendBooking.ctrl.ts","client/js/src/mobile/trp/controllers/debug/debug.controller.ts","client/js/src/mobile/trp/controllers/flights/selectedflight.controller.js","client/js/src/mobile/trp/controllers/help/groupBooking.controller.ts","client/js/src/mobile/trp/controllers/help/specialAssistance.controller.ts","client/js/src/mobile/trp/controllers/holidayDeals/lastMinuteDeals.controller.ts","client/js/src/mobile/trp/controllers/holidays/departureCtrl.js","client/js/src/mobile/trp/controllers/holidays/holidaySearchCtrl.js","client/js/src/mobile/trp/controllers/hotels/childDestinationsCtrl.js","client/js/src/mobile/trp/controllers/hotels/hotelAvailabilityCtrl.js","client/js/src/mobile/trp/controllers/hotels/hotelLandingCtrl.js","client/js/src/mobile/trp/controllers/hotels/hotelSearchCtrl.js","client/js/src/mobile/trp/controllers/hotels/hotelsSitemapCtrl.js","client/js/src/mobile/trp/controllers/hotels/recentHotelsCtrl.js","client/js/src/mobile/trp/controllers/hotels/selectedHotel.controller.js","client/js/src/mobile/trp/controllers/marhaba/connectingAirportCtrl.js","client/js/src/mobile/trp/controllers/marhaba/flightTypeCtrl.js","client/js/src/mobile/trp/controllers/marhaba/marhabaAvailabilityCtrl.js","client/js/src/mobile/trp/controllers/marhaba/marhabaOptionsCtrl.js","client/js/src/mobile/trp/controllers/marhaba/terminalCtrl.js","client/js/src/mobile/trp/controllers/multisector/multiFlightCtrl.js","client/js/src/mobile/trp/controllers/parking/selectedParking.js","client/js/src/mobile/trp/controllers/shortlist/shortlistCtrl.js","client/js/src/mobile/bootstrap.js"],"names":["__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","__extends","extendStatics","setPrototypeOf","__proto__","Array","d","b","__","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","state","cookies","document","cookie","indexOf","undefined","window","TRPCONFIG","Domain","Domain2","ShortlistsEnabled","EnableSavedSearches","PayPalEnabled","RecentHotelsEnabled","MenuEnabled","SignInEnabled","ManageBookingEnabled","modules","DomainId","LiveChat","Enabled","SnapInEnabled","AccountsEnabled","QuoteEnabled","MarhabaEnabled","angular","module","DeviceType","concat","String","format","args","_i","replace","matched","parseInt","defineProperty","enumerable","configurable","str","o","a","r","Function","bind","thisp","_this","supportsExtendedYears","Date","parse","acceptsInvalidDates","isNaN","doesNotParseY2KNewYear","NativeDate","Y","M","D","h","m","ms","date","isoDateExpression","RegExp","months","dayFromMonth","year","month","Math","floor","key","now","UTC","string","match","exec","Number","day","hour","minute","second","millisecond","isLocalTime","Boolean","signOffset","hourOffset","minuteOffset","NaN","test","navigator","userAgent","addEventListener","pageYOffset","innerHeight","scrollHeight","scrollTo","TR","config","$routeProvider","$locationProvider","$httpProvider","$provide","$sceDelegateProvider","$compileProvider","popupAuth","routeModifiers","!","%","£","€","$route","$get","$on","when","path","route","routes","regexp","slash","option","optional","star","debugInfoEnabled","DebugInfoEnabled","resourceUrlWhitelist","CacheDistributionUrl","reHasQuery","reIsCmsRoute","decorator","$delegate","addVersion","url","CultureCode","isAgentMode","UserDeviceProfile","CurrentVersion","CloudFrontCachingEnabled","CloudFrontCachePartials","original","getTrusted","type","getTrustedResourceUrl","hashPrefix","hotelResolver","bookedEstabId","noop","hotel","bookingCopyResolver","booking","tripService","bookingService","restoreSearchUnit","current","params","tripId","trip","getBooking","BookingId","copy","forwardToManageYourBooking","operation","$location","$http","$routeParams","authService","currentUser","v1Redirection","loggingService","tenantId","bookingId","trackingTag","categoryId","domainTenantId","TenantId","user","get","authenticateBookingCallback","bookingSignInByAgent","anonSignedIn","_a","Contact","BookingSummary","v1Redirect","SID","SiteId","BID","SN","LastName","NAV","catch","err","logWarn","JSON","stringify","AnonSignedIn","SignedIn","post","getBookingFormTemplate","area","BookingFormV2OnAgentEnabled","isMobileSite","version","parseFloat","BookingFormVersion","BookingFormABTest","cookieVersion","decodeURIComponent","encodeURIComponent","IsMobileView","termsProviderTemplate","sup","forEach","suppliers","split","culture","transferRate","configureProductRoutes","product","redirectTo","templateUrl","analyticsTag","pixelTrackingPageName","reloadOnSearch","breadcrumb","crumb","controller","controllerAs","squash","flightSearch","hotelSearch","search","data","AvailabilitySearchId","template","$scope","resourceService","basketService","$emit","title","subtitle","loadingScreenStyle","startMultiDestHolidayWorkflow","hideDistractionLinks","AprilCampaignRoutes","ActiveSeasonalDeals","deal","Url","SeasonCode","LastMinuteDealsPageEnabled","noGroup","hideTravelAgentLinks","$window","searchUnitService","setDepartureAirport","item","setDepartureAirports","setTimeout","history","back","rerouteOldLandingPage","destinationService","urlUtils","$$route","getDetails","CountryId","countryId","ProvinceId","provinceId","LocationId","locationId","PlaceId","placeId","PolygonId","polygonId","EstablishmentId","fields","dest","stripLeadingSlash","PagePath","customerId","impersonatedSignIn","toUpperCase","setTrackingTag","quoteService","quoteReference","getQuoteByReference","quote","Error","UseIdBasedHotelUrls","landing","UrlRouteTesting","UseIdBasedUrls","hotelRehydrator","pageStrand","strand","fromRoute","hotels","estabId","adjustUrl","areas","commonRoutes","supportedProducts","SupportedProducts","products","none","flights","holidays","transfers","carhire","marhaba","parking","insurance","isSupported","createDesktopCookie","domain","setTime","getTime","toGMTString","redirect","authRedirection","authRedirect","DashboardBookingEnabled","HelpRoutes","inTransactionalFlow","hideFooterToolbar","ref","join","broker","publish","$p","HostName","desktopUrl","location","RedirectToDesktopUrl","PromotionTermsPageEnabled","basketStore","getTrip","all","BasketId","ppResp","scope","json","destination","$","attr","pd","k","CMSHomePageEnabled","strapLine","isResponsive","NewHomepageEnabled","bodyUncontained","SuperheroBannerEnabled","NewMobileHomepageEnabled","DynamicRoutingEnabled","otherwise","defaults","headers","common","html5Mode","run","$rootScope","analytics","cancellerService","cookieService","$injector","$templateCache","urlStoreService","put","pageLoad","absUrl","routeChange","SalesforceChatEnabled","salesForceSetCurrentUrl","showErrors","pushURL","ev","sessionStorage","getItem","vwoAbsUrl","vwoUrl","removeItem","utm_source","utm_medium","set","FeatureType","Hotels","Destinations","Booking","HotelsLanding","Flights","Holidays","AdaptiveBooking","AdaptiveHotels","AdaptiveFlights","AdaptiveHolidays","isPathAndFeatureTrue","nextPath","featureType","matchesPath","parasolEnabledFeatures","includesEnabledFeature","includes","parasolTestingFeatures","includesTestingFeature","testUserAuthenticated","ParasolVWOTestId","isPathAndFeatureTrueAcc","acc","TestingV3","EnableV3","isV2Request","gov","isOurMobileHostname","hostname","startsWith","IsCombinedViewMode","isOurLocalDevHostname","isAdaptiveBookingCompleteRoute","reduce","isAdaptiveRoute","MetaTrafficIds","isntMetaTraffic","currPath","adaptiveBookingFlags","preventDefault","href","selectedOptions","supportedOptions","allOptionsSupported","intersection","isBookingOptionalExtraTrue","getUser","rl","reload","process","Agent","IsAgentDomain","$evalAsync","Dest","AgentLogonUrlDest","requiresHardAuth","requiresAnonAuth","HardSignedIn","bufferRoute","redirectUrl","configOuter","http","errInterceptor","customHttp","handleErrorCallback","prop","name","ignoreErrors","customErrCallback","_customHeader","x-callback","addErrCallback","extend","$inject","ekhConfig","quoteConfig","AllowAgentManageQuote","dashboardConfig","dashboardEnabledConfig","dashboardDisabledUrl","dashboardDisabledReferenceUrl","dashboardEnabled","map","amendResolver","canAutoRebook","CanAutoRebook","BookingRef","LeadPassengerLastName","dashboardBookingService","getMybBooking","pick","bookingNotYoursId","DashboardHomeEnabled","bookingPeriod","DashboardMobileEnabled","hideSiteFooter","MybHideFooter","hideSiteMailingListSignUp","PaybalanceV2Enabled","DashboardReviewsEnabled","action","DashboardSettingsEnabled","FlightCheckinEnabled","DashboardAddBagsEnabled","DashboardAddSeatsEnabled","DashboardAddAPIEnabled","pageId","componentId","liveChatService","initialise","Core","SeoKnowledgeGraph","$sce","$filter","$element","vm","checkValue","validValue","ShowJsonLdHomepage","el","baseUrl","addressLocality","postalCode","streetAddress","addressCountry","image","logo","telephone","contactType","socialNetworks","sameAs","schemaType","address","contactPoint","generic","addressCompacted","contactPointCompacted","genericCompacted","ldJson","homepage","innerHTML","trustAsHtml","logoPath","pickBy","@context","@type","onGetJson","directive","restrict","bindToController","ld","Device","LangSwitcher","CMS","Payment","QuoteManager","Dashboard","ekh","Insurance","liveChatModule","Quote","QuoteCreator","Search","SearchUnit","Area","DeepLinkController","deepLinkService","searchQueryString","reqParams","getDeepLinkQSParams","getSearchDeepLink","deepLinkUrl","pathnameWithoutCulture","parseFullUrl","$apply","DeepLinkConfig","attractionDetailsService","$cacheFactory","$q","timeout","cacheLabel","promiseCache","imageUrl","AttractionsImageUrl","enhanceData","AttractionIds","AttractionRequests","getAttractionDetails","productDetails","defer","promise","res","remove","DetailsSearchId","getImageUrl","id","rehydrate","detailsSearchId","purge","removeAll","CarHire","arrayUtil","carHireDetailsService","extraProductsService","scrollService","deferred","optionOperation","ch","_missingFrom","src","dst","forall","filter","o1","any","o2","equals","optionId","OptionId","ChosenQuantity","_normaliseCarHireOptions","bo","carHireId","carHire","noneCarHire","currentCarHireLimit","carHireLimit","DriverAgeConfig","Min","Max","driverAgeList","createRange","basketId","TripId","carHireSearchId","CarHireRequest","onewayonly","FlightsRequest","OneWayOnly","carHireDriverAge","DriverAge","productId","rules","carHireOptions","results","Details","CarHireId","CarHireCode","basketRules","CarHireEnabled","CarHireMobileEnabled","$watch","debounce","val","oldVal","carHireBusyAvailability","processResults","carHireQuotes","options","sort","first","q","appendDetails","carHireSelectedOptions","getCarQuotes","quotes","getCarQuotesFromSession","_selectCar","optionsWatch","restartHolidayWorkflow","$event","each","viewDetails","busy","getCarDetails","CarHireQuote","showDetailsError","hideDetails","showMoreOrLess","moreCarHireQuotes","animate","offset","selectingCar","carHireQuote","c","carHireQuoteDescription","Description","Price","_updateSubtitle","removeCar","updateBasketAndCarHireOptions","selectCar","old","basketOptions","boNormal","updateCarHireOptionsInBasket","removeOptions","addOptions","selectOptions","storeFn","productType","updateBasket","bookingAlreadyDone","filterQuotes","carHireService","request","req","Currency","CurrencyCode","startTimer","endTimer","recordCarHireSearch","CarHireQuotes","stringifyOptions","details","AdditionalOptions","CarHireQuoteId","status","dealsSearchUnit","holidayDeals","sharedSearchUnitService","dateUtil","addDelayedLinker","currentArea","getAreaInfo","areaOverride","_restoreSearchCriteria","noWatch","getFullParameters","writeToUrl","airports","depAir","Code","setMultipleDepartureAirports","startDate","mode","duration","occupancy","refresh","_autoStartSearch","tracking","parseDate","getMonth","getFullYear","_trackChange","Adults","Children","ChildAges","size","newValue","oldValue","track","durations","DURATIONS","airportDeselect","clearDepartureAirports","airportsCodes","Nights","DepartureAirports","TypeTitle","FromDate","Rooms","occ","childrenNumber","decodeURI","DesktopUrlRoot","childAges","isValidOccupancy","every","ca","_validateParameters","param","position","scrollTop","newSearch","listener","_refreshSearch","serialiseParameters","_startSearch","noButton","hideButton","pickMonths","ldp","link","subscribe","isOnScreen","container","unsubscribe","initializeArea","insuranceSearchUnit","occupancyService","ssu","model","policyTypeSelect","setPolicyType","policyType","travelDestinationSelect","setTravelDestination","travelDestination","selectedPolicyExtras","policyExtras","Selected","Id","Name","setPolicyExtra","endDate","addDays","setOccupancy","lockScreen","getTravelDestination","getPolicyType","reduceOccupancy","getPolicyTypes","policyTypes","getTravelDestinations","travelDestinations","getPolicyExtras","constant","defaultSort","defaultOrder","oneWay","ascSuffix","descSuffix","qs","Hotel","CancellationProtection","AgentCorrelationId","agentModeService","getDebugSettings","debugSettings","enableSearchTracing","availabilitySearchId","hotelAvailabilitySearchId","AgentNetInfo","agentNetInfoService","displayToolTip","currency","enabled","enabledAreas","AgentNetInfoEnabledAreas","some","createToolTip","populateToolTip","hasRequiredValues","dataLoaded_1","prev","netValues","populateNetValues","showToolTip","Cost","Value","vat","Type","markdown","AgentNetInfoHotels","showTaxes","AgentNetInfoTable","commissionType","showTax","Autocompleter","AutocompleterField","prefix","showLoading","initialData","debouncedFetch","fetch","minPrefix","AutoCompleterMinPrefix","init","change","update","addHeader","arr","resourceName","Title","header","deselect","getArea","allowedZeroInput","AllowZeroInputDestinationAutocompleter","autocompleter","initialDepartureAirports","lookup","filterFunction","AirportMultiSelect","_super","available","selected","_resetSelected","flattenDeep","selectAttrFn","select","selectItem","items","prefilled","prefill","code","_placeholder","placeholder","notActive","DefaultStaticAirportLabel","_refreshData","isEmpty","codes","item1","find","item2","_selectEachCode","splice","_getAvailable","sharedTitle","selectedCodes","currentValue","focusTracker","disabled","transclude","ac","inputField","AirportMultiSelectUnified2","$timeout","isCodeSelected","titleCache","blur","elements","input","prefix_1","toLowerCase","individual","firstItem","focusOnInput","focus","firstTitle","extraFocusTrackerFocused","getTitle","airport","formatTitle","getAirport","iconName","attrs","field","BookingExtrasCarHireOption","quoteId","selectable","BookingExtrasOptionOld","_checkSelected","click","event","group","price","perPerson","pricePerDay","isDelta","pricePerPerson","priceFull","included","priceRounded","BookingFormHeader","tripHeading","resource","TripType","tripTypes","Holiday","Flight","flight","Transfer","transfer","Parking","Attractions","Marhaba","detail","BookingSummaryBreakdown","total","canonicalDirective","$document","eventData","head","getElementsByTagName","linkTag","targetUrl","fid","rel","datepickerMkc","datepicker","tScope","$parent","dateEl","currentDate","on","which","fadeOut","off","require","DeviceMeta","substr","querySelector","content","DiscountMessage","message","FlightBookingSummary","getTripOccupancy","getCostBreakdown","updateFlightInfo","totalCost","costBreakdownGrouped","isAtolProtected","attractionCost","attractionsCost","atolAvailable","cb","flightCost","atol","costBreakdown","atolCost","UnitAmount","Quantity","extrasCost","extras","extrasBreakdown","carHireExtras","carHireExtrasTotal","extra","nights","Itinerary","showDetails","getTotalPeopleCounts","cardFeeForTotal","element","templateVersion","HotelList","imageService","hotelImageIndex","hotelImages","ready","showHotelImages","spinnerId","watch_1","selectHotel","openImageGallery","hotelId","photoCount","w","DeviceSettings","HotelImageMaxWidth","HotelImageMaxHeight","l","getHotelUrl","removeHotel","LanguageSwitcher","languageService","menu","toggle","setLanguage","lang","RedirectLanguageChangeToHomepage","LoaderPanel","ManySelect","remainingOptions","difference","iconClass","MonthPicker","origin","showSelectors","range","todayPlus","onSelectorClick","stopPropagation","onInputClick","preventClose","isNoIndexFollow","pauseCall","structure","overlay","createElement","className","appendChild","messageContainer","style","display","_createStructure","_pollingStatus","extensions","agent","PhoneNumbers","_bringInFocus","checkExtensionStatus","exists","_addMessages","messageText","_tryToPause","_hideOverlay","actionText","actionHandler","_tryToResume","errorString","_forceContinue","resumeCall","logFatalError","css","lastChild","removeChild","ii","curr","textContent","onclick","ScrollToTopWhen","eventName","AgentNetInfoService","costTypes","AdultReturn","AdultTaxAirlineFees","commissionTypes","Commission","Markup","calculationItemTypes","ExchangeRate","ClientExchangeRate","Rounding","SupplierNetRate","SupplierGrossRate","SupplierBindingPrice","Vat","PriceAdjustment","Promotion","Markdown","modes","HotelInfo","requiredProps","markup","hotelinfo","_parseHotelData","_parseFlightData","_parseMarkupData","_parseHotelInfo","_getDefaultValues","_validate","CommissionAmount","CommissionPercentage","Tax","TaxCommissionAmount","TaxCommissionPercentage","TotalGross","CommissionType","props","showNegativeValues","isArray","has","hasProp","commission","_calculateValue","CommissionCurrency","_getCurrencyCode","commissionChanges","PercentChange","Cancelled","firstChange","commissionChangeTotal","supplierRate","supplierPrefs","index","supplierPref","supplierRateValue","SupplierCurrency","_calculatePercentageAmount","totalGross","totalGrossValue","ceil","clientExchange","exchangeRate","exchangedGross","markdownValue","TotalGrossCurrency","outputVat","OutputVat","OutputVatCurrency","_formatAsDecimals","AgentToolTip","TotalCommission","commissionMarkup","_getMarkup","_calculateCommission","Amount","Percent","taxMarkup","taxcommission","supplierNetRate","supplierGrossRate","supplierBindingPrice","activeRate","ExchangeRateTotal","ExchangeCurrency","Markups","DepartureStartDate","DepartureEndDate","Promotions","PriceAdjustments","percentage","costType","AdditionalInfo","CommissionPercent","MarkupAmount","MarkupPercent","Priority","Legs","leg","MarkupsApplied","rate","amount","percent","commissionPercentage","commissionAmount","markupPercentage","markupAmount","defaultValue","mapValues","isInteger","toFixed","_toNearest10","service","crossSellService","crossSellCommonService","enumService","flightExtrasService","crossSellKeyByProductType","1","2","4","8","16","32","maxCrossSell","maxSameType","getBookingCrossSell","processData","getTripCrossSell","getCrossSellProbability","productTypes","getBasketCrossSell","Product","Probability","ProductProbability","ProductProbabilityCarHire","ProductType","ProductProbabilityTransfer","startCrossSellJourney","crossSellProduct","addExtrasAndCrossSells","tr","crossSells","addBaggage","updateTripWithCrossSells","crossSellProducts","crossSellToReplace","cs","_mergeExtrasAndCrossSells","flightBooking","Bookings","getExtrasCrossSell","ab","crossSell","filteredCrossSell","simplifiedCrossSellList","counter","Priorities","priorities_1","sortBy","Order","times","productToDisplay","CrossSells","productTypeProperties","merge","omit","assignIn","Image","getMainImageUrl","EstabId","Attraction","getCrossSellImage","AdultPrice","CarPark","filterCrossSellByPriority","roundedCurrency","factory","PostBookingLookup","getSignedInBookingId","BookingActionLink","actionLinks","VIEWBOOKINGDETAILS","CHANGECONTACTDETAILS","CANCELBOOKINGS","CreateCSRToCancelBooking","CSR","DisableFAQs","MANAGEPASSENGERDETAILS","PRINTVOUCHER","PRINTRECEIPT","PAYBALANCE","ONLINECHECKIN","VOUCHERACTIONS","AMENDBOOKING","CreateCSRToAmendBooking","EnableAmendBookingV2","ENTERAPI","ENTERREVIEW","ADDBAGGAGE","ADDSEATS","DERWENTLINK","DerwentUrl","PRINTINVOICE","NotificationLink","notificationLinks","3","6","V1Redirection","routeParams","CSRID","_loadBooking","mybPath","siteId","surname","loadV1","success","secureId","getBookingDetail","PackageId","HolidayDealsPromo","filtering","holidayDealsPromoService","getInfoPromo","info","summary","blocks","flags","searchUnit","clicks","holidayType","budget","toggleSearchUnit","goToDeals","Budget","Clicks","Loading","insuranceService","cm","docPaths","getDocumentPaths","PolicyWording","Disclosure","InsuranceProductInformation","parent","hide","attachLightbox","BookingProcessId","TermsData","Suppliers","TransferRateId","termsUrl","selectedImportantInfo","showImportantInfo","importantInfoContent","accordion","show","AgentAutofill","fillInformations","bookingInfo","AutofillBasicContactInfo","fillBasicInformations","keys","handleErrors","errorMessage","getBookingContact","BoardTypeFilter","titles","5","agg","boardArr","minBy","MinPrice","people","getNumberOfNonInfantPassengers","isSet","reset","more","showAll","showMoreLess","aggregate","limit","priceMode","BoardTypeFilterLabel","boardType","getName","getTemplate","board","ChildDestinationFilter","destArray","min","cheapest","ChildDestinationFilterLabel","destinations","changeHotel","handleChangeHotel","breadcrumbTrail","nth","ClickTripz","loaderService","ClickTripzProviders","source","getElementById","getTripNumberOfNights","numberOfNights","ClickTripzNumberOfNights","loadJS","ClickTripzURL","CruiseListing","gotToCruise","_trackClick","open","cruise","ShipName","LineName","CruiseLineName","DirectPaymentInformation","keyMap","conversion","noConversion","hasFootnote","directPaymentCaveat","payment","localCurrency","localAmount","getText","paymentAmount","paymentData","showDirectPayments","FacilitiesFilter","limits","showPrice","groupArray","elementArray","facLimit","htLimit","clone","FacilitiesFilterLabel","grouped","_getNameGrouped","filterValue","allowInit","deregisterFns","deregisterAll","fn","ngModel","fieldImport","formCtrl","remoteField","updateField","submittedForm","lastParent","$submitted","$$parentForm","$pristine","is","allowedVals","allowedStr","enforceMatch","$setPristine","$modelValue","FiltersBox","updateFilters","enabledFilters","filters","serialiseFilters","showFilter","aggregates","FiltersLabels","isDisabled","inputClass","form","scroll","preFlight","noClass","onClick","$valid","$broadcast","parents","selectors","target","ngForm","closest","hasClass","buttonClass","$click","tripType","findKey","labelForJourney","showMoreText","showLessText","hideable","showMore","less","compile","$elem","ShowMinimalHeader","elem","isMatchedPath","abtesttUrl","$$path","classList","add","$el","initHideMenu","elClassList","menuBarEl","headerEl","headerNextElementSiblingEl","mastHeadMainEl","hasShadowClass","hasHiddenMenuClass","hasHiddenClass","mastHeadMainElClassList","headerNextElementSiblingElClassList","mastHeadCss","menuBarCss","HideMinimalHeader","contains","nextElementSibling","onload","_vwo_evq","HolidayDealPromoListing","$overlay","$iconOverlay","getLabel","_toggleOverlay","fadeIn","img","HotelReviewsBrowser","pagingService","reviewService","showReviews","pageReviews","page","getReviews","selectedHotel","reviewPaging","CustomerRatingCount","loadingFirstReviews","reviewsShowing","reviews","HotelStats","urgencyMessaging","toaster","UrgencyMessaging","stats","msgs","CurrentViewsText","LastBookedDateText","msg","enableReviews","isPrerender","reviewsEnabled","ReviewsEnabled","images","itemCarousel","thumbCarousel","cms","cancel","cmsImageUrls","CmsImageUrls","altText","thumbUrl","mainUrl","backgroundImage","background-image","_b","Location","Location_1","_c","Province","_d","Country","NumberOfPhotos","initCarousel","checkWidths","hotelListings","querySelectorAll","slickTrack","originalStylesArr","originalImageWidthArr","getAttribute","slickWidth","width","imgMaxWidth","max","slickActive","SlickTrackWidth","SlickTrackImgWidth","imgCount","slick","rtl","Rtl","asNavFor","speed","prevArrow","nextArrow","infinite","currentSlide","nextSlide","minSlidesToShow","centerMode","focusOnSelect","slidesToShow","swipeToSlide","variableWidth","stripAndParse","linkUrl","isSignedIn","if","localforage","hideTs","close","ttl","monthMs","setItem","Occupancy","maxRooms","maxAge","multiroomDisabled","hideGroupBookingLink","timer","OccupancyLimits","wrapper","inp","initPos","my","of","at","collision","updateOccupancy","occupancyString","getOccupancyString","getRoomOccupancyString","ages","MaximumChildAge","getAdultsLimit","memoize","firstRoom","maxAdults","getChildrenLimit","maxChildren","rooms","showOccupancyWrapper","showWrapper","_hideOccupancyWrapper","isChild","switchWrapper","changeRooms","room","$parse","$attr","openNewTab","defaultTitle","pageTitle","resources","PriceFilter","setRange","updateModel","PriceFilterLabel","currencySymbol","currencyFilter","end","priceSentence","sentenceMin","sentenceMax","navBarContentElement","addClass","removeClass","$listItemsWithSubMenus","$subMenuLinks","IsTouchDevice","$listItem","currentTarget","one","e2","hoverTimeout_1","hover","clearTimeout","PropertyTypeFilter","propArray","PropertyTypeFilterLabel","pt","publicityService","getStats","StatisticTypes","publicityData","RatingFilter","RatingFilterLabel","sentence","ReviewSnippetBrowser","$interval","$locale","eventNamespace","slickOptions","slidesToScroll","autoplay","autoplaySpeed","initSlick","stopTrying","carousel","children","scrollIntoView","$attrs","showLessbutton","showMorebutton","seoListsPanel","seoListsContainer","configTimeout","configDelay","removeOpen","wait","handleScrollToView","scrollToSeoListContainer","handleError","console","log","delayRemoveOpen","shortlistToggle","shortlistService","isHotelShortlisted","shortlisted","inShortlist","toggleShortlist","toggleHotel","SimpleImageGallery","directions","LEFT","RIGHT","gallery","leftArrow","rightArrow","slider","arrowSize","height","arrowCss","font-size","top","_setPadding","left","imageNumber","_slide","_handleTouchStart","_handleTouchMove","pad","touchStart","touches","clientX","touchEnd","changedTouches","diff","abs","dir","move","selectedImage","last","before","after","StarsFilter","ordered","stars","toString","Count","StarsFilterLabel","unrated","singular","plural","TextFader","showContent","showExpanderLink","contentHeight","ctrl","outerHeight","placement","popup","tooltip","trppopup","trigger","destroy","tooltipClass","mouseover","tagName","tooltipUi","TrustpilotLogo","TrustpilotService","getBusinessUnit","count","class","altLogo","hostName","append","validationService","priority","rootForm","msgMap","immediate","stayActive","immediateTest","doNow","$error","lastFocused","focused","showErrorsdob","$name","watcher","$invalid","validationErrors","translateField","translate","FormField","Inputs","Field","addValidationObjectToField","addChildField","addInputField","errorMessages","isValid","getInputFields","isFocused","ValidationSummary","Focused","wasPreviouslyFocused","PreviouslyFocused","ValidationMessage","labels","watchers","labelStrings","formElement","_loop_1","name_1","this_1","formField","focusHandler","blurHandler","ele","focusin","focusout","fieldNames","alwaysWatch","active","updateValidationStatus","allValid","errors","errorClassName","successClassName","valid","forOwn","translateFieldLabel","inputfields","invalid","uniq","alwaysWatchFields","waitFor","formEl","watch_2","ValidationStatus","_loop_2","name_2","this_2","transform","InlineErrors","cssAutoWidth","watch_3","vs","jQuery","widget","fadeSpeed","easing","clickOffToClose","_create","$lightbox","$stage","$loader","isShown","_show","_createLightbox","self","appendTo","proxy","_trigger","_hide","_getContent","html","callback","response","_destroy","Trppopup","$popup","enter","hideOnBlur","checkKeydown","checkClick","leave","$target","keyCode","setContent","opacity","_popup","getPosition","offsetWidth","offsetHeight","getContent","popupTemplate","variant","$this","Constructor","breadcrumbDetailsService","getClasses","bc","currentCrumb","isFlightPreselected","0","getDeferred","10","20","21","25","30","35","40","50","getCrumbs","Deal","SelectedFlight","IsHotelFirstJourneyEnabled","HotelsRequest","Destination","HotelCount","getTextShort","apiRootUrl","TrustPilotId","apiKey","TrustPilotAPIKey","getJsonp","jsonp","cache","isObject","Attractions_1","attractions","attractionsAvailabilityBusy","attractionSearchId","AttractionRequest","subTitle","attractionQuotes","AttractionId","ShortTitle","attractionsDescription","attraction","occupancyMap","AttractionsExtraEnabled","AttractionsExtraMobileEnabled","flightDate","dayDiff","MinDaysBeforeDeparture","isHotelJourney","getAttractionQuotes","hasAdult","cheapestAttraction","Prices","stopAttractionWatch","_attractionsWatch","oldval","selectedOriginal","attractionId","attrOcc","attrOccu","putAttractionExtras","cost","attractionsTotal","removeAttraction","Adult","Child","Infant","toggleResults","showResults","showInformation","informationRequested","informationLoaded","viewInformation","informationPath","viewWhatsIncluded","viewResults","BasketItem","responseData","attractionService","Changes","Totals","Validity","orderTickets","updateTotals","setDates","onChange","changes","order","Tickets","Key","flushChanges","dates","getLineItemDates","SelectedDate","from","to","AttractionsBasket","totalPrice","initialising","loading","error","debouncedUpdate","getAttractionsBasket","basket","setBasketItems","LineItems","lineItems","lineItem","ticket","oldV","updateTotalPrice","updateAttraction","LineItemId","Basket","removeAttractionsLineItem","book","bookAttractionsBasket","AttractionsBasketModal","modalService","continueShopping","viewBasket","AttractionsHeaderPanel","productService","debouncedUpdateTeaserPrice","updateTeaserPrice","chooseAgainUrl","qsTags","Tags","productData","getTeaserPrices","resKey","teaserPrice","panelTitle","AttractionsProductForm","attractionSearchValidator","cmsUtils","stepsData","priceData","formModel","dateLimits","initialised","infoModal","infoText","normalisedValues","areaInfo","fetchCriteria","startDateMin","activeDateFrom","throttledUpdateTotalPrice","throttle","throttledUpdatePrices","updatePrices","changeField","initTimer","getProductFormCriteria","Steps","mapNormalisedValues","Fields","Info","ResourceKey","setPriceData","initField","fieldKey","allowUnknown","isUpdate","existingVal","getMatchedValue","publishUpdate","fieldChangeHandler","affectsPrices","Data","normaliseValue","isDateMatch","d1","d2","getAvailability","Dates","validate","startWorkflow","flow","productTags","launch","getProductTotals","AttractionsSearch","unwatchInit","selectedData","trackAttractionSearch","searchId","Route","showError","automaticSearch","Results","SearchId","ShowBeforeOrAfter","ThemeParkCombo","showMobileFilters","pricesSorted","afterDateVal","afterDate","isAfterDate","hasItems","checkIsAfterDate","comboFilters","Both","After","getItems","comboItems","selectedParkIds","checkedFilters","beforeOrAfterItems","Before","filteredItems","filterId","ParksIncluded","pow","parkId","parkFilterId","getFilters","slice","getFilter","num","hasFiltersSelected","getSelectedFilters","hasIncludedParksToDisplay","showIncludedPark","includesPark","comboItem","includesParkClass","apiUrl","itemId","itemName","SelectedItemId","SelectedItemName","getProductName","tags","setDate","setHours","totals","getLineItemChanges","basketData","changeData","Change","Modified","modifiedItem","basketItem","modifiedData","modificationType","basketTicket","recordAttractionSearch","AttractionQuotes","getAttractionQuotesFromSession","getOccupancy","getTripReducedOccupancy","Age","age","validity","From","To","sameDay","getAttractionsDesc","attractionDetails","desc","prefDate","ProductId","attractionIds","CostBreakdown","PreferredDate","AttractionSearchValidator","uiCountTotal","component","bindings","heroStyle","sale","mh","showHero","supportsHeroStyle","supportsSalesStyle","SupportedProductNames","heroes_1","heroKeys","heroes","isString","properties","observable","CmsComponent","inView","lazy","componentName","observer","IntersectionObserver","intersectionRatio","unobserve","rootMargin","observe","modal","rc","description","keywords","robots","selector","CmsUtils","reWhitespace","propsMatch","srcOb","matchCount","srcKeys","propsKeys","pi","si","normalisedKey","normalisedVal","AdHoc","DurationUnitSingular","DurationUnitPlural","BookingStatus","PassengerType","DriverType","CreateBookingStatus","RecentSearchType","CrossSellType","ManageBooking","TripStage","BookedTrip","DaysUntilDeparture","DaysUntilReturn","Duration","MainBookingId","PaymentDetails","Balances","Paid","PayDirect","Outstanding","Total","BalanceDue","DirectPayment","LocalAmount","FuelPolicyType","FuelType","SortOrder","Customer","CrossSellOption","crossSellType","priceIsPerPerson","PriceIsPerPerson","TeaserPrice","CrossSellProductOption","ImageUrl","ProductDetails","CrossSellHotelOption","DashboardTileType","CrossSellFlightExtraOption","DestinationType","DetailsResponseCode","SortCriterion","FareType","OptionalExtraGroupType","Cabin","GroupType","BoardType","SupplierDiscountType","AwardType","BookingPath","BoostReason","BookingInfoItemType","ItineraryType","BookingType","QuoteProductType","CreateQuoteResponseCode","Trip","BookingComplete","_initPage","payLaterEnabled","BuyNowPayLaterEnabled","pl","bookingSummarySurname","HideBookingRefOnConfirmation","paypal","tripData","purchaseData","dataLayer","lightboxOpened","manageBookingStarted","DynamicRouting","minimalRoutes","numberOfAirlines","AirlineCount","numberOfHotels","EstabCount","bookingsLastHour","BookingsInLastHour","customersCurrentlyOnHoliday","CustomersCurrentlyOnHoliday","reviewCount","ReviewCount","searchesInLastHour","SearchesInLastHour","villaCount","VillaCount","minimal","re","CmsPageProps","$onInit","pageName","showUSPpopup","MultiSectorFlight","isSameCarrierOnAllSegments","flightSector","Segments","CodeshareAirlineName","CarrierName","showModalFlightDetails","legs","AbTestSelector","bindableTests","tests","CookieName","numArray","AddFlightDetailsModal","mandatoryTransferService","getTransfers","roomInfo","Extras","includedTransfer","findSelectedTransfer","IncludedExtras","flightDetails","roomId","priceId","multipleRoomMode","totalNonInfants","roomCost","TotalCost","roomsWithTransfers","transferExtras","mandatoryTransfers","Availability","RequestedRooms","continueToBook","generateOptionsForMultiRooms","generateMandatoryOptions","AtolCostBreakdown","killTheWatch","$watchCollection","costs","groupBy","atolProtectedCosts","otherCosts","sumCosts","atolSubTotal","setClientCurrencyCode","sum","ClientCurrencyCode","clientCurrencyCode","getCurrency","totalLabel","atolSubtotalLabel","AutoSearch","unifiedSearchService","queryParams_1","splitQs","enhanceLegacyDestination","LegacyType","LegacyId","requestModel","getDefaultModel","getQueryStringValues","queryStringValues","requestParams","populateSearchUnitService","autoSearch","Autocompleter_1","setPrefixDebounced","titleProp","setFocus","_groupHotelResults","AutocompleterRecommendations","houseRecommender","acMethods","parentCtrl","_wrapAcMethod","load","allow","_unwrapAcMethod","ac_1","destTitle","trackHouseClick","getHouseRecs","dests","searchable","isHoliday","holidayEnabled","recommendationType","EstablishmentCount","estabCount","method","autocompleterCtrl","acr","BaggageOptions","bagOptionsWatch","maxBagsSelectable","bagOptions","bag","bagsTeaserCost","holdBaggageWeight","UnitWeightKg","DashboardHoldBaggageWeight","updateBaggageOptions","selectedBagOptionsRaw","bagsSelected","flightBaggageTotal","sumBy","selectedBagOptions","so","handBaggageInformation","baseStaticMap","$compile","currentDestination","mapLabel","hotelStaticMapService","maps","zoom","hideLabels","loadScript","_linker","Label","google","infoWindow","InfoWindow","buildMap","showModal","Map","ZoomLevel","scrollwheel","overviewMapControl","center","LatLng","Latitude","Longitude","mapTypeControl","streetViewControl","scaleControl","addListenerOnce","setCenter","addListener","getZoom","loadedBounds","getBounds","sw","getSouthWest","ne","getNorthEast","lng","lat","getMarkers","visible","_clearLabels","points","point","X","N","T","markerLabel","text","clickHandler","hotelClickHandler","clusterClickHandler","generateLabels","Markers","B","Y1","X1","Y2","X2","bds","LatLngBounds","fitBounds","$new","getCurrentDestination","BasicContentCard","contentCardClass","tElement","tAttrs","posts","raw","imgStyle","imgFeatured","blogSummaryText","blogEntryContent","blogText","blogElipsis","imgSrc","heading","BookingExtrasOption","showFrom","showTotal","priceTotal","hotelFromSession","taxationService","costBreakdownCodes","isMultiDestHoliday","cityTaxTypeId","voucherDiscountMsg","Message","voucherSuccessMsg","isDiscountMsgPositive","mandatoryTransferTypeId","hotelExtrasTypeIds","mandatoryTransfersCost","changeFlightEnabled","getProductInfo","isUndefined","cardFeeForDeposit","showContinueButton","continueToNextStep","usePackageRates","packagePrice","modifyEssentialsRoute","priceDifference","quoteRef","quoteNo","hotelFromBasket_1","getHotel","updateHotelInfo","flightCostBreakdown","extraCostItems","roomCostItems","LinkId","updatedRoomCostItems_1","RoomId","RoomDescription","updatedExtrasCostItems","ParentId","splitDescription","costsSortedById","hotelCostBreakdown","TypeId","hotelExtrasCostBreakdown","totalDiscount","totalDeposit","payDirectTotal","hotelCost","currentHotel","cancellationProtection","tax","hasDeposit","depositAllowed","hasPayDirect","editEssentials","passengers","modifyEssentials","currencyCode","showAncillaries","TransformedType","AttributeTypes","ONE_SEVEN","ONE_TEN","TWO_SEVEN","ONE_TWO_THREE","TWO_TWO_THREE","TWO_THREE_TWO","BrandedFareTypesService","guidService","allPayloads","sentApi","brandedFares","flightMilesToPkgPP","brandedFareType","flightSectors","FlightSectors","fs","_getTransformedType","BrandTitle","BaggageType","_getBaggageType","BaggageText","getBaggage","CabinBaggageText","getCabinBaggage","ChauffeurText","getChauffeur","SeatsSelectionText","getSeatsSelection","brandedFareTypePrice","getBrandedFareTypePrice","setSkywards","BrandedFareTypeTotalPrice","squeeze","brandedfareTypes","curBf","lastBf","sectorFirstEqual","_isEqualFlightSectors","sectorSecondEqual","getCabinName","classes","addCabinType","CabinType","cabinType","oneFs","secondFs","propName","TotalAmount","_getPricePerPassengerAge","priceQuantities","getCancellationCharges","payload","error_1","Headers","Content-Type","sector","BaggageAllowanceTotalKg","_getAttribute","Baggage","checkedMatcher","Text","cabin","_getCabin","isEconomySaver","EconomySaver","isEconomySpecial","EconomySpecial","isPremiumEconomyFlexPlus","PremiumEconomyFlexPlus","AttributeInclusionType","setCabinBaggage","CabinBaggage","isRestrictedSeats","SeatsSelection","BusinessSpecial","containPieceBaggageConcept","fareTypes","sectorNumber","calculateTotalFares","fare","qtys","AdultFare","AdultFareQuantity","ChildFare","ChildFareQuantity","InfantFare","InfantFareQuantity","calculateTotalTaxes","AdultTax","AdultTaxQuantity","ChildTax","ChildTaxQuantity","InfantTax","InfantTaxQuantity","getPriceQtys","AccruedMiles","Miles","setPriceDifference","defaultPrice","farePrice","priceDiff","BrandedFarePriceDifference","getPriceDifference","undefinedIndexes","IsSelected","j","getDepartureCode","LegType","DepartureAirport","getDestinationCode","ArrivalAirport","getDepartureDate","DepartureDate","collatePayloads","domainId","elemCount","theCall","callMilesApi","flightsSkywards","error_2","payloadEntry","tripHotel","pid","uuid","bookingDate","serialiseDate","departureAirportCode","departureDate","estabGroupIds","EstabGroupIds","checkInDate","CheckInDate","languageCheck","getCabin","fareBrandLeg","cabinLeg","legArr","updatedLegArr","getCabinCode","getFlightMiles","cabinCodeLeg","journeyType","fareBrandLegResult","getMilesFromCouchbase","miles","earn","skywards","skywardsMiles","getFareInfo","fareOrLegsSelection","fareOrLegsAndBrandtitles","bft","getBrandTitleFirstLeg","getBrandTitleSecondLeg","fareBrand","fareBrandResult","cabinCode","cabinTypeFirstLeg","cabinTypeSecondLeg","fareBrandFirstLeg","fareBrandSecondLeg","updatedFirstLegArr","updatedSecondLegArr","fareBrandFirstLegResult","fareBrandSecondLegResult","cabinCodefirstLeg","cabinCodeSecondLeg","skywardFlightMileForFirstLeg","skywardFlightMileForSecondLeg","attrType","BrandAttributes","AttributeType","brandTitle","trim","EconomyFlex","EconomyFlexPlus","BusinessSaver","BusinessFlex","BusinessFlexPlus","FirstSaver","FirstFlex","FirstFlexPlus","NotDefined","getClassName","fc","classObj","F","A","Z","J","C","I","O","H","W","E","R","U","K","Q","L","V","G","S","coKey","getBookingClassName","_setClassName","BrandedFare","brandedFareTypesService","collected","guid","hts","skywardsPoints","getPackage","classNameIn","classNameOut","selectButtonLabel","selectedButtonLabel","totalHolidayPrice","onSelect","oldPrice","FlightFare","intvl","setInterval","clearInterval","getCancellationDetails","cancellation","BrandedFareCancellations","getCancellations","charge","BrandedFareCancellationCharge","BrandedFareCancellationDate","formatedDate","_cancellationDateFormat","displaySkywards","displayTotalPkgFlightMiles","SkywardsFlightMiles","selectedFlight","baseCost","totalFares","packageCost","accruedMiles","fareAndFlightSelectors","fareAndFlightAndBrandtitles","baseCostTotal","TransferPrice","getPriceDelta","dif","selectedFareTotalPrice","round","getSeatsSelectionTooltipText","isSameClass","tripBound","fareClassArr","x","FareClass","SupplierFareClass","titleHeader","bound","splitText","toolTipText","fsParse","DepartureAirportCode","DestinationAirportCode","segments","segmentText","getCultureCode","ar-ae","MONTH","de-de","dk-da","en-gb","it-it","ru-ru","sv-se","_monthFormat","timestamp","getDate","isSelected","pieceConceptLegIn","pieceConceptLegOut","BrandedFareTypes","flightDetail","originalCabinClass","brandedFareTypes","filteredBrandedFareTypes","selectedBrandedFareTypeIndex","loadingBrandedFareTypes","expanded","IsMobileDevice","_getTrip","_getFlight","_getBrandedFareTypes","_setCurrency","finally","getTranslation","term","getPostLoadedHeader","priceDif","_getStartUpgradePrice","getAirports","arAir","_setStartingSelection","selectedFarePrice","selectedBrandedFareType","_skywardsInfo","ts","bfs","taxes","adultTax","childTax","infantTax","PackagePrice","SkywardsInfo","flightId","getFlightDetails","FlightId","IncludeSeatPlan","MultiSector","IncludeBrandedFares","_setPriceQuantities","_setDefaultBrandedFareType","_setSelectedFareType","_isExistedDefaultFareType","unshift","defaultBrandedFareType","isContainPieceBaggageConceptInLeg","isContainPieceBaggageConceptOutLeg","si_1","ts_1","bfs_1","intvl_1","getPackagePrice","defPrice","detailsId","DetailsId","_isEqualBrandedFareTypes","b1","b2","isSelectedFare","isLastChild","draggable","touchMove","responsive","breakpoint","settings","showField","resetSelection","selectedFare","idx","savingSelectedFareType","selectFare","_updateBrandedFare","bLen","_trackSelection","detailsPromise","getBrandSpecificFlightDetails","LeadAdultPrice","LeadAdultTax","opts","packageId","bags","maxbags","updateBrandedFare","selectedBrandedFare","trackEvent","category","core","BreakdownTable","package","CanonicalTag","checkUserPrefs","ClearUserPrefs","cookieName","createCookieName","doesHttpOnlyCookieExist","checkUserPreferences","CheckboxPopup","checked","getEventData","labelText","getLabelText","popupMessageText","getPopupMessageText","popupHeaderText","getPopupHeaderText","closePopup","getCurrentRouteLabel","checkboxClick","currentRouteName","ConfidenceMessages","showNortonLogo","messages","showAtolLogo","showCommissionOfAviation","flexiblePayments","atolProtected","commissionOfAviation","messagesResolved","debitMessageType","contactForm","contactDetail","loggedInUser","bookingTracker","namePart","signupPart","emailPart","isPostCodeRequired","onNotYouClick","enableEditEmailAlways","getContentUrl","agentMode","showNamePart","showSignupPart","showEmailPart","adultTitles","getAdultTitles","isPackage","hideAgentDetail","isInsurance","isTravelAgentMode","IsTravelAgentMode","localPaymentsList","localPayable","costBreakdownItem","payableNow","netTotal","NetUnitAmount","totalTravelAgentCommission","TravelAgentCommission","isManageBooking","inInsuranceQoute","checkIsInsurance","calcCosts","binRangeDiscount","DiscountValue","deposit","discount","CrossSellSetting","CrossSellCard","captionResourceKey","tagLineResourceKey","crossSellSettings","Seats","Transfers","cssClass","layout","watch","icon","caption","tagline","CurrentTripType","CurrentTripCard","PreTrip","Days","Tomorrow","Today","OnTrip","flightLegsToDisplay","showExtraProducts","FlightBooking","HotelBooking","TransferBooking","CarHireBooking","AirportParkingBooking","InsuranceBooking","cardTitle","tripTypeKey","tripStageKey","daysUntil","durationKey","resourceKey","CustomerDashboard","bookingsManagerService","customerDashboardService","crossSellsByPlaceholder","lastViewedHotel","searches","crossSellOptions","tileTemplates","tileModels","tileTypes","setDashboardState","showDashboard","fetching","tripReady","resetData","getCurrentTripForUser","dashboardTemplate","getTemplateForDashboard","getTemplateForPlaceholder","promises","getAllCrossSellOptions","getLastViewedHotel","configureTiles","trackDashboardLoad","assignedTypes_1","types","chosenType","AppPromo","InsuranceConf","InsuranceOption","ContactUs","InsuranceClaim","TravelGuide","PostTrip","ReviewedByCustomer","ReviewHotel","getDestinationExcludingSearch","LastHotel","getModelForPlaceholder","crossSellClick","tileClick","trackDashboardClick","DateOrMonthPicker","minimumDate","flexibility","DestinationContentCard","trackClick","expander","expandable","accordionGroup","headerClass","bodyClass","iconClassExpanded","iconClassCollapsed","forceHeaderClasses","hClass","$id","headerClasses","expanderClass","bClass","Tag","isNew","ExtendableTagList","newTagTitle","tagLists","predefined","userDefined","uniqueId","random","componentInputId","formName","maxTagLength","minTagLength","userTags","addTagToUserDefinedList","findIndex","addUserTag","$setSubmitted","tag","$setUntouched","removeUserTag","titleLowercase","tagLimitReached","maxExtraTags","$postLink","tagTitle","inputLabelText","ExtraFocusTracker","extraFocusTrackerEventQueue","func","queue","pull","FieldOptions","uiState","fieldFocused","menuShowing","menuPopulated","selectedIndex","selectableOptions","selectableOpsCount","denyHide","denyScroll","denyFocus","denyBlur","noHide","createMenu","inputEl","selectHandler","formatHeader","headerFormat","formatLabel","optionFormat","ul","eventNS","selOptionClass","uiHandlers","9","selectCurrOption","13","27","blurField","38","traverseOptions","debouncedPopulateMenu","clearMenu","opsCount_1","restricted","isGroup","getItemClasses","fieldVal","termPos","termEnd","substring","str0","str1","str2","getLabelHTML","suppressFocus","hideMenu","domIndex","selectNone","populateMenu","showMenu","winPos","winHeight","ulPos","ulHeight","ulBottom","scrollPos","scrollToMenu","refreshMenu","focusField","getSelectedOption","eq","empty","highlightOption","start","clearHighlight","selectedOption","incr","opPos","opTop","deregister","handler","setSelectionRange","fo","FieldOptions2","selectCurrentOption","leading","trailing","getCurrentOption","opsCount_2","loopIndex","currentOption","FlightExtrasSummary","flightExtrasDescription","flightStrings","Bag","Bags","Extra","Seat","updateFlightExtrasDescription","optionCounts","HoldBags","bagslabel","Gtm","GtmHelpersScriptEnabled","HotelContentCard","CancellationInformation","nonRefundable","refundableCutOff","cancellationCutOff","payAtHotel","amendableUntil","freeCancellationUntil","isPayAtHotel","HotelStaySummaryRoom","quantity","roomDescription","boardDescription","cancellationPolicy","cancellationInfo","HotelStaySummary","bi","BoardDescription","NonRefundable","RefundableCutOffDate","FreeCancellationCutOffDate","IsPayAtHotel","groupRooms","isEqual","changeJourneyUrl","HowToGetThere","flightStaticService","geo","getDepartureAirports","departureAirports","departureAirportGroups","destinationAirportGroups","destinationAirports","getFlightDurations","chain","DurationMinutesDepartureAirport","tuple","departureTitle","formatDuration","DurationMinutes","HowToGetThereDepartureAirports","fromJson","getNearestAirportTitles","minutes","hours","destinationTitle","getAppropriateSize","applySource","imageObserver_1","$observe","hasParams","startTime","toISOString","newCompile","AutocompleteFix","removeAttr","formDirective","oldCompile","IsolateForm","$removeControl","isolatedFormCtrl","$setValidity","validationToken","control","$setDirty","$dirty","formController","isolatedFormEnabled","isolatedNestedFormEnabled","parentForm","allImages","lazySrc","lazyLoader","renderTimer","renderDelay","win","doc","documentHeight","documentTimer","documentDelay","isWatchingWindow","checkDocumentHeight","currentDocumentHeight","startRenderTimer","checkImages","windowHeight","topFoldOffset","bottomFoldOffset","isVisible","render","clearRenderTimer","stopWatchingWindow","windowChanged","addImage","removeImage","attributes","isRendered","lazySrcIsPrerender","IsPrerender","lazyImage","isFixedSize","renderSource","elWidth","outerWidth","elHeight","appropWidth","appropHeight","addSourceToElement","bottom","setSource","newSource","lazySrcFixedSize","loadingSpinner","block","loadingTemplate","ModalCancellationsBasketDetails","isCancellationReady","cancellationData","CancellationChargeEvents","formatEventName","eventType","EventTypes","chargeName","ModalCancellationsDetails","marhabaCost","hotelData","roomCancellationCharges","CancellationData","compareData","findEventType","roomCancellationData","CancellationCharges","ModalFlightDetails","customiseMessage","isHFareFlightType","isHFlightType","ModalLink","accountMenuService","postBookingLookup","modalType","manage","launchOption","ModalTransferDetails","adults","direction","itinerary","Direction","Departure","FlightDate","TransferType","ModalUspPopupDetails","hasSplit","popupContent","contentSplit","NewsFlash","isDismissed","onClosed","slideUp","persist","dismissable","PayLater","validAreas","overrideEnabled","total_1","getEnabled","area_1","BuyNowPayLaterCost","showPayLaterModal","viewType","Payment_1","PaymentCategory","paymentsService","paymentsUtilService","currentMonth","currentYear","monthFrom","years","yearsPast","usingOldTemplate","viewPage","initPaymentOptions","initSavedCards","setCardFee","setDefaultSelection","savedCardSelected_TabVersion","savedCardSelected","paymentOptionChanged","expiryDateYear","cardDetail","expiryDate","expiryDateMonth","previousValue","updateSelectedLogo","updateCardType","cardNumber","cardTypeId","card","paymentOptions","CardTypeId","isPayPalPayment","isSavedCard","paymentOptionId","paymentTypeId","PaymentType","fullCardDetailsRequired","FullDetailsRequired","isExternalFop","IsExternalFop","externalFop","createEmptyExternalFop","clearModel","selectTab","paymentCategory","SavedCard","selectedSavedCard","savedCards","PayPal","selectPayPalOption","saveCard","SavedCardsEnabled","cardCanBeSaved","updateDfReferenceId","dfReferenceId","onReceive","addPreBookCommand","command","addCommand","checkCreditCardNumber","cardTypeChanged","checkCardNumber","cardOption","correctId","getCardTitle","payPalOption","cardId","selectedCard","CardId","CardType","PaymentTypeId","savedCardId","Card","piPaymentOptions","paypalOptions","IsPayPal","logoList","getLogosList","piSavedCards","IsExpired","take","haveSavedCards","savedCardsWatch","selectedPaymentOptionId","setFee","fee","cardPercentage","FeeAmount","FeePercent","createEmptyPaymentModel","PaymentAmountSelection","currencyService","partPaymentAmountWatch","payFull","getSymbol","$setViewValue","maxValue","partPaymentAmount","_setPartPaymentAmountWatch","PriceInfo","onInfoClicked","voucherModalService","voucherModalInfo","showCallToBookModal","showVoucherModal","closeVoucherModal","closeCallToBookModal","voucherInfoResponse","showedModals","ModalForm","showCallToBook","CallToBookRequested","callToBook","isShowedVoucher_1","vouchers","voucher","VoucherCode","paramBoardTypes","fbt","userId","sourceId","selections","localStorage","inboundSegmentDetails","InboundSegmentDetails","outboundSegmentDetails","OutboundSegmentDetails","DestinationAirport","OriginalAirport","CheckOutDate","IsPackage","IsFlightPlus","UserId","VisitSourceId","RoomsCount","Carrier","CarrierCode","getVoucherInfo","RecentSearchCard","savedSearchService","icons","viewModel","enhanceModel","DisplayDetails","Establishment","DestinationAirports","getDestinationImage","Icons","SearchType","TitleResource","StartDate","EndDate","ToDate","restoreSearch","workflowType","RefreshView","windowUtil","_initialised","showWarning","isLocalStorageSupported","updateData","getInfoFromTrip","setData","selectionHandler","selectionChanged","removeEventListener","pageProduct","productsRelatedToPage","actual_1","displayWarning","FlightInfo","refreshPage","currentLocation","productIds","getFlight","flightProductId","hotelInfo","SelectedProductInfo","getInfoFromStorage","Regex","Products","ReviewHotelCard","ribbon","isFromOverlay","OverlaysNew","prefix_2","styles_1","ColourClass","EffectClasses","effect","styleClass","ribbonElement","ribbonContent_1","textSeparator","textArray_1","isBold","ScrollAndClickCtrl","scrollAndClick","scrollTarget","clickTarget","activeClass","toBottom","checkVisibility","scrollPage","scrollInfo","stop","ScrollerCtrl","linkClass","SelectedAttractionSummary","tickets","titleText","SelectedCarhireSummary","HireDetails","SelectedFlightSummary","hideCaption","changeFlight","resetPageIndex","changeFlightInterstitial","SelectedInsuranceSummary","InsuranceQuotes","SelectedParkingSummary","SelectedTransferSummary","OutboundLeg","isOutboundLeg","InboundLeg","SignInDashboard","InspirationalContent","getRecentSearches","stickyTopOffset","fixedClass","absoluteClass","$stickyWrapper","$stickyContent","bottomLimit","bottomSelector","bottomLimitId","resizeStickyContent","stickyWrapperWidth","handleScroll","checkOffset","scrollOffset","isAtBottomLimit","$pageContent","bottomLimit_1","wrapperHeight","contentWidth","wrapperClass","initialContentHeight","CampaignTelephoneNumber","matchedCampaign","telephoneNumber","referrerList","referrer_1","Source","Medium","campaigns","campaign","campSource","referSource","campMedium","referMedium","isMatched","campVal","referVal","eventTracker","eventCategory","eventAction","eventLabel","UniqueSellingPoint","autoLaunch","launchModal","usp","UrlDiscount","DiscountCode","voucherInfo","copyVoucherToClipboard","copyElement","execCommand","decimalAdjust","formats","NUMBER_FORMATS","decimals","exp","spaced","sym","patt","amountStr","separated","lastIndexOf","DECIMAL_SEP","indexOfNumber","roundUpToNearest","targets","isNumber","customCurrency","symbol","getCurrencies","bands","guest","filteredBands","band","EndAge","StartAge","unadjustedDate","dateFilter","collection","keyname","output","discountsService","criteoService","preferences","regPromise","skywardsResult","bufferedRoute","signInLevel","None","Soft","Hard","cu","_extendUser","signOut","register","createRequest","_postRequest","Result","_updateUserFromResponse","User","registerForNewsletter","unsubscribeFromNewsletter","signin","signInRequest","afterPostSignin","socialSignin","verify","verifyRequest","Success","forgotPassword","changeEmail","changePasswordWithToken","changePassword","_updateUserSignedOut","changeContactDetails","changeContactInfo","deleteAccount","setUser","getUrl","anonSignIn","bookingRef","lastName","Surname","_signInResult","getNextRoute","newsletterSignUp","signupreason","Channel","Status","Reason","redirectToBufferedRoute","getSignedinBooking","getUserByAgent","anyEndUser","ImpersonatedSignedIn","cookiename","cookieDomain","domainParts","host","getHost","shift","getDomain","expires","cookieASPXAUTH","getUserPrefResponse","signedIn","getUserPreferences","devEnv","part","getSkywardsUserDetails","Provider","Identity","Email","UserIdHash","EmailHash","SigninLevel","SoftSignedIn","IsImpersonated","hard","soft","existUser","clear","getDiscountCodeForUser","enqueue","setMixpanelEmail","xhr","SkywardsOktaBaseUri","XMLHttpRequest","withCredentials","send","parsedUri","Summary","IdentityProvider","BookingRequest","UserData","ApplicationType","LinkedBookingId","TrackingTag","CheckLivePrices","localStorageProvider","gmtUrl","driverOptions","NotADriver","MainDriver","AdditionalDriver","trimBooking","cloneDeep","prepareBooking","userData","IsRebook","applyCancelations","_enhanceBooking","captureFlight","ConnectingFlight","OutboundDate","InboundDate","MandatoryExtrasEnabled","connectingFlight","flightWithDetaild","addFlightDetails","BookingRules","AdditionalDrivers","captureMainDriver","main_1","additional_1","additionalDrivers_1","AdditionalDrives","Guests","updateBooking","logError","CardDetails","isMobile","checkLivePrice","skywardsUser","skywardsLoyalityNumber","rej","getTrackingTag","LoyaltyNumber","LoyaltyId","browserDetails","Messages","Complete","getCpgStatus","prePaymentId","pollDelayMs","CpgStatusIntervalDelay","stopApiMs","CpgStatusTimeout","cpgstatusURL","protocol","interval","bookingPath","cpgStatus","authCode","AuthCode","paRes","copyFromContact","contact","FirstName","_getTitleIndex","detailsMatch","clearContact","removeAttribute","CountryCode","MobileTel","HomeTel","clearGuests","DateOfBirth","checkValidEmail","email","updateDeposit","minDeposit","PaymentAmount","paypalPostBooking","paypalResult","PaypalInContextEnabled","token","AcsUrl","checkout","startFlow","getDiscountForCard","cultureCode","DiscountDetails","Discount","getCardDiscountsForDomain","pauseRecording","agentIpAddress","AgentIpAddress","resumeRecording","PaymentOptions","IsPayPalPayment","setDashboardPreferences","smokingRoom","yes","no","SpecialRequest","smokingRequestResource","ScreenHeight","screen","ScreenWidth","ColorDepth","colorDepth","AdditionalDetails","ExtraData","clean","BookingsManagerService","BookingTypePropertyMap","_enrichBookedTrip","getCancellationOptions","refs_1","Infants","bookings","getDifferenceInDays","PaymentInfo","ClearedPayments","MonthlyPaymentsEnabled","IsScheduledPayment","ClientCurrencyPaymentAmount","FuturePayments","due","PaymentDate","Due","DirectPayments","LocalCurrency","property","mainBooking","destPromise","AttractionsBooking","HotelAvailabilityImageSize","DepartureTime","ArrivalTime","DayDiff","Outbound","Return","Universal","DropOffPoint","productTypeByCrossSellKey","crossSellTypeByCrossSellKey","CrossSellCommonService","crossSellsCache","Icon","crossSellUrl","_trackCrossSell","Predictions","isCurrent","compareDates","DashboardCrossSellEnabled","Canceled","ReturnDate","ArrivalDate","setDirection","transferIndex","setDestinationAirport","AirportName","AirportCode","setResort","ResortLocationId","DestinationResort","CarHireCrossSellUrl","pickupDateTime","PickUpDate","returnDateTime","DropOffDate","pickupIATACode","returnIATACode","residencyId","ProductViewId","hotelIndex","parkingIndex","setPassengerCount","PassengerCount","CustomerDashboardService","$interpolate","hotelService","bookingActionLink","searchTypesService","recentHotels","rehydrateHotelForHotelCard","imageWidth","imageHeight","searchTypes","searchType","getSavedSearches","getIds","ids","hotelPromise","flightExtras","minPrice","tiles","HasFlight","HasHotel","HasTransfer","HasCarHire","HasAttractions","HasParking","HasInsurance","Tiles","searchDestination","interceptors","fidParser","toNumber","FieldType","funcUtil","hasher","obj","delay","waitForValue","initalValue","defered","compose","retVal","fieldGroupService","cmsService","hotelInfoCache","getHotelDetails","fieldsX","FieldFlags","fieldFlags","OverrideHotelInformationFromCms","getHotelInformation","cmsHotelInformation","HotelDetailImageSize","ObjectTypeId","TeaserStr","IndicativeMinPrice","HasReviewSnippets","ReviewSnippets","HotelName","Address","imageList","ReplaceDefaultDescription","IsPlatinumHotel","HideFacilitiesList","HideRoomFacilitiesList","IsBoutiqueHotel","IsDsfHotel","trackHotelClick","boostReason","sortCriterion","SearchResultsIndex","getPaginationMode","destinationId","PagingDisabled","PagingDisabledForDestinations","getSimilarHotels","Accept","Radius","ResultsToTakeFromNearestHotels","ResultsToTakeFromSeoRanking","fieldTypes","FilterCriteria","Stars","MinNumberOfRatings","OnlyShowAvailable","PageStrand","ok","statusText","getFieldGroup","Global","Titles","IndicativePrice","Characteristics","Distances","Facilities","RoomDetails","LegacyFacilities","Recommendations","Airports","AltTitles","HotelAwards","hs","OverrideAPIHotelsCulture","DefaultPosCultureCode","BoardTypesFilter","BoardTypes","SkywardsTierPromoEnabled","LoyaltyInfo","SkywardsTier","getSkywardsTier","cacheKey","cachedHotel","DefaultHotelDates","goneResponses","getHotelsRequestNumberOfNights","isKidsFree","getResult","formatedData","incExcList","dim","numPeoplePaying","getOnlyPayingIndividuals","rr","availableRoomsList","boardOptionMapping","boardOption","InclusionId","ReplacementText","BoardOptions","BTInclusions","BTExclusions","ra","getOccupancyStringForRoom","MinCostStr","MinCost","OriginalCostStr","OriginalCost","MinCostPerNight","MinCostPerPerson","MinCostPerPersonPerNight","OriginalCostPerNight","OriginalCostPerPerson","OriginalCostPerPersonPerNight","MinCostPerNightStr","MinCostPerPersonPerNightStr","OriginalCostPerNightStr","OriginalCostPerPersonPerNightStr","LowDepositValue","IsPayAtHotelOnly","minRoomDeposit","CostPerNight","IsCheapest","_processHotelFactory","_handleErrors","logMissing","_notFound","_gone","getHotelsRequest","_getHotelFromSession","getRoomTypes","boardTypeFilter","RoomAvailability","rd","MasterId","uniqBoardTypes","bt","values","Pricing","SkywardsLoginUser","Tier","PaymentsService","tokeniser","_clientServerCardsMap","_cardsUrl","_userCardUrl","_enbdCardUrl","payPalResponses","fail","enbdOptionId","EnbdPaymentOptionId","getScheme","_compareTitle","jj","selectedCardId","cp","cur","sp","clientCard","verifiedClientId","checkCardNumberV2","cardType","CardNumberCheckEnabled","actualType","getCardFromId","logos","amex","bitcoin","dankort","diners","discover","maestro","mastercard","visa","external","cardName","toLower","addCardDetails","savedFrom","cardRequest","MasterCardTypeId","paymentType","CardNumber","MaskedCardNumber","ExpiryMonth","ExpiryDate","Month","ExpiryYear","Year","SavedFrom","removeCard","generateTokens","expiryMonth","expiryYear","requireTokens","PCICompliant","execute","getSavedBookingCards","allowedCards","bookingTypeId","filteredCardList","getEmptyPaymentDetails","PaypalDetails","IsPaypalPayment","SecurityCode","IssueNumber","SaveThisCard","getPayPalResponseMessage","cpgValidation","validationRequest","resendOtpConfirmation","SessionToken","TransactionId","verifyOtp","OTP","inTestingEnvironment","__karma__","decorate","newService","_loop_3","fnName","QuoteService","basketQuote","cachedQuoteSearch","removeTrackingTag","refreshQuote","QuoteId","ProductIds","destroyBasket","createQuote","sharedUseFlag","SharedUse","replaceProduct","replacementId","ReplacementId","addBookings","bookingIds","BookingIds","linkQuote","bookingReferences","addNote","noteText","NoteText","validateSearchModel","today","quotedById","externalAgentId","hotelName","searchModel","searchResponse","getCachedSearch","getTravelAgentNameForQuote","TravelAgentFirstName","TravelAgentLastName","TravelAgentTitle","getCustomerNameForQuote","CustomerFirstName","CustomerLastName","getCustomerEmailForQuote","CustomerEmailAddress","getCustomerPhoneNumberForQuote","Phone","CustomerPhoneNumber","getCustomerSkywardNumberForQuote","CustomerLoyaltyNumber","totalBaseCost","priceDifferenceAbs","QuotedCost","CurrentCost","priceDifferencePercentage","getEarliestDate","earliestDate","compareDatesResult","extractEarliestDate","Accommodation","validForDays","refreshedQuoteProducts","days","QuoteManager_1","codesToRetry","responseError","resp","TaxationService","getCityTax","EstabId_1","EnableCityTax","hotelFromBasket","Estabs","getCityTaxes","getHotelsRequestCheckInDate","getHotelsRequestCheckOutDate","roomsFromOccupancy","defaultAdultAge","fill","Passengers","configure","timeElapsed","threshold","utm","UtmId","setRequestHeader","LogLevel","DynamicPackage","MultiDestHoliday","defaultOpts","tripQueue","TripState","tripCopy","getTripDestination","flightDest","hotelsDest","recordHotelSearch","DirectToHotel","_recordSearch","recordFlightSearch","recordMultiFlightSearch","recordTransferSearch","recordMarhabaSearch","recordInsuranceSearch","recordParkingSearch","clearOptionalExtras","_updateTrip","TransfersRequest","InsuranceRequest","ParkingRequest","changeTripType","typeId","setBookingId","setBasketId","setQuoteId","setKidsFree","IsKidsFree","setSelectedFlight","LeadBaggagePrice","AllBagsOrNone","BaggageCount","supportsTransfers","setDirectToHotel","direct","restoreFlightSearch","restoreMultiFlightSearch","restoreTransferSearch","restoreMarhabaSearch","restoreHotelSearch","restoreParkingSearch","restoreInsuranceSearch","getTripIdForDeal","originPath","OriginPath","getTripIdForHolidayDeal","serialised","_getTripDate","getFlightsRequest","getFlightsRequestDepartureDate","getFlightsRequestReturnDate","getParkingDropOffDate","getParkingPickUpDate","getSelectedDepartureAirport","SelectedDepartureAirport","getSelectedDestinationAirport","SelectedDestinationAirport","getDestinationAirports","getFlightCabin","getParkingAirport","Airport","isOneWayFlightEnabled","_parseTripDates","getDurationSummary","getTransfersRequestSummary","getTransferDestinationAirport","NumericDirection","PickUpPointTitle","DropOffPointTitle","OccupancyString","DestinationTitle","getTransferType","getParkingRequestSummary","parkingReq","getTripFromQuote","tripFromQuoteRequest","ForHoliday","AvailabilityId","HotelsRequestId","ParkingRequestId","AttractionsRequestId","CarHireRequestId","FlightsRequestId","InsuranceRequestId","MarhabaRequestId","TransfersRequestId","getInsuranceRequestSummary","insuranceReq","PolicyType","TravelDestination","getTransfersRequest","validateUser","ValidateUserForTripstate","hotelDest","logInfo","requestType","dateType","DateRange","setStartDate","setEndDate","MarhabaRequest","DateAndTime","setStart","setEnd","Collections","Dictionary","_items","_count","containsKey","apiCallLog","oldGet","time","oldError_1","jsError","DashboardHome","dashboardNotificationService","notificationClicked","formatNotification","getNotifications","alerts","Notifications","AddAPI","addAPIService","globalisationService","apiSubmitted","getPassengerInfo","DetailsSubmitted","getCountries","countries","documentTypes","getDocumentTypes","submitAPI","addAPI","getDocumentTypeLabel","docType","getCountryName","country","CountryCodeIso3","AddOption","customCurrencyFilter","mybTrack","paymentDetailsService","rootPath","paymentMethodText","selectedOptionsTotalPrice","getOptions","getPaymentOptions","getCards","getSavedPaymentCards","convertMybPaymentOptions","convertMybSavedCards","paymentModel","getOptionsData","optionsData","canAddOption","getConfig","optionsType","availableOptionsBinding","amendBookingOptionsId","AmendBookingOptionsId","HandBaggageInformation","finaliseOptions","getFlightBooking","supplierIds","SupplierIds","SupplierId","isPartOfHoliday","dataLoaded","makePayment","analyticsTrackOpenOption","requireValidation","addOptionsToBooking","formatClearRequestPayload","AcsRedirectRequired","redirectTo3dSecurePayment","completeUrl","PostPayment","handlePaymentSuccessOptionsError","ReasonCode","getcardFailureReasonMessage","PaymentMessage","handleFailurePayment","root","getOrigin","getRootPath","payPalCallbackUrl","PaymentRequest","PayPalCallbackUrl","pageUrl","PayPalCancellationUrl","selectedOptionsRequest","selectedOptionsBinding","addPaymentDetailsToClearRequest","formatFinaliseOptionsRequestPayload","threedsRedirecting","PaymentId","PaRes","MD","md","completing","ThreeDSecure","PaReq","TermUrl","CanByPass","AllowThreeDSecureBypass","PrePaymentID","Journey","BookingID","showErrorMessages","AddBaggage","updateButtonLabel","buttonLabel","getButtonLabel","NumberOfHoldBags","NumberOfHandBags","PiecesAllowed","PaymentMethod","paymentTab","SuplierIds","CanAddBags","ContactDetail","deliveryAddressService","updateDeliveryAddressWithlLeadContact","isContactSaved","bookingType","getBookingTypeMap","cancelContactChange","updateContactDetails","putContact","ContactDetails","updateRelatedBooking","putDeliveryAddress","requireDeliverAddress","DeliveryAddress","getContact","getOutstandingTrips","trips","hasLinkedBookings","deliveryAddress","isMatch","bk","leadPassenegr","LeadPassengerFirstName","Csr","dashboardCsrService","currentStep","csrCategoryChanged","newCsr","Subject","Category","getCSRStatus","getResourceValue","previous","createCsr","isInProgress","csrTrackingData","CategoryId","CategoryText","TextAlert","TextAlerts","csrId","csrCreated","view","csr","CsrId","resetCsrForm","CsrTextAlertsEnabled","goToCreateCsr","couldNotFindAnswer","CsrFaqCheckEnabled","returnUrl","disableFaq","getCSRSummary","csrs","allCsr","pending","completed","getBookingInfo","getCsrCategories","categories","csrCategories","HideCancelCSRForAutoCancellableBooking","csrCancelId_1","CancelCSRId","CanAutoCancel","childActions","getChildActions","BookingOptions","Actions","CsrDetails","getCsrStatusClass","getCSRDetail","csrDetails","DashboardBookings","onlineCheckinService","dashboardBookingsErrorMessage","selectBooking","bookingSelected","redirectUrlPostBookingSelect","previousBookings","currentBookings","translateActionLink","limitBooking","getLimitBooking","pageSize","setLimitBooking","actionLink","getActionLinks","setExpandedTrip","isExpanded","flightBooking_1","ObjectId","getObjectFromBooking","bookCrossSell","formatBookingMessage","getCrossSellTeaserText","getCrossSellStartingFromText","getTripTitle","getCrossSellTitle","getTripDateText","actionClick","getFuturePayments","bookingStatus","getBookingStatus","loadingBooking","showCanceledBookings","removeCanceledBookings","addCheckinData","getMessage","bookingNotYours","isConfirmed","Reciepted","bookingConfirmed","addCsrToBooking","notification","DashboardBookingDetails","ActiveTab","hotelsRooms","hotelsRoomsEnGb","accessBooking","fallbackEn","bookingTypeMap","bookingInfoItemType","getBookingInfoItemType","MYBDefaultCultureCode","getFallbackEnGbData","pah","getPahFromNotifications","canAccessBooking","bnd","access","resendEmailToLead","sendConfirmationEmail","leadPassengerEmail","emailSent","LeadPassenger","holidayDestinationsArr","EstabTitle","roomText","filterFinalBookings","TripItineraries","Itineraries","holidayStartDate","holidayReturnDate","numberOfRooms","holidayDestination","Pass","daysToGo","LongType","displaySupplierRef","BalanceDueInfo","BalanceDueAmount","SupplierRefBalanceThreshold","BookedItemAndPackageCost","PackageCost","isAtolProtectedBooking","IsAtolProtected","bookedItems","BookedItems","totalPackagePrice","PaidInFull","LogoName","CardTypeTitle","MYBDefaultCultureCodeEnable","getHotelsData","holidayDestinationEnGb","getPaymentTitle","ResendVoucher","emailsArray","Emails","validEmail","isEmailSent","DashboardReview","dashboardService","dashboardReviewService","bookingReviewStatus","CannotLeaveReview","CanLeaveReview","HasLeftReview","showMoreReviews","reviewsPage","limitToNumber","reviewsVisibleCount","getRatingTitleText","saveReview","feedback","UserRating","rating","BookingDetail","EstablishmentDetail","editReview","ratingRange","sutabilityAnswers","recommendTRPAnswers","recommendTRPChange","reviewLater","showUnreviewedHotels","dt","ReviewReminderHours","loadingReviews","loadingHotelReviews","sortOptions","getReviewSortCriteria","showBookingBreadcrumb","hideHotelHeader","urlSource","_reviewPageFactory","objectId","getReviewSiteDetails","reviewSiteDetails","getReviewHeaderData","loadingReviewHeader","hotelReviews","getAggregate","likeCount","unreviewedHotel","ReviewAggregates","TotalReviews","TotalLikeCount","review","LikeCount","estabs","UnreviewedHotels","_dateSortReview","unreviewedHotels","reviewedHotels","ReviewedHotels","reminderDate","getBookingFeedback","selectedHotelIndex","reviewStatus","reviewLaterEnable","_errorCallback","reviewsLoadError","_checkEnterReviewPage","LandingImageHeight","getSelectedHotelInfo","reviewData","getHotelsById","LeadPassengerContact","LeadContact","reviewSaved","ReviewStatus","getReview","existingReview","getReviewDetailsUsingToken","getReviewDetails","aDate","bDate","getRatingTitles","getStatements","reviewEnable","accommodation","notHotelBooking","sortoption","reviewNow","cancelReview","selectVisitedHotel","DashboardSeatSelection","selectSeats","seats","seatsPostAdd","selectedSeats","getSelectedSeats","CanAddSeats","Settings","userSettingsService","thisYear","confirmed","starRatings","getStarRatings","getSmokingRoomOptions","footerToolbar","getFooterToolbarOptions","flightClass","getFlightClassOptions","hotelSortOrder","getHotelCriteria","flightSortOrder","getFlightCriteria","getPricMode","canceledBooking","getCanceledBookingOprions","savePreferences","userPreferences","userPreferenceBeforeChange","prefs","prefsToBeSaved","setAllPreferences","organiseUserPreferenceData","editHotelPref","editFlightPref","editSitePref","cancelPreferences","arrayToLook","prefrenceOptionsMap","itemVal","valueVal","openChangePasswordPanel","showChangePassword","closeChangePassword","openChangeEmailPanel","userEdit","showChangeEmail","editContact","openEditContact","Password","currentPassword","NewEmail","closeChangeEmail","NewPassword","newPassword","confirmRemoveCard","showConfirmRemoveCard","closeEditRemoveCard","CardHasExpired","addingCard","SettingsTab","addCard","newCard","_refreshPaymentCards","paymentSuccess","addNewCard","cardChangedTo","cancelLoginDetailsChange","changeEmailModel","changePasswordModel","numberArray","deleteButton","deleteAccountConfirmed","password","closeConfirmDeleteAccount","showconfirmDeleteAccount","showConfirmDeleteAccount","padZero","BookingForm","setModelForPreference","checkVal","getPaymentCards","paymentCards","getAllPreferences","getPaymentTypes","paymentTypes","allPaymentTypes","MemberDetails","OnlineCheckin","legCheckinAllSelected","showBagsError","checkinSelected","checkinAll","SupplierConditionsList","loadingCheckinOptions","checkinInProgress","checkinError","showProceedBtn","checkedInLegs","printBoardingPass","doCheckin","legsToCheckin","passenger","OptionalCharges","CheckinState","getCheckinType","getOnlineCheckinOptions","unlockScreen","leadPassengerLastname","showSeatWarning","SupplierConditions","conditions","legType","supplierConditions","_formatSupplierConditions","MaximumQuantity","showBaggageSelection","maxBags","SeatSelections","PayBalance","threeDSecure","bookingReferenceUrl","cpgStatusApiEnabled","CpgStatusApiEnabled","cpgStatusStartPollingDelay","CpgStatusStartPollingDelay","_authorisePayment","_block","authorisePayment","paymentId","_handleFailurePayment","_showError","_updateBlanceDueDetail","totalPaymentAmount","paymentAmountDecimal","balanceDueAfterPayment","balanceDue","ReferralMethod","dueDetail","PendingElvPayments","BalanceDueDate","DueDate","IsPartOfHoliday","preBookCommands","executePrebookCommands","preBookCommand","clearPayment","DfReferenceId","ReturnUrl","PartPayment","bypassThreeDS","PayBalanceComplete","bookingActions","getBookingActions","Payments","amountPaid","AmendBookingPreviousSummary","BookingCore","DashboardBookingItinerary","templateMap","64","128","256","1024","2048","productsMap","bookingTypes","itineraryType","getItineraryType","MYBProductsDetailsExpanded","travelInsurance","insuranceProvider","bookingTitle","filterTransfer","getImage","getAcommImage","getNights","fareName","getAddress","itineraries","dashboardBookingSummary","showTripDate","bookingMessage","showActions","stopWatch","actionRedirect","toggleOptions","showOptions","DashboardBreadcrumb","dashboardBreadCrumbDetails","crumbs","pages","DashboardCarousel","formatedItem","formatItem","onItemClick","itemClick","onCarouselChange","itemlist","itemPartial","$last","DashboardCsrConversation","submitMessage","getSenderTitle","conversation","moveConversationWithTextbox","goToBottom","CsrSummary","csrlist","gravatarProfile","changeText","hash","md5","image_1","alt","initialHeight","maxRows","$eval","elastic","maxHeight","clientHeight","resize","AddAPIService","PassengerInfo","getAPI","getPassengers","passengersFromAPI","pa","PassengerId","SurName","DocumentNumber","Nationality","DocumentIssuingCountry","CountryOfBirth","DocumentType","DocumentIssuedDate","DocumentExpiryDate","reviewUrl","userReviewUrl","reviewCriteria","ratingTitles","hotelSuitabilityTypes","comments","topTip","notRecommendUsComment","statements","recommendTRP","submitTry","RatingDecimal","Comments","TopTip","RecommendTRP","NotRecommendUsComment","DomainDefaultCultureCode","VerificationToken","_saveReview","clearAggregate","filteredStatements","SelectedOpinion","Statements","_setFeedbackStatements","showNotRecommendTRPComment","MinimumRating","addDefaultAnswerToStatements","hotelDetail","bookingDetail","getBookingSummary","getReviewStatus","dashBoardAggPromise","getFieldTypes","allEstabs","EstabBookingDetails","userReviews","Reviews","visitedEstabInfo","estab","IsReviewedByUser","estabDict","toDict","_getDashBoardAggregates","estabIds","Ids","unadjustedDateFilter","defaultImage","bundle","Generic","CancellationCondition","baseManageUrl","v2ManageUrl","canceled","FlightOutbound","FlightInbound","HotelRoom","AttractionTicket","CarParking","TransferArrival","TransferReturn","PackageHoliday","tripsPromiseCache","destinationType","Place","Polygon","bookingImageWidth","bookingImageHeight","getBookingDetailsForTrip","bookingDetails","BookingDetails","calculateType","fp","getConfirmationEmailInfo","Culture","titleArray","emails","updateRelatedBookings","filteredTrips","resourceVal","actionPath","TopInfo","PayAtHotel","destinationAirportCode","ItineraryTypeId","DestinationAiport","airportCode","BookingCtaRedirectEnabled","enableRedirect","BookingCtaRedirectUrl","OpenNewTab","actions","ParentActionName","uniqBy","cancelled","oldBookings","bookingsForTrip","bookingTypeArr","abbr","period","reference","tripsPromise","Period","Trips","InValidOwner","_bookingOwnershipRejection","_addBookingImage","hotelBooking","flatMap","unset","packagePaymentsData","zipWith","Action","_processPackageTripIfNeeded","flightBooking_2","notificationData","7","notifications","viewDetail","paxData","hotelPax","ItineraryId","AgeOnReturn","passengerTitles","PassengersTitlePlural","PassengersTitleSingular","parseBooking","setMessage","DashboardBookingsErrorMessage","DashboardBreadCrumb","extraCrumbs","MYBOOKINGS","RAISECSR","CSRDETAILS","SEATSELECTION","getBookingTypeText","actionLinks_1","csrStatus","csrStatusClass","baseCsrUrl","getCSRStatusCode","_parseCSRSummary","_enrichCSR","mobileTel","getAllCSRs","htmlifyLineBreaks","getConvertationFromCsr","allCsrs","orderBy","openQuestion","Questions","Answer","AgentName","_getCsrMessage","statusClass","createdByCustomer","agentName","question","questionId","answerText","newMessage","AnswerText","AddNoteAllowed","lastUpdated","updatedDate","CreatedDate","StatusResource","sortedCoversation","Logs","QuestionDate","initialText","conversations","QuestionText","AnswerDate","CreatedByCustomer","validConversation","Notification","DashboardNotificationService","notificationLink","_notificationTypes","identity","_getPaymentDueString","_notificationActionTypes","_paymentDueType","hotelDue","hotelOverDue","flightDue","flightOverDue","transferDue","transferOverDue","_desktopUrl","getNotificationLinks","_postProcess","_translateActionLink","noti","templateString","TravelChange","DestinationName","CsrQuestion","DuePayment","dueDateText","PassengerApi","HotelReview","daysWithin","validNoti","actionString","FlightExtrasService","flightSeatPlanService","extraProperties","extrasCache","numberOfInfants","SeatPlan","Inbound","pIndex","seg","LegId","Segement","SegmentHash","IsChild","HasInfant","addMinCostPerPerson","BagOptions","extraBags","IsFlightExtra","extraSeats","minCostPerPerson","requireCardValidation","paymentRequest","validateRequest","CardNumberMasked","CardStartYear","CardEndMonth","CardStartMonth","CardEndYear","CV2","CardCvc","CardIssueNumber","validateCard","_clear","MybTrack","SignIn","checkinURL","FlightClass","passengerType","getCheckinAvailability","DoesSupportOnlineCheckin","checkinData","checkinAction","checkinDisabled","disabledInfo","checkinMessage","checkinType","Unknown","isEnabled","isCheckedIn","apiRequired","NotSupported","Available","CheckedIn","ApiRequired","Closed","WaitingToOpen","isLegEarlier","CheckinStartTime","cardUrl","transactionUrl","ddcTokenUrl","uniqueMasterCards","allCards","uniqueCards","seen","len","masterId","_uniqueMasterCards","seEl","BookingTypeId","convertToPaymentCards","siteID","postBookingPath","getcardFailureReasonCode","cardFailureReasonCode","reasonCode","cardFailureReasonMessage","getPaymentLogos","parameters","getDeviceDataCollectionToken","networkParams","InvalidCardNumber","InvalidCardNumberLength","CardNotYetValid","InvalidIssueNumber","cards","paymentOption","updatedReq","BrowserDetails","boolianOptions","hotelCriteria","flightCriteria","dealTypeCards","imgUrl","DestinationImagesClientDomain","holidayDealsEnabled","HolidayDealsEnabled","cruiseEnabled","HolidayDealsCruisesEnabled","HolidayDealsDefaultAirports","getAggregates","destMap","useDealsImages","encodeURI","EmiratesHome","cmsPageMapping","controls","experiences","getHomePage","getTiles","ControlId","controlid","components","componentsByType","controltype","selectedTab","EmiratesOffers","cmsItemsFound","getOfferTypes","pathname","linkurl","EmiratesSingleOffers","$anchorScroll","getSingleOffers","estabid","NewsLetterSignUpFullForm","showExtended","gaEventIsSent","signUpReason","subscribePrimaryButtonLabel","salutationOptions","_initData","firstName","onEmailFocused","TrackNewsletterSignup","dimension9","_getLanguageCode","langCode","_getData","LanguageCode","ContextTag","SignupReason","_getGaTrackData","getSubscribePrimaryButtonLabel","submit","formState","resetSubmitResult","resetFormState","allowUnsubscribe","setSubmitFn","NewsLetterSignUpPopupForm","onSuccess","primaryButton","boardTypes","boardTypeOptions","filterBoardTypes","CountryPickerService","getDomainInfo","getSelectedRegionalContext","regionalContext","getRegions","ParentDomainId","regions","Context","Regions","selectRegionalContext","setRegionalContext","PointOfSaleId","PointOfSale","Language","CardBinMessagesController","sortArr","numberOfVisible","highlightA","Highlight","ClearBasketAlert","getProductCount","postClearAction","cancelAction","createBasket","ClearBasketAlertModal","CountryPickerDropdown","countryPickerService","selectRegion","activeContext","Region","pointsOfSale","getPointsOfSale","languages","Languages","activeContextPOS","PointsOfSale","PosEnglishName","RegionId","AccountingCurrency","DefaultCurrency","DomainName","IsAgent","LegacyDomain","TradingGroup","LocalName","LocalisedNames","pointsofsale","pos","names","currentDomain","localisedNames","getPosEnglishName","localeCompare","selectPointOfSale","englishCountryName","langObj","regionTitles","GaEventLabel","region","Inferred","confirmRegionalContext","inferred","CountryPickerPopup","countryPickerPopupOpen","getPointOfSaleUrl","setPointOfSale","countryPickerSelectionMessage","countryPickerHeaderMessage","DEVICE_DATA_COLLECTOR_URL","DDCController","MESSAGE_EVENT","TIMEOUT","ThreeDS2RetryTimeout","THRESHOLD","ThreeDS2RetryThreshold","retryCount","setUpHandlers","$onDestroy","messageEventListener","startGetToken","jwtTokenData","_getDeviceData","_getIdReference","jwtToken","_reloadIframe","reloadTimer","getForm","idReference","err_1","_submitForm","tokenResponse","error_3","getDDCToken","_completeForm","jwtValue","binValue","setFieldValue","getField","getTimer","_clearMessageListener","CardinalCommerceUrl","warn","SessionId","iframe","contentWindow","getElementsByClassName","valueName","labelName","ulClasses","focusIndex","applyOption","selectedIndexes","updateOnWatch","optionClick","behaviours","onKeydown","quoteManager","customer","isSkywardsUser","isSendEmailToSelfEnabled","processCustomerDetails","bindWithSkywards","quoteSignupEmail","checkSkywardsUser","toggleSendEmailToSelfOption","shouldSignUp","EmailAddress","EmailSignUp","SendEmail","SkywardsTotalMiles","FooterCookies","selectionToolbar","mainCol","zIndex","showCookiePopup","FormState","successSubmitResult","errorSubmitResult","formSubmitted","formOnceClicked","_submit","isSubmitInProcess","isSubmitResultError","isSubmitResultSuccess","isFormOnceClicked","isFormValid","showFieldError","fieldName","fieldObj","showFieldValidatorError","validationError","hsHeights","touchedFalsify","touched","onMouseEnter","siblings","winRight","scrollLeft","delta","keepInViewportX","enableSubMenu","EnableDestinationsSubMenu","hasChildren","subMenuReset","parentElement","firstElementChild","destHeaders","destHeadersLength","onItemSelected","dropdowns","headerTypes","metaInfo","PageTitle","meta[name=title]","MetaKeywords","meta[name=description]","MetaDescription","meta[property=\"og:description\"]","htmlStr","NavToolbar","signUpPopupService","dropdownToggled","parentThis","idleLogout","toggleCountryPicker","openSignUpPopup","showPopup","resetTimer","onmousemove","onmousedown","ontouchstart","ontouchmove","onkeydown","IsSubscribeModalAutoTriggerEnabled","searchState","clientY","innerWidth","PhoneNumberInput","onInit","onDestroy","countryCode","_getDefaultCountryCode","initCcPicker","onCountryCodeChange","$countryPickerElement","setTouched","setCountryByCode","updateExternalModel","syncExportValueModel","CcPicker","dataUrl","setCountryByPhoneCode","countryPhoneCode","ngModelCtrl","$setTouched","phoneCode","countryCodeNumber","$applyAsync","exportValueToModel","$touched","$updateBooking","phoneNumber","ctrls","productCarousel","baseOptions","itemOptions","autoplayTimeout","carouselOptions","staticItems","QuoteControllerStatus","QuotePublicController","controllerStatus","currentStatus","Busy","hasEssentials","productsLength","quoteStatusPromise","NotFound","refreshedQuote","RefreshError","restoreFailed","RestoreFailed","RefreshFailed","Ty","_setPriceDifference","Ready","searchAgain","bookQuote","bookBasket","bookingRedirectPath","hideLoadingScreenOverlay","PublicQuoteSummaryController","quoteStatus","controllerLoaded","clientReadConfirm","detailsStorageConsent","detailsStorageMandatory","_checkAllProductsRefreshed","_init","_setTransfer","_setParking","getBasket","basketProds","quoteProds","isBookingDisabled","quoteIsReady","QuoteStatusMessagesController","priceRange","QuoteSamePricePercentRange","samePriceRange","messType","getMessageText","isExpiredMessage","isPriceDecreasedMessage","isSamePriceMessage","isPriceIncreasedMessage","SelectedHotelController","imgWidth","imgHeight","showCancellationsPopUp","_initHotelImages","findCancellationData","showCancellationsDetails","showCancellationsDetailsModal","numberImages","StickyNavBar","menuToggled","currentTop","previousTop","isFixed","fixedYPosition","yOffset","elementHeight","offsetValue","paddingTop","isAutoScrolling","selectAnchor","updateSelectedIndex","gotoAnchor","anchor","menuItems","targetValue","signup","attachElements","stickyHeight","totalHeight","siblingSection","nextAll","fix","getScrollOffsets","findClosestTarget","menuElement","titleHtml","headingType","headings","itemText","domItem","scrollOffsetElement","contentElement","menuOffsetElement","navBarCtrl","transcludeFn","nodeType","gtmOptions","getGtmOptions","createCloneElement","eventTrackerDirective","transcludeControllers","stickyNavBar","instance","domTarget","StickyNavBarItem","ValidateCardType","$watchGroup","valCardType","maskModel","paymentForm","ngModelCardNumberCtrl","ValidateCvvTokenErrors","tokenErrors","securityCode","ngModelCvvCtrl","filterPages","filterType","tile","pagetype","LinkUrl","getDestinations","InsuranceResults","searchId_1","getSearchResults","insuranceQuotes","typeSummary","selectPolicy","policy","QuoteType","CostTotal","TotalOptions","SupplierName","selectInsurance","selectedInsurance","documentPaths","$browser","insuranceSearchValidator","inProgress","getInsuranceQuotes","getInsuranceQuotesFromSession","baseRoute","baseHref","InsurancePolicyWordingDoc","SilverPolicyWording","InsuranceSilverPolicyWordingDoc","StatusDisclosureDoc","PolicySummary","InsuranceKeyFactsDoc","passengerInsuranceBand","insuranceBands","bandId","costOnly","priceString","composeOptionId","schemeId","supplierId","decomposeOptionId","parts","relationshipId","clearSearchResults","validateSearchCriteria","getInsuranceDetails","detailsUrl","availabilityId","SchemeId","tripTypeId","TripTypeId","DestinationId","RelationshipId","DetailSearchId","isVatMessageInclusive","isMultiple","PolicyExtras","getPolicyExtra","AdultAges","Ages","enrichData","Quotes","InsurancePerPersonPricing","PerPersonPrice","AdultCount","ChildCount","InfantCount","showThanks","startChat","ButtonCode","rejectChat","closeThanks","LiveChatButton","ReactiveButtonCode","startOfflineChat","ReactiveOfflineButtonCode","addReactiveButton","LiveChatService","scriptUrl","Script","liveUrl","ChatLocation","ShowMessages","liveChatConfig","ApiKey","site","Site","popupWidth","Sizes","Width","popupHeight","Height","addCustomDetail","saveToTranscript","setChatWindowWidth","setChatWindowHeight","newPage","reinit","disconnect","currUrl","reactiveCode","reactiveOfflineCode","showWhenOnline","ShowButtonWhenOffline","showWhenOffline","parkingDetailsService","flightsTerminalService","ap","noneParking","currentParkingLimit","parkingLimit","parkingAvailabilityBusy","parkingSearchId","parkingQuotes","parkingQuote","parkingQuoteDescription","AirportParkingQuoteId","DefaultAirportParkingSelection","AirportParkingEnabled","getParkingQuotes","EnforceParkingOptionSelection","CarParkCode","quote_1","parkingBusy","selectParking","removeParking","getTerminalForFlight","FlightNumber","terminal","currentInfo","moreParkingQuotes","ParkingResults","parkingService","parkingRq","selectedParking","selectedDepartureAirport","getSummary","initStartPlusOne","minimumDatePlusOne","minDates","startPlusOne","showEndCalendar","parkingBooking","parkingSearchValidator","departureAirport","getPassengerCount","availabilityReq","tripServiceReq","CarParkingQuotes","_enrichData","parkings","fromDate","toDate","PerDayPrice","getParkingQuotesFromSession","availabilityRequest","getParkingDetails","atLeastOneDayInTheFuture","qc","quoteCreationError","quoteNotFound","quoteRefreshEnabled","QuoteRefreshEnabled","quoteRefreshError","enrichProducts","productNames","airportparking","attractionticket","getNumFromType","typeStr","mapLegs","typeA","typeB","totalQuotedHolidayCost","totalCurrentHolidayCost","failedRestore","getTotalProductCost","Options","CurrentOptionCost","searchRedirectPath","staticHotel","extraDetails","SpecialOffers","HasSpecialOffers","OnRequest","ShowOnRequest","PayableLocally","CurrentUnitCost","QuotedUnitCost","UnitCurrentAmountString","TotalCurrentAmountString","TotalQuotedCost","TotalCurrentCost","totalQuotedProductCost","totalCurrentProductCost","QuotedOptionCost","refreshClicked","gotoBasket","tripFromQuote","AdvancedQuoteSearch","toggleSearchForm","initSearch","searching","showSearchForm","allowToggleAdvancedSearch","hideAdvancedSearch","startMaxDate","endMaxDate","quoteSearch","sortDirection","getCoworkers","agents","pgIndex","noPermission","onRequestFinished","manageQuote","endMinDate","selectAgent","selectedAgent","selectCustomer","selectedCustomer","selectTravelAgent","selectedTravelAgent","filterAgent","FullName","autoCompleterDeselect","getTravelAgentAgencyNameForQuote","travelAgentDetails","TravelAgentId","getContactByUserId","getTravelAgentContactById","userDetails","agentId","hideSearch","$e","showTravelAgencyDetail","showLoyaltyNumber","showLinkedBookings","BasketNotes","createNote","newNote","basketType","notes","Notes","note","Created","QuoteCreator_1","contactEmail","sendEmail","EnableAgentSendQuoteEmail","quoteCreated","showLink","newsletterSignup","createClicked","quoteEmailAttempts","quoteEmailAttemptsLimit","emailPattern","_initContact","invalidUser","_newPostCreateQuote","Payload","refEmail","_newCreateQuote","noUserCheck","registerUser","mixPanelTag","isQuoteEmailDisabled","sharedUse","SearchOccupancy","OccupancyConfig","queryStringCode","UnifiedSearchType","UnifiedSearchModel","DateRangePicker","animationUtil","enabledDates","datePicker","nextDateToSet","localStartDate","localEndDate","shadowStartDate","shadowEndDate","datepickerEl","$cell","getDateFromCalendarCell","resetShadowDates","setDuration","highlightShadowDates","closeClicked","stage","unbind","isInShadow","toggleClass","$td","isStartDateEnabled","dateStr","applyDatePicker","numberOfMonths","dateFormat","firstDay","isRTL","prevText","nextText","selectedDate","beforeShowDay","isRangeSet","isDateInRange","minDate","maxDate","lockScroll","restoreScroll","resetRange","DurationPicker","durationPicker","selectDuration","ErrorFocusHandler","targetHeight","scrollY","InputWithIcon","addToggle","prepend","IntegratedSearchTab","tabPanel","titleResource","IntegratedSearch","tabs","prepareTabs","preselectTab","getLastSearchType","getTabPanel","NoDatesYetEnabled","overrideAllowNoDatesYet","getClearForm","clearFormInAgentMode","tab","includedTabs","HolidayDeals","cruiseTab","Cruises","CruiseRootUrl","hiddenQueryString","trackDefaultParameters","isFlexibleTripType","disableResetOptions","OccupancyPicker","ranges","adultsInAdditionalRooms","childrenInAdditionalRooms","occupancyPicker","setRanges","localModel","checkRooms","mergedRoom","memo","maxAdultsInAdditionalRooms","maxChildrenInAdditionalRooms","maxChildAge","getAdultsPerRoom","getChidrenPerRoom","validateOccupancy","addRoom","removeRoom","Search_1","Tab","MaxChildAgeForHolidays","MaxChildAgeForFlights","multiRoomDisabled","allowNoDatesYet","currencyOptions","CurrencyOptions","userSession","expandedOptions","searchOpened","PassThroughSearchToIntegratedSearch","checksigninstatus","cabins","getCabinOptions","updateNoDatesYet","airlines","allAirlines","supportedTabIds","findTabId","tabId","includedTabIds","showTabs","tabIdToSelect","getPreselectTabId","prepopulateModel","PrefilterAirlineEnabled","PrefilterDirectFlightsEnabled","prefilterDirectFlights","sortOrder","setHotelSortOrder","loadOutboundDates","searchLookupType","FixedDepartureAirportOptions","currentAirports","updatedAirports","saveSearchModel","session","includeTab","isIncluded","tabNameOrNumber","noDatesYet","checkScreensize","searchPanel","displaySearch","t_1","toggleSearch","convertDateToISO","shortMonth","isAutoSearch","FlightMiles","searchData","ISOstartDate","DATETIME_FORMATS","SHORTMONTH","ISOendDate","launchSearch","DepartureAirportCodes","DestinationAirportCodes","getRequest","outboundDates","moreOptions","resetDuration","RedirectTemplates","SelectBoxItem","selectBoxItemId","SelectBox","isOpen","isMenuRendered","buttonEvents","keydown","altKey","previousFilter","character","fromCharCode","filterTimer","matching","filterMenuItems","menuEvents","mousedown","menuItem","setActiveItem","button","drawWrapper","drawButton","drawMenu","setButtonText","getSelectedMenuItem","div","wrap","tabindex","role","aria-expanded","aria-autocomplete","aria-owns","aria-haspopup","insertAfter","buttonText","aria-hidden","aria-labelledby","setOpen","parseOptions","renderMenu","selectBoxItems","renderItem","li","setText","parseOption","nextIndex","selectBoxItem","setAriaActive","aria-activedescendant","escapedCharacter","regex","UnifiedSearch","showDatePicker","showOccupancyPicker","clearParams","cabinOptions","getCurrencyOptions","airlineOptions","setSearchType","setEnabledStartDates","setEnabledDurations","occupancyCaption","clearForm","areaName","getAreaName","occupancyConfig","getOccupancyConfig","minStartDate","getMinStartDate","setLabels","flightIncluded","enabledStartDates","destinationLabel","hotelIncluded","destinationPlaceholder","searchTypeName","getHotelSearchButtonLabel","modelCopy","oneWayFlightIncluded","selectDestination","selectDateRange","openDatePicker","openPicker","openOccupancyPicker","getBoundingClientRect","picker","adjust","pixelsForHeightExpand","hotelOnly","evTop","eventHeight","scrollAdjust","complete","resetDestination","setDestination","OneWayFlightsEnabled","flexibleDatesDisabled","FlexibleDatesFlowsDisabled","SearchQueryString","PrefilterAirlines","IsPostfilter","paramsOptional","getCompleteParamsObj","applyDatesOffset","startdate","enddate","startoffset","parseOccupancyString","depair","getAirportCodes","lookupAirports","getDestination","lookupCabin","autosearch","expandedoptions","lookupAirlines","prefilterAirlines","resetForm","resetform","sortorder","dealsOnly","dealsonly","lookupDestination","query","destObj","parseDestinationParam","airlineQueryArray","verifyAirlineModels","airline","searchParams","mapKeys","getAirportListCodes","depAirpt","destAir","destair","getValue","startOffset","dateData","deeplinkData","startDate_1","SearchUnitService","webUrl","defaultCabin","DefaultCabin","pointType","Point","Estab","Resort","transferTypes","AirportTransfer","ResortToResort","flightRoutes","isMultiSector","isMultiReturning","setDefaultCabin","setDefaultCurrency","getDurationOptions","mp","SearchUnitDurationMostPopular","nn","SearchUnitDurationNoOfNights","_translateDirection","getDirectionStrings","_loadDepartureAirports","availableDepartureAirports","DepartureCountryCode","_loadResorts","resort","IncludeHotels","IncludeHotelsInTransfersAutocompleter","defaultTime","searchDates","isStartTimeApprovedByCustomer","isEndTimeApprovedByCustomer","allAirports","getTerminals","availableTerminals","Terminals","setTerminal","setCabin","setCurrency","getTerminal","getFlightTypes","getMarhabaFlightType","setFlightType","flightType","setOneWayFlightEnabled","oneWayFlightEnabled","setStaffRates","staffRates","getStaffRates","setMarhabaAirport","marhabaAirport","getMarhabaAirport","getFlightType","lr","destinationAirport","availableResorts","PointToPointTransferSearchEnabled","setTransferPickUpPoint","getDestinationAirport","getOutboundDates","serialiseDatesRequest","DepartureDates","requiresStartDate","requiresEndDate","getSearchArea","searchArea","updateSearchArea","sa","setSearchArea","departureAirportsRequired","enrich","getAvailableResorts","getAvailableDepartureAirports","strMulti_1","_setShortTitle","getDirection","directionStrings","setTransferDropOffPoint","getResort","getRoute","PickUpPoint","setLocationId","getLocationId","Searchable","timeSupport","StartMonth","OutboundDates","HolidayEnabled","Terminal","FlightType","Airlines","MarhabaAirport","setLegs","getLegs","setFlightRoutes","getFlightRoutes","setIsMultiSector","isMS","getIsMultiSector","setIsMultiReturning","isMR","getIsMultiReturning","SearchArea","MultiFlightsRequest","FlightRoutes","ResortId","ResortTitle","ft","ValidFlightClasses","approvedCabin","chooseSeachUnitModel","queryString","getTransferTypeStrings","transferTypeStrings","transferType","setTransferType","transferPickUpPoint","getTransferPickUpPoint","transferDropOffPoint","getTransferDropOffPoint","offSetDays","HotelSearchOffsetDate","getUTCHours","TimeCutoffForSameDayHotelSearch","zeroTime","getHolidaysSearchOffsetDate","minimumOverride","HolidaySearchOverrideMinimum","getMinEndDate","HolidaysSearchOffsetDate","urlqs","policyUrl","policyExtra","capitalize","charAt","hotelDateRange","flightHolidayDateRange","destQs","getArrivalAirports","includesHotel","MaxAdults","MaxChildren","MaxRooms","MaxRoomsForOccupancy","MaxAdultsInAdditionalRooms","MaxChildrenInAdditionalRooms","MaxChildAge","UnifiedSearchService","getSearchMessage","populateModelFromSearchUnitService","filterCriteriaAirline","Airline","union","PreferredCarrierCodes","NoAirlinesResetOnSearchPanelFixEnabled","flightRequests","MultiDestinationFlightRequests","flexibleDates","allowDealsSearch","saveSearchType","callSearch","fstr","hpr","holidayPrice","destinationIsCountry","prepareFlightSearchOptions","defaultFilters","holidayDealsSearch","FlexibleDatesEnabled","isPrefilter","postfilterAirlines","useSearchUnitService","searchableDestination","getSearchableDestination","ClearSearchPanelOptionsEnabled","EnableNearestDepartureAirports","getNearestAirports","destinationPromise","childDestinationPromise","DefaultSelectedFlightCabin","SharedSearchUnit","searchMsg","datesSearchUnit","startDateLabel","endDateLabel","requiresTimeApproval","outboundOnly","returnOnly","showTime","templateOverride","halt","updateMinDates","getAreaOverride","updateCurrentArea","endDateMin","DurationEnable","endDateOffset","HolidaysSearchEndOffsetDate","searchDatesInfo","startStamp","endStamp","FixedDepartureDropdown","titleCode","preSelectedAirport","preSelectedIndex","onDepartureAirportChange","fixedDepartureDropdown","flightSearchUnit","destinationAirportSelect","destinationAirportDeselect","mapSearchTerms","multi","getMultiSectorMinDate","legIndex","selectLegDate","selectLegAirport","addLeg","prevLeg","rmLeg","onSearchModeChange","searchMode","onReturningToggle","airportSelect","updateCabin","isBoolean","airportsCount","parkingSearchUnit","maxPassengers","adultRange","passengerSelect","passengerCount","passengerRange","departureAirportSelect","departureAirportDeselect","loadOnce","currDest","once","unwatchCurrent","loadingClass","updateResorts","allResorts","resorts","resMatch","currTerm","resortTerm","resortInput","roomSearchUnit","_showRoomErrors","dateRangeMetadata","occupancyMetadata","updateCurrency","searchRooms","setScrollTarget","roomSearch","transferSearchUnit","transferSearch","getTransfersTimeApprovalRequired","EnableTransfersTimeApproval","transferDirectionStyle","TransferDirectionStyle","directionOps","invert","destinationTypePointTypeMap","pointTypeDestinationTypeMap","directionSelect","isOneWay","isReturnOnly","restoreDates","transferTypeSelect","isAirportTransfer","pickUpPointSelect","pickUpPoint","dropOffPointSelect","dropOffPoint","resortSelect","resortDeselect","enableTransfersTimeApproval","dropOffPointDeselect","pickUpPointDeselect","pointToPointOneWay","isPointToPointOneWay","air","Area_1","SearchUnitEndDateOffsets","transferBooking","holidayBooking","FlightsAndHolidays","marhabaBooking","emirates","attractionsBooking","insuranceBooking","delayedLinkers","areasInfo","linkerFn","getSearchResultsFn","showErrorsFn","samePage","oneWayOnly","Resorts","TransferAirports","setDestinations","HotelsOnFlightsEnabled","TransferDirection","TransferSearch","transferRq","searchId_2","getPricePP","selectTransfer","CostPP","TotalPrice","MinOptionCostTotal","MaxOptionCostTotal","TransferId","selectedTransfer","transferDetail","getTransferDetails","DetailsSessionId","transferSearchValidator","TradingGroupId","location_1","isFlightPlus","BalanceDueDateOverride","pax","totalPax","getAvailabilityRequest","arrivalDate","returnDate","moreInfantsThanAdults","childAgesPopulated","benefits","AppPromoBenefits","why","AppPromoWhy","androidReviews","AppPromoAndroidReviews","_parseReview","IOSReviews","AppPromoIOSReviews","AppPromoOverlayImage","AppPromoOverlayText","AppPromoMetaTitle","AppPromoMetaDescription","appStore","author","comment","Home","enforceAreaLimits","LandingPage","objectTypeService","lp","seoData","setTemplate","LandingPagesV2Control","toRoute","getObjectTypeAndId","getDestinationType","getLowestPrice","priceProp","prices","landingPageV2Loaded","saveToUrl","includeCruises","getDefaultFilters","deals","CroppedImage","Aggregates","Filters","goToDeal","landingPage","destinationIsEstab","incrementPeopleEvent","isProductSupported","supportedProduct","currentDest","changed","subscriberName","inOrNearStr","IsPOI","subscribeOnce","dataPoints","IsPreview","ispreview","templStrings","varMap","getBcTitle","getBreadcrumbTitle","in","province","number","getVarMap","descStrings","dataPoint","dataName","maxChars","templStr","transformedStr","supplant","altTemplStr","HotelSummary","MetaRobots","imageURL","getLandingPageImage","MetaTitle","meta[property=\"og:title\"]","ogImage","updateDOM","LoadingScreen","PublicityMessagingEnabled","SearchDate","chooseStyles","logLoadingScreenStyle","showBookMessage","scalemessages","scrollTimeout","windowPrerenderReadyTrue","prerenderReady","unblock","mostRecent","occupancyStr","restore","_countChildren","numChildren","applyOccupancy","childRange","childrenChanged","addOrRemove","currentRoom","occupancyAgeConfig","showRoom","isActive","onApplyOccupancy","PromotionTerms","promotionTermsPageConfig","PromotionTermsPageConfig","getPromotionTerms","promotionsTermsList","RootController","bootstrapper","locationService","sidebarMenuOpen","_updateShowCaseStyle","showcaseStyle","hero","promoOverlayStyle","mobileBannerImage","heroStyleSkip","minimalHeader","closeModal","hideSiteMailingSignUp","showSfChat","pathParams","popupUrl","impersonatedUserName","preventPopupClose","hideHeaderBar","modalParams","agentModeEnabled","DomainHostName","hideFooterToolBar","FooterToolBarABTest","googletagPoll","abtesttUrlMatched","hideMinimalHeader","Platform195EnabledPages","Platform195MobileEnabledPages","googletag","apiReady","slots","refreshSlots_1","pubads","ShowAgentOfficeSelector","getAgentInformation","officeLocations","OfficeLocations","enableOfficeChange","loc","CurrentOfficeLocation","selectedOfficeLocation","permittedRegions_1","permittedDomains_1","PermittedDomains","getAllDomains","allDomains","parentDomainId","parentSubDomains","enableDomainChange","filmCampaignTrack","channel","Page","onLaunch","onClose","enableHotelSearchResultsPageDesignChangeABTest","EnableHotelSearchResultsPageDesignChange","home","go","menuClicked","hideOverflow","HideSiteMailingSignUpMobile","HideSiteMailingSignUpDesktop","extendedUser","brokerPublish","backgroundStyle","loadingScreenBackground","CMSInterstitialImagesEnabled","bannerStyle","loadingScreenBanner","sc","showStrapLine","signout","CompactMobileTabs","searchMsgs","supportsGeo","supported","autoCompleterSelect","waiting","getEndDate","getStartDate","showStartCalendar","setEndUsingDuration","showStartDate","showEndDate","productToggle","currentStrand","opposite","nearby","gettingLocation","isAirlinesPrefilter","updateDuration","focusOnDuration","deselectAllAirlines","dealsFlexibility","SearchUnitDurationDefault","durationLength","SelectDomain","lightbox","permittedDomains","permittedRegions","setSelectedDomain","selectedDomain","setOfficeLocation","SelectOffice","selectedOffice","setSelectedOffice","office","LocationName","activeTabId","dialogOpen","dialogTwoOpen","fruits","selectedMammals","mammals","CountBadge","FilterAllButton","clearFilter","cookiesAccepted","acceptCookies","Infinity","forNavigationDrawer","menuOpen","resetNotifications","SideBarNotificationEnabled","selectedLanguage","limitAlerts","showDashboardMenu","showNotifications","showDashboardMenuSidebar","setLanguagePreference","sidebarClass","userName","launchNotification","closeMenu","launchContactForm","toggleDashboardMenuSidebar","toggleNotification","toManage","launchUserProfileSearch","promptUserSelection","launchUserProfileView","launchUserProfileCreate","bookingName","customerName","manageBooking","showSignOutAlert","skywardsDropPanel","skywardsFirstName","skywardsLastName","skywardsLoyaltyId","skywardsTier","skywardsClosePanel","skywardsTitle","subMenuTriggerMouseenter","booleanName","subMenuTriggerMouseleave","subMenuTriggerClick","dashboardLinkClick","hideSignOutAlert","signOutAlert","AccountSignIn","noBufferUrls","popupSignIn","parsedUrl","pb","bufferRedirect","bUrl","currentRoute","postSignIn","advertService","onPopulate","maxToDisplay","getAdvertsForPosition","adverts","selection","serviceUrl","AttractionSelection","productPeopleCountMap","dateCaptureRequired","CaptureDate","bookingLoaded","Overlay","clickFn","elParent","winWidth","AttractionsCalendar","legend","eventNs","htmlCss","renderedDates","_updateDatepicker_original","_updateDatepicker","inst","afterShow","_get","debouncedOnRender","onRender","debouncedSetLayout","setLayout","getFirstPopulatedDate","currDate","defaultDate","filterDate","beforeShow","suppressPositioning","lastDisplay","createHeader","onChangeMonthYear","selectDate","dpDate","expected","syncField","restorePositioning","watchDateAttr","clearDate","monthsFromToday","dateIdx","getFirstAvailableDateWithTicketsIdx","firstDateWithTickets","firstDate","getDateKey","vals","spinnerHtml","hideLoading","overflowY","headerOffset","max-width","max-height","populateDates","dateKey","spinnerTimer_1","Legend","Abbreviation","sortTickets","getLegendChar","getPriceHtml","zeroPad","closeBtn","legendArea","headerArea","legendAreaConainer","dateOb","dpPosFn","_checkOffset","attractionsProductForm","buttonHandler","buttonDisabler","isDeposit","_setPaymentTotalPlusFees","fees","cardFee","CardHandlingFee","totalDepositWithCardFee","isScrolledIntoView","rect","elemTop","elemBottom","isMobileDevice","costBreakdowns","priceExcludesTax","PriceExcludesTax","roundedPrice","openHolidayInfo","editSearchModal","priceElement","editElement","editSearch","searchPanel2","getCostbreakdowns","reqs","getTaxAdjustmentValue","_costByProduct","taxAdjustments","updatedRoomCostItems_2","newPrice","getPriceFromString","priceUpdate","hotelSelected","searchHotelData","hData","bannerTotal","DepositAmount","roundedTotal_1","roundedDeposit_1","parentNode","HolidayDeposit","taxAdjustment","MutationObserver","mutations","mutation","summaryTotal","bannerText","innerText","summaryText","bannerNum","summaryNum","subtree","childList","characterData","sectionClass","toggleSection","BasketToolbar","basketTotal","basketCount","updateAttractionsBasket","BookingCompleteTracking","bookingCompleteTrackingService","trackingPixelsService","pixelsWithTracking","initTracking","onPixelLoad","report","onPixelLoadError","setTrackingUrls","offer","pixels","getAllProviderUrls","trackingLabel","bookingRefs_1","trackConversion","completeWorkflow","bool","NewTransactionTracking","BookingLookup","findBooking","bookingDescription","$viewChangeListeners","bw_1","oldB","useText","showBreadcrumb","baseAreaUrl","SearchUnitHomePath","shortText","activeCrumb","wrapperOffsetLeft","crumbsOffsetLeft","offsetPosition","reAmex","isAmex","cardSpec","CarHireSelection","drivers","u","updateDriverTitles","updateDriverType","newDriverId","oldDriverId","findAndUpdateDriverType","captureDrivers","guests","getGuestList","driverTypeModels","driverId","getGuestIdForDriverType","ineligible","additionalDrivers","guestId","driverType","keepGoing","models","dict","driver","requestedItemsCosts","Carousel","arrows","dots","fade","DEFAULT_OPTIONS","pauseOnHover","assignWith","opt","def","onToggle","mandatory","indexOfVal","array","CheckboxAll","checkbox","list","CheckboxArray","ClickPublisher","toggleEvent","listData","textProperty","triggerLabel","triggerClick","enableAutocomplete","lookupEnabled","_controller","base","toggleMenu","autocomplete","triggerClickHandler","submitted","ContactFormPopUp","isUrl","iframeUrl","ViewMode","CarHireItem","carHireCode","createItemFromQuote","CrossSellCarHire","optionsPromise","driverAge","driverAges","fromPrice","noneSelection","payLocallyCosts","isBusy","viewMode","carsAvailabilityBusy","selectedItem","setLocalPropertiesFromRequest","retrieveQuotes","setResults","findCarHireItem","updateTotalCost","updateOptions","mapQuotes","carCode","dropOffDate","pickUpDate","logMixPanelEvent","previousView","displayTerms","Terms","getCarInsuranceInfo","getDuration","item_1","carDetails","updateBasketOptions","_createBasketOption","optionsToRemove","optionsToAdd","carHireCost","carHireRequestedItemsCosts","payNowCost","driverAgeChanged","carInsuranceInfo","InsuranceInformation","showInsuranceExplained","showExplained","removeFlashing","DemageRefundDoc","viewTerms","hireDetails","parsedDateFrom","PickUpTime","parsedDateTo","DropOffTime","CrossSellInsurance","noneInsurance","insuranceAvailabilityBusy","showCoverDetails","noSuperQuotes","singleVat","multipleVat","_removeSuperQuotes","insuranceSearchId","insuranceQuote","insuranceQuoteDescription","Scheme","CrossSellInsuranceEnabled","getInsurance_1","hasPpPrices","key_1","quote_2","onUpdate","removeInsurance","viewInfo","currentInfoId","CrossSellParking","isBusyAvailability","noneSelectionId","selectedItemId","airportTitle","terminalTitle","findParkingItem","bestQuotes","addBestQuote","meetAndGreet","onAirport","best","maxBy","MeetAndGreet","OnAirport","isBusySelection","getFrequencyText","frequencyInfo","Frequency","frequencyText","CrossSellTransfers","hotelRoomService","showNoTransferOption","showMandatoryExtrasTransfer","showInitialMessage","transfersAvailabilityBusy","transfersSelectionBusy","mandatoryExtrasEnabled","isMandatoryExtra","defaultMandatoryTransfer","noneTransfer","emptyTransfer","mandatoryTransfer","hotelProductId","generateOptionId","HotelExtraId","HotelExtraOptionId","addOption","hemt","hotelExtrasMandatoryTransfers","hest","hotelExtrasSelectedTransfer","_getExpiredOptions","isTransferMandatory","transferSearchId","IncludeMandatoryExtrasBookedItem","IncludeMandatoryExtrasInHolidaysPrice","extra_1","includedExtras","isMaldives","ExtraReference","AvailableExtrasPerRoom","maldivesTransfers","_initMandatoryTransfers","transfersEnabled","isVilla","_checkIstransferMandatory","_setTransfersWatcher","currentTransfer","expiredOptionsIds","et","MandatroyTransferAirportCodes","MandatoryTransferAirportCodes","MandatoryTransferEnabled","airportCodes","OutboundAirportCode","CombinedRoomsCost_1","GrossCost","rankedResults","isAvailableTransfer","hotelDetails","EnforceTransferOptionSelection","isNoneTransfer","_trackingTransferSelection","_setMandatoryTransferWatcher","transfersWrapper","roomsWithMandatoryTransfer","_changeMandatoryTransfer","transferSelected_1","trans","TransferCode","ExtraOptionId","ClientPrice","removeTransfer","nullTransferText","transferId","index_1","transferPrice","flightFare","OptionIndex","HotelAndFlightCost","transferQuote","transferQuoteDescription","transferQuoteDescriptionWithPrice","destinationAiports","IsTransferMandatory","getHolidayRoomsWithTransfers","bookedMandatoryOptions","getSelectedTransfers","productType_1","productId_1","showApplyButton","isTimeApprovedByCustomer","timeLabelKey","timeErrorMsg","noInitialDate","datepickerClass","isDisabledPlaceholder","isRequired","isReadonly","parseCurrentDate","fieldVals","timeValue","dp","parseMinDate","allowed","setDepartureDateAndTime","tp","getHours","getMinutes","serialisedDate","isFunction","FILTERLINKCONTENTTYPE","destinationContent","containerClass","sitemapLink","contentOrderRank","ContentType","contents","Items","isNull","currentFid","matchedSeoItem","ci","DestinationPromoMessage","PromoText","matches","allowEstab","strandResources","reVarStr","_destTitleFallback","pDest","BreadcrumbTrail","SummaryTitle","404","400","inResource","titleStr","PageHeading","logMsg","toJson","dobField","minAge","ageCheck","$formatters","dob","DropdownCheckboxList","valueProperty","labelProperty","pluralLabel","singularLabel","EmailAllowed","$asyncValidators","emailAllowed","modelValue","$isEmpty","ea","_fireEvent","_destroyHandlers","events","attrLabel","attrTag","eventTag","FareRulesLink","showFareRules","fareRulesText","FareRulesText","templateName","tryStopPropagation","getClass","backendError","$transclude","processItem","footerCarousel","filteredThings","things","deleted","thing","new","sectionIndex","shortlist","savedSearches","addHotelToSection","section","removeHotelFromSection","setToolbarOpen","deleteSearch","removeSavedSearch","SavedSearchId","sections","removeSearch","rehydrateIfNecessaryAndThen","needsHydrating","setupSubscriptions","onDelete","deleteFromShortlist","extendSearch","identifier","emptyPrompt","needsRehydrating","showCount","removeFromShortlist","deleteFromRecent","recentHotelIds","shortlistEstabIds","footerToolbarPreferences","getShortlistEstabIds","attractionsBasketTotal","attractionsBasketCount","toggleBar","waiverText","globalWaiverTerms","fetchWaiverText","waiverTextReady","centre","headerHeight","windowResize","resizeMap","googleMapLoadedCallback","GoogleClientId","hotelMarker_1","Marker","animation","Animation","DROP","hotelInfoWindow_1","bounds","me","HeadingOverlayBanner","HeadingOverlayBannerMessageShort","HeadingOverlayBannerMessage","insertBefore","overrideOverlay","overlayTitle","getResource","HolidayDealListing","showDeals","getFirstDate","HotelDeal","eagerLoadImage","discountPercentage","dealPriceFormat","HotelOptionsSearchUnit","isArrivalTimeApproved","isDepartureTimeApproved","checkOutDate","transferArrivalDate","transferDepartureDate","minFlightArrivalDate","minFlightDepartureDate","selectedAirport","validateDates","setArrivalDate","setDepartureDate","zip","z","ValidationFail","hotelReview","cultureMatches","parentShown","localShowHotelname","localShowHelpfulPrompt","_like","reviewLikeType","LikedByUser","likeReview","ReviewId","_postLike","showTranslation","showOriginal","translating","ShowingTranslation","reviewTranslated","Translated","organicLike","postSubmissionLike","signIn","modalSignIn","showHelpfulPrompt","showHotelname","OriginalComments","getOriginalText","OriginalTopTip","TranslatedComments","TranslatedTopTip","TranslationFailed","IsBot","setTranslation","onerror","importantInfo","contentCollapsible","specialOfferText","offers","wrapNonArray","specialOfferHtml","injectParams","InsuranceSelection","defaultBandCostForType","insuranceConfirmation","insuranceOptionId","adultsWithInsurance","insurees","filteredInsurees","ignoreRooms","captureInsurance","PrepopulateInsuranceAgeBands","insuranceOptions","io","AvailabiltySearchId","onewayOnly","optionKey","insuree","getPassengerType","getPrice","InsuranceBandId","updateInsuranceBandSelections","excludedBandIds","person","adultAges","getInsuranceLabel","guestType","defaultOption","updateInsuranceQuote","InternalLink","navigate","targetEl","contentSelector","tabContent_1","triggerHandler","scrollToTarget","targetTop_1","$tabSet","tabOffset","toArray","$tabBar","tabTop","tabHeight","targetAndTabDiff","$stickyElements","stickyOffset","elTopOffset","isStickyLimitBeforeTarget","bottomAutoId","$stickyLimit","$header","navBar","navBarOffset","invalidateSize","mapLoadedCallback","getScript","scrollWheelZoom","scale","addTo","tileLayer","attribution","hotelIcon","iconUrl","shadowUrl","iconSize","iconAnchor","popupAnchor","marker","bindPopup","openPopup","openLightboxCount","include","busyMsg","innerClass","headerText","lightboxClass","appendToBody","renderEachLaunch","additionalContent","modalOverlayClass","domOverlay","$body","transcludeElement","previousScrollY","closeLightbox","_parent","marginTop","overflow","right","detach","actionTemplateService","templateData","utils","getUtils","chars","MailingListSignUp","abTest","showOptOut","openOptOut","closeOptOut","mailingListForm","MailingListUnsubscribe","SourceDetail","continueBrowsing","closeFn","unsubscribeListForm","MonthYear","isNotEmpty","MonthYearPicker","bookingTrackerPrefix","enableBookingTracking","att","myp","NavigationDrawer","ResponsiveNavDrawer","NewHomeRecommenders","recommender","recommenderUiHelper","recommendationLength","recommendations","initSlider","initSubscriptions","allSearches","filteredSearches","filteredSearchesExist","trackView","destinationThumb","isPreviousSearch","ngClick","ngClickSearch","getDestinationsForLanding","recommendation","similarDestination","isRecommended","ngClickDestination","initRecommender","getPageSize","NewsletterModal","SignUpReason","isNewsletter","trustpilotLogo","altBottomLogo","resourcesObj","policyText","resourcesSuccessObj","subTitle1","formatName","userSubscribed","fullName","openNewsletter","closeNewsletter","openOn","superHero","superHeroHeight","nm","idleInterval_1","idleTime_1","NewSubscribeModalABtestInactivityTimeout","mousemove","keypress","NumberPicker","increment","increase","decrease","basePrice","flightPrice","priceInformation","comparison","absolutePrice","divPosition","sign","currentPage","scrollContainer","maxButtons","preparePages","totalPages","pageButtons","currentPageIndex","addPage","pageNo","isSpacer","extraButtons","prevUrl","nextUrl","goToPage","captureParking","PassengerSelection","isCrossSell","skywardsLogin","enforceAgeValidation","EnforceInsuranceAgeValidation","guestMinAge","GuestMinAge","isSkywardsUserDetailsDisplayed","childTitles","ignoreBooking","bookingInit","AttractionDetails","togglePrefilledUserDetails","firstGuest","requiredRooms","skywardsUserDetails","loyaltyId","getMaskedSkywardsNum","skywardsIdUpdated","ageCheckDate","mapRooms","counts","resetPassengerCounts","AllowFillingFromCompanions","companions","enhanceCompanion","Fullname","InsuranceBands","selectedOptionId","CheckInsuranceForceAge","AdultSwimmer","AdultNonSwimmer","ChildSwimmer","ChildNonSwimmer","AllGuestDetailsRequired","passengerSelected","PrefillFrom","copyoverSkywards","passengerLoyalityNumber","skywardsNoIsDisabled","contactFirstName","contactLastName","passengerFirstName","passengerLastName","getPassengerLabel","isAttractionsStandalone","getRawSkywardsNum","skywardsNumber","replaceAll","skywardsNum","roomIndex","guestIndex","TempLoyaltyNumber","onlyDigits","guestContactName","enteredNum","lastChar","age_1","getAge","selectedInsuranceBand","passengerIndex","platform195ConvTracking","getJSON","generatePixel","bookingData","getPreSelectedData","getPlatform195Conv","getEstabId","conversionUrl","isSponsoredEstab","initConversionPixel","platform195Conv","internalPill","platform195settings","platform195Estab","titleLink","IsSponsoredEstab","ImpressionUrl","ClickUrl","ConversionUrl","impressionUrl","clickUrl","isPlatform195Estab","platform195EstabEnabled","convPixelEnabled","conversionUrlSettings","handleClick","conversionPixelSerialized","setConversionPixel","serialized","setPlatform195Estab","postcodeService","isPostcodeRequired","dontCaptureAddress","foundAndBound","Appender","retrievedAndBound","PostCode","PostalCode","Line1","Line2","Line3","Company","City","showSearch","setKey","isLookupEnabled","IsPostcodeLookupEnabled","retrieve","resetAddress","isSearchVisible","County","findAddress","addressForm","countryCodesArr","FilterCountryList","EnableContactState","getStates","states","forcePriceMode","ignorePreference","timeDirectiveRendered","PriorityBoarding","optionDetails","updatePriorityBoarding","pbSelectedStatus","loop","showMsg","CustomersGoingOnHoliday","chk","safeCheck","canc","full","starsNumber","hasHalf","currentStar","maxItems","selectedId","slide","resourceStrings","imageType","fallbackTagetUrl","imgClass","graphic","SaleBannerUrls","imageSrc","ImageSrc","TargetUrl","SeatPlanUnit","selectSeatsParent","closePlan","showPlan","resetSeats","flightSeatPlan","seatToConfirm","selectedPassenger","showSafetyMsg","generatePlanRows","selectedSeat","tokens","sequence","Sequence","seatNumber","seat","Rows","row","Blocks","_e","findSeatInFlight","confirmSeat","getTotalPrice","cycleNextPassenger","getFlightIndex","blocksToCols","cols","rows","headerCols","HeaderRow","groupAdultMinPrice","groupAdultMaxPrice","groupChildMinPrice","groupChildMaxPrice","groupAdultWithInfantMinPrice","groupAdultWithInfantMaxPrice","rowAdultMinPrice","rowAdultMaxPrice","rowChildMinPrice","rowChildMaxPrice","rowAdultWithInfantMinPrice","rowAdultWithInfantMaxPrice","seats_1","IsAvailable","ChildPrice","AdultWithInfantPrice","AvailableForChild","AvailableForInfant","getRowPrices","AdultMinPrice","AdultMaxPrice","ChildMinPrice","ChildMaxPrice","AdultWithInfantMinPrice","AdultWithInfantMaxPrice","col","planColspan","planRows","isSeatAvailable","getSeatMessage","SeatMessages","Information","getPassengerSeatForFlight","selectPassenger","allSeatsSelected","changeSeats","canConfirm","confirm","SeatNumber","PassengerID","IncludesInfant","getFlightSegmentType","selectFlight","getSelectedPassengerIndex","getSeatClass","RestrictionTextId","unavailable","xl","HasExtraLegRoom","getSeatTip","AdditionalInfoTextId","setPassengerSeat","restrictionText","confirmRestrictedSeat","closeRestrictionSeat","addPassengerSelectionText","pType","selectionText","getPassengersGrouped","showRestrictionText","baggageService","isFlightsPage","addingFlight","noFlight","detailExpanded","buttonType","showButton","detailOpen","FlightDetailsExpanded","BestFitFlightSelection","isPackagePrice","_updateFlightWithTrip","DepositAllowed","_flightCost","_hasBaggage","keepFlight","flightImage","fallback","AirlineImages","totalPassengers","totalFlightCost","flightCostPerPerson","getBaggageInfo","bagInfo","BagsIncludedCount","passengerBagCount","holdBagCount","toggleDetail","expandDetail","showChangeFlight","displayAlternative","trackingPage","skipRedirectionUpgradeFare","showBrandedFareTypes","seoRoomsLanding","seoRoomLoader","seoHideRooms","modalInner","modalOuter","lastFocus","hotelTitle","filteredRooms","SeoImgUrl","handleCardButtonClick","setAttribute","cardContent","bodyContent","modalName","imgSrcEl","descEl","scrollToSearch","behavior","inline","roomDetails","handleCloseModalBtn","isClosebutton","handleClickOutsideCloseModal","handleCloseModalKeyPress","roomCards","fetchRoomDetails","moreInfoLink","showPricesButton","initRoomModal","SimilarHotels","similarHotelsLoader","showSimilarHotels","similarHotels","SimilarHotels_1","err_2","SubTitle","AltText","TitleText","AriaLabel","ImgSrcUrl","getSimilarHotelsInfo","dual","showLabel","slidecomplete","modelWatcher","setSliderPosition","configWatcher","setup","edgesBecomeNull","ui","rtlSlider","hasBeenCalled","StarRating","categoryRoute","staticMap","googleStaticMap","lon","showMarker","deb","docViewTop","docViewBottom","markers","mapUrl","getStaticMapUrl","loadMapLazy","customClass","specificPosition","isStuck","contentY","stick","unstick","origContentY_1","hideIcon","holidayMessage","isEstab","ps","oppStrand","altStrandUrl","landingPageV2","urlText","oppositeUrl","pageStrandOverride","appendExistingQueryString","pageStrandEquals","strength","DeviceCategory","Tabset","denyAnim","minTabs","isPlaceholder","externalTriggers","foundTab","_isDeniedInitActivation","denyInitActivation","addTab","isActiveProductOption","productOption","noAnim","noClose","noPublish","headline","tabsetCtrl","tb","inlineTabBtn","contentEl","htmlSupport","maxlength","preventCollapse","resourceText","visibleText","visiblePart","hiddenPart","splitHtml","currentPosition","htmlContent","outerHTML","cropping","hidden","threed3Callback","isSuccess","mixpanelData","cpGValidationComplete","threedsData","secureForm","orderCode","authToken","UseCpgUpdate","AccessToken","getAuth","timeErrorMessage","focusTrackerHours","focusTrackerMinutes","minuteSkip","num1","num2","frontPad","ownButton","resetDefaultTime","setMinuteRange","mins","sync","ToggleSwitch","leftVal","rightVal","leftLabel","rightLabel","cls","invalidMsg","requiredMsg","fieldType","validateAs","alwaysShowErrors","manual","onMask","instantValidation","frame","clientId","receiveMessage","parseMessage","mask","postMessage","expiry","fontSize","setTranslationKey","translateKey","unitId","reviewTheme","reviewStars","widgetHeight","widgetManagement","initializeOnPageLoad","USP","classFirst","classLast","mobileFirst","breakpointSettings","useBreakpoint","onResize","slideCount","ShortlistCountText","failTest","lettersOnly","alphaNumericTenDigits","numericFiveDigits","numericNineDigits","notEnglishLetter","multiLangLetters","numbersOnly","numbersSymbols","phoneNum","flightNumber","postcodes","Default","GB","IE","requiredLengthRangeRegExp","nullOrEmpty","validator","watches","deep","isPureValidator","isObserved","pureValidator","$validators","$viewValue","requiredGuest","$parsers","dependencies","oneMainDriver","mainDrivers_1","numberOfAdditionalDrivers","additionalDrivers_2","checkFutureDate","validateAge","notDefaultMonthYearIf","notDefaultIf","postcodeIf","postcodeCountry","requiredIf","mustPassCreditCheck","minValue","requiredLength","rangeArray","numberFilter","attra","parseCurrency","formatCurrency","inArray","GROUP_SEP","charCodeAt","ctrlKey","inputValue","digits","$render","rawSkywardsValue","skywardsNumericNineDigits","upperCase","lowerCase","numbers","specialchars","twoOrMoreUpperCase","twoOrMoreNumbers","twoOrMoreNumbersSpecialchars","boolToInt","relativeTo","actionUtils","toDateString","positionId","AdvertServiceClientDomain","PositionId","AdvertImagesClientDomain","lastUrl","lastAbs","utmId","timers","_defer","requestAnimationFrame","webkitRequestAnimationFrame","skipAnalytics","GoogleTagManagerEnabled","IsUnitTestForAnalytics","trackTiming","GoogleConversionId","conversionObject","google_conversion_id","google_conversion_language","google_conversion_color","google_remarketing_only","google_conversion_value","google_conversion_format","GoogleConversionLabel","google_conversion_label","GoogleConversionFormat","google_trackConversion","trackSearchOrigin","requestedUrl","TrackSearchOriginEnabled","RequestedUrl","AcomSearchId","FlightSearchId","optOut","criteoId","Timings","performance","timing","CriteoId","OptOut","queryParams","sfmc_sub","jb","mid","salesForceParams","entries","updateSalesForceParameters","dlid","DeepLinkId","relUrl","_mixPanelReady","mixpanel","virtualPageURL","ReferrerUrl","referrer","_inactivityTimeToken","_resetTimer","_reload","_inactivityTime","timingCategory","timingVar","timingValue","timingLabel","trackRequestedHotelNotAvailable","$email","subscribeOnceAsPromise","MixPanelLoaded","Device Category","Platform","extractDomain","BookingLanguage","distinctId","get_distinct_id","identify","MixPanelReady","variable","formattedProps","dateTimeFormat","cabinId","FlexibleDates","CarrierAirlines","DirectFlightsOnly","_formatMixpanelSearch","HasBags","HasSeats","HasAttraction","HasMarhaba","PageVersion","TransferCostTotal","mixPanelBookingInfoPropsCache","uniqueErrors","iterate","stackDepth","validationMessages","_flattenObject","newObj","flatObject","_pushTripTypeToDataLayer","Last Search Date","BookingCompleteEcommerceLogEnabled","_collectEcommerceData","BookingCompleteEcommercePushEnabled","ecommerceData","_ecommerce","paypalData","_collectEcommercePaypalData","ecommercePaypalData","_ecommercePaypal","ecommerce","purchase","actionField","_collectActionData","BookingReferences","revenue","Balance","ClientTotalCost","_collectProductData","_getCategoryFromBookingRef","Stays","OutboundFlight","ResortName","_getTransferName","Car","PickUpPointName","DropOffPointName","ParkingSiteName","reducedData","Ref","Desc","_collectActionVariations","variations","affiliation","shipping","coupon","_collectProductVariations","variation","holidayCategories","holidayComparator","holidayCollection","intersectionWith","holidayData","differenceWith","ACM","SCH","EUF","TRN","INS","AUT","OLF","PRK","destinationEstabId","idCache","topic","localAirports","EnableStaticDepartureAirports","httpStatus","BadRequest","_autoCompleterApiCall","MaxResults","Term","mapDepartureAirports","cv","buildUpChildAirports","aa","_lookup","_filteredAirports","SearchTerm","filteredResult","LimitDepartureAirportsToLocalOnly","airports_1","PointOfSaleAutocompleterEnabled","postData","RestrictToFlightDestinations","AutocompleterClientDomain","MaxStringDistance","searchQuery","Fragment","nameParts","HolidaySearch","flightSpecificInfo","Sectors","holdBagsIncluded","passengerHoldBags","PassengerBagCounts","mapBaggageInfo","changeDurationPopupService","holidaySearch","marhabaSearch","multiSectorSearch","holidaySearchProgress","flightUnavailable","flightIncompleteDates","flightChanged","oldAndNewFlightDatesMatch","flightsRoute","Unavailable","HotelOptionsEnabled","createTrip","variantKey","err_3","createMultiDestHolidaySearch","refs","getBasketCurrency","clearBasket","redirectToComplete","ParasolBookingComplete","prodType","preselectedHotelData","perRoomExtra_1","roomNum","RoomNumber","roomExtra","addTransfer","_prepareBooking","addCar","addParking","selectMarhaba","_startMarhabaWorkflow","prepareMarhabaBooking","preparedBooking","sameWindow","newTab","OpenHotelInNewWindow","restartCurrentWorkflow","_addCommonCarHireRequestCriteria","PickUpLocation","DropOffLocation","roundedToStartOfHour","addHours","CarHireFlightDepartureOffset","CarHireFlightReturnOffset","pageIndex","_tidyAirportParkingTitles","DepartureFlightNumber","ReturnFlightNumber","DepartureTerminalCode","AirportParkingUseTerminal","getTerminalsForAirport","locationType","Visitors","LocationType","ProductItemId","getMarhaba","getAttractionsBasketId","selectHotelRooms","roomIds","selectRoomFirstTime","isMeta","isHolidayDeal","getBookingPath","rebookId","addHotel","HotelOptionsMinDuration","LinkedAirports","HotelOptionsFilterOutAirportCodes","totalRooms","singleRoomOnly","ParasolHotelBookingSingleRoomOnly","goV3","ParasolHotelBooking","mobileParams","forceRedirectToOptions","defaultFlight","HasFullDates","airportCodeFilter","AutoFilterByAirport","storeSelectedFlight","isNewFlight","flightComparisonResult","_compareFlights","isDifferentFlights","isDatesMatch","ChangeHotelNightsDuration","setAirportCodeFilter","BasketId_1","FlexibleTripType","FlightsRequest_1","PackageId_1","hotelsRequest","flightArrival","isFlightType","isHolidayType_1","isMultiDestHolidayType_1","isDirectFlight","NumberOfStops","isOneRoomOccupency","isHotelsOnFlights_1","selectedCheckIn_1","flightCheckIn_1","getCheckInDateForFlight","ekReferrer","nextRoute_1","getRedirectUrlAfterSelectFlight","timeRangeChangeDurationPoppup_1","DepartureFlightCutOff","HotelCheckInCutOffTime","flightReturn","checkInTime","newCheckInDate","newNights","nightsText","nightsButtonLabel","newNightsButtonLabel","messageHtml","popupHeader","popupMessage","searchFlowAfterFlightSelection","changeToFlightWorkflow","isHolidayType","basketStoreFlightResponse","removeAccomodation","optionallyAppendParam","changeToHolidayTripType","selectMultiFlight","addMultiFlight","updateFlight","numBags","holiday","addFlight","modifyBags","reason","reasonString","waitForFlight","_changeToHome","_changeToDeal","_changeToFlight","_changeToHotel","_changeToRoom","_changeToTransfer","_changeToParking","_changeToOptions","45","_changeToMarhaba","_changeToInsurance","handleMultiDestHolidayExit","getHolidaySearchProgress","bookHotelBasket","getHotelDatesFromFlight","getIOSDateFormat","getCheckOutDateForFlight","getNumberOfNightsFromFlights","_startHotelWorkflow","isHotel","createSearchPromise","hotelAvailabilityId","customRequest","buildHotelsRequest","createSearch","ImmediateSearch","isRoomSearch","saveHotelSearch","_startHolidayWorkflow","_startFlightPlusWorkflow","saveHolidaySearch","_startChangeableFlightWorkflowWithProgress","progress","saveFlightSearch","preselectFlight","PreselectFlight","isAgentModePreselectFlightEnabled","_startFlightWorkflow","HotelSearchId","KidsGoFree","querySymbol","hotelSearchFunc","isBestFit","DestinationBasedPackageRates","isV3HolidayRoute","flightOnly","isHotelFirst","sortId","_getSortOrder","useSearchUnit","CombinedDates","AvailableFlights","atLeastTwoDaysInTheFuture","validateNextDayFlight","landsAfterCutOff","ReturnFlightCutOff","departsBeforeCutOff","v3","flightDestinationKeys","isntFlexibleFlightDestination","saveTransferSearch","_startTransferWorkflow","saveParkingSearch","_startParkingWorkflow","addAttraction","New","saveInsuranceSearch","_startInsuranceWorkflow","startWorkflowInternal","addInsurance","isAmmendBooking","isHolidays","HotelSearchNoResultsPage","querystring","copyLocalToSessionStorage","gaSessionData","uniqueResult","dlNew","dlOriginal","sessionStorageData","ageList","isMultiDestHolidayType","isHotelsOnFlights","nextRoute","selectedCheckIn","flightCheckIn","timeRangeChangeDurationPoppup","newCheckIn","paramsCopy","addFlightPromise","isMultiDestHolidayLinked","addMultiDestHolidayFlight","addFlightResponse","skipRedirection","hotelDataJson","backwardCompatibilityUrl","EnableChangeFlightRedirectionToPrevious","isPreviousUrlHotelDetails","getPreviousURL","isPreviousUrlHotelOptions","isPreviousUrlHotelBook","newFlight","date1","date2","paramDate","CarHireSortOrder","Recommended","Paging","PageIndex","PageSize","visibilityState","sessionItems_1","excludedGAItems_1","gaEvents_1","theSearchDates","dataLayerItems_1","dl","commonErrors","marhabaService","adHocService","attractionsBasket","costBreakdownResult","addingFlightResult","ProductBundle","productGroup","productResultMap","bookingExtraOptionsMap","productIcons","_getBasket","discountCode","voucherCode","reclaimPriceDifference","ReclaimPriceDifferenceEnabledFE","RoomAndBoardIds","ReclaimPriceDifference","_addProduct","addVoucher","discountMsg","DiscountMessages","verifyDates","checkDates","adjustingDates","_adjustSearchDatesIfNecessary","newHotelsRequestDates","adjustHotelCheckInCheckOutDates","SeatPlanEnabled","baggageOptions_1","FlightSectorOptionalExtras","addBaggageOptions","baggageOptions","addMarhaba","getProductDetails","updateProduct","atts","TicketTypesCount","AvailabilityRequest","_refreshAttractionsBasket","lineItemId","updates","Updates","addCancellationProtection","removeCancellationProtection","removeOption","balancesDue","balances","balancesArray","_removeProduct","_rehydrateProducts","removeMarhaba","addMarhabaOption","_productsByType","_optionIndex","_changeOption","marhabaHolidayPath","flightOptions","optionConditions","OptionConditions","_optionsByType","adHoc","setPaymentMethod","AirlineSurcharge","removeProductById","removeFlight","bookingFlags","getNotes","addAdHoc","detailsRequest","getBasketId","addAdjustment","adjustmentRequest","_updateBasketPromise","getPriceAdjustments","AvailableAdjustments","getAddedPriceAdjustments","getBaseCost","baseCostNum","productTitle","removePriceAdjustment","adjustmentId","AdjustmentId","ExpectedVersion","_getAllCostBreakdowns","exclusions","_hidePricesIfNecessary","es","_enhanceCostBreakdownsWithProductTypes","excluded","groupName","groupEntry","futurePaymentAdminFees","FuturePaymentAdminFees","groupProducts","_concatCostBreakdowns","totalNet","ManualCommission","Margin","totalStr","totalNetStr","totalTravelAgentCommissionStr","totalMargin","totalMarginStr","_calculateProductTotals","legacyBasketId","LegacyBasketId","payments","totalBalances","minimumDeposit","totalCosts","prod","ImmediatePayment","balance","_aggregateCosts","initialDeposit","currentDeposit","schedule","pay","directPayments","payableLocally","RequestedItems","squashedAttractions","_enrichPayments","directAmount","payDepositAggregates","pda","TotalImmediatePayment","sumDiscounts","totalCostFromBasket","costList","flightBaggageCostings","costings","baggageCosts","BaggageCostings","TotalBaggageCost","hotelDeposit","insuranceCost","parkingCost","transferCost","hasTransfer","hasOutboundTransfer","hasInboundTransfer","hasParking","hasCarHire","hasCarHirePayableLocally","hasInsurance","productList","isOriginOpenJaw","IsOriginOpenJaw","hasConnectingFlight","MarhabaQuote","hasChauffeur","isChauffeur","availableOption","availableOptions","AvailableOptions","_checkChauffeur","hasAttraction","hasMarhaba","captureConnectingFlight","captureOutboundFlight","captureInboundFlight","captureSpecialRequests","captureHotel","captureVehicle","showPayableNow","showPayableLocally","showOptionalExtras","OptionalExtras","showParkingQuotes","getDynamicPackage","flatList","bId","services","flatten","ah","simplifiedBaggageCount","_simplifiedBaggageOptions","_baggageOptionComparer","minWeight","maxAllowed","unitWeightKg","allBagOptions","baggageNonCheckInOptions","NonCheckInOptions","MultiOptionalExtras","SingleOptionalExtras","intersectionBy","createBasketOption","pullAllBy","optionsOldFormat","pbDetails","pbBasketOptions","setProductVisibility","userRequest","setAdjustmentVisibility","checkBasketBookingAllowed","ProductSpecificFields","IsBookable","setBasketIdentity","getBasketIdentity","getTitleForProduct","getIconForProduct","getCancellationProtectionQuote","protectionDisabled","IsApplicable","CancellationProtectionEnabled","adjustments","adjustment","transfersCost","rehydrateBasketForPUP","_flushBasket","_getBasketById","firstOnly","hotelProduct","replaceBrandedFareType","RebookId","IsBrandedFareUpdate","HandleDatesMismatchError","fourHundred","Adjustments","TravelAgentCommissionRate","IsHiddenFromDocumentation","IsHidden","IsPriceHidden","newBasket","_addProductDetails","rehydrator","p2","_changeOptions","cutOff","checkIn","checkOut","requiredCheckIn","requiredCheckOut","ResetAdjustingDatesFixEnabled","buildBaggageArray","opExtras","bagOpts","BaggageUseDefaultOption","IsDefault","getSpecificCheckInOption","typeName","addCheckInOptionsIfNecessary","checkInOptions","nobags","withbags","optionalExtras","forHoliday","AccountingCurrencyCode","productsToHidePrice","PackageFlightPrice","HidePrice","x_1","PayDepositAggregates","responseBasketId","baggageOptionsSimplified","addToArray","bagOption","weight","o1qty","ChoosenQuantity","o2qty","TravelAgent","TravelAgentCustomer","BookingCompleteTrackingService","ecommerceService","userEmail","trackTotalCost","criteoData","trackingData","FirstBookingId","pushBasket","recordRevenue","supervisors","validRoutes","supervisor","canceller","remainingSupervisors","KeyCode","countryService","getTopDeals","topn","getHotels","updateFilterFromFid","_getHotelsForDestination","getTopChildren","objectTypeAndId","Index","Size","getCustomerIdComplete","tailorMade","language","en","ar","CriteoEnabled","criteo_q","_config","conf","transaction","_getSearchDates","user_segment","checkin_date","checkout_date","_productListTag","_getIds","getTopEstabsForAirport","_buildConfirmationId","retarget","hash_method","getEmailHash","emailHash","account","CriteoPartnerId","append_to_landing_url","useTrip","useLandingPage","landingPageV4","fromUrl","tm","landingPageV3","tmParam","possibleParam","setFidFromDestinationFilter","destinationFn","enhanceDestinationFromPreferences","_Area","oneDay","addMinutes","setMinutes","_serialiseIfNecessary","_xDaysInTheFuture","birthDate","minutesToHoursAndMinutes","leadingZero","alignDates","sameMonth","newDate","thisWeek","nextWeek","dateRange","thisMonth","specificMonth","totalMinutes","diffMs","getWeeksString","weeks","valueOf","endTime","getDateInterval","rangeLength","skipPivot","halfRange","initialDate","startingDate","checkZonedDateFromat","getNextSaturday","theFuture","howMaynDaysYet","getDay","setMilliseconds","defaultTimeObj","_toUtc","getTimezoneOffset","rest","setMonth","earliest","latest","fmt","isFinite","p1","dow","flowRight","a1","a2","durationSummary","DealsBoxService","hotelInfoBackTracked","singleEditTrack","enrichSelected","getCurrentFilters","enrichDeals","getDealsForCalendar","getDealsForHotel","getTransfersMap","transferTimes","Minutes","getRoomsForDeal","oldRoom","oldBoardType","dealsRooms","_sortRoomsByPrice","_pickBestRoom","updatePriceLabels","selectedRoomId","currentBoardTypes","selectedBt","updatedBoardTypes","_calcDifference","NamePrice","updatedRooms","boardCost","PriceDiffLabel","findTemperature","temperatures","weather","Temperature","getTabCounter","entryPoint","sendTabTracking","tabsStat","trackHotelInfoBack","trackOpenBox","dealsNumber","dealsMiss","EstabName","DealsOnCalendar","DealsMiss","trackDateChange","newDeal","oldDeal","DayOfWeek","Delta","trackDealEdit","_findSelected","preselected","DepartureEpoch","oldBt","pRoom","pBoardType","bestSelection","persisted","_persistSelection","priceToCompare","currentPrice","fieldFilterParser","DestinationServiceClientDomain","strands","textUrl","tileUrl","tileImageUrl","websiteUrl","airportCache","fieldsFilter","_isAirport","isAirport","airportKey","detailsSearch","logWarning","getAirportCode","getDestinationIds","shorten","AirportCount","getDetailsForAirport","IncludeBreadcrumb","auth","CountryOwnId","bcTrail","getCountryOwnId","TagIds","getDetailsForDestination","FilterId","getAllChildren","errorHandler","PageStrandId","Path","getAirportDestination","getHeroImage","baseImageReq","infoTile","TitlePattern","sortByTitle","populateObjectTypeAndId","preferencesDest","getAllCountries","getDestinationInfo","pagestrand","apiName","comparatorFn","separator","Contents","Friend","transactionId","sku","ProvinceTitle","segmentInfo","flightInfo","DestinationAirportTitle","transferDetails","transferInfo","DeparturePoint","parkingDetails","parkingInfo","sku_1","attractionDetails_1","attractionInfo_1","attractionBreakdown","carHireDetails_1","carHireInfo_1","hireProvider","marhabaInfo","insuranceInfo","calCurrency","addTransaction","transactionTotal","transactionTax","transactionAffiliation","transactionCurrency","transactionProducts","addItem","dimension1","dimension2","baskets","_tagManagerEnabled","basketInfo","basketResult","SelectedRegionalContext","newItem","transactionRollup","EnableAnalyticsCurrencyConversion","_errCallbacksCollection","googlebot","prerender","_counter","callbacksHandled","_callbackName","_errCallback","_invokeCustomCallback","ajax","contentType","$exceptionHandler","$log","ie9","skipErrorsLogging","digestErrors","errorQueue","tick","errorDict_1","deduped_1","loggingError","exception","cause","stackTrace","printStackTrace","errorUrl","FilterIdUtils","_filterData","estabGroupFilterAvailable","_groupFilterAvailable","createEstabGroupOptions","groupAggregates","hotelCount","EstabGroupName","lookupFid","sanitiseFidFilters","defaultFilterCriteria","propertyMap","fidSettings","compareFiltersWithAggregates","objectFilter","filteredFilter","ignorable","omitBy","updateEstabGroupProperties","FilterByEstabGroup","FacilityCodes","PriceRange","HolidayPriceRange","RatingRange","PropertyTypes","pageStrandId","BoardTypeCode","PropertyType","Filtering","_serializeArray","_deserializeArray","ChildDestinations","_serialiseRange","_deserialiseRange","_mergeFromFid","_mergeFromParams","deserialiseFilters","rawFilters","filterObj","updated","paramValues","paramValue","newParamValue","getBoardTypeName","fidFilters","sortCriteria","flightSearchValidator","FilterUtils","filterCanceller","staticUrl","filterDefer","sortCriteriaDef","filterUtil","_defaultFilterCriteria","NumberOfLeadBags","WaitForResults","resetFilters","getFlightSortOrder","filterDeferred","_getFilterCriteriaSet","filterSet","filterName","getAirportTitles","AirportCodes","getFilterLazy","getFlightsForDeals","destAirports","depAirports","api","FlightsCount","getFlightInfo","flightData","stopText","segmentCount","getBaggageAllowanceTotalKg","BaggageAllowanceKgPerBag","getBaggagePieces","BaggagePieces","getBaggageAllowanceKgPerBag","getOccupancySummary","getRouteSummary","selectedFlightId","getSearchSummary","getSortCriteria","getSortCriterionDescription","rehydrateMultiDestHolidayFlight","setBags","numberOfBags","_resetPriceRange","resetPriceRange","nextPage","rangeFilterSet","UnfilteredAggregates","removeArrayFilter","resetArrayFilter","resetBooleanFilter","resetRangeFilter","CombineDates","FlightOnlySearch","IsDirectFlight","childTaxArr","infantTaxArr","adultFareArr","childFareArr","infantFareArr","priceQtys","calculatePrice","OfficeLocationId","fr","prunedReq","copyFilterFrom","showFlightDetailsModal","isHotelFirstJourney","criterion","setFlightSortOrder","trackFlightClick","_flight","partial","RepeatFlightClicked","InboundCareer","OutboundCareer","fRequest","FreeBaggage","selectionsReq","OutboundDepartureAirport","OutboundDepartureDate","OutboundArrivalAirport","OutboundArrivalDate","mapSegmentForTracking","InboundDepartureAirport","InboundDepartureDate","InboundArrivalAirport","InboundArrivalDate","newFilter","Stop","OutboundTakeOffRange","ReturnTakeOffRange","HideOpenJaw","filterCopy","setToNullIfMatches","dontApply","destAirport","_s","AdditionalStops","destinationCodes","destinationAndDepartureAreSame","MaxPassengers","FlightsFilterService","sortArray","FlightsByAirlineFilterOrder","arrayifyAggregates","Logo","minimumPrice","MinimumPrice","populateMinimumPrice","FlightsByAirline","defaultClientLocation","ClientDefaultLocation","getLocationFromIpAddress","ipAddress","ClientIpAddress","getAirportsNear","latitude","longitude","NearestAirportsMaxDistance","maxDistance","geolocation","getCurrentPosition","coords","NearestAirportsStaticList","airportValidator","UseStaticDepartureDropdown","validAirports","validAirportCodes","va","getAirportValidator","nearbyAirports","DealsFindParameters","getPropertyTypeFromResKey","API","HolidayDealsDurations","runningRequest","HolidayDealsPageSize","includeAggregates","_f","discountedPricesOnly","_g","findParams","Weather","TransferTimes","paging","_findDeals","_enrichProducts","FilteredHotelCount","UnfilteredTotal","searchSummary","airportsTitles","AirportTitles","getMapCoordinates","deserialiseParameters","DatesAndDurations","OriginAirports","getDealsFromMap","presetParams","boardTypeFilters","BoardTypeMinPrices","hotelPrice","FlightsDeal","PricePerPerson","selectDeal","originalTimes","selectedBoardType","_trackDealChanges","toUrl","getParams","serialise","flex","HolidayDealsDefaultWeeks","HolidayDealsDefaultOccupancy","HolidayDealsDefaultDuration","appDate","_getSummaryElements","different","fromString","enrichHotel","imageW","imageH","propertyType","AcomTypeId","IsVilla","numberOfNonInfantPassengers","PropertyTypeFrom","MinPricePerson","DealMinPrice","DealWasPrice","WasPrice","WasPricePerPerson","getMinHolidayPrice","_getTeaserPriceRequest","getMinCruisePrice","_getDatesAndDurations","orig","sel","priceVariation","DurationChanged","DateChanged","FlightChanged","RoomChanged","selectedRoom","BoardTypeChanged","PriceVariation","IncludeAggregates","IncludeCruises","DiscountedPricesOnly","IsCruise","_enrichCruise","CheapestBoardType","cutoffDate","HolidayDealsGrouped","_find","dealsPerDestination","getByDestinationsRequest","DealsPerDestination","getDates","dealsForManyDestinations","dealsForADestination","Flexibility","cutOffDate","offsets","year_1","month_1","endOfMonth","HolidayDealsPromoService","DEST_IMGS","ALL_IMGS","_getNextMonth","plus","_buildOccupancyString","_getBlocks","HolidayDealsPromoPrices","high","cSymbol","_adjustPriceRange","HolidayDealsPromoDestinations","childNum","newPriceRange","endsWith","searchUrl","ArrivalAirports","adjustHotelDates","cropImage","includeRooms","calculateTotalCost_1","costAggregator","hotelFilterQueryStringParser","roundedCurrencyFilter","hotelSearchValidator","aggregatesCache","inProgressStatic","creatingSearch","allBoardTypes","pruneRequest","setDefaultCriteria","setPostsCountByCountryId","_initialFilterCriteria","bitFilterSet","HotelAvailabilitySearchIdHashing","doSearch","getHotelSortOrder","setSortCriterion","usedIds","getUserSelectedFilterCriteria","refreshRankingScores","searchTriggeredBy","getDestinationEstabId","getDestinationTitle","getFacilitiesIcon","AC","BA","BC","CC","DF","GF","GM","HA","HB","HC","HF","HK","HN","HQ","HS","HT","HU","HV","IN","PA","PK","RS","SP","SW","TV","WN","WP","adjustingInProgress","ignoreTracking","getStaticSearchResults","stat","Variant","getTripForSelectedMultiDestHoliday","linkedFlight","LinkedFlight","flightsRequest","newTripId","newTrip","getFlightDetailsForSelectedMultiDestHoliday","getBoardTypesUrl","boardTypesUrl","removeFiltersIn","removeFilter","applyDeepLinkFilter","resetBitFilter","resetFrom","progressiveHotelSearchEnabled","showAtol","fidCheck","canonicalSuffix","Canonical","getMandatoryExtra","hasMandatoryExtras","roomWithMandatoryExtras","ExtraTypeId","getMaldivesIsMandatory","IsMandatory","fetchAllBoardTypes","addTitleToBoardTypes","addDynamicTitleToBoardTypes","clickPanel","flightmiles","availabilitySearchFlags","staticSearchFlags","_setInProgress","existing","SearchCompletePercentage","disablePaging","StreamPrices","currentInProgress","notfound","410","errorPath","hotelsPathSupported","bfd","AllowIncompleteResults","intermediateRes","tripLocal","RefreshRankingScores","AddMeetAndGreet","BookingChannelId","_url","notStaticSearch","PlacementId","reqCopy","selectedEstabId","selId","SelectedEstabId","taxObj","CityTax","CityTaxLocalAmount","CityTaxLocalCurrency","Taxation","MinCostPerPersonStr","OriginalCostPerPersonStr","MergedHotelsByFacility","HotelsByFacility","mergeFacilitiesFilters","LowestPricedHotel","HotelsByGroup","HotelsByBoardType","currentResults_1","filterData","getHotelSortValueById","noUserClicksRank_1","noRecommended_1","familyFriendlyOffered_1","FamilyFriendlyEstabGroup","winnerOffered_1","RepeatHotelOffered","TopDealsOffered","WinnerOffered","NoRepeatHotelsOffered","NoTopDealsOffered","FamilyFavouriteOffered","IsKidsPromoEligible","IsJanSale","estabIDArray","ppPriceArray","TotalPriceArray","SearchID","newBoardTypeStrings","_loop_4","boardDetails","boardTypeStrings","validateTimeOfDay","dateFromConfig","SameDaySearchStart","SameDaySearchEnd","timeValidation","zNow","zDep","cfg","hotelsSitemap","pageNum","getSize","InsuranceSearchValidator","childOccupancyLoop","adultOccupancyLoop","FlightDetails","fd","cf","_setTime","departureTime","arrivalTime","InboundFlightNumber","inboundFlightNum","OutboundFlightNumber","outboundFlightNum","inclExt","getRoomsWithTransfers","roomGridData","selectedPrices","selectedRooms","_loop_5","FilteredAvailability","roomNumber","roomTitle","nonInfants","hotelExtraId","hotelExtraOptionId","addDeltas","cheapestTransfer","deltaPrice","getSelectedPrices","bookedHotelData","_loop_6","bookedTransfers","_loop_7","roomWithTransfer","getBookedTransfersPrice","HotelExtraTypeId","HotelExtraId_1","roomNumberId","hotelExtra","sortMarhabaResults","sortMarhabaResultsName","filterMarhabaResults","isLounge","isFree","MarhabaQuoteId","validChildren","maxElements","getMarhabaEnabledTerminals","adjustMarhabaOptions","productInfo","defaultChauffeurName","noOptions","auxillaryProducts","Num","chauffeurs","lounges","selectedChauffeur","marhabaSearchValidator","kiddos","numberOf","infants","_childrenAndInfants","StaffRates","_obtainSearchParameters","simpleRequest","TerminalId","_search","multiSectorSearchValidator","MultiSectorFilterCriteria","SectorIdentifiers","prom","Any","strandToRoute","parsed","parseIdBasedUrls","idPart","preferencesHttpProvider","initial","SaveSortPreferences","localPrefs","getDefaultFlightSortOrder","getDefaultHotelSortOrder","defaultPrefs","DefaultPriceMode","prefsPromise","HotelSearchOrder","FlightsSearchOrder","argumentsCopy","PricingService","hasActiveVouchers","PriorityBoardingService","getPriorityBoardingInfo","oneWayFlight","bothWaysFlight","pbInfo","inboundOnly","both","oneWayFlightPB","_getPBOption","flightExtra","otherOptions","_clearPromise","areaSupported","401","AgentLogonUrl","suggestedPageSize","likeTypes","organic","postSubmission","reviewsCache","getRatingCategories","reviewId","CustomerReviewCount","remaining","moreReviews","ExcludeEmptyComments","getReviewSnippets","_translate","_truncate","responses","getTranslatedText","setSnippetTranslation","snippet","translations","translatedText","_processGetReviewError","like","_likeReview","Like","ReviewLikeType","_clearCache","errCode","$$search","$$compose","cachedSearches","cachedSearchTypes","supportedSearchTypes","supportedTypes","fromDateTitle","toDateTitle","fromDateField","toDateField","SearchModel","ReducedOccupancy","flightSearchRequest","DepartureAirportTitle","_saveSearch","DepartureAirportsTitle","_getTransferSearch","AirportTitle","parkingSearch","_getInsuranceSearch","_searchRestored","_restoreTransferSearch","PolicyExtra","SearchTypes","_normaliseSearch","getCabinType","PolicyTypeTitle","CabinTitle","getter","trackSearchEvent","dimension3","dimension4","dimension5","dimension6","dimension7","dimension8","IsAmend","shortlists","_getShortlists","Shortlists","getShortlist","sls","gatherShortlist","sl","addToShortlist","ShortlistId","Note","found","getHotelsInShortlist","isShortlisted","dealsCriteria","processedFlightCriteria","getDealsCriteria","criteria","processedDealsCriteria","dc","saveSort","getSort","translateHotelSort","criteriaValue","processedHotelCriteria","hc","defaultDir","otherDir","translated","translatedKey","sortObj","processCriteria","itemCriteria","iii","costing","flightBookingPrefix","hotelBookingPrefix","bundleBookingPrefix","marhabaBookingPrefix","insuranceBookingPrefix","transferBookingPrefix","bookingRefs","provider","prefixExp","clickId","VisitSource","EventType","ClickId","storage","currURL","urls","getURLHistory","cameFromWrongPath","applicablePathRegEx","previousURL","isTripIdChanged","splitedCurrentPath","currentTripId","splitedPreviousPath","previousTripId","VoucherModalService","bd4userId","AgentBookingForm","abf","officeDetails","AgentPaymentBox","apb","_confirmOverride","overrideInfo","OverrideCardId","OverrideUserId","UserName","showOverrideBox","overrideErrorMessage","_failedOverride","errorInfo","authorizeOverride","username","cardFeeOverrideForm","formInvalid","loginOverride","hideOverrideBox","AdminOverride","hasOverridePermission","FlightCapture","inverse","_setAirport","_setDirection","outbound","setDateAndTime","resetDestinationAirport","CanSelectSeats","getSeatPlan","plan","HolidayDealsResults","bd4t","showSearchUnit","dealsSortCriteria","toggleMap","showMap","isFiltered","openSlideFilter","showFilterBox","updating","cruiseCount","sortElement","ChangedTo","lightboxOpen","mapReady","loadingDestinations","loadingCoords","loadingInfo","loadingChildren","_getReviews","popupMap","showPopupMap","showAllDestinations","allDest","buildPagePaths","child","_getHotelUrl","leadingSlash","allDestinationsUrl","toggleDestinations","requests","dealsTitle","List1Title","greatDeals","loadingDeals","popular","bookButton","HotelsFilter","hotelsFilter","hf","updateFilter","watchFilter","filterLimits","getFilterLimits","moreLess","toggleLimit","name_3","toggleOpenSelected","configureFilterLimits","resetFacilityFilter","codesInGroup","BasePopupService","defaultOptions","popupContainer","popupOptions","_createScope","popupScope","compiledElement","addPopupToContainer","removePopupFromContainer","customScope","mergedScope","functions","ChangeDurationPopupService","basePopupService","defaultPopupScope","defScope","popupParams","ConfirmPopupService","okButtonLabel","cancelButtonLabel","SignUpPopupService","signUpPopupBackgroundImageUrl","_getBackgroundImageUrl","backgroundUrl","configValue","SignUpPopupBackgroundUrl","RightToLeft","LeftToRight","_sendPopupClosedGAEvent","showSuccess","continueButtonLabel","successMessage","titleLabel","unsubscriptionNotes","subscribeButtonLabel","styles","continue","baseMap","thumbnail","dealsMode","hotelPosition","disableUpdates","initializeMap","getLocations","populateMap","mapInfo","canvas","activeHotel","hotelMarker","addMarkers","setZoom","initialized","clearListeners","combobox","searchField","pScope","keyBehaviours","_keyboardMovement","selHeight","elementTop","elementBottom","listTop","listBottom","_scrollOffset","FlightLeg","displayFlightViaInfo","DisplayFlightViaInfo","displayMixedCarrierMessage","IsMixedCarrier","displayCodeShareInfo","DisplayFlightCodeshareInfo","mixedCarrierMessage","viaInfo","getFlightViaInfo","getNumberOfStops","segment","carrier","CarrierTradingName","tradingName","viaflight","operatedBy","FlightListing","flightMiles","sentPayload","skywardsFlightMiles","flightWatch_1","recentlyViewed","isFirst","RecentlyViewedIndex","showDeposit","showInfo","showBaggage","DisplayBaggageFeesLink","depositMessage","flightButtonText","stops","selectFlightAction","flightAction","calculateSkywardsPoints","defaultFlightData","legs_1","adultQty","childQty","infantQty","totalFlightTax","defaultFlightDetails","infantCount","childCount","adultCount","getBasePrice","selectedFlightData","getFareBrandTitle","supplierfareclass","spplierClassFirstLeg","spplierClassSecondLeg","legsAreNotEmpty","firstLegEqualsSecondLeg","appliedBags","nonInfantPassengers","FlightStops","getStops","viewHotelButton","templatesByTenant","isTrip","pm","_calculatePrice","_setHotelId","inlineStarsEnabled","InlineStarsEnabled","hotelImage","reviewString","hotelCustomerRatingCount","displayReviews","selectButton","hotelWithDeals","pageHotelId","costValue","displayPrice","lightboxMap","displayModal","displayLoader","showInfoWindow","selectedMarker","mapRendered","loadingMap","lightboxMapTrigger","ModalParkingDetails","hotelCoordinates","MAX_ZOOM","isMapReady","isDealsMode","mapLoadedCb","TRPMAPS","_pollingForMap","_mapLoaded","script","defaultCoordinates","displayInfoWindow","_parseResults","_getDealsLocations","coordinates","positions","getCoordinates","isAvailable","_getHotelPositionsForTrip","hps","targetHotel","hp","fullscreenControl","clusterer","MarkerClusterer","maxZoom","clearMarkers","_markerClickedFactory","hotelPositions","defaultCoords","CentrePosition","_getMapCentre","dealMinPrice","clickable","FlightsFilter","flightsFilterService","ff","limitedFilters","isAirportFilterAvailable","isDatesFilterAvailable","configureFilterOptions","FlightsSort","HotelsSort","AvailabilityMap","mc","togglePopup","loadCoordinates","parseResults","FriendlyUrl","name_4","AirportMultiSelectUnified","numNights","selectRooms","flightCostTotal","holidayMode","roomsLeftLimit","showCityTax","compareRefundableDates","pickRooms","showMessagePopup","defaultMultipleRoomsSelection","showAllRooms","roomsToShow","selectSingleRoom","showMandatoryExtrasModal","selectMultipleRooms","totalRoomCosts","totalRoomCostsOriginal","moreRooms","toggleExtraRooms","roomImages","showRoomImages","showDiscount","SeasonalDeals","isPillVisible","callToBookEnabled","CallToBookEnabled","trueRooms","holidayWasAmount","holidayAmount","holidayDiscountPercentage","DiscountPercentage","checkIsBasePrice","boardBasis","displayBoardPrice","showIncluded","priceItem","holidaySummaryCost","uniqueArray","selectedRoomsCost","displayTotalBoardPrice","dynamicTotalPrice","updateRoomChange","roomPrices","getSkywardsMiles","setBoardId","findTemplate","restructureData","getBoardTotal","estabList_1","_restructureData","showMultiRoomDates","hasStoreSelectedFlight","getMultiRoomDate","charges","EventDate","hasChargeDates","getChargeDates","isMultiRoom","chargesCheck","getRefundableDate","getRoomId","clickedElement","getNoOfRooms","FocusTracker","lastField","setLastField","confirmText","confirmCss","rejectText","rejectCss","isDefined","lightboxGallery","eventMode","currentImage","inner","stagePadding","inTransition","hoverPrev","hoverNext","totalImgs","getNextIndex","visibility","aspect","maxWidth","minAdults","maxAdultAge","initPosition","initPositionTimeout","sanityCheck","memoizePerArea","getRooms","roomOccupancyString","totalPeopleCounts","startExpanded","watchProperty","expandText","collapseText","_setButtonText","cancel_1","maxParagraphs","activeClasses","requiresCropping","contentIsHidden","showHideClass","toggleHiddenContent","hideEvent","slidePanel","startWatch","slideOpen","slideShut","shutInstantly","sortButton","asc","preferenceKey","sortDropdown","cancelWatch","orderResource","orderText","removeUnmappedHotels","coordsCache","cancellationRequest","imageDomain","HotelImageCDN","getImageDomain","reAbsUrl","inclusionPrice","pricePlusFlight","getFlightFares","InclusionPrice","roomsData","masterRooms","combinedRates","inclusionPayloadArr","master","_getMasterData","masterDescription","MasterRoomDescription","ExtraDescription","compareBoardTypeId","SupplierBoardTypeId","LowestBoardTypePriceOnly","BoardDescriptionOriginal","boardPrices","isSkywards","getAccruedMiles","_combineRatesForRoom","keyBy","isRoomKidsFree","getCancellationChargesService","clickedId","radios","parentRadio","dedupedIds","removeDuplicateId","RoomIds","getIncludedRooms","availability","filteredAvailability","availabilityLength","boardList","NewImageUrl","masterRoom","error_4","inclusionPayload","inclusion","ip","SkywardsMilesToDisplay","saveUsername","agentSigninModel","doRedirect","rootpath","updateDebugCookie","updateDebugSettings","AgentDebugSettings","SessionOnlyAgentCookie","sessionOnly","AgentDebugOverridesEnabled","confirmNewPassword","oldPassword","initiateReset","resetStatusText","resetPasswordInitiate","resetPassword","SelectedAttractionCtrl","totalCurrency","showAttractionsInfo","basketItems","specification","Specification","dateValidity","datesMatch","ticketsTotalPrice","getCount","toggleInfo","getTotalCurrency","Auth","authPages","bookingSigninModel","bookingNumber","forgot","registerModel","emailSignUp","resetModel","signinModel","tabContent","_cancelEvent","_isAuthPage","switchTab","hideHeaders","showHeaders","errorMB","mybErrorMsg","switchTabContent","_postSignin","_closeModal","_socialSignIn","_signupError","loginResult","onSet","FacebookAppId","cancelAuth","login","FB","authResponse","accessToken","auth_type","gapi","authorize","client_id","GoogleAppId","response_type","signed_in","access_token","byAgent","BookingSignInByAgent","verificationContinue","bookingSignIn","showForm","SocialSignin","signInWithEmail","verifyAndChoose","changePasswordRequest","fbAsyncInit","xfbml","appId","BookingConfirmationCtrl","defaultColSizePromo","defaultColSizeCrossSell","loadingCrossSells","showBreakdown","showCarTrawlerWidget","showEmailInformation","bookingTypeProductLabelMap","addProperty","AttractionTickets","TravelInsurance","destinationImageUrl","paymentDetails","orderedCrossSells","orderCrosssells","colSize","colSizeCrossSell","breakdown","groupProductBreakdowns","carTrawlerUrl","buildCarTrawlerUrl","ShowWidget","usersFirstName","authModalOptions","manageBookingUrl","showEmailInformationModal","printPage","print","trackCrossSellClick","getProductLabelForBookingType","outLeg","IsOutbound","inLeg","amendDate","pickUp","dropOff","FlightNo","orderedList","orderPreference","preference","sortMap","packageTotal","PriceBreakdown","IsPaymentFee","item_2","isPriceHidden","supplierRef","SupplierRef","isPackageProduct","invisible","paymentsCalculator","pricingService","paymentTabOptions","paypalInContextSet","changeWorkflowState","acceptedAgencyTerms","specialRequests","feePercent","feeAmount","pastYears","agentImportantNoticeCheck","paymentAmountWithCardFee","showTakingPaymentModal","isSecurityCodeMasked","isNotCash","voucherCodeInput","showDiscountAppliedBox","discountAppliedBoxMsg","isHasActiveVouchers","isDiscountApplied","Discounts","enbdDetails","isCpgValid","isOtpValid","sessionToken","isPointsPaymentApproved","pointsToRedeem","amountToRedeem","availablePoints","balanceData","isCpgInProgress","isOtpInProgress","isOtpResent","showZeroBalanceAlert","cardNumberMinLength","showBreadcrumbs","showCovidPaymentDisclaimer","isBookingPage","bookingMiles","hideForm","threeDsValidationComplete","isPaymentPage","onCpgStatusAPIError","paymentTakenMsg","paymentFailedMsg","errorMsg","getVouchers","IsAddVoucherEnabled","reloadPage","bookingFormVersion","totalCostExcludingDirectPayment","directPaymentCost","_updateCardFees","isPayPal","fullCardDetails","FullDetails","CardHandlingForTotal","paymentTotalWithCardFee","customerCreditCheck","showCreditCheckResult","creditCheckResponseText","creditCheckStatus","CreditCheckPassed","getCreditCheck","creditCheck","ResponseText","CustomerId","CustomerName","StatusId","_prepareBookingSubscriber","paymentAmountInput","PayFullAmount","payingFullAmount","refreshEnbdObj","changeOtpCode","LoyaltyCardDetails","otpConfirmationCode","threeDSValidationComplete","Revenue","HotelTitle","ChauffeurDetails","ContactNo","initXO","PayPalVerification","ThreeDs","Cpg","cpgValidationComplete","Refresh","RefreshResponse","StaleProducts","NewProductId","popupType","pupProducts_1","dataForPup","totalCostGrouped","extraCost","pupProduct","oldHotelCost","oldHolidayCost","pupAmount","oldFlightCost","PUPAmount","trackAndBook","FullAmountPaid","DepositAvailable","isHolidayOrFlightType","deliveryOptions","carHireRequestedItemCosts","getRoomOccupancyDetails","finalTransfer","costType_1","updatedRoomCostItems_3","providersString","buildProvidersString","EnableExtraCustomerInfo","AgentEmail","EnableExtraContactInfo","EmailSignupDefaultValue","ds","InboundDestinationAirport","InboundDestinationAirportName","OutboundDepartureAirportName","RequirementsList","DisplayRoomNumber","RequirementsText","DeliveryOptions","delivery","HotelDeposit","PayUsNowAmount","policyextras","FlightDeposit","InboundFlightClass","marhabaDate","AllowChauffeurTimeEdit","ChauffeurMinAdvanceHours","MarhabaMaxDate","MarhabaMinDate","ChauffeurTimeWindow","PickupTime","connectingFlightEnabled","showTransferDetails","showAttractionPreferredDates","FromHolidayDeal","ca_1","packageBalanceDue","po","convertedPaymentOptions","convertBookingPaymentOptions","electronCardExclusion_1","electronCardExclusion","logosList","manualAddress","EnablePostCodeLookup","SavedPaymentCards","selectSavedCardTab","closeRemoveCard","isRemoved","convertedSavedCards","selectCardTab","convertBookingSavedCards","selectPayPalTab","PaypalMerchantId","environment","PaypalInContextEnvironment","PaymentPlanEnabled","localChargesAmount","hotelPayment","hasLocalCharges","directPaymentAtHotelAmount","PaymentRules","RecurringPayments","monthlyPayments","monthlyPaymentsAllowed","Allowed","monthlyPaymentsSchedule","PaymentSchedules","Installments","installment","InstallmentCost","monthlyPaymentsAdminFee","AdminFee","payingMonthly","PayByInstallments","InstallmentScheduleType","ScheduleType","selectCancellationProtection","EnableBinRangeDiscount","trustHtml","htmlCode","showSectionStep2","setPaymentAndBook","payFullAmount","copyCardDetailsToUserData","TL","adminFeesApply","UnitAdminFee","save","getTotalOutstandingBalance","getBookingDiscountValue","bookingDiscounts","getClosestPaymentDate","balanceSchedules","currentTrip","removeVoucher","formatPaymentAmountInput","depositAmount","customerAutoCompleterDeselect","setChauffeurDate","openTakingPaymentModal","closeTakingPaymentModal","securityCodeOnMask","hidePaymentForms","otpValidation","LoyaltyPoints","AvailablePoints","RedemptionRate","remainingPoints","usePoints","RedeemedPoints","LoyaltyCardSplitPaymentAmount","LoyaltyCardNumber","MaskedLoyaltyCardNumber","staticProps","goBack","HotelOptions","_updateCostBreakdown","attractionsExtraEnabled","paydirectTotal","payDirectAmount","additionalInformation","AdditionalInformation","PromotionalInformation","optionsUtil","priorityBoardingService","OPTION_TRANSFER","OPTION_PARKING","optionsQueue","_updateBasket","_updateBagInfo","selectedFlightSector","allBaggageSelected","_extractAirportsFromLeg","_filterAirportObject","_sanitizeTerminal","DestinationTerminal","FullTitle","DepartureTerminal","terminalId","confirmedBaggageWarning","loadingMarhaba","agentReadConfirm","showHandLuggageInfo","skipBaggageCheck","expandSummary","carHireTemporaryDisabled","showMobileSearch","HideOptionPageFooter","SkipBaggageCheck","isHotelType","HoldBaggageEnabled","marhabaSearchId","validOptionsSelected","requiredOption","checkRequiredOption","reqOption","checkOptions","disableWithAgentControl","UseBaggageWarningPopup","bagsIncluded","showPopupBaggage","flightBaggageCosts","setAvailableTransfer","HideOptionPageAgentCheckboxWhenNoInfomation","marhabaEnabled","flightAddInfo","default","addtionalInfo","priorityBoarding","parseSelectedOptions","sectorIndex","parentIndex","multiOptionsQuantity","selectedMultiOptions","Quantitative","IsCarHireTemporaryDisabled","aiportCode","isCarHireTemporaryDisabled","transfer_1","marhabaOptions","validTerminals","AirportsTerminals","TerminalNumber","getSecondaryMarhabaOptions","addMarhabaToBasket","noOfPassengers","auxillaries","selectedSecondayMarhabaOption","additionalMarhabaOptions","chauffeur","loaded","confirmMarhaba","lo","lounge","auxId","singleOptionChanged","addOrRemoveFlightOptionsFromBasket","multiOptionChanged","disableContinue","hideContinueButton","validateConsent","consentConfirmed","restructuredOptions","optionGroups","isTwoWayFlight_1","sectorLegType","hideOptions","grp","SectorDescription","restructureOptionsByOptionType","bagsWeight","baggageInfos","getMin","isBaggageInfoUnknown","holdBagUnitWeightKg","relevant","WidthCm","HeightCm","DepthCm","WeightKg","updateBaggageCount","updateFlightOptionsInBasket","isCheckInOption","updateQuantitativeOption","quantitativeOptionTotalPrice","TotalAmountString","isBaggageOptionInTheHold","popupBaggageNotRequired","scrollToExtraOptions","updateChauffeurNum","getMarhabaHeading","viewMarhabaInfo","marhabaId","currentMarhabaInfoId","noMarhabaOption","MarhabaDefaultSelected","selectedMarhabaOption","secondaryMarhabaOptions","filteredMarhabaOptions","MarhabaQuotes","showHeading","isTransfer","noServices","TransferCrossSellExpand","CarHireCrossSellExpand","bagsPopupButtonText","PriceRefresh","confirmBooking","CTA","AmendBooking","stay","CheckIn","CheckOut","destinationName","Debug","ShowNets","DebugFlag","RateMazeDebugFlag","EnableSearchTracing","AccomDebugFlag","getSuppliers","selectedAccomSupliers","mapSelectedSuppliers","accomSuppliers","getUnSelectedSupliers","selectedFlightSuppliers","flightSuppliers","selectedTransferSupliers","transferSuppliers","updateSettings","SearchSupplierId","SearchFlightSupplierIds","SearchTransferSupplierIds","supplierSelected","selectedSuppliers","ss","removeSupplier","sf","abDeal173","reloadingFlight","reverse","Arrival","numPassengers","isHotelSelected","preSelectedFlight","cameFromChooseRoomPage","ShowSelectedFlightV2","PriceBucketFilterEnabled","GroupBooking","Teenagers","durationOfStay","departureDateMin","durationOfStayOptions","bookingTypeOptions","boardBasisOptions","roomTypeOptions","roomAdultsCountOptions","roomChildrenCountOptions","passengerCountAdultsOptions","passengerCountChildrenOptions","transferTypeOptions","newRoom","roomType","isOccupancyValid","onSubmit","request_1","GroupBookingPageEnabled","SpecialAssistance","isTakingWheelchair","typeOfAssistance","isTakingWheelchairOptions","typeOfAssistanceOptions","request_2","startDateInitialised","LastMinuteDeals","holidayDealsGrouped","dealsBoxService","configs","isLoading","hasDeals","hasSpecialDeals","navigatorUserAgent","watchForPageRedirection","findOptionsPageSize","smallBatchTake","halfBatchTake","halfBatchChunkSize","Tablet","LastMinuteDealsConfig","unblockOnce","prepopulateForm","LastMinuteDealsDestinations","foundDestination","specialDeals","setFocusedDestination","LandingDestination","loadAllDeals","seoLinks","parseSeoLinks","setFocusedSpecialDeals","activeDestinations","focusedDestination","tryGetOptions","destinationsWithDeals","specialDealsFilter_1","StarRatingV2","destinationDetail","mapDealsToChunks","makeDealChunksFromDeals","chunks","chunk","SmallBatch","FirstHalfBatch","SecondHalfBatch","DisplayIndex","dropdownDestinations","focusedTypeId","focusedSpecialDeals","DealCategory","CardDestination","CardRank","OverlayShown","OverlayValue","showMoreClick","ShowMoreDestination","wasPopulated","isPopulated","isAprilCampaign","dealConfigs","aprilCampaignConfig","AprilCampaignRoutesConfig","DealType","dealType","airposts","SeasonalDealApiUrl","clicked","confirmPopupService","rangeFilters","routeSummaryUpToDate","proceedFlightSelection","_unblock","_setResults","flightList","CarrierArray","CabinArray","routeSummary","flightDepartureDate","combinedFlights","requestedFilteredAgg","FilteredAggregates","sortedBy","filteredAgg","SearchUnitExpanded","TotalNumberOfFlights","hasbookingpagevisited","airportFilterSet","airlineFilterSet","departureDatesFilterSet","stopFilterSet","anyFilter","hidePerAdultExplaination","startAgainHolidayUrl","setTab","filterTab","listTab","moreR","FilteredNumberOfFlights","ShowChangeNightsPopupWhenSelectFlight","curFlight","currentFlight","checkInCur","checkOutCur","checkInNew","checkOutNew","hotelCheckInDate","checkInCurrent","currentNights","TripCheckIn","FlightCheckInNew","selectedFlightNights","curFlightNights","fromText","toText","checkInOld","checkOutOld","showSpinner","sortTab","translateStop","staticFlightsHero","filterAllButtonEnabled","FilterAllButtonEnabled","showSlideFilter","showSelectedFlightV2","showFilterOption","currentFlightRequestedDates","isHolidayAreaInner","showAtolProtection","applyFilters","applySort","minmax","bestFlight","basePriceReady","newval","cd","childPagePath","getChildDestinations","toggleShowAll","HotelAvailability","moveTo","resizeTo","availWidth","availHeight","promiseFlightCost","promiseLowDepositValue","promiseCurrency","promiseFlight","promiseRules","boardTypeFilterSet","showRoomPredicate","_matchesBoardTypeFilter","_isShortlisted","deferredFlightCost","deferredLowDepositValue","deferredCurrency","deferredFlight","deferredRules","scrollToReviews","reviewsTab","scrollToRooms","hideRooms","showLessDescription","showLessDescriptionMobile","toggleShowMoreLess","isHotelLandingPage","longSpecialOfferText","facilitiesIcons","hotelFacilities","FacilityGroups","fg","unformattedString","lowDepositeValue","flightDeposite","flightDepositeAllowed","roundedCost","lowDepositeAndFlightDeposite","lowDepositeAndFlightCost","lowDepositeValueFormated","LOWDEPOSITEHOLIDAY","LOWDEPOSITEFLIGHT","LOWDEPOSITPACKAGEHOLIDAY","lowDepositText","mapTab","photosTab","_chosenRooms","checkOnMandatoryTransfers","tabClass","hotelInShortlist","UrgencyMessageRoomThreshold","roomAvailability","roomOptions_1","SearchUnitExpandedForMeta","_showSearchUnit","topHotelRoomHasSpecialOffer","getTopHotelRoomSpecialOffer","offerText","hotelCheckOutDate","_setRooms","hotelDetailsFailed","soldOut","inList","getScrollTarget","hotelDestination","locSearch","AutoLoadReviews","payingIndividuals","holidayPriceByMode","roomNonInfants","payingNum","RoomSummaryFare","holidayPriceAllMode","getHolidayDetail","AcomType","showFlightDetails","facilitiesIcon","firstRoomSMtext","skywardsText","hotel_1","flightId_1","FlightDetailsId","HotelAvailabilitySearchId","allRoomsAvailable","getOnlyAdultsPerRoom","getNumberOfNonInfantsForRoom","lowestPriceRoomDescription","roomAndBoardsData","singleRoomOccupancy","currentFbt","multipleBoardTypes","lowestPriceBoardType","cheapestPrice","findLowestBoardDescLabel","defaultMax","roomLimit","LongSpecialOfferText","OverlayNew","appliedToAllRooms","PromotionRibbon","pillStyle","pillPrefix","promoTextStyle","textPrefix","pillClass","promoTextClass","ribbonText","promotionText","textLengthValidator","IsCityTaxIncludedInPrice","cityTax","mandatoryExtras","MaldivesIsMandatory","IsShortlisted","AwardClicked","HotelLanding","createSeoLink","hotelAlternativeTitles","upperFirst","HotelSearch","timerKey","boards","_subscribeToModifications","redirected","_bindFilterData","_flightCosts","_processHotels","filteredBoardTypes","skywardFlightMile","skywardFlightMile_1","getFlightMilesEachPassenger","setSession","cheapestBoardTypes","filtered","resolution","propertyTypeFrom","customerRating","faceClasses","faceStepSize","inBasket","showLightboxPin","isFamilyFriendly","callToBookWithHidePrice","CallToBookBehaviour","reviewIcon","CustomerRating","filteredTotal","enhanceAggregates","enableFacilityFilter","isEmptyObject","enableChildDestinationFilter","HotelsByChildDestination","enableMultiDestHolidayFilter","IsTransferMandatorySearchDestination","isFlightAvaliable","flightRequest","isFlightLoadingFinished","hotelsAndTotalsAreZero","passengerCountOverMax","pageNumber","splitedPath","opositeStr","urlItem","matchStrand","EnableSitemapLinkByPageStrand","shouldDisplay","URL","hotelsSRPData","MinHolidayPrice","codeIsInGroup","cancelInterval","pollingInterval","setFilterHolidayPriceRange","nameFilterSet","starFilterSet","propertyTypeFilterSet","facilityFilterSet","childDestinationFilterSet","seasonalDealFilter","ApiAggregateName","minHolidayPriceFilterSet","maxHolidayPriceFilterSet","ratingFilterSet","groupFilterSet","showEstabGroupFilter","minPriceFilterSet","maxPriceFilterSet","trunc","HotelIndex","trackingProps","RepeatHotelClicked","WinnerClicked","ListRanking","TopDealClicked","FamilyFriendlyClicked","BlackFridayDeal","PromoDiscount","adults_1","children_1","FlightCost","SpecialOfferText","PromoCampaign","starName","boardTypePriceText","BoardTypePriceText","lockMultiDestUI","hotelsFilterOrderABTest","HotelsFilterOrderABTest","infoTab","priceModeTrace","requestedHotelNotAvailable","isNotAvailable","startAgain","seo","isHotelFilterVisible","enableBoardTypeFilter","showSelectedHotelV2","ShowSelectedHotelV2","enableLabelOfRecentlyViewedHotel","EnableLabelOfRecentlyViewedHotel","HFJShowSearch","toggleHFJShowSearch","setPriceDigits","cName","dec","budgetRadioBtnEnabled","BudgetRadioBtnInsteadSliderRange","isSeasonalDeals","OverlayId","hotelsChunkNumber","isPagingDisabled","promoColour","holidayPriceRangeBuckets","priceBuckets","PackagePriceBuckets","HolidayPriceBuckets","HotelPriceBuckets","bucket","noMaxBucket","priceRangeConfig","PriceRangeConfigPricePerRoomPerPerson","Plus","formatPriceByPriceMode","showFreeCancellationMessage","getIsMandatory","ratingRangeConfig","isLanding","ShowDatepickerTimeout","displayFlightMiles","isPagingMode","_postProcessResults","updatingAvailability","searchCompletePercentage","roomsQuantity","_getMixpanelResultsCompletePayload","_setSearchResultsPolling","ProgressiveLoading","FirstLoad","metaKey","TotalPax","showChangeToFlight","FlightsRequest_2","HotelsRequest_1","trackChangeToFlightClick","trackPriceBucket","Priceband","isLeftSectionRibbon","LeftAllignedRibbonsList","keepHotel","cameFromChooseFlightPage","URLHistory","postPreviousURL","findRoomName","promotionColour","promos","overlayTypeId","OverlayTypeId","promotions","textArr","HotelsSitemap","getPage","searchString","newUrl","pushState","propertyTitle","RecentHotels","_loadHotels","_contains","SelectedHotel","sh","personMiles","roomCount","childrenCount","tPrice","ConnectingAirport","OutboundDestinationAirport","OutboundDestinationAirportName","flightTypes","MarhabaAvailability","selectProduct","meetGreet","ProductDescription","productCategory","MarhabaOptions","changeMarhaba","productName","auxKeys","mixpanelOptions","Chauffeur","Lounge","asOption","terminals","MultiFlightsSearch","requestedRoutes","mfs","sectors","unfilteredAggregates","SectorTakeOffRange","SectorLandingRange","filterSearch","areSectorsDefault","isSectorDefault","SectorIndex","setFilterSectorRange","selectOption","toggleOption","onSlideComplete","SelectedParking","Shortlist","_loadList","hotelObj","clearShortlist","shortlistFilter","bootstrap","documentElement"],"mappings":"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","file":"bundle.desktop.ekh.js","sourcesContent":["'use strict';\nangular.module('attractions').config(function ($routeProvider) {\n\n function isMobileSite() {\n return TRPCONFIG.IsMobileView;\n }\n\n function getCookie(key) {\n // this logic has been duplicated from CookieService which we can't access here\n if (!key) { return null; }\n return decodeURIComponent(document.cookie.replace(\n new RegExp(`(?:(?:^|.*;)\\\\s*${encodeURIComponent(key)\n .replace(/[-.+*]/g, '\\\\$&')}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`), '$1'))\n || null;\n }\n\n function getBookingFormTemplate(area) {\n if (!TRPCONFIG.Domain.isAgentMode && !isMobileSite()) {\n const version = parseFloat(TRPCONFIG.Domain.BookingFormVersion);\n if (version > 2) {\n if (TRPCONFIG.Domain.BookingFormABTest) {\n if (!TRPCONFIG.Domain.isAgentMode) {\n const cookieVersion = getCookie('BookingFormVersion');\n if (cookieVersion && parseFloat(cookieVersion) > 2) {\n return `partials/booking/template?name=Book&version=${cookieVersion}`;\n }\n }\n } else {\n return `partials/booking/template?name=Book&version=${version}`;\n }\n }\n }\n return `partials/${area}/book`;\n }\n if (TRPCONFIG.Domain.SupportedProducts & 64) {\n let area = 'attractions';\n $routeProvider.when('/' + area + '/basket', {\n templateUrl: 'partials/'+ area + '/basket',\n controllerAs: 'cm',\n controller: 'AttractionsBasket',\n area: area,\n hideDistractionLinks: true,\n analyticsTag: 'Attractions Basket'\n });\n\n $routeProvider.when('/' + area + '/book/:tripId', {\n templateUrl: getBookingFormTemplate(area),\n controllerAs: 'cm',\n controller: 'Booking',\n area: area,\n noGroup: true,\n hideDistractionLinks: true,\n analyticsTag: 'Booking Form'\n });\n\n $routeProvider.when('/' + area + '/book/:tripId/passenger/:room/:index', {\n templateUrl: 'partials/' + area + '/passenger',\n controllerAs: 'cm',\n controller: 'Passenger',\n hideDistractionLinks: true,\n hideTravelAgentLinks: true\n });\n }\n\n});\n","'use strict';\r\nvar __assign = (this && this.__assign) || Object.assign || function(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))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nvar __extends = (this && this.__extends) || (function () {\r\n var 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 return function (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\nvar __awaiter = (this && this.__awaiter) || function (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\nvar __generator = (this && this.__generator) || function (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(function () {\r\n 'use strict';\r\n function changeCookiesState(state) {\r\n if (window.TRPCONFIG === undefined) {\r\n window.TRPCONFIG = { Domain: {}, Domain2: {} };\r\n }\r\n TRPCONFIG.Domain.ShortlistsEnabled = TRPCONFIG.Domain.ShortlistsEnabled && state;\r\n TRPCONFIG.EnableSavedSearches = TRPCONFIG.EnableSavedSearches && state;\r\n TRPCONFIG.PayPalEnabled = state;\r\n TRPCONFIG.Domain.RecentHotelsEnabled = TRPCONFIG.Domain.RecentHotelsEnabled && state;\r\n TRPCONFIG.MenuEnabled = state;\r\n TRPCONFIG.SignInEnabled = state;\r\n TRPCONFIG.ManageBookingEnabled = state;\r\n }\r\n var cookies = ('cookie' in document && (document.cookie.length > 0 ||\r\n (document.cookie = 'test').indexOf.call(document.cookie, 'test') > -1));\r\n changeCookiesState(cookies);\r\n var devices = {\r\n desktop: 'Desktop',\r\n mobile: 'Mobile'\r\n };\r\n var angularModules = [\r\n 'ngRoute',\r\n 'ngSanitize',\r\n 'ngMessages'\r\n ];\r\n // In production this array is replaced by an entry from dep.json during build\r\n var modules = [\r\n 'attractions',\r\n 'carHire',\r\n 'cms',\r\n 'core',\r\n 'dashboard',\r\n 'deals',\r\n 'ekh',\r\n 'flights',\r\n 'insurance',\r\n 'manageBooking',\r\n 'marhaba',\r\n 'parking',\r\n 'products',\r\n 'quote',\r\n 'recommendations',\r\n 'reviews',\r\n 'search',\r\n 'searchUnit',\r\n 'snm',\r\n 'transfers',\r\n 'trp',\r\n 'trustpilot',\r\n 'destinations',\r\n 'deepLink'\r\n ];\r\n if ([37, 56, 61, 66, 69].indexOf(TRPCONFIG.Domain.DomainId) > -1) {\r\n modules.push('ekh');\r\n }\r\n if (TRPCONFIG.Domain.LiveChat && TRPCONFIG.Domain.LiveChat.Enabled) {\r\n modules.push('liveChatModule');\r\n }\r\n if (TRPCONFIG.Domain.LiveChat && TRPCONFIG.Domain.LiveChat.SnapInEnabled) {\r\n modules.push('liveChatSnapInModule');\r\n }\r\n if (TRPCONFIG.Domain.DomainId === 60) {\r\n modules.push('snm');\r\n }\r\n if (TRPCONFIG.Domain.AccountsEnabled) {\r\n modules.push('dashboard');\r\n }\r\n if (TRPCONFIG.Domain.QuoteEnabled) {\r\n modules.push('quote');\r\n }\r\n if (TRPCONFIG.Domain.MarhabaEnabled) {\r\n modules.push('marhaba');\r\n }\r\n if (modules.indexOf('travelAgent') < 0) {\r\n modules.push('travelAgent');\r\n }\r\n for (var i in modules) {\r\n angular.module(modules[i], ['ngRoute']);\r\n }\r\n //Vendor ones need to stay after our own modules, otherwise they will get initialised wrongly\r\n if (TRPCONFIG.Domain.DeviceType === devices.desktop) {\r\n modules.push('toaster');\r\n }\r\n angular.module('TR', angularModules.concat(modules));\r\n})();\r\n(function () {\r\n /* eslint-disable no-extend-native, no-global-assign, new-cap */\r\n 'use strict';\r\n // Replaces string vars by argument index+1\r\n // i.e. {0} is replaced by second argument\r\n String.format = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var tokenised = args[0];\r\n return tokenised.replace(/{[0-9]}/g, function (matched) {\r\n matched = matched.replace(/[{}]/g, '');\r\n return args[parseInt(matched) + 1];\r\n });\r\n };\r\n // Replaces string vars by name\r\n // i.e. String.supplant('Hi {name}', {name: 'abc'}); //'Hi abc'\r\n Object.defineProperty(String, 'supplant', {\r\n enumerable: false,\r\n configurable: false,\r\n value: function (str, o) {\r\n // http://javascript.crockford.com/remedial.html\r\n return str.replace(/\\{([^{}]*)\\}/g, function (a, b) {\r\n var r = o[b];\r\n return typeof r === 'string' || typeof r === 'number' ? r : a;\r\n });\r\n }\r\n });\r\n //polyfill because phantom js does not currently support bind which is annoying\r\n Function.prototype.bind || (Function.prototype.bind = function (thisp) {\r\n var _this = this;\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n return _this.apply(thisp, args);\r\n };\r\n });\r\n //date polyfills which seem to be necessary for android 2.3.x and maybe others\r\n var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;\r\n var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z'));\r\n var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));\r\n if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {\r\n // XXX global assignment won't work in embeddings that use\r\n // an alternate object for the context.\r\n Date = (function (NativeDate) {\r\n // Date.length === 7\r\n function Date() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var Y = args[0], M = args[1], D = args[2], h = args[3], m = args[4], s = args[5], ms = args[6];\r\n var length = args.length;\r\n if (this instanceof NativeDate) {\r\n var date = length === 1 && String(Y) === Y ? // isString(Y)\r\n // We explicitly pass it through parse:\r\n new NativeDate(Date.parse(Y)) :\r\n // We have to manually make calls depending on argument\r\n // length here\r\n length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\r\n length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\r\n length >= 5 ? new NativeDate(Y, M, D, h, m) :\r\n length >= 4 ? new NativeDate(Y, M, D, h) :\r\n length >= 3 ? new NativeDate(Y, M, D) :\r\n length >= 2 ? new NativeDate(Y, M) :\r\n length >= 1 ? new NativeDate(Y) :\r\n new NativeDate();\r\n // Prevent mixups with unfixed Date object\r\n date.constructor = Date;\r\n return date;\r\n }\r\n return NativeDate.apply(void 0, args);\r\n }\r\n // 15.9.1.15 Date Time String Format.\r\n var isoDateExpression = new RegExp('^' +\r\n '(\\\\d{4}|[+-]\\\\d{6})' + // four-digit year capture or sign +\r\n // 6-digit extended year\r\n '(?:-(\\\\d{2})' + // optional month capture\r\n '(?:-(\\\\d{2})' + // optional day capture\r\n '(?:' + // capture hours:minutes:seconds.milliseconds\r\n 'T(\\\\d{2})' + // hours capture\r\n ':(\\\\d{2})' + // minutes capture\r\n '(?:' + // optional :seconds.milliseconds\r\n ':(\\\\d{2})' + // seconds capture\r\n '(?:(\\\\.\\\\d{1,}))?' + // milliseconds capture\r\n ')?' +\r\n '(' + // capture UTC offset component\r\n 'Z|' + // UTC capture\r\n '(?:' + // offset specifier +/-hours:minutes\r\n '([-+])' + // sign capture\r\n '(\\\\d{2})' + // hours offset capture\r\n ':(\\\\d{2})' + // minutes offset capture\r\n ')' +\r\n ')?)?)?)?' +\r\n '$');\r\n var months = [\r\n 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365\r\n ];\r\n function dayFromMonth(year, month) {\r\n var t = month > 1 ? 1 : 0;\r\n return (months[month] +\r\n Math.floor((year - 1969 + t) / 4) -\r\n Math.floor((year - 1901 + t) / 100) +\r\n Math.floor((year - 1601 + t) / 400) +\r\n 365 * (year - 1970));\r\n }\r\n function toUTC(t) {\r\n return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));\r\n }\r\n // Copy any custom methods a 3rd party library may have added\r\n for (var key in NativeDate) {\r\n Date[key] = NativeDate[key];\r\n }\r\n // Copy \"native\" methods explicitly; they may be non-enumerable\r\n Date.now = NativeDate.now;\r\n Date.UTC = NativeDate.UTC;\r\n Date.prototype = NativeDate.prototype;\r\n Date.prototype.constructor = Date;\r\n // Upgrade Date.parse to handle simplified ISO 8601 strings\r\n Date.parse = function parse() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var string = args[0];\r\n var match = isoDateExpression.exec(string);\r\n if (match) {\r\n // parse months, days, hours, minutes, seconds, and milliseconds\r\n // provide default values if necessary\r\n // parse the UTC offset component\r\n var year = Number(match[1]);\r\n var month = Number(match[2] || 1) - 1;\r\n var day = Number(match[3] || 1) - 1;\r\n var hour = Number(match[4] || 0);\r\n var minute = Number(match[5] || 0);\r\n var second = Number(match[6] || 0);\r\n var millisecond = Math.floor(Number(match[7] || 0) * 1000);\r\n // When time zone is missed, local offset should be used\r\n // (ES 5.1 bug)\r\n // see https://bugs.ecmascript.org/show_bug.cgi?id=112\r\n var isLocalTime = Boolean(match[4] && !match[8]);\r\n var signOffset = match[9] === '-' ? 1 : -1;\r\n var hourOffset = Number(match[10] || 0);\r\n var minuteOffset = Number(match[11] || 0);\r\n var result = void 0;\r\n if (hour < (minute > 0 || second > 0 || millisecond > 0 ?\r\n 24 : 25) &&\r\n minute < 60 && second < 60 && millisecond < 1000 &&\r\n month > -1 && month < 12 && hourOffset < 24 &&\r\n minuteOffset < 60 && // detect invalid offsets\r\n day > -1 &&\r\n day < (dayFromMonth(year, month + 1) -\r\n dayFromMonth(year, month))) {\r\n result = ((dayFromMonth(year, month) + day) * 24 +\r\n hour +\r\n hourOffset * signOffset) * 60;\r\n result = ((result + minute + minuteOffset * signOffset) * 60 +\r\n second) * 1000 + millisecond;\r\n if (isLocalTime) {\r\n result = toUTC(result);\r\n }\r\n if (-8.64e15 <= result && result <= 8.64e15) {\r\n return result;\r\n }\r\n }\r\n return NaN;\r\n }\r\n return NativeDate.parse.apply(NativeDate, args);\r\n };\r\n return Date;\r\n })(Date);\r\n }\r\n if (/GT-I9195|GT-I9000/.test(navigator.userAgent)) {\r\n /*\r\n FIX for [ GalaxyS4-Mini (GT-I9195) | S3 (GT-I9000) ]\r\n It seems that, for some reason, the samsung stock browser can't handle correctly\r\n a change in the page dimension. To solve this the function binded to the touchmove\r\n event checks if the user is at the bottom of the page. If this is not the case a\r\n repaint is forced by moving the scroll down by one pixel (the movement is not visible)\r\n this way the dimensions of the page are recalculated by webkit.\r\n The \"+ 2\" has been inserted because a miscalculation of a single pixel can happen\r\n while comparing the left side of the formula with the scrollHeight (this should not affect\r\n the user experience).\r\n */\r\n document.body.addEventListener('touchmove', function () {\r\n // Scroll Position + Visibile page + 2 < total dimension of the page\r\n if (window.pageYOffset + window.innerHeight + 2 < document.body.scrollHeight) {\r\n scrollTo(0, window.pageYOffset + 1);\r\n }\r\n }, false);\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.config(['$routeProvider', '$locationProvider', '$httpProvider', '$provide', '$sceDelegateProvider', '$compileProvider', 'popupAuth',\r\n function ($routeProvider, $locationProvider, $httpProvider, $provide, $sceDelegateProvider, $compileProvider, popupAuth) {\r\n /**\r\n * this is a horrible hack to make it possible to mandate that a dynamic route param must\r\n * match a certain regex.\r\n * Provided modifiers are ! for number, % for guid, and £ for fromUrlV2 route\r\n * i.e. :tripId% means that we match only if the route param is a guid\r\n */\r\n var routeModifiers = {\r\n '!': '(\\\\d+)',\r\n '%': '(.{8}-.{4}-.{4}-.{4}-.{12})',\r\n '£': '(\\\\d+-\\\\d+-\\\\d+-\\\\d+)',\r\n '€': '(\\\\d+-\\\\d+(?:-\\\\d+)?)'\r\n };\r\n function pathRegExp(path) {\r\n var p1 = path.replace(/([().])/g, '\\\\$1');\r\n // Add routeModifier to this replace statement\r\n path = p1.replace(/(\\/)?:(\\w+)([?*!%£€])?/g, function (_, slash, key, option) {\r\n var optional = option === '?' ? option : null;\r\n var star = option === '*' ? option : null;\r\n var special = routeModifiers[option];\r\n var keyMatch = (special || (star && '(.+?)' || '([^/]+)'));\r\n slash = slash || '';\r\n return (optional ? '' : slash) + \"(?:\" + (optional ? slash : '') + keyMatch + (optional || '') + \")\" + (optional || '');\r\n })\r\n .replace(/([/$*])/g, '\\\\$1');\r\n return new RegExp(\"^\" + path + \"/?$\", 'i');\r\n }\r\n var $route = $routeProvider.$get[$routeProvider.$get.length - 1]({\r\n $on: function () {\r\n // do nothing\r\n }\r\n });\r\n var when = $routeProvider.when;\r\n $routeProvider.when = function (path, route) {\r\n when.apply($routeProvider, [path, route]);\r\n // Add routeModifier to this list\r\n if (path && (path.indexOf('!') >= 0 || path.indexOf('%') >= 0 || path.indexOf('£') >= 0 || path.indexOf('€') >= 0)) {\r\n $route.routes[path].regexp = pathRegExp(path);\r\n }\r\n };\r\n $compileProvider.debugInfoEnabled(TRPCONFIG.DebugInfoEnabled);\r\n $sceDelegateProvider.resourceUrlWhitelist(['self', TRPCONFIG.Domain.CacheDistributionUrl + \"**\", '/partials/**']);\r\n var reHasQuery = /^(\\w*\\/)*\\w*\\?.*=/;\r\n var reIsCmsRoute = /^cms\\/(component|page)\\//;\r\n $provide.decorator('$sce', ['$delegate', function ($delegate) {\r\n // Adds a version token after every template request\r\n // in order to better manage the cache\r\n function addVersion(url) {\r\n if (url &&\r\n url.indexOf('tempver=') === -1 &&\r\n url.indexOf('NOVERSION') === -1) {\r\n var connector = reHasQuery.test(url) ? '&' : '?';\r\n url += connector + \"cultureCode=\" + TRPCONFIG.Domain.CultureCode;\r\n url += \"&domainId=\" + TRPCONFIG.Domain.DomainId;\r\n url += \"&device=\" + TRPCONFIG.Domain.DeviceType;\r\n url += \"&isAgent=\" + TRPCONFIG.Domain.isAgentMode;\r\n url += \"&udp=\" + TRPCONFIG.Domain.UserDeviceProfile;\r\n if (!reIsCmsRoute.test(url)) {\r\n url += \"&tempver=\" + TRPCONFIG.CurrentVersion;\r\n }\r\n }\r\n if (TRPCONFIG.Domain.CloudFrontCachingEnabled && TRPCONFIG.Domain.CloudFrontCachePartials && url != null) {\r\n url = TRPCONFIG.Domain.CacheDistributionUrl + url;\r\n }\r\n return url;\r\n }\r\n // ng-include and everything else\r\n $delegate.getTrusted = (function (original) {\r\n return function (type, url) {\r\n return original(type, addVersion(url));\r\n };\r\n })($delegate.getTrusted);\r\n // ng-view and directives\r\n $delegate.getTrustedResourceUrl = (function (original) {\r\n return function (url) {\r\n return original(addVersion(url));\r\n };\r\n })($delegate.getTrustedResourceUrl);\r\n return $delegate;\r\n }]);\r\n $locationProvider.hashPrefix('!');\r\n //this resolver is now only used for the availability path not the landing page path\r\n var hotelResolver = {\r\n bookedEstabId: angular.noop,\r\n hotel: ['hotelResolver', function (hotelResolver) {\r\n return hotelResolver.resolve(false);\r\n }]\r\n };\r\n var bookingCopyResolver = {\r\n booking: ['tripService', 'bookingService', '$route', function (tripService, bookingService, $route) {\r\n return tripService.restoreSearchUnit($route.current.params.tripId).then(function (trip) {\r\n return bookingService.getBooking(trip.BookingId).then(function (b) {\r\n return angular.copy(b);\r\n });\r\n });\r\n }]\r\n };\r\n function getCookie(key) {\r\n // this logic has been duplicated from CookieService which we can't access here\r\n if (!key) {\r\n return null;\r\n }\r\n return decodeURIComponent(document.cookie.replace(new RegExp(\"(?:(?:^|.*;)\\\\s*\" + encodeURIComponent(key).replace(/[-.+*]/g, '\\\\$&') + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\"), '$1')) || null;\r\n }\r\n function getDestination() {\r\n var json = $('body').attr('destination');\r\n return json == null ? null : JSON.parse(json);\r\n }\r\n $routeProvider.when('/impersonate_customer/:tenantId/:customerId:params?', {\r\n template: '
',\r\n controller: function ($location, $routeParams, authService, bookingService, loggingService) {\r\n var tenantId = $routeParams.tenantId, customerId = $routeParams.customerId, trackingTag = $routeParams.trackingTag;\r\n var domainTenantId = parseInt(TRPCONFIG.Domain.TenantId);\r\n //double check that the tenant supplied is the tenant that we are actually on\r\n if (domainTenantId === parseInt(tenantId)) {\r\n //note that this will fail if the user is not signed in as an agent - we are not handling that possibility\r\n authService.impersonatedSignIn(customerId.toUpperCase())\r\n .then(function () { return bookingService.setTrackingTag(trackingTag); })\r\n .then(function () { return $location.url('/'); })\r\n .catch(function (err) {\r\n $location.url('/error');\r\n loggingService.logWarn('Impersonation has failed. Please check your permissions, tenant id and customer id. Error: ', JSON.stringify(err));\r\n });\r\n }\r\n else {\r\n $location.url('/');\r\n }\r\n }\r\n });\r\n function forwardToManageYourBooking(operation) {\r\n return [\r\n '$location',\r\n '$http',\r\n '$routeParams',\r\n 'authService',\r\n 'currentUser',\r\n 'v1Redirection',\r\n 'loggingService',\r\n function ($location, $http, $routeParams, authService, currentUser, v1Redirection, loggingService) {\r\n var tenantId = $routeParams.tenantId, bookingId = $routeParams.bookingId, trackingTag = $routeParams.trackingTag, categoryId = $routeParams.categoryId;\r\n var domainTenantId = parseInt(TRPCONFIG.Domain.TenantId);\r\n var user = currentUser.get();\r\n var authenticateBookingCallback = function () {\r\n if (domainTenantId === parseInt(tenantId)) {\r\n authService.bookingSignInByAgent(bookingId)\r\n .then(function (anonSignedIn) {\r\n if (!anonSignedIn) {\r\n $location.url('/');\r\n return;\r\n }\r\n var _a = currentUser.get(), Contact = _a.Contact, BookingSummary = _a.BookingSummary;\r\n v1Redirection.v1Redirect({\r\n SID: BookingSummary.SiteId,\r\n BID: BookingSummary.BookingId,\r\n SN: Contact.LastName,\r\n NAV: operation,\r\n trackingTag: trackingTag,\r\n categoryId: categoryId\r\n });\r\n })\r\n .catch(function (err) {\r\n loggingService.logWarn(\"Error signing in booking. Please check permissions, tenant id and booking id. Error: \" + JSON.stringify(err));\r\n });\r\n }\r\n else {\r\n $location.url('/');\r\n }\r\n };\r\n if (user.AnonSignedIn || user.SignedIn) {\r\n return $http.post('/api2/managebooking/signout').then(authenticateBookingCallback);\r\n }\r\n // Attempt to logout user if it's logged in, but continue execution if it's not logged in\r\n authenticateBookingCallback();\r\n }\r\n ];\r\n }\r\n $routeProvider.when('/update_booking/:tenantId/:bookingId', {\r\n template: '
',\r\n controller: forwardToManageYourBooking('options')\r\n });\r\n $routeProvider.when('/raise_csr/:tenantId/:bookingId:params?', {\r\n template: '
',\r\n controller: forwardToManageYourBooking('amend')\r\n });\r\n // duplicates impersonate customer for now\r\n $routeProvider.when('/new_quote/:tenantId/:customerId:params?', {\r\n template: '
',\r\n controller: function ($location, $routeParams, authService, quoteService) {\r\n var tenantId = $routeParams.tenantId, customerId = $routeParams.customerId, trackingTag = $routeParams.trackingTag;\r\n //double check that the tenant supplied is the tenant that we are actually on\r\n if (TRPCONFIG.Domain.TenantId === parseInt(tenantId)) {\r\n //note that this will fail if the user is not signed in as an agent - we are not handling that possibility\r\n authService.impersonatedSignIn(customerId.toUpperCase())\r\n .then(function () { return quoteService.setTrackingTag(trackingTag); })\r\n .then(function () { return $location.url('/'); });\r\n }\r\n }\r\n });\r\n $routeProvider.when('/update_quote/:tenantId/:quoteReference', {\r\n template: '
',\r\n controller: function ($location, $routeParams, quoteService, loggingService) {\r\n var tenantId = $routeParams.tenantId, quoteReference = $routeParams.quoteReference;\r\n var domainTenantId = parseInt(TRPCONFIG.Domain.TenantId);\r\n if (domainTenantId !== parseInt(tenantId) && quoteReference.length < 1) {\r\n return $location.url('/');\r\n }\r\n quoteService.getQuoteByReference(\"QUO/\" + quoteReference)\r\n .then(function (quote) {\r\n if (quote && !quote.Error) {\r\n $location.url(\"/quote/manage/QUO/\" + quoteReference);\r\n return;\r\n }\r\n loggingService.logWarn('Quote was not impersonated without error');\r\n $location.url('/');\r\n })\r\n .catch(function (err) {\r\n loggingService.logWarn('Error while signing a quote. Please check the permissions, tenant id and quoute id', JSON.stringify(err));\r\n });\r\n }\r\n });\r\n $routeProvider.when('/agents/signin', {\r\n templateUrl: 'partials/agents/signin',\r\n controllerAs: 'cm',\r\n controller: 'Agent'\r\n });\r\n $routeProvider.when('/agents/settings', {\r\n templateUrl: 'partials/agents/settings',\r\n controllerAs: 'cm',\r\n controller: 'Debug'\r\n });\r\n $routeProvider.when('/agents/initiateresetpassword', {\r\n templateUrl: 'livepartials/agents/initiateresetpassword',\r\n controllerAs: 'cm',\r\n controller: 'Agent'\r\n });\r\n $routeProvider.when('/admin/resetpassword', {\r\n templateUrl: 'livepartials/agents/resetpassword',\r\n controllerAs: 'cm',\r\n controller: 'Agent'\r\n });\r\n $routeProvider.when('/agents/resetsuccessful', {\r\n templateUrl: 'livepartials/agents/resetsuccessful',\r\n controllerAs: 'cm',\r\n controller: 'Agent'\r\n });\r\n function configAuthRoutesMyb() {\r\n var path = 'bookingsignin';\r\n $routeProvider.when(\"/\" + path, popupAuth ? {\r\n resolve: {\r\n redirect: ['authRedirection', function (authRedirection) { return authRedirection.authRedirect(path); }]\r\n }\r\n } : {\r\n templateUrl: \"partials/auth/\" + path,\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n }\r\n function configureAuthRoutes() {\r\n ['signin', 'signup', 'bookingsignin', 'forgot'].forEach(function (path) {\r\n $routeProvider.when(\"/\" + path, popupAuth ? {\r\n resolve: {\r\n redirect: ['authRedirection', function (authRedirection) { return authRedirection.authRedirect(path); }]\r\n }\r\n } : {\r\n templateUrl: \"partials/auth/\" + path,\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n });\r\n $routeProvider.when('/customer/changepassword', {\r\n templateUrl: 'partials/auth/reset',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/customer/verify', {\r\n templateUrl: 'partials/auth/verify',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/customer/verifyandchoosepassword', {\r\n templateUrl: 'partials/auth/activate',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/resetsuccessful', {\r\n templateUrl: 'partials/auth/resetsuccessful',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/verified', {\r\n templateUrl: 'partials/auth/verified',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n if (!popupAuth) {\r\n $routeProvider.when('/changeemailsent', {\r\n templateUrl: 'partials/auth/changeemailsent',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/verificationsent', {\r\n templateUrl: 'partials/auth/verificationsent',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n $routeProvider.when('/resetsent', {\r\n templateUrl: 'partials/auth/resetsent',\r\n controllerAs: 'cm',\r\n controller: 'Auth'\r\n });\r\n }\r\n }\r\n function getBookingFormTemplate(area) {\r\n if ((!TRPCONFIG.Domain.isAgentMode || TRPCONFIG.Domain.BookingFormV2OnAgentEnabled) && !isMobileSite()) {\r\n var version = parseFloat(TRPCONFIG.Domain.BookingFormVersion);\r\n if (version > 2) {\r\n if (TRPCONFIG.Domain.BookingFormABTest) {\r\n var cookieVersion = getCookie('BookingFormVersion');\r\n if (parseFloat(cookieVersion) > 2) {\r\n return \"partials/booking/template?name=Book&version=\" + cookieVersion;\r\n }\r\n }\r\n else {\r\n return \"partials/booking/template?name=Book&version=\" + version;\r\n }\r\n }\r\n }\r\n return \"partials/\" + area + \"/book\";\r\n }\r\n function configureCommonRoutes(areas) {\r\n angular.forEach(areas, function (area) {\r\n $routeProvider.when(\"/\" + area + \"/search-\" + area + \".aspx\", {\r\n redirectTo: area\r\n });\r\n $routeProvider.when(\"/\" + area, {\r\n templateUrl: \"partials/\" + area + \"/index\",\r\n controller: 'Home',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/notfound\", {\r\n templateUrl: 'partials/home/searchnotfound',\r\n controllerAs: 'cm',\r\n controller: 'NotFound',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/destination\", {\r\n templateUrl: 'partials/home/destination',\r\n controller: 'SearchUnit',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/occupancy\", {\r\n templateUrl: \"partials/\" + area + \"/occupancy\",\r\n controller: 'Occupancy',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/book/:tripId%\", {\r\n templateUrl: getBookingFormTemplate(area),\r\n controllerAs: 'cm',\r\n controller: 'Booking',\r\n area: area,\r\n analyticsTag: 'Booking Form',\r\n pixelTrackingPageName: area + \"BookingForm\",\r\n noGroup: true,\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true,\r\n breadcrumb: {\r\n crumb: 50\r\n }\r\n });\r\n $routeProvider.when(\"/\" + area + \"/book/:tripId%/:direction/departuredate\", {\r\n templateUrl: \"partials/\" + area + \"/departuredate\",\r\n controllerAs: 'cm',\r\n controller: 'FlightCapture',\r\n resolve: bookingCopyResolver,\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when(\"/\" + area + \"/book/:tripId%/:direction/departureairport\", {\r\n templateUrl: \"partials/\" + area + \"/departureairports\",\r\n controllerAs: 'cm',\r\n controller: 'FlightCapture',\r\n area: 'flights',\r\n noGroup: true,\r\n resolve: bookingCopyResolver,\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when(\"/\" + area + \"/book/:tripId%/:direction/destinationairport\", {\r\n templateUrl: \"partials/\" + area + \"/destinationairports\",\r\n controllerAs: 'cm',\r\n controller: 'FlightCapture',\r\n area: 'flights',\r\n resolve: bookingCopyResolver,\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when(\"/\" + area + \"/departureairport\", {\r\n templateUrl: \"partials/\" + area + \"/searchunitdepartureairports\",\r\n controller: [\r\n '$window', 'searchUnitService', function ($window, searchUnitService) {\r\n var cm = this;\r\n cm.setDepartureAirport = function (item) {\r\n searchUnitService.setDepartureAirports(item);\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n };\r\n }\r\n ],\r\n controllerAs: 'cm',\r\n area: 'flights'\r\n });\r\n });\r\n }\r\n function configureHotelRoutes() {\r\n //make sure that this doesn't get incorrectly interpreted as availability results\r\n $routeProvider.when('/hotels/hotel-listings.aspx', {\r\n redirectTo: '/hotels'\r\n });\r\n $routeProvider.when('/hotels/:tripId%', {\r\n templateUrl: 'partials/hotels/hotelsearch',\r\n area: 'hotels',\r\n analyticsTag: 'Hotel Selection',\r\n pixelTrackingPageName: 'hotelsSearchResults',\r\n reloadOnSearch: false,\r\n breadcrumb: {\r\n crumb: 20\r\n }\r\n });\r\n $routeProvider.when('/hotels/:tripId%/:estabId', {\r\n templateUrl: 'partials/hotels/availability',\r\n controller: 'HotelAvailability',\r\n controllerAs: 'cm',\r\n area: 'hotels',\r\n analyticsTag: 'Room Selection',\r\n pixelTrackingPageName: 'hotelsRoomSelection',\r\n resolve: hotelResolver,\r\n breadcrumb: {\r\n crumb: 21,\r\n squash: true\r\n }\r\n });\r\n }\r\n $routeProvider.when('/sitemap/:landingPageV3£/:urlText*', {\r\n templateUrl: 'partials/hotels/hotelssitemap',\r\n controller: 'HotelsSitemap',\r\n controllerAs: 'cm',\r\n area: 'hotels'\r\n });\r\n $routeProvider.when('/sitemap/:landingPageV2€/:urlText*', {\r\n templateUrl: 'partials/hotels/hotelssitemap',\r\n controller: 'HotelsSitemap',\r\n controllerAs: 'cm',\r\n area: 'hotels'\r\n });\r\n function configureHolidayRoutes() {\r\n $routeProvider.when('/holidays/departure', {\r\n templateUrl: 'partials/holidays/departure',\r\n controller: 'Departure',\r\n controllerAs: 'cm'\r\n });\r\n $routeProvider.when('/holidays/flights/search', {\r\n templateUrl: 'partials/holidays/flightsearch',\r\n controller: ['flightSearch', '$location', 'hotelSearch', function (flightSearch, $location, hotelSearch) {\r\n flightSearch.search().then(function (data) {\r\n hotelSearch.search(data.AvailabilitySearchId);\r\n $location.path(\"/holidays/flights/\" + data.AvailabilitySearchId);\r\n });\r\n }]\r\n });\r\n $routeProvider.when('/holidays/flights/:tripId%', {\r\n templateUrl: 'partials/holidays/flightresults',\r\n controller: 'HolidaySearch',\r\n controllerAs: 'cm',\r\n area: 'holidays',\r\n analyticsTag: 'Flight Selection',\r\n pixelTrackingPageName: 'holidaysFlightSearch',\r\n breadcrumb: {\r\n crumb: 10\r\n }\r\n });\r\n $routeProvider.when('/holidays/hotels/:tripId%', {\r\n templateUrl: 'partials/holidays/hotelsearch',\r\n reloadOnSearch: false,\r\n area: 'holidays',\r\n analyticsTag: 'Hotel Selection',\r\n pixelTrackingPageName: 'holidaysHotelsSearchResults',\r\n breadcrumb: {\r\n crumb: 20\r\n }\r\n });\r\n $routeProvider.when('/holidays/january-sale', {\r\n template: '
',\r\n controller: ['$scope', 'resourceService', 'basketService', function ($scope, resourceService, basketService) {\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGHOTELS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-searchUnitCtrl'\r\n });\r\n basketService.startMultiDestHolidayWorkflow();\r\n }]\r\n });\r\n $routeProvider.when('/holidays/january-sale/:tripId%', {\r\n templateUrl: 'partials/holidays/hotelsearch?multiDestination=true',\r\n // HTML has `ng-controller=\"HotelSearch as cm\"`\r\n reloadOnSearch: false,\r\n area: 'holidays',\r\n analyticsTag: 'Hotel Selection',\r\n pixelTrackingPageName: 'holidaysJanuarySale'\r\n });\r\n $routeProvider.when('/holidays/options/:tripId%/:productId?', {\r\n templateUrl: 'partials/holidays/options',\r\n controllerAs: 'cm',\r\n controller: 'Options',\r\n area: 'holidays',\r\n analyticsTag: 'Options',\r\n pixelTrackingPageName: 'holidaysOptions',\r\n hideDistractionLinks: true,\r\n breadcrumb: {\r\n crumb: 40\r\n }\r\n });\r\n $routeProvider.when('/hotels/options/:tripId%', {\r\n templateUrl: 'partials/hotels/hoteloptions',\r\n controllerAs: 'cm',\r\n controller: 'HotelOptions',\r\n area: 'hotels',\r\n analyticsTag: 'HotelOptions',\r\n pixelTrackingPageName: 'hotelsOptions',\r\n hideDistractionLinks: true,\r\n breadcrumb: {\r\n crumb: 40\r\n }\r\n });\r\n $routeProvider.when('/holidays/:tripId%/:estabId', {\r\n templateUrl: 'partials/holidays/availability',\r\n controller: 'HotelAvailability',\r\n controllerAs: 'cm',\r\n area: 'holidays',\r\n analyticsTag: 'Room Selection',\r\n pixelTrackingPageName: 'holidaysRoomSelection',\r\n reloadOnSearch: false,\r\n resolve: hotelResolver,\r\n breadcrumb: {\r\n crumb: 21,\r\n squash: true\r\n }\r\n });\r\n if (TRPCONFIG.Domain.AprilCampaignRoutes) {\r\n TRPCONFIG.Domain.AprilCampaignRoutes.forEach(function (url) {\r\n $routeProvider.when(\"/\" + url, {\r\n templateUrl: 'partials/holidaydeals/aprilcampaign',\r\n controller: 'seasonalDeals',\r\n controllerAs: 'sd',\r\n area: 'holidays',\r\n reloadOnSearch: false\r\n });\r\n });\r\n }\r\n if (TRPCONFIG.Domain.ActiveSeasonalDeals) {\r\n TRPCONFIG.Domain.ActiveSeasonalDeals.forEach(function (deal) {\r\n $routeProvider.when(deal.Url, {\r\n templateUrl: \"partials/holidaydeals/seasonaldeals?seasonCode=\" + deal.SeasonCode,\r\n controller: 'seasonalDeals',\r\n controllerAs: 'sd',\r\n area: 'holidays',\r\n reloadOnSearch: false\r\n });\r\n });\r\n }\r\n if (TRPCONFIG.Domain.LastMinuteDealsPageEnabled) {\r\n $routeProvider.when('/holidaydeals:params?', {\r\n templateUrl: 'partials/holidaydeals/lastminutedealspromo',\r\n controller: 'lastMinuteDeals',\r\n controllerAs: 'ldp',\r\n area: 'holidays',\r\n reloadOnSearch: false\r\n });\r\n $routeProvider.when('/holidaydealspromo/:params?', {\r\n redirectTo: '/holidaydeals'\r\n });\r\n $routeProvider.when('/holidaydeals/occupancy', {\r\n templateUrl: 'partials/holidaydeals/occupancy',\r\n controller: 'Occupancy',\r\n controllerAs: 'cm',\r\n area: 'holidays'\r\n });\r\n }\r\n else {\r\n $routeProvider.when('/holidaydeals/:params?', {\r\n templateUrl: 'partials/holidaydeals/holidaydealsresults',\r\n controller: 'HolidayDealsResults',\r\n controllerAs: 'hd',\r\n area: 'holidays',\r\n reloadOnSearch: false\r\n });\r\n $routeProvider.when('/holidaydealspromo/:params?', {\r\n templateUrl: 'partials/holidaydeals/holidaydealspromo',\r\n controller: 'HolidayDealsPromo',\r\n controllerAs: 'hdp',\r\n area: 'holidays',\r\n reloadOnSearch: false\r\n });\r\n }\r\n $routeProvider.when('/offers/early-summer-2019-holidays', {\r\n redirectTo: '/offers/early-summer-holidays'\r\n });\r\n $routeProvider.when('/recommendations/loading', {\r\n templateUrl: 'partials/recommendations/loading',\r\n controller: 'Loading',\r\n controllerAs: 'ld'\r\n });\r\n }\r\n function configureTransferRoutes() {\r\n $routeProvider.when('/transfers/destinationairports', {\r\n templateUrl: 'partials/home/destinationairports',\r\n controller: 'TransferAirports',\r\n controllerAs: 'cm',\r\n area: 'transfers'\r\n });\r\n $routeProvider.when('/transfers/resorts', {\r\n templateUrl: 'partials/home/resorts',\r\n controller: 'Resorts',\r\n controllerAs: 'cm'\r\n });\r\n $routeProvider.when('/transfers/direction', {\r\n templateUrl: 'partials/home/direction',\r\n controller: 'TransferDirection',\r\n controllerAs: 'cm',\r\n area: 'transfers'\r\n });\r\n $routeProvider.when('/transfers/departuredate', {\r\n templateUrl: 'partials/transfers/arrivaldate',\r\n controller: 'SearchUnit',\r\n controllerAs: 'cm',\r\n area: 'transfers'\r\n });\r\n $routeProvider.when('/transfers/returndate', {\r\n templateUrl: 'partials/transfers/returndate',\r\n controller: 'SearchUnit',\r\n controllerAs: 'cm',\r\n area: 'transfers'\r\n });\r\n $routeProvider.when('/transfers/:tripId%', {\r\n templateUrl: 'partials/transfers/search',\r\n controller: 'TransferSearch',\r\n controllerAs: 'cm',\r\n area: 'transfers',\r\n analyticsTag: 'Transfer Selection',\r\n pixelTrackingPageName: 'transfersSearchResults',\r\n breadcrumb: {\r\n crumb: 30\r\n }\r\n });\r\n }\r\n function isMobileSite() {\r\n return TRPCONFIG.IsMobileView;\r\n }\r\n function configureMarhabaRoutes() {\r\n $routeProvider.when('/marhaba', {\r\n templateUrl: 'partials/marhaba/index',\r\n controller: 'Home',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/occupancy', {\r\n templateUrl: 'partials/marhaba/occupancy',\r\n controller: 'Occupancy',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/book/:tripId%/:productId', {\r\n templateUrl: function () { return getBookingFormTemplate('marhaba'); },\r\n controllerAs: 'cm',\r\n controller: 'Booking',\r\n area: 'marhaba',\r\n noGroup: true,\r\n pixelTrackingPageName: 'marhabaBookingForm',\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when('/marhaba/departuredate', {\r\n templateUrl: 'partials/transfers/arrivaldate',\r\n controller: 'SearchUnit',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/destinationairports', {\r\n templateUrl: 'partials/marhaba/marhabaairports',\r\n controller: 'MarhabaAirports',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/terminal', {\r\n templateUrl: 'partials/marhaba/terminal',\r\n controller: 'Terminal',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/flighttype', {\r\n templateUrl: 'partials/marhaba/flighttype',\r\n controller: 'FlightType',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/notfound', {\r\n templateUrl: 'partials/marhaba/searchnotfound'\r\n });\r\n $routeProvider.when('/marhaba/connectingairport/:tripId%/:productId?', {\r\n templateUrl: 'partials/marhaba/destinationairports',\r\n controller: 'ConnectingAirport',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/:tripId%/:productId', {\r\n templateUrl: 'partials/marhaba/options',\r\n controller: 'MarhabaOptions',\r\n pixelTrackingPageName: 'marhabaOptions',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n $routeProvider.when('/marhaba/book/:tripId%/passenger/:room/:index/:productId', {\r\n templateUrl: 'partials/holidays/passenger',\r\n controller: 'Passenger',\r\n controllerAs: 'cm',\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when('/marhaba/:tripId%', {\r\n templateUrl: 'partials/marhaba/availability',\r\n controller: 'MarhabaAvailability',\r\n pixelTrackingPageName: 'marhabaSearchResults',\r\n controllerAs: 'cm',\r\n area: 'marhaba'\r\n });\r\n }\r\n function configureParkingRoutes() {\r\n var area = 'parking';\r\n $routeProvider.when('/parking', {\r\n templateUrl: 'partials/parking/index',\r\n controllerAs: 'cm',\r\n controller: 'ParkingSearchUnit',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/dropoffdate\", {\r\n templateUrl: \"partials/\" + area + \"/dropoffdate\",\r\n controller: 'ParkingSearchUnit',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/pickupdate\", {\r\n templateUrl: \"partials/\" + area + \"/pickupdate\",\r\n controller: 'ParkingSearchUnit',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/occupancy\", {\r\n templateUrl: \"partials/\" + area + \"/occupancy\",\r\n controller: 'Occupancy',\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/departureairport\", {\r\n templateUrl: \"partials/\" + area + \"/searchunitdepartureairports\",\r\n controller: [\r\n '$window', 'searchUnitService', function ($window, searchUnitService) {\r\n var cm = this;\r\n cm.setDepartureAirport = function (item) {\r\n searchUnitService.setDepartureAirports(item);\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n };\r\n }\r\n ],\r\n controllerAs: 'cm',\r\n area: area\r\n });\r\n $routeProvider.when(\"/\" + area + \"/:tripId%\", {\r\n templateUrl: 'partials/parking/parkingresults',\r\n controllerAs: 'cm',\r\n controller: 'ParkingResults',\r\n area: area,\r\n analyticsTag: 'Parking Selection',\r\n breadcrumb: {\r\n crumb: 35\r\n }\r\n });\r\n }\r\n function configureInsuranceRoutes() {\r\n $routeProvider.when('/insurance', {\r\n templateUrl: 'partials/insurance/index',\r\n controller: 'Home',\r\n area: 'insurance'\r\n });\r\n $routeProvider.when('/insurance/book/:tripId%', {\r\n templateUrl: getBookingFormTemplate('insurance'),\r\n controllerAs: 'cm',\r\n controller: 'Booking',\r\n area: 'insurance',\r\n noGroup: true,\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n $routeProvider.when('/insurance/notfound', {\r\n templateUrl: 'partials/insurance/searchnotfound',\r\n controller: 'NotFound',\r\n controllerAs: 'cm'\r\n });\r\n $routeProvider.when('/insurance/results/:tripId%', {\r\n templateUrl: 'partials/insurance/insuranceresults',\r\n controller: 'InsuranceResults',\r\n pixelTrackingPageName: 'insuranceSearchResults',\r\n controllerAs: 'cm',\r\n area: 'insurance'\r\n });\r\n }\r\n function termsProviderTemplate(params) {\r\n var sup = '';\r\n angular.forEach(params.suppliers.split('|'), function (s) {\r\n sup += \"&suppliers=\" + s;\r\n });\r\n return String.format('partials/terms/provider?cultureCode={0}&bookingProcessId={1}{2}&transferRateId={3}', params.culture, params.bookingId, sup, params.transferRate);\r\n }\r\n function configureHelpRoutes() {\r\n $routeProvider.when('/help', {\r\n templateUrl: 'partials/help/index',\r\n analyticsTag: ' Help'\r\n });\r\n angular.forEach(TRPCONFIG.Domain.HelpRoutes || [], function (path) {\r\n $routeProvider.when(\"/help/\" + path, {\r\n templateUrl: \"partials/help/\" + path,\r\n analyticsTag: 'Help'\r\n });\r\n });\r\n $routeProvider.when('/terms/agency', {\r\n templateUrl: 'partials/terms/agency',\r\n analyticsTag: 'Terms',\r\n pixelTrackingPageName: 'termsAgency'\r\n });\r\n //we need to have a special hard-coded italian route here temporarily due to an error\r\n //in the ios app\r\n $routeProvider.when('/termini/fornitore/:culture/:bookingId/:suppliers/:transferRate?', {\r\n templateUrl: termsProviderTemplate\r\n });\r\n $routeProvider.when('/terms/provider/:culture/:bookingId/:suppliers/:transferRate?', {\r\n templateUrl: termsProviderTemplate\r\n });\r\n }\r\n function configureFlightsRoutes() {\r\n $routeProvider.when('/flights/destinationairports', {\r\n templateUrl: 'partials/home/destinationairports',\r\n controller: 'TransferAirports',\r\n controllerAs: 'cm',\r\n area: 'flights'\r\n });\r\n $routeProvider.when('/flights/:tripId%', {\r\n templateUrl: 'partials/flights/flightresults',\r\n controller: 'HolidaySearch',\r\n controllerAs: 'cm',\r\n pixelTrackingPageName: 'flightsSearchResults',\r\n area: 'flights',\r\n breadcrumb: {\r\n crumb: 10\r\n }\r\n });\r\n $routeProvider.when('/multiflights/:tripId%', {\r\n templateUrl: 'partials/flights/multiflightresults',\r\n controller: 'MultiFlightsSearch',\r\n controllerAs: 'mfs',\r\n area: 'multisector'\r\n });\r\n }\r\n if (TRPCONFIG.Domain.UseIdBasedHotelUrls) {\r\n $routeProvider.when('/:landingPageV2€/:urlText*', {\r\n templateUrl: 'partials/landingpage/landingcontainer?landing=true',\r\n area: 'hotels',\r\n analyticsTag: 'Landing Page',\r\n pixelTrackingPageName: 'landingPage',\r\n controller: 'LandingPage',\r\n controllerAs: 'lp',\r\n reloadOnSearch: false,\r\n landing: true\r\n });\r\n }\r\n if (TRPCONFIG.Domain.UrlRouteTesting || TRPCONFIG.Domain.UseIdBasedUrls) {\r\n $routeProvider.when('/:landingPageV3£/:urlText*', {\r\n templateUrl: 'partials/landingpage/landingcontainer?landing=true',\r\n controller: 'LandingPage',\r\n analyticsTag: 'Landing Page',\r\n pixelTrackingPageName: 'landingPage',\r\n controllerAs: 'lp',\r\n reloadOnSearch: false,\r\n landing: true\r\n });\r\n $routeProvider.when('/:urlText*/:landingPageV4£', {\r\n templateUrl: 'partials/landingpage/landingcontainer?landing=true',\r\n controller: 'LandingPage',\r\n controllerAs: 'lp',\r\n analyticsTag: 'Landing Page',\r\n pixelTrackingPageName: 'landingPage',\r\n reloadOnSearch: false,\r\n landing: true\r\n });\r\n }\r\n $routeProvider.when('/:landingPage*.html', {\r\n templateUrl: 'partials/landingpage/landingcontainer?landing=true',\r\n controller: 'LandingPage',\r\n analyticsTag: 'Landing Page',\r\n pixelTrackingPageName: 'landingPage',\r\n controllerAs: 'lp',\r\n reloadOnSearch: false,\r\n landing: true\r\n });\r\n function configureProductRoutes(product) {\r\n switch (product) {\r\n case 'hotels':\r\n configureHotelRoutes();\r\n break;\r\n case 'flights':\r\n configureFlightsRoutes();\r\n break;\r\n case 'holidays':\r\n configureHolidayRoutes();\r\n break;\r\n case 'transfers':\r\n configureTransferRoutes();\r\n break;\r\n case 'marhaba':\r\n configureMarhabaRoutes();\r\n break;\r\n case 'parking':\r\n configureParkingRoutes();\r\n break;\r\n case 'insurance':\r\n configureInsuranceRoutes();\r\n break;\r\n }\r\n }\r\n //we still need to handle the old landing page routes for the time being\r\n function rerouteOldLandingPage(args, $route, destinationService, $location, urlUtils) {\r\n $route.current.$$route.area = args.area;\r\n destinationService.getDetails({\r\n CountryId: args.countryId,\r\n ProvinceId: args.provinceId,\r\n LocationId: args.locationId,\r\n PlaceId: args.placeId,\r\n PolygonId: args.polygonId,\r\n EstablishmentId: 0\r\n }, { fields: 'PagePath' }).then(function (dest) {\r\n $location.path(urlUtils.stripLeadingSlash(dest.PagePath));\r\n });\r\n }\r\n $routeProvider.when('/:area/hotel/:estabId', {\r\n template: '
',\r\n controller: function ($route, $routeParams, $location, hotelRehydrator, urlUtils, pageStrand) {\r\n $route.current.$$route.area = $routeParams.area;\r\n var strand = pageStrand.fromRoute();\r\n hotelRehydrator.hotels([$routeParams.estabId], { fields: ['Id', 'Url'] }).then(function (hotels) {\r\n $location.url(pageStrand.adjustUrl(urlUtils.stripLeadingSlash(hotels[0].Url), strand));\r\n });\r\n }\r\n });\r\n $routeProvider.when('/:area/destination/:countryId/:provinceId/:locationId/:placeId/:polygonId', {\r\n template: '
',\r\n controller: function ($route, $routeParams, $location, destinationService, urlUtils) {\r\n rerouteOldLandingPage($routeParams, $route, destinationService, $location, urlUtils);\r\n }\r\n });\r\n $routeProvider.when('/:area/destination/:countryId', {\r\n template: '
',\r\n controller: function ($route, $routeParams, $location, destinationService, urlUtils) {\r\n rerouteOldLandingPage({\r\n area: $routeParams.area,\r\n countryId: $routeParams.countryId,\r\n provinceId: 0,\r\n locationId: 0,\r\n placeId: 0,\r\n polygonId: 0\r\n }, $route, destinationService, $location, urlUtils);\r\n }\r\n });\r\n var commonRoutes = [];\r\n var supportedProducts = TRPCONFIG.Domain.SupportedProducts;\r\n var products = {\r\n none: 0,\r\n hotels: 1,\r\n flights: 2,\r\n holidays: 4,\r\n transfers: 8,\r\n carhire: 16,\r\n marhaba: 32,\r\n // attractions: 64,\r\n parking: 128,\r\n insurance: 256\r\n };\r\n function isSupported(product) {\r\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Flags_and_bitmasks\r\n // eslint-disable-next-line no-bitwise\r\n return (products[product] | supportedProducts) === supportedProducts;\r\n }\r\n ['flights', 'holidays', 'transfers', 'hotels', 'parking'].forEach(function (product) {\r\n if (isSupported(product)) {\r\n commonRoutes.push(product);\r\n }\r\n });\r\n configureCommonRoutes(commonRoutes);\r\n ['hotels', 'flights', 'holidays', 'transfers', 'marhaba', 'parking', 'insurance'].forEach(function (product) {\r\n // NOTE: attractions routes defined in attractions.config.ts\r\n if (isSupported(product)) {\r\n configureProductRoutes(product);\r\n }\r\n });\r\n if (TRPCONFIG.Domain.AccountsEnabled) {\r\n configureAuthRoutes();\r\n }\r\n // New config function For EKH MYB, only the dashboard sign in is available\r\n if (TRPCONFIG.Domain.DashboardBookingEnabled) {\r\n configAuthRoutesMyb();\r\n }\r\n configureHelpRoutes();\r\n $routeProvider.when('/booking/complete/paypal/:tripId%/:ref*', {\r\n controller: 'BookingComplete',\r\n controllerAs: 'cm',\r\n analyticsTag: 'Booking Complete',\r\n inTransactionalFlow: true,\r\n hideFooterToolbar: true,\r\n templateUrl: function (params) {\r\n var qs = \"?bookingRef=\" + params.ref.split('|').join('&bookingRef=');\r\n return \"partials/home/bookingcomplete\" + qs;\r\n }\r\n });\r\n $routeProvider.when('/booking/complete/:ref*', {\r\n controller: 'BookingComplete',\r\n controllerAs: 'cm',\r\n analyticsTag: 'Booking Complete',\r\n pixelTrackingPageName: 'bookingComplete',\r\n inTransactionalFlow: true,\r\n hideFooterToolbar: true,\r\n templateUrl: function (params) {\r\n var qs = \"?bookingRef=\" + params.ref.split('|').join('&bookingRef=');\r\n return \"partials/home/bookingcomplete\" + qs;\r\n }\r\n });\r\n $routeProvider.when('/booking/complete', {\r\n templateUrl: 'partials/home/bookingcomplete',\r\n analyticsTag: 'Booking Complete',\r\n inTransactionalFlow: true,\r\n hideFooterToolbar: true,\r\n controller: function ($scope, broker) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n });\r\n function createDesktopCookie(domain) {\r\n var name = 'trpDesktop';\r\n var date = new Date();\r\n date.setTime(date.getTime() + (2 * 60 * 60 * 1000));\r\n document.cookie = String.format(\"{0}={0}; expires={1}; path=/; domain=\" + domain, name, date.toGMTString());\r\n }\r\n $routeProvider.when('/desktop-myb/:SID/:BID/:SN/:NAV', {\r\n template: '
',\r\n controller: ['$routeParams', function ($p) {\r\n var domain = TRPCONFIG.Domain.HostName;\r\n var desktopUrl = \"https://www.\" + domain;\r\n desktopUrl += '/manage-your-booking/login.aspx';\r\n desktopUrl += \"?SID=\" + $p.SID + \"&BID=\" + $p.BID + \"&SN=\" + $p.SN;\r\n desktopUrl += \"&navpage=\" + $p.NAV;\r\n createDesktopCookie(domain);\r\n location.replace(desktopUrl);\r\n }]\r\n });\r\n $routeProvider.when('/desktop-site', {\r\n template: '
',\r\n controller: [function () {\r\n var domain = TRPCONFIG.Domain.HostName;\r\n var desktopUrl = TRPCONFIG.Domain.RedirectToDesktopUrl || \"https://www.\" + domain;\r\n createDesktopCookie(domain);\r\n location.replace(desktopUrl);\r\n }]\r\n });\r\n $routeProvider.when('/apis-unsubscribe', {\r\n templateUrl: function () { return \"unsubscribe/apisUnsubscribe\" + location.search; }\r\n });\r\n $routeProvider.when('/nps-unsubscribe', {\r\n templateUrl: function () { return \"unsubscribe/npsUnsubscribe\" + location.search; }\r\n });\r\n if (TRPCONFIG.Domain.ShortlistsEnabled) {\r\n $routeProvider.when('/shortlist', {\r\n templateUrl: 'partials/shortlist/index',\r\n controller: 'Shortlist',\r\n controllerAs: 'cm',\r\n analyticsTag: 'Hotel Shortlist'\r\n });\r\n }\r\n if (TRPCONFIG.Domain.RecentHotelsEnabled) {\r\n $routeProvider.when('/recenthotels', {\r\n templateUrl: 'partials/recenthotels/index',\r\n controller: 'RecentHotels',\r\n controllerAs: 'cm',\r\n analyticsTag: 'Recent Hotels'\r\n });\r\n }\r\n $routeProvider.when('/error', {\r\n templateUrl: 'partials/home/error',\r\n analyticsTag: 'Error Page',\r\n pixelTrackingPageName: 'errorPage',\r\n controller: function ($scope, broker) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n });\r\n $routeProvider.when('/errordatesmismatch', {\r\n templateUrl: 'partials/home/errordatesmismatch',\r\n analyticsTag: 'Error Page',\r\n pixelTrackingPageName: 'errorDatesMismatch',\r\n controller: function ($scope, broker) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n });\r\n $routeProvider.when('/bookingalreadydone', {\r\n templateUrl: 'partials/home/bookingnotfound',\r\n analyticsTag: 'Booking Already Done',\r\n pixelTrackingPageName: 'bookingAlreadyDone',\r\n controller: function ($scope, broker) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n });\r\n $routeProvider.when('/pagenotfound', {\r\n templateUrl: 'partials/home/pagenotfound',\r\n analyticsTag: 'Page Not Found',\r\n pixelTrackingPageName: 'pageNotFound',\r\n controller: function ($scope, broker) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n });\r\n $routeProvider.when('/selectcountry', {\r\n templateUrl: 'partials/home/selectcountry'\r\n });\r\n $routeProvider.when('/holidays/flightunavailable', {\r\n templateUrl: 'partials/holidays/flightunavailable'\r\n });\r\n if (TRPCONFIG.Domain.PromotionTermsPageEnabled) {\r\n $routeProvider.when('/promotionterms', {\r\n templateUrl: 'partials/information/promotiontermsandcond',\r\n controller: 'PromotionTerms',\r\n controllerAs: 'pt'\r\n });\r\n }\r\n //this is just a little bit of routing required when paypal payment doesn't go through for some reason\r\n $routeProvider.when('/paypalfail/:tripId%', {\r\n template: '
',\r\n controller: ['$location', '$routeParams', 'basketStore', 'tripService', function ($location, $routeParams, basketStore, tripService) {\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n if (trip) {\r\n basketStore.all(trip.BasketId).then(function (products) {\r\n if (products.t != null) {\r\n $location.url(\"transfers/book/\" + $routeParams.tripId + \"?ppResp=\" + $routeParams.ppResp);\r\n }\r\n else if (products.f != null) {\r\n $location.url(\"holidays/book/\" + $routeParams.tripId + \"?ppResp=\" + $routeParams.ppResp);\r\n }\r\n else {\r\n $location.url(\"hotels/book/\" + $routeParams.tripId + \"?ppResp=\" + $routeParams.ppResp);\r\n }\r\n });\r\n }\r\n });\r\n }]\r\n });\r\n $routeProvider.when('/keymessages', {\r\n templateUrl: 'partials/home/keymessagestext',\r\n controller: ['$scope', '$window', function (scope, $window) {\r\n scrollTo(0, 0);\r\n scope.back = function () {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n };\r\n }]\r\n });\r\n $routeProvider.when('/landing-pages/destination.aspx', {\r\n redirectTo: function () {\r\n var destination = getDestination();\r\n if (destination == null) {\r\n return 'hotels';\r\n }\r\n if (destination.EstablishmentId > 0) {\r\n return \"hotels/hotel/\" + destination.EstablishmentId + \"?pd=\" + destination.pd;\r\n }\r\n return \"hotels?k=\" + destination.k;\r\n }\r\n });\r\n //$routeProvider.when('/keymessages', {\r\n // templateUrl: 'partials/home/keymessagestext',\r\n // controller: ['$scope', '$window', function (scope, $window) {\r\n // scrollTo(0, 0);\r\n // scope.back = function () {\r\n // setTimeout(function () {\r\n // $window.history.back();\r\n // }, 0);\r\n // };\r\n // }]\r\n //});\r\n $routeProvider.when('/keymessages', {\r\n templateUrl: 'partials/home/keymessagestext',\r\n controller: ['$scope', '$window', function (scope, $window) {\r\n scrollTo(0, 0);\r\n scope.back = function () {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n };\r\n }]\r\n });\r\n if (!TRPCONFIG.Domain.CMSHomePageEnabled) {\r\n var newHomeConf = {\r\n bodyUncontained: true,\r\n templateUrl: 'partials/home/newindex'\r\n };\r\n var mobileHomeConf = {\r\n bodyUncontained: true,\r\n templateUrl: 'partials/home/newindex'\r\n };\r\n var superHeroConf = {\r\n bodyUncontained: true,\r\n templateUrl: 'partials/home/superherotest'\r\n };\r\n $routeProvider.when('/', Object.assign({\r\n templateUrl: 'partials/home/index',\r\n controller: 'Home',\r\n area: isSupported('holidays') ? 'holidays' : 'hotels',\r\n strapLine: true,\r\n isResponsive: true,\r\n pixelTrackingPageName: 'homePage'\r\n }, !isMobileSite() && TRPCONFIG.Domain.NewHomepageEnabled && newHomeConf, !isMobileSite() && TRPCONFIG.Domain.SuperheroBannerEnabled && superHeroConf, isMobileSite() && TRPCONFIG.Domain.NewMobileHomepageEnabled && mobileHomeConf));\r\n }\r\n $routeProvider.when('/selectdomain', {\r\n templateUrl: 'livepartials/home/selectdomain',\r\n controllerAs: 'cm',\r\n controller: 'SelectDomain'\r\n });\r\n $routeProvider.when('/selectoffice', {\r\n templateUrl: 'livepartials/home/selectoffice',\r\n controllerAs: 'cm',\r\n controller: 'SelectOffice'\r\n });\r\n $routeProvider.when('/agentsettings', {\r\n templateUrl: 'livepartials/home/agentsettings',\r\n controllerAs: 'cm',\r\n controller: 'Agent'\r\n });\r\n $routeProvider.when('/brochure', {\r\n templateUrl: 'partials/home/brochure'\r\n });\r\n $routeProvider.when('/apps', {\r\n templateUrl: 'partials/home/apppromo',\r\n controllerAs: 'ap',\r\n controller: 'AppPromo'\r\n });\r\n $routeProvider.when('/test-page', {\r\n templateUrl: 'partials/information/testpage',\r\n controllerAs: 'cm',\r\n controller: 'TestPage'\r\n });\r\n $routeProvider.when('/test-home', {\r\n templateUrl: 'partials/information/testhome',\r\n controllerAs: 'cm',\r\n controller: 'TestHome',\r\n bodyUncontained: true\r\n });\r\n $routeProvider.when('/test-components', {\r\n templateUrl: 'partials/information/testcomponents'\r\n });\r\n if (TRPCONFIG.DynamicRoutingEnabled) {\r\n $routeProvider.otherwise({\r\n template: '

Loading...

',\r\n controllerAs: 'cc',\r\n controller: 'DynamicRouting'\r\n });\r\n }\r\n else {\r\n $routeProvider.otherwise({ redirectTo: '/' });\r\n }\r\n delete $httpProvider.defaults.headers.common['X-Requested-With'];\r\n delete $httpProvider.defaults.headers.common['x-requested-with'];\r\n $locationProvider.html5Mode(true).hashPrefix('!');\r\n }]);\r\n TR.run([\r\n '$location', '$route', '$rootScope', 'authService', 'analytics', 'cancellerService', 'broker', 'authRedirection', 'cookieService', '$injector', '$templateCache', 'urlStoreService',\r\n function ($location, $route, $rootScope, authService, analytics, cancellerService, broker, authRedirection, cookieService, $injector, $templateCache, urlStoreService) {\r\n $templateCache.put('loadingcmscomponent.html', '
');\r\n $rootScope.ShortlistsEnabled = TRPCONFIG.Domain.ShortlistsEnabled;\r\n $rootScope.EnableSavedSearches = TRPCONFIG.EnableSavedSearches;\r\n $rootScope.MenuEnabled = TRPCONFIG.MenuEnabled;\r\n $rootScope.ManageBookingEnabled = TRPCONFIG.ManageBookingEnabled;\r\n $rootScope.SignInEnabled = TRPCONFIG.SignInEnabled;\r\n analytics.pageLoad($location.absUrl());\r\n $rootScope.$on('$routeChangeSuccess', function () {\r\n analytics.routeChange($location.absUrl(), $location.url());\r\n if (TRPCONFIG.Domain.SalesforceChatEnabled && window.salesForceSetCurrentUrl) {\r\n window.salesForceSetCurrentUrl();\r\n }\r\n $rootScope.showErrors = false;\r\n broker.publish('selfdestruct');\r\n urlStoreService.pushURL();\r\n });\r\n $rootScope.$on('$routeChangeStart', function (ev, next) {\r\n if (sessionStorage.getItem('willRedirectionOccurByVWO') === 'true') {\r\n var vwoAbsUrl = sessionStorage.getItem('willRedirectionOccurByVWOAbsUrl');\r\n var vwoUrl = sessionStorage.getItem('willRedirectionOccurByVWOUrl');\r\n analytics.routeChange(vwoAbsUrl, vwoUrl);\r\n sessionStorage.removeItem('willRedirectionOccurByVWOAbsUrl');\r\n sessionStorage.removeItem('willRedirectionOccurByVWOUrl');\r\n sessionStorage.removeItem('willRedirectionOccurByVWO');\r\n }\r\n if ($location.search().utm_source && $location.search().utm_medium) {\r\n cookieService.set('CampaignReferrer', $location.search().utm_source + \"_\" + $location.search().utm_medium);\r\n }\r\n var FeatureType = {\r\n Hotels: 'hotels',\r\n Destinations: 'destinations',\r\n Booking: 'booking',\r\n HotelsLanding: 'hotelsLanding',\r\n Flights: 'flights',\r\n Holidays: 'holidays',\r\n AdaptiveBooking: 'adaptiveBooking',\r\n AdaptiveHotels: 'adaptiveHotels',\r\n AdaptiveFlights: 'adaptiveFlights',\r\n AdaptiveHolidays: 'adaptiveHolidays'\r\n };\r\n var isPathAndFeatureTrue = function (nextPath, featureType) {\r\n var matchesPath = _.get(next, '$$route.originalPath') === nextPath;\r\n // Features that are permanently enabled to all users\r\n var parasolEnabledFeatures = _.get(TRPCONFIG, 'Domain.ParasolEnabledFeatures');\r\n var includesEnabledFeature = parasolEnabledFeatures && parasolEnabledFeatures.includes(featureType);\r\n // Features that are part of a test and can only be access by authenticated users\r\n var parasolTestingFeatures = _.get(TRPCONFIG, 'Domain2.ParasolTestingFeatures');\r\n var includesTestingFeature = parasolTestingFeatures && parasolTestingFeatures.includes(featureType);\r\n var testUserAuthenticated = cookieService.get('x-v3') === 'true' || cookieService.get('x-v3') === TRPCONFIG.Domain.ParasolVWOTestId;\r\n return matchesPath && (includesEnabledFeature || (testUserAuthenticated && includesTestingFeature));\r\n };\r\n var isPathAndFeatureTrueAcc = function (acc, _a) {\r\n var nextPath = _a.nextPath, featureType = _a.featureType;\r\n return acc || isPathAndFeatureTrue(nextPath, featureType);\r\n };\r\n var isBookingOptionalExtraTrue = function (selectedOptions) {\r\n if (selectedOptions && selectedOptions.length > 0) {\r\n var supportedOptions = _.get(TRPCONFIG, 'Domain2.ParasolAdaptiveBookingExtras');\r\n var allOptionsSupported = _.intersection(supportedOptions, selectedOptions);\r\n return (allOptionsSupported.length > 0) &&\r\n (selectedOptions.length > 0) &&\r\n (allOptionsSupported.length === selectedOptions.length);\r\n }\r\n };\r\n var matchV3Destinations = function (currentPath) { return /\\/1-[0-9]{1,5}-2-0\\//.test(currentPath); };\r\n var matchV2HotelsLandings = function (currentPath) { return /\\/2-[0-9]{1,6}\\//.test(currentPath); };\r\n // Adds cookie if EnableV3 is set to true in VWO and it doesn't have a cookie yet\r\n if (TRPCONFIG.Domain.TestingV3 && TRPCONFIG.EnableV3 === true && cookieService.get('x-v3') == null) {\r\n cookieService.set('x-v3', TRPCONFIG.Domain.ParasolVWOTestId, false, false, true, 'none');\r\n }\r\n var isV2Request = $location.search().gov && $location.search().gov === '2';\r\n // Regarding m., need to keep these hosts names in else it will start trying to move\r\n // dnata and others onto v3 as well.\r\n var isOurMobileHostname = window.location.hostname.startsWith('m.travelrepublic') ||\r\n window.location.hostname.startsWith('m.pp.travelrepublic') ||\r\n window.location.hostname.startsWith('m.bf.travelrepublic') ||\r\n window.location.hostname.startsWith('m.qa.travelrepublic') ||\r\n (TRPCONFIG.IsMobileView && TRPCONFIG.IsCombinedViewMode);\r\n var isOurLocalDevHostname = /(www|m).dev.travelrepublic/.test(window.location.hostname);\r\n var isAdaptiveBookingCompleteRoute = [\r\n { nextPath: '/booking/complete/:ref*', featureType: FeatureType.AdaptiveBooking },\r\n { nextPath: '/booking/complete', featureType: FeatureType.AdaptiveBooking }\r\n ].reduce(isPathAndFeatureTrueAcc, false);\r\n var isAdaptiveRoute = isAdaptiveBookingCompleteRoute || [\r\n { nextPath: '/hotels/book/:tripId%', featureType: FeatureType.AdaptiveBooking },\r\n { nextPath: '/holidays/book/:tripId%', featureType: FeatureType.AdaptiveBooking },\r\n { nextPath: '/hotels/:tripId%/:estabId', featureType: FeatureType.AdaptiveHotels },\r\n { nextPath: '/hotels/:tripId%', featureType: FeatureType.AdaptiveHotels },\r\n { nextPath: '/flights/:tripId%', featureType: FeatureType.AdaptiveFlights },\r\n { nextPath: '/holidays/hotels/:tripId%', featureType: FeatureType.AdaptiveHolidays },\r\n { nextPath: '/holidays/hotels/:tripId%/:estabId', featureType: FeatureType.AdaptiveHolidays },\r\n { nextPath: '/holidays/flights/:tripId%', featureType: FeatureType.AdaptiveHolidays },\r\n { nextPath: '/holidays/options/:tripId%', featureType: FeatureType.AdaptiveHolidays }\r\n ].reduce(isPathAndFeatureTrueAcc, false);\r\n var isAgentMode = _.get(TRPCONFIG, 'Domain.isAgentMode');\r\n var MetaTrafficIds = _.get(TRPCONFIG, 'Domain2.MetaTrafficIds');\r\n var isntMetaTraffic = MetaTrafficIds && !MetaTrafficIds.includes(cookieService.get('visitSource'));\r\n // We're now taking into account agents and metachannel traffic (by checking the visitSource cookie) and we reroute to v2\r\n if (TRPCONFIG.Domain.TestingV3 && !isV2Request && (isOurMobileHostname || isAdaptiveRoute) && !isOurLocalDevHostname && !isAgentMode && isntMetaTraffic) {\r\n var currPath = $location.path();\r\n var adaptiveBookingFlags = JSON.parse(sessionStorage.getItem('adaptiveBookingFlags'));\r\n // are we on a V3 supported route?\r\n if ((matchV3Destinations(currPath) && isPathAndFeatureTrue('/:landingPageV3£/:urlText*', FeatureType.Destinations)) ||\r\n (matchV2HotelsLandings(currPath) && isPathAndFeatureTrue('/:landingPageV2€/:urlText*', FeatureType.HotelsLanding)) || [\r\n { nextPath: '/hotels/:tripId%/:estabId', featureType: FeatureType.Hotels },\r\n { nextPath: '/hotels/:tripId%', featureType: FeatureType.Hotels },\r\n { nextPath: '/flights/:tripId%', featureType: FeatureType.Flights },\r\n { nextPath: '/holidays/hotels/:tripId%', featureType: FeatureType.Holidays },\r\n { nextPath: '/holidays/hotels/:tripId%/:estabId', featureType: FeatureType.Holidays },\r\n { nextPath: '/holidays/flights/:tripId%', featureType: FeatureType.Holidays },\r\n { nextPath: '/holidays/options/:tripId%', featureType: FeatureType.Holidays }\r\n ].reduce(isPathAndFeatureTrueAcc, false)) {\r\n ev.preventDefault();\r\n window.location.href = currPath.replace('/holidays/flights/', '/holidays/hotels/');\r\n }\r\n // check if they're going to booking complete and have come from a V2 holiday\r\n // but if its an adaptive booking journey route it to V3\r\n if (!isAdaptiveBookingCompleteRoute && [\r\n { nextPath: '/booking/complete/:ref*', featureType: FeatureType.Booking },\r\n { nextPath: '/booking/complete', featureType: FeatureType.Booking }\r\n ].reduce(isPathAndFeatureTrueAcc, false)) {\r\n ev.preventDefault();\r\n if (sessionStorage.getItem('eCommercePurchaseData')) {\r\n // if booking has eCommerce data re-route it to V2 booking complete\r\n window.location.href = \"\" + currPath + (currPath.match(/\\?/) ? '&' : '?') + \"gov=2\";\r\n }\r\n else {\r\n // route traffic on immediately\r\n window.location.href = currPath;\r\n }\r\n }\r\n // are we on a V3 adaptive booking route and are our booking options supported on V3?\r\n if (isAdaptiveRoute && isBookingOptionalExtraTrue(adaptiveBookingFlags)) {\r\n ev.preventDefault();\r\n window.location.href = currPath.replace('/holidays/book/', '/booking/passengers/');\r\n }\r\n }\r\n var redirect = true;\r\n var user = authService.getUser();\r\n if ($location.search().rl === '1') {\r\n $location.replace();\r\n $location.search('rl', null);\r\n $route.reload();\r\n }\r\n cancellerService.process($location.path());\r\n var allowedAgentRoutes = ['/agents/initiateresetpassword', '/admin/resetpassword', '/agents/resetsuccessful'];\r\n if (user && !user.Agent && TRPCONFIG.Domain.IsAgentDomain && allowedAgentRoutes.indexOf($location.path()) === -1) {\r\n $rootScope.$evalAsync(function () {\r\n $location.path('agents/signin').search({ Dest: TRPCONFIG.Domain.AgentLogonUrlDest });\r\n });\r\n return;\r\n }\r\n if (!next.requiresHardAuth && !next.requiresAnonAuth) {\r\n redirect = false;\r\n }\r\n if (next.requiresHardAuth && user && user.HardSignedIn) {\r\n redirect = false;\r\n }\r\n if (next.requiresAnonAuth && user && (user.AnonSignedIn || user.HardSignedIn)) {\r\n redirect = false;\r\n }\r\n if (redirect) {\r\n authService.bufferRoute($location.url());\r\n $location.replace();\r\n var redirectUrl = !next.requiresHardAuth && next.requiresAnonAuth ? 'bookingsignin' : 'signin';\r\n authRedirection.authRedirect(redirectUrl, null, next.params);\r\n }\r\n });\r\n }\r\n ]);\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .config(configOuter);\r\n function configOuter($provide) {\r\n $provide.decorator('$http', http);\r\n http.$inject = ['$delegate', 'errInterceptor'];\r\n function http($http, errInterceptor) {\r\n var customHttp = function (config) {\r\n handleErrorCallback(config);\r\n return $http(config);\r\n };\r\n for (var prop in $http) {\r\n if (typeof ($http[prop]) === 'function') {\r\n customHttp[prop] =\r\n (function (name) {\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n handleErrorCallback(args[args.length - 1]);\r\n return $http[name].apply($http, args);\r\n };\r\n })(prop);\r\n }\r\n else {\r\n customHttp[prop] = $http[prop];\r\n }\r\n }\r\n function handleErrorCallback(config) {\r\n if (!config || typeof (config) !== 'object') {\r\n return;\r\n }\r\n if (config.ignoreErrors) {\r\n config.customErrCallback = angular.noop;\r\n }\r\n if (config.customErrCallback) {\r\n var _id = errInterceptor.addErrCallback(config.customErrCallback);\r\n var _customHeader = { 'x-callback': _id };\r\n delete config.customErrCallback;\r\n config.headers = angular.extend(config.headers || {}, _customHeader);\r\n }\r\n }\r\n return customHttp;\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('ekh')\r\n .config(ekhConfig);\r\n function ekhConfig($routeProvider) {\r\n $routeProvider.when('/types/cruises/terms', {\r\n template: '

Loading...

',\r\n controllerAs: 'cc',\r\n controller: 'DynamicRouting'\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('quote')\r\n .config(quoteConfig);\r\n function quoteConfig($routeProvider) {\r\n if (!TRPCONFIG.Domain.QuoteEnabled) {\r\n return;\r\n }\r\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain2.AllowAgentManageQuote) {\r\n $routeProvider.when('/quote/manage/:quoteRef?/:quoteNo?', {\r\n templateUrl: 'partials/quote/index',\r\n controllerAs: 'qc',\r\n controller: 'Quote'\r\n });\r\n $routeProvider.when('/quote/advancedSearch', {\r\n templateUrl: 'partials/quote/quoteadvancedsearch'\r\n });\r\n }\r\n else {\r\n $routeProvider.when('/quote/manage/:quoteRef?/:quoteNo?', {\r\n templateUrl: 'partials/quote/indexPublic',\r\n controllerAs: 'qp',\r\n controller: 'QuotePublic'\r\n });\r\n }\r\n /* Reverting these urls into existence due to v1 - dont use them, use the urls they redirect to instead */\r\n $routeProvider.when('/quote/manageyourquote/login', {\r\n redirectTo: '/quote/manage/'\r\n });\r\n $routeProvider.when('/quote/manageyourquote/details/:quoteRef/:quoteNo', {\r\n redirectTo: '/quote/manage/:quoteRef/:quoteNo'\r\n });\r\n }\r\n})();\r\nangular.module('attractions').config(function ($routeProvider) {\r\n function isMobileSite() {\r\n return TRPCONFIG.IsMobileView;\r\n }\r\n function getCookie(key) {\r\n // this logic has been duplicated from CookieService which we can't access here\r\n if (!key) {\r\n return null;\r\n }\r\n return decodeURIComponent(document.cookie.replace(new RegExp(\"(?:(?:^|.*;)\\\\s*\" + encodeURIComponent(key)\r\n .replace(/[-.+*]/g, '\\\\$&') + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\"), '$1'))\r\n || null;\r\n }\r\n function getBookingFormTemplate(area) {\r\n if (!TRPCONFIG.Domain.isAgentMode && !isMobileSite()) {\r\n var version = parseFloat(TRPCONFIG.Domain.BookingFormVersion);\r\n if (version > 2) {\r\n if (TRPCONFIG.Domain.BookingFormABTest) {\r\n if (!TRPCONFIG.Domain.isAgentMode) {\r\n var cookieVersion = getCookie('BookingFormVersion');\r\n if (cookieVersion && parseFloat(cookieVersion) > 2) {\r\n return \"partials/booking/template?name=Book&version=\" + cookieVersion;\r\n }\r\n }\r\n }\r\n else {\r\n return \"partials/booking/template?name=Book&version=\" + version;\r\n }\r\n }\r\n }\r\n return \"partials/\" + area + \"/book\";\r\n }\r\n if (TRPCONFIG.Domain.SupportedProducts & 64) {\r\n var area = 'attractions';\r\n $routeProvider.when('/' + area + '/basket', {\r\n templateUrl: 'partials/' + area + '/basket',\r\n controllerAs: 'cm',\r\n controller: 'AttractionsBasket',\r\n area: area,\r\n hideDistractionLinks: true,\r\n analyticsTag: 'Attractions Basket'\r\n });\r\n $routeProvider.when('/' + area + '/book/:tripId', {\r\n templateUrl: getBookingFormTemplate(area),\r\n controllerAs: 'cm',\r\n controller: 'Booking',\r\n area: area,\r\n noGroup: true,\r\n hideDistractionLinks: true,\r\n analyticsTag: 'Booking Form'\r\n });\r\n $routeProvider.when('/' + area + '/book/:tripId/passenger/:room/:index', {\r\n templateUrl: 'partials/' + area + '/passenger',\r\n controllerAs: 'cm',\r\n controller: 'Passenger',\r\n hideDistractionLinks: true,\r\n hideTravelAgentLinks: true\r\n });\r\n }\r\n});\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .config(dashboardConfig);\r\n function dashboardConfig($routeProvider, dashboardEnabledConfig, dashboardDisabledUrl, dashboardDisabledReferenceUrl) {\r\n var dashboardEnabled = TRPCONFIG.Domain[dashboardEnabledConfig];\r\n var redirectTo = function (url) {\r\n var params = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n params[_i - 1] = arguments[_i];\r\n }\r\n return ({\r\n redirect: ['$window', '$route', function ($window, $route) { return $window.location = String.format.apply(String, [url].concat(params.map(function (p) { return $route.current.params[p]; }))); }]\r\n });\r\n };\r\n var amendResolver = {\r\n canAutoRebook: ['$http', '$location', '$route', function ($http, $location, $route) {\r\n var params = $route.current.params;\r\n return $http.get('/api/bookings/amendments/options', {\r\n params: {\r\n bookingId: params.BookingId,\r\n }\r\n })\r\n .then(function (_a) {\r\n var CanAutoRebook = _a.data.CanAutoRebook;\r\n if (!CanAutoRebook) {\r\n $location.url(\"desktop-url/\" + params.BookingRef + \"/\" + params.BookingId + \"/\" + params.LeadPassengerLastName + \"/amend\");\r\n $location.replace();\r\n }\r\n });\r\n }],\r\n booking: ['dashboardBookingService', '$route', function (dashboardBookingService, $route) {\r\n return dashboardBookingService.getMybBooking($route.current.params.BookingId);\r\n }],\r\n bookedEstabId: ['dashboardBookingService', '$route', function (dashboardBookingService, $route) {\r\n return dashboardBookingService.getMybBooking($route.current.params.BookingId)\r\n .then(function (booking) { return _.get(booking, 'Itinerary.Stays[0].Hotel.EstabId'); });\r\n }],\r\n hotel: ['hotelResolver', function (hotelResolver) {\r\n return hotelResolver.resolve(false);\r\n }],\r\n };\r\n $routeProvider.when('/dashboard/amend-booking/:BookingRef/:BookingId/:LeadPassengerLastName/start', {\r\n templateUrl: 'partials/dashboard/amendBooking',\r\n controller: 'AmendBooking',\r\n controllerAs: 'amend',\r\n area: 'hotels',\r\n resolve: _.pick(amendResolver, 'canAutoRebook', 'booking'),\r\n });\r\n $routeProvider.when('/dashboard/amend-booking/:BookingRef/:BookingId/:tripId', {\r\n templateUrl: 'partials/dashboard/amendBookingHotelSearch',\r\n controller: 'HotelSearch',\r\n controllerAs: 'cm',\r\n area: 'hotels',\r\n reloadOnSearch: false,\r\n breadcrumb: {\r\n crumb: 20\r\n }\r\n });\r\n $routeProvider.when('/dashboard/amend-booking/:BookingRef/:BookingId/:tripId/:estabId', {\r\n templateUrl: 'partials/dashboard/amendBookingAvailability',\r\n controller: 'HotelAvailability',\r\n controllerAs: 'cm',\r\n area: 'hotels',\r\n resolve: _.pick(amendResolver, 'hotel', 'bookedEstabId'),\r\n });\r\n if (!dashboardEnabled) {\r\n $routeProvider.when('/dashboard/booking-not-yours/:bookingId', {\r\n templateUrl: 'partials/dashboard/bookingnotyours',\r\n controllerAs: 'cm',\r\n controller: function ($routeParams) {\r\n this.bookingNotYoursId = $routeParams.bookingId;\r\n }\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardHomeEnabled) {\r\n $routeProvider.when('/dashboard', {\r\n templateUrl: 'partials/dashboard/account',\r\n controllerAs: 'cm',\r\n controller: 'Dashboard',\r\n requiresHardAuth: true,\r\n requiresAnonAuth: false\r\n });\r\n }\r\n $routeProvider.when('/dashboard/bookings/:bookingPeriod', dashboardEnabled ? {\r\n templateUrl: function ($routeParams) { return \"partials/dashboard/bookings?bookingType=\" + $routeParams.bookingPeriod; },\r\n controllerAs: 'cm',\r\n controller: 'DashboardBookings',\r\n requiresHardAuth: true,\r\n requiresAnonAuth: false\r\n } : {\r\n requiresHardAuth: true,\r\n requiresAnonAuth: false,\r\n resolve: redirectTo(dashboardDisabledUrl)\r\n });\r\n $routeProvider.when('/dashboard/bookings/reference/:bookingId', dashboardEnabled ? {\r\n templateUrl: 'partials/dashboard/bookings?bookingType=reference',\r\n controller: 'DashboardBookings',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n pixelTrackingPageName: 'dashboardBookingReference'\r\n } : {\r\n requiresAnonAuth: true,\r\n resolve: redirectTo(dashboardDisabledReferenceUrl)\r\n });\r\n if (TRPCONFIG.Domain.DashboardBookingEnabled || TRPCONFIG.Domain.DashboardMobileEnabled) {\r\n $routeProvider.when('/dashboard/bookings/', {\r\n redirectTo: '/dashboard/bookings/current'\r\n });\r\n $routeProvider.when('/dashboard/booking-details/:bookingId', {\r\n templateUrl: 'partials/dashboard/bookingdetails',\r\n controller: 'DashboardBookingDetails',\r\n pixelTrackingPageName: 'dashboardBookingDetails',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/csr/:bookingId', {\r\n templateUrl: 'partials/dashboard/csr',\r\n controller: 'Csr',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/create-csr/:bookingId', {\r\n templateUrl: 'partials/dashboard/createcsr',\r\n controller: 'Csr',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/csr-details/:bookingId/:csrId', {\r\n templateUrl: 'partials/dashboard/csrdetails',\r\n controller: 'CsrDetails',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/resend-voucher/:bookingId', {\r\n templateUrl: 'partials/dashboard/resendvoucher',\r\n controller: 'ResendVoucher',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/contact-detail/:bookingId', {\r\n templateUrl: 'partials/dashboard/contactdetail',\r\n controller: 'ContactDetail',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter,\r\n hideSiteMailingListSignUp: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/pay-balance/:bookingId', dashboardEnabled && TRPCONFIG.Domain.PaybalanceV2Enabled ? {\r\n templateUrl: 'partials/dashboard/paybalance',\r\n controller: 'PayBalance',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n pixelTrackingPageName: 'dashboardPayBalance',\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter\r\n } : {\r\n requiresAnonAuth: true,\r\n resolve: redirectTo('/manage-your-booking/make-a-payment.aspx?BID={0}', 'bookingId')\r\n });\r\n if (TRPCONFIG.Domain.PaybalanceV2Enabled) {\r\n $routeProvider.when('/dashboard/pay-balance/complete/:bookingId', {\r\n templateUrl: 'partials/dashboard/paybalancecomplete',\r\n controller: 'PayBalanceComplete',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter,\r\n hideFooterToolbar: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n }\r\n }\r\n if (TRPCONFIG.Domain.DashboardReviewsEnabled) {\r\n $routeProvider.when('/dashboard/reviews', {\r\n templateUrl: 'partials/dashboard/myreview',\r\n controllerAs: 'cm',\r\n controller: 'DashboardReview',\r\n requiresHardAuth: false,\r\n requiresAnonAuth: true,\r\n resolve: {\r\n redirect: ['authService', '$location', function (authService, $location) {\r\n var user = authService.getUser();\r\n var bookingId = _.get(user, 'BookingId') || _.get(user, 'Contact.BookingId');\r\n if (user.AnonSignedIn && bookingId) {\r\n $location.path(\"review-hotel/\" + bookingId);\r\n }\r\n }],\r\n action: function () { return 'get-reviews'; }\r\n }\r\n });\r\n $routeProvider.when('/dashboard/reviews/submitted/:bookingId/:objectId?', {\r\n templateUrl: 'partials/dashboard/reviewsubmitted',\r\n controllerAs: 'cm',\r\n controller: 'DashboardReview',\r\n requiresHardAuth: true,\r\n requiresAnonAuth: true,\r\n resolve: {\r\n action: function () { return 'review-submitted'; }\r\n }\r\n });\r\n $routeProvider.when('/dashboard/feedbackform/:bookingId/:objectId?', {\r\n templateUrl: 'partials/dashboard/feedbackform',\r\n controllerAs: 'cm',\r\n controller: 'DashboardReview',\r\n requiresHardAuth: false,\r\n requiresAnonAuth: true,\r\n resolve: {\r\n action: function () { return 'review-hotel'; }\r\n }\r\n });\r\n $routeProvider.when('/dashboard/review-hotel/:bookingId/:userId/:token', {\r\n templateUrl: 'partials/dashboard/feedbackform',\r\n controllerAs: 'cm',\r\n controller: 'DashboardReview',\r\n requiresHardAuth: false,\r\n requiresAnonAuth: false,\r\n resolve: {\r\n action: function () { return 'review-hotel'; }\r\n }\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardSettingsEnabled) {\r\n $routeProvider.when('/dashboard/settings', {\r\n templateUrl: 'partials/dashboard/settings',\r\n controllerAs: 'cm',\r\n controller: 'DashboardSettings',\r\n requiresHardAuth: true,\r\n requiresAnonAuth: false\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardBookingEnabled || TRPCONFIG.Domain.DashboardMobileEnabled) {\r\n //to redirect to old desktop urls.\r\n $routeProvider\r\n .when('/desktop-url/:SID/:BID/:SN/:NAV/:CSRID?', {\r\n template: '
',\r\n controller: ['v1Redirection', '$routeParams', function (v1Redirection, $routeParams) { return v1Redirection.v1Redirect($routeParams); }]\r\n });\r\n $routeProvider.when('/dashboard/support', {\r\n templateUrl: 'partials/dashboard/dashboardsupport',\r\n controller: 'Csr',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true\r\n });\r\n }\r\n if (TRPCONFIG.Domain.FlightCheckinEnabled) {\r\n $routeProvider.when('/dashboard/online-checkin/:bookingId', {\r\n templateUrl: 'partials/dashboard/onlinecheckin',\r\n controller: 'OnlineCheckin',\r\n controllerAs: 'cm',\r\n requiresHardAuth: true,\r\n requiresAnonAuth: false\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardAddBagsEnabled) {\r\n $routeProvider.when('/dashboard/add-baggage/:bookingId', {\r\n templateUrl: 'partials/dashboard/addbaggage',\r\n controller: 'AddBaggage',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/add-baggage/complete/:bookingId', {\r\n templateUrl: 'partials/dashboard/addbaggagecomplete',\r\n requiresAnonAuth: true,\r\n controller: 'PayBalanceComplete',\r\n controllerAs: 'cm',\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardAddSeatsEnabled) {\r\n $routeProvider.when('/dashboard/seat-selection/:bookingId', {\r\n templateUrl: 'partials/dashboard/dashboardseatselection',\r\n controller: 'DashboardSeatSelection',\r\n controllerAs: 'cm',\r\n requiresAnonAuth: true,\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n $routeProvider.when('/dashboard/seat-selection/complete/:bookingId', {\r\n templateUrl: 'partials/dashboard/addseatscomplete',\r\n requiresAnonAuth: true,\r\n controller: 'PayBalanceComplete',\r\n controllerAs: 'cm',\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DashboardAddAPIEnabled) {\r\n $routeProvider.when('/dashboard/add-api/:bookingId', {\r\n templateUrl: 'partials/dashboard/addapi',\r\n requiresAnonAuth: true,\r\n controller: 'AddAPI',\r\n controllerAs: 'cm',\r\n hideSiteFooter: TRPCONFIG.Domain.MybHideFooter\r\n });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('cms')\r\n .config(['$routeProvider', function ($routeProvider) {\r\n $routeProvider.when('/cms/preview/:pageId/:componentId', {\r\n template: '

Loading...

',\r\n controllerAs: 'cc',\r\n controller: ['$routeParams', function ($routeParams) {\r\n this.template = \"cms/component/\" + $routeParams.pageId + \"/\" + $routeParams.componentId + \"?device=Apps\";\r\n }]\r\n });\r\n }]);\r\n})();\r\nangular.module('liveChatModule', [])\r\n .run(['liveChatService', function (liveChatService) {\r\n TRPCONFIG.Domain.LiveChat\r\n && TRPCONFIG.Domain.LiveChat.Enabled\r\n && liveChatService.initialise();\r\n }]);\r\nvar Core;\r\n(function (Core) {\r\n var SeoKnowledgeGraph = /** @class */ (function () {\r\n function SeoKnowledgeGraph($scope, $sce, $filter, $window, $location, $element) {\r\n this.$scope = $scope;\r\n this.$sce = $sce;\r\n this.$filter = $filter;\r\n this.$window = $window;\r\n this.$location = $location;\r\n this.$element = $element;\r\n var vm = this;\r\n function checkValue(value) {\r\n if (!value) {\r\n return;\r\n }\r\n var excludeStr = 'SEO_STUCTUREDDATA';\r\n var validValue = (value && value.includes(excludeStr)) ? '' : value;\r\n return (validValue) ? validValue : null;\r\n }\r\n function setJson(value) {\r\n return vm.$sce.trustAsHtml(vm.$filter('json')(value));\r\n }\r\n var showStructuredData = TRPCONFIG.Domain2.ShowJsonLdHomepage;\r\n if (!showStructuredData) {\r\n return;\r\n }\r\n var el = vm.$element[0];\r\n var activate = function () {\r\n var baseUrl = $location && $location.absUrl();\r\n var addressLocality = checkValue($scope.addressLocality);\r\n var postalCode = checkValue($scope.postalCode);\r\n var streetAddress = checkValue($scope.streetAddress);\r\n var addressCountry = checkValue($scope.addressCountry);\r\n var imagePath = checkValue($scope.logoPath);\r\n var image = \"\" + baseUrl + imagePath;\r\n var logo = image;\r\n var name = checkValue($scope.name);\r\n var telephone = checkValue($scope.telephone);\r\n var contactType = checkValue($scope.contactType);\r\n var url = baseUrl;\r\n var socialNetworks = checkValue($scope.socialNetworks);\r\n var sameAs = (socialNetworks) ? socialNetworks.replace(/\\r?\\n|\\r/g, '').split(',') : null;\r\n var schemaType = checkValue($scope.schemaType);\r\n var address = {\r\n addressLocality: addressLocality,\r\n streetAddress: streetAddress,\r\n postalCode: postalCode,\r\n addressCountry: addressCountry,\r\n image: image\r\n };\r\n var contactPoint = {\r\n telephone: telephone,\r\n contactType: contactType\r\n };\r\n var generic = {\r\n logo: logo,\r\n sameAs: sameAs,\r\n name: name,\r\n url: url\r\n };\r\n var addressCompacted = _.pickBy(address, function (value) { return value; });\r\n var contactPointCompacted = _.pickBy(contactPoint, function (value) { return value; });\r\n var genericCompacted = _.pickBy(generic, function (value) { return value; });\r\n var ldJson = __assign({ '@context': 'http://schema.org', '@type': schemaType }, genericCompacted, { 'address': __assign({ '@type': 'PostalAddress' }, addressCompacted), 'contactPoint': __assign({ '@type': 'ContactPoint' }, contactPointCompacted) });\r\n vm.$scope.ldJson = ldJson;\r\n };\r\n vm.$scope.$on('$routeChangeSuccess', function () {\r\n var homepage = $location.path();\r\n if (homepage !== '/') {\r\n el.innerHTML = '';\r\n }\r\n else {\r\n el.innerHTML = setJson(vm.$scope.ldJson);\r\n }\r\n activate();\r\n });\r\n }\r\n SeoKnowledgeGraph.prototype.onGetJson = function () {\r\n var path = this.$location.path();\r\n if (path !== '/') {\r\n return;\r\n }\r\n return this.$sce.trustAsHtml(this.$filter('json')(this.$scope.ldJson));\r\n };\r\n return SeoKnowledgeGraph;\r\n }());\r\n Core.SeoKnowledgeGraph = SeoKnowledgeGraph;\r\n angular\r\n .module('core')\r\n .directive('seoKnowledgeGraph', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n addressLocality: '=',\r\n postalCode: '=',\r\n streetAddress: '=',\r\n addressCountry: '=',\r\n name: '=',\r\n telephone: '=',\r\n socialNetworks: '=',\r\n contactType: '=',\r\n logoPath: '=',\r\n schemaType: '=',\r\n },\r\n controller: SeoKnowledgeGraph,\r\n controllerAs: 'spr',\r\n replace: true,\r\n bindToController: {\r\n ld: '=',\r\n },\r\n template: function () {\r\n return '';\r\n },\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/// \r\nvar DeepLinkController = /** @class */ (function () {\r\n function DeepLinkController($rootScope, deepLinkService, $location, searchQueryString) {\r\n $rootScope.$emit('block', {});\r\n $location.replace();\r\n var reqParams = searchQueryString.getDeepLinkQSParams();\r\n deepLinkService.getSearchDeepLink(reqParams)\r\n .then(function (deepLinkUrl) {\r\n $location.replace();\r\n var pathnameWithoutCulture = deepLinkService.parseFullUrl(deepLinkUrl).pathnameWithoutCulture;\r\n $location.url(pathnameWithoutCulture);\r\n $rootScope.$apply();\r\n });\r\n }\r\n return DeepLinkController;\r\n}());\r\nangular\r\n .module('deepLink')\r\n .controller('DeepLinkController', DeepLinkController);\r\nangular\r\n .module('deepLink')\r\n .config(DeepLinkConfig);\r\nfunction DeepLinkConfig($routeProvider) {\r\n $routeProvider.when('/holidays/search', {\r\n template: '',\r\n controller: 'DeepLinkController',\r\n controllerAs: 'deepLinkCtrl'\r\n });\r\n}\r\nvar TR;\r\n(function (TR) {\r\n angular\r\n .module('TR')\r\n .constant('hotelCriteria', [\r\n { val: [1], name: 'RECOMMENDED' },\r\n { val: [5, 6], name: 'PRICE', defaultSort: 5, defaultOrder: 'asc' },\r\n { val: [8, 7], name: 'STARRATING', defaultSort: 8, defaultOrder: 'desc' }\r\n ])\r\n .constant('flightCriteria', [\r\n { val: [10], name: 'RECOMMENDEDFLIGHT', oneWay: true },\r\n { val: [1, 2], name: 'PRICE', oneWay: true, defaultSort: 1, defaultOrder: 'asc' },\r\n {\r\n val: [4, 5],\r\n name: 'DEPARTURETIME',\r\n oneWay: true,\r\n defaultSort: 4,\r\n defaultOrder: 'asc',\r\n ascSuffix: 'SORTDIRECTIONTIMELABELASCENDING',\r\n descSuffix: 'SORTDIRECTIONTIMELABELDESCENDING'\r\n },\r\n {\r\n val: [6, 7],\r\n name: 'RETURNTIME',\r\n oneWay: false,\r\n defaultSort: 6,\r\n defaultOrder: 'asc',\r\n ascSuffix: 'SORTDIRECTIONTIMELABELASCENDING',\r\n descSuffix: 'SORTDIRECTIONTIMELABELDESCENDING'\r\n },\r\n { val: [9, 8], oneWay: true, name: 'TOTALJOURNEYTIME', defaultSort: 9, defaultOrder: 'asc' }\r\n ])\r\n .constant('dealsCriteria', [\r\n { val: [1], name: 'RECOMMENDED', qs: 'rc' },\r\n { val: [5, 6], name: 'PRICE', defaultSort: 5, defaultOrder: 'asc' },\r\n { val: [8, 7], name: 'STARRATING', defaultSort: 8, defaultOrder: 'desc' }\r\n ])\r\n .constant('costBreakdownCodes', {\r\n Hotel: 1,\r\n CancellationProtection: 21,\r\n });\r\n})(TR || (TR = {}));\r\nvar Core;\r\n(function (Core) {\r\n function AgentCorrelationId(agentModeService, tripService, $q, $routeParams) {\r\n return {\r\n scope: {},\r\n replace: true,\r\n template: \"
\\n Search Id: {{::cm.hotelAvailabilitySearchId}}\\n
\",\r\n controllerAs: 'cm',\r\n controller: function () {\r\n var _this = this;\r\n agentModeService.getDebugSettings()\r\n .then(function (debugSettings) { return _.get(debugSettings, 'EnableSearchTracing'); })\r\n .then(function (enableSearchTracing) { return enableSearchTracing && tripService.getTrip($routeParams.tripId); })\r\n .then(function (trip) { return _.get(trip, 'HotelsRequest.AvailabilitySearchId'); })\r\n .then(function (availabilitySearchId) { return _this.hotelAvailabilitySearchId = availabilitySearchId; });\r\n },\r\n };\r\n }\r\n if (TRPCONFIG.Domain.isAgentMode) {\r\n angular\r\n .module('core')\r\n .directive('agentCorrelationId', AgentCorrelationId);\r\n }\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AgentNetInfo = /** @class */ (function () {\r\n function AgentNetInfo($scope, $q, $route, $routeParams, agentNetInfoService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.$route = $route;\r\n this.$routeParams = $routeParams;\r\n this.agentNetInfoService = agentNetInfoService;\r\n this.displayToolTip = false;\r\n this.currency = TRPCONFIG.Domain.CurrencyCode;\r\n this.areas = {\r\n Holidays: 'holidays',\r\n Hotels: 'hotels',\r\n Flights: 'flights'\r\n };\r\n this.enabled = false;\r\n var area = this.$route.current.area;\r\n this.enabled = false;\r\n var enabledAreas = TRPCONFIG.Domain.AgentNetInfoEnabledAreas.split(',');\r\n var areaIsEnabled = enabledAreas.length && enabledAreas.some(function (item) {\r\n return item === area;\r\n });\r\n if (areaIsEnabled) {\r\n this.createToolTip().then(function (data) {\r\n _this.enabled = true;\r\n _this.populateToolTip();\r\n }, function (data) {\r\n _this.enabled = false;\r\n });\r\n }\r\n }\r\n AgentNetInfo.prototype.createToolTip = function () {\r\n var _this = this;\r\n var deferred = this.$q.defer();\r\n if (this.data) {\r\n var isValidData = this.agentNetInfoService.hasRequiredValues(this.data, this.mode);\r\n isValidData ? deferred.resolve(this.data) : deferred.reject(this.data);\r\n }\r\n else {\r\n var dataLoaded_1 = this.$scope.$watch('ani.data', function (value, prev) {\r\n if (_this.agentNetInfoService.hasRequiredValues(value, _this.mode)) {\r\n dataLoaded_1();\r\n deferred.resolve(_this.data);\r\n }\r\n else {\r\n deferred.reject(_this.data);\r\n }\r\n });\r\n }\r\n return deferred.promise;\r\n };\r\n AgentNetInfo.prototype.populateToolTip = function () {\r\n this.netValues = this.populateNetValues();\r\n };\r\n AgentNetInfo.prototype.showToolTip = function () {\r\n this.displayToolTip = !this.displayToolTip;\r\n };\r\n AgentNetInfo.prototype.populateNetValues = function () {\r\n if (this.$route.current.area === this.areas.Hotels) {\r\n this.data = this.data.concat([\r\n { Cost: { Value: this.vat, CurrencyCode: TRPCONFIG.Domain.CurrencyCode }, Type: 0 },\r\n __assign({}, this.markdown, { Type: 99 })\r\n ]);\r\n }\r\n return this.agentNetInfoService.parse(this.data, this.mode);\r\n };\r\n return AgentNetInfo;\r\n }());\r\n var AgentNetInfoHotels = /** @class */ (function () {\r\n function AgentNetInfoHotels($scope, agentNetInfoService) {\r\n this.$scope = $scope;\r\n this.agentNetInfoService = agentNetInfoService;\r\n this.displayToolTip = false;\r\n this.enabled = false;\r\n this.enabled = this.agentNetInfoService.hasRequiredValues(this.data, 'hotelinfo');\r\n if (this.enabled) {\r\n this.netValues = this.populateNetValues();\r\n }\r\n }\r\n AgentNetInfoHotels.prototype.populateNetValues = function () {\r\n return this.agentNetInfoService.parse(this.data, 'hotelinfo');\r\n };\r\n AgentNetInfoHotels.prototype.showToolTip = function () {\r\n this.displayToolTip = !this.displayToolTip;\r\n };\r\n return AgentNetInfoHotels;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('agentNetInfo', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: AgentNetInfo,\r\n controllerAs: 'ani',\r\n bindToController: {\r\n data: '=',\r\n mode: '@',\r\n showTaxes: '=',\r\n vat: '=',\r\n markdown: '='\r\n },\r\n template: \"
\\n
\\n \\n
\\n
\"\r\n };\r\n })\r\n .directive('agentNetInfoHotels', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: AgentNetInfoHotels,\r\n controllerAs: 'anih',\r\n bindToController: {\r\n data: '='\r\n },\r\n template: \"
\\n
\\n \\n
\\n
\"\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n;\r\nvar Core;\r\n(function (Core) {\r\n var AgentNetInfoTable = /** @class */ (function () {\r\n function AgentNetInfoTable() {\r\n this.currency = TRPCONFIG.Domain.CurrencyCode;\r\n if (!this.commissionType) {\r\n this.commissionType = 'Commission';\r\n }\r\n }\r\n return AgentNetInfoTable;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('agentNetInfoTable', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: AgentNetInfoTable,\r\n controllerAs: 'anit',\r\n bindToController: {\r\n data: '=',\r\n showTax: '=',\r\n commissionType: '@',\r\n mode: '@'\r\n },\r\n templateUrl: \"partials/home/directivetemplate?type=AgentNetInfoTable\"\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/*\r\n Autocompleter field base class\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var AutocompleterField = /** @class */ (function () {\r\n function AutocompleterField() {\r\n var _this = this;\r\n this.prefix = '';\r\n this.showLoading = false;\r\n this.initialData = null;\r\n this.debouncedFetch = _.debounce(function () {\r\n _this.$scope.$evalAsync(_this.fetch());\r\n }, 300);\r\n this.minPrefix = this.minPrefix || TRPCONFIG.Domain.AutoCompleterMinPrefix;\r\n }\r\n AutocompleterField.prototype.init = function (areaOverride) {\r\n if (areaOverride) {\r\n this.areaOverride = areaOverride;\r\n }\r\n };\r\n AutocompleterField.prototype.change = function () {\r\n this.debouncedFetch();\r\n };\r\n AutocompleterField.prototype.update = function (result) {\r\n // Override in derived class to process `fetch()` result\r\n ;\r\n };\r\n AutocompleterField.prototype.addHeader = function (arr, resourceName) {\r\n // Returns a copy of `arr` with header item prepended\r\n if (arr.length) {\r\n return [{\r\n Title: this.resourceService.get(resourceName),\r\n header: true\r\n }].concat(arr);\r\n }\r\n return [];\r\n };\r\n AutocompleterField.prototype.fetch = function () {\r\n var _this = this;\r\n this.$scope.$emit('flash:hide');\r\n if (!this.prefix || !this.prefix.length) {\r\n this.deselect();\r\n }\r\n var area = this.getArea();\r\n var allowedZeroInput = TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter\r\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\r\n && area !== 'flights'\r\n && area !== 'transfers';\r\n if (this.prefix.length < this.minPrefix && !allowedZeroInput) {\r\n // `initialData` is `null` unless overwritten i.e. for recommendations\r\n this.data = this.initialData;\r\n if (area === 'flights-departure') {\r\n this.autocompleter.initialDepartureAirports().then(function (result) { return _this.update(result); });\r\n }\r\n return this.$q.when(null);\r\n }\r\n this.showLoading = true;\r\n return this.autocompleter.lookup(area, this.prefix, this.filterFunction).then(function (result) {\r\n _this.showLoading = false;\r\n if (result.prefix === _this.prefix) {\r\n _this.update(result);\r\n return result;\r\n }\r\n return null;\r\n });\r\n };\r\n AutocompleterField.prototype.getArea = function () {\r\n var current = this.$route.current ? this.$route.current.area : '';\r\n return this.areaOverride || current;\r\n };\r\n return AutocompleterField;\r\n }());\r\n Autocompleter.AutocompleterField = AutocompleterField;\r\n})(Autocompleter || (Autocompleter = {}));\r\n/*\r\n Creates an airport multi select field.\r\n Selectable options are exposed as `ac.data`.\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var AirportMultiSelect = /** @class */ (function (_super) {\r\n __extends(AirportMultiSelect, _super);\r\n function AirportMultiSelect($scope, $route, resourceService, $q, autocompleter) {\r\n var _this = _super.call(this) || this;\r\n _this.$scope = $scope;\r\n _this.$route = $route;\r\n _this.resourceService = resourceService;\r\n _this.$q = $q;\r\n _this.autocompleter = autocompleter;\r\n _this.available = [];\r\n _this.selected = [];\r\n _this.areaOverride = _this.areaOverride || 'flights';\r\n _this.$scope.$watch('ac.currentValue', function (v) {\r\n _this._resetSelected(_.flattenDeep([v]));\r\n });\r\n // Wrap `select` attribute fn\r\n _this.selectAttrFn = _this.select;\r\n _this.select = function (item) {\r\n _this.selectItem(item);\r\n _this.selectAttrFn({ items: _this.selected });\r\n };\r\n if (_this.prefilled != null) {\r\n _this.prefill(_this.prefilled);\r\n }\r\n return _this;\r\n }\r\n AirportMultiSelect.prototype.prefill = function (data) {\r\n var _this = this;\r\n var prefill = data.split(/\\s*,\\s*/);\r\n this.prefix = data;\r\n this.fetch().then(function () {\r\n prefill.forEach(function (code) {\r\n _this.available.forEach(function (item) {\r\n if (item.Code === code) {\r\n _this.select(item);\r\n }\r\n });\r\n });\r\n });\r\n };\r\n Object.defineProperty(AirportMultiSelect.prototype, \"placeholder\", {\r\n get: function () {\r\n return this._placeholder;\r\n },\r\n set: function (placeholder) {\r\n if (!this.notActive) {\r\n this._placeholder = placeholder;\r\n }\r\n else {\r\n this._placeholder = TRPCONFIG.Domain.DefaultStaticAirportLabel;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n AirportMultiSelect.prototype.update = function (result) {\r\n // Called by super.fetch() with autocompleter.lookup result\r\n this.available = result.data;\r\n this._refreshData();\r\n if (_.isEmpty(this.data) && !this.notActive) {\r\n this.data = null;\r\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\r\n }\r\n };\r\n AirportMultiSelect.prototype.selectItem = function (item) {\r\n var _this = this;\r\n if (item && item.Code) {\r\n // Remove codes that are already selected\r\n var codes = _.reject(item.Code.split(','), function (item1) {\r\n return _.find(_this.selected, function (item2) { return item1 === item2.Code; });\r\n });\r\n this._selectEachCode(codes, item.Title);\r\n this.prefix = '';\r\n }\r\n };\r\n AirportMultiSelect.prototype.removeItem = function (item) {\r\n if (!item) {\r\n return;\r\n }\r\n this.selected.splice(this.selected.indexOf(item), 1);\r\n if (!this.selected.length) {\r\n this.deselect();\r\n }\r\n else {\r\n this.selectAttrFn({ items: this.selected });\r\n }\r\n };\r\n AirportMultiSelect.prototype._refreshData = function () {\r\n this.data = this.addHeader(this._getAvailable(), 'AIRPORTS');\r\n };\r\n AirportMultiSelect.prototype._selectEachCode = function (codes, sharedTitle) {\r\n var _this = this;\r\n codes.forEach(function (code) {\r\n if (!_this.notActive || code === _this.prefilled) {\r\n _this.selected.push({ Code: code, Title: sharedTitle });\r\n }\r\n });\r\n };\r\n AirportMultiSelect.prototype._resetSelected = function (items) {\r\n var _this = this;\r\n if (items === void 0) { items = []; }\r\n // Overwrites `this.selected` with data from `currentValue` attr on every change\r\n this.selected = [];\r\n items.forEach(function (item) {\r\n if (item && item.Code) {\r\n _this._selectEachCode(item.Code.split(','), item.Title);\r\n }\r\n });\r\n this._refreshData();\r\n };\r\n AirportMultiSelect.prototype._getAvailable = function () {\r\n var _this = this;\r\n // Filters out items where all codes are already selected\r\n return _.reject(this.available, function (item) {\r\n var selectedCodes = _.map(_this.selected, 'Code');\r\n if (item.Code.indexOf(',') > -1) {\r\n return _.every(item.Code.split(','), function (i) {\r\n return _.indexOf(selectedCodes, i) > -1;\r\n });\r\n }\r\n else {\r\n return _.indexOf(selectedCodes, item.Code) > -1;\r\n }\r\n });\r\n };\r\n return AirportMultiSelect;\r\n }(Autocompleter.AutocompleterField));\r\n angular\r\n .module('TR')\r\n .directive('airportMultiSelect', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'ac',\r\n bindToController: {\r\n placeholder: '@',\r\n select: '&',\r\n deselect: '&',\r\n currentValue: '=',\r\n focusTracker: '=',\r\n minPrefix: '@',\r\n notActive: '@',\r\n prefilled: '@',\r\n disabled: '@',\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=AirportMultiSelect',\r\n controller: AirportMultiSelect,\r\n transclude: true,\r\n link: function (scope, el) {\r\n scope.ac.inputField = el.find('input');\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\n/*\r\n Creates an airport multi select field.\r\n Selectable options are exposed as `ac.data`.\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var AirportMultiSelectUnified2 = /** @class */ (function (_super) {\r\n __extends(AirportMultiSelectUnified2, _super);\r\n function AirportMultiSelectUnified2($scope, $route, autocompleter, resourceService, $q, destinationService, $timeout) {\r\n var _this = _super.call(this) || this;\r\n _this.$scope = $scope;\r\n _this.$route = $route;\r\n _this.autocompleter = autocompleter;\r\n _this.resourceService = resourceService;\r\n _this.$q = $q;\r\n _this.destinationService = destinationService;\r\n _this.$timeout = $timeout;\r\n _this.available = [];\r\n _this.isCodeSelected = function (code) { return _.find(_this.currentValue, function (v) { return code === v.Code; }); };\r\n _this.titleCache = {};\r\n if (!_this.areaOverride) {\r\n _this.areaOverride = 'flights';\r\n }\r\n _this.$scope.$watch('ac.currentValue', function (v) {\r\n if (v) {\r\n _this._refreshData();\r\n }\r\n });\r\n // Wrap `select` attribute fn\r\n _this.selectAttrFn = _this.select;\r\n _this.select = function (item) {\r\n _this.selectItem(item);\r\n _this.selectAttrFn({ items: _this.currentValue });\r\n };\r\n if (_this.prefilled != null) {\r\n _this.prefill(_this.prefilled);\r\n }\r\n else if (_this.getArea() === 'flights-departure') {\r\n _this.autocompleter.initialDepartureAirports().then(function (result) { return _this.update(result); });\r\n }\r\n _this.$scope.$watch('extraFocusTrackerFocused', function (val, old) {\r\n if (val === false && old === true) {\r\n _this.blur();\r\n }\r\n });\r\n return _this;\r\n }\r\n AirportMultiSelectUnified2.prototype.init = function (elements) {\r\n this.elements = elements;\r\n this.inputField = this.elements.input;\r\n };\r\n AirportMultiSelectUnified2.prototype.prefill = function (data) {\r\n var _this = this;\r\n var prefill = data.split(/\\s*,\\s*/);\r\n this.prefix = data;\r\n this.fetch().then(function () {\r\n prefill.forEach(function (code) {\r\n _this.available.forEach(function (item) {\r\n if (item.Code === code) {\r\n _this.select(item);\r\n }\r\n });\r\n });\r\n });\r\n };\r\n Object.defineProperty(AirportMultiSelectUnified2.prototype, \"placeholder\", {\r\n get: function () {\r\n return this._placeholder;\r\n },\r\n set: function (placeholder) {\r\n if (!this.notActive) {\r\n this._placeholder = placeholder;\r\n }\r\n else {\r\n this._placeholder = this.resourceService.get('DEFAULTAIRPORT');\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n AirportMultiSelectUnified2.prototype.update = function (result) {\r\n // Called by super.fetch() with autocompleter.lookup result\r\n this.available = result.data;\r\n this._refreshData();\r\n if (this.data && !this.data.length && !this.notActive) {\r\n this.data = null;\r\n var prefix_1 = (result.prefix + '').toLowerCase();\r\n var hasPrefixAlreadyBeenUsed = prefix_1 &&\r\n _.find(this.currentValue, function (v) { return (v.Title + '').toLowerCase().indexOf(prefix_1) > -1; });\r\n if (!hasPrefixAlreadyBeenUsed) {\r\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\r\n }\r\n }\r\n };\r\n AirportMultiSelectUnified2.prototype.selectItem = function (item) {\r\n var _this = this;\r\n if (item && item.Code) {\r\n // Add codes which are not already selected\r\n var codes = item.Code.split(',');\r\n _.forEach(codes, function (code) {\r\n if (!_this.isCodeSelected(code)) {\r\n if (!_this.currentValue) {\r\n _this.currentValue = [];\r\n }\r\n var individual = _.find(_this.available, function (i) { return i.Code === code; });\r\n individual = individual ? angular.copy(individual) : { Code: code, Title: item.Title };\r\n _this.currentValue.push(individual);\r\n }\r\n });\r\n this.prefix = '';\r\n this._refreshData();\r\n }\r\n };\r\n AirportMultiSelectUnified2.prototype.removeItem = function (item) {\r\n if (!item) {\r\n return;\r\n }\r\n this.currentValue.splice(this.currentValue.indexOf(item), 1);\r\n if (!this.currentValue.length) {\r\n this.deselect();\r\n }\r\n else {\r\n this.selectAttrFn({ items: this.currentValue });\r\n }\r\n this._refreshData();\r\n };\r\n AirportMultiSelectUnified2.prototype.blur = function () {\r\n var _this = this;\r\n this.$timeout(function () {\r\n if (_this.prefix) {\r\n var firstItem = _.find(_this.data || [], function (d) { return !d.header; });\r\n if (firstItem) {\r\n _this.select(firstItem);\r\n }\r\n }\r\n }, 200);\r\n };\r\n AirportMultiSelectUnified2.prototype.focusOnInput = function () {\r\n this.inputField.focus();\r\n };\r\n AirportMultiSelectUnified2.prototype.firstTitle = function () {\r\n if (!this.$scope.extraFocusTrackerFocused) {\r\n if (this.currentValue && this.currentValue[0]) {\r\n return this.getTitle(this.currentValue[0]);\r\n }\r\n }\r\n };\r\n AirportMultiSelectUnified2.prototype.getTitle = function (airport) {\r\n var _this = this;\r\n if (airport.Code in this.titleCache) {\r\n return this.titleCache[airport.Code];\r\n }\r\n if (airport.Title) {\r\n return this.titleCache[airport.Code] = this.formatTitle(airport.Title);\r\n }\r\n this.destinationService\r\n .getAirport(airport.Code)\r\n .then(function (airport) { return _this.titleCache[airport.Code] = _this.formatTitle(airport.Title); });\r\n return this.titleCache[airport.Code] = ' ';\r\n };\r\n AirportMultiSelectUnified2.prototype.formatTitle = function (title) {\r\n return (title || '').split('(')[0].split(',')[0];\r\n };\r\n AirportMultiSelectUnified2.prototype._refreshData = function () {\r\n //this.data = this.addHeader(this._getAvailable(), 'AIRPORTS');\r\n this.data = this._getAvailable();\r\n };\r\n AirportMultiSelectUnified2.prototype._getAvailable = function () {\r\n var _this = this;\r\n // Filters out items where all codes are already selected\r\n return _.reject(this.available, function (item) { return _.every(item.Code.split(','), _this.isCodeSelected); });\r\n };\r\n return AirportMultiSelectUnified2;\r\n }(Autocompleter.AutocompleterField));\r\n angular\r\n .module('TR')\r\n .directive('airportMultiSelectUnified2', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'ac',\r\n bindToController: {\r\n placeholder: '@',\r\n select: '&',\r\n deselect: '&',\r\n currentValue: '=',\r\n focusTracker: '=',\r\n minPrefix: '@',\r\n notActive: '@',\r\n prefilled: '@',\r\n disabled: '@',\r\n areaOverride: '@',\r\n iconName: '@?'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=AirportMultiSelectUnified',\r\n controller: AirportMultiSelectUnified2,\r\n transclude: true,\r\n link: function (scope, el, attrs, ac) {\r\n var elements = {\r\n el: el,\r\n field: el.find('.field'),\r\n input: el.find('input')\r\n };\r\n ac.init(elements);\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingExtrasCarHireOption = /** @class */ (function () {\r\n function BookingExtrasCarHireOption() {\r\n }\r\n BookingExtrasCarHireOption.prototype.select = function ($event) {\r\n $event.preventDefault();\r\n this.selectCar({ quoteId: this.quote.CarHireId.CarHireCode });\r\n };\r\n return BookingExtrasCarHireOption;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('bookingExtrasCarHireOption', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n bindToController: {\r\n quote: '=',\r\n model: '=',\r\n selectable: '=',\r\n selectCar: '&'\r\n },\r\n controller: BookingExtrasCarHireOption,\r\n controllerAs: 'cho',\r\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasCarHireOption'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/**\r\n * Created by bdickson on 15/06/2016.\r\n */\r\nvar TR;\r\n(function (TR) {\r\n var BookingExtrasOptionOld = /** @class */ (function () {\r\n function BookingExtrasOptionOld($scope) {\r\n var _this = this;\r\n // watch the model\r\n $scope.$watch('beo.model', function (model) {\r\n _this._checkSelected();\r\n });\r\n }\r\n BookingExtrasOptionOld.prototype.click = function (event) {\r\n // update the model only if the value has changed\r\n if (!angular.equals(this.model, this.val)) {\r\n this.model = this.val;\r\n }\r\n };\r\n BookingExtrasOptionOld.prototype._checkSelected = function () {\r\n this.selected = angular.equals(this.model, this.val);\r\n //this._input.prop('checked', this.selected);\r\n };\r\n return BookingExtrasOptionOld;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('bookingExtrasOptionOld', function () {\r\n return {\r\n scope: {},\r\n bindToController: {\r\n model: '=',\r\n val: '=',\r\n group: '@',\r\n price: '=',\r\n perPerson: '=',\r\n pricePerDay: '=',\r\n isDelta: '=?',\r\n pricePerPerson: '=?',\r\n priceFull: '=?',\r\n included: '=?',\r\n priceRounded: '=?'\r\n },\r\n controller: BookingExtrasOptionOld,\r\n controllerAs: 'beo',\r\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasOptionOld',\r\n transclude: true,\r\n replace: true,\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingFormHeader = /** @class */ (function () {\r\n function BookingFormHeader(tripService, $routeParams, basketStore, $q, resourceService) {\r\n var _this = this;\r\n this.tripHeading = '';\r\n tripService.getTrip($routeParams.tripId)\r\n .then(function (trip) {\r\n var promise = $q.when();\r\n var resource = '';\r\n switch (trip.TripType) {\r\n case tripService.tripTypes.Holiday:\r\n resource = resourceService.get('YOURHOLIDAYTO');\r\n promise = basketStore.hotel(trip.BasketId);\r\n break;\r\n case tripService.tripTypes.Hotel:\r\n resource = resourceService.get('YOURHOTELIN');\r\n promise = basketStore.hotel(trip.BasketId);\r\n break;\r\n case tripService.tripTypes.Flight:\r\n resource = resourceService.get('YOURFLIGHTTO');\r\n promise = basketStore.flight(trip.BasketId);\r\n break;\r\n case tripService.tripTypes.Transfer:\r\n resource = resourceService.get('YOURTRANSFERTO');\r\n promise = basketStore.transfer(trip.BasketId);\r\n break;\r\n case tripService.tripTypes.Parking:\r\n resource = resourceService.get('YOURAIRPORTPARKINGAT');\r\n break;\r\n case tripService.tripTypes.Attractions:\r\n resource = resourceService.get('YOURATTRACTIONS');\r\n break;\r\n case tripService.tripTypes.Insurance:\r\n resource = resourceService.get('YOURTRAVELINSURANCE');\r\n break;\r\n case tripService.tripTypes.Marhaba:\r\n resource = resourceService.get('YOURMARHABA');\r\n break;\r\n }\r\n promise.then(function (result) {\r\n if (result) {\r\n var detail = function () {\r\n var prop = 'Details.Location';\r\n switch (trip.TripType) {\r\n case tripService.tripTypes.Flight:\r\n prop = 'Details.Itinerary.Legs[0].ArrivalAirport.Title';\r\n break;\r\n case tripService.tripTypes.Transfer:\r\n prop = 'Details.Itinerary.OutboundLeg.DestinationPoint';\r\n break;\r\n case tripService.tripTypes.Attractions:\r\n prop = 'LineItems[0].Description.Title';\r\n break;\r\n }\r\n return prop;\r\n };\r\n var destination = result ? _.get(result, detail(), '') : '';\r\n if (!destination) {\r\n if (trip.TripType === tripService.tripTypes.Transfer) {\r\n destination = _.get(result, 'Details.Itinerary.InboundLeg.DestinationPoint', '');\r\n }\r\n }\r\n _this.tripHeading = String.format(resource, destination);\r\n }\r\n else if (trip.TripType === tripService.tripTypes.Parking) {\r\n _this.tripHeading = String.format(resource, _.get(trip, 'ParkingRequest.Airport.ShortTitle', ''));\r\n }\r\n else {\r\n _this.tripHeading = resource;\r\n }\r\n });\r\n });\r\n }\r\n return BookingFormHeader;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('bookingFormHeader', function (tripService, $routeParams, basketStore, resourceService) {\r\n return {\r\n restrict: 'E',\r\n template: \"
\\n
\\n

\\n {{ bfh.tripHeading }}\\n

\\n
\\n
\",\r\n controller: BookingFormHeader,\r\n controllerAs: 'bfh'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingFormSummary = /** @class */ (function () {\r\n function BookingFormSummary() {\r\n this.links = {\r\n details: {\r\n enabled: false,\r\n caption: this.detailsLinkCaption || ''\r\n },\r\n change: {\r\n enabled: false,\r\n caption: this.changeLinkCaption || '',\r\n state: this.workflowState || 0,\r\n }\r\n };\r\n function changeWorkflow(state) {\r\n this.onChange(state);\r\n }\r\n }\r\n return BookingFormSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('bookingFormSummary', function ($route) {\r\n return {\r\n link: function (scope) {\r\n var type = $route.current.area;\r\n scope.template = \"partials/booking/template?name=BookingSummary\" + type;\r\n },\r\n template: \"
\"\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingSummaryBreakdown = /** @class */ (function () {\r\n function BookingSummaryBreakdown() {\r\n }\r\n return BookingSummaryBreakdown;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('bookingSummaryBreakdown', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n bindToController: {\r\n title: '@',\r\n total: '='\r\n },\r\n controller: BookingSummaryBreakdown,\r\n controllerAs: 'bsb',\r\n replace: true,\r\n templateUrl: 'partials/booking/template?name=BookingSummaryBreakdown'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('canonicalTags', canonicalDirective);\r\n function canonicalDirective(broker, $document, urlUtils) {\r\n return {\r\n restrict: 'E',\r\n link: link\r\n };\r\n function link(scope) {\r\n broker.subscribe('canonicalDirective', 'seoCanonicalDetected', function (eventData) {\r\n _.map($document[0].head.getElementsByTagName('link'), function (linkTag) {\r\n if (linkTag.rel === 'canonical' || linkTag.rel === 'alternate') {\r\n linkTag.href = setCanonicalFid(linkTag.href, eventData.data.fid);\r\n }\r\n });\r\n });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('canonicalDirective');\r\n });\r\n }\r\n // this assumes that a canonical url with a fid will be the path + the single fid parameter\r\n function setCanonicalFid(targetUrl, fid) {\r\n var parsedHref = urlUtils.parse(targetUrl);\r\n return parsedHref.url + \"?fid=\" + fid;\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('datepickerMkc', datepickerMkc);\r\n function datepickerMkc(dateUtil) {\r\n return {\r\n restrict: 'E',\r\n link: _linker,\r\n require: '^datePicker'\r\n };\r\n function _linker(scope, el, attr, datepicker) {\r\n /* In the event of a transclusion inside an isolated-scope-directive the transcluding\r\n directive's scope will always be the previous sibling.\r\n This approach forced me to use an angular private property but, at least, we're not\r\n polluting the controller's scope (when using a shared directive-controller we can't\r\n create an isolated scope because we're on the same element) */\r\n var tScope = scope.$parent;\r\n var dateEl = datepicker.dateEl;\r\n scope = tScope.currentDate;\r\n dateEl.on('keydown', function switchToTab(event) {\r\n /* If we have two datepicker on the same page and we are concurrently updating them\r\n both the update event on the second dp will show the date selection div this will\r\n forcefully hide it */\r\n if (event.which === 13) {\r\n $('#ui-datepicker-div').fadeOut('fast');\r\n }\r\n if (event.which === 9) {\r\n tScope.$apply(function () {\r\n tScope.select({ date: dateEl.datepicker('getDate') });\r\n });\r\n }\r\n });\r\n tScope.$watch('currentDate', function (val) {\r\n if (val) {\r\n dateEl.datepicker('setDate', dateUtil.parseDate(tScope.currentDate));\r\n }\r\n });\r\n tScope.$on('$destroy', function () {\r\n dateEl.off('input');\r\n dateEl.off('blur');\r\n dateEl.off('keydown');\r\n });\r\n }\r\n }\r\n})();\r\n/* tslint:disable:max-line-length */\r\nvar Device;\r\n(function (Device) {\r\n var DeviceMeta = /** @class */ (function () {\r\n function DeviceMeta() {\r\n // http://stackoverflow.com/questions/3514784/what-is-the-best-way-to-detect-a-mobile-device-in-jquery\r\n if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)\r\n || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(navigator.userAgent.substr(0, 4))) {\r\n var metaTag = document.querySelector('meta[name=viewport]');\r\n metaTag.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0';\r\n }\r\n }\r\n return DeviceMeta;\r\n }());\r\n angular.module('core')\r\n .directive('deviceMeta', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controller: DeviceMeta\r\n };\r\n });\r\n})(Device || (Device = {}));\r\nvar Core;\r\n(function (Core) {\r\n function factory(template) {\r\n return function () {\r\n return {\r\n scope: true,\r\n bindToController: {\r\n message: '@'\r\n },\r\n restrict: 'E',\r\n controller: 'DiscountMessage',\r\n controllerAs: 'dm',\r\n template: template,\r\n replace: true\r\n };\r\n };\r\n }\r\n var messageTemplate = \"\\n
\\n {{::dm.message}}\\n
\";\r\n var DiscountMessage = /** @class */ (function () {\r\n function DiscountMessage() {\r\n }\r\n return DiscountMessage;\r\n }());\r\n angular.module('core')\r\n .controller('DiscountMessage', DiscountMessage)\r\n .directive('discountMessage', factory(messageTemplate));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var FlightBookingSummary = /** @class */ (function () {\r\n function FlightBookingSummary($q, $routeParams, $scope, basketStore, broker, tripService, occupancyService) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.basketStore = basketStore;\r\n this.broker = broker;\r\n this.tripService = tripService;\r\n this.occupancyService = occupancyService;\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n if (trip && trip.BasketId) {\r\n _this.trip = trip;\r\n tripService.getTripOccupancy(trip.TripId)\r\n .then(function (results) {\r\n _this.occupancy = results[0];\r\n });\r\n _this.getCostBreakdown();\r\n _this.updateFlightInfo();\r\n broker.subscribe('FlightBookingSummary', 'basketUpdated', function () {\r\n _this.getCostBreakdown();\r\n _this.updateFlightInfo();\r\n });\r\n broker.subscribe('FlightBookingSummary', 'updatePricesOnPUP', function (e) {\r\n _this.getCostBreakdown();\r\n _this.updateFlightInfo();\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('FlightBookingSummary');\r\n });\r\n }\r\n });\r\n }\r\n FlightBookingSummary.prototype.getCostBreakdown = function () {\r\n var _this = this;\r\n this.$q.all([\r\n this.basketStore.totalCost(this.trip.BasketId),\r\n this.basketStore.costBreakdownGrouped(this.trip.BasketId),\r\n this.basketStore.carHire(this.trip.BasketId),\r\n this.basketStore.isAtolProtected(this.trip.BasketId),\r\n this.basketStore.attractionCost(this.trip.BasketId)\r\n ]).then(function (_a) {\r\n var totalCost = _a[0], costBreakdownGrouped = _a[1], carHire = _a[2], isAtolProtected = _a[3], attractionsCost = _a[4];\r\n _this.totalCost = parseFloat(totalCost);\r\n _this.atolAvailable = isAtolProtected;\r\n _this.attractionsCost = attractionsCost;\r\n _.each(costBreakdownGrouped, function (cb) {\r\n if (cb.group === 2) {\r\n // FLIGHTS\r\n _this.flightCost = cb.total;\r\n var atol = _.find(cb.costBreakdown, function (item) {\r\n return item.Description.indexOf('ATOL') >= 0;\r\n });\r\n if (atol) {\r\n _this.atolCost = atol.UnitAmount * atol.Quantity;\r\n _this.flightCost = cb.total - _this.atolCost; // subtract the atol cost from the flights total\r\n }\r\n else {\r\n _this.flightCost = cb.total;\r\n }\r\n }\r\n else if (cb.group === 3) {\r\n // EXTRAS\r\n _this.extrasCost = cb.total;\r\n _this.extras = _this.basketStore.extrasBreakdown(cb.costBreakdown);\r\n }\r\n });\r\n var carHireExtras = _.get(carHire, 'RequestedItems');\r\n _this.carHireExtras = carHireExtras;\r\n _this.carHireExtrasTotal = carHireExtras ?\r\n carHireExtras.reduce(function (total, extra) { return total += extra.UnitAmount; }, 0) :\r\n undefined;\r\n });\r\n };\r\n FlightBookingSummary.prototype.updateFlightInfo = function () {\r\n var _this = this;\r\n this.basketStore.flight(this.trip.BasketId)\r\n .then(function (flight) {\r\n _this.flight = flight;\r\n _this.nights = _this.flight.Details.Itinerary.Nights;\r\n });\r\n };\r\n FlightBookingSummary.prototype.showDetails = function (e) {\r\n var passengers = this.occupancyService.getTotalPeopleCounts();\r\n e.preventDefault();\r\n this.broker.publish('showModalFlightDetails', { flight: this.flight.Details.Itinerary });\r\n };\r\n return FlightBookingSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('flightBookingSummary', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n bindToController: {\r\n cardFeeForTotal: '=?'\r\n },\r\n controller: FlightBookingSummary,\r\n controllerAs: 'fbs',\r\n replace: true,\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=FlightBookingSummary&version='\r\n + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=FlightBookingSummary';\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var HotelList = /** @class */ (function () {\r\n function HotelList($scope, imageService, urlUtils) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.imageService = imageService;\r\n this.urlUtils = urlUtils;\r\n this.hotelImageIndex = 0;\r\n this.hotelImages = [];\r\n this.ready = false;\r\n this.showHotelImages = false;\r\n this.spinnerId = 0;\r\n if (!this.hotels) {\r\n var watch_1 = $scope.$watch('hl.hotels', function (n, o) {\r\n if (n && n !== o) {\r\n _this.ready = true;\r\n watch_1();\r\n }\r\n });\r\n }\r\n else {\r\n this.ready = true;\r\n }\r\n }\r\n HotelList.prototype.selectHotel = function (hotel) {\r\n this.spinnerId = hotel.Id;\r\n };\r\n HotelList.prototype.openImageGallery = function (hotelId, photoCount, e) {\r\n e.preventDefault();\r\n var w = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\r\n var h = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\r\n this.hotelImageIndex = 0;\r\n this.hotelImages = [];\r\n for (var i = 0, l = photoCount; i < l; i++) {\r\n this.hotelImages.push({\r\n src: this.imageService.getImageUrl(hotelId, w, h, i, false)\r\n });\r\n }\r\n this.showHotelImages = true;\r\n };\r\n HotelList.prototype.getHotelUrl = function (hotel) {\r\n return this.urlUtils.stripLeadingSlash(hotel.Url);\r\n };\r\n return HotelList;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('hotelList', function () {\r\n return {\r\n scope: {},\r\n controller: HotelList,\r\n controllerAs: 'hl',\r\n replace: true,\r\n bindToController: {\r\n hotels: '=',\r\n removeHotel: '&'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=HotelList'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar LangSwitcher;\r\n(function (LangSwitcher) {\r\n function languageSwitcher() {\r\n return {\r\n bindToController: {},\r\n restrict: 'E',\r\n replace: true,\r\n controller: 'LanguageSwitcher',\r\n controllerAs: 'ls',\r\n templateUrl: 'partials/home/directivetemplate?type=LanguageSwitcher'\r\n };\r\n }\r\n var LanguageSwitcher = /** @class */ (function () {\r\n function LanguageSwitcher(languageService, $location, $scope, $route) {\r\n var _this = this;\r\n this.languageService = languageService;\r\n this.$location = $location;\r\n this.$scope = $scope;\r\n this.$route = $route;\r\n this.enabled = true;\r\n this.menu = false;\r\n this.$scope.$on('$routeChangeSuccess', function () {\r\n var path = $location.path();\r\n _this.enabled = !/book/.test(path) && !/options/.test(path);\r\n });\r\n }\r\n LanguageSwitcher.prototype.toggle = function () {\r\n this.menu = !this.menu;\r\n };\r\n LanguageSwitcher.prototype.setLanguage = function (lang, id) {\r\n var _this = this;\r\n this.languageService.setLanguage(lang, id)\r\n .then(function () {\r\n if (TRPCONFIG.Domain.RedirectLanguageChangeToHomepage) {\r\n window.location.href = '/?rl=1';\r\n }\r\n else {\r\n //window.location.href = this.$location.absUrl();\r\n _this.$route.reload();\r\n }\r\n });\r\n };\r\n return LanguageSwitcher;\r\n }());\r\n angular.module('TR')\r\n .controller('LanguageSwitcher', LanguageSwitcher)\r\n .directive('languageSwitcher', languageSwitcher);\r\n})(LangSwitcher || (LangSwitcher = {}));\r\nvar Core;\r\n(function (Core) {\r\n var LoaderPanel = /** @class */ (function () {\r\n function LoaderPanel() {\r\n }\r\n return LoaderPanel;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('loaderPanel', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n bindToController: {\r\n busy: '='\r\n },\r\n controller: LoaderPanel,\r\n controllerAs: 'lp',\r\n template: '
' +\r\n '' +\r\n '
'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var ManySelect = /** @class */ (function () {\r\n function ManySelect($scope, $route, autocompleter, resourceService, $q, $timeout, arrayUtil) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$route = $route;\r\n this.autocompleter = autocompleter;\r\n this.resourceService = resourceService;\r\n this.$q = $q;\r\n this.$timeout = $timeout;\r\n this.arrayUtil = arrayUtil;\r\n $timeout(function () {\r\n $scope.$watch(function () { return ({ options: _this.options, model: _this.model, prefix: _this.prefix }); }, function (val) {\r\n _this.remainingOptions = _this.arrayUtil.difference(val.options, val.model);\r\n var prefix = val.prefix && val.prefix.toLowerCase();\r\n if (prefix) {\r\n _this.remainingOptions = _.filter(_this.remainingOptions, function (o) { return o.Title && o.Title.toLowerCase().indexOf(prefix) > -1; });\r\n }\r\n }, true);\r\n });\r\n }\r\n ManySelect.prototype.select = function (item) {\r\n if (item && this.model) {\r\n var isAlreadySelected = _.some(this.model, function (o) { return angular.equals(item, o); });\r\n if (!isAlreadySelected) {\r\n this.model.push(item);\r\n }\r\n this.prefix = '';\r\n }\r\n };\r\n ManySelect.prototype.removeItem = function (item) {\r\n if (item) {\r\n this.model.splice(this.model.indexOf(item), 1);\r\n }\r\n };\r\n ManySelect.prototype.blur = function () {\r\n var _this = this;\r\n this.$timeout(function () {\r\n if (_this.prefix) {\r\n var firstItem = _.find(_this.remainingOptions, function (d) { return !d.header; });\r\n if (firstItem) {\r\n _this.select(firstItem);\r\n }\r\n }\r\n }, 200);\r\n };\r\n return ManySelect;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('manySelect', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'ms',\r\n bindToController: {\r\n placeholder: '@',\r\n model: '=',\r\n options: '=',\r\n iconClass: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=ManySelect',\r\n controller: ManySelect,\r\n transclude: true,\r\n link: function (scope, el) {\r\n scope.ms.inputField = el.find('input');\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\nvar Core;\r\n(function (Core) {\r\n function MonthPicker($location, dateUtil, searchUnitService) {\r\n return {\r\n scope: {\r\n value: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=MonthPicker',\r\n link: function ($scope, $element) {\r\n $scope.showSelectors = false;\r\n $scope.range = (function () {\r\n var origin = dateUtil.todayPlus(4);\r\n var year = origin.getFullYear();\r\n var month = origin.getMonth();\r\n var months = _.range(month, month + 12);\r\n return _.map(months, function (m) { return new Date(year, m, 15, 0, 0, 0, 0); });\r\n })();\r\n $scope.onSelectorClick = function ($event, date) {\r\n $scope.value = date;\r\n $location.search('startDate', dateUtil.format(date, 'yyyy-MM-dd'));\r\n searchUnitService.startDate(1, date);\r\n $scope.showSelectors = false;\r\n if ($event.stopPropagation) {\r\n $event.stopPropagation();\r\n }\r\n };\r\n $scope.onInputClick = function ($event) {\r\n $scope.showSelectors = !$scope.showSelectors;\r\n if ($event.stopPropagation) {\r\n $event.stopPropagation();\r\n }\r\n };\r\n $scope.preventClose = function ($event) {\r\n if ($event.stopPropagation) {\r\n $event.stopPropagation();\r\n }\r\n };\r\n $(document.body).on('click.monthPicker', function (e) {\r\n $scope.showSelectors = false;\r\n $scope.$apply();\r\n });\r\n $scope.$on('$destroy', function () {\r\n $(document.body).off('click.monthPicker');\r\n });\r\n }\r\n };\r\n }\r\n angular\r\n .module('core')\r\n .directive('monthPicker', MonthPicker);\r\n})(Core || (Core = {}));\r\nangular\r\n .module('core')\r\n .directive('noIndexFollow', function ($rootScope, broker) {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n template: '',\r\n controllerAs: 'nif',\r\n controller: function ($scope) {\r\n var _this = this;\r\n $rootScope.$on('$routeChangeStart', function () { return _this.isNoIndexFollow = false; });\r\n broker.subscribe('noIndexFollow', 'ISNOINDEXFOLLOW', function (e) { return _this.isNoIndexFollow = e.data.isNoIndexFollow; });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('noIndexFollow');\r\n });\r\n }\r\n };\r\n});\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('pauseCall', pauseCall);\r\n function pauseCall($rootScope, agentModeService, resourceService, broker) {\r\n return {\r\n restrict: 'A',\r\n link: _linker\r\n };\r\n function _linker(scope, element) {\r\n var structure = _createStructure();\r\n element.on('focus', 'input, select', _pollingStatus);\r\n broker.subscribe('pauseCallDirective', 'pciFrameFocus', _pollingStatus);\r\n var extensions = $rootScope.agent ? $rootScope.agent.PhoneNumbers : [];\r\n scope.$on('$destroy', function () {\r\n $(structure.action).off('click');\r\n broker.unsubscribe('pauseCallDirective');\r\n });\r\n function _pollingStatus() {\r\n _bringInFocus(element);\r\n _bringInFocus($('#payment-details'));\r\n agentModeService\r\n .checkExtensionStatus(extensions)\r\n .then(function existActiveExtension(exists) {\r\n if (exists) {\r\n structure.overlay.style.display = 'block';\r\n _addMessages({ messageText: resourceService.get('CPTRYPAUSE') });\r\n _tryToPause();\r\n }\r\n else {\r\n _hideOverlay();\r\n }\r\n });\r\n }\r\n function _tryToPause() {\r\n agentModeService\r\n .pauseCall()\r\n .then(function _successfullyPaused() {\r\n _addMessages({\r\n messageText: resourceService.get('CPSUCCESSPAUSE'),\r\n actionText: resourceService.get('CPRESUME'),\r\n actionHandler: _tryToResume\r\n });\r\n }, function _pauseFailed(errorString) {\r\n if (errorString === 'ABORT') {\r\n _hideOverlay();\r\n return;\r\n }\r\n _addMessages({\r\n messageText: resourceService.get('CPFAILPAUSE') + \" \" + errorString,\r\n actionText: resourceService.get('CPTRYAGAIN'),\r\n actionHandler: _tryToPause\r\n }, {\r\n messageText: resourceService.get('CPOR')\r\n }, {\r\n actionText: resourceService.get('CPCONTINUEUNPAUSED'),\r\n actionHandler: _forceContinue('Pause')\r\n });\r\n });\r\n }\r\n function _tryToResume() {\r\n agentModeService\r\n .resumeCall()\r\n .then(function _successfullyResumed() {\r\n _addMessages({\r\n messageText: resourceService.get('CPSUCCESSRESUME'),\r\n actionText: resourceService.get('CPHIDE'),\r\n actionHandler: _hideOverlay\r\n });\r\n }, function _resumeFailed(errorString) {\r\n if (errorString === 'ABORT') {\r\n _hideOverlay();\r\n return;\r\n }\r\n _addMessages({\r\n messageText: resourceService.get('CPFAILRESUME') + \" \" + errorString,\r\n actionText: resourceService.get('CPTRYAGAIN'),\r\n actionHandler: _tryToResume\r\n }, {\r\n messageText: resourceService.get('CPOR')\r\n }, {\r\n actionText: resourceService.get('CPCONTINUE'),\r\n actionHandler: _forceContinue('Resume')\r\n });\r\n });\r\n }\r\n function _forceContinue(type) {\r\n return function () {\r\n agentModeService.logFatalError(type);\r\n _hideOverlay();\r\n };\r\n }\r\n function _bringInFocus(el) {\r\n el.css('z-index', 4200);\r\n el.css('position', 'relative');\r\n }\r\n function _hideOverlay() {\r\n structure.container.style.display = 'none';\r\n structure.overlay.style.display = 'none';\r\n element.css('z-index', 0);\r\n $('#payment-details').css('z-index', 0);\r\n }\r\n function _addMessages() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n while (structure.container.lastChild) {\r\n structure.container.removeChild(structure.container.lastChild);\r\n }\r\n for (var i = 0, ii = args.length; i < ii; i++) {\r\n var curr = args[i];\r\n var message = document.createElement('span');\r\n message.textContent += i > 0 ? ' ' : '';\r\n message.textContent += curr.messageText ? curr.messageText + \" \" : '';\r\n structure.container.appendChild(message);\r\n var action = document.createElement('span');\r\n action.className = 'pause-resume-action';\r\n action.textContent = curr.actionText || '';\r\n action.onclick = curr.actionHandler || undefined;\r\n structure.container.appendChild(action);\r\n }\r\n structure.container.style.display = 'block';\r\n }\r\n function _createStructure() {\r\n var overlay = document.createElement('div');\r\n overlay.className = 'pause-resume-overlay';\r\n document.body.appendChild(overlay);\r\n var messageContainer = document.createElement('div');\r\n messageContainer.className = 'agent-panel';\r\n messageContainer.style.display = 'none';\r\n element[0].appendChild(messageContainer);\r\n return {\r\n overlay: overlay,\r\n container: messageContainer\r\n };\r\n }\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var ScrollToTopWhen = /** @class */ (function () {\r\n function ScrollToTopWhen($scope, $timeout, broker) {\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.broker = broker;\r\n }\r\n ScrollToTopWhen.prototype.init = function (element, eventName) {\r\n var _this = this;\r\n this.broker.subscribe('ScrollToTopWhen', eventName, function (e) {\r\n _this.$timeout(function () {\r\n angular.element(element)[0].scrollTop = 0;\r\n }, 100);\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('ScrollToTopWhen');\r\n });\r\n };\r\n return ScrollToTopWhen;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('scrollToTopWhen', function () {\r\n return {\r\n scope: {},\r\n restrict: 'A',\r\n controller: ScrollToTopWhen,\r\n controllerAs: 'sttw',\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el, attr['scrollToTopWhen']);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AgentNetInfoService = /** @class */ (function () {\r\n function AgentNetInfoService() {\r\n this.costTypes = {\r\n AdultReturn: 'AdultReturnTicket',\r\n AdultTaxAirlineFees: 'AdultTaxandAirlineFees'\r\n };\r\n this.commissionTypes = {\r\n Commission: 'Commission',\r\n Markup: 'Markup'\r\n };\r\n this.calculationItemTypes = {\r\n ExchangeRate: 4,\r\n ClientExchangeRate: 11,\r\n Commission: 2,\r\n Rounding: 12,\r\n Markup: 7,\r\n SupplierNetRate: 1,\r\n SupplierGrossRate: 5,\r\n SupplierBindingPrice: 3,\r\n Vat: 0,\r\n PriceAdjustment: 15,\r\n Promotion: 16,\r\n Markdown: 99\r\n };\r\n this.modes = {\r\n Hotel: 'hotel',\r\n Flight: 'flight',\r\n Markup: 'markup',\r\n HotelInfo: 'hotelinfo'\r\n };\r\n this.requiredProps = {\r\n hotel: ['Type'],\r\n flight: ['AdultNetFare.Amount'],\r\n markup: ['Type'],\r\n hotelinfo: ['AgentToolTip.SupplierNetRate',\r\n 'AgentToolTip.CommissionPercentage',\r\n 'AgentToolTip.TotalCommission', 'Cost']\r\n };\r\n }\r\n AgentNetInfoService.prototype.parse = function (data, mode) {\r\n switch (mode) {\r\n case this.modes.Hotel:\r\n return this._parseHotelData(data);\r\n case this.modes.Flight:\r\n return this._parseFlightData(data);\r\n case this.modes.Markup:\r\n return this._parseMarkupData(data);\r\n case this.modes.HotelInfo:\r\n return this._parseHotelInfo(data);\r\n default:\r\n return this._getDefaultValues();\r\n }\r\n };\r\n AgentNetInfoService.prototype.hasRequiredValues = function (data, mode) {\r\n switch (mode) {\r\n case this.modes.Hotel:\r\n case this.modes.Flight:\r\n case this.modes.Markup:\r\n return this._validate(data, this.requiredProps[mode.toLowerCase()]);\r\n case this.modes.HotelInfo:\r\n return this._validate(data, this.requiredProps[mode.toLowerCase()], true);\r\n default:\r\n return false;\r\n }\r\n };\r\n AgentNetInfoService.prototype._getDefaultValues = function () {\r\n return {\r\n SupplierNetRate: 0, CommissionAmount: 0, CommissionPercentage: 0, Tax: 0,\r\n TaxCommissionAmount: 0, TaxCommissionPercentage: 0, TotalGross: 0,\r\n CommissionType: this.commissionTypes.Commission\r\n };\r\n };\r\n AgentNetInfoService.prototype._validate = function (data, props, showNegativeValues) {\r\n if (showNegativeValues === void 0) { showNegativeValues = false; }\r\n var valid = false;\r\n if (_.isArray(data)) {\r\n valid = data.every(function (item) {\r\n return props.every(function (prop) {\r\n return _.has(item, prop);\r\n });\r\n });\r\n }\r\n else {\r\n valid = props.every(function (prop) {\r\n var hasProp = _.has(data, prop);\r\n if (!showNegativeValues) {\r\n return hasProp && _.get(data, prop, 0) > 0;\r\n }\r\n return hasProp;\r\n });\r\n }\r\n return valid;\r\n };\r\n AgentNetInfoService.prototype._parseHotelData = function (data) {\r\n var _this = this;\r\n var netValues = this._getDefaultValues();\r\n //Commission\r\n var commission = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Commission;\r\n });\r\n netValues.CommissionPercentage = this._calculateValue(commission, 'CommissionPercent');\r\n netValues.CommissionAmount = this._calculateValue(commission, 'Cost.Value');\r\n netValues.CommissionCurrency = this._getCurrencyCode(commission);\r\n // Commission changes\r\n var commissionChanges = data.filter(function (item) {\r\n return item.Type === _this.calculationItemTypes.Markup\r\n && item.PercentChange && item.Cancelled === false;\r\n });\r\n if (commissionChanges && commissionChanges.length > 0) {\r\n var firstChange = commissionChanges.find(function (change) {\r\n return change.Cost.CurrencyCode !== '';\r\n });\r\n netValues.CommissionCurrency = this._getCurrencyCode(firstChange);\r\n }\r\n var commissionChangeTotal = commissionChanges.reduce(function (total, value) {\r\n return total + (value.PercentChange || 0);\r\n }, netValues.CommissionPercentage);\r\n netValues.CommissionPercentage += (commissionChanges && commissionChanges.length > 0)\r\n ? commissionChangeTotal : 0;\r\n //SupplierNetRate\r\n var supplierPrefs = [\r\n this.calculationItemTypes.ExchangeRate,\r\n this.calculationItemTypes.SupplierNetRate,\r\n this.calculationItemTypes.SupplierGrossRate\r\n ];\r\n var supplierRate;\r\n for (var index = 0; index < supplierPrefs.length; index++) {\r\n var supplierPref = supplierPrefs[index];\r\n supplierRate = data.find(function (item) {\r\n return item.Type === supplierPref;\r\n });\r\n if (supplierRate) {\r\n break;\r\n }\r\n }\r\n var supplierRateValue = this._calculateValue(supplierRate, 'Cost.Value');\r\n netValues.SupplierNetRate = supplierRateValue - (supplierRate && supplierRate.Type\r\n === this.calculationItemTypes.SupplierNetRate\r\n ? 0 : netValues.CommissionAmount);\r\n netValues.SupplierCurrency = this._getCurrencyCode(supplierRate);\r\n //commission adjustments\r\n if (netValues.CommissionPercentage > 0 && netValues.CommissionAmount === 0) {\r\n netValues.CommissionAmount = this._calculatePercentageAmount(netValues.SupplierNetRate, netValues.CommissionPercentage);\r\n }\r\n ;\r\n // Total gross ( rounded up)\r\n var totalGross = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Rounding;\r\n });\r\n var totalGrossValue = this._calculateValue(totalGross, 'Cost.Value');\r\n netValues.TotalGross = Math.ceil(totalGrossValue);\r\n //client exchange rate\r\n var clientExchange = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.ClientExchangeRate;\r\n });\r\n var exchangeRate = this._calculateValue(clientExchange, 'ExchangeRate');\r\n var exchangedGross = (exchangeRate > 0)\r\n ? netValues.TotalGross / exchangeRate\r\n : netValues.TotalGross;\r\n //exchanged commission adjustments\r\n netValues.CommissionAmount = exchangedGross - netValues.SupplierNetRate;\r\n if (exchangeRate > 0) {\r\n netValues.CommissionAmount *= exchangeRate;\r\n }\r\n ;\r\n //remove any markdown value from commission amount\r\n var markdown = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Markdown;\r\n });\r\n var markdownValue = this._calculateValue(markdown, 'MarkdownAmount');\r\n netValues.CommissionAmount -= markdownValue;\r\n netValues.CommissionPercentage = (netValues.CommissionAmount / netValues.TotalGross) * 100;\r\n netValues.TotalGrossCurrency = this._getCurrencyCode(totalGross);\r\n netValues.CommissionCurrency = netValues.TotalGrossCurrency;\r\n //VAT\r\n var outputVat = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Vat;\r\n });\r\n netValues.OutputVat = this._calculateValue(outputVat, 'Cost.Value');\r\n netValues.OutputVatCurrency = netValues.TotalGrossCurrency || this._getCurrencyCode(outputVat);\r\n return this._formatAsDecimals(netValues);\r\n };\r\n AgentNetInfoService.prototype._parseHotelInfo = function (data) {\r\n var netValues = this._getDefaultValues();\r\n var currency = data.AgentToolTip.CurrencyCode || TRPCONFIG.Domain.CurrencyCode;\r\n netValues.SupplierNetRate = data.AgentToolTip.SupplierNetRate || 0;\r\n netValues.SupplierCurrency = this._getCurrencyCode(data.AgentToolTip.SupplierNetRate, currency);\r\n netValues.CommissionAmount = data.AgentToolTip.TotalCommission || 0;\r\n netValues.CommissionPercentage = data.AgentToolTip.CommissionPercentage || 0;\r\n netValues.CommissionCurrency = this._getCurrencyCode(data.AgentToolTip.TotalCommission, currency);\r\n netValues.TotalGross = data.Cost || 0;\r\n netValues.TotalGrossCurrency = this._getCurrencyCode(data.Cost, currency);\r\n netValues.OutputVat = data.OutputVat || 0;\r\n netValues.OutputVatCurrency = netValues.TotalGrossCurrency ||\r\n this._getCurrencyCode(data.OutputVat, currency);\r\n return this._formatAsDecimals(netValues);\r\n };\r\n AgentNetInfoService.prototype._parseFlightData = function (data) {\r\n var netValues = this._getDefaultValues();\r\n netValues.SupplierNetRate = this._calculateValue(data, 'AdultNetFare.Amount');\r\n var commissionMarkup = this._getMarkup(data, this.costTypes.AdultReturn);\r\n var commission = this._calculateCommission(commissionMarkup, netValues.SupplierNetRate);\r\n netValues.CommissionAmount = commission.Amount;\r\n netValues.CommissionPercentage = Math.floor(commission.Percent);\r\n netValues.CommissionType = commission.CommissionType;\r\n if (netValues.CommissionType === this.commissionTypes.Commission) {\r\n netValues.SupplierNetRate -= netValues.CommissionAmount;\r\n }\r\n netValues.Tax = this._calculateValue(data, 'AdultNetTax.Amount');\r\n var taxMarkup = this._getMarkup(data, this.costTypes.AdultTaxAirlineFees);\r\n var taxcommission = this._calculateCommission(taxMarkup, netValues.Tax);\r\n netValues.TaxCommissionAmount = taxcommission.Amount;\r\n netValues.TaxCommissionPercentage = Math.floor(taxcommission.Percent);\r\n netValues.CommissionType = taxcommission.CommissionType;\r\n if (netValues.CommissionType === this.commissionTypes.Commission) {\r\n netValues.Tax -= netValues.TaxCommissionAmount;\r\n }\r\n netValues.TotalGross = Math.ceil(netValues.SupplierNetRate\r\n + netValues.CommissionAmount\r\n + netValues.Tax\r\n + netValues.TaxCommissionAmount);\r\n return this._formatAsDecimals(netValues);\r\n };\r\n AgentNetInfoService.prototype._parseMarkupData = function (data) {\r\n var _this = this;\r\n var netValues = this._getDefaultValues();\r\n var commission = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Commission;\r\n });\r\n netValues.CommissionPercentage = this._calculateValue(commission, 'CommissionPercent');\r\n netValues.CommissionAmount = this._calculateValue(commission, 'Cost.Value');\r\n netValues.CommissionCurrency = this._getCurrencyCode(commission);\r\n var supplierNetRate = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.SupplierNetRate;\r\n });\r\n netValues.SupplierNetRate = this._calculateValue(supplierNetRate, 'Cost.Value');\r\n var supplierGrossRate = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.SupplierGrossRate;\r\n });\r\n var supplierBindingPrice = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.SupplierBindingPrice;\r\n });\r\n netValues.SupplierNetRate = this._calculateValue(supplierNetRate, 'Cost.Value');\r\n netValues.SupplierGrossRate = this._calculateValue(supplierGrossRate, 'Cost.Value');\r\n netValues.SupplierBindingPrice = this._calculateValue(supplierBindingPrice, 'Cost.Value');\r\n var activeRate = (supplierNetRate || supplierGrossRate || supplierBindingPrice);\r\n netValues.SupplierCurrency = this._getCurrencyCode(activeRate);\r\n var exchangeRate = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.ExchangeRate;\r\n });\r\n netValues.ExchangeRate = (exchangeRate && exchangeRate.ExchangeRate) || 0;\r\n netValues.ExchangeRateTotal = this._calculateValue(exchangeRate, 'Cost.Value');\r\n netValues.ExchangeCurrency = this._getCurrencyCode(exchangeRate);\r\n netValues.Markups = data.filter(function (item) {\r\n return item.Type === _this.calculationItemTypes.Markup;\r\n }) || [];\r\n netValues.Markups = netValues.Markups.map(function (markup) {\r\n if (markup.Markup) {\r\n if (markup.Markup.DepartureStartDate && markup.Markup.DepartureStartDate === '0001-01-01T00:00:00') {\r\n markup.Markup.DepartureStartDate = '';\r\n }\r\n if (markup.Markup.DepartureEndDate && markup.Markup.DepartureEndDate === '0001-01-01T00:00:00') {\r\n markup.Markup.DepartureEndDate = '';\r\n }\r\n }\r\n return markup;\r\n });\r\n netValues.Promotions = data.filter(function (item) {\r\n return item.Type === _this.calculationItemTypes.Promotion;\r\n });\r\n netValues.PriceAdjustments = data.filter(function (item) {\r\n return item.Type === _this.calculationItemTypes.PriceAdjustment;\r\n });\r\n var totalGross = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Rounding;\r\n });\r\n netValues.TotalGross = this._calculateValue(totalGross, 'Cost.Value');\r\n netValues.TotalGrossCurrency = this._getCurrencyCode(totalGross);\r\n var outputVat = data.find(function (item) {\r\n return item.Type === _this.calculationItemTypes.Vat;\r\n });\r\n netValues.OutputVat = this._calculateValue(outputVat, 'Cost.Value');\r\n netValues.OutputVatCurrency = this._getCurrencyCode(outputVat);\r\n return this._formatAsDecimals(netValues);\r\n };\r\n AgentNetInfoService.prototype._calculatePercentageAmount = function (value, percentage) {\r\n return ((value) / 100) * percentage;\r\n };\r\n AgentNetInfoService.prototype._getMarkup = function (data, costType) {\r\n var markup = { AdditionalInfo: '', CommissionAmount: 0, CommissionPercent: 0,\r\n MarkupAmount: 0, MarkupPercent: 0, Priority: 0 };\r\n if (!data || !costType) {\r\n return markup;\r\n }\r\n ;\r\n if (data.Legs && data.Legs.length) {\r\n var leg = data.Legs[0];\r\n if (leg.MarkupsApplied && leg.MarkupsApplied.length) {\r\n markup = leg.MarkupsApplied.find(function (item) {\r\n return new RegExp(costType, 'g').test(item.AdditionalInfo);\r\n });\r\n }\r\n }\r\n return markup;\r\n };\r\n AgentNetInfoService.prototype._calculateCommission = function (data, rate) {\r\n var amount = 0;\r\n var percent = 0;\r\n var commissionType = this.commissionTypes.Commission;\r\n if (data && rate) {\r\n var commissionPercentage = data.CommissionPercent || 0;\r\n var commissionAmount = data.CommissionAmount || 0;\r\n var markupPercentage = data.MarkupPercent || 0;\r\n var markupAmount = data.MarkupAmount || 0;\r\n if (markupPercentage > 0 || markupAmount > 0) {\r\n commissionType = this.commissionTypes.Markup;\r\n if (markupAmount === 0 && markupPercentage > 0) {\r\n markupAmount = this._calculatePercentageAmount(rate, markupPercentage);\r\n }\r\n amount = markupAmount;\r\n percent = markupPercentage;\r\n }\r\n else {\r\n if (commissionAmount === 0 && commissionPercentage > 0) {\r\n commissionAmount = this._calculatePercentageAmount(rate, commissionPercentage);\r\n }\r\n amount = commissionAmount;\r\n percent = commissionPercentage;\r\n }\r\n }\r\n return { Amount: amount, Percent: percent, CommissionType: commissionType };\r\n };\r\n AgentNetInfoService.prototype._calculateValue = function (data, type, defaultValue) {\r\n if (defaultValue === void 0) { defaultValue = 0; }\r\n if (data && type) {\r\n return _.get(data, type, defaultValue);\r\n }\r\n return defaultValue;\r\n };\r\n AgentNetInfoService.prototype._getCurrencyCode = function (data, defaultValue) {\r\n if (defaultValue === void 0) { defaultValue = TRPCONFIG.Domain.CurrencyCode; }\r\n if (data) {\r\n return _.get(data, 'Cost.CurrencyCode', defaultValue);\r\n }\r\n return defaultValue;\r\n };\r\n AgentNetInfoService.prototype._formatAsDecimals = function (value) {\r\n return _.mapValues(value, function (item) {\r\n return (!Number.isInteger(item) && item > 0) ? item.toFixed(2) : item;\r\n });\r\n };\r\n AgentNetInfoService.prototype._toNearest10 = function (value) {\r\n return Math.ceil(value / 10) * 10;\r\n };\r\n return AgentNetInfoService;\r\n }());\r\n angular\r\n .module('core')\r\n .service('agentNetInfoService', AgentNetInfoService);\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .factory('crossSellService', crossSellService);\r\n function crossSellService(analytics, crossSellCommonService, enumService, imageService, flightExtrasService, $q) {\r\n var crossSellKeyByProductType = {\r\n 1: 'Flight',\r\n 2: 'Attractions',\r\n 4: 'CarHire',\r\n 8: 'Hotels',\r\n 16: 'Parking',\r\n 32: 'Transfer'\r\n };\r\n var maxCrossSell = 4;\r\n var maxSameType = 2;\r\n var service = {\r\n getBookingCrossSell: getBookingCrossSell,\r\n getTripCrossSell: getTripCrossSell,\r\n getCrossSellProbability: getCrossSellProbability,\r\n startCrossSellJourney: startCrossSellJourney,\r\n addExtrasAndCrossSells: addExtrasAndCrossSells\r\n };\r\n function getBookingCrossSell(bookingId) {\r\n return crossSellCommonService.getBookingCrossSell(bookingId).then(processData);\r\n }\r\n function addExtrasAndCrossSells(tr) {\r\n var crossSells = [];\r\n var addBaggage = [];\r\n getTripCrossSell(tr, true).then(function (cs) {\r\n crossSells = cs || [];\r\n updateTripWithCrossSells();\r\n });\r\n getExtras(tr).then(function (ab) {\r\n addBaggage = ab || [];\r\n updateTripWithCrossSells();\r\n });\r\n function updateTripWithCrossSells() {\r\n tr.crossSellProducts = _mergeExtrasAndCrossSells(addBaggage, crossSells);\r\n }\r\n }\r\n function getTripCrossSell(tr) {\r\n return crossSellCommonService.getTripCrossSell(tr, service.getBookingCrossSell);\r\n }\r\n function getExtras(tr) {\r\n var flightBookingType = 1;\r\n var flightBooking = _.find(tr.Bookings, function (b) { return b.Type === flightBookingType; });\r\n return TRPCONFIG.Domain.DashboardAddBagsEnabled && flightBooking\r\n ? flightExtrasService.getExtrasCrossSell(flightBooking.BookingId)\r\n : $q.when([]);\r\n }\r\n function _mergeExtrasAndCrossSells(extras, crossSells) {\r\n var crossSellToReplace = crossSells.length + extras.length - maxCrossSell;\r\n if (crossSellToReplace > 0) {\r\n _.remove(crossSells, function (cs) {\r\n return cs.Priority >= crossSells.length - crossSellToReplace;\r\n });\r\n }\r\n _.each(crossSells, function (cs) { cs.Priority += extras.length; });\r\n return extras.concat(crossSells);\r\n }\r\n function processData(result) {\r\n if (!result) {\r\n return [];\r\n }\r\n var crossSells = result.data;\r\n return filterCrossSellByPriority(crossSells).map(function (cs) {\r\n return _.extend(cs, { roundedCurrency: true });\r\n });\r\n }\r\n function startCrossSellJourney(bookingId, crossSellProduct) {\r\n crossSellCommonService.startCrossSellJourney(bookingId, crossSellProduct);\r\n }\r\n function getCrossSellImage(product) {\r\n switch (product.ProductType) {\r\n case enumService.ProductType.Hotel:\r\n return imageService.getMainImageUrl(product.EstabId, 400, 140, true);\r\n case enumService.ProductType.Transfer:\r\n return '/build/img/assets/product/transfers.jpg';\r\n case enumService.ProductType.CarHire:\r\n return '/build/img/assets/car_hire.jpg';\r\n case enumService.ProductType.Parking:\r\n return '/build/img/assets/car_parking.jpg';\r\n case enumService.ProductType.Attraction:\r\n return \"/attractions/Handlers/crosssellimage.ashx?acsid=\" + product.Id;\r\n default:\r\n return '';\r\n }\r\n }\r\n function addProperties(productType, product, type) {\r\n var productToDisplay = _.merge(_.omit(productType, 'CrossSells'), product);\r\n _.assignIn(productToDisplay, type);\r\n productToDisplay.Image = getCrossSellImage(productToDisplay);\r\n productToDisplay.Price = productToDisplay.AdultPrice || productToDisplay.Price;\r\n productToDisplay.Title = productToDisplay.Title || productToDisplay.Description || productToDisplay.CarPark;\r\n return productToDisplay;\r\n }\r\n function getCrossSellProbability(basketId, productTypes) {\r\n return crossSellCommonService.getBasketCrossSell(basketId).then(function (data) {\r\n var result = {};\r\n _.forEach(data, function (i) {\r\n if (productTypes.indexOf(i.Product) !== -1) {\r\n result[i.Product] = i.Probability;\r\n }\r\n });\r\n analytics.track('Event', 'BasketCrossSell', { BasketId: basketId, ProductProbability: result });\r\n analytics.track('mixpanel', 'BasketCrossSell', {\r\n ProductProbabilityCarHire: result[enumService.ProductType.CarHire],\r\n ProductProbabilityTransfer: result[enumService.ProductType.Transfer]\r\n });\r\n return result !== {} ? result : null;\r\n });\r\n }\r\n function filterCrossSellByPriority(crossSell) {\r\n var filteredCrossSell = {};\r\n var simplifiedCrossSellList = [];\r\n var counter = 0;\r\n if (crossSell.Priorities.length > 0) {\r\n var priorities_1 = _.sortBy(crossSell.Priorities, function (p) { return p.Order; });\r\n _.times(maxCrossSell, function (c) {\r\n if (counter >= priorities_1.length) {\r\n counter = 0;\r\n }\r\n var key = crossSellKeyByProductType[priorities_1[counter].Type];\r\n if (!filteredCrossSell[key]) {\r\n filteredCrossSell[key] = [];\r\n }\r\n if (filteredCrossSell[key].length < maxSameType) {\r\n var cs = crossSell[key].CrossSells[filteredCrossSell[key].length];\r\n if (cs) {\r\n cs.Priority = c;\r\n cs = addProperties(crossSell[key], cs, crossSellCommonService.productTypeProperties[key]);\r\n filteredCrossSell[key].push(cs);\r\n }\r\n }\r\n counter++;\r\n });\r\n _.each(priorities_1, function (p) { return simplifiedCrossSellList.push.apply(simplifiedCrossSellList, filteredCrossSell[crossSellKeyByProductType[p.Type]]); });\r\n }\r\n return simplifiedCrossSellList;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var PostBookingLookup = /** @class */ (function () {\r\n function PostBookingLookup($location, authService) {\r\n this.$location = $location;\r\n this.authService = authService;\r\n }\r\n PostBookingLookup.prototype.redirect = function () {\r\n if (TRPCONFIG.Domain.DashboardBookingEnabled) {\r\n var bookingId = this.authService.getSignedInBookingId();\r\n if (bookingId) {\r\n this.$location.path('dashboard/booking-details/' + bookingId);\r\n }\r\n return;\r\n }\r\n document.location.href = '/manage-your-booking/options.aspx';\r\n };\r\n return PostBookingLookup;\r\n }());\r\n Core.PostBookingLookup = PostBookingLookup;\r\n angular\r\n .module('core')\r\n .service('postBookingLookup', PostBookingLookup);\r\n})(Core || (Core = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var BookingActionLink = /** @class */ (function () {\r\n function BookingActionLink() {\r\n this.desktopUrl = 'desktop-url/{{BookingRef}}/{{BookingId}}/{{LeadPassengerLastName}}';\r\n this.actionLinks = {\r\n 'VIEWBOOKINGDETAILS': 'dashboard/booking-details/{{::BookingId}}',\r\n 'CHANGECONTACTDETAILS': 'dashboard/contact-detail/{{::BookingId}}',\r\n 'CANCELBOOKINGS': TRPCONFIG.Domain.CreateCSRToCancelBooking ?\r\n 'dashboard/create-csr/{{BookingId}}?id=3' : this.desktopUrl + '/cancel',\r\n 'CSR': TRPCONFIG.Domain.DisableFAQs ?\r\n 'dashboard/create-csr/{{BookingId}}' : 'dashboard/csr/{{BookingId}}',\r\n 'MANAGEPASSENGERDETAILS': this.desktopUrl + '/api',\r\n 'PRINTVOUCHER': 'document/receipt/{{::BookingId}}',\r\n 'PRINTRECEIPT': 'document/receipt/{{::BookingId}}',\r\n 'PAYBALANCE': TRPCONFIG.Domain.PaybalanceV2Enabled ?\r\n 'dashboard/pay-balance/{{::BookingId}}' : this.desktopUrl + '/payment',\r\n 'ONLINECHECKIN': 'dashboard/online-checkin/{{BookingId}}',\r\n 'VOUCHERACTIONS': 'dashboard/resend-voucher/{{BookingId}}',\r\n 'AMENDBOOKING': TRPCONFIG.Domain.CreateCSRToAmendBooking ?\r\n 'dashboard/create-csr/{{BookingId}}?id=159' :\r\n TRPCONFIG.Domain.EnableAmendBookingV2 ?\r\n 'dashboard/amend-booking/{{BookingRef}}/{{BookingId}}/{{LeadPassengerLastName}}/start' :\r\n this.desktopUrl + '/amend',\r\n 'ENTERAPI': TRPCONFIG.Domain.DashboardAddAPIEnabled ?\r\n 'dashboard/add-api/{{::BookingId}}' : this.desktopUrl + '/api',\r\n 'ENTERREVIEW': 'review-hotel/{{BookingId}}',\r\n 'ADDBAGGAGE': 'dashboard/add-baggage/{{::BookingId }}',\r\n 'ADDSEATS': 'dashboard/seat-selection/{{::BookingId }}',\r\n 'DERWENTLINK': TRPCONFIG.Domain.DerwentUrl + 'Booking/boBookingDetails.aspx?BookingId={{BookingId}}',\r\n 'PRINTINVOICE': 'document/invoice/{{::BookingId}}'\r\n };\r\n }\r\n BookingActionLink.prototype.get = function () {\r\n return angular.copy(this.actionLinks);\r\n };\r\n return BookingActionLink;\r\n }());\r\n Dashboard.BookingActionLink = BookingActionLink;\r\n angular\r\n .module('dashboard')\r\n .service('bookingActionLink', BookingActionLink);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n angular\r\n .module('dashboard')\r\n .constant('dashboardEnabledConfig', 'DashboardBookingEnabled')\r\n .constant('dashboardDisabledReferenceUrl', '/manage-your-booking/options.aspx')\r\n .constant('dashboardDisabledUrl', '/account/bookings.aspx');\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var NotificationLink = /** @class */ (function () {\r\n function NotificationLink() {\r\n this.desktopUrl = 'desktop-url/{{SiteId}}/{{BookingId}}/{{LastName}}';\r\n this.notificationLinks = {\r\n 1: '/dashboard/csr/{{::BookingId}}',\r\n 2: '/dashboard/csr/{{::BookingId}}',\r\n 3: '/dashboard/pay-balance/{{::BookingId}}',\r\n 4: this.desktopUrl + '/api',\r\n 6: 'review-hotel/{{::BookingId}}'\r\n //0,5,6,7,8,9 type of notifications are there.. need link for them\r\n };\r\n }\r\n NotificationLink.prototype.get = function () {\r\n return angular.copy(this.notificationLinks);\r\n };\r\n return NotificationLink;\r\n }());\r\n Dashboard.NotificationLink = NotificationLink;\r\n angular\r\n .module('dashboard')\r\n .service('notificationLink', NotificationLink);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var V1Redirection = /** @class */ (function () {\r\n function V1Redirection($http, $window, $location, dashboardBookingService) {\r\n this.$http = $http;\r\n this.$window = $window;\r\n this.$location = $location;\r\n this.dashboardBookingService = dashboardBookingService;\r\n }\r\n V1Redirection.prototype.v1Redirect = function (routeParams) {\r\n var url;\r\n switch (routeParams.NAV) {\r\n case 'contactdetails':\r\n url = 'change-your-contact-details.aspx';\r\n break;\r\n case 'cancel':\r\n url = 'cancel-your-booking.aspx';\r\n break;\r\n case 'api':\r\n url = 'submit-your-passenger-information.aspx';\r\n break;\r\n case 'printvoucher':\r\n url = 'view-booking-receipt.aspx';\r\n break;\r\n case 'payment':\r\n url = 'make-a-payment.aspx';\r\n break;\r\n case 'newrequest':\r\n url = 'raise-a-customer-service-request.aspx';\r\n break;\r\n case 'viewrequest':\r\n url = 'customer-service-request-details.aspx?Id=' + routeParams.CSRID;\r\n break;\r\n case 'amend':\r\n // tslint:disable-next-line\r\n url = 'amend-your-booking.aspx?';\r\n if (routeParams.trackingTag) {\r\n url += \"trackingTag=\" + routeParams.trackingTag + \"&\";\r\n }\r\n if (routeParams.categoryId) {\r\n url += \"categoryId=\" + routeParams.categoryId + \"&\";\r\n }\r\n break;\r\n case 'review':\r\n url = '/Client/clClientFeedBack.aspx?bid={0}&emailLink=0';\r\n break;\r\n case 'options':\r\n url = 'options.aspx';\r\n break;\r\n }\r\n this._loadBooking(routeParams, url);\r\n };\r\n V1Redirection.prototype._loadBooking = function (routeParams, url) {\r\n var _this = this;\r\n var mybPath = '/manage-your-booking/';\r\n var data = {\r\n bookingId: routeParams.BID,\r\n siteId: routeParams.SID,\r\n surname: routeParams.SN,\r\n type: (routeParams.NAV === 'review') ? 2 : 1\r\n };\r\n var loadV1 = function () {\r\n return _this.$http.get('/Include/Handlers/UserAccount.ashx?' + $.param(data)).then(function (result) {\r\n if (result.data.success === true) {\r\n if (data.type === 2) {\r\n url = String.format(url, result.data.secureId);\r\n _this.$window.location = url;\r\n location.replace(url);\r\n }\r\n else {\r\n _this.$window.location = mybPath + url;\r\n location.replace(mybPath + url);\r\n }\r\n }\r\n });\r\n };\r\n if (TRPCONFIG.Domain.AccountsEnabled && _.includes(['amend', 'cancel'], routeParams.NAV)) {\r\n return this.dashboardBookingService.getBookingDetail(routeParams.BID).then(function (details) {\r\n return details && details.PackageId\r\n ? _this.$location.path(\"dashboard/csr/\" + data.bookingId).search({\r\n id: routeParams.NAV === 'amend' ? '129' : '3'\r\n })\r\n : loadV1();\r\n });\r\n }\r\n return loadV1();\r\n };\r\n return V1Redirection;\r\n }());\r\n Dashboard.V1Redirection = V1Redirection;\r\n angular\r\n .module('dashboard')\r\n .service('v1Redirection', V1Redirection);\r\n})(Dashboard || (Dashboard = {}));\r\nvar TR;\r\n(function (TR) {\r\n 'use strict';\r\n var HolidayDealsPromo = /** @class */ (function () {\r\n function HolidayDealsPromo($location, $scope, $rootScope, filtering, analytics, broker, holidayDeals, holidayDealsPromoService, resourceService) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$scope = $scope;\r\n this.$rootScope = $rootScope;\r\n this.filtering = filtering;\r\n this.analytics = analytics;\r\n this.broker = broker;\r\n this.holidayDeals = holidayDeals;\r\n this.holidayDealsPromoService = holidayDealsPromoService;\r\n this.resourceService = resourceService;\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGDEALS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-holidayDealsResults'\r\n });\r\n this.$rootScope.hideFooterToolbar = true;\r\n this.analytics.track('mixpanel', 'HolidayDealsInsLanding');\r\n this.holidayDealsPromoService.getInfoPromo().then(function (info) {\r\n _this.summary = info.summary;\r\n _this.blocks = info.blocks;\r\n _this.$scope.$emit('unblock');\r\n });\r\n this.flags = {\r\n searchUnit: true,\r\n clicks: 0\r\n };\r\n this.broker.subscribe('holidayDealsPromoController', 'PROMO_OVERLAY', function (_a) {\r\n var data = _a.data;\r\n _this.flags.clicks = _this.flags.clicks + 1;\r\n _this.flags.holidayType = data.group === 'type' ? data.type : _this.flags.holidayType;\r\n _this.flags.budget = data.group === 'budget' ? data.type : _this.flags.budget;\r\n });\r\n this.broker.subscribe('holidayDealsPromoController', 'REFRESHSEARCH', function () {\r\n _this.holidayDealsPromoService.getInfoPromo().then(function (info) {\r\n _this.summary = info.summary;\r\n _this.blocks = info.blocks;\r\n });\r\n });\r\n $scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('holidayDealsPromoController', 'PROMO_OVERLAY');\r\n _this.broker.unsubscribe('holidayDealsPromoController', 'REFRESHSEARCH');\r\n });\r\n }\r\n HolidayDealsPromo.prototype.toggleSearchUnit = function () {\r\n this.flags.searchUnit = !this.flags.searchUnit;\r\n };\r\n HolidayDealsPromo.prototype.goToDeals = function () {\r\n this.broker.unsubscribe('holidayDealsPromoController', 'PROMO_OVERLAY');\r\n this.broker.unsubscribe('holidayDealsPromoController', 'REFRESHSEARCH');\r\n this.$scope.$emit('block', {\r\n title: this.resourceService.get('SEARCHINGDEALS'),\r\n subtitle: this.resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-holidayDealsResults'\r\n });\r\n var params = this.$location.search();\r\n this.analytics.track('mixpanel', 'HolidayInspSelected', {\r\n Budget: this.flags.budget,\r\n Type: this.flags.holidayType,\r\n Clicks: this.flags.clicks\r\n });\r\n this.$location.search('flex', 15);\r\n this.$location.path('/holidaydeals');\r\n };\r\n return HolidayDealsPromo;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('HolidayDealsPromo', HolidayDealsPromo);\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n function Loading($scope, $timeout, resourceService) {\r\n $timeout(function () {\r\n $scope.$emit('block', {\r\n title: resourceService.get('LOADINGRECOMMENDEDESTAB'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'hotels-hotelSearchCtrl-isHolidayFalse'\r\n });\r\n });\r\n }\r\n angular\r\n .module('TR')\r\n .controller('Loading', Loading);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('acceptanceText', function (insuranceService) {\r\n var domain = TRPCONFIG.Domain;\r\n return {\r\n restrict: 'A',\r\n link: function (scope, el) {\r\n scope.$watch('cm.booking.AcceptanceText', function () {\r\n if (scope.cm.booking == null) {\r\n return;\r\n }\r\n //various bad things happening here, all because the acceptance text is coming from the server in one block\r\n if (scope.cm.insurance) {\r\n var docPaths = insuranceService.getDocumentPaths();\r\n $('a.showInsuranceTerms', el).attr('href', docPaths.PolicyWording).attr('target', '_blank');\r\n $('a.showStatusDisclosure', el).attr('href', docPaths.Disclosure).attr('target', '_blank');\r\n $('a.insuranceProductInformation', el).attr('href', docPaths.InsuranceProductInformation).attr('target', '_blank');\r\n }\r\n else {\r\n $('a.showInsuranceTerms', el).parent().hide();\r\n }\r\n function attachLightbox(e, url, content) {\r\n e.preventDefault();\r\n scope.cm.selectedImportantInfo = url;\r\n scope.cm.showImportantInfo = true;\r\n scope.cm.importantInfoContent = content || '';\r\n scope.$apply();\r\n }\r\n $('a.agencyTerms', el).bind('click', function (e) {\r\n attachLightbox(e, 'partials/popups/agencyterms');\r\n });\r\n var route = [domain.CultureCode, scope.cm.booking.BookingProcessId, scope.cm.booking.TermsData.Suppliers.join('|'), (scope.cm.booking.TermsData.TransferRateId || '')].join('/');\r\n // Supplier Terms\r\n var sup = '';\r\n angular.forEach(scope.cm.booking.TermsData.Suppliers, function (s) {\r\n sup += \"&suppliers=\" + s;\r\n });\r\n var termsUrl = String.format('partials/terms/provider?cultureCode={0}&bookingProcessId={1}{2}&transferRateId={3}', domain.CultureCode, scope.cm.booking.BookingProcessId, sup, scope.cm.booking.TermsData.TransferRateId || '');\r\n $('a.bookingTerms', el).attr('href', route).attr('target', '_blank');\r\n $('a.bookingTerms', el).bind('click', function (e) {\r\n attachLightbox(e, termsUrl);\r\n });\r\n if (scope.cm.flight) {\r\n $('a.showFareRules', el).bind('click', function (e) {\r\n var fareRulesText = _.get(scope.cm.flight, 'Details.SupplierFareRules', '');\r\n attachLightbox(e, 'partials/popups/farerules', fareRulesText);\r\n });\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('accordionDirective', function () {\r\n return {\r\n scope: true,\r\n link: function ($scope) {\r\n $scope.accordion = { show: false };\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('agentAutofill', AgentAutofill);\r\n function AgentAutofill(agentModeService, resourceService) {\r\n return {\r\n restrict: 'E',\r\n require: '?ngModel',\r\n scope: {\r\n booking: '='\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return \"partials/booking/template?name=Agent/AgentAutofillDirective&version=\" + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=AgentAutofillDirective';\r\n },\r\n link: linker\r\n };\r\n function linker(scope) {\r\n scope.lookup = lookup;\r\n function lookup(bookingId) {\r\n scope.errorMessage = undefined;\r\n agentModeService.getBookingContact(bookingId)\r\n .then(fillInformations, handleErrors);\r\n }\r\n function fillInformations(bookingInfo) {\r\n if (TRPCONFIG.Domain.AutofillBasicContactInfo) {\r\n //agent mode for dnata agents needs only the following keys to be auto populated\r\n var basicInfoKeys = ['Title', 'FirstName', 'LastName', 'CountryCode'];\r\n fillBasicInformations(bookingInfo, basicInfoKeys);\r\n return;\r\n }\r\n fillBasicInformations(bookingInfo, Object.keys(scope.booking));\r\n }\r\n function fillBasicInformations(bookingInfo, keys) {\r\n keys.forEach(function (key) {\r\n if (bookingInfo[key]) {\r\n scope.booking[key] = bookingInfo[key];\r\n }\r\n });\r\n }\r\n function handleErrors(res) {\r\n switch (res.status) {\r\n case 400:\r\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDINVALID');\r\n break;\r\n case 404:\r\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDNOTFOUND');\r\n break;\r\n default:\r\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDERROR');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var BoardTypeFilter = /** @class */ (function () {\r\n function BoardTypeFilter($scope, resourceService, occupancyService) {\r\n var _this = this;\r\n var titles = {\r\n 1: resourceService.get('ROOMONLY'),\r\n 2: resourceService.get('BEDANDBREAKFAST'),\r\n 3: resourceService.get('HALFBOARD'),\r\n 4: resourceService.get('FULLBOARD'),\r\n 5: resourceService.get('ALLINCLUSIVE'),\r\n 6: resourceService.get('SELFCATERING')\r\n };\r\n $scope.$watch('bt.aggregate', function (agg) {\r\n if (!agg) {\r\n return;\r\n }\r\n var boardArr = [];\r\n for (var key in agg) {\r\n boardArr.push(_.extend(agg[key], { id: key, title: titles[key] }));\r\n }\r\n _.set(_.minBy(boardArr, function (v) { return v.MinPrice; }), 'cheapest', true);\r\n _this.boardArr = boardArr;\r\n _this.people = occupancyService.getNumberOfNonInfantPassengers();\r\n });\r\n }\r\n BoardTypeFilter.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n BoardTypeFilter.prototype.reset = function () {\r\n this.model = [];\r\n };\r\n BoardTypeFilter.prototype.more = function (all) {\r\n this.showAll = all;\r\n };\r\n BoardTypeFilter.prototype.showMoreLess = function () {\r\n return Object.keys(this.aggregate || {}).length > this.limit;\r\n };\r\n return BoardTypeFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('boardTypeFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=BoardTypeFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n limit: '@',\r\n priceMode: '='\r\n },\r\n controller: BoardTypeFilter,\r\n controllerAs: 'bt'\r\n };\r\n });\r\n var BoardTypeFilterLabel = /** @class */ (function () {\r\n function BoardTypeFilterLabel($scope, resourceService, analytics) {\r\n var _this = this;\r\n this.titles = {\r\n 1: resourceService.get('ROOMONLY'),\r\n 2: resourceService.get('BEDANDBREAKFAST'),\r\n 3: resourceService.get('HALFBOARD'),\r\n 4: resourceService.get('FULLBOARD'),\r\n 5: resourceService.get('ALLINCLUSIVE'),\r\n 6: resourceService.get('SELFCATERING')\r\n };\r\n $scope.$watch('bt.model', function (value) {\r\n if (!value || !value.length) {\r\n return;\r\n }\r\n var boardType = value.map(function (v) { return _this.getName(v); });\r\n analytics.track('mixpanel', 'HolidayDealsFilterBoardTypes', { value: boardType });\r\n });\r\n }\r\n BoardTypeFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{bt.getName(board)}} \\n \\n \\n \";\r\n };\r\n BoardTypeFilterLabel.prototype.getName = function (board) {\r\n return this.titles[board];\r\n };\r\n BoardTypeFilterLabel.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n BoardTypeFilterLabel.prototype.remove = function (board) {\r\n this.model = this.model.filter(function (v) { return v !== board; });\r\n };\r\n return BoardTypeFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('boardTypeFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: BoardTypeFilterLabel.getTemplate(),\r\n bindToController: {\r\n model: '='\r\n },\r\n controller: BoardTypeFilterLabel,\r\n controllerAs: 'bt'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var ChildDestinationFilter = /** @class */ (function () {\r\n function ChildDestinationFilter($scope, occupancyService) {\r\n var _this = this;\r\n $scope.$watch('cd.aggregate', function (agg) {\r\n if (!agg) {\r\n return;\r\n }\r\n var destArray = [];\r\n for (var key in agg) {\r\n destArray.push(_.extend(agg[key], { id: key }));\r\n }\r\n var min = _.minBy(destArray, function (v) { return v.MinPrice; });\r\n if (min) {\r\n min.cheapest = true;\r\n }\r\n _this.model = _.filter(_this.model, function (d) { return _.has(agg, d); });\r\n _this.destArray = destArray;\r\n _this.people = occupancyService.getNumberOfNonInfantPassengers();\r\n });\r\n }\r\n ChildDestinationFilter.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n ChildDestinationFilter.prototype.reset = function () {\r\n this.model = [];\r\n };\r\n ChildDestinationFilter.prototype.more = function (all) {\r\n this.showAll = all;\r\n };\r\n ChildDestinationFilter.prototype.showMoreLess = function () {\r\n return Object.keys(this.aggregate || {}).length > this.limit;\r\n };\r\n return ChildDestinationFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('childDestinationFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=ChildDestinationFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n limit: '@',\r\n priceMode: '='\r\n },\r\n controller: ChildDestinationFilter,\r\n controllerAs: 'cd'\r\n };\r\n });\r\n var ChildDestinationFilterLabel = /** @class */ (function () {\r\n function ChildDestinationFilterLabel($scope, analytics) {\r\n var _this = this;\r\n $scope.$watch('cd.model', function (value) {\r\n if (!value || !value.length) {\r\n return;\r\n }\r\n var destinations = value.map(function (v) { return _this.getName(v); });\r\n analytics.track('mixpanel', 'HolidayDealsFilterDestinations', { value: destinations });\r\n });\r\n }\r\n ChildDestinationFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{cd.getName(dest)}} \\n \\n \\n \";\r\n };\r\n ChildDestinationFilterLabel.prototype.getName = function (dest) {\r\n if (!this.aggregate) {\r\n return '';\r\n }\r\n return (this.aggregate[dest] || {}).Title;\r\n };\r\n ChildDestinationFilterLabel.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n ChildDestinationFilterLabel.prototype.remove = function (dest) {\r\n this.model = this.model.filter(function (v) { return v !== dest; });\r\n };\r\n return ChildDestinationFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('childDestinationFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: ChildDestinationFilterLabel.getTemplate(),\r\n bindToController: {\r\n aggregate: '=',\r\n model: '='\r\n },\r\n controller: ChildDestinationFilterLabel,\r\n controllerAs: 'cd'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nangular\r\n .module('TR')\r\n .directive('chooseDifferentHotel', function ($location) {\r\n return {\r\n scope: {\r\n changeHotel: '&?',\r\n dest: '=?'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=ChooseDifferentHotel',\r\n link: function (scope) {\r\n scope.handleChangeHotel = function () {\r\n if (scope.changeHotel) {\r\n scope.changeHotel();\r\n }\r\n else {\r\n var breadcrumbTrail = _.get(scope, ['dest', 'BreadcrumbTrail'], []);\r\n $location.url(_.get(_.nth(breadcrumbTrail, -2), 'PagePath', '/'));\r\n }\r\n };\r\n },\r\n restrict: 'E',\r\n replace: true,\r\n };\r\n});\r\nvar TR;\r\n(function (TR) {\r\n var ClickTripz = /** @class */ (function () {\r\n function ClickTripz($routeParams, tripService, loaderService) {\r\n this.$routeParams = $routeParams;\r\n this.tripService = tripService;\r\n this.loaderService = loaderService;\r\n if ($routeParams.tripId\r\n && _.includes(TRPCONFIG.Domain.ClickTripzProviders, $routeParams.source)\r\n && !window.document.getElementById('click-tripz')) {\r\n tripService.getTripNumberOfNights(0, $routeParams.tripId).then(function (numberOfNights) {\r\n if (_.includes(TRPCONFIG.Domain.ClickTripzNumberOfNights, numberOfNights)) {\r\n loaderService.loadJS(window.document, 'script', 'click-tripz', TRPCONFIG.Domain.ClickTripzURL);\r\n }\r\n });\r\n }\r\n }\r\n return ClickTripz;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('clickTripz', function () {\r\n return {\r\n controller: ClickTripz,\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var CruiseListing = /** @class */ (function () {\r\n function CruiseListing(analytics) {\r\n this.analytics = analytics;\r\n }\r\n CruiseListing.prototype.gotToCruise = function (url) {\r\n this._trackClick();\r\n window.open(url);\r\n };\r\n CruiseListing.prototype._trackClick = function () {\r\n this.analytics.track('mixpanel', 'HolidayDealsCruiseDetails', {\r\n Title: this.cruise.Title,\r\n ShipName: this.cruise.ShipName,\r\n LineName: this.cruise.CruiseLineName\r\n });\r\n };\r\n return CruiseListing;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('cruiseListing', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=CruiseListing',\r\n replace: true,\r\n bindToController: {\r\n cruise: '=',\r\n priceMode: '=',\r\n },\r\n controller: CruiseListing,\r\n controllerAs: 'cl'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var DirectPaymentInformation = /** @class */ (function () {\r\n function DirectPaymentInformation($filter, resourceService, $scope) {\r\n this.$filter = $filter;\r\n this.resourceService = resourceService;\r\n this.$scope = $scope;\r\n this.keyMap = {};\r\n //decide which resource keys we want to push in to our object based on the footnote scope value\r\n var m = {\r\n conversion: '',\r\n noConversion: ''\r\n };\r\n if (this.hasFootnote === 'true') {\r\n m.conversion = 'DIRECTPAYMENTTOHOTELCONVERTED';\r\n m.noConversion = 'DIRECTPAYMENTTOHOTEL';\r\n }\r\n else {\r\n m.conversion = 'DIRECTPAYMENTTOHOTELCONVERTEDNONOTE';\r\n m.noConversion = 'DIRECTPAYMENTTOHOTELNONOTE';\r\n }\r\n this.keyMap[0] = m; //add the keys for hotels to the map\r\n }\r\n DirectPaymentInformation.prototype.directPaymentCaveat = function (product, payment) {\r\n var res = product.productType === 0 ? 'DIRECTACCOMPAYMENTADVICE' : 'DIRECTFLIGHTPAYMENTADVICE';\r\n if (payment.localCurrency === payment.currency) {\r\n return String.format(this.resourceService.get(res), this.$filter('customCurrency')(payment.amount, payment.currency));\r\n }\r\n return String.format(this.resourceService.get(res), this.$filter('customCurrency')(payment.localAmount, payment.localCurrency) + \" \\n \" + String.format(this.resourceService.get('CUSTOMEREQUIVALENT'), this.$filter('customCurrency')(payment.amount, payment.currency)));\r\n };\r\n DirectPaymentInformation.prototype.getText = function (productType, payment) {\r\n var paymentAmount = this.$filter('customCurrency')(payment.amount, payment.currency);\r\n var resource = this.keyMap[productType];\r\n if (productType === 0) {\r\n if (payment.localCurrency === payment.currency) {\r\n return String.format(this.resourceService.get(resource.noConversion), paymentAmount);\r\n }\r\n else {\r\n return String.format(this.resourceService.get(resource.conversion), this.$filter('customCurrency')(payment.localAmount, payment.localCurrency), paymentAmount);\r\n }\r\n }\r\n return '';\r\n };\r\n return DirectPaymentInformation;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('directPaymentInformation', function () {\r\n return {\r\n scope: {\r\n hasFootnote: '@',\r\n paymentData: '=',\r\n showDirectPayments: '='\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=DirectPaymentInformation&version=' + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=DirectPaymentInformation';\r\n },\r\n bindToController: true,\r\n controller: DirectPaymentInformation,\r\n controllerAs: 'dpi',\r\n replace: true\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var FacilitiesFilter = /** @class */ (function () {\r\n function FacilitiesFilter($scope, occupancyService) {\r\n var _this = this;\r\n this.limits = {};\r\n this.showPrice = {};\r\n $scope.$watch('ff.aggregate', function (agg) {\r\n if (!agg) {\r\n return;\r\n }\r\n _this.people = occupancyService.getNumberOfNonInfantPassengers();\r\n var groupArray = [];\r\n for (var group in agg) {\r\n var elementArray = [];\r\n if (group === 'Facilities') {\r\n _this.limits[group] = parseInt(_this.facLimit, 10);\r\n _this.showPrice[group] = false;\r\n }\r\n else {\r\n _this.limits[group] = parseInt(_this.htLimit, 10);\r\n _this.showPrice[group] = true;\r\n }\r\n for (var key in agg[group]) {\r\n elementArray.push(_.extend(agg[group][key], { id: key }));\r\n }\r\n _.minBy(elementArray, function (v) { return v.MinPrice; }).cheapest = true;\r\n groupArray.push({ title: group, elements: _.clone(elementArray) });\r\n }\r\n _this.groupArray = groupArray;\r\n });\r\n this.showAll = {};\r\n }\r\n FacilitiesFilter.prototype.isSet = function (group) {\r\n if (!this.aggregate[group] || !this.model) {\r\n return;\r\n }\r\n var keys = Object.keys(this.aggregate[group]);\r\n return _.intersection(this.model, keys).length > 0;\r\n };\r\n FacilitiesFilter.prototype.reset = function (group) {\r\n var keys = Object.keys(this.aggregate[group]);\r\n this.model = _.difference(this.model, keys);\r\n };\r\n FacilitiesFilter.prototype.more = function (group, all) {\r\n this.showAll[group] = all;\r\n };\r\n FacilitiesFilter.prototype.showMoreLess = function (group) {\r\n return Object.keys(this.aggregate[group] || {}).length > this.limits[group];\r\n };\r\n return FacilitiesFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('facilitiesFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=FacilitiesFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n facLimit: '@',\r\n htLimit: '@',\r\n priceMode: '='\r\n },\r\n controller: FacilitiesFilter,\r\n controllerAs: 'ff'\r\n };\r\n });\r\n var FacilitiesFilterLabel = /** @class */ (function () {\r\n function FacilitiesFilterLabel($scope, analytics) {\r\n var _this = this;\r\n $scope.$watch('ff.model', function (value) {\r\n if (!value || !value.length) {\r\n return;\r\n }\r\n var grouped = _this._getNameGrouped(value);\r\n for (var group in grouped) {\r\n analytics.track('mixpanel', \"HolidayDealsFilter\" + group.replace(' ', ''), { value: grouped[group] });\r\n }\r\n });\r\n }\r\n FacilitiesFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{ff.getName(item)}} \\n \\n \\n \";\r\n };\r\n FacilitiesFilterLabel.prototype.getName = function (item) {\r\n if (!this.aggregate) {\r\n return '';\r\n }\r\n for (var group in this.aggregate) {\r\n var filter = this.aggregate[group][item];\r\n if (filter) {\r\n return filter.Title;\r\n }\r\n }\r\n };\r\n FacilitiesFilterLabel.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n FacilitiesFilterLabel.prototype.remove = function (dest) {\r\n this.model = this.model.filter(function (v) { return v !== dest; });\r\n };\r\n FacilitiesFilterLabel.prototype._getNameGrouped = function (filter) {\r\n if (!this.aggregate) {\r\n return '';\r\n }\r\n var grouped = {};\r\n for (var i = 0, ii = filter.length; i < ii; i++) {\r\n var filterValue = filter[i];\r\n for (var group in this.aggregate) {\r\n var item = this.aggregate[group][filterValue];\r\n if (item) {\r\n if (!grouped[group]) {\r\n grouped[group] = [];\r\n }\r\n grouped[group].push(item.Title);\r\n }\r\n }\r\n }\r\n return grouped;\r\n };\r\n return FacilitiesFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('facilitiesFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: FacilitiesFilterLabel.getTemplate(),\r\n bindToController: {\r\n aggregate: '=',\r\n model: '='\r\n },\r\n controller: FacilitiesFilterLabel,\r\n controllerAs: 'ff'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n /*\r\n Imports value from a remote field when it updates, if this form is `$pristine`.\r\n If the remote field is a select field, only option `label` matches are accepted.\r\n \r\n Example HTML:\r\n \r\n */\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('fieldImport', function () {\r\n // Deregister all instances\r\n var allowInit = true;\r\n var deregisterFns = [];\r\n var deregisterAll = function () {\r\n if (deregisterFns) {\r\n allowInit = false;\r\n deregisterFns.forEach(function (fn) { return fn(); });\r\n deregisterFns = null; // Clear memory\r\n }\r\n };\r\n return {\r\n restrict: 'A',\r\n require: '^form',\r\n scope: {\r\n ngModel: '=',\r\n fieldImport: '&'\r\n },\r\n link: function (scope, el, attr, formCtrl) {\r\n var remoteField = scope.fieldImport();\r\n // `remoteField` may be `false` if attribute contains a condition\r\n if (allowInit && typeof remoteField === 'object') {\r\n init();\r\n }\r\n // Initialise\r\n function init() {\r\n // If fields were autofilled, form is still `$pristine` so check value\r\n if (scope.ngModel) {\r\n deregisterAll();\r\n }\r\n else {\r\n // Set listeners\r\n deregisterFns.push(scope.$watch(function () { return remoteField.$modelValue; }, updateField));\r\n scope.$on('$destroy', deregisterAll);\r\n }\r\n }\r\n // Populate this field\r\n function updateField(val) {\r\n var submittedForm = false;\r\n var lastParent = formCtrl;\r\n while (!submittedForm && lastParent) {\r\n submittedForm = lastParent.$submitted;\r\n lastParent = lastParent.$$parentForm;\r\n }\r\n // If form was changed by user\r\n if (!formCtrl.$pristine || submittedForm) {\r\n deregisterAll();\r\n }\r\n else {\r\n // Set any falsy value to `undefined` to clear field\r\n if (!val) {\r\n val = undefined;\r\n }\r\n // For a select, only allow label matches (case insensitive)\r\n if (val && el.is('select')) {\r\n val = enforceMatch(\r\n // i.e. [\"--\", \"Mr\", \"Mrs\", \"Miss\", \"Ms\", \"Dr\"]\r\n $.map(el.find('option'), function (op) { return op.label; }), val);\r\n }\r\n // Set field value\r\n scope.ngModel = val;\r\n formCtrl.$setPristine(); // Only user edits will make '$pristine' false\r\n }\r\n }\r\n // Restrict value to specified strings\r\n function enforceMatch(allowedVals, val) {\r\n var i = allowedVals.length;\r\n while (i--) {\r\n var allowedStr = allowedVals[i];\r\n if (val.toLowerCase() === allowedStr.toLowerCase()) {\r\n return allowedStr;\r\n }\r\n }\r\n // `val` not found, clear field\r\n return undefined;\r\n }\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var FiltersBox = /** @class */ (function () {\r\n function FiltersBox($scope, broker, filtering) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.filtering = filtering;\r\n $scope.$watch('fi.filters', function (f) { return _this.updateFilters(f); }, true);\r\n this.enabledFilters = [];\r\n }\r\n FiltersBox.prototype.updateFilters = function (filters) {\r\n if (!filters) {\r\n return;\r\n }\r\n var position = $('body').scrollTop();\r\n var listener = this.$scope.$on('$locationChangeSuccess', function () {\r\n $('body').scrollTop(position);\r\n listener();\r\n });\r\n this.enabledFilters = Object.keys(filters);\r\n if (this.filtering.serialiseFilters(filters)) {\r\n return this.broker.publish('REFRESHSEARCH');\r\n }\r\n };\r\n FiltersBox.prototype.showFilter = function (name) {\r\n return this.enabledFilters.indexOf(name) > -1;\r\n };\r\n FiltersBox.prototype.apply = function () {\r\n return this.show = false;\r\n };\r\n return FiltersBox;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('filtersBox', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=FiltersBox',\r\n bindToController: {\r\n aggregates: '=',\r\n filters: '=',\r\n priceMode: '=',\r\n show: '='\r\n },\r\n controller: FiltersBox,\r\n controllerAs: 'fi'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var FiltersLabels = /** @class */ (function () {\r\n function FiltersLabels() {\r\n }\r\n return FiltersLabels;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('filtersLabels', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=FiltersLabels',\r\n replace: true,\r\n bindToController: {\r\n filters: '=',\r\n aggregates: '=',\r\n priceMode: '='\r\n },\r\n controller: FiltersLabels,\r\n controllerAs: 'fl'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('formSubmit', function ($rootScope, scrollService, $timeout, analytics, $routeParams, tripService, resourceService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n isDisabled: '=',\r\n inputClass: '@',\r\n form: '=',\r\n click: '&',\r\n model: '=',\r\n label: '@',\r\n scroll: '=',\r\n preFlight: '&',\r\n templateVersion: '='\r\n },\r\n templateUrl: function (element, attr) { return attr.templateVersion ?\r\n \"partials/booking/template?name=FormSubmit&version=\" + attr.templateVersion :\r\n 'partials/home/directivetemplate?type=FormSubmit'; },\r\n link: function (scope, element, attrs) {\r\n var noClass = (scope.inputClass || '').replace(/ /g, '').length <= 0;\r\n scope.buttonClass = noClass ? 'button primary' : scope.inputClass;\r\n function onClick(event) {\r\n $rootScope.submittedForm = null;\r\n if (!scope.form.$valid) {\r\n $rootScope.submittedForm = scope.form;\r\n $rootScope.$broadcast('form:submitted-invalid', scope.form);\r\n //wrap in timeout to allow time for address search field to reveal itself\r\n $timeout(function () {\r\n var form = $(element).parents('form');\r\n var selectors = '.tokenising-field.ng-invalid:visible,' +\r\n '.dob-picker.ng-invalid select:visible,' +\r\n 'input.ng-invalid:visible,' +\r\n 'select.ng-invalid:visible,' +\r\n 'div.ng-invalid .driver-type-select:visible,' +\r\n 'div.checkbox-btn.ng-invalid:visible,' +\r\n 'label.checkbox-btn.ng-invalid:visible,' +\r\n '.pseudo-input.ng-invalid:visible,' +\r\n 'textarea.ng-invalid:visible,' +\r\n 'date-picker.ng-invalid .hasDatepicker:visible,' +\r\n 'div.ng-invalid input:visible';\r\n //check if we have a closer isolated ng-form, if so pick the next element\r\n var target = null;\r\n var elements = $(selectors, form);\r\n if (form.length > 0) {\r\n _.each(elements, function (i) {\r\n var ngForm = $(i).closest('ng-form')[0] || null;\r\n if (!ngForm || !$(ngForm).hasClass('isolated-form')) {\r\n target = $(i);\r\n return false;\r\n }\r\n });\r\n }\r\n else {\r\n target = $(selectors).first();\r\n }\r\n if (scope.scroll) {\r\n scrollService.scrollTo(target, { animate: true, offset: 100 })\r\n .then(function () { return target.focus(); });\r\n }\r\n else {\r\n target.focus();\r\n }\r\n });\r\n setTimeout(function () { return analytics.track('mixpanel', 'FormValidation', { form: scope.form }); });\r\n return;\r\n }\r\n scope.click({ model: scope.model, event: event });\r\n }\r\n scope.$click = function (event) {\r\n var res = scope.preFlight && scope.preFlight();\r\n if (res) {\r\n scope.disabled = true;\r\n res.then(function () { return $timeout(function () {\r\n scope.disabled = false;\r\n onClick(event);\r\n }); }).catch(function () { return scope.disabled = false; });\r\n }\r\n else {\r\n onClick(event);\r\n }\r\n };\r\n if (attrs.templateVersion) {\r\n tripService.getTrip($routeParams.tripId)\r\n .then(function (trip) {\r\n var tripType = _.findKey(tripService.tripTypes, function (o) { return o === trip.TripType; });\r\n tripType = (tripType || '').toUpperCase();\r\n scope.labelForJourney = resourceService.get(\"FORMSUBMITBUTTON_TRIPTYPE_\" + tripType);\r\n })\r\n .catch(angular.noop)\r\n .then(function () {\r\n if (!scope.labelForJourney || scope.labelForJourney.indexOf('FORMSUBMITBUTTON') > -1) {\r\n scope.labelForJourney = resourceService.get('FORMSUBMITBUTTON_TRIPTYPE_NONE');\r\n }\r\n });\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('hiddenContent', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n open: '@',\r\n showMoreText: '@',\r\n showLessText: '@',\r\n hideable: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=HiddenContent',\r\n link: function (scope) {\r\n scope.more = function (e) {\r\n e.preventDefault();\r\n scope.showMore = true;\r\n };\r\n scope.less = function (e) {\r\n e.preventDefault();\r\n scope.showMore = false;\r\n };\r\n scope.showMore = scope.open === 'true';\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('hideMenuBar', function ($location, $window) {\r\n return {\r\n restrict: 'A',\r\n scope: '=',\r\n compile: function ($elem) {\r\n if (window.TRPCONFIG.Domain2.ShowMinimalHeader) {\r\n return;\r\n }\r\n var elem = $elem[0];\r\n var isMatchedPath = function () {\r\n var regEx = /.*\\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[0-9a-fA-F]{0,1}[/]*?/;\r\n var abtesttUrl = ($location.$$path.match(regEx) || $location.$$path.match(/attractions[/].*/));\r\n var abtesttUrlMatched = abtesttUrl && abtesttUrl.input;\r\n return abtesttUrlMatched;\r\n };\r\n if (isMatchedPath()) {\r\n elem.classList.add('u-hidden');\r\n }\r\n else {\r\n elem.classList.remove('u-hidden');\r\n }\r\n return function postLink($scope, $el) {\r\n var el = $el[0];\r\n var hideMenu = function () {\r\n var elClassList = el.classList;\r\n var menuBarEl = elClassList.contains('sc-c-menubar');\r\n var headerEl = el.closest('.sc-c-masthead');\r\n var headerNextElementSiblingEl = headerEl && headerEl.nextElementSibling;\r\n var mastHeadMainEl = headerEl && headerEl.querySelector('.sc-c-masthead__main');\r\n var hasShadowClass = mastHeadMainEl && mastHeadMainEl.classList.contains('sc-c-masthead__main--box-shadow');\r\n var hasHiddenMenuClass = headerNextElementSiblingEl && headerNextElementSiblingEl.classList.contains('sc-c-main--hidden');\r\n var hasHiddenClass = elClassList.contains('u-hidden');\r\n var mastHeadMainElClassList = mastHeadMainEl.classList;\r\n var headerNextElementSiblingElClassList = headerNextElementSiblingEl.classList;\r\n var mastHeadCss = 'sc-c-masthead__main--box-shadow';\r\n var menuBarCss = 'sc-c-main--hidden';\r\n if (isMatchedPath()) {\r\n if (!hasShadowClass) {\r\n mastHeadMainElClassList.add(mastHeadCss);\r\n }\r\n if (!hasHiddenMenuClass) {\r\n headerNextElementSiblingElClassList.add(menuBarCss);\r\n }\r\n if (menuBarEl && !hasHiddenClass) {\r\n elClassList.add('u-hidden');\r\n }\r\n }\r\n else {\r\n if (hasShadowClass) {\r\n mastHeadMainElClassList.remove(mastHeadCss);\r\n }\r\n if (hasHiddenMenuClass) {\r\n headerNextElementSiblingElClassList.remove(menuBarCss);\r\n }\r\n if (menuBarEl && hasHiddenClass) {\r\n elClassList.remove('u-hidden');\r\n }\r\n }\r\n };\r\n var initHideMenu = function () {\r\n if (window.TRPCONFIG.Domain2.HideMinimalHeader) {\r\n hideMenu();\r\n }\r\n };\r\n $scope.$on('$routeChangeStart', function () {\r\n initHideMenu();\r\n });\r\n $scope.$on('$routeChangeSuccess', function () {\r\n initHideMenu();\r\n });\r\n $window.onload = function () {\r\n initHideMenu();\r\n };\r\n /*eslint-disable */\r\n window._vwo_evq = window._vwo_evq || [];\r\n window._vwo_evq.push = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n /*eslint-enable */\r\n var eventData = args[0];\r\n if (eventData[1] === '303') {\r\n initHideMenu();\r\n }\r\n };\r\n };\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var HolidayDealPromoListing = /** @class */ (function () {\r\n function HolidayDealPromoListing($element, $scope, $sce, $location, broker, resourceService) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.broker = broker;\r\n this.resourceService = resourceService;\r\n this.$overlay = $element.find('.holiday-deal-promo-listing .click-overlay');\r\n this.$iconOverlay = $element.find('.holiday-deal-promo-listing .icon-overlay');\r\n this.getLabel = function (label) {\r\n var res = resourceService.get(label);\r\n $sce.trustAsHtml(label);\r\n return res;\r\n };\r\n this.broker.subscribe(\"PROMO_\" + this.type + \"_\" + this.index, 'PROMO_OVERLAY', function (_a) {\r\n var data = _a.data;\r\n if (_this.group !== data.group) {\r\n return;\r\n }\r\n if (_this.name !== data.name) {\r\n _this.$location.search(_this.name, null);\r\n }\r\n if (_this.value !== data.value) {\r\n _this._toggleOverlay(false);\r\n }\r\n });\r\n $scope.$watch('hpl.value', function (v) {\r\n if (!v) {\r\n return;\r\n }\r\n var params = _this.$location.search();\r\n _this._toggleOverlay(params[_this.name] === v);\r\n });\r\n $scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('holidayDealsPromoController', \"PROMO_\" + _this.type + \"_\" + _this.index);\r\n });\r\n }\r\n HolidayDealPromoListing.prototype.select = function () {\r\n this.broker.publish('PROMO_OVERLAY', {\r\n name: this.name,\r\n group: this.group,\r\n value: this.value,\r\n type: this.type || this.getLabel(this.label)\r\n });\r\n var params = this.$location.search();\r\n var isAlreadySelected = params[this.name] === this.value;\r\n if (isAlreadySelected) {\r\n return;\r\n }\r\n this.$location.search(this.name, this.value);\r\n this._toggleOverlay(true);\r\n };\r\n HolidayDealPromoListing.prototype._toggleOverlay = function (show) {\r\n if (show) {\r\n this.$overlay.fadeIn(200);\r\n this.$iconOverlay.fadeIn(200);\r\n return;\r\n }\r\n this.$overlay.fadeOut(200);\r\n this.$iconOverlay.fadeOut(200);\r\n };\r\n return HolidayDealPromoListing;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('holidayDealPromoListing', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=HolidayDealPromoListing',\r\n bindToController: {\r\n label: '@',\r\n img: '@',\r\n name: '@',\r\n value: '=',\r\n group: '@',\r\n type: '@',\r\n index: '@'\r\n },\r\n controller: HolidayDealPromoListing,\r\n controllerAs: 'hpl'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var HotelReviewsBrowser = /** @class */ (function () {\r\n function HotelReviewsBrowser($scope, broker, pagingService, reviewService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.pagingService = pagingService;\r\n this.reviewService = reviewService;\r\n this.broker.subscribe('hotelReviewsBrowser', 'SHOWREVIEWS', this.showReviews.bind(this));\r\n this.pageReviews = function (page) { return _this.getReviews(_this.selectedHotel, page); };\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('hotelReviewsBrowser');\r\n });\r\n }\r\n HotelReviewsBrowser.prototype.showReviews = function (e, page) {\r\n if (page === void 0) { page = 1; }\r\n this.selectedHotel = e.data.hotel;\r\n this.reviewPaging = this.pagingService.data(1, 10, this.selectedHotel.CustomerRatingCount);\r\n this.getReviews(e.data.hotel, page);\r\n };\r\n HotelReviewsBrowser.prototype.getReviews = function (hotel, page) {\r\n var _this = this;\r\n if (this.reviewPaging.page === 1) {\r\n this.loadingFirstReviews = true;\r\n }\r\n this.reviewsShowing = true;\r\n return this.reviewService.getReviews(this.selectedHotel, this.reviewPaging.page - 1)\r\n .then(function (res) {\r\n _this.reviews = res.reviews;\r\n _this.loadingFirstReviews = false;\r\n _this.reviewPaging = _this.pagingService.data(_this.reviewPaging.page, 10, _this.selectedHotel.CustomerRatingCount);\r\n });\r\n };\r\n return HotelReviewsBrowser;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('hotelReviewsBrowser', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=HotelReviewBrowser',\r\n bindToController: {},\r\n controller: HotelReviewsBrowser,\r\n controllerAs: 'cm'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('hotelStats', HotelStats);\r\n function HotelStats(arrayUtil, urgencyMessaging, toaster) {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: {\r\n model: '='\r\n },\r\n template: '
',\r\n link: function (scope) {\r\n if (TRPCONFIG.Domain.UrgencyMessaging) {\r\n urgencyMessaging.get(scope.model).then(function (stats) {\r\n if (stats != null) {\r\n var msgs = arrayUtil.filter([stats.CurrentViewsText, stats.LastBookedDateText], function (msg) {\r\n return msg != null;\r\n });\r\n angular.forEach(msgs, function (msg) {\r\n toaster.pop('info', msg);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('imageGallery', function (imageService, $timeout) {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: {\r\n model: '=',\r\n enableReviews: '@',\r\n showReviews: '&'\r\n },\r\n templateUrl: 'partials/hotels/imagegallery',\r\n link: function (scope, el, attrs) {\r\n scope.isPrerender = /prerender/i.test(navigator.userAgent);\r\n //need to do this as type of the original property gets changed back to text later (by angular we suspect)\r\n scope.reviewsEnabled = scope.enableReviews === 'true' && TRPCONFIG.Domain.ReviewsEnabled;\r\n scope.images = [];\r\n var itemCarousel = el.find('.large-gallery');\r\n var thumbCarousel = el.find('.thumb-list');\r\n var thumbH = 68;\r\n var thumbW = 68;\r\n var mainH = 480;\r\n var mainW = 870;\r\n var cms = attrs.cms === 'true';\r\n var cancel = scope.$watch('model', function (v) {\r\n if (!v) {\r\n return;\r\n }\r\n cancel();\r\n var cmsImageUrls = scope.model.CmsImageUrls;\r\n if (cms) {\r\n scope.images = v;\r\n }\r\n else if (cmsImageUrls) {\r\n _.forEach(cmsImageUrls, function (i) {\r\n scope.images.push({\r\n altText: '',\r\n thumbUrl: i,\r\n mainUrl: i,\r\n backgroundImage: { 'background-image': \"url('\" + i + \"')\" }\r\n });\r\n });\r\n }\r\n else {\r\n var model = scope.model;\r\n var _a = model.Title, Title = _a === void 0 ? '' : _a, _b = model.Location, Location_1 = _b === void 0 ? '' : _b, _c = model.Province, Province = _c === void 0 ? '' : _c, _d = model.Country, Country = _d === void 0 ? '' : _d;\r\n var altText = \"\" + Title + (Title && ', ') + Location_1 + (Location_1 && ', ') + Province + (Province && ', ') + Country + (Country && ', ');\r\n var NumberOfPhotos = scope.model.NumberOfPhotos;\r\n for (var i = 0; i < NumberOfPhotos; i++) {\r\n var thumbUrl = imageService.getImageUrl(scope.model.Id, thumbW, thumbH, i, true);\r\n var mainUrl = imageService.getImageUrl(scope.model.Id, mainW, mainH, i, false);\r\n scope.images.push({\r\n altText: \"\" + altText + (i + 1),\r\n thumbUrl: thumbUrl,\r\n mainUrl: mainUrl,\r\n backgroundImage: { 'background-image': \"url('\" + thumbUrl + \"')\" }\r\n });\r\n }\r\n }\r\n $timeout(initCarousel);\r\n });\r\n // checkWidths function has been added to solve an issue on the product card gallery whereby, when coming back from the Room page, the first product card image appears broken and doesn't load. This code get the initial styles and width on the first load and saves them for use later on in the fix.\r\n function checkWidths() {\r\n var hotelListings = document.querySelectorAll('.hotel-listing');\r\n var slickTrack = document.querySelectorAll('.gallery-slides .slick-track');\r\n var originalStylesArr = [];\r\n var originalImageWidthArr = [];\r\n if (slickTrack.length === hotelListings.length) {\r\n for (var i = 0; i < slickTrack.length; i++) {\r\n var style = slickTrack[i].getAttribute('style');\r\n var slickWidth = slickTrack[i].querySelectorAll('.slick-active img')[0].width;\r\n originalStylesArr.push(style);\r\n originalImageWidthArr.push(slickWidth);\r\n }\r\n var imgMaxWidth = Math.max.apply(Math, originalImageWidthArr);\r\n var slickActive = document.querySelectorAll('.gallery-slides .slick-track .slick-slide');\r\n if (!TRPCONFIG.Domain2.SlickTrackWidth) {\r\n TRPCONFIG.Domain2.SlickTrackWidth = originalStylesArr[0];\r\n }\r\n if (!TRPCONFIG.Domain2.SlickTrackImgWidth) {\r\n TRPCONFIG.Domain2.SlickTrackImgWidth = imgMaxWidth;\r\n }\r\n for (var i = 0; i < slickActive.length; i++) {\r\n var width = imgMaxWidth;\r\n if (width === 0) {\r\n width = TRPCONFIG.Domain2.SlickTrackImgWidth;\r\n }\r\n slickActive[i].style = \"width: \" + width + \"px\";\r\n }\r\n if (originalStylesArr[0] !== TRPCONFIG.Domain2.SlickTrackWidth) {\r\n slickTrack[0].style = TRPCONFIG.Domain2.SlickTrackWidth;\r\n }\r\n }\r\n }\r\n function initCarousel() {\r\n // slick is dumb and won't clone enough slides to fill the whole container\r\n // https://github.com/kenwheeler/slick/issues/1207\r\n var imgCount = scope.images.length;\r\n itemCarousel.slick({\r\n rtl: TRPCONFIG.Rtl,\r\n asNavFor: thumbCarousel,\r\n speed: 500,\r\n prevArrow: el.find('.stage .slick-prev'),\r\n nextArrow: el.find('.stage .slick-next'),\r\n infinite: imgCount > 5\r\n });\r\n itemCarousel.on('beforeChange', function (event, slick, currentSlide, nextSlide) {\r\n scope.selected = nextSlide;\r\n scope.$apply();\r\n });\r\n // we need to remove 1 slide so the infinite carousel looks infinite\r\n var minSlidesToShow = imgCount > 1 ? imgCount - 1 : imgCount;\r\n thumbCarousel.slick({\r\n rtl: TRPCONFIG.Rtl,\r\n asNavFor: itemCarousel,\r\n infinite: imgCount > 5,\r\n centerMode: true,\r\n focusOnSelect: true,\r\n slidesToShow: minSlidesToShow,\r\n swipeToSlide: true,\r\n variableWidth: true\r\n });\r\n scope.$on('$destroy', function () {\r\n itemCarousel.slick('unslick');\r\n thumbCarousel.slick('unslick');\r\n });\r\n checkWidths();\r\n window.addEventListener('resize', function () {\r\n TRPCONFIG.Domain2.SlickTrackWidth = '';\r\n TRPCONFIG.Domain2.SlickTrackImgWidth = '';\r\n checkWidths();\r\n });\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n/* this exists because we need to force angular to reload a route if it is clicked inside\r\n a link list. If left to its own devices it may not do the right thing because sometimes\r\n only the query string is different\r\n */\r\nangular\r\n .module('TR')\r\n .directive('linklist', function ($location, $route, $rootScope, urlUtils) {\r\n return {\r\n restrict: 'A',\r\n scope: {},\r\n link: function (scope, el) {\r\n function stripAndParse(url) {\r\n return urlUtils.parse(urlUtils.stripLeadingSlash(url));\r\n }\r\n var url = stripAndParse($location.path());\r\n $('a', el).click(function (e) {\r\n var linkPath = $(e.target).attr('href');\r\n var linkUrl = stripAndParse(linkPath);\r\n if (url.url === linkUrl.url) {\r\n $route.reload();\r\n }\r\n });\r\n scope.$on('$destroy', function () { return $('a', el).off(); });\r\n $rootScope.$on('$routeChangeSuccess', function () {\r\n url = stripAndParse($location.path());\r\n });\r\n }\r\n };\r\n});\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('newsletterBanner', function (currentUser, cookieService, $timeout) { return ({\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'partials/home/directivetemplate?type=newsletterbanner',\r\n controllerAs: 'nb',\r\n controller: function ($scope, $rootScope) {\r\n var _this = this;\r\n var key = 'trpNewsletterClose';\r\n var monthMs = 2592e6; // 30 days\r\n var tempTTL = monthMs * 3;\r\n var permTTL = monthMs * 120;\r\n var user = currentUser.get();\r\n var isSignedIn = user && user.HardSignedIn;\r\n this.if = false; // DOM inclusion\r\n this.hide = false; // CSS transition\r\n if (!isSignedIn) {\r\n // Get persisted timestamp (async)\r\n localforage.getItem(key, function (err, value) {\r\n var hideTs = value * 1; // Ensure is a number\r\n var cookies = cookieService.get('CookiesAccepted') || false;\r\n if (hideTs && (Date.now() > hideTs)) {\r\n localforage.removeItem(key);\r\n hideTs = null;\r\n }\r\n _this.hide = !cookies; // Hide if cookies never accepted\r\n _this.if = !hideTs;\r\n });\r\n }\r\n this.close = function (ttl) {\r\n if (ttl === void 0) { ttl = tempTTL; }\r\n localforage.setItem(key, Date.now() + ttl);\r\n _this.hide = true;\r\n $timeout(function () { return _this.if = false; }, 1000);\r\n };\r\n $rootScope.$on('cookiesAccepted', function () {\r\n _this.hide = false;\r\n });\r\n $scope.$on('newsletterSignUp', function () {\r\n // Display success message before hiding\r\n $timeout(function () {\r\n _this.close(permTTL);\r\n }, 1400);\r\n });\r\n }\r\n }); });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('occupancyDesktop', Occupancy);\r\n function Occupancy($timeout, $route, $document, arrayUtil, occupancyService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n maxRooms: '@',\r\n maxAge: '@',\r\n occupancy: '=',\r\n multiroomDisabled: '=',\r\n hideGroupBookingLink: '@',\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=OccupancyDesktop',\r\n link: _linker\r\n };\r\n function _linker(scope, el) {\r\n var area = scope.areaOverride || scope.$parent.areaOverride || $route.current.area;\r\n var limits = TRPCONFIG.Domain.OccupancyLimits[area];\r\n var wrapper = $('#occupancy-selectors', el);\r\n var inp = $('.input-occupancy', el);\r\n var timer;\r\n var initPos = function () {\r\n $timeout.cancel(timer);\r\n timer = $timeout(function () {\r\n wrapper.position({\r\n my: 'right top',\r\n of: el,\r\n at: 'right bottom',\r\n collision: 'fit'\r\n });\r\n }, 50);\r\n };\r\n scope.ages = arrayUtil.createRange(parseInt(scope.maxAge) || TRPCONFIG.Domain.MaximumChildAge, 0);\r\n scope.getAdultsLimit = _.memoize(getAdultsLimit);\r\n scope.getChildrenLimit = _.memoize(getChildrenLimit);\r\n scope.rooms = arrayUtil.createRange(scope.maxRooms || limits.maxRooms);\r\n scope.updateOccupancy = updateOccupancy;\r\n scope.showOccupancyWrapper = showOccupancyWrapper;\r\n scope.switchWrapper = switchWrapper;\r\n scope.changeRooms = changeRooms;\r\n scope.$watch('occupancy', function (val) {\r\n if (val == null) {\r\n return;\r\n }\r\n scope.occupancyString = scope.multiroomDisabled ?\r\n occupancyService.getOccupancyString() :\r\n occupancyService.getRoomOccupancyString();\r\n }, true);\r\n function getAdultsLimit(firstRoom) {\r\n return arrayUtil.createRange(firstRoom ? limits.maxAdults : 6);\r\n }\r\n function getChildrenLimit(firstRoom) {\r\n return arrayUtil.createRange(firstRoom ? limits.maxChildren : 5, 0);\r\n }\r\n function switchWrapper(value) {\r\n if (value) {\r\n initPos();\r\n }\r\n scope.showWrapper = value;\r\n }\r\n function showOccupancyWrapper(e) {\r\n initPos();\r\n scope.showWrapper = true;\r\n // Going to attach another click event which should not be fired\r\n // in the current event bubble\r\n e.stopPropagation();\r\n //this function must be declared locally to prevent it being hoisted to far,\r\n //and then removed from scope\r\n var _hideOccupancyWrapper = function _hideOccupancyWrapperFn(e) {\r\n var isChild = el.find(e.target).length > 0;\r\n if (!isChild) {\r\n scope.$apply(function () {\r\n scope.showWrapper = false;\r\n $document.off('click.occupancy', _hideOccupancyWrapper);\r\n });\r\n }\r\n };\r\n inp.on('keydown', function tab(e) {\r\n if (e.which === 9 || e.which === 27) {\r\n scope.$apply(function () {\r\n scope.showWrapper = false;\r\n });\r\n }\r\n });\r\n $document.on('click.occupancy', _hideOccupancyWrapper);\r\n }\r\n scope.$on('$destroy', function () {\r\n inp.off('keydown');\r\n $document.off('click.occupancy');\r\n });\r\n function changeRooms() {\r\n _.each(scope.occupancy, function (room, index) {\r\n // ensure we have not added a null room to the occupancy array\r\n room = room || {};\r\n room.ChildAges = room.ChildAges || [];\r\n room.Adults = room.Adults || 2;\r\n scope.occupancy[index] = room;\r\n });\r\n updateOccupancy(scope.occupancy);\r\n }\r\n function updateOccupancy(o) {\r\n occupancyService.setOccupancy(o, true);\r\n scope.occupancyString = scope.multiroomDisabled ?\r\n occupancyService.getOccupancyString() :\r\n occupancyService.getRoomOccupancyString();\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('openNewTab', function ($parse) {\r\n return {\r\n restrict: 'A',\r\n scope: '=',\r\n link: function ($scope, $el, $attr) {\r\n var fn = $parse($attr.openNewTab);\r\n var el = $el[0];\r\n function handleRightClick(event) {\r\n $scope.$apply(function () {\r\n if (typeof fn === 'function') {\r\n fn($scope, { $event: event });\r\n }\r\n });\r\n }\r\n el.addEventListener('contextmenu', handleRightClick);\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('pageTitle', function ($rootScope, resourceService) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, el, attr) {\r\n var defaultTitle = attr.pageTitle;\r\n var resources = {\r\n transfers: 'TRANSFERSHOMEPAGETITLE'\r\n };\r\n $rootScope.$on('$routeChangeStart', function (scope, next) {\r\n if (!next.landing) {\r\n var title = defaultTitle;\r\n var resource = resources[next.area];\r\n if (resource) {\r\n title = resourceService.get(resource);\r\n }\r\n document.title = title;\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var PriceFilter = /** @class */ (function () {\r\n function PriceFilter($scope, occupancyService, broker) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.occupancyService = occupancyService;\r\n $scope.$watch('pf.aggregate', this.setRange.bind(this), true);\r\n $scope.$watch('pf.model', function (m) {\r\n if (m === null) {\r\n _this.reset(undefined);\r\n }\r\n });\r\n broker.subscribe('priceFilter', 'RESETPRICE', this.reset.bind(this));\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('priceFilter');\r\n });\r\n }\r\n PriceFilter.prototype.setRange = function (a) {\r\n if (!a) {\r\n return;\r\n }\r\n if (_.get(this.model, 'Min') === 0) {\r\n this.model.Min = a.Min;\r\n }\r\n if (_.get(this.model, 'Max') === 0) {\r\n this.model.Max = a.Max;\r\n }\r\n this.range = this.model\r\n ? { Min: this.model.Min, Max: this.model.Max }\r\n : { Min: a.Min, Max: a.Max };\r\n this.people = this.occupancyService.getNumberOfNonInfantPassengers();\r\n };\r\n PriceFilter.prototype.updateModel = function () {\r\n // if model already in sync skip\r\n if (this.model &&\r\n ((this.model.Min === this.range.Min) && (this.model.Max === this.range.Max))) {\r\n return;\r\n }\r\n // if new value is the default one reset\r\n if (this.range.Min === this.aggregate.Min && this.range.Max === this.aggregate.Max) {\r\n return this.model = null;\r\n }\r\n return this.model = { Min: this.range.Min, Max: this.range.Max };\r\n };\r\n PriceFilter.prototype.isSet = function () {\r\n return !!this.model;\r\n };\r\n PriceFilter.prototype.reset = function (e) {\r\n if (e && e.data) {\r\n this.range[e.data] = this.aggregate[e.data];\r\n return this.model[e.data] = this.aggregate[e.data];\r\n }\r\n this.range = { Min: this.aggregate.Min, Max: this.aggregate.Max };\r\n this.model = null;\r\n };\r\n return PriceFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('priceFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=PriceFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n priceMode: '='\r\n },\r\n controller: PriceFilter,\r\n controllerAs: 'pf'\r\n };\r\n });\r\n var PriceFilterLabel = /** @class */ (function () {\r\n function PriceFilterLabel($scope, $filter, broker, analytics, occupancyService) {\r\n this.$filter = $filter;\r\n this.broker = broker;\r\n this.occupancyService = occupancyService;\r\n this.currencySymbol = TRPCONFIG.Domain.CurrencyCode;\r\n this.currencyFilter = this.$filter('roundedCurrency');\r\n $scope.$watch('pf.model', function (value) {\r\n if (!value) {\r\n return;\r\n }\r\n analytics.track('mixpanel', 'HolidayDealsFilterPrice');\r\n });\r\n }\r\n PriceFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{pf.getName('Min', pf.priceMode)}} \\n \\n \\n \\n \\n {{pf.getName('Max', pf.priceMode)}} \\n \\n \\n \";\r\n };\r\n PriceFilterLabel.prototype.getName = function (end, priceMode) {\r\n var price = end === 'Min' ? this.model.Min : this.model.Max;\r\n var priceSentence = end === 'Min' ? this.sentenceMin : this.sentenceMax;\r\n var people = this.occupancyService.getNumberOfNonInfantPassengers();\r\n return priceSentence.replace('{0}', this.currencyFilter(priceMode === 1 ? price : price / people, this.currencySymbol));\r\n };\r\n PriceFilterLabel.prototype.isSet = function (end) {\r\n return !!this.model && this.model[end] !== this.aggregate[end] && this.model[end] !== 0;\r\n };\r\n PriceFilterLabel.prototype.remove = function (end) {\r\n this.broker.publish('RESETPRICE', end);\r\n };\r\n return PriceFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('priceFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: PriceFilterLabel.getTemplate(),\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n priceMode: '=',\r\n sentenceMin: '@',\r\n sentenceMax: '@'\r\n },\r\n controller: PriceFilterLabel,\r\n controllerAs: 'pf'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nangular\r\n .module('TR')\r\n .directive('priceToken', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n template: '',\r\n transclude: true\r\n };\r\n});\r\nangular\r\n .module('TR')\r\n .directive('primaryNavigationList', function ($location, broker, scrollService, $route, $window, $document) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, el) {\r\n var navBarContentElement = $('#navbarcont');\r\n var isSlidePanel = (el.parents('.navigation-drawer').length === 1);\r\n if (isSlidePanel) {\r\n // we are not showing sub menus in the navigation drawer yet,\r\n // just publish the instruction to close the slide panel\r\n el.find('a').click(function (e) {\r\n broker.publish('hideNavigationDrawer');\r\n });\r\n return;\r\n }\r\n var setStaticBar = function () {\r\n navBarContentElement.addClass('static');\r\n };\r\n var unsetStaticBar = function () {\r\n navBarContentElement.removeClass('static');\r\n };\r\n broker.subscribe('primaryNavigationList', 'bookingFormInitialised', setStaticBar);\r\n broker.subscribe('primaryNavigationList', 'bookingFormClosed', unsetStaticBar);\r\n var $listItemsWithSubMenus = el.find('> li.has-sub-menu');\r\n var $subMenuLinks = $listItemsWithSubMenus.find('.sub-menu a');\r\n if ($window.TRPCONFIG.IsTouchDevice) {\r\n $listItemsWithSubMenus.find('> a').on('click', function (e) {\r\n var $link = $(e.currentTarget);\r\n var $listItem = $link.parent();\r\n var isOpen = $listItem.hasClass('open');\r\n if (isOpen) {\r\n // let navigation execute and close menu\r\n $listItem.removeClass('open');\r\n }\r\n else {\r\n // prevent link navigation and open the sub menu\r\n e.preventDefault();\r\n // close any other sub menus\r\n $listItemsWithSubMenus.filter('.open').removeClass('open');\r\n // open this sub menu\r\n $listItem.addClass('open');\r\n e.stopPropagation();\r\n // close sub menu when anything else is clicked\r\n $document.one('click.primaryNavigationList', function (e2) {\r\n // something else was clicked so close menu\r\n $listItem.removeClass('open');\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n // apply \"open\" class on hover\r\n var hoverTimeout_1 = null;\r\n $listItemsWithSubMenus.hover(function (e) {\r\n // hover action has a 200ms delay\r\n hoverTimeout_1 = setTimeout(function () {\r\n $(e.currentTarget).addClass('open');\r\n }, 200);\r\n }, function (e) {\r\n clearTimeout(hoverTimeout_1);\r\n $(e.currentTarget).removeClass('open');\r\n });\r\n $listItemsWithSubMenus.find('a').one('click', function (e) {\r\n var $link = $(e.currentTarget);\r\n $link.parent().removeClass('open');\r\n });\r\n }\r\n // close sub menu on any sub menu link clicks\r\n $subMenuLinks.click(function (e) {\r\n var $link = $(e.currentTarget);\r\n $link.parents('li.has-sub-menu').removeClass('open');\r\n });\r\n scope.$on('$destroy', function () {\r\n $listItemsWithSubMenus.off();\r\n $subMenuLinks.off();\r\n });\r\n }\r\n };\r\n});\r\nvar TR;\r\n(function (TR) {\r\n var PropertyTypeFilter = /** @class */ (function () {\r\n function PropertyTypeFilter($scope, occupancyService) {\r\n var _this = this;\r\n $scope.$watch('pt.aggregate', function (agg) {\r\n if (!agg) {\r\n return;\r\n }\r\n _this.people = occupancyService.getNumberOfNonInfantPassengers();\r\n var propArray = [];\r\n for (var key in agg) {\r\n propArray.push(_.extend(agg[key], { id: key }));\r\n }\r\n _.set(_.minBy(propArray, function (v) { return v.MinPrice; }), 'cheapest', true);\r\n _this.propArray = propArray;\r\n });\r\n }\r\n PropertyTypeFilter.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n PropertyTypeFilter.prototype.reset = function () {\r\n this.model = [];\r\n };\r\n PropertyTypeFilter.prototype.more = function (all) {\r\n this.showAll = all;\r\n };\r\n PropertyTypeFilter.prototype.showMoreLess = function () {\r\n return Object.keys(this.aggregate || {}).length > this.limit;\r\n };\r\n return PropertyTypeFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('propertyTypeFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=PropertyTypeFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n limit: '@',\r\n priceMode: '='\r\n },\r\n controller: PropertyTypeFilter,\r\n controllerAs: 'pt'\r\n };\r\n });\r\n var PropertyTypeFilterLabel = /** @class */ (function () {\r\n function PropertyTypeFilterLabel($scope, analytics) {\r\n var _this = this;\r\n $scope.$watch('pt.model', function (value) {\r\n if (!value || !value.length) {\r\n return;\r\n }\r\n var pt = value.map(function (v) { return _this.getName(v); });\r\n analytics.track('mixpanel', 'HolidayDealsFilterPropertyType', { value: pt });\r\n });\r\n }\r\n PropertyTypeFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{pt.getName(type)}} \\n \\n \\n \";\r\n };\r\n PropertyTypeFilterLabel.prototype.getName = function (type) {\r\n if (!this.aggregate) {\r\n return '';\r\n }\r\n return (this.aggregate[type] || {}).Title;\r\n };\r\n PropertyTypeFilterLabel.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n PropertyTypeFilterLabel.prototype.remove = function (type) {\r\n this.model = this.model.filter(function (v) { return v !== type; });\r\n };\r\n return PropertyTypeFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('propertyTypeFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: PropertyTypeFilterLabel.getTemplate(),\r\n bindToController: {\r\n aggregate: '=',\r\n model: '='\r\n },\r\n controller: PropertyTypeFilterLabel,\r\n controllerAs: 'pt'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n /*\r\n Brings data from publicityService into scope\r\n */\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('publicityData', function (publicityService) { return ({\r\n restrict: 'A',\r\n scope: false,\r\n link: function (scope) {\r\n publicityService\r\n .getStats({\r\n StatisticTypes: 'All'\r\n })\r\n .then(function (data) {\r\n // Add returned data to scope\r\n scope.publicityData = data;\r\n });\r\n }\r\n }); });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var RatingFilter = /** @class */ (function () {\r\n function RatingFilter($scope, broker) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$scope.$watch('rf.aggregate', this.setRange.bind(this), true);\r\n $scope.$watch('rf.model', function (m) {\r\n if (m === null) {\r\n _this.reset();\r\n }\r\n });\r\n broker.subscribe('ratingFilter', 'RESETRATING', this.reset.bind(this));\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('ratingFilter');\r\n });\r\n }\r\n RatingFilter.prototype.setRange = function (a) {\r\n if (!a) {\r\n return;\r\n }\r\n this.range = this.model\r\n ? { Min: this.model.Min, Max: this.model.Max }\r\n : { Min: a.Min, Max: a.Max };\r\n };\r\n RatingFilter.prototype.updateModel = function () {\r\n // if model already in sync skip\r\n if (this.model && (this.model.Min === this.range.Min)) {\r\n return;\r\n }\r\n // if new value is the default one reset\r\n if (this.range.Min === this.aggregate.Min) {\r\n return this.model = null;\r\n }\r\n return this.model = { Min: this.range.Min, Max: this.range.Max };\r\n };\r\n RatingFilter.prototype.isSet = function () {\r\n return !!this.model;\r\n };\r\n RatingFilter.prototype.reset = function () {\r\n this.range = { Min: this.aggregate.Min, Max: this.aggregate.Max };\r\n this.model = null;\r\n };\r\n return RatingFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('ratingFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=RatingFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '='\r\n },\r\n controller: RatingFilter,\r\n controllerAs: 'rf'\r\n };\r\n });\r\n var RatingFilterLabel = /** @class */ (function () {\r\n function RatingFilterLabel($scope, broker, analytics) {\r\n this.broker = broker;\r\n $scope.$watch('rf.model', function (value) {\r\n if (!value) {\r\n return;\r\n }\r\n analytics.track('mixpanel', 'HolidayDealsFilterRating');\r\n });\r\n }\r\n RatingFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{rf.getName()}} \\n \\n \\n \";\r\n };\r\n RatingFilterLabel.prototype.getName = function () {\r\n return this.sentence.replace('{0}', this.model.Min);\r\n };\r\n RatingFilterLabel.prototype.isSet = function () {\r\n return !!this.model && this.model.Min > this.aggregate.Min;\r\n };\r\n RatingFilterLabel.prototype.remove = function (dest) {\r\n this.broker.publish('RESETRATING');\r\n };\r\n return RatingFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('ratingFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: RatingFilterLabel.getTemplate(),\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n sentence: '@'\r\n },\r\n controller: RatingFilterLabel,\r\n controllerAs: 'rf'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ReviewSnippetBrowser = /** @class */ (function () {\r\n function ReviewSnippetBrowser($scope, $q, $interval, $timeout, $locale) {\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.$interval = $interval;\r\n this.$timeout = $timeout;\r\n this.$locale = $locale;\r\n this.eventNamespace = 'reviewsnippetbrowser';\r\n this.show = false;\r\n this.slickOptions = {\r\n infinite: true,\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n rtl: TRPCONFIG.Rtl,\r\n speed: 200,\r\n autoplay: true,\r\n autoplaySpeed: 6000\r\n };\r\n }\r\n ReviewSnippetBrowser.prototype.init = function (elements) {\r\n var _this = this;\r\n this.elements = elements;\r\n this.$scope.$watch('rsb.hotel', function (val) {\r\n if (val) {\r\n _this.initSlick();\r\n }\r\n });\r\n };\r\n // private initSlick(): void {\r\n // this.elements.carousel.slick(this.slickOptions);\r\n // this.$scope.$on('$destroy', () => {\r\n // this.elements.carousel.slick('unslick');\r\n // });\r\n // }\r\n ReviewSnippetBrowser.prototype.initSlick = function () {\r\n var _this = this;\r\n var interval = 10, attempts = 5, stopTrying;\r\n var tryInit = function () {\r\n var ready = _this.elements.carousel[0].children && _this.elements.carousel[0].children.length > 0;\r\n if (ready) {\r\n // stop the loop\r\n _this.$interval.cancel(stopTrying);\r\n // do the init\r\n _this.elements.carousel.slick(_this.slickOptions);\r\n _this.show = true;\r\n _this.$scope.$on('$destroy', function () {\r\n _this.elements.carousel.slick('unslick');\r\n });\r\n }\r\n };\r\n // start the loop\r\n stopTrying = this.$interval(tryInit, interval, attempts);\r\n };\r\n return ReviewSnippetBrowser;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('reviewSnippetBrowser', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: ReviewSnippetBrowser,\r\n controllerAs: 'rsb',\r\n transclude: true,\r\n bindToController: {\r\n hotel: '='\r\n },\r\n templateUrl: 'partials/home/reviewsnippetbrowser',\r\n link: function (scope, el, attr, controller) {\r\n var elements = {\r\n carousel: el.find('.carousel')\r\n };\r\n controller.init(elements);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('scrollIntoView', scrollIntoView);\r\n function scrollIntoView($timeout) {\r\n return {\r\n restrict: 'A',\r\n scope: '=',\r\n compile: function ($element, $attrs) {\r\n // raw template\r\n var element = $element[0];\r\n var showLessbutton = element.querySelector('#seo-lists__showLessButton');\r\n var showMorebutton = element.querySelector('#seo-lists__showMoreButton');\r\n var seoListsPanel = element.querySelector('#seo-lists__grid');\r\n var seoListsContainer = element.querySelector('#seo-lists');\r\n if (!showLessbutton && !seoListsPanel && !seoListsContainer) {\r\n return;\r\n }\r\n var configTimeout = $attrs.timeout && parseInt($attrs.timeout) || '';\r\n var configDelay = (typeof configTimeout === 'number') ? configTimeout : 0;\r\n if (configDelay) {\r\n seoListsPanel.classList.add('open');\r\n }\r\n return function postLink($scope) {\r\n var removeOpen = function () {\r\n if (seoListsPanel.classList.contains('open')) {\r\n seoListsPanel.classList.remove('open');\r\n }\r\n };\r\n var addActive = function () {\r\n if (!showMorebutton.classList.contains('active')) {\r\n showMorebutton.classList.add('active');\r\n }\r\n };\r\n var wait = function (ms) {\r\n if (ms === void 0) { ms = 0; }\r\n return new Promise(function (resolve) { return $timeout(resolve, ms); });\r\n };\r\n function handleScrollToView() {\r\n seoListsContainer.scrollIntoView();\r\n }\r\n function scrollToSeoListContainer() {\r\n showLessbutton.addEventListener('click', handleScrollToView);\r\n }\r\n function delayRemoveOpen() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, wait(configDelay)];\r\n case 1:\r\n _a.sent();\r\n removeOpen();\r\n scrollToSeoListContainer();\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function handleError(err) {\r\n console.log(err);\r\n }\r\n $scope.$on('$routeChangeSuccess', function (prev, next, current) {\r\n addActive();\r\n if (current) {\r\n removeOpen();\r\n scrollToSeoListContainer();\r\n }\r\n });\r\n window.onload = (function () {\r\n if (configDelay) {\r\n delayRemoveOpen().catch(handleError);\r\n }\r\n })();\r\n };\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('shortlistToggle', shortlistToggle);\r\n function shortlistToggle(shortlistService, $rootScope) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n hotel: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=ShortlistToggle',\r\n link: function (scope) {\r\n var cancel = scope.$watch('hotel', function (v) {\r\n if (v) {\r\n cancel();\r\n shortlistService.isHotelShortlisted(scope.hotel)\r\n .then(function (shortlisted) { return scope.hotel.inShortlist = shortlisted; });\r\n scope.toggleShortlist = function (e) {\r\n e.preventDefault();\r\n shortlistService.toggleHotel(scope.hotel).then(function (shortlisted) {\r\n scope.hotel.inShortlist = shortlisted;\r\n scope.$emit('hotelShortlistStatusUpdated', scope.hotel);\r\n });\r\n e.stopPropagation();\r\n };\r\n $rootScope.$on('hotelShortlistStatusUpdated', function (ev, args) {\r\n if (scope.hotel.Id === args.Id) {\r\n scope.hotel.inShortlist = args.inShortlist;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n };\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var SimpleImageGallery = /** @class */ (function () {\r\n function SimpleImageGallery($scope, $element, imageService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.imageService = imageService;\r\n this.directions = { LEFT: 0, RIGHT: 1 };\r\n // CSS Setup\r\n var gallery = $element.find('.simple-image-gallery');\r\n var leftArrow = gallery.find('.icon-chevron-left');\r\n var rightArrow = gallery.find('.icon-chevron-right');\r\n this.slider = gallery.find('.slider');\r\n var arrowSize = Math.floor(this.height / 8);\r\n var arrowTop = (this.height / 2) - (arrowSize / 2);\r\n var arrowCss = {\r\n 'font-size': arrowSize + \"px\",\r\n 'top': arrowTop + \"px\"\r\n };\r\n gallery.css('height', this.height + \"px\");\r\n leftArrow.css(arrowCss);\r\n rightArrow.css(arrowCss);\r\n $scope.$watch(function () { return gallery.is(':visible'); }, function () { return _this._setPadding(gallery); });\r\n $scope.$watch(function () { return gallery.width(); }, function () { return _this._setPadding(gallery); });\r\n this.slider.css({\r\n left: \"-\" + this.width + \"px\",\r\n });\r\n this.size = {\r\n width: this.width + \"px\",\r\n height: this.height + \"px\"\r\n };\r\n // Image Insertion\r\n this.$scope.$watch('si.estabId', function (v) {\r\n if (!v) {\r\n return;\r\n }\r\n _this.images = [];\r\n for (var i = 0, ii = _this.imageNumber; i < ii; i++) {\r\n _this.images.push(imageService.getImageUrl(_this.estabId, _this.width, _this.height, i, true));\r\n }\r\n });\r\n // Events\r\n rightArrow.click(function () { return _this._slide(_this.directions.RIGHT); });\r\n leftArrow.click(function () { return _this._slide(_this.directions.LEFT); });\r\n gallery[0].addEventListener('touchstart', function (e) { return _this._handleTouchStart(e); }, false);\r\n gallery[0].addEventListener('touchend', function (e) { return _this._handleTouchMove(e); }, false);\r\n }\r\n SimpleImageGallery.prototype._setPadding = function (gallery) {\r\n var w = gallery.width();\r\n var pad = w > this.width ? (w - this.width) / 2 + \"px\" : '10px';\r\n if (w > this.width) {\r\n this.slider.css('padding-left', pad);\r\n }\r\n };\r\n SimpleImageGallery.prototype._handleTouchStart = function (e) {\r\n this.touchStart = e.touches[0].clientX;\r\n };\r\n SimpleImageGallery.prototype._handleTouchMove = function (e) {\r\n if (!this.touchStart) {\r\n return;\r\n }\r\n var touchEnd = e.changedTouches[0].clientX;\r\n var diff = this.touchStart - touchEnd;\r\n if (Math.abs(diff) < 30) {\r\n return;\r\n }\r\n return this._slide(diff > 0 ? this.directions.RIGHT : this.directions.LEFT);\r\n };\r\n SimpleImageGallery.prototype._slide = function (dir) {\r\n var _this = this;\r\n var current = parseInt(this.slider.css('left'), 10);\r\n var move = dir === this.directions.LEFT\r\n ? current + this.width\r\n : current - this.width;\r\n this.slider.animate({ left: move }, 200, function () {\r\n var selectedImage = TRPCONFIG.Rtl ? 'img:nth-last-child(2)' : 'img:nth-child(2)';\r\n _this.slider.find(selectedImage).css('opacity', '0.5');\r\n var first = _this.slider.find('img:first');\r\n var last = _this.slider.find('img:last');\r\n if (TRPCONFIG.Rtl) {\r\n if (dir === _this.directions.RIGHT) {\r\n first.before(last);\r\n }\r\n else {\r\n last.after(first);\r\n }\r\n }\r\n else {\r\n if (dir === _this.directions.LEFT) {\r\n first.before(last);\r\n }\r\n else {\r\n last.after(first);\r\n }\r\n }\r\n _this.slider.css({ 'left': \"-\" + _this.width + \"px\" });\r\n _this.slider.find(selectedImage).css('opacity', '1');\r\n });\r\n };\r\n return SimpleImageGallery;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('simpleImageGallery', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=SimpleImageGallery',\r\n bindToController: {\r\n estabId: '=',\r\n imageNumber: '=',\r\n width: '=?',\r\n height: '=?'\r\n },\r\n controller: SimpleImageGallery,\r\n controllerAs: 'si'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var StarsFilter = /** @class */ (function () {\r\n function StarsFilter($scope, occupancyService) {\r\n var _this = this;\r\n $scope.$watch('sf.aggregate', function (agg) {\r\n if (!agg) {\r\n return;\r\n }\r\n _this.people = occupancyService.getNumberOfNonInfantPassengers();\r\n _this.ordered = Object.keys(agg)\r\n .map(function (v) { return parseInt(v, 10); })\r\n .sort(function (a, b) { return b - a; })\r\n .map(function (v) { return ({\r\n stars: v.toString(),\r\n Count: agg[v].Count,\r\n MinPrice: agg[v].MinPrice\r\n }); });\r\n _.set(_.minBy(_this.ordered, function (v) { return v.MinPrice; }), 'cheapest', true);\r\n });\r\n }\r\n StarsFilter.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n StarsFilter.prototype.reset = function () {\r\n this.model = [];\r\n };\r\n return StarsFilter;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('starsFilter', function () {\r\n return {\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=StarsFilter',\r\n bindToController: {\r\n aggregate: '=',\r\n model: '=',\r\n priceMode: '='\r\n },\r\n controller: StarsFilter,\r\n controllerAs: 'sf'\r\n };\r\n });\r\n var StarsFilterLabel = /** @class */ (function () {\r\n function StarsFilterLabel($scope, analytics) {\r\n $scope.$watch('sf.model', function (value) {\r\n if (!value || !value.length) {\r\n return;\r\n }\r\n analytics.track('mixpanel', 'HolidayDealsFilterStars', { value: value });\r\n });\r\n }\r\n StarsFilterLabel.getTemplate = function () {\r\n return \"\\n \\n \\n {{::sf.unrated}} \\n 1 {{::sf.singular}} \\n 1\\\"> {{::star}} {{::sf.plural}} \\n \\n \\n \";\r\n };\r\n StarsFilterLabel.prototype.isSet = function () {\r\n return !!_.size(this.model);\r\n };\r\n StarsFilterLabel.prototype.remove = function (star) {\r\n this.model = this.model.filter(function (v) { return v !== star; });\r\n };\r\n return StarsFilterLabel;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('starsFilterLabel', function () {\r\n return {\r\n scope: {},\r\n template: StarsFilterLabel.getTemplate(),\r\n bindToController: {\r\n unrated: '@',\r\n singular: '@',\r\n plural: '@',\r\n model: '='\r\n },\r\n controller: StarsFilterLabel,\r\n controllerAs: 'sf'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var TextFader = /** @class */ (function () {\r\n function TextFader() {\r\n this.showContent = true;\r\n this.showExpanderLink = true;\r\n }\r\n TextFader.prototype.init = function (contentHeight) {\r\n console.log('text fader: ' + contentHeight);\r\n //if there isn't enough content remove the more less links\r\n this.showContent = !(contentHeight > this.height);\r\n this.showExpanderLink = !this.showContent;\r\n };\r\n return TextFader;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('textFader', function () {\r\n return {\r\n scope: {\r\n height: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=TextFader',\r\n bindToController: true,\r\n controller: TextFader,\r\n controllerAs: 'tf',\r\n link: function (scope, el, attr, ctrl) {\r\n setTimeout(function () {\r\n // angular finished its thing we can get the height\r\n ctrl.init(el.find(' > .content').outerHeight());\r\n }, 0);\r\n },\r\n replace: true,\r\n transclude: true\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('tooltip', function () {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n placement: '@'\r\n },\r\n link: function (scope, el, attr) {\r\n if (TRPCONFIG.IsTouchDevice) {\r\n return;\r\n }\r\n var popup;\r\n var placement = (function () {\r\n switch (scope.placement) {\r\n case 'start': return TRPCONFIG.Rtl ? 'right' : 'left';\r\n case 'end': return TRPCONFIG.Rtl ? 'left' : 'right';\r\n default: return scope.placement || 'top';\r\n }\r\n })();\r\n el.on('mouseenter', function () {\r\n if (!attr.tooltip) {\r\n return;\r\n }\r\n if (!popup) {\r\n el.trppopup({\r\n trigger: 'manual',\r\n placement: placement,\r\n content: function () {\r\n return attr.tooltip;\r\n }\r\n });\r\n popup = el.data('trppopup');\r\n }\r\n popup.show();\r\n });\r\n el.on('mouseleave', function () {\r\n if (popup) {\r\n popup.hide();\r\n }\r\n });\r\n scope.$on('$destroy', function () {\r\n el.off('mouseenter');\r\n el.off('mouseleave');\r\n if (popup) {\r\n popup.destroy();\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('tooltipUi', tooltipUi);\r\n function tooltipUi() {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n tooltipClass: '@'\r\n },\r\n link: function (scope, el, attr) {\r\n $(el).mouseover(function () {\r\n $(el).tooltip({\r\n items: el[0].tagName,\r\n content: attr.tooltipUi,\r\n position: { my: 'center top+15', at: 'center bottom' },\r\n hide: false,\r\n show: false,\r\n tooltipClass: scope.tooltipClass\r\n });\r\n $(el).tooltip('open');\r\n });\r\n scope.$on('$destroy', function () { return $(el).off(); });\r\n }\r\n };\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var TrustpilotLogo = /** @class */ (function () {\r\n function TrustpilotLogo(TrustpilotService) {\r\n var _this = this;\r\n this.TrustpilotService = TrustpilotService;\r\n // get business unit info from Trustpilot\r\n this.TrustpilotService.getBusinessUnit().then(function (res) {\r\n _this.summary = res;\r\n });\r\n }\r\n return TrustpilotLogo;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('trustpilotLogo', function () {\r\n return {\r\n bindToController: {\r\n stars: '=',\r\n count: '=',\r\n name: '@',\r\n class: '@',\r\n path: '@',\r\n altLogo: '=?',\r\n },\r\n controller: TrustpilotLogo,\r\n controllerAs: 'tpl',\r\n templateUrl: 'partials/home/directivetemplate?type=TrustpilotLogo',\r\n link: function ($scope) {\r\n $scope.hostName = 'https://uk.trustpilot.com/review/www.' + TRPCONFIG.Domain.HostName;\r\n setTimeout(function () {\r\n var widgetManagement = _.get(window, 'Trustpilot.Modules.WidgetManagement');\r\n if (!widgetManagement) {\r\n $(document.body).append(\"\");\r\n }\r\n }, 1500);\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n ///NOTE: this is now deprecated, please use the validationMessage directive as that\r\n //is aligned with what we would like to do going forward with the look and feel and activation\r\n //or errors across the site.\r\n TR.directive('validationErrors', function ($rootScope, validationService, broker) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n priority: 1000,\r\n scope: {\r\n rootForm: '=',\r\n field: '=',\r\n label: '@',\r\n msgMap: '@',\r\n immediate: '@',\r\n stayActive: '@' // Error stays visible until another field is focused (i.e. whilst using calendar)\r\n },\r\n template: '
' +\r\n '
    ' +\r\n '
  • ' +\r\n ' {{translate(name, val)}}' +\r\n '
  • ' +\r\n '
' +\r\n '
    ' +\r\n '
  • ' +\r\n '

    {{translate(name, val)}}

    ' +\r\n '
  • ' +\r\n '
' +\r\n '
',\r\n link: function (scope) {\r\n scope.showErrors = function () {\r\n var field = scope.field;\r\n if (field) {\r\n var stayActive = (scope.stayActive === 'true' && field.lastFocused);\r\n return (field.focused || stayActive || immediateTest()) &&\r\n ($rootScope.submittedForm === scope.rootForm && !scope.rootForm.$valid || immediateTest());\r\n }\r\n };\r\n scope.showErrorsdob = function () {\r\n var field = scope.field;\r\n if (field && field.$name === 'dob') {\r\n var stayActive = (scope.stayActive === 'true');\r\n return (stayActive && $rootScope.submittedForm === scope.rootForm && !scope.rootForm.$valid);\r\n }\r\n };\r\n function immediateTest() {\r\n if (scope.immediate != null) {\r\n if (scope.immediate === 'true') {\r\n return true;\r\n }\r\n var immediate = scope.immediate.split('|');\r\n for (var i in immediate) {\r\n var doNow = immediate[i];\r\n if (doNow && scope.field.$error[doNow]) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n var map = scope.msgMap == null ? {} : JSON.parse(scope.msgMap);\r\n var watcher = scope.$watch('field', function (val) {\r\n if (val) {\r\n scope.field.label = scope.label;\r\n watcher();\r\n }\r\n });\r\n scope.$watch(scope.showErrors, function (val) {\r\n if (val && scope.field.$invalid) {\r\n var validationErrors = Object.keys(scope.field.$error)\r\n .map(function (name) { return validationService.translateField(scope.field, name, map); });\r\n broker.publish('validationErrors', validationErrors);\r\n }\r\n });\r\n scope.translate = function (name, val) {\r\n if (!val) {\r\n return '';\r\n }\r\n return validationService.translateField(scope.field, name, map);\r\n };\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var FormField = /** @class */ (function () {\r\n function FormField(field) {\r\n this.Children = [];\r\n this.Inputs = [];\r\n this.Field = FormField.addValidationObjectToField(field);\r\n }\r\n FormField.prototype.addChildField = function (input, field) {\r\n this.addInputField(input);\r\n this.Children.push(FormField.addValidationObjectToField(field));\r\n };\r\n FormField.prototype.addInputField = function (input) {\r\n this.Inputs.push(input);\r\n };\r\n FormField.prototype.errorMessages = function () {\r\n return this.isValid() ? {} : this.Field.$error;\r\n };\r\n FormField.prototype.getInputFields = function () {\r\n return this.Inputs;\r\n };\r\n FormField.prototype.isFocused = function () {\r\n return this.Children.length > 0 ?\r\n _.some(this.Children, function (f) { return f.ValidationSummary.Focused === true; })\r\n : this.Field.ValidationSummary.Focused;\r\n };\r\n FormField.prototype.isValid = function () {\r\n return !this.Field.$invalid;\r\n };\r\n FormField.prototype.wasPreviouslyFocused = function () {\r\n return this.Children.length > 0 ?\r\n _.every(this.Children, function (f) { return f.ValidationSummary.PreviouslyFocused === true; })\r\n : this.Field.ValidationSummary.PreviouslyFocused;\r\n };\r\n FormField.addValidationObjectToField = function (field) {\r\n var f = field;\r\n f.ValidationSummary = {\r\n Focused: false,\r\n PreviouslyFocused: false\r\n };\r\n return f;\r\n };\r\n return FormField;\r\n }());\r\n var ValidationMessage = /** @class */ (function () {\r\n function ValidationMessage($scope, $timeout, validationService) {\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.validationService = validationService;\r\n this.fields = [];\r\n this.labels = [];\r\n this.watchers = [];\r\n this.errorMessages = [];\r\n for (var _i = 0, _a = this.labelStrings.split('|'); _i < _a.length; _i++) {\r\n var l = _a[_i];\r\n this.labels.push(l);\r\n }\r\n this.map = this.msgMap == null ? {} : JSON.parse(this.msgMap);\r\n }\r\n ValidationMessage.prototype.init = function (form, formElement) {\r\n var _this = this;\r\n this.form = form;\r\n var _loop_1 = function (name_1) {\r\n f = this_1.form[name_1];\r\n var formField = new FormField(this_1.form[name_1]);\r\n //find the input DOM element within our form and attach some handlers\r\n //use the name property to associate the field and input also keep a\r\n //pointer to the input field as we will want to add/remove css classes\r\n //depending on its validity\r\n var input = formElement.find(\"[name='\" + name_1 + \"']\").first();\r\n if (input.is('select') || input.is('input')) {\r\n input\r\n .focus(function (e) { return _this.focusHandler(e); })\r\n .blur(function (e) { return _this.blurHandler(e); });\r\n formField.addInputField(input);\r\n }\r\n else {\r\n //find our actual sub inputs and add a Validation summary to these\r\n _.each(input.find('select,input'), function (ele) { return formField.addChildField($(ele), _this.form[ele.name]); });\r\n input\r\n .focusin(function (e) { return _this.focusHandler(e); })\r\n .focusout(function (e) { return _this.blurHandler(e); });\r\n }\r\n this_1.fields.push(formField);\r\n };\r\n var this_1 = this, f;\r\n for (var _i = 0, _a = this.fieldNames.split('|'); _i < _a.length; _i++) {\r\n var name_1 = _a[_i];\r\n _loop_1(name_1);\r\n }\r\n //this is a bit of a hack to solve issues where we have external influences on a field.\r\n //we should avoid having so many watches\r\n if (this.alwaysWatch()) {\r\n _.each(this.fields, function (f, i) {\r\n _this.watchers.push(_this.$scope.$watch(\"vm.fields[\" + i + \"].isValid()\", function (n, o) {\r\n if (n !== o) {\r\n _this.active = _.every(_this.fields, function (f) { return f.wasPreviouslyFocused() === true; })\r\n || _.every(_this.fields, function (f) { return f.isValid() === true; });\r\n _this.updateValidationStatus();\r\n }\r\n }));\r\n });\r\n }\r\n this.$scope.$watch('vm.rootForm.$submitted', function (v) {\r\n if (v) {\r\n _this.active = true;\r\n _this.updateValidationStatus();\r\n }\r\n });\r\n };\r\n ValidationMessage.prototype.blurHandler = function (e) {\r\n if (this.watchers.length && !this.alwaysWatch()) {\r\n _.each(this.watchers, function (w) { return w(); });\r\n this.watchers = [];\r\n }\r\n //use the elements name to get the field from the form\r\n var field = this.form[e.target.name];\r\n field.ValidationSummary.Focused = false;\r\n field.ValidationSummary.PreviouslyFocused = true;\r\n this.active = _.every(this.fields, function (f) { return f.wasPreviouslyFocused() === true; });\r\n this.updateValidationStatus();\r\n };\r\n ValidationMessage.prototype.focusHandler = function (e) {\r\n var _this = this;\r\n //use the elements name to get the field from the form\r\n var field = this.form[e.target.name];\r\n field.ValidationSummary.Focused = true;\r\n //if all the fields were previously active and we are invalid then watch our fields while we type\r\n //so that we know when we are valid\r\n if (_.every(this.fields, function (f) { return f.wasPreviouslyFocused() === true; }) && !this.alwaysWatch()) {\r\n _.each(this.fields, function (f, i) {\r\n _this.watchers.push(_this.$scope.$watch(\"vm.fields[\" + i + \"].isValid()\", function () {\r\n _this.updateValidationStatus();\r\n }, true));\r\n });\r\n }\r\n };\r\n ValidationMessage.prototype.updateValidationStatus = function () {\r\n var _this = this;\r\n var allValid = true;\r\n var errors = [];\r\n var errorClassName = 'sc-c-field--error';\r\n var successClassName = 'sc-c-field--success';\r\n var fds = this.fields;\r\n _.each(this.fields, function (f, index) {\r\n var valid = f.isValid();\r\n if (!valid && _this.active) {\r\n allValid = false;\r\n _.forOwn(f.errorMessages(), function (v, k) {\r\n return errors.push(_this.validationService.translateFieldLabel(_this.labels[index], k, _this.map));\r\n });\r\n var inputfields = f.getInputFields();\r\n _.each(inputfields, function (field) {\r\n field.parent().addClass(errorClassName);\r\n if (field.parent().hasClass(successClassName)) {\r\n field.parent().removeClass(successClassName);\r\n }\r\n });\r\n }\r\n else if (valid && _this.active) {\r\n var inputfields = f.getInputFields();\r\n _.each(f.getInputFields(), function (field) {\r\n if (field.parent().hasClass(errorClassName)) {\r\n field.parent().removeClass(errorClassName);\r\n }\r\n field.parent().addClass(successClassName);\r\n });\r\n }\r\n });\r\n this.$timeout(function () {\r\n _this.invalid = !allValid;\r\n _this.errorMessages = _.uniq(errors);\r\n }, 0);\r\n };\r\n ValidationMessage.prototype.alwaysWatch = function () {\r\n return this.alwaysWatchFields === 'true';\r\n };\r\n return ValidationMessage;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('validationMessage', function () {\r\n return {\r\n require: '^form',\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n template: \"
\\n

\\n {{err}}\\n

\\n
\",\r\n bindToController: {\r\n fieldNames: '@',\r\n labelStrings: '@',\r\n msgMap: '@?',\r\n rootForm: '=',\r\n waitFor: '=?',\r\n alwaysWatchFields: '@?'\r\n },\r\n controller: ValidationMessage,\r\n controllerAs: 'vm',\r\n link: function (scope, el, attr, formCtrl) {\r\n //there is an assumption here that the directive is within the same form as the input field\r\n //we are validating and also that the field name is that same as the name property on the input.\r\n // Not great, but so the we can keep everything together this might be ok (maybe, sort of)\r\n //we need our form DOM element so that we can find the inputs\r\n //get the elements parent forms and the first one should be the one to use\r\n var formEl = ($(angular.element(el).parents('ng-form')[0])\r\n || $(angular.element(el).closest('form.quoteFormNonReg')));\r\n if (attr.waitFor) {\r\n var watch_2 = scope.$watch('vm.waitFor', function (v) {\r\n if (v) {\r\n scope.vm.init(formCtrl, formEl);\r\n watch_2();\r\n }\r\n });\r\n }\r\n else {\r\n scope.vm.init(formCtrl, formEl);\r\n }\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var FormField = /** @class */ (function () {\r\n function FormField(field) {\r\n this.Children = [];\r\n this.Field = FormField.addValidationObjectToField(field);\r\n }\r\n FormField.prototype.addChildField = function (field) {\r\n this.Children.push(FormField.addValidationObjectToField(field));\r\n };\r\n FormField.prototype.wasPreviouslyFocused = function () {\r\n return this.Children.length > 0 ?\r\n _.every(this.Children, function (f) { return f.ValidationSummary.PreviouslyFocused === true; })\r\n : this.Field.ValidationSummary.PreviouslyFocused;\r\n };\r\n FormField.prototype.isValid = function () {\r\n return !this.Field.$invalid;\r\n };\r\n FormField.prototype.errorMessages = function () {\r\n return this.isValid() ? {} : this.Field.$error;\r\n };\r\n FormField.addValidationObjectToField = function (field) {\r\n var f = field;\r\n f.ValidationSummary = {\r\n PreviouslyFocused: false\r\n };\r\n return f;\r\n };\r\n return FormField;\r\n }());\r\n var ValidationStatus = /** @class */ (function () {\r\n function ValidationStatus($scope, analytics, broker, validationService) {\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.broker = broker;\r\n this.validationService = validationService;\r\n this.fields = [];\r\n this.labels = [];\r\n this.watchers = [];\r\n this.errorMessages = [];\r\n for (var _i = 0, _a = this.labelStrings.split('|'); _i < _a.length; _i++) {\r\n var l = _a[_i];\r\n this.labels.push(l);\r\n }\r\n this.map = this.msgMap == null ? {} : JSON.parse(this.msgMap);\r\n }\r\n ValidationStatus.prototype.init = function (form, formElement) {\r\n var _this = this;\r\n this.form = form;\r\n var _loop_2 = function (name_2) {\r\n var field = this_2.form[name_2];\r\n if (!field) {\r\n throw new Error(\"There was no field named \\\"\" + name_2 + \"\\\"\");\r\n }\r\n var formField = new FormField(field);\r\n //find the input DOM element within our form and attach some handlers\r\n //use the name property to associate the field and input\r\n var input = formElement.find(\"[name='\" + name_2 + \"']\").first();\r\n if (input.is('select') || input.is('input')) {\r\n input\r\n .focus(function () { return _this.focusHandler(); })\r\n .blur(function (e) { return _this.blurHandler(e); });\r\n }\r\n else {\r\n //find our actual sub inputs and add track these\r\n _.each(input.find('select,input'), function (ele) {\r\n var field = _this.form[ele.name];\r\n if (field) {\r\n formField.addChildField(field);\r\n }\r\n });\r\n input\r\n .focusin(function () { return _this.focusHandler(); })\r\n .focusout(function (e) { return _this.blurHandler(e); });\r\n }\r\n this_2.fields.push(formField);\r\n };\r\n var this_2 = this;\r\n for (var _i = 0, _a = this.fieldNames.split('|'); _i < _a.length; _i++) {\r\n var name_2 = _a[_i];\r\n _loop_2(name_2);\r\n }\r\n //this is a bit of a hack to solve issues where we have external influences on a field.\r\n //we should avoid having so many watches\r\n if (this.alwaysWatch()) {\r\n _.each(this.fields, function (f, i) {\r\n _this.watchers.push(_this.$scope.$watch(\"vs.fields[\" + i + \"].isValid()\", function (n, o) {\r\n if (n !== o) {\r\n _this.active = _.every(_this.fields, function (f) { return f.wasPreviouslyFocused() === true; })\r\n || _.every(_this.fields, function (f) { return f.isValid() === true; });\r\n _this.updateValidationStatus();\r\n }\r\n }));\r\n });\r\n }\r\n this.$scope.$watch('vs.rootForm.$submitted', function (v) {\r\n if (v) {\r\n _this.active = true;\r\n _this.updateValidationStatus();\r\n }\r\n });\r\n };\r\n ValidationStatus.prototype.blurHandler = function (e) {\r\n var _this = this;\r\n if (this.watchers.length && !this.alwaysWatch()) {\r\n _.each(this.watchers, function (w) { return w(); });\r\n this.watchers = [];\r\n }\r\n //use the elements name to get the field from the form\r\n var field = this.form[e.target.name];\r\n field.ValidationSummary.PreviouslyFocused = true;\r\n this.$scope.$apply(function () {\r\n _this.active = _.every(_this.fields, function (f) { return f.wasPreviouslyFocused() === true; })\r\n || _.every(_this.fields, function (f) { return f.isValid() === true; });\r\n if (_this.active) {\r\n _this.updateValidationStatus();\r\n }\r\n });\r\n };\r\n ValidationStatus.prototype.focusHandler = function () {\r\n var _this = this;\r\n //if all the fields were previously active and we are invalid then watch our fields while we type\r\n //so that we know when we are valid\r\n if (_.every(this.fields, function (f) { return f.wasPreviouslyFocused() === true; }) && !this.alwaysWatch()) {\r\n _.each(this.fields, function (f, i) {\r\n _this.watchers.push(_this.$scope.$watch(\"vs.fields[\" + i + \"].isValid()\", function () {\r\n _this.updateValidationStatus();\r\n }, true));\r\n });\r\n }\r\n };\r\n ValidationStatus.prototype.updateValidationStatus = function () {\r\n var _this = this;\r\n var errors = [];\r\n _.transform(this.fields, function (result, f, i) {\r\n if (!f.isValid()) {\r\n _.forOwn(f.errorMessages(), function (v, k) {\r\n return result.push(_this.validationService.translateFieldLabel(_this.labels[i], k, _this.map));\r\n });\r\n }\r\n return result;\r\n }, errors);\r\n this.invalid = errors.length > 0;\r\n this.errorMessages = _.uniq(errors);\r\n if (errors.length > 0 && this.active) {\r\n this.analytics.track('mixpanel', 'FormValidationInline', { InlineErrors: this.errorMessages.join(',') });\r\n this.broker.publish('validationErrors', this.errorMessages);\r\n }\r\n };\r\n ValidationStatus.prototype.alwaysWatch = function () {\r\n return this.alwaysWatchFields === 'true';\r\n };\r\n return ValidationStatus;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('validationStatus', function () {\r\n return {\r\n require: '^form',\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n template: \"
\\n
\\n \\n \\n
\\n
\\n
    \\n
  • \\n {{err}}\\n
  • \\n
\\n
\",\r\n transclude: true,\r\n bindToController: {\r\n alwaysWatchFields: '@?',\r\n cssAutoWidth: '@?',\r\n fieldNames: '@',\r\n labelStrings: '@',\r\n msgMap: '@?',\r\n rootForm: '=',\r\n waitFor: '=?'\r\n },\r\n controller: ValidationStatus,\r\n controllerAs: 'vs',\r\n link: function (scope, el, attr, formCtrl) {\r\n //there is an assumption here that the input field we are validating has a name attribute that is a\r\n //property on the form with the same value.\r\n //Not great, but so the we can keep everything together this might be ok (maybe, sort of)\r\n //we need our form DOM element so that we can find the inputs\r\n //get the elements parent forms and the first one should be the one to use\r\n var formEl = angular.element(el).closest('form,ng-form');\r\n if (attr.waitFor) {\r\n var watch_3 = scope.$watch('vs.waitFor', function (v) {\r\n if (v) {\r\n scope.vs.init(formCtrl, formEl);\r\n watch_3();\r\n }\r\n });\r\n }\r\n else {\r\n scope.vs.init(formCtrl, formEl);\r\n }\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n /*\r\n * Depends:\r\n * jquery.ui.core.js\r\n * jquery.ui.widget.js\r\n */\r\n (function ($) {\r\n $.widget('trp.modal', {\r\n options: {\r\n template: '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n ' ' +\r\n ' ' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
',\r\n fadeSpeed: 200,\r\n easing: 'swing',\r\n clickOffToClose: false\r\n },\r\n _create: function () {\r\n // element refs\r\n this.$lightbox = null;\r\n this.$stage = null;\r\n this.$loader = null;\r\n this.isShown = false;\r\n this._show();\r\n },\r\n _show: function () {\r\n if (this.isShown) {\r\n return;\r\n }\r\n this.isShown = true;\r\n this._createLightbox();\r\n },\r\n _createLightbox: function () {\r\n var self = this;\r\n // create lightbox using template\r\n this.$lightbox = $(this.options.template)\r\n .appendTo(document.body)\r\n .fadeIn(this.options.fadeSpeed, this.options.easing, $.proxy());\r\n // set refs to child elements\r\n this.$stage = this.$lightbox.find('.stage');\r\n this.$loader = this.$stage.find('.loader');\r\n this.$stage.find('a.close-btn')\r\n .on('click.modal', $.proxy(function (e) {\r\n e.preventDefault();\r\n this._trigger('closeClicked', e);\r\n this._hide();\r\n }, this));\r\n this._getContent(function (content) {\r\n self.$loader.hide();\r\n // set the content\r\n if (content) {\r\n self.$stage.find('.modal-content').html(content);\r\n }\r\n });\r\n // bind for any confirmation buttons\r\n this.$stage.find('a.ok-btn')\r\n .on('click.modal', $.proxy(function (e) {\r\n e.preventDefault();\r\n this._trigger('okClicked', e);\r\n this._hide();\r\n }, this));\r\n this.$stage.find('a.cancel-btn')\r\n .on('click.modal', $.proxy(function (e) {\r\n e.preventDefault();\r\n self._trigger('cancelClicked', e);\r\n this._hide();\r\n }, this));\r\n if (this.options.clickOffToClose) {\r\n // hide if user clicks outside the lightbox\r\n this.$lightbox.on('click.modal', $.proxy(this._hide, this));\r\n this.$stage.on('click.modal', function (e) { e.stopPropagation(); });\r\n // support keyboard commands\r\n $('html').on('keyup.modal', $.proxy(function (e) {\r\n return (e.which === 27 && this._hide()); // escape to close\r\n }, this));\r\n }\r\n this._trigger('created');\r\n },\r\n _getContent: function (callback) {\r\n if (typeof this.options.content === 'function') {\r\n // default behaviour using content function\r\n this.options.content.call(this.element[0], function (response) {\r\n callback(response);\r\n });\r\n }\r\n else {\r\n // just return content as is\r\n callback(this.options.content);\r\n }\r\n },\r\n _hide: function () {\r\n if (!this.isShown) {\r\n return;\r\n }\r\n this.isShown = false;\r\n // fade out the overlay and destroy\r\n this.$lightbox.fadeOut(200, this.options.easing, $.proxy(function () {\r\n this.destroy();\r\n }, this));\r\n this._trigger('hidden');\r\n },\r\n _destroy: function () {\r\n this.$lightbox.remove();\r\n //this.$overlay.remove();\r\n $('html').off('keyup.modal');\r\n }\r\n });\r\n })(window.jQuery);\r\n})();\r\n(function () {\r\n 'use strict';\r\n (function ($) {\r\n var Trppopup = function (element, options) {\r\n this.init('trppopup', element, options);\r\n };\r\n Trppopup.prototype = {\r\n constructor: Trppopup,\r\n init: function (type, element, options) {\r\n // initialise\r\n this.type = type;\r\n this.$el = $(element);\r\n this.options = $.extend({}, $.fn[this.type].defaults, options);\r\n this.$popup = null; // (created on first \"show')\r\n // listen to appropriate trigger events\r\n switch (this.options.trigger) {\r\n case 'click':\r\n // toggle popup on click of target element\r\n this.$el.on(\"click.\" + this.type, $.proxy(this.toggle, this));\r\n break;\r\n case 'hover':\r\n this.$el.on(\"mouseenter.\" + this.type, $.proxy(this.enter, this));\r\n this.$el.on(\"mouseleave.\" + this.type, $.proxy(this.hide, this));\r\n break;\r\n case 'focus':\r\n // for use with input fields\r\n this.$el.on(\"focus.\" + this.type, $.proxy(this.enter, this));\r\n if (this.options.hideOnBlur) {\r\n this.$el.on(\"blur.\" + this.type, $.proxy(this.hide, this));\r\n }\r\n // close on tab out\r\n this.$el.on(\"keydown.\" + this.type, $.proxy(this.checkKeydown, this));\r\n // close on external click\r\n $('html').on(\"mousedown.\" + this.type, $.proxy(this.checkClick, this));\r\n break;\r\n case 'blur':\r\n this.hide();\r\n break;\r\n case 'manual':\r\n // hide and show must be triggered manually\r\n break;\r\n }\r\n },\r\n enter: function () { this.show(true); },\r\n leave: function () { this.hide(); },\r\n toggle: function () {\r\n if (this.open) {\r\n this.hide();\r\n }\r\n else {\r\n this.show(true);\r\n }\r\n },\r\n checkClick: function (e) {\r\n var $target = $(e.target);\r\n if (this.$popup && this.open) {\r\n // close popup on external click\r\n if ($target[0] !== this.$popup && this.$popup.find('*').index($target[0]) === -1) {\r\n this.hide();\r\n }\r\n }\r\n else if (this.$popup && !this.open && $target.index(this.$el) >= 0) {\r\n this.show(true);\r\n }\r\n },\r\n checkKeydown: function (e) {\r\n var key = e.keyCode || e.which;\r\n // close if user tabs out\r\n if (key === 9) {\r\n this.hide();\r\n }\r\n },\r\n show: function (animate) {\r\n if (this.open) {\r\n return;\r\n }\r\n var $popup = this.popup();\r\n this.setContent();\r\n // we need to show the panel to get position\r\n $popup.show().css({ opacity: 0 });\r\n var options = {};\r\n switch (this.options.placement) {\r\n case 'top':\r\n options = {\r\n my: 'center bottom',\r\n of: this.$el,\r\n at: 'center top-10',\r\n collision: 'none'\r\n };\r\n break;\r\n case 'bottom':\r\n options = {\r\n my: 'center top',\r\n of: this.$el,\r\n at: 'center bottom+10',\r\n collision: 'none'\r\n };\r\n break;\r\n case 'left':\r\n options = {\r\n my: 'right center',\r\n of: this.$el,\r\n at: 'left-15 center',\r\n collision: 'none'\r\n };\r\n break;\r\n case 'right':\r\n options = {\r\n my: 'left center',\r\n of: this.$el,\r\n at: 'right+15 center',\r\n collision: 'none'\r\n };\r\n break;\r\n }\r\n $popup.position(options);\r\n if (animate) {\r\n $popup.animate({ opacity: 1 }, 150);\r\n }\r\n else {\r\n $popup.css({ opacity: 1 });\r\n }\r\n this.open = true;\r\n },\r\n hide: function () {\r\n if (!this.open) {\r\n return;\r\n }\r\n var self = this;\r\n var _popup = this.$popup;\r\n _popup.animate({ opacity: 0 }, 150, function () {\r\n _popup.hide();\r\n self.open = false;\r\n self.destroy();\r\n });\r\n },\r\n getPosition: function () {\r\n return $.extend({}, (this.$el.offset()), {\r\n width: this.$el[0].offsetWidth,\r\n height: this.$el[0].offsetHeight\r\n });\r\n },\r\n setContent: function () {\r\n var $popup = this.popup();\r\n var content = this.getContent();\r\n $popup.find('.content')[this.options.html ? 'html' : 'text'](content);\r\n },\r\n getContent: function () {\r\n // content can be a string or a function\r\n return typeof this.options.content === 'function' ? this.options.content.call(this.$el[0]) : this.options.content;\r\n },\r\n popup: function () {\r\n // create element if it does not exist\r\n if (!this.$popup) {\r\n this.$popup = $(this.options.popupTemplate)\r\n .addClass(this.options.placement);\r\n if (this.options.variant) {\r\n this.$popup.addClass(this.options.variant);\r\n }\r\n if (this.options.width) {\r\n this.$popup.css('width', this.options.width);\r\n }\r\n //this.$popup.insertAfter(this.$el);\r\n this.$popup.appendTo(document.body);\r\n }\r\n return this.$popup;\r\n },\r\n destroy: function () {\r\n //this.hide();\r\n switch (this.options.trigger) {\r\n case 'click':\r\n // toggle popup on click of target element\r\n this.$el.off(\"click.\" + this.type);\r\n break;\r\n case 'hover':\r\n this.$el.off(\"mouseenter.\" + this.type);\r\n this.$el.off(\"mouseleave.\" + this.type);\r\n break;\r\n case 'focus':\r\n // for use with input fields\r\n this.$el.off(\"focus.\" + this.type);\r\n this.$el.off(\"blur.\" + this.type);\r\n // close on tab out\r\n this.$el.off(\"keydown.\" + this.type);\r\n // close on external click\r\n $('html').off(\"mousedown.\" + this.type);\r\n break;\r\n }\r\n this.$el.data('trppopup', null);\r\n //DK quick fix to stop our logs filling up\r\n if (this.$popup != null) {\r\n this.$popup.remove();\r\n this.$popup = null;\r\n }\r\n }\r\n };\r\n /* trppopup PLUGIN DEFINITION\r\n * ========================= */\r\n $.fn.trppopup = function (option) {\r\n return this.each(function () {\r\n var $this = $(this);\r\n var options = typeof option === 'object' && option;\r\n var data = $this.data('trppopup');\r\n if (!data) {\r\n $this.data('trppopup', (data = new Trppopup(this, options)));\r\n }\r\n if (typeof option === 'string') {\r\n data[option]();\r\n }\r\n });\r\n };\r\n $.fn.trppopup.Constructor = Trppopup;\r\n $.fn.trppopup.defaults = {\r\n trigger: 'focus',\r\n placement: 'bottom',\r\n popupTemplate: '
',\r\n variant: '',\r\n content: '',\r\n html: true,\r\n width: null,\r\n hideOnBlur: false\r\n };\r\n })(jQuery);\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .service('breadcrumbDetailsService', breadcrumbDetailsService);\r\n function breadcrumbDetailsService(resourceService, tripService, $routeParams, basketService) {\r\n var service = {\r\n getClasses: getClasses,\r\n getText: getText,\r\n getCrumbs: getCrumbs,\r\n getTextShort: getTextShort\r\n };\r\n function getClasses(bc) {\r\n return function (c) {\r\n var currentCrumb = basketService.isFlightPreselected() && bc.crumb === 10 ? 25 : bc.crumb;\r\n return c < currentCrumb ? 'done' : c === currentCrumb ? 'is-active' : '';\r\n };\r\n }\r\n function getText() {\r\n return {\r\n 0: resourceService.getDeferred('BREADCRUMBHOME'),\r\n 5: resourceService.getDeferred('BREADCRUMBDEAL'),\r\n 10: resourceService.getDeferred('BREADCRUMBFLIGHT'),\r\n 20: resourceService.getDeferred('BREADCRUMBHOTEL'),\r\n 21: resourceService.getDeferred('BREADCRUMBROOM'),\r\n 25: resourceService.getDeferred('BREADCRUMBCHANGEFLIGHT'),\r\n 30: resourceService.getDeferred('BREADCRUMBTRANSFER'),\r\n 35: resourceService.getDeferred('BREADCRUMBPARKING'),\r\n 40: resourceService.getDeferred('BREADCRUMBEXTRAS'),\r\n 50: resourceService.getDeferred('BREADCRUMBPAYMENT')\r\n };\r\n }\r\n function getTextShort() {\r\n return {\r\n 0: resourceService.getDeferred('BREADCRUMBHOMESHORT'),\r\n 20: resourceService.getDeferred('BREADCRUMBHOTELSHORT'),\r\n 21: resourceService.getDeferred('BREADCRUMBROOMSHORT'),\r\n 25: resourceService.getDeferred('BREADCRUMBCHANGEFLIGHTSHORT'),\r\n 40: resourceService.getDeferred('BREADCRUMBEXTRASSHORT'),\r\n 50: resourceService.getDeferred('BREADCRUMBPAYMENTSHORT')\r\n };\r\n }\r\n function getCrumbs() {\r\n return tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n if (trip && trip.Deal) {\r\n return [5, 21, 50];\r\n }\r\n if (!trip.FlightsRequest.SelectedFlight) {\r\n return [];\r\n }\r\n if ((basketService.isFlightPreselected() && trip.TripType === tripService.tripTypes.Holiday) ||\r\n TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\r\n var destination = trip.HotelsRequest.Destination;\r\n return destination.Type === 1 && destination.HotelCount && destination.HotelCount > 0\r\n ? [0, 21, 25, 40, 50]\r\n : [0, 20, 21, 25, 40, 50];\r\n }\r\n switch (trip.TripType) {\r\n case 1://flight\r\n return [0, 10, 40, 50];\r\n case 2://hotel\r\n return [0, 20, 21, 50];\r\n case 3://transfer\r\n return [0, 30, 50];\r\n case 4://holiday\r\n return [0, 10, 20, 21, 40, 50];\r\n case 5:// marhaba\r\n return []; // ?\r\n case 6:// parking\r\n return [0, 35, 50];\r\n default:\r\n return [];\r\n }\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n/**\r\n * Created by bdickson on 04/12/2015.\r\n */\r\nvar TR;\r\n(function (TR) {\r\n var TrustpilotService = /** @class */ (function () {\r\n function TrustpilotService($http, loggingService) {\r\n this.$http = $http;\r\n this.loggingService = loggingService;\r\n this.apiRootUrl = 'https://api.trustpilot.com/v1/business-units/' + TRPCONFIG.Domain.TrustPilotId;\r\n this.apiKey = TRPCONFIG.Domain.TrustPilotAPIKey;\r\n }\r\n TrustpilotService.prototype.getJsonp = function (url) {\r\n var _this = this;\r\n url += (url.indexOf('?') === -1) ? '?' : '&';\r\n url += 'apikey=' + this.apiKey;\r\n return this.$http.jsonp(url + '&callback=JSON_CALLBACK', { ignoreErrors: true, cache: true })\r\n .then(function (res) {\r\n if (res && angular.isObject(res.data)) {\r\n return res.data;\r\n }\r\n return {};\r\n }, function (err) {\r\n _this.loggingService\r\n .logWarn(\"Trustpilot api call failed with following response \" + JSON.stringify(err));\r\n return {\r\n reviews: []\r\n };\r\n });\r\n };\r\n TrustpilotService.prototype.getBusinessUnit = function () {\r\n return this.getJsonp(this.apiRootUrl);\r\n };\r\n return TrustpilotService;\r\n }());\r\n TR.TrustpilotService = TrustpilotService;\r\n angular.module('TR').service('TrustpilotService', TrustpilotService);\r\n})(TR || (TR = {}));\r\nvar Attractions;\r\n(function (Attractions_1) {\r\n var Attractions = /** @class */ (function () {\r\n function Attractions($routeParams, $scope, attractionDetailsService, basketService, basketStore, dateUtil, tripService, broker) {\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.attractionDetailsService = attractionDetailsService;\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.dateUtil = dateUtil;\r\n this.tripService = tripService;\r\n this.broker = broker;\r\n this.attractions = {\r\n selected: [],\r\n occupancy: {}\r\n };\r\n this.attractionsAvailabilityBusy = true;\r\n var at = this;\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n var basketId = trip.BasketId, tripId = trip.TripId, attractionSearchId = trip.AttractionRequest ? trip.AttractionRequest.AvailabilitySearchId : null;\r\n at.destination = trip.HotelsRequest && trip.HotelsRequest.Destination ?\r\n trip.HotelsRequest.Destination['Title'] : '';\r\n basketStore.attraction(basketId).then(function (results) {\r\n var occupancyMap = {}, \r\n // Extras attractions format is one product entry with nested data for multiples\r\n products = results && results[0];\r\n if (products) {\r\n at.attractions = {\r\n selected: angular.copy(products.Details.AttractionIds),\r\n occupancy: angular.copy(products.Details.AttractionRequests)\r\n };\r\n }\r\n if (TRPCONFIG.Domain.AttractionsExtraEnabled || TRPCONFIG.Domain.AttractionsExtraMobileEnabled) {\r\n basketStore.flight(basketId).then(function (flight) {\r\n var flightDate = _.get(flight, 'Details.Itinerary.DepartureDate');\r\n var dateDiff = dateUtil.dayDiff(flightDate, new Date());\r\n if (dateDiff >= TRPCONFIG.MinDaysBeforeDeparture || at.isHotelJourney) {\r\n basketService.getAttractionQuotes(attractionSearchId, basketId, tripId)\r\n .then(function (attractionQuotes) {\r\n at.attractionQuotes = attractionQuotes;\r\n at.cheapestAttraction = attractionQuotes[0];\r\n at.attractionsAvailabilityBusy = false;\r\n at.cheapestAttraction = getCheapest(at.attractionQuotes);\r\n function getCheapest(quotes) {\r\n var hasAdult = _.filter(quotes, function (a) {\r\n return a.Prices[0].Price > 0;\r\n });\r\n return _.minBy(hasAdult, function (a) {\r\n return a.Prices[0].Price;\r\n });\r\n }\r\n _updateSubtitle();\r\n var stopAttractionWatch = $scope.$watch('at.attractions', _attractionsWatch, true);\r\n angular.forEach(attractionQuotes, function (a) {\r\n occupancyMap[a.AttractionId] = at.attractions.occupancy[a.AttractionId] || {\r\n Adult: a.Prices[0].Count,\r\n Child: a.Prices[1].Count,\r\n Infant: a.Prices[2].Count\r\n };\r\n });\r\n // angular copy throwing digest loops in ie9, ie10\r\n at.attractions.occupancy = $.extend(true, {}, occupancyMap);\r\n function _attractionsWatch(val, oldval) {\r\n if (val == null || angular.equals(val, oldval) || !val.selected) {\r\n return;\r\n }\r\n if (val.selected.length > 0 && _validateAttractionOccupancy(val, oldval)) {\r\n tripService.getTrip(tripId).then(function (t) {\r\n attractionSearchId = t.AttractionRequest.AvailabilitySearchId;\r\n basketStore.putAttractionExtras(attractionSearchId, val, basketId)\r\n .then(function () { return basketService.updateBasket(); })\r\n .then(function () { return basketStore.attractionCost(basketId); })\r\n .then(function (cost) {\r\n at.attractionsTotal = cost;\r\n _updateSubtitle();\r\n });\r\n });\r\n }\r\n else {\r\n basketStore.removeAttraction(basketId).then(basketService.updateBasket);\r\n at.attractionsTotal = 0;\r\n _updateSubtitle();\r\n }\r\n }\r\n function _validateAttractionOccupancy(val, oldval) {\r\n var selectedOriginal = angular.copy(val);\r\n var valid = false;\r\n var occupacyChange = false;\r\n angular.forEach(selectedOriginal.selected, function (attractionId, index) {\r\n var attrOcc = val.occupancy[attractionId];\r\n occupacyChange = _.some(attrOcc, function (occ, type) { return type !== 'Infant' && occ; });\r\n if (occupacyChange) {\r\n valid = true;\r\n }\r\n else {\r\n if (val.selected.length <= oldval.selected.length) {\r\n val.selected.splice(index, 1);\r\n }\r\n stopAttractionWatch();\r\n var attrOccu = occupancyMap[attractionId];\r\n val.occupancy[attractionId] = angular.copy(attrOccu);\r\n stopAttractionWatch = $scope.$watch('at.attractions', _attractionsWatch, true);\r\n }\r\n });\r\n return valid;\r\n }\r\n });\r\n basketStore.attractionCost(basketId).then(function (cost) {\r\n at.attractionsTotal = cost;\r\n });\r\n }\r\n else {\r\n at.attractionsAvailabilityBusy = false;\r\n }\r\n });\r\n }\r\n }).then(null, basketService.restartHolidayWorkflow);\r\n function _updateSubtitle() {\r\n var subTitle = '';\r\n if (at.attractionQuotes && at.attractions.selected.length) {\r\n angular.forEach(at.attractions.selected, function (id) {\r\n var quote = _.find(at.attractionQuotes, function (a) { return id === a.AttractionId; });\r\n if (quote) {\r\n subTitle += quote.ShortTitle + '
';\r\n }\r\n });\r\n }\r\n at.attractionsDescription = subTitle;\r\n }\r\n }, basketService.bookingAlreadyDone(\"attractions: '\" + $routeParams.tripId + \"'\"));\r\n at.getImageUrl = attractionDetailsService.getImageUrl;\r\n at.toggleResults = function (e) {\r\n e.preventDefault();\r\n at.showResults = !at.showResults;\r\n at.state.showInformation = false;\r\n };\r\n at.state = {\r\n showInformation: false,\r\n informationRequested: false,\r\n informationLoaded: false\r\n };\r\n at.viewInformation = function (e, id) {\r\n e.preventDefault();\r\n at.informationPath = 'partials/holidays/attractionmoreinformation/' + id;\r\n at.state.showInformation = true;\r\n broker.publish('attractionsInformationRequested');\r\n };\r\n at.viewWhatsIncluded = function (e, id) {\r\n e.preventDefault();\r\n at.informationPath = \"partials/holidays/attractionwhatsincluded/\" + id;\r\n at.state.showInformation = true;\r\n broker.publish('attractionsInformationRequested');\r\n };\r\n at.$scope.$on('$includeContentRequested', function (args) {\r\n at.state.informationRequested = true;\r\n at.state.informationLoaded = false;\r\n });\r\n at.$scope.$on('$includeContentLoaded', function (args) {\r\n at.state.informationLoaded = true;\r\n });\r\n at.viewResults = function (e) {\r\n e.preventDefault();\r\n at.state.showInformation = false;\r\n };\r\n }\r\n return Attractions;\r\n }());\r\n angular\r\n .module('attractions')\r\n .controller('Attractions', Attractions);\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var BasketItem = /** @class */ (function () {\r\n function BasketItem(responseData, attractionService) {\r\n this.attractionService = attractionService;\r\n // UI\r\n this.Changes = {};\r\n this.Totals = {};\r\n this.Validity = {};\r\n angular.extend(this, responseData);\r\n this.orderTickets();\r\n this.updateTotals();\r\n this.setDates();\r\n }\r\n BasketItem.prototype.onChange = function (changes) {\r\n angular.extend(this.Changes, changes);\r\n this.updateTotals();\r\n };\r\n BasketItem.prototype.orderTickets = function () {\r\n var order = {};\r\n this.Tickets.forEach(function (o) {\r\n var key = o.Key;\r\n order[key] = /adult/.test(key) ? 0 :\r\n /:child/.test(key) ? 1 : 2; // i.e. not ':youngchild'\r\n });\r\n this.Tickets.sort(function (a, b) {\r\n return order[a.Key] < order[b.Key] ? -1 :\r\n order[a.Key] > order[b.Key] ? 1 : 0;\r\n });\r\n };\r\n BasketItem.prototype.flushChanges = function () {\r\n var changes = this.Changes;\r\n this.Changes = {};\r\n return changes;\r\n };\r\n BasketItem.prototype.updateTotals = function () {\r\n var _this = this;\r\n this.Totals = { total: 0 };\r\n this.Tickets.forEach(function (o) {\r\n var amount = Number(o.Value || 0) * Number(o.Price || 0);\r\n _this.Totals[o.Key] = amount;\r\n _this.Totals.total += amount;\r\n });\r\n };\r\n BasketItem.prototype.setDates = function () {\r\n var dates = this.attractionService.getLineItemDates(this);\r\n this.SelectedDate = dates.selected;\r\n this.Validity = dates.from && dates.to\r\n ? { from: dates.from, to: dates.to } : null;\r\n };\r\n return BasketItem;\r\n }());\r\n var AttractionsBasket = /** @class */ (function () {\r\n function AttractionsBasket($scope, $timeout, $routeParams, $location, $http, attractionService, basketService, basketStore, broker, attractionDetailsService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.$routeParams = $routeParams;\r\n this.$location = $location;\r\n this.$http = $http;\r\n this.attractionService = attractionService;\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.broker = broker;\r\n this.attractionDetailsService = attractionDetailsService;\r\n this.items = [];\r\n this.totalPrice = 0;\r\n this.initialising = true;\r\n this.loading = false;\r\n this.error = false;\r\n this.debouncedUpdate = _.debounce(function (p) { return _this.update(p); }, 400);\r\n basketStore.getAttractionsBasket()\r\n .then(function (basket) {\r\n _this.basketId = basket.BasketId;\r\n _this.setBasketItems(basket.LineItems);\r\n _this.initialising = false;\r\n });\r\n }\r\n AttractionsBasket.prototype.setBasketItems = function (lineItems) {\r\n var _this = this;\r\n if (lineItems === void 0) { lineItems = []; }\r\n this.items = [];\r\n if (lineItems.length) {\r\n lineItems.forEach(function (lineItem) {\r\n var item = new BasketItem(lineItem, _this.attractionService);\r\n item.Tickets.forEach(function (ticket) {\r\n _this.$scope.$watch(function () { return ticket.Value; }, function (v, oldV) {\r\n if (v != null && v !== oldV && !_this.error) {\r\n item.onChange((_a = {},\r\n _a[ticket.Key] = v,\r\n _a));\r\n _this.updateTotalPrice();\r\n _this.debouncedUpdate(item);\r\n }\r\n var _a;\r\n });\r\n });\r\n _this.items.push(item);\r\n });\r\n }\r\n this.updateTotalPrice();\r\n this.broker.publish('attractionsBasketUpdated');\r\n };\r\n AttractionsBasket.prototype.update = function (item) {\r\n var _this = this;\r\n // Do nothing if no tickets remain selected\r\n if (this.totalPrice) {\r\n this.loading = true;\r\n this.basketStore.updateAttraction(item.LineItemId, item.flushChanges(), this.basketId).then(function (res) {\r\n if (res.error) {\r\n _this.error = true;\r\n return;\r\n }\r\n _this.error = false;\r\n _this.loading = false;\r\n var basket = res.Basket;\r\n _this.setBasketItems(basket && basket.LineItems);\r\n });\r\n }\r\n };\r\n AttractionsBasket.prototype.remove = function (item) {\r\n var _this = this;\r\n this.basketStore.removeAttractionsLineItem(item.LineItemId, this.basketId).then(function (res) {\r\n if (res.error) {\r\n _this.error = true;\r\n return;\r\n }\r\n _this.error = false;\r\n var basket = res.Basket;\r\n _this.setBasketItems(basket && basket.LineItems);\r\n });\r\n };\r\n AttractionsBasket.prototype.updateTotalPrice = function () {\r\n this.totalPrice = this.items.reduce(function (prev, item) { return prev + item.Totals.total; }, 0);\r\n };\r\n AttractionsBasket.prototype.book = function () {\r\n if (this.totalPrice && !this.error) {\r\n this.loading = true;\r\n this.basketService.bookAttractionsBasket();\r\n }\r\n };\r\n return AttractionsBasket;\r\n }());\r\n angular\r\n .module('attractions')\r\n .controller('AttractionsBasket', AttractionsBasket);\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var AttractionsBasketModal = /** @class */ (function () {\r\n function AttractionsBasketModal($location, $scope, modalService, broker) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$scope = $scope;\r\n this.modalService = modalService;\r\n this.broker = broker;\r\n broker.subscribe('AttractionsBasketModal', 'modal:ready', function () {\r\n _this.total = modalService.get('total');\r\n _this.lineItems = modalService.get('lineItems');\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('AttractionsBasketModal');\r\n });\r\n }\r\n AttractionsBasketModal.prototype.continueShopping = function () {\r\n this.modalService.close();\r\n };\r\n AttractionsBasketModal.prototype.viewBasket = function () {\r\n this.$location.path('attractions/basket');\r\n };\r\n return AttractionsBasketModal;\r\n }());\r\n angular\r\n .module('attractions')\r\n .controller('AttractionsBasketModal', AttractionsBasketModal);\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var AttractionsHeaderPanel = /** @class */ (function () {\r\n function AttractionsHeaderPanel($location, $scope, productService, broker) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$scope = $scope;\r\n this.productService = productService;\r\n this.broker = broker;\r\n // Attributes\r\n this.product = this.product();\r\n this.debouncedUpdateTeaserPrice = _.debounce(function (p) { return _this.updateTeaserPrice(p); }, 100);\r\n if (!this.chooseAgainUrl) {\r\n this.chooseAgainUrl = 'attractions';\r\n }\r\n var qsTags = $location.search();\r\n if (qsTags) {\r\n angular.extend(this.product, { Tags: qsTags });\r\n }\r\n broker.subscribe('attractionsHeaderPanel', 'attractionsProductUpdate', function (res) { return _this.debouncedUpdateTeaserPrice({ Tags: res.data }); });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('attractionsHeaderPanel');\r\n });\r\n }\r\n AttractionsHeaderPanel.prototype.updateTeaserPrice = function (productData) {\r\n var _this = this;\r\n if (this.product) {\r\n var date = _.get(productData, 'Tags.date', null);\r\n var product = angular.extend({\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Currency: TRPCONFIG.Domain.CurrencyCode\r\n }, this.product, date === null ? { Tags: _.omit(productData.Tags, ('date')) } : productData);\r\n this.productService.getTeaserPrices('attraction', [product])\r\n .then(function (res) {\r\n var resKey = Object.keys(res)[0];\r\n if (resKey) {\r\n var first = res[resKey];\r\n var adultPrice = _.find(first.Prices, { Type: 'Adult' });\r\n var price = adultPrice || (Array.isArray(first.Prices) && first.Prices.length\r\n ? first.Prices[0] : null);\r\n _this.teaserPrice = price && price.Price;\r\n }\r\n });\r\n }\r\n };\r\n return AttractionsHeaderPanel;\r\n }());\r\n angular\r\n .module('attractions')\r\n .directive('attractionsHeaderPanel', function () {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n replace: true,\r\n scope: {},\r\n bindToController: {\r\n product: '&',\r\n productId: '@',\r\n chooseAgainUrl: '@',\r\n panelTitle: '@'\r\n },\r\n controller: AttractionsHeaderPanel,\r\n controllerAs: 'hp',\r\n templateUrl: 'partials/attractions/headerpanel'\r\n };\r\n });\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var AttractionsProductForm = /** @class */ (function () {\r\n function AttractionsProductForm($scope, $timeout, $routeParams, $location, attractionService, attractionSearchValidator, dateUtil, basketService, broker, modalService, Area, resourceService, cmsUtils) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.$routeParams = $routeParams;\r\n this.$location = $location;\r\n this.attractionService = attractionService;\r\n this.attractionSearchValidator = attractionSearchValidator;\r\n this.dateUtil = dateUtil;\r\n this.basketService = basketService;\r\n this.broker = broker;\r\n this.modalService = modalService;\r\n this.Area = Area;\r\n this.resourceService = resourceService;\r\n this.cmsUtils = cmsUtils;\r\n this.stepsData = [];\r\n this.priceData = {};\r\n this.formModel = {};\r\n this.dateLimits = {};\r\n this.initialised = false;\r\n this.loading = false;\r\n this.infoModal = {};\r\n this.infoText = {};\r\n this.normalisedValues = {};\r\n this.areaInfo = Area['attractions'];\r\n this.fetchCriteria();\r\n this.dateLimits = {\r\n startDateMin: this.dateUtil.todayPlus(0, 0, true),\r\n activeDateFrom: this.dateUtil.todayPlus(7, 0, true)\r\n };\r\n this.throttledUpdateTotalPrice = _.throttle(function () { return _this.updateTotalPrice(); }, 100);\r\n this.throttledUpdatePrices = _.throttle(function () { return _this.updatePrices(); }, 100);\r\n broker.subscribe('attractionsProductForm', 'tabProductOptionSelected', function (e) { return _.forEach(e.data || {}, function (v, k) { return _this.changeField(k, v); }); });\r\n // Show spinner if delayed\r\n this.initTimer = $timeout(function () { return _this.loading = true; }, 1000);\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('attractionsProductForm');\r\n });\r\n }\r\n AttractionsProductForm.prototype.fetchCriteria = function () {\r\n var _this = this;\r\n this.attractionService.getProductFormCriteria(this.productId)\r\n .then(function (res) {\r\n var qsTags = _this.$location.search();\r\n if (qsTags) {\r\n angular.extend(_this.formModel, qsTags);\r\n }\r\n _this.$timeout.cancel(_this.initTimer);\r\n _this.initialised = true;\r\n _this.loading = false;\r\n _this.stepsData = res.Steps;\r\n if (Array.isArray(_this.stepsData)) {\r\n _this.stepsData.forEach(function (item) {\r\n _this.mapNormalisedValues(item);\r\n item.Fields.forEach(function (field) {\r\n if (field.Type.toLowerCase() === 'group') {\r\n _this.formModel[field.Key] = 1;\r\n }\r\n });\r\n if (item.Info) {\r\n _this.infoModal[item.Info.ResourceKey] = false;\r\n _this.infoText[item.Info.ResourceKey] = {\r\n header: _this.resourceService.get(item.Info.ResourceKey + ':HEADER'),\r\n body: _this.resourceService.get(item.Info.ResourceKey)\r\n };\r\n }\r\n });\r\n }\r\n });\r\n };\r\n AttractionsProductForm.prototype.setPriceData = function (key, price) {\r\n this.priceData[key] = {\r\n price: price\r\n };\r\n };\r\n AttractionsProductForm.prototype.initField = function (fieldKey, value, allowUnknown) {\r\n // Set initial value, unless already populated\r\n if (this.formModel[fieldKey] == null) {\r\n this.changeField(fieldKey, value, allowUnknown);\r\n }\r\n };\r\n AttractionsProductForm.prototype.changeField = function (fieldKey, value, allowUnknown) {\r\n // NOTE: only allows existing option values unless `allowUnknown` is true\r\n var isUpdate;\r\n if (allowUnknown) {\r\n this.formModel[fieldKey] = value;\r\n isUpdate = true;\r\n }\r\n else {\r\n var existingVal = this.getMatchedValue(value);\r\n if (existingVal != null) {\r\n this.formModel[fieldKey] = existingVal;\r\n isUpdate = true;\r\n }\r\n }\r\n if (isUpdate) {\r\n this.publishUpdate();\r\n this.throttledUpdateTotalPrice();\r\n }\r\n };\r\n AttractionsProductForm.prototype.fieldChangeHandler = function (affectsPrices) {\r\n if (affectsPrices === void 0) { affectsPrices = false; }\r\n this.changeField('date', null, true);\r\n this.publishUpdate();\r\n if (affectsPrices) {\r\n this.throttledUpdatePrices();\r\n }\r\n else {\r\n this.throttledUpdateTotalPrice();\r\n }\r\n };\r\n AttractionsProductForm.prototype.publishUpdate = function () {\r\n this.broker.publish('attractionsProductUpdate', this.formModel);\r\n };\r\n AttractionsProductForm.prototype.mapNormalisedValues = function (step) {\r\n var _this = this;\r\n // Map existing field values for normalised comparison with CMS values\r\n var map = {};\r\n var fields = step.Fields || [];\r\n fields.forEach(function (field) {\r\n if (field.Data) {\r\n field.Data.forEach(function (op) {\r\n map[_this.cmsUtils.normaliseValue(op.Value)] = op.Value;\r\n });\r\n }\r\n });\r\n angular.extend(this.normalisedValues, map);\r\n };\r\n AttractionsProductForm.prototype.getMatchedValue = function (value) {\r\n return this.normalisedValues[this.cmsUtils.normaliseValue(value)];\r\n };\r\n AttractionsProductForm.prototype.isDateMatch = function (d1, d2) {\r\n if (d1 === void 0) { d1 = ''; }\r\n if (d2 === void 0) { d2 = ''; }\r\n // Dates may or may not end with '.000Z'\r\n return d1.split('.')[0] === d2.split('.')[0];\r\n };\r\n AttractionsProductForm.prototype.updatePrices = function () {\r\n var _this = this;\r\n if (this.formModel.date) {\r\n this.loading = true;\r\n this.attractionService.getAvailability(this.productId, angular.extend({}, this.formModel))\r\n .then(function (res) {\r\n if (res.error) {\r\n _this.totalPrice = 0;\r\n }\r\n else {\r\n _this.loading = false;\r\n res.Dates.forEach(function (o) {\r\n if (_this.isDateMatch(o.Date, _this.formModel.date)) {\r\n o.Tickets.forEach(function (d) {\r\n _this.setPriceData(d.Key, d.Price);\r\n });\r\n }\r\n });\r\n _this.throttledUpdateTotalPrice();\r\n }\r\n });\r\n }\r\n };\r\n AttractionsProductForm.prototype.updateTotalPrice = function () {\r\n var _this = this;\r\n var total = 0;\r\n _.each(this.formModel, function (v, k) {\r\n var priceData = _this.priceData[k], price = priceData && priceData.price;\r\n if (price) {\r\n total += (price * v);\r\n }\r\n });\r\n this.$scope.$evalAsync(function () {\r\n _this.totalPrice = total;\r\n });\r\n };\r\n AttractionsProductForm.prototype.book = function () {\r\n var _this = this;\r\n var errors = this.attractionSearchValidator.validate(this.formModel);\r\n if (errors.length) {\r\n this.$scope.$emit('flash:error', errors);\r\n }\r\n else {\r\n this.loading = true;\r\n this.$scope.$emit('flash:hide');\r\n this.basketService.startWorkflow(this.areaInfo.flow, {\r\n productId: this.productId,\r\n productTags: this.formModel\r\n })\r\n .then(function (lineItems) {\r\n _this.loading = false;\r\n _this.modalService.launch('partials/attractions/BasketModal', {\r\n lineItems: lineItems,\r\n total: _this.attractionService.getProductTotals(lineItems).price\r\n });\r\n });\r\n }\r\n };\r\n return AttractionsProductForm;\r\n }());\r\n angular\r\n .module('attractions')\r\n .directive('attractionsProductForm', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n bindToController: {\r\n productId: '@' // From CMS\r\n },\r\n controller: AttractionsProductForm,\r\n controllerAs: 'pf',\r\n templateUrl: 'partials/attractions/productform'\r\n };\r\n });\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var KEY_ENTER = 13;\r\n var AttractionsSearch = /** @class */ (function (_super) {\r\n __extends(AttractionsSearch, _super);\r\n function AttractionsSearch($scope, $element, $parse, $route, autocompleter, resourceService, attractionService, $location, $q) {\r\n var _this = _super.call(this) || this;\r\n _this.$scope = $scope;\r\n _this.$element = $element;\r\n _this.$parse = $parse;\r\n _this.$route = $route;\r\n _this.autocompleter = autocompleter;\r\n _this.resourceService = resourceService;\r\n _this.attractionService = attractionService;\r\n _this.$location = $location;\r\n _this.$q = $q;\r\n _this.areaOverride = 'attractions';\r\n // Watch for initial value\r\n var unwatchInit = _this.$scope.$watch('ac.currentValue', function (item) {\r\n if (item && item.Title) {\r\n _this.prefix = item.Title;\r\n unwatchInit();\r\n }\r\n });\r\n // Wrap `select` attribute fn\r\n _this.selectAttrFn = _this.select;\r\n _this.select = function (item) {\r\n _this.selectAttrFn({ item: item });\r\n _this.selectItem(item);\r\n };\r\n $scope.$on('fieldOptionSelected', function (e, data) {\r\n _this.selectedData = data;\r\n });\r\n return _this;\r\n }\r\n AttractionsSearch.prototype.search = function () {\r\n if (this.selectedData) {\r\n this.attractionService.trackAttractionSearch(this.searchId, this.selectedData.Id, this.selectedData.Title);\r\n this.selectedData.Route ? this.$location.url(this.selectedData.Route) : this.showError(null);\r\n }\r\n else {\r\n if (this.inputField && this.inputField.val().length) {\r\n this.automaticSearch();\r\n }\r\n else {\r\n this.showError(null);\r\n }\r\n }\r\n };\r\n AttractionsSearch.prototype.automaticSearch = function () {\r\n var _this = this;\r\n if (this.selectedData) {\r\n this.search();\r\n }\r\n else {\r\n this.fetch().then(function (res) {\r\n _this.update(res);\r\n if (_this.data) {\r\n _this.selectedData = _this.data[0];\r\n _this.search();\r\n }\r\n else {\r\n _this.showError(null);\r\n }\r\n });\r\n }\r\n };\r\n AttractionsSearch.prototype.update = function (result) {\r\n var options = result.data.Results;\r\n if (this.selectedData) {\r\n /// On update reset previously selected data.\r\n this.selectedData = null;\r\n }\r\n if (options.length) {\r\n this.searchId = result.data.SearchId;\r\n this.data = options.map(function (item) {\r\n return {\r\n Title: item.Name,\r\n Id: item.Id,\r\n Value: item.Value,\r\n Route: item.Route\r\n };\r\n });\r\n }\r\n else {\r\n this.data = null;\r\n //this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\r\n }\r\n };\r\n AttractionsSearch.prototype.selectItem = function (item) {\r\n if (item && item.Title) {\r\n this.prefix = item.Title;\r\n }\r\n };\r\n AttractionsSearch.prototype.showError = function (e) {\r\n this.$scope.$emit('flash:error', this.resourceService.get('NOATTRACTIONURL'));\r\n };\r\n return AttractionsSearch;\r\n }(Autocompleter.AutocompleterField));\r\n angular\r\n .module('TR')\r\n .directive('attractionsSearch', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'ac',\r\n bindToController: {\r\n placeholder: '@',\r\n select: '&',\r\n deselect: '&',\r\n currentValue: '=',\r\n areaOverride: '@',\r\n focusTracker: '=',\r\n minPrefix: '@',\r\n notActive: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=AttractionsAutocompleter',\r\n controller: AttractionsSearch,\r\n transclude: true,\r\n compile: function (el, attrs, transclude) {\r\n return function ($scope) {\r\n transclude($scope, function (clone) {\r\n el.append(clone);\r\n $scope.ac.inputField = el.find('input');\r\n $scope.ac.inputField.on('keyup', function (e) {\r\n if (KEY_ENTER === e.keyCode && $scope.ac.inputField.val().length > 2) {\r\n $scope.ac.automaticSearch();\r\n }\r\n else {\r\n $scope.ac.selectedData = null;\r\n }\r\n });\r\n });\r\n };\r\n }\r\n };\r\n });\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n var ShowBeforeOrAfter;\r\n (function (ShowBeforeOrAfter) {\r\n ShowBeforeOrAfter[ShowBeforeOrAfter[\"Both\"] = 0] = \"Both\";\r\n ShowBeforeOrAfter[ShowBeforeOrAfter[\"Before\"] = 1] = \"Before\";\r\n ShowBeforeOrAfter[ShowBeforeOrAfter[\"After\"] = 2] = \"After\";\r\n })(ShowBeforeOrAfter || (ShowBeforeOrAfter = {}));\r\n ;\r\n ;\r\n var ThemeParkCombo = /** @class */ (function () {\r\n function ThemeParkCombo() {\r\n this.showMobileFilters = false;\r\n this.pricesSorted = false;\r\n this.afterDateVal = '2017-05-01T00:00:00.000Z';\r\n this.afterDate = false; // Value of the toggle filter\r\n this.isAfterDate = false; // True if today is actually after the afterDateVal\r\n this.hasItems = true;\r\n this.isAfterDate = this.checkIsAfterDate();\r\n this.comboFilters = [\r\n { id: 1,\r\n img: 'disney_logos/WDW-blk.jpg',\r\n title: 'Walt Disney World Resort',\r\n included: [\r\n { img: 'disney_logos/Disneys_Magic_Kingdom.jpg',\r\n title: 'Magic Kingdom',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'disney_logos/Disneys_Animal_Kingdom.jpg',\r\n title: 'Animal Kingdom',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'disney_logos/Disneys_Epcot.jpg',\r\n title: 'Epcot',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'disney_logos/Disneys_Blizzard_Beach.jpg',\r\n title: 'Blizzard Beach Water Park',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'disney_logos/Disneys_Hollywood_Studios.jpg',\r\n title: 'Disney\\'s Hollywood Studios',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'disney_logos/Disneys_Typhoon_Lagoon.jpg',\r\n title: 'Typhoon Lagoon Water Park',\r\n available: ShowBeforeOrAfter.Both\r\n }\r\n ]\r\n },\r\n { id: 2,\r\n img: 'seaworld_logos/SeaWorld-All.jpg',\r\n title: 'SeaWorld Parks',\r\n included: [\r\n { img: 'seaworld_logos/SeaWorld.jpg',\r\n title: 'SeaWorld',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'seaworld_logos/Busch_Gardens.jpg',\r\n title: 'Busch Gardens',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'seaworld_logos/Aquatica.jpg',\r\n title: 'Aquatica',\r\n available: ShowBeforeOrAfter.Both\r\n }\r\n ]\r\n },\r\n { id: 3,\r\n img: 'universal_logos/Universal_Studios.png',\r\n title: 'Universal Orlando Resort™',\r\n included: [\r\n { img: 'universal_logos/universal-studios-florida.png',\r\n title: 'Universal Studios Florida™',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'universal_logos/Universal_Island_of_Adventure.jpg',\r\n title: 'Universal\\'s Islands Of Adventure™',\r\n available: ShowBeforeOrAfter.Both\r\n },\r\n { img: 'universal_logos/Universal_Volcano_Bay.jpg',\r\n title: 'Universal\\'s Volcano Bay™',\r\n available: ShowBeforeOrAfter.After\r\n }\r\n ]\r\n },\r\n { id: 4,\r\n img: 'legoland/Legoland.jpg',\r\n title: 'LEGOLAND Florida Resort',\r\n included: []\r\n },\r\n { id: 5,\r\n img: 'kennedy-space-center/kennedy-space-center.jpg',\r\n title: 'Kennedy Space Center',\r\n included: []\r\n }\r\n ];\r\n }\r\n ThemeParkCombo.prototype.getItems = function () {\r\n var _this = this;\r\n if (!this.pricesSorted) {\r\n this.pricesSorted = true;\r\n this.comboItems.map(function (item) {\r\n return item.Prices = item.Prices.sort(function (a, b) {\r\n return a.Type.toLowerCase() === 'adult' ? -1 : 1;\r\n });\r\n });\r\n }\r\n var selectedParkIds = _.map(this.checkedFilters, function (val, key) {\r\n return val ? parseInt(key, 10) : 0;\r\n }).filter(function (val) { return val > 0; });\r\n var beforeOrAfterItems = this.comboItems.filter(function (item) {\r\n return (item.ShowBeforeOrAfter === ShowBeforeOrAfter.Both)\r\n || (item.ShowBeforeOrAfter === ShowBeforeOrAfter.Before && !_this.afterDate)\r\n || (item.ShowBeforeOrAfter === ShowBeforeOrAfter.After && _this.afterDate);\r\n });\r\n var filteredItems = !selectedParkIds.length ? beforeOrAfterItems :\r\n beforeOrAfterItems.filter(function (item) {\r\n var filterId = item.ParksIncluded\r\n .reduce(function (res, val) { return res | Math.pow(2, val - 1); }, 0);\r\n return selectedParkIds\r\n .map(function (parkId) { return Math.pow(2, parkId - 1) & filterId; })\r\n .every(function (parkFilterId) { return parkFilterId > 0; });\r\n });\r\n this.hasItems = filteredItems.length > 0;\r\n return filteredItems;\r\n };\r\n ThemeParkCombo.prototype.getFilters = function (limit) {\r\n return (typeof limit === 'number' && limit > 0) ? this.comboFilters.slice(0, limit) : this.comboFilters;\r\n };\r\n ThemeParkCombo.prototype.getFilter = function (num) {\r\n return this.comboFilters[num - 1];\r\n };\r\n ThemeParkCombo.prototype.hasFiltersSelected = function () {\r\n return _.map(this.checkedFilters, function (val, key) { return val; }).some(function (val) { return val; });\r\n };\r\n ThemeParkCombo.prototype.getSelectedFilters = function () {\r\n var _this = this;\r\n return this.comboFilters.filter(function (filter) { return _this.checkedFilters[filter.id]; });\r\n };\r\n ThemeParkCombo.prototype.hasIncludedParksToDisplay = function (included) {\r\n var _this = this;\r\n return included.map(function (i) { return _this.showIncludedPark(i); }).some(function (t) { return t; });\r\n };\r\n ThemeParkCombo.prototype.showIncludedPark = function (item) {\r\n return item.available === ShowBeforeOrAfter.Both\r\n || (item.available === ShowBeforeOrAfter.Before && !(this.afterDate || this.isAfterDate))\r\n || (item.available === ShowBeforeOrAfter.After && (this.afterDate || this.isAfterDate));\r\n };\r\n ThemeParkCombo.prototype.includesPark = function (parkId, comboItem) {\r\n return comboItem.ParksIncluded.indexOf(parkId) > -1;\r\n };\r\n ThemeParkCombo.prototype.includesParkClass = function (parkId, comboItem) {\r\n return this.includesPark(parkId, comboItem) ? 'icon-check' : 'icon-close';\r\n };\r\n ThemeParkCombo.prototype.checkIsAfterDate = function () {\r\n return (new Date()) > (new Date(this.afterDateVal));\r\n };\r\n return ThemeParkCombo;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('themeParkCombo', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {},\r\n bindToController: {\r\n comboItems: '='\r\n },\r\n controller: ThemeParkCombo,\r\n controllerAs: 'tpc',\r\n compile: function (el, attrs, transclude) {\r\n return function ($scope) { return transclude($scope, function (clone) { return el.append(clone); }); };\r\n }\r\n };\r\n });\r\n})(Attractions || (Attractions = {}));\r\nvar Attractions;\r\n(function (Attractions) {\r\n angular\r\n .module('attractions')\r\n .service('attractionService', attractionService);\r\n function attractionService($q, $http, tripService, analytics, dateUtil) {\r\n var domain = TRPCONFIG.Domain, apiUrl = '/api2/attractions', service = {\r\n trackAttractionSearch: trackAttractionSearch,\r\n getProductName: getProductName,\r\n getProductFormCriteria: getProductFormCriteria,\r\n getAvailability: getAvailability,\r\n getProductTotals: getProductTotals,\r\n getLineItemChanges: getLineItemChanges,\r\n getAttractionQuotes: getAttractionQuotes,\r\n getAttractionQuotesFromSession: getAttractionQuotesFromSession,\r\n getOccupancy: getOccupancy,\r\n getLineItemDates: getLineItemDates,\r\n getAttractionsDesc: getAttractionsDesc\r\n };\r\n function getAttractionsDesc(attractions, attractionDetails, id) {\r\n var desc = '';\r\n var prefDate = '';\r\n var product = _.find(attractions, function (a) { return a.Details && a.Details.AttractionRequests[id]; });\r\n var details = _.find(attractionDetails, {\r\n ProductId: id\r\n });\r\n if (product) {\r\n var attractionIds = _.get(product, 'Details.AttractionIds');\r\n var i = attractionIds && attractionIds.indexOf(id);\r\n var cb = product.CostBreakdown;\r\n if (cb && i != null) {\r\n desc = cb[i].Description;\r\n }\r\n if (details) {\r\n prefDate = dateUtil.format(dateUtil.parseDate(details.PreferredDate)) + ', ';\r\n }\r\n }\r\n return prefDate + desc;\r\n }\r\n ;\r\n function trackAttractionSearch(searchId, itemId, itemName) {\r\n return $http.post(apiUrl + '/analytics/autocompleter/selection', {\r\n SearchId: searchId,\r\n SelectedItemId: itemId,\r\n SelectedItemName: itemName\r\n }, { ignoreErrors: true });\r\n }\r\n function getProductName(productId) {\r\n return $http.post(apiUrl + \"/bookingfunnel/getproduct/\" + productId, [], { ignoreErrors: true }).then(function (res) { return res.data; });\r\n }\r\n function getProductFormCriteria(productId) {\r\n return $http.post(apiUrl + '/bookingfunnel/getcriteria/' + productId).then(function (res) { return res.data; });\r\n }\r\n function getAvailability(productId, tags) {\r\n // Standardise date to first of month\r\n var date = new Date(dateUtil.parseDate(tags.date).getTime());\r\n date.setDate(1);\r\n date.setHours(12);\r\n return $http.post(apiUrl + '/bookingfunnel/searchavailability', {\r\n Id: productId,\r\n Tags: angular.extend({}, tags, { date: date }),\r\n DomainId: domain.DomainId,\r\n Currency: domain.CurrencyCode\r\n }, { ignoreErrors: true }).then(function (res) { return res.data; }, function (err) { return ({ error: err }); });\r\n }\r\n function getProductTotals(lineItems) {\r\n var totals = { count: 0, price: 0 };\r\n totals.price = lineItems && lineItems.reduce(function (total, item) {\r\n if (item.Tickets) {\r\n totals.count++;\r\n return total + item.Tickets.reduce(function (t, o) { return t + (o.Price * o.Value); }, 0);\r\n }\r\n }, 0);\r\n return totals;\r\n }\r\n function getLineItemDates(lineItem) {\r\n var dates = {\r\n selected: null,\r\n from: null,\r\n to: null\r\n };\r\n if (lineItem.Description && lineItem.Description.SelectedDate) {\r\n dates.selected = dateUtil.format(lineItem.Description.SelectedDate);\r\n }\r\n var validity = lineItem.Description && lineItem.Description.Validity\r\n ? lineItem.Description.Validity : null;\r\n if (validity) {\r\n var from = dateUtil.format(validity.From);\r\n var to = dateUtil.format(validity.To);\r\n if (from && to && !dateUtil.sameDay(validity.From, validity.To)) {\r\n dates.from = from;\r\n dates.to = to;\r\n }\r\n }\r\n return dates;\r\n }\r\n function getLineItemChanges(basketData) {\r\n // Returns lineItems data indicating basket changes\r\n var lineItems = [], changeData = basketData.Change, modifiedData = changeData && changeData.Modified || [];\r\n modifiedData.forEach(function (modifiedItem) {\r\n var LineItemId = modifiedItem.LineItemId, basketItem = _.find(basketData.Basket.LineItems, {\r\n LineItemId: LineItemId\r\n });\r\n if (basketItem) {\r\n lineItems.push(_mergeTicketChanges(basketItem, modifiedItem));\r\n }\r\n });\r\n return lineItems;\r\n }\r\n function _mergeTicketChanges(basketItem, modifiedData) {\r\n // Merges ticket changes data into basket lineItem data\r\n // Resulting data indicates ticket changes\r\n var lineItem = angular.extend({}, basketItem);\r\n lineItem.Tickets = [];\r\n ['Modified', 'New'].forEach(function (modificationType) {\r\n modifiedData[modificationType].forEach(function (props) {\r\n var basketTicket = _.find(basketItem.Tickets, {\r\n Key: props.Key\r\n });\r\n if (basketTicket) {\r\n lineItem.Tickets.push(angular.extend({}, basketTicket, props));\r\n }\r\n });\r\n });\r\n return lineItem;\r\n }\r\n /*\r\n Attractions extras\r\n */\r\n function getAttractionQuotes(tripId, request) {\r\n var req = angular.extend({\r\n DomainId: domain.DomainId,\r\n Currency: domain.CurrencyCode\r\n }, request);\r\n analytics.startTimer('AttractionsAvailabilityRequest');\r\n return $http.post(apiUrl + '/availability/GetCrossSell', req, { ignoreErrors: true }).then(function (res) {\r\n analytics.endTimer('AttractionsAvailabilityRequest');\r\n tripService.recordAttractionSearch(tripId, request);\r\n return res.data.AttractionQuotes;\r\n });\r\n }\r\n function getAttractionQuotesFromSession(availabilitySearchId) {\r\n return $http.post(apiUrl + '/availability/getfromsession', {\r\n 'AvailabilitySearchId': availabilitySearchId\r\n }, { ignoreErrors: true }).then(function (res) {\r\n return res.data.AttractionQuotes;\r\n });\r\n }\r\n function getOccupancy(tripId) {\r\n return tripService.getTripReducedOccupancy(tripId).then(function (occ) {\r\n var res = [];\r\n for (var i = 0; i < occ.Adults; i++) {\r\n res.push({ Age: 21, Type: 'Adult' });\r\n }\r\n angular.forEach(occ.ChildAges, function (age) {\r\n res.push({\r\n Type: age < 2 ? 'Infant' : 'Child',\r\n Age: age\r\n });\r\n });\r\n return res;\r\n });\r\n }\r\n return service;\r\n }\r\n})(Attractions || (Attractions = {}));\r\nangular\r\n .module('attractions')\r\n .service('attractionDetailsService', attractionDetailsService);\r\nfunction attractionDetailsService($http, $cacheFactory, $q) {\r\n var url = '/api2/attractions/details/', timeout, cacheLabel = 'detailPromiseCache', promiseCache = $cacheFactory.get(cacheLabel) || $cacheFactory(cacheLabel);\r\n var imageUrl = TRPCONFIG.Domain.AttractionsImageUrl;\r\n // var domain = TRPCONFIG.Domain,\r\n var service = {\r\n getAttractionDetails: getAttractionDetails,\r\n getImageUrl: getImageUrl,\r\n rehydrate: rehydrate,\r\n purge: purge\r\n };\r\n function enhanceData(data) {\r\n data.AttractionIds = [];\r\n angular.forEach(data.AttractionRequests, function (r, k) {\r\n data.AttractionIds.push(parseInt(k, 10));\r\n });\r\n return data;\r\n }\r\n function getAttractionDetails(productDetails) {\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n timeout = $q.defer();\r\n return $http.post(url + 'get', productDetails, { ignoreErrors: true, timeout: timeout.promise })\r\n .then(function (res) {\r\n promiseCache.remove(res.data.DetailsSearchId);\r\n timeout = null;\r\n return enhanceData(res.data);\r\n });\r\n }\r\n function rehydrate(detailsSearchId) {\r\n // Retrieve product details from session\r\n if (!promiseCache.get(detailsSearchId)) {\r\n promiseCache.put(detailsSearchId, $http.post(url + 'getfromsession', { DetailsSearchId: detailsSearchId }, { ignoreErrors: true })\r\n .then(function (res) { return enhanceData(res.data); }));\r\n }\r\n return promiseCache.get(detailsSearchId);\r\n }\r\n function purge() {\r\n $cacheFactory.get(cacheLabel).removeAll();\r\n }\r\n function getImageUrl(id) {\r\n return imageUrl + id;\r\n }\r\n return service;\r\n}\r\nvar Attractions;\r\n(function (Attractions) {\r\n var AttractionSearchValidator = /** @class */ (function () {\r\n function AttractionSearchValidator(resourceService) {\r\n this.resourceService = resourceService;\r\n }\r\n AttractionSearchValidator.prototype.validate = function (formModel) {\r\n var errors = [], uiCountTotal = 0;\r\n Object.keys(formModel).forEach(function (k) {\r\n if (/ui:count/.test(k)) {\r\n var v = formModel[k];\r\n if (!isNaN(v)) {\r\n uiCountTotal += v * 1;\r\n }\r\n }\r\n });\r\n if (!uiCountTotal) {\r\n errors.push(this.resourceService.get('ATTRACTIONSSELECTWHO'));\r\n }\r\n if (!formModel.date) {\r\n errors.push(this.resourceService.get('SELECTDATE'));\r\n }\r\n return errors;\r\n };\r\n return AttractionSearchValidator;\r\n }());\r\n angular\r\n .module('attractions')\r\n .service('attractionSearchValidator', AttractionSearchValidator);\r\n})(Attractions || (Attractions = {}));\r\nangular\r\n .module('carHire')\r\n .controller('CarHire', CarHire);\r\nfunction CarHire($filter, $q, $routeParams, $scope, arrayUtil, basketService, basketStore, carHireDetailsService, extraProductsService, scrollService, tripService) {\r\n var ch = this;\r\n ch.noneCarHire = '-1';\r\n ch.currentCarHireLimit = ch.carHireLimit = 5;\r\n ch.DriverAgeConfig = {\r\n Min: 21,\r\n Max: 90\r\n };\r\n var deferred;\r\n var optionOperation;\r\n //Desktop\r\n ch.driverAgeList = arrayUtil.createRange(ch.DriverAgeConfig.Max, ch.DriverAgeConfig.Min);\r\n //DesktopEnd\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n var basketId = trip.BasketId, tripId = trip.TripId, carHireSearchId = trip.CarHireRequest ? trip.CarHireRequest.AvailabilitySearchId : null, onewayonly = trip.FlightsRequest.OneWayOnly;\r\n ch.carHireDriverAge = trip.CarHireRequest ? trip.CarHireRequest.DriverAge : 30;\r\n $q.all([\r\n basketStore.carHire(basketId, $routeParams.productId),\r\n basketStore.rules(basketId, $routeParams.productId),\r\n basketStore.carHireOptions(basketId, $routeParams)\r\n ]).then(function (results) {\r\n var carHire = results[0] ? results[0].Details.CarHireId.CarHireCode : ch.noneCarHire;\r\n ch.basketRules = results[1];\r\n if ((TRPCONFIG.Domain.CarHireEnabled || TRPCONFIG.Domain.CarHireMobileEnabled) && !onewayonly) {\r\n $scope.$watch('ch.carHireDriverAge', _.debounce(function (val, oldVal) {\r\n if (val == null) {\r\n return;\r\n }\r\n ch.carHireBusyAvailability = true;\r\n if (oldVal !== val) {\r\n carHireSearchId = null;\r\n }\r\n deferred = $q.defer();\r\n var processResults = function (carHireQuotes, options) {\r\n ch.carHireQuotes = arrayUtil.sort(carHireQuotes, 'Price');\r\n ch.carHireLimit = 5;\r\n ch.carHireBusyAvailability = false;\r\n if (!ch.carHire) {\r\n ch.carHire = angular.copy(carHire);\r\n ch.carHireSelectedOptions = _normaliseCarHireOptions(options) || [];\r\n }\r\n else {\r\n var quote = arrayUtil.first(ch.carHireQuotes, function (q) {\r\n return q.CarHireId.CarHireCode === ch.carHire;\r\n });\r\n if (!quote) {\r\n ch.carHire = angular.copy(ch.noneCarHire);\r\n }\r\n else {\r\n ch.appendDetails(quote);\r\n }\r\n }\r\n };\r\n if (carHireSearchId == null) {\r\n basketService.getCarQuotes(basketId, tripId, ch.carHireDriverAge)\r\n .then(function (quotes) { return processResults(quotes, results[2]); });\r\n }\r\n else {\r\n basketService.getCarQuotesFromSession(carHireSearchId, 0)\r\n .then(function (quotes) { return processResults(quotes, results[2]); });\r\n }\r\n }, 400));\r\n $scope.$watch('ch.carHire', _selectCar, true);\r\n $scope.$watch('ch.carHireSelectedOptions', optionsWatch, true);\r\n }\r\n }).then(angular.noop, basketService.restartHolidayWorkflow);\r\n ch.appendDetails = function (quote, $event) {\r\n if ($event) {\r\n $event.preventDefault();\r\n }\r\n _.each(ch.carHireQuotes, function (q) {\r\n q.viewDetails = false;\r\n });\r\n if (!quote.Details) {\r\n quote.busy = true;\r\n tripService.getTrip(tripId).then(function (t) {\r\n carHireSearchId = t.CarHireRequest.AvailabilitySearchId;\r\n carHireDetailsService\r\n .getCarDetails({ AvailabilitySearchId: carHireSearchId, CarHireQuote: quote }, true)\r\n .then(function (d) {\r\n quote.viewDetails = true;\r\n quote.Details = d;\r\n quote.busy = false;\r\n quote.showDetailsError = false;\r\n }, function () {\r\n quote.busy = false;\r\n quote.showDetailsError = true;\r\n });\r\n });\r\n }\r\n else {\r\n quote.viewDetails = true;\r\n }\r\n };\r\n ch.hideDetails = function (quote, $event) {\r\n if ($event) {\r\n $event.preventDefault();\r\n }\r\n quote.viewDetails = false;\r\n };\r\n ch.showMoreOrLess = function ($event) {\r\n if ($event) {\r\n $event.preventDefault();\r\n }\r\n var moreCarHireQuotes = ch.currentCarHireLimit !== ch.carHireQuotes.length;\r\n var currentCarHireLimit = moreCarHireQuotes ? ch.carHireQuotes.length : ch.carHireLimit;\r\n if (!moreCarHireQuotes) {\r\n scrollService.scrollTo('#car-hire-product-expander', { animate: true, offset: 70 }).then(function () {\r\n ch.moreCarHireQuotes = false;\r\n ch.currentCarHireLimit = currentCarHireLimit;\r\n });\r\n }\r\n else {\r\n ch.moreCarHireQuotes = true;\r\n ch.currentCarHireLimit = currentCarHireLimit;\r\n }\r\n };\r\n var selectingCar = $q.when();\r\n function _selectCar(val, oldVal) {\r\n if (val == null || val === oldVal) {\r\n return;\r\n }\r\n _updateSubtitle();\r\n if (val !== ch.noneCarHire) {\r\n var quote = arrayUtil.first(ch.carHireQuotes, function (q) {\r\n return q.CarHireId.CarHireCode === val;\r\n });\r\n if (!!quote) {\r\n quote.busy = !quote.Details;\r\n if (!deferred) {\r\n deferred = $q.defer();\r\n }\r\n var select = function () {\r\n return tripService.getTrip(tripId).then(function (t) {\r\n carHireSearchId = t.CarHireRequest.AvailabilitySearchId;\r\n return basketService.selectCar(quote, carHireSearchId, basketId)\r\n .then(function (d) {\r\n ch.carHireSelectedOptions = arrayUtil.filter(ch.carHireSelectedOptions, function (op) {\r\n return op.carHireId === val;\r\n });\r\n quote.Details = d.Details;\r\n quote.showDetailsError = false;\r\n quote.viewDetails = true;\r\n quote.busy = false;\r\n if (deferred) {\r\n deferred.resolve();\r\n }\r\n if (optionOperation) {\r\n optionOperation.then(updateBasketAndCarHireOptions);\r\n }\r\n selectingCar = $q.when();\r\n }, function () {\r\n ch.carHire = angular.copy(ch.noneCarHire);\r\n quote.busy = false;\r\n quote.showDetailsError = true;\r\n });\r\n });\r\n };\r\n selectingCar = selectingCar.then(select);\r\n return selectingCar;\r\n }\r\n ch.carHire = ch.noneCarHire;\r\n }\r\n else {\r\n selectingCar = selectingCar.then(function () {\r\n return basketStore.removeCar(basketId).then(function () {\r\n ch.carHireSelectedOptions = [];\r\n if (deferred) {\r\n deferred.resolve();\r\n }\r\n updateBasketAndCarHireOptions();\r\n });\r\n });\r\n return selectingCar;\r\n }\r\n }\r\n optionOperation = $q.when();\r\n function optionsWatch(selectedOptions, old) {\r\n if (!selectedOptions ||\r\n selectedOptions === old ||\r\n selectedOptions.length === 0 && !!old && old.length > 1) {\r\n return;\r\n }\r\n optionOperation = optionOperation.then(function () {\r\n return selectOptions();\r\n });\r\n function selectOptions() {\r\n if (selectedOptions.length >= 1) {\r\n if (ch.carHire !== selectedOptions[selectedOptions.length - 1].carHireId) {\r\n ch.carHire = selectedOptions[selectedOptions.length - 1].carHireId;\r\n deferred = $q.defer();\r\n selectedOptions = [selectedOptions[selectedOptions.length - 1]];\r\n }\r\n }\r\n ch.carHireSelectedOptions = selectedOptions;\r\n return deferred.promise.then(function () {\r\n return addOrRemoveOption(selectedOptions);\r\n });\r\n }\r\n }\r\n function addOrRemoveOption(selectedOptions) {\r\n if (ch.carHire === ch.noneCarHire) {\r\n return $q.when();\r\n }\r\n return basketStore.carHireOptions(basketId).then(function (basketOptions) {\r\n var boNormal = _normaliseCarHireOptions(basketOptions);\r\n return _missingFrom(boNormal, selectedOptions, updateCarHireOptionsInBasket(basketStore.removeOptions))\r\n .then(function () {\r\n return _missingFrom(selectedOptions, boNormal, updateCarHireOptionsInBasket(basketStore.addOptions))\r\n .then(function () {\r\n return updateBasketAndCarHireOptions();\r\n });\r\n });\r\n });\r\n }\r\n function updateCarHireOptionsInBasket(storeFn) {\r\n return function (options) {\r\n var quote = arrayUtil.first(ch.carHireQuotes, function (q) {\r\n return angular.equals(q.CarHireId.CarHireCode, ch.carHire);\r\n });\r\n if (!quote || !quote.Details) {\r\n return $q.when();\r\n }\r\n return storeFn.call(basketStore, basketStore.productType.CarHire, quote.Details.DetailsSearchId, options, basketId);\r\n };\r\n }\r\n function updateBasketAndCarHireOptions() {\r\n basketService.updateBasket();\r\n return basketStore.carHireOptions(basketId);\r\n }\r\n }, basketService.bookingAlreadyDone(\"carHire: '\" + $routeParams.tripId + \"'\"));\r\n function _missingFrom(src, dst, forall) {\r\n return forall(arrayUtil.map(arrayUtil.filter(src, function (o1) {\r\n return !arrayUtil.any(dst, function (o2) {\r\n return angular.equals(o1, o2);\r\n });\r\n }), function (optionId) {\r\n return { OptionId: optionId.optionId, ChosenQuantity: 1 };\r\n }));\r\n }\r\n ch.filterQuotes = extraProductsService.filterQuotes;\r\n function _normaliseCarHireOptions(bo) {\r\n var res = [];\r\n angular.forEach(bo, function (b) {\r\n res.push({ carHireId: ch.carHire, optionId: b });\r\n });\r\n return res;\r\n }\r\n function _updateSubtitle() {\r\n if (ch.carHireQuotes && ch.carHire) {\r\n var carHireQuote = arrayUtil.first(ch.carHireQuotes, function (c) {\r\n return angular.equals(c.CarHireId.CarHireCode, ch.carHire);\r\n });\r\n ch.carHireQuoteDescription = carHireQuote ?\r\n carHireQuote.Description + ' (' + $filter('customCurrency')(carHireQuote.Price) + ')'\r\n : null;\r\n }\r\n }\r\n}\r\nangular\r\n .module('carHire')\r\n .service('carHireService', carHireService);\r\nfunction carHireService($q, $http, tripService, analytics) {\r\n var domain = TRPCONFIG.Domain, service = {\r\n getCarQuotes: getCarQuotes,\r\n getCarQuotesFromSession: getCarQuotesFromSession\r\n };\r\n var timeout;\r\n function getCarQuotes(tripId, request) {\r\n var req = angular.extend({\r\n DomainId: domain.DomainId,\r\n Currency: domain.CurrencyCode\r\n }, request);\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n timeout = $q.defer();\r\n analytics.startTimer('CarHireAvailabilityRequest');\r\n return $http.post('/api2/carhire/availability/get', req, {\r\n ignoreErrors: true,\r\n timeout: timeout.promise\r\n }).then(function (res) {\r\n analytics.endTimer('CarHireAvailabilityRequest');\r\n tripService.recordCarHireSearch(tripId, request);\r\n timeout = null;\r\n return res.data.CarHireQuotes;\r\n });\r\n }\r\n function getCarQuotesFromSession(request) {\r\n return $http.post('/api2/carhire/availability/getfromsession', request, { ignoreErrors: true }).then(function (res) {\r\n return res.data.CarHireQuotes;\r\n });\r\n }\r\n return service;\r\n}\r\nangular\r\n .module('carHire')\r\n .service('carHireDetailsService', carHireDetailsService);\r\nfunction carHireDetailsService($http, arrayUtil, $cacheFactory, $q, broker) {\r\n var url = '/api2/carhire/details/';\r\n var timeout;\r\n var promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n // var domain = TRPCONFIG.Domain,\r\n var service = {\r\n getCarDetails: getCarDetails,\r\n rehydrate: rehydrate\r\n };\r\n function stringifyOptions(details) {\r\n details.AdditionalOptions = arrayUtil.map(details.AdditionalOptions, function (o) {\r\n o.OptionId = '' + o.OptionId;\r\n return o;\r\n });\r\n return details;\r\n }\r\n function getCarDetails(quote) {\r\n if (!!quote.CarHireQuote.Details) {\r\n return $q.when(quote.CarHireQuote.Details);\r\n }\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n var request = {\r\n AvailabilitySearchId: quote.AvailabilitySearchId,\r\n CarHireQuoteId: quote.CarHireQuote.CarHireId\r\n };\r\n timeout = $q.defer();\r\n return $http.post(url + 'get', request, {\r\n timeout: null,\r\n customErrCallback: function (args) {\r\n if (args.status) {\r\n broker.publish('carHireRequestFailed');\r\n }\r\n return true;\r\n }\r\n }).then(function (res) {\r\n promiseCache.remove(res.data.DetailsSearchId);\r\n timeout = null;\r\n return stringifyOptions(res.data);\r\n });\r\n }\r\n function rehydrate(id) {\r\n if (!promiseCache.get(id)) {\r\n promiseCache.put(id, $http.post(url + 'getfromsession', { DetailsSearchId: id }, { ignoreErrors: true })\r\n .then(function (res) {\r\n return stringifyOptions(res.data);\r\n }, function () {\r\n return $q.when('hello');\r\n }));\r\n }\r\n return promiseCache.get(id);\r\n }\r\n return service;\r\n}\r\nvar CMS;\r\n(function (CMS) {\r\n angular\r\n .module('cms')\r\n .component('mobileHero', {\r\n bindings: {\r\n elements: '@',\r\n heroStyle: '=',\r\n sale: '=',\r\n },\r\n controller: function ($scope, $route) {\r\n var scope = $scope.mh;\r\n scope.showHero = function (name) {\r\n var supportsHeroStyle = ['hotels', 'holidays'].indexOf(name) >= 0;\r\n var supportsSalesStyle = ['hotels', 'holidays'].indexOf(name) >= 0;\r\n if (supportsHeroStyle && scope.heroStyle && scope.heroStyle['background-image'] !== '') {\r\n return false;\r\n }\r\n else if (supportsSalesStyle && scope.sale && scope.sale !== '') {\r\n return false;\r\n }\r\n return true;\r\n };\r\n scope.currentArea = $route.current.area && $route.current.area.toLowerCase();\r\n var supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(function (p) { return p.toLowerCase(); });\r\n try {\r\n var heroes_1 = JSON.parse(scope.elements);\r\n var heroKeys = _.keys(heroes_1);\r\n this.heroes = [];\r\n heroKeys.forEach(function (elem) {\r\n var url = _.get(heroes_1, \"\" + elem, null);\r\n var header = _.get(heroes_1, elem + \"Header\", '');\r\n var name = elem.toLowerCase();\r\n if (_.isString(url) && url.replace(/\\s+/, '').length > 0 &&\r\n supportedProducts.indexOf(name) >= 0 &&\r\n scope.currentArea === name &&\r\n scope.showHero(name)) {\r\n scope.heroes.push({ name: name, url: url, header: header });\r\n }\r\n });\r\n }\r\n catch (e) { }\r\n },\r\n controllerAs: 'mh',\r\n template: \"\\n \\n
\\n \\n
\\n
0\\\"\\n class=\\\"sc-c-container sc-c-container--gutters-x\\\">\\n
\\n

{{hero.header}}

\\n
\\n
\\n
\\n \"\r\n });\r\n})(CMS || (CMS = {}));\r\nvar CMS;\r\n(function (CMS) {\r\n angular\r\n .module('cms')\r\n .directive('analyticsEvent', function (analytics) {\r\n return {\r\n scope: {\r\n type: '@',\r\n name: '@',\r\n properties: '='\r\n },\r\n link: function (scope) {\r\n analytics.track(scope.type, scope.name, scope.properties);\r\n }\r\n };\r\n });\r\n})(CMS || (CMS = {}));\r\nvar CMS;\r\n(function (CMS) {\r\n var observable = 'IntersectionObserver' in window;\r\n var CmsComponent = /** @class */ (function () {\r\n function CmsComponent() {\r\n }\r\n CmsComponent.prototype.url = function () {\r\n if (!this.inView && this.lazy && observable) {\r\n return 'loadingcmscomponent.html';\r\n }\r\n if (this.componentId) {\r\n return \"cms/component/\" + this.pageId + \"/\" + this.componentId;\r\n }\r\n else if (this.componentName) {\r\n return \"cms/component/\" + this.pageId + \"/\" + this.componentName;\r\n }\r\n else if (this.pageId) {\r\n return \"cms/component/\" + this.pageId;\r\n }\r\n else {\r\n return \"cms/missing\";\r\n }\r\n };\r\n return CmsComponent;\r\n }());\r\n angular.module('cms').directive('lazyCms', function () {\r\n return {\r\n restrict: 'A',\r\n require: '^cmsComponent',\r\n link: function (scope, el, attr, controller) {\r\n if (!observable || !controller.lazy) {\r\n return;\r\n }\r\n var observer = new IntersectionObserver(loadContent, {\r\n rootMargin: '200px 0px 200px 0px'\r\n });\r\n observer.observe(el[0]);\r\n function loadContent(changes) {\r\n changes.forEach(function (change) {\r\n if (change.intersectionRatio > 0) {\r\n observer.unobserve(change.target);\r\n scope.$apply(function () { return controller.inView = true; });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n });\r\n /*\r\n The lazy attribute controls whether this component will be loaded lazily based on whether it is\r\n visible in the viewport\r\n */\r\n angular.module('cms').directive('cmsComponent', function ($timeout) {\r\n return {\r\n scope: {},\r\n replace: true,\r\n bindToController: {\r\n data: '=',\r\n pageId: '@',\r\n componentName: '@',\r\n componentId: '@',\r\n lazy: '<'\r\n },\r\n controller: CmsComponent,\r\n controllerAs: 'cc',\r\n template: '',\r\n link: function (scope, el, attr, controller) {\r\n var p = scope.$parent;\r\n while (p != null) {\r\n if (p['rc'] != null) {\r\n controller.modal = p['rc'].modal;\r\n controller.rc = p['rc'];\r\n p = null;\r\n }\r\n else {\r\n p = p.$parent;\r\n }\r\n }\r\n }\r\n };\r\n });\r\n})(CMS || (CMS = {}));\r\nvar CMS;\r\n(function (CMS) {\r\n angular.module('cms').directive('seoMetaData', function () {\r\n return {\r\n scope: {\r\n title: '@',\r\n description: '@',\r\n keywords: '@',\r\n robots: '@'\r\n },\r\n replace: false,\r\n link: function (scope, el, attr) {\r\n var tags = {}, head = $('head');\r\n if (scope.title) {\r\n tags.title = \"\" + scope.title + \"\";\r\n tags['meta[name=title]'] = \"\";\r\n }\r\n if (scope.description) {\r\n tags['meta[name=description]'] = \"\";\r\n }\r\n if (scope.keywords) {\r\n tags['meta[name=keywords]'] = \"\";\r\n }\r\n if (scope.robots) {\r\n tags['meta[name=robots]'] = \"\";\r\n }\r\n $.each(tags, function (selector, html) {\r\n $(selector).remove();\r\n head.append(html);\r\n });\r\n }\r\n };\r\n });\r\n})(CMS || (CMS = {}));\r\nvar CMS;\r\n(function (CMS) {\r\n var CmsUtils = /** @class */ (function () {\r\n function CmsUtils() {\r\n this.reWhitespace = /\\s/g;\r\n }\r\n CmsUtils.prototype.normaliseValue = function (val) {\r\n return decodeURIComponent(String(val))\r\n .toLowerCase()\r\n .replace(this.reWhitespace, '');\r\n };\r\n CmsUtils.prototype.propsMatch = function (srcOb, props) {\r\n // Returns `true` if all `props` k:v pairs have a normalised match in `srcOb`\r\n if (!angular.isObject(srcOb) || !angular.isObject(props)) {\r\n return false;\r\n }\r\n var matchCount = 0;\r\n var srcKeys = Object.keys(srcOb);\r\n var propsKeys = Object.keys(props);\r\n var pi = propsKeys.length;\r\n while (pi--) {\r\n var si = srcKeys.length;\r\n var normalisedKey = this.normaliseValue(propsKeys[pi]);\r\n var normalisedVal = this.normaliseValue(props[propsKeys[pi]]);\r\n while (si--) {\r\n if (this.normaliseValue(srcKeys[si]) === normalisedKey &&\r\n this.normaliseValue(srcOb[srcKeys[si]]) === normalisedVal) {\r\n if (++matchCount === propsKeys.length) {\r\n return true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n ;\r\n return false;\r\n };\r\n return CmsUtils;\r\n }());\r\n angular\r\n .module('cms')\r\n .service('cmsUtils', CmsUtils);\r\n})(CMS || (CMS = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AdHoc;\r\n (function (AdHoc) {\r\n /// Duration unit enum\r\n var DurationUnitSingular;\r\n (function (DurationUnitSingular) {\r\n DurationUnitSingular[DurationUnitSingular[\"Hour\"] = 1] = \"Hour\";\r\n DurationUnitSingular[DurationUnitSingular[\"Day\"] = 2] = \"Day\";\r\n })(DurationUnitSingular = AdHoc.DurationUnitSingular || (AdHoc.DurationUnitSingular = {}));\r\n var DurationUnitPlural;\r\n (function (DurationUnitPlural) {\r\n DurationUnitPlural[DurationUnitPlural[\"Hours\"] = 1] = \"Hours\";\r\n DurationUnitPlural[DurationUnitPlural[\"Days\"] = 2] = \"Days\";\r\n })(DurationUnitPlural = AdHoc.DurationUnitPlural || (AdHoc.DurationUnitPlural = {}));\r\n })(AdHoc = Core.AdHoc || (Core.AdHoc = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Booking;\r\n (function (Booking) {\r\n var BookingStatus;\r\n (function (BookingStatus) {\r\n BookingStatus[BookingStatus[\"Complete\"] = 1] = \"Complete\";\r\n BookingStatus[BookingStatus[\"Alert\"] = 2] = \"Alert\";\r\n BookingStatus[BookingStatus[\"ThreeDs\"] = 3] = \"ThreeDs\";\r\n BookingStatus[BookingStatus[\"Error\"] = 4] = \"Error\";\r\n BookingStatus[BookingStatus[\"ValidationError\"] = 5] = \"ValidationError\";\r\n BookingStatus[BookingStatus[\"TimedOut\"] = 6] = \"TimedOut\";\r\n BookingStatus[BookingStatus[\"BookingError\"] = 7] = \"BookingError\";\r\n BookingStatus[BookingStatus[\"PayPalVerification\"] = 8] = \"PayPalVerification\";\r\n BookingStatus[BookingStatus[\"PayPalVerified\"] = 9] = \"PayPalVerified\";\r\n BookingStatus[BookingStatus[\"Cpg\"] = 10] = \"Cpg\";\r\n BookingStatus[BookingStatus[\"Refresh\"] = 13] = \"Refresh\";\r\n })(BookingStatus = Booking.BookingStatus || (Booking.BookingStatus = {}));\r\n var PassengerType;\r\n (function (PassengerType) {\r\n PassengerType[PassengerType[\"None\"] = 0] = \"None\";\r\n PassengerType[PassengerType[\"Adult\"] = 1] = \"Adult\";\r\n PassengerType[PassengerType[\"Child\"] = 2] = \"Child\";\r\n PassengerType[PassengerType[\"Infant\"] = 3] = \"Infant\";\r\n PassengerType[PassengerType[\"AdultSwimmer\"] = 4] = \"AdultSwimmer\";\r\n PassengerType[PassengerType[\"AdultNonSwimmer\"] = 5] = \"AdultNonSwimmer\";\r\n PassengerType[PassengerType[\"ChildSwimmer\"] = 6] = \"ChildSwimmer\";\r\n PassengerType[PassengerType[\"ChildNonSwimmer\"] = 7] = \"ChildNonSwimmer\";\r\n })(PassengerType = Booking.PassengerType || (Booking.PassengerType = {}));\r\n ;\r\n var DriverType;\r\n (function (DriverType) {\r\n DriverType[DriverType[\"NotADriver\"] = 0] = \"NotADriver\";\r\n DriverType[DriverType[\"MainDriver\"] = 1] = \"MainDriver\";\r\n DriverType[DriverType[\"AdditionalDriver\"] = 2] = \"AdditionalDriver\";\r\n })(DriverType = Booking.DriverType || (Booking.DriverType = {}));\r\n var CreateBookingStatus;\r\n (function (CreateBookingStatus) {\r\n CreateBookingStatus[CreateBookingStatus[\"Complete\"] = 1] = \"Complete\";\r\n CreateBookingStatus[CreateBookingStatus[\"Alert\"] = 2] = \"Alert\";\r\n CreateBookingStatus[CreateBookingStatus[\"ThreeDs\"] = 3] = \"ThreeDs\";\r\n CreateBookingStatus[CreateBookingStatus[\"Error\"] = 4] = \"Error\";\r\n CreateBookingStatus[CreateBookingStatus[\"ValidationError\"] = 5] = \"ValidationError\";\r\n CreateBookingStatus[CreateBookingStatus[\"TimedOut\"] = 6] = \"TimedOut\";\r\n CreateBookingStatus[CreateBookingStatus[\"BookingError\"] = 7] = \"BookingError\";\r\n CreateBookingStatus[CreateBookingStatus[\"PayPalVerification\"] = 8] = \"PayPalVerification\";\r\n CreateBookingStatus[CreateBookingStatus[\"PayPalVerified\"] = 9] = \"PayPalVerified\";\r\n CreateBookingStatus[CreateBookingStatus[\"Cpg\"] = 10] = \"Cpg\";\r\n CreateBookingStatus[CreateBookingStatus[\"Refresh\"] = 13] = \"Refresh\";\r\n })(CreateBookingStatus = Booking.CreateBookingStatus || (Booking.CreateBookingStatus = {}));\r\n var ProductType;\r\n (function (ProductType) {\r\n ProductType[ProductType[\"Flight\"] = 1] = \"Flight\";\r\n ProductType[ProductType[\"Attraction\"] = 2] = \"Attraction\";\r\n ProductType[ProductType[\"CarHire\"] = 4] = \"CarHire\";\r\n ProductType[ProductType[\"Hotel\"] = 8] = \"Hotel\";\r\n ProductType[ProductType[\"Parking\"] = 16] = \"Parking\";\r\n ProductType[ProductType[\"Transfer\"] = 32] = \"Transfer\";\r\n ProductType[ProductType[\"Insurance\"] = 64] = \"Insurance\";\r\n ProductType[ProductType[\"Marhaba\"] = 256] = \"Marhaba\";\r\n ProductType[ProductType[\"Cruise\"] = 512] = \"Cruise\";\r\n })(ProductType = Booking.ProductType || (Booking.ProductType = {}));\r\n var RecentSearchType;\r\n (function (RecentSearchType) {\r\n RecentSearchType[RecentSearchType[\"Flights\"] = 1] = \"Flights\";\r\n RecentSearchType[RecentSearchType[\"Hotels\"] = 2] = \"Hotels\";\r\n RecentSearchType[RecentSearchType[\"Holidays\"] = 3] = \"Holidays\";\r\n })(RecentSearchType = Booking.RecentSearchType || (Booking.RecentSearchType = {}));\r\n // This enum is only used client side in order to provide a common type for\r\n // standard products cross-sells (e.g. transfers/attractions) and\r\n // flight extras cross sells (e.g. bags/seats)\r\n var CrossSellType;\r\n (function (CrossSellType) {\r\n CrossSellType[CrossSellType[\"Hotels\"] = 1] = \"Hotels\";\r\n CrossSellType[CrossSellType[\"Attractions\"] = 2] = \"Attractions\";\r\n CrossSellType[CrossSellType[\"Transfers\"] = 3] = \"Transfers\";\r\n CrossSellType[CrossSellType[\"CarHire\"] = 4] = \"CarHire\";\r\n CrossSellType[CrossSellType[\"Seats\"] = 5] = \"Seats\";\r\n CrossSellType[CrossSellType[\"Baggage\"] = 6] = \"Baggage\";\r\n CrossSellType[CrossSellType[\"Parking\"] = 7] = \"Parking\";\r\n })(CrossSellType = Booking.CrossSellType || (Booking.CrossSellType = {}));\r\n })(Booking = Core.Booking || (Core.Booking = {}));\r\n})(Core || (Core = {}));\r\n// Contracts for TravelRepublic.Manager.Bookings\r\n// --------------------------------------------------\r\nvar Core;\r\n(function (Core) {\r\n var ManageBooking;\r\n (function (ManageBooking) {\r\n var TripStage;\r\n (function (TripStage) {\r\n TripStage[TripStage[\"PreTrip\"] = 0] = \"PreTrip\";\r\n TripStage[TripStage[\"OnTrip\"] = 1] = \"OnTrip\";\r\n TripStage[TripStage[\"PostTrip\"] = 2] = \"PostTrip\";\r\n })(TripStage = ManageBooking.TripStage || (ManageBooking.TripStage = {}));\r\n var BookedTrip = /** @class */ (function () {\r\n function BookedTrip() {\r\n // decorated properties\r\n this.DaysUntilDeparture = 0;\r\n this.DaysUntilReturn = 0;\r\n this.Duration = 0;\r\n this.MainBookingId = 0;\r\n this.PaymentDetails = new PaymentDetails();\r\n }\r\n return BookedTrip;\r\n }());\r\n ManageBooking.BookedTrip = BookedTrip;\r\n var PaymentDetails = /** @class */ (function () {\r\n function PaymentDetails() {\r\n this.Balances = [];\r\n this.Paid = 0;\r\n this.PayDirect = [];\r\n this.Outstanding = 0;\r\n this.Total = 0;\r\n }\r\n return PaymentDetails;\r\n }());\r\n ManageBooking.PaymentDetails = PaymentDetails;\r\n var BalanceDue = /** @class */ (function () {\r\n function BalanceDue() {\r\n this.Amount = 0;\r\n }\r\n return BalanceDue;\r\n }());\r\n ManageBooking.BalanceDue = BalanceDue;\r\n var DirectPayment = /** @class */ (function () {\r\n function DirectPayment() {\r\n this.Amount = 0;\r\n this.LocalAmount = 0;\r\n }\r\n return DirectPayment;\r\n }());\r\n ManageBooking.DirectPayment = DirectPayment;\r\n })(ManageBooking = Core.ManageBooking || (Core.ManageBooking = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CarHire;\r\n (function (CarHire) {\r\n var FuelPolicyType;\r\n (function (FuelPolicyType) {\r\n FuelPolicyType[FuelPolicyType[\"FullFull\"] = 0] = \"FullFull\";\r\n FuelPolicyType[FuelPolicyType[\"EmptyEmpty\"] = 1] = \"EmptyEmpty\";\r\n FuelPolicyType[FuelPolicyType[\"FullEmpty\"] = 2] = \"FullEmpty\";\r\n FuelPolicyType[FuelPolicyType[\"HalfEmpty\"] = 3] = \"HalfEmpty\";\r\n FuelPolicyType[FuelPolicyType[\"QuarterEmpty\"] = 4] = \"QuarterEmpty\";\r\n FuelPolicyType[FuelPolicyType[\"HalfHalf\"] = 5] = \"HalfHalf\";\r\n FuelPolicyType[FuelPolicyType[\"QuarterQuarter\"] = 6] = \"QuarterQuarter\";\r\n FuelPolicyType[FuelPolicyType[\"FreeTank\"] = 7] = \"FreeTank\";\r\n FuelPolicyType[FuelPolicyType[\"FullEmptyRefund\"] = 8] = \"FullEmptyRefund\";\r\n FuelPolicyType[FuelPolicyType[\"FullFullHybrid\"] = 9] = \"FullFullHybrid\";\r\n FuelPolicyType[FuelPolicyType[\"ChauFulFul\"] = 10] = \"ChauFulFul\";\r\n FuelPolicyType[FuelPolicyType[\"ChaufFuelInc\"] = 11] = \"ChaufFuelInc\";\r\n FuelPolicyType[FuelPolicyType[\"Unknown\"] = 12] = \"Unknown\";\r\n })(FuelPolicyType = CarHire.FuelPolicyType || (CarHire.FuelPolicyType = {}));\r\n var FuelType;\r\n (function (FuelType) {\r\n FuelType[FuelType[\"Unspecified\"] = 0] = \"Unspecified\";\r\n FuelType[FuelType[\"Petrol\"] = 1] = \"Petrol\";\r\n FuelType[FuelType[\"Diesel\"] = 2] = \"Diesel\";\r\n })(FuelType = CarHire.FuelType || (CarHire.FuelType = {}));\r\n var SortOrder;\r\n (function (SortOrder) {\r\n SortOrder[SortOrder[\"None\"] = 0] = \"None\";\r\n SortOrder[SortOrder[\"Price\"] = 1] = \"Price\";\r\n SortOrder[SortOrder[\"Recommended\"] = 2] = \"Recommended\";\r\n })(SortOrder = CarHire.SortOrder || (CarHire.SortOrder = {}));\r\n })(CarHire = Core.CarHire || (Core.CarHire = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var CrossSellOption = /** @class */ (function () {\r\n function CrossSellOption(bookingId, crossSellType, priceIsPerPerson, teaserPrice) {\r\n this.BookingId = 0;\r\n this.PriceIsPerPerson = false;\r\n this.TeaserPrice = 0;\r\n this.BookingId = bookingId;\r\n this.CrossSellType = crossSellType;\r\n this.PriceIsPerPerson = priceIsPerPerson;\r\n this.TeaserPrice = teaserPrice;\r\n }\r\n return CrossSellOption;\r\n }());\r\n Customer.CrossSellOption = CrossSellOption;\r\n var CrossSellProductOption = /** @class */ (function (_super) {\r\n __extends(CrossSellProductOption, _super);\r\n function CrossSellProductOption(bookingId, crossSellType, priceIsPerPerson, teaserPrice, imageUrl, productDetails, title) {\r\n var _this = _super.call(this, bookingId, crossSellType, priceIsPerPerson, teaserPrice) || this;\r\n _this.ImageUrl = imageUrl;\r\n _this.ProductDetails = productDetails;\r\n _this.Title = title;\r\n return _this;\r\n }\r\n return CrossSellProductOption;\r\n }(CrossSellOption));\r\n Customer.CrossSellProductOption = CrossSellProductOption;\r\n var CrossSellHotelOption = /** @class */ (function (_super) {\r\n __extends(CrossSellHotelOption, _super);\r\n function CrossSellHotelOption(bookingId, crossSellType, priceIsPerPerson, teaserPrice, imageUrl, productDetails, title, hotel) {\r\n var _this = _super.call(this, bookingId, crossSellType, priceIsPerPerson, teaserPrice, imageUrl, productDetails, title) || this;\r\n _this.Hotel = hotel;\r\n return _this;\r\n }\r\n return CrossSellHotelOption;\r\n }(CrossSellProductOption));\r\n Customer.CrossSellHotelOption = CrossSellHotelOption;\r\n var CrossSellFlightExtraOption = /** @class */ (function (_super) {\r\n __extends(CrossSellFlightExtraOption, _super);\r\n function CrossSellFlightExtraOption(bookingId, crossSellType, priceIsPerPerson, teaserPrice, url) {\r\n var _this = _super.call(this, bookingId, crossSellType, priceIsPerPerson, teaserPrice) || this;\r\n _this.Url = url;\r\n return _this;\r\n }\r\n return CrossSellFlightExtraOption;\r\n }(CrossSellOption));\r\n Customer.CrossSellFlightExtraOption = CrossSellFlightExtraOption;\r\n // this is used for mix-panel analytics\r\n var DashboardTileType;\r\n (function (DashboardTileType) {\r\n DashboardTileType[DashboardTileType[\"SignIn\"] = 0] = \"SignIn\";\r\n DashboardTileType[DashboardTileType[\"Trip\"] = 1] = \"Trip\";\r\n DashboardTileType[DashboardTileType[\"Search\"] = 2] = \"Search\";\r\n DashboardTileType[DashboardTileType[\"Destination\"] = 3] = \"Destination\";\r\n DashboardTileType[DashboardTileType[\"LastHotel\"] = 4] = \"LastHotel\";\r\n DashboardTileType[DashboardTileType[\"CrossSellHotels\"] = 5] = \"CrossSellHotels\";\r\n DashboardTileType[DashboardTileType[\"CrossSellAttractions\"] = 6] = \"CrossSellAttractions\";\r\n DashboardTileType[DashboardTileType[\"CrossSellTransfers\"] = 7] = \"CrossSellTransfers\";\r\n DashboardTileType[DashboardTileType[\"CrossSellCarHire\"] = 8] = \"CrossSellCarHire\";\r\n DashboardTileType[DashboardTileType[\"CrossSellSeats\"] = 9] = \"CrossSellSeats\";\r\n DashboardTileType[DashboardTileType[\"CrossSellBaggage\"] = 10] = \"CrossSellBaggage\";\r\n DashboardTileType[DashboardTileType[\"InsuranceOption\"] = 11] = \"InsuranceOption\";\r\n DashboardTileType[DashboardTileType[\"InsuranceClaim\"] = 12] = \"InsuranceClaim\";\r\n DashboardTileType[DashboardTileType[\"InsuranceConf\"] = 13] = \"InsuranceConf\";\r\n DashboardTileType[DashboardTileType[\"TravelGuide\"] = 14] = \"TravelGuide\";\r\n DashboardTileType[DashboardTileType[\"ContactUs\"] = 15] = \"ContactUs\";\r\n DashboardTileType[DashboardTileType[\"ReviewHotel\"] = 16] = \"ReviewHotel\";\r\n DashboardTileType[DashboardTileType[\"AppPromo\"] = 17] = \"AppPromo\";\r\n DashboardTileType[DashboardTileType[\"InspirationalContent\"] = 18] = \"InspirationalContent\";\r\n })(DashboardTileType = Customer.DashboardTileType || (Customer.DashboardTileType = {}));\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Destinations;\r\n (function (Destinations) {\r\n var DestinationType;\r\n (function (DestinationType) {\r\n DestinationType[DestinationType[\"Establishment\"] = 1] = \"Establishment\";\r\n DestinationType[DestinationType[\"Location\"] = 2] = \"Location\";\r\n DestinationType[DestinationType[\"Province\"] = 3] = \"Province\";\r\n DestinationType[DestinationType[\"Country\"] = 4] = \"Country\";\r\n DestinationType[DestinationType[\"Place\"] = 5] = \"Place\";\r\n DestinationType[DestinationType[\"Polygon\"] = 10] = \"Polygon\";\r\n DestinationType[DestinationType[\"Universal\"] = 12] = \"Universal\";\r\n })(DestinationType = Destinations.DestinationType || (Destinations.DestinationType = {}));\r\n })(Destinations = Core.Destinations || (Core.Destinations = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Flights;\r\n (function (Flights) {\r\n var DetailsResponseCode;\r\n (function (DetailsResponseCode) {\r\n DetailsResponseCode[DetailsResponseCode[\"Success\"] = 0] = \"Success\";\r\n DetailsResponseCode[DetailsResponseCode[\"Unavailable\"] = 1] = \"Unavailable\";\r\n })(DetailsResponseCode = Flights.DetailsResponseCode || (Flights.DetailsResponseCode = {}));\r\n var SortCriterion;\r\n (function (SortCriterion) {\r\n SortCriterion[SortCriterion[\"None\"] = 0] = \"None\";\r\n SortCriterion[SortCriterion[\"PriceLowToHigh\"] = 1] = \"PriceLowToHigh\";\r\n SortCriterion[SortCriterion[\"PriceHighToLow\"] = 2] = \"PriceHighToLow\";\r\n SortCriterion[SortCriterion[\"Airline\"] = 3] = \"Airline\";\r\n SortCriterion[SortCriterion[\"DepartureTimeEarlyToLate\"] = 4] = \"DepartureTimeEarlyToLate\";\r\n SortCriterion[SortCriterion[\"DepartureTimeLateToEarly\"] = 5] = \"DepartureTimeLateToEarly\";\r\n SortCriterion[SortCriterion[\"ReturnTimeEarlyToLate\"] = 6] = \"ReturnTimeEarlyToLate\";\r\n SortCriterion[SortCriterion[\"ReturnTimeLateToEarly\"] = 7] = \"ReturnTimeLateToEarly\";\r\n SortCriterion[SortCriterion[\"TotalJourneyTimeLongestFirst\"] = 8] = \"TotalJourneyTimeLongestFirst\";\r\n SortCriterion[SortCriterion[\"TotalJourneyShortestLongestFirst\"] = 9] = \"TotalJourneyShortestLongestFirst\";\r\n SortCriterion[SortCriterion[\"Convenience\"] = 10] = \"Convenience\";\r\n })(SortCriterion = Flights.SortCriterion || (Flights.SortCriterion = {}));\r\n var FareType;\r\n (function (FareType) {\r\n FareType[FareType[\"NotSpecified\"] = 0] = \"NotSpecified\";\r\n FareType[FareType[\"Published\"] = 1] = \"Published\";\r\n FareType[FareType[\"Private\"] = 2] = \"Private\";\r\n FareType[FareType[\"Package\"] = 3] = \"Package\";\r\n })(FareType = Flights.FareType || (Flights.FareType = {}));\r\n var OptionalExtraGroupType;\r\n (function (OptionalExtraGroupType) {\r\n OptionalExtraGroupType[OptionalExtraGroupType[\"Baggage\"] = 0] = \"Baggage\";\r\n OptionalExtraGroupType[OptionalExtraGroupType[\"Meal\"] = 1] = \"Meal\";\r\n OptionalExtraGroupType[OptionalExtraGroupType[\"Other\"] = 2] = \"Other\";\r\n OptionalExtraGroupType[OptionalExtraGroupType[\"SpecialBaggage\"] = 3] = \"SpecialBaggage\";\r\n OptionalExtraGroupType[OptionalExtraGroupType[\"CheckIn\"] = 4] = \"CheckIn\";\r\n })(OptionalExtraGroupType = Flights.OptionalExtraGroupType || (Flights.OptionalExtraGroupType = {}));\r\n var Cabin;\r\n (function (Cabin) {\r\n Cabin[Cabin[\"NotSpecified\"] = 0] = \"NotSpecified\";\r\n Cabin[Cabin[\"Economy\"] = 1] = \"Economy\";\r\n Cabin[Cabin[\"PremiumEconomy\"] = 2] = \"PremiumEconomy\";\r\n Cabin[Cabin[\"First\"] = 3] = \"First\";\r\n Cabin[Cabin[\"Business\"] = 4] = \"Business\";\r\n })(Cabin = Flights.Cabin || (Flights.Cabin = {}));\r\n })(Flights = Core.Flights || (Core.Flights = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Hotels;\r\n (function (Hotels) {\r\n var GroupType;\r\n (function (GroupType) {\r\n GroupType[GroupType[\"Facilities\"] = 1] = \"Facilities\";\r\n GroupType[GroupType[\"HolidayType\"] = 2] = \"HolidayType\";\r\n })(GroupType = Hotels.GroupType || (Hotels.GroupType = {}));\r\n var BoardType;\r\n (function (BoardType) {\r\n BoardType[BoardType[\"Mixed\"] = 0] = \"Mixed\";\r\n BoardType[BoardType[\"RoomOnly\"] = 1] = \"RoomOnly\";\r\n BoardType[BoardType[\"BedAndBreakfast\"] = 2] = \"BedAndBreakfast\";\r\n BoardType[BoardType[\"HalfBoard\"] = 3] = \"HalfBoard\";\r\n BoardType[BoardType[\"FullBoard\"] = 4] = \"FullBoard\";\r\n BoardType[BoardType[\"AllInclusive\"] = 5] = \"AllInclusive\";\r\n BoardType[BoardType[\"SelfCatering\"] = 6] = \"SelfCatering\";\r\n })(BoardType = Hotels.BoardType || (Hotels.BoardType = {}));\r\n var SupplierDiscountType;\r\n (function (SupplierDiscountType) {\r\n SupplierDiscountType[SupplierDiscountType[\"None\"] = 1] = \"None\";\r\n SupplierDiscountType[SupplierDiscountType[\"Mobile\"] = 2] = \"Mobile\";\r\n SupplierDiscountType[SupplierDiscountType[\"Promotional\"] = 3] = \"Promotional\";\r\n })(SupplierDiscountType = Hotels.SupplierDiscountType || (Hotels.SupplierDiscountType = {}));\r\n var AwardType;\r\n (function (AwardType) {\r\n AwardType[AwardType[\"Winner\"] = 1] = \"Winner\";\r\n AwardType[AwardType[\"BestIn\"] = 2] = \"BestIn\";\r\n })(AwardType = Hotels.AwardType || (Hotels.AwardType = {}));\r\n var BookingPath;\r\n (function (BookingPath) {\r\n BookingPath[BookingPath[\"HotelOnly\"] = 1] = \"HotelOnly\";\r\n BookingPath[BookingPath[\"Holiday\"] = 2] = \"Holiday\";\r\n BookingPath[BookingPath[\"HotelDeal\"] = 3] = \"HotelDeal\";\r\n BookingPath[BookingPath[\"HolidayDeal\"] = 4] = \"HolidayDeal\";\r\n BookingPath[BookingPath[\"MetaHotelOnly\"] = 5] = \"MetaHotelOnly\";\r\n BookingPath[BookingPath[\"MetaHoliday\"] = 6] = \"MetaHoliday\";\r\n })(BookingPath = Hotels.BookingPath || (Hotels.BookingPath = {}));\r\n var BoostReason;\r\n (function (BoostReason) {\r\n BoostReason[BoostReason[\"UserClickPrimary\"] = 1] = \"UserClickPrimary\";\r\n BoostReason[BoostReason[\"UserClickSecondary\"] = 2] = \"UserClickSecondary\";\r\n BoostReason[BoostReason[\"UserClickTertiary\"] = 3] = \"UserClickTertiary\";\r\n BoostReason[BoostReason[\"UserClickOther\"] = 4] = \"UserClickOther\";\r\n BoostReason[BoostReason[\"TopSlot\"] = 5] = \"TopSlot\";\r\n BoostReason[BoostReason[\"Recommended\"] = 6] = \"Recommended\";\r\n })(BoostReason = Hotels.BoostReason || (Hotels.BoostReason = {}));\r\n })(Hotels = Core.Hotels || (Core.Hotels = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ManageBooking;\r\n (function (ManageBooking) {\r\n var BookingStatus;\r\n (function (BookingStatus) {\r\n BookingStatus[BookingStatus[\"Pending\"] = 1] = \"Pending\";\r\n BookingStatus[BookingStatus[\"Receipted\"] = 2] = \"Receipted\";\r\n BookingStatus[BookingStatus[\"Ticketed\"] = 4] = \"Ticketed\";\r\n BookingStatus[BookingStatus[\"Complete\"] = 5] = \"Complete\";\r\n BookingStatus[BookingStatus[\"CancelledByClient\"] = 6] = \"CancelledByClient\";\r\n BookingStatus[BookingStatus[\"Void\"] = 7] = \"Void\";\r\n BookingStatus[BookingStatus[\"HoldAwaitingConfirmation\"] = 8] = \"HoldAwaitingConfirmation\";\r\n BookingStatus[BookingStatus[\"DeclinedByEstab\"] = 9] = \"DeclinedByEstab\";\r\n BookingStatus[BookingStatus[\"ConfirmedByEstab\"] = 10] = \"ConfirmedByEstab\";\r\n BookingStatus[BookingStatus[\"CancellationConfirmedByEstab\"] = 11] = \"CancellationConfirmedByEstab\";\r\n BookingStatus[BookingStatus[\"CancellationDeclinedByEstab\"] = 12] = \"CancellationDeclinedByEstab\";\r\n BookingStatus[BookingStatus[\"FailedSecurityCheck\"] = 13] = \"FailedSecurityCheck\";\r\n BookingStatus[BookingStatus[\"HoldSupplierSwap\"] = 14] = \"HoldSupplierSwap\";\r\n BookingStatus[BookingStatus[\"AutoAccepted\"] = 15] = \"AutoAccepted\";\r\n BookingStatus[BookingStatus[\"PriceUp\"] = 16] = \"PriceUp\";\r\n BookingStatus[BookingStatus[\"NotAvailable\"] = 17] = \"NotAvailable\";\r\n BookingStatus[BookingStatus[\"AwaitingCustomerResponse\"] = 18] = \"AwaitingCustomerResponse\";\r\n BookingStatus[BookingStatus[\"Migrated\"] = 19] = \"Migrated\";\r\n })(BookingStatus = ManageBooking.BookingStatus || (ManageBooking.BookingStatus = {}));\r\n var BookingInfoItemType;\r\n (function (BookingInfoItemType) {\r\n BookingInfoItemType[BookingInfoItemType[\"Invalid\"] = 0] = \"Invalid\";\r\n BookingInfoItemType[BookingInfoItemType[\"Generic\"] = 1] = \"Generic\";\r\n BookingInfoItemType[BookingInfoItemType[\"CancellationCondition\"] = 2] = \"CancellationCondition\";\r\n BookingInfoItemType[BookingInfoItemType[\"PublishedNote\"] = 3] = \"PublishedNote\";\r\n BookingInfoItemType[BookingInfoItemType[\"BaggageInformation\"] = 4] = \"BaggageInformation\";\r\n BookingInfoItemType[BookingInfoItemType[\"TerminalInformation\"] = 5] = \"TerminalInformation\";\r\n BookingInfoItemType[BookingInfoItemType[\"FareRules\"] = 6] = \"FareRules\";\r\n BookingInfoItemType[BookingInfoItemType[\"OutboundFlights\"] = 7] = \"OutboundFlights\";\r\n BookingInfoItemType[BookingInfoItemType[\"InboundFlights\"] = 8] = \"InboundFlights\";\r\n BookingInfoItemType[BookingInfoItemType[\"SpecialOffer\"] = 9] = \"SpecialOffer\";\r\n BookingInfoItemType[BookingInfoItemType[\"BookingCondition\"] = 10] = \"BookingCondition\";\r\n })(BookingInfoItemType = ManageBooking.BookingInfoItemType || (ManageBooking.BookingInfoItemType = {}));\r\n var ItineraryType;\r\n (function (ItineraryType) {\r\n ItineraryType[ItineraryType[\"FlightOutbound\"] = 1] = \"FlightOutbound\";\r\n ItineraryType[ItineraryType[\"FlightInbound\"] = 2] = \"FlightInbound\";\r\n ItineraryType[ItineraryType[\"CarHire\"] = 3] = \"CarHire\";\r\n ItineraryType[ItineraryType[\"HotelRoom\"] = 4] = \"HotelRoom\";\r\n ItineraryType[ItineraryType[\"AttractionTicket\"] = 5] = \"AttractionTicket\";\r\n ItineraryType[ItineraryType[\"FlightInfo\"] = 6] = \"FlightInfo\";\r\n ItineraryType[ItineraryType[\"CarParking\"] = 7] = \"CarParking\";\r\n ItineraryType[ItineraryType[\"TransferArrival\"] = 8] = \"TransferArrival\";\r\n ItineraryType[ItineraryType[\"TransferReturn\"] = 9] = \"TransferReturn\";\r\n ItineraryType[ItineraryType[\"Insurance\"] = 10] = \"Insurance\";\r\n ItineraryType[ItineraryType[\"PackageHoliday\"] = 11] = \"PackageHoliday\";\r\n ItineraryType[ItineraryType[\"Marhaba\"] = 13] = \"Marhaba\";\r\n ItineraryType[ItineraryType[\"Bundle\"] = 14] = \"Bundle\";\r\n ItineraryType[ItineraryType[\"PointToPointTransfer\"] = 15] = \"PointToPointTransfer\";\r\n ItineraryType[ItineraryType[\"AdHoc\"] = 16] = \"AdHoc\";\r\n })(ItineraryType = ManageBooking.ItineraryType || (ManageBooking.ItineraryType = {}));\r\n var BookingType;\r\n (function (BookingType) {\r\n BookingType[BookingType[\"Flight\"] = 1] = \"Flight\";\r\n BookingType[BookingType[\"AttractionTickets\"] = 2] = \"AttractionTickets\";\r\n BookingType[BookingType[\"CarHire\"] = 4] = \"CarHire\";\r\n BookingType[BookingType[\"Accommodation\"] = 8] = \"Accommodation\";\r\n BookingType[BookingType[\"TailorMadeHoliday\"] = 9] = \"TailorMadeHoliday\";\r\n BookingType[BookingType[\"Parking\"] = 16] = \"Parking\";\r\n BookingType[BookingType[\"Transfer\"] = 32] = \"Transfer\";\r\n BookingType[BookingType[\"TravelInsurance\"] = 64] = \"TravelInsurance\";\r\n BookingType[BookingType[\"PackageHolidays\"] = 128] = \"PackageHolidays\";\r\n BookingType[BookingType[\"Marhaba\"] = 256] = \"Marhaba\";\r\n BookingType[BookingType[\"CruiseHolidays\"] = 512] = \"CruiseHolidays\";\r\n BookingType[BookingType[\"Bundle\"] = 1024] = \"Bundle\";\r\n BookingType[BookingType[\"AdHoc\"] = 2048] = \"AdHoc\";\r\n })(BookingType = ManageBooking.BookingType || (ManageBooking.BookingType = {}));\r\n })(ManageBooking = Core.ManageBooking || (Core.ManageBooking = {}));\r\n})(Core || (Core = {}));\r\nvar Quote;\r\n(function (Quote) {\r\n var QuoteProductType;\r\n (function (QuoteProductType) {\r\n QuoteProductType[QuoteProductType[\"Accommodation\"] = 0] = \"Accommodation\";\r\n QuoteProductType[QuoteProductType[\"Flight\"] = 1] = \"Flight\";\r\n QuoteProductType[QuoteProductType[\"Transfer\"] = 2] = \"Transfer\";\r\n QuoteProductType[QuoteProductType[\"AirportParking\"] = 3] = \"AirportParking\";\r\n QuoteProductType[QuoteProductType[\"AttractionTicket\"] = 4] = \"AttractionTicket\";\r\n QuoteProductType[QuoteProductType[\"CarHire\"] = 5] = \"CarHire\";\r\n })(QuoteProductType = Quote.QuoteProductType || (Quote.QuoteProductType = {}));\r\n var CreateQuoteResponseCode;\r\n (function (CreateQuoteResponseCode) {\r\n CreateQuoteResponseCode[CreateQuoteResponseCode[\"Success\"] = 0] = \"Success\";\r\n CreateQuoteResponseCode[CreateQuoteResponseCode[\"Unknown\"] = 1] = \"Unknown\";\r\n })(CreateQuoteResponseCode = Quote.CreateQuoteResponseCode || (Quote.CreateQuoteResponseCode = {}));\r\n})(Quote || (Quote = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Trip;\r\n (function (Trip) {\r\n var TripType;\r\n (function (TripType) {\r\n TripType[TripType[\"None\"] = 0] = \"None\";\r\n TripType[TripType[\"Flight\"] = 1] = \"Flight\";\r\n TripType[TripType[\"Hotel\"] = 2] = \"Hotel\";\r\n TripType[TripType[\"Transfer\"] = 3] = \"Transfer\";\r\n TripType[TripType[\"Holiday\"] = 4] = \"Holiday\";\r\n TripType[TripType[\"Marhaba\"] = 5] = \"Marhaba\";\r\n TripType[TripType[\"AirportParking\"] = 6] = \"AirportParking\";\r\n TripType[TripType[\"Attractions\"] = 7] = \"Attractions\";\r\n TripType[TripType[\"DynamicPackage\"] = 8] = \"DynamicPackage\";\r\n TripType[TripType[\"Insurance\"] = 9] = \"Insurance\";\r\n })(TripType = Trip.TripType || (Trip.TripType = {}));\r\n })(Trip = Core.Trip || (Core.Trip = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingComplete = /** @class */ (function () {\r\n function BookingComplete($location, $routeParams, $scope, $window, agentModeService, analytics, broker) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.$window = $window;\r\n this.agentModeService = agentModeService;\r\n this.analytics = analytics;\r\n this.broker = broker;\r\n this._initPage();\r\n this.payLaterEnabled = TRPCONFIG.Domain.BuyNowPayLaterEnabled && this.$location.search().pl === '1';\r\n if (TRPCONFIG.Domain.isAgentMode) {\r\n var bookingId = this.$routeParams.ref.split('|')[0];\r\n if (bookingId && bookingId.split('/')[1]) {\r\n agentModeService.getBookingContact(bookingId.split('/')[1]).then(function (result) {\r\n _this.bookingSummarySurname = result.LastName;\r\n });\r\n }\r\n }\r\n if (TRPCONFIG.Domain.HideBookingRefOnConfirmation) {\r\n this.$location.replace();\r\n this.$location.url('booking/complete');\r\n }\r\n if ((this.$routeParams.paypal === 'true') && this.$routeParams.tripData) {\r\n var tripData = JSON.parse(decodeURIComponent(this.$routeParams.tripData));\r\n this.analytics.track('eCommercePaypal', 'purchase', tripData);\r\n }\r\n if (sessionStorage.getItem('eCommercePurchaseData')) {\r\n var purchaseData = JSON.parse(sessionStorage.getItem('eCommercePurchaseData') || '{}');\r\n this.$window.dataLayer.push(purchaseData);\r\n sessionStorage.removeItem('eCommercePurchaseData');\r\n }\r\n }\r\n BookingComplete.prototype._initPage = function () {\r\n var _this = this;\r\n this.broker.publish('unblock');\r\n this.$scope.$emit('unblock');\r\n this.broker.subscribe('bookingComplete', 'lightboxOpened', function () { return _this.lightboxOpened = true; });\r\n this.broker.subscribe('bookingComplete', 'lightboxCloseClicked', function () { return _this.lightboxOpened = false; });\r\n this.broker.subscribe('bookingComplete', 'manageBookingClicked', function () { return _this.manageBookingStarted = true; });\r\n this.manageBookingStarted = false;\r\n };\r\n return BookingComplete;\r\n }());\r\n angular\r\n .module('core')\r\n .controller('BookingComplete', BookingComplete);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n /**\r\n * If we receive a route that does not match any of our static routes\r\n * we will end up here. We will then call an api to check whether this is\r\n * a dynamic route of some kind. If we still don't understand the route\r\n * just send the user to the home page.\r\n */\r\n var DynamicRouting = /** @class */ (function () {\r\n function DynamicRouting($location, publicityService, broker) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.publicityService = publicityService;\r\n this.broker = broker;\r\n this.minimalRoutes = [\r\n /^\\/famous-film-locations$/,\r\n /^\\/famous-film-locations\\/.+/\r\n ];\r\n publicityService.getStats({\r\n StatisticTypes: 'All'\r\n }).then(function (data) {\r\n _this.data = {\r\n numberOfAirlines: data.AirlineCount.Value,\r\n numberOfHotels: data.EstabCount.Value,\r\n bookingsLastHour: data.BookingsInLastHour.Value,\r\n customersCurrentlyOnHoliday: data.CustomersCurrentlyOnHoliday.Value,\r\n reviewCount: data.ReviewCount.Value,\r\n searchesInLastHour: data.SearchesInLastHour.Value,\r\n villaCount: data.VillaCount.Value\r\n };\r\n });\r\n this.template = \"cms/page\" + $location.path();\r\n var path = $location.path();\r\n var minimal = this.minimalRoutes.reduce(function (matched, re) { return matched || re.test(path); }, false);\r\n this.template = \"cms/page\" + path;\r\n if (minimal) {\r\n broker.publish('stripHeader');\r\n broker.publish('hideFooter');\r\n }\r\n }\r\n return DynamicRouting;\r\n }());\r\n angular\r\n .module('core')\r\n .controller('DynamicRouting', DynamicRouting);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CmsPageProps = /** @class */ (function () {\r\n function CmsPageProps($rootScope, broker) {\r\n this.$rootScope = $rootScope;\r\n this.broker = broker;\r\n }\r\n CmsPageProps.prototype.$onInit = function () {\r\n this.$rootScope.$broadcast('cmsPageProps', {\r\n pageName: this.pageName\r\n });\r\n };\r\n CmsPageProps.prototype.showUSPpopup = function (data) {\r\n this.broker.publish('showModalUspPopupDetails', data);\r\n };\r\n return CmsPageProps;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('cmsPageProps', function () {\r\n return {\r\n restrict: 'E',\r\n controller: CmsPageProps,\r\n controllerAs: 'cmsCtrl',\r\n bindToController: {\r\n pageName: '@'\r\n },\r\n template: \"\"\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var MultiSectorFlight = /** @class */ (function () {\r\n function MultiSectorFlight(broker) {\r\n this.broker = broker;\r\n }\r\n MultiSectorFlight.prototype.isSameCarrierOnAllSegments = function (flightSector) {\r\n return flightSector.Segments.every(function (s) { return s.CodeshareAirlineName === s.CarrierName; });\r\n };\r\n MultiSectorFlight.prototype.showModalFlightDetails = function (flightSector) {\r\n this.broker.publish('showModalFlightDetails', { flight: { Legs: [flightSector] } });\r\n };\r\n return MultiSectorFlight;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('multiSectorFlight', function () {\r\n return {\r\n replace: true,\r\n restrict: 'E',\r\n scope: {\r\n legs: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=multisectorflight',\r\n controller: MultiSectorFlight,\r\n controllerAs: 'msf'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AbTestSelector = /** @class */ (function () {\r\n function AbTestSelector(cookieService) {\r\n this.cookieService = cookieService;\r\n this.bindableTests = JSON.parse(this.tests);\r\n this.bindableTests.forEach(function (t) {\r\n var cookie = cookieService.get(t.CookieName);\r\n t.variant = cookie ? parseInt(cookie, 10) : 0;\r\n });\r\n }\r\n AbTestSelector.prototype.update = function () {\r\n var _this = this;\r\n this.bindableTests.forEach(function (t) {\r\n _this.cookieService.set(t.CookieName, t.variant, t.variant === 0 ? new Date() : null);\r\n });\r\n };\r\n AbTestSelector.prototype.numArray = function (i) {\r\n return new Array(i);\r\n };\r\n return AbTestSelector;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('abTestSelector', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n bindToController: {\r\n tests: '@'\r\n },\r\n controller: AbTestSelector,\r\n controllerAs: 'abt',\r\n templateUrl: 'partials/home/directivetemplate?type=AbTestSelector'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AddFlightDetailsModal = /** @class */ (function () {\r\n function AddFlightDetailsModal($scope, broker, mandatoryTransferService) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.mandatoryTransferService = mandatoryTransferService;\r\n this.transfers = [];\r\n this.hotel = $scope.hotel;\r\n }\r\n AddFlightDetailsModal.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('modalAddFlightDetails', 'showModalAddFlightDetails', function (e) {\r\n _this.transfers = _this.mandatoryTransferService.getTransfers(e.data.roomInfo.Extras || []);\r\n _this.includedTransfer = _this.mandatoryTransferService\r\n .findSelectedTransfer(_this.transfers, e.data.roomInfo.IncludedExtras);\r\n _this.flightDetails.transfer = _this.includedTransfer || _this.transfers[0];\r\n _this.roomId = e.data.roomId;\r\n _this.priceId = [e.data.priceId];\r\n _this.show = true;\r\n _this.multipleRoomMode = false;\r\n _this.priceMode = e.data.priceMode;\r\n _this.totalNonInfants = e.data.totalNonInfants;\r\n _this.roomCost = e.data.roomInfo.TotalCost;\r\n });\r\n this.broker.subscribe('modalAddFlightDetails', 'showModalAddFlightDetailsForMultiRooms', function (e) {\r\n _this.show = true;\r\n _this.multipleRoomMode = true;\r\n _this.priceMode = e.data.priceMode;\r\n _this.roomsWithTransfers = e.data.rooms;\r\n _this.includedTransfer = [];\r\n _this.flightDetails.transfers = [];\r\n _this.transfers = [];\r\n _this.transferExtras = [];\r\n _this.includedTransfer = [];\r\n _this.priceId = [];\r\n for (var i = 0; i < _this.roomsWithTransfers.length; i++) {\r\n _this.flightDetails.transfers[i] = _this.mandatoryTransferService\r\n .findSelectedTransfer(_this.roomsWithTransfers.mandatoryTransfers, _this.roomsWithTransfers[i].IncludedExtras)\r\n || _this.roomsWithTransfers[i].mandatoryTransfers[0];\r\n _this.transfers = _this.roomsWithTransfers[i].mandatoryTransfers ||\r\n _this.roomsWithTransfers[i].IncludedExtras;\r\n _this.priceId.push(_this.roomsWithTransfers[i].Id);\r\n _this.transferExtras = _this.mandatoryTransferService.getTransfers(_this.roomsWithTransfers[i].Extras || []);\r\n _this.includedTransfer[i] = _this.mandatoryTransferService\r\n .findSelectedTransfer(_this.transferExtras, _this.roomsWithTransfers[i].IncludedExtras);\r\n }\r\n });\r\n this.broker.subscribe('modalAddFlightDetails', 'HotelAvailabilityReceive', function (e) {\r\n _this.hotel.Availability = e.data.Availability;\r\n });\r\n this.broker.subscribe('modalAddFlightDetails', 'roomsSet', function (e) {\r\n _this.hotel.Availability = e.data.RequestedRooms[0].Availability;\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalAddFlightDetails');\r\n });\r\n };\r\n AddFlightDetailsModal.prototype.continueToBook = function () {\r\n if (!this.multipleRoomMode) {\r\n this.broker.publish('continueToBookFromFlightDetailsModal', {\r\n roomId: this.roomId,\r\n priceId: this.priceId,\r\n flightDetails: this.flightDetails\r\n });\r\n this.mandatoryTransferService.generateMandatoryOptions(this.roomId, this.flightDetails);\r\n }\r\n else {\r\n this.flightDetails.options = this.mandatoryTransferService\r\n .generateOptionsForMultiRooms(this.flightDetails, this.roomsWithTransfers);\r\n this.mandatoryTransferService.generateMandatoryOptions(this.roomId, this.flightDetails);\r\n this.broker.publish('continueToBookFromFlightDetailsModal', {\r\n multipleRoomMode: this.multipleRoomMode,\r\n flightDetails: this.flightDetails,\r\n priceId: this.priceId\r\n });\r\n }\r\n };\r\n return AddFlightDetailsModal;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('addFlightDetailsModal', function () {\r\n return {\r\n scope: { hotel: '=' },\r\n controller: AddFlightDetailsModal,\r\n controllerAs: 'afdc',\r\n templateUrl: 'partials/home/directivetemplate?type=AddFlightDetailsModal',\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var AtolCostBreakdown = /** @class */ (function () {\r\n function AtolCostBreakdown($scope, tripService, $routeParams) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.tripService = tripService;\r\n this.$routeParams = $routeParams;\r\n var killTheWatch = $scope.$watchCollection(function () { return _this.costs; }, function (val) {\r\n if (val) {\r\n var costs = _.groupBy(_this.costs, 'AtolProtected');\r\n _this.atolProtectedCosts = costs['true'];\r\n _this.otherCosts = costs['false'];\r\n _this.total = _this.sumCosts(_this.costs);\r\n _this.atolSubTotal = _this.sumCosts(_this.atolProtectedCosts);\r\n _this.setClientCurrencyCode();\r\n killTheWatch();\r\n }\r\n });\r\n }\r\n AtolCostBreakdown.prototype.sumCosts = function (costs) {\r\n if (costs) {\r\n return costs.reduce(function (sum, item) { return sum + item.Quantity * item.UnitAmount; }, 0);\r\n }\r\n return 0;\r\n };\r\n AtolCostBreakdown.prototype.setClientCurrencyCode = function () {\r\n var _this = this;\r\n if (this.costs && (this.costs.length >= 1)) {\r\n if (this.costs[0].ClientCurrencyCode) {\r\n this.clientCurrencyCode = this.costs[0].ClientCurrencyCode;\r\n }\r\n else {\r\n this.tripService.getCurrency(this.$routeParams.tripId).then(function (currency) {\r\n _this.clientCurrencyCode = currency;\r\n });\r\n }\r\n }\r\n };\r\n return AtolCostBreakdown;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('atolCostBreakdown', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n bindToController: {\r\n costs: '=',\r\n totalLabel: '@',\r\n atolSubtotalLabel: '@'\r\n },\r\n controller: AtolCostBreakdown,\r\n controllerAs: 'acb',\r\n templateUrl: 'partials/home/atolcostbreakdown'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Search;\r\n(function (Search) {\r\n var AutoSearch = /** @class */ (function () {\r\n function AutoSearch(basketService, unifiedSearchService, destinationService, searchQueryString, urlUtils, $scope, resourceService) {\r\n this.basketService = basketService;\r\n this.unifiedSearchService = unifiedSearchService;\r\n this.destinationService = destinationService;\r\n this.searchQueryString = searchQueryString;\r\n this.urlUtils = urlUtils;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n }\r\n AutoSearch.prototype.search = function ($event) {\r\n var _this = this;\r\n if ($event) {\r\n $event.preventDefault();\r\n }\r\n if (this.href && this.href.length > 0) {\r\n var index = this.href.indexOf('?');\r\n if (index > 0) {\r\n this.$scope.$emit('block', {\r\n title: this.resourceService.get('SEARCHINGHOTELS'),\r\n subtitle: this.resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-searchUnitCtrl'\r\n });\r\n this.href = this.href.slice(index + 1);\r\n var queryParams_1 = { type: '0', id: '0' };\r\n queryParams_1 = this.urlUtils.splitQs(this.href || '');\r\n if (parseInt(queryParams_1.type, 10) >= 0 && parseInt(queryParams_1.id, 10) >= 0) {\r\n this.destinationService.enhanceLegacyDestination({\r\n LegacyType: queryParams_1.type,\r\n LegacyId: queryParams_1.id\r\n })\r\n .then(this.destinationService.getDetails)\r\n .then(function (dest) {\r\n _this.requestModel = _this.unifiedSearchService.getDefaultModel();\r\n _this.searchQueryString.getQueryStringValues(queryParams_1).then(function (queryStringValues) {\r\n _this.requestParams = queryStringValues;\r\n _this.requestParams.destination = [dest];\r\n _this.unifiedSearchService.populateSearchUnitService(_this.requestParams);\r\n _this.basketService.startWorkflow(_this.basketService.autoSearch, _this.requestParams);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n };\r\n ;\r\n return AutoSearch;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('autoSearch', function () {\r\n return {\r\n replace: true,\r\n restrict: 'A',\r\n transclude: true,\r\n scope: {},\r\n bindToController: {\r\n href: '@'\r\n },\r\n controller: AutoSearch,\r\n controllerAs: 'autosearch',\r\n template: '
'\r\n };\r\n });\r\n})(Search || (Search = {}));\r\n/*\r\n Creates an autocompleter field.\r\n Results are exposed as `ac.data`.\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter_1) {\r\n var Autocompleter = /** @class */ (function (_super) {\r\n __extends(Autocompleter, _super);\r\n function Autocompleter($scope, $element, $parse, $route, autocompleter, resourceService, $timeout, $q) {\r\n var _this = _super.call(this) || this;\r\n _this.$scope = $scope;\r\n _this.$element = $element;\r\n _this.$parse = $parse;\r\n _this.$route = $route;\r\n _this.autocompleter = autocompleter;\r\n _this.resourceService = resourceService;\r\n _this.$timeout = $timeout;\r\n _this.$q = $q;\r\n _this.setPrefixDebounced = _.debounce(function (prefix) {\r\n _this.prefix = prefix;\r\n $scope.$apply();\r\n }, 100);\r\n // Watch for initial value\r\n _this.$scope.$watchCollection('ac.currentValue', function (value) {\r\n var selected = _.isArray(value) ? value[0] : value;\r\n if (selected) {\r\n var title = selected[_this.titleProp];\r\n if (title) {\r\n _this.setPrefixDebounced(title);\r\n }\r\n }\r\n else {\r\n _this.prefix = '';\r\n }\r\n });\r\n // Wrap `select` attribute fn\r\n _this.selectAttrFn = _this.select;\r\n _this.select = function (item) {\r\n _this.selectAttrFn({ item: item });\r\n _this.selectItem(item);\r\n };\r\n _this.titleProp = _this.titleProp || 'Title';\r\n // set focus on input field when required\r\n _this.$scope.$watch(function () { return _this.setFocus; }, function (value) {\r\n if (value === true) {\r\n _this.$timeout(function () {\r\n _this.inputField && _this.inputField.focus();\r\n });\r\n }\r\n });\r\n return _this;\r\n }\r\n Autocompleter.prototype.focus = function () {\r\n if (TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter\r\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\r\n && (this.prefix === '' || this.prefix === undefined)) {\r\n this.fetch();\r\n }\r\n };\r\n Autocompleter.prototype.update = function (result) {\r\n var data = result.data, area = this.getArea();\r\n if (['businesscustomers', 'travelAgents', 'coworkers', 'userAccounts'].indexOf(area) > -1) {\r\n this.data = data;\r\n }\r\n else if (['transfers', 'flights', 'flights-departure', 'marhaba', 'parking'].indexOf(area) > -1) {\r\n this.data = this.addHeader(data, 'AIRPORTS');\r\n }\r\n else if (area === 'resorts') {\r\n this.data = this.addHeader(data, 'RESORTSPLUSHOTELS');\r\n }\r\n else {\r\n this.data = this._groupHotelResults(data);\r\n }\r\n if (!this.data || !this.data.length) {\r\n this.data = null;\r\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\r\n }\r\n };\r\n Autocompleter.prototype.selectItem = function (item) {\r\n if (item && item[this.titleProp]) {\r\n angular.isArray(this.currentValue) ? this.currentValue[0] = item : this.currentValue = item;\r\n }\r\n };\r\n Autocompleter.prototype.blur = function () {\r\n var _this = this;\r\n this.setFocus = false;\r\n // timeout is to prevent blur firing immediately before we select a menu item\r\n this.$timeout(function () {\r\n if (!_this.prefix &&\r\n !TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter &&\r\n TRPCONFIG.Domain.DeviceType !== 'Desktop') {\r\n // we have no prefix so clear the current value\r\n angular.isArray(_this.currentValue) ? _this.currentValue.length = 0 : delete _this.currentValue;\r\n return;\r\n }\r\n if (!_this.data || !_this.data.length) {\r\n // no data\r\n return;\r\n }\r\n var value = _this.currentValue && _this.currentValue[0] || _this.currentValue, title = value && value[_this.titleProp], isCurrentValueInMenu = _.some(_this.data, function (d) { return d[_this.titleProp] === title; });\r\n if (!isCurrentValueInMenu) {\r\n // current value is not in our data so select the first option\r\n var firstItem = _.find(_this.data, function (d) { return !d.header; });\r\n if (firstItem) {\r\n _this.select(angular.copy(firstItem));\r\n return;\r\n }\r\n }\r\n if (title) {\r\n // set the autcompleter text to match the current value\r\n _this.setPrefixDebounced(title);\r\n }\r\n }, 200);\r\n };\r\n Autocompleter.prototype._groupHotelResults = function (data) {\r\n var hotels = [];\r\n var destinations = [];\r\n angular.forEach(data, function (item) {\r\n if (item.EstablishmentId !== 0) {\r\n hotels.push(item);\r\n }\r\n else {\r\n destinations.push(item);\r\n }\r\n });\r\n return this.addHeader(destinations, 'DESTINATIONS')\r\n .concat(this.addHeader(hotels, 'HOTELS'));\r\n };\r\n return Autocompleter;\r\n }(Autocompleter_1.AutocompleterField));\r\n angular\r\n .module('TR')\r\n .directive('autocompleter', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'ac',\r\n bindToController: {\r\n placeholder: '@',\r\n select: '&',\r\n deselect: '&',\r\n setFocus: '=?',\r\n currentValue: '=?',\r\n areaOverride: '@',\r\n focusTracker: '=',\r\n minPrefix: '@',\r\n notActive: '@',\r\n titleProp: '@',\r\n filterFunction: '&?',\r\n iconName: '@?'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Autocompleter',\r\n controller: Autocompleter,\r\n transclude: true,\r\n link: function (scope, el) {\r\n scope.ac.inputField = el.find('input');\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\n/*\r\n Displays recommendations on an autocompleter field.\r\n Requires `autocompleter` directive as parent.\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var AutocompleterRecommendations = /** @class */ (function () {\r\n function AutocompleterRecommendations($scope, $route, $timeout, $q, resourceService, autocompleter, houseRecommender) {\r\n this.$scope = $scope;\r\n this.$route = $route;\r\n this.$timeout = $timeout;\r\n this.$q = $q;\r\n this.resourceService = resourceService;\r\n this.autocompleter = autocompleter;\r\n this.houseRecommender = houseRecommender;\r\n this.acMethods = {};\r\n }\r\n AutocompleterRecommendations.prototype.init = function (ac) {\r\n this.parentCtrl = ac;\r\n this._wrapAcMethod('focus', this.load);\r\n this._wrapAcMethod('select', this.select);\r\n };\r\n AutocompleterRecommendations.prototype.load = function () {\r\n var _this = this;\r\n if (this.allow()) {\r\n this.fetch().then(function (destinations) {\r\n if (destinations) {\r\n _this.$timeout(function () {\r\n if (_this.allow()) {\r\n // Set `data` on autocompleter\r\n _this.parentCtrl.data = destinations;\r\n }\r\n // Set `initialData` on autocompleter\r\n // Repopulates menu when no search term i.e. <3 chars\r\n _this.parentCtrl.initialData = destinations;\r\n _this._unwrapAcMethod('focus');\r\n });\r\n }\r\n });\r\n }\r\n };\r\n AutocompleterRecommendations.prototype.select = function (dest) {\r\n var _this = this;\r\n if (dest && this.allow()) {\r\n var currentArea = this.$route.current ? this.$route.current.area : '';\r\n var ac_1 = this.parentCtrl;\r\n var area = ac_1.areaOverride || currentArea;\r\n var destTitle = dest && dest.Title;\r\n if (destTitle) {\r\n ac_1.loading = true;\r\n ac_1.prefix = destTitle;\r\n ac_1.data = null;\r\n // Fetch autocompleter item data on select\r\n this.autocompleter.lookup(area, destTitle)\r\n .then(function (res) {\r\n var item = res && res.data && res.data[0];\r\n if (item) {\r\n // Call original non-wrapped method\r\n _this.acMethods.select(item);\r\n _this.houseRecommender.trackHouseClick(dest);\r\n }\r\n else {\r\n ac_1.prefix = '';\r\n ac_1.data = null;\r\n ac_1.$emit('flash:error', _this.resourceService.get('NOMATCHES'));\r\n }\r\n ac_1.loading = false;\r\n });\r\n }\r\n return true; // Block wrapped ac.select()\r\n }\r\n };\r\n AutocompleterRecommendations.prototype.allow = function () {\r\n var prefix = this.parentCtrl.prefix;\r\n return !prefix || prefix.length < this.parentCtrl.minPrefix;\r\n };\r\n AutocompleterRecommendations.prototype.fetch = function () {\r\n var _this = this;\r\n // `houseRecommendationService` has its own caching\r\n return this.houseRecommender.getHouseRecs()\r\n .then(function (dests) {\r\n var destinations = _.filter(dests, function (d) { return d.searchable && (!_this.isHoliday || (_this.isHoliday && d.holidayEnabled)); });\r\n if (destinations && destinations.length) {\r\n destinations.splice(0, 0, {\r\n Title: _this.resourceService.get('RECOMMENDED'),\r\n header: true\r\n });\r\n _this.recommendationType = dests[0].Type;\r\n return _.map(destinations, function (d) {\r\n if (!d.header) {\r\n d.Title = d.title;\r\n d.EstablishmentCount = d.estabCount;\r\n }\r\n return d;\r\n });\r\n }\r\n });\r\n };\r\n AutocompleterRecommendations.prototype._wrapAcMethod = function (method, fn) {\r\n var _this = this;\r\n // Original method doesn't run if `fn()` returns `true`\r\n var m = this.parentCtrl[method];\r\n if (m) {\r\n this.acMethods[method] = m;\r\n }\r\n this.parentCtrl[method] = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var v = fn.apply(_this, args);\r\n if (m && v !== true) {\r\n return m.apply(_this.parentCtrl, args);\r\n }\r\n };\r\n };\r\n AutocompleterRecommendations.prototype._unwrapAcMethod = function (method) {\r\n var m = this.acMethods[method];\r\n if (m) {\r\n delete this.acMethods[method];\r\n }\r\n this.parentCtrl[method] = m; // May be undefined\r\n };\r\n return AutocompleterRecommendations;\r\n }());\r\n ;\r\n angular\r\n .module('TR')\r\n .directive('autocompleterRecommendations', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: AutocompleterRecommendations,\r\n controllerAs: 'acr',\r\n bindToController: {\r\n isHoliday: '='\r\n },\r\n require: '^autocompleter',\r\n link: function (scope, el, attr, autocompleterCtrl) {\r\n scope.acr.init(autocompleterCtrl);\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var BaggageOptions = /** @class */ (function () {\r\n function BaggageOptions($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.loading = true;\r\n var bagOptionsWatch = this.$scope.$watch('cm.bagOptions', function (val) {\r\n if (val) {\r\n _this.maxBagsSelectable = _this.bagOptions && _this.bagOptions.length || 0;\r\n var bag = _.minBy(_this.bagOptions, 'UnitAmount');\r\n if (bag) {\r\n _this.bagsTeaserCost = bag.UnitAmount / 2;\r\n _this.holdBaggageWeight = bag.UnitWeightKg || TRPCONFIG.Domain.DashboardHoldBaggageWeight;\r\n }\r\n bagOptionsWatch();\r\n _this.loading = false;\r\n }\r\n }, true);\r\n }\r\n BaggageOptions.prototype.updateBaggageOptions = function () {\r\n var selectedBagOptionsRaw = this.bagOptions.slice(0, this.bagsSelected);\r\n this.flightBaggageTotal = _(selectedBagOptionsRaw).sumBy('UnitAmount');\r\n this.selectedBagOptions = (selectedBagOptionsRaw.map(function (so) { return ({ OptionId: so.OptionId, ChosenQuantity: 1 }); }));\r\n };\r\n return BaggageOptions;\r\n }());\r\n angular\r\n .module('core')\r\n .component('baggageOptions', {\r\n bindings: {\r\n bagOptions: '=',\r\n handBaggageInformation: '=',\r\n flightBaggageTotal: '=',\r\n selectedBagOptions: '='\r\n },\r\n controller: BaggageOptions,\r\n controllerAs: 'cm',\r\n templateUrl: 'partials/home/baggageoptions'\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('baseStaticMap', baseStaticMap);\r\n var template = \"\\n
\\n \\n
\\n
\\n
\\n\";\r\n function baseStaticMap($window, $compile, $rootScope, currentDestination, mapLabel, broker, hotelRehydrator, hotelStaticMapService, maps) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n zoom: '=',\r\n hideLabels: '@'\r\n },\r\n template: template,\r\n link: function (scope, el) {\r\n maps.loadScript(_.bind(_linker, {}, scope, el));\r\n }\r\n };\r\n function _linker(scope, el) {\r\n scope.ready = true;\r\n var Label = mapLabel($window.google);\r\n var infoWindow = new google.maps.InfoWindow();\r\n var labels = [];\r\n currentDestination.getCurrentDestination().then(function (destination) {\r\n broker.subscribe('hotelStaticMap', 'MAPLIGHTBOX', _.bind(buildMap, {}, destination));\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('hotelStaticMap');\r\n });\r\n });\r\n function buildMap(destination) {\r\n scope.showModal = true;\r\n scope.close = function () {\r\n scope.showModal = false;\r\n };\r\n var map = new google.maps.Map(el.find('.map-canvas')[0], {\r\n zoom: scope.zoom || destination.ZoomLevel,\r\n scrollwheel: true,\r\n overviewMapControl: false,\r\n center: new google.maps.LatLng(destination.Latitude, destination.Longitude),\r\n mapTypeControl: false,\r\n streetViewControl: true,\r\n scaleControl: true\r\n });\r\n google.maps.event.addListenerOnce(map, 'idle', function () {\r\n setTimeout(function () {\r\n google.maps.event.trigger(map, 'resize');\r\n map.setCenter(new google.maps.LatLng(destination.Latitude, destination.Longitude));\r\n }, 500);\r\n });\r\n google.maps.event.addListener(map, 'idle', function () {\r\n var zoom = map.getZoom();\r\n var loadedBounds = map.getBounds();\r\n var sw = loadedBounds.getSouthWest();\r\n var ne = loadedBounds.getNorthEast();\r\n var url = \"?X1=\" + sw.lng() + \"&Y1=\" + sw.lat() + \"&X2=\" + ne.lng() + \"&Y2=\" + ne.lat() + \"&Z=\" + zoom;\r\n hotelStaticMapService.getMarkers(url).then(function (res) {\r\n if (scope.hideLabels !== 'true') {\r\n _clearLabels();\r\n generateLabels(res.data.Markers, map);\r\n }\r\n });\r\n });\r\n }\r\n function generateLabels(points, map) {\r\n for (var i = 0, ii = points.length; i < ii; i++) {\r\n var p = points[i];\r\n var key = _getKey(p);\r\n var markerLabel = new Label({\r\n map: map,\r\n visible: true,\r\n position: new google.maps.LatLng(p.Y, p.X, true),\r\n text: p.N\r\n }, key, p.N);\r\n markerLabel.clickHandler =\r\n p.N === 1 ?\r\n _.bind(hotelClickHandler, markerLabel, p.Id, map) :\r\n _.bind(clusterClickHandler, markerLabel, p, map);\r\n labels.push(markerLabel);\r\n }\r\n }\r\n function clusterClickHandler(point, map) {\r\n var sw = new google.maps.LatLng(point.B.Y1, point.B.X1);\r\n var ne = new google.maps.LatLng(point.B.Y2, point.B.X2);\r\n var bds = new google.maps.LatLngBounds(sw, ne);\r\n map.fitBounds(bds);\r\n }\r\n function hotelClickHandler(estabId, map) {\r\n infoWindow.close();\r\n infoWindow.setContent('
');\r\n infoWindow.open(map, this);\r\n hotelRehydrator.hotel(estabId).then(function (h) {\r\n var t = '';\r\n var s = $rootScope.$new(true);\r\n s.hotel = h;\r\n infoWindow.setContent($compile(t)(s)[0]);\r\n });\r\n }\r\n function _clearLabels() {\r\n for (var i = 0, ii = labels.length; i < ii; i++) {\r\n labels[i].visible = false;\r\n }\r\n labels.length = 0;\r\n broker.publish('CHANGEDLABELVISIBILITY');\r\n }\r\n function _getKey(point) {\r\n return (point.X + \"__\" + point.Y + \"__\" + point.N + \"__\" + point.T).replace(/\\./g, '_');\r\n }\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var BasicContentCard = /** @class */ (function () {\r\n function BasicContentCard() {\r\n }\r\n return BasicContentCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('basicContentCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: BasicContentCard,\r\n controllerAs: 'bcc',\r\n transclude: true,\r\n bindToController: {\r\n click: '&',\r\n header: '@',\r\n overlay: '@',\r\n imageUrl: '@',\r\n href: '@',\r\n contentCardClass: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=BasicContentCard'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .directive('blogSection', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: function (tElement, tAttrs) {\r\n return \"partials/home/directivetemplate?type=LandingPage/BlogSection&search=\" + tAttrs.search;\r\n },\r\n link: function ($scope, element) {\r\n $scope.posts = [];\r\n var raw = element.find('.blog-post-raw');\r\n raw.children()\r\n .each(function () {\r\n var e = $(this);\r\n var imgStyle = e.find('.search-image-inner').attr('style');\r\n var imgFeatured = e.find('.post-featured-image-inner')\r\n .attr('style');\r\n var image = imgStyle ? imgStyle : imgFeatured || '';\r\n var blogSummaryText = e.find('.entry-summary p').text();\r\n var blogEntryContent = e.find('.entry-content p').text();\r\n var blogText = (blogSummaryText) ? blogSummaryText : blogEntryContent || '';\r\n var blogElipsis = blogText.slice(0, 150) + (blogText.length > 150 ? '...' : '') || '';\r\n $scope.posts.push({\r\n imgSrc: image ? image.match(/['\"](.*)['\"]/)[1] : '',\r\n heading: e.find('h4 a').text() || '',\r\n text: blogElipsis,\r\n href: e.find('h4 a').attr('href') || '',\r\n });\r\n });\r\n raw.remove();\r\n },\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/**\r\n * Created by bdickson on 15/06/2016.\r\n */\r\nvar TR;\r\n(function (TR) {\r\n var BookingExtrasOption = /** @class */ (function () {\r\n function BookingExtrasOption() {\r\n }\r\n return BookingExtrasOption;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('bookingExtrasOption', function () {\r\n return {\r\n scope: {},\r\n bindToController: {\r\n model: '=',\r\n val: '=',\r\n group: '@',\r\n price: '=',\r\n perPerson: '=',\r\n showFrom: '=',\r\n showTotal: '=',\r\n priceTotal: '=',\r\n pricePerDay: '=',\r\n isDelta: '=?',\r\n priceFull: '=?',\r\n included: '=?',\r\n priceRounded: '=?'\r\n },\r\n controller: BookingExtrasOption,\r\n controllerAs: 'beo',\r\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasOption',\r\n transclude: true,\r\n replace: true\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BookingSummary = /** @class */ (function () {\r\n function BookingSummary($q, $routeParams, $scope, analytics, basketStore, broker, hotelFromSession, tripService, taxationService, costBreakdownCodes, occupancyService, cookieService) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.basketStore = basketStore;\r\n this.broker = broker;\r\n this.hotelFromSession = hotelFromSession;\r\n this.tripService = tripService;\r\n this.taxationService = taxationService;\r\n this.costBreakdownCodes = costBreakdownCodes;\r\n this.occupancyService = occupancyService;\r\n this.cookieService = cookieService;\r\n this.isMultiDestHoliday = false;\r\n this.cityTaxTypeId = 22; // typeId of cityTax product in cost breakdown list\r\n this.voucherDiscountMsg = { Message: '', Code: 0 };\r\n this.voucherSuccessMsg = '';\r\n this.isDiscountMsgPositive = false;\r\n this.mandatoryTransferTypeId = 23;\r\n this.hotelExtrasTypeIds = [1, 23, 24, 25, 26];\r\n this.mandatoryTransfersCost = 0;\r\n this.voucherDiscountMsg = JSON.parse(cookieService.get('VoucherWarnMessage')\r\n || '{ \"Message\": \"\", \"Code\": 0 }') || { Message: '', Code: 0 };\r\n switch (this.voucherDiscountMsg.Code) {\r\n case 3:\r\n this.voucherSuccessMsg = 'Promotional discount applied';\r\n this.isDiscountMsgPositive = true;\r\n break;\r\n case 5:\r\n this.voucherSuccessMsg = 'Voucher code discount updated';\r\n this.isDiscountMsgPositive = true;\r\n break;\r\n case 6:\r\n this.voucherSuccessMsg = 'Voucher code discount applied';\r\n this.isDiscountMsgPositive = true;\r\n break;\r\n case 7:\r\n this.voucherSuccessMsg = 'Voucher code discount removed';\r\n this.isDiscountMsgPositive = true;\r\n break;\r\n default:\r\n this.voucherSuccessMsg = '';\r\n this.isDiscountMsgPositive = false;\r\n break;\r\n }\r\n this.changeFlightEnabled = this.changeFlightEnabled === 'true';\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n if (trip && trip.BasketId) {\r\n _this.trip = trip;\r\n //we can have two ever so slightly different modes that this directive is used in\r\n //1. as part of a holiday booking search\r\n //2. as part of a quote which has no trip info just a basket\r\n //we need to remove the reliance on the trip if possible\r\n _this.getProductInfo(trip.BasketId, $routeParams.tripId);\r\n _this.getCostBreakdown(trip.BasketId);\r\n //checks we have a number of optional attributes, so here are some rules\r\n //to keep us in check\r\n if (_.isUndefined(_this.cardFeeForDeposit) !== _.isUndefined(_this.cardFeeForTotal)) {\r\n throw Error('BookingSummary directive, both CardFee attributes should be supplied or neither.');\r\n }\r\n // Multi destination holidays, 'change flight' starts a new workflow which needs a loading screen\r\n if (trip && trip.HotelsRequest && trip.HotelsRequest.Destinations) {\r\n _this.isMultiDestHoliday = true;\r\n }\r\n }\r\n });\r\n this.showContinueButton = !!this.continueToNextStep;\r\n var init = function (basketId, tripId) {\r\n _this.getProductInfo(basketId, tripId);\r\n _this.getCostBreakdown(basketId);\r\n broker.subscribe('BookingSummary', 'basketUpdated', function () {\r\n _this.getCostBreakdown(basketId);\r\n _this.updateFlightInfo(basketId);\r\n });\r\n broker.subscribe('BookingSummary', 'updatePricesOnPUP', function (e) {\r\n _this.getCostBreakdown(basketId);\r\n _this.updateFlightInfo(basketId);\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('BookingSummary');\r\n });\r\n if (tripId) {\r\n //need to override the package price setting to show flight cost breakdown\r\n _this.tripService.usePackageRates(tripId)\r\n .then(function (packagePrice) { return _this.packagePrice = packagePrice; });\r\n _this.modifyEssentialsRoute = \"/holidays/options/\" + _this.tripId;\r\n }\r\n if (!_this.priceDifference) {\r\n _this.priceDifference = 0;\r\n }\r\n };\r\n if (!$routeParams.tripId && this.basketId && this.tripId) {\r\n init(this.basketId, this.tripId);\r\n }\r\n else {\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n if (trip && trip.BasketId) {\r\n init(trip.BasketId, trip.TripId);\r\n }\r\n });\r\n }\r\n this.quoteRef = $routeParams.quoteRef;\r\n this.quoteNo = $routeParams.quoteNo;\r\n }\r\n BookingSummary.prototype.getProductInfo = function (basketId, tripId) {\r\n var _this = this;\r\n this.$q.all([\r\n this.basketStore.all(basketId),\r\n this.tripService.getTripReducedOccupancy(tripId)\r\n ]).then(function (results) {\r\n var basket = results[0];\r\n if (basket.h) {\r\n var hotelFromBasket_1 = basket.h;\r\n _this.hotelFromSession.getHotel(hotelFromBasket_1.AvailabilitySearchId, hotelFromBasket_1.Details.Id, tripId)\r\n .then(function (hotel) {\r\n _this.hotel = angular.extend(hotel, hotelFromBasket_1);\r\n });\r\n }\r\n _this.occupancy = results[1];\r\n _this.flight = basket.f;\r\n _this.attraction = basket.a;\r\n _this.carhire = basket.c;\r\n _this.insurance = basket.i;\r\n _this.parking = basket.p;\r\n _this.transfer = basket.t;\r\n });\r\n this.updateFlightInfo(basketId);\r\n this.updateHotelInfo(basketId);\r\n };\r\n BookingSummary.prototype.updateFlightInfo = function (basketId) {\r\n var _this = this;\r\n return this.basketStore.flight(basketId)\r\n .then(function (flight) {\r\n if (!flight) {\r\n return;\r\n }\r\n _this.flight = flight;\r\n _this.flightCostBreakdown = flight.CostBreakdown;\r\n //remove atol cost from flight cost breakdown\r\n var atol = _.find(_this.flightCostBreakdown, function (item) {\r\n return item.Description.indexOf('ATOL') >= 0;\r\n });\r\n if (atol) {\r\n _this.flightCostBreakdown = _.filter(_this.flightCostBreakdown, function (item) { return item !== atol; });\r\n }\r\n return;\r\n });\r\n };\r\n BookingSummary.prototype.updateHotelInfo = function (basketId) {\r\n var _this = this;\r\n return this.basketStore.hotel(basketId)\r\n .then(function (hotel) {\r\n if (!hotel) {\r\n return;\r\n }\r\n var costType = {\r\n Unknown: 0,\r\n Accommodation: 1,\r\n Discount: 20,\r\n AccommodationCancellationProtection: 21,\r\n AccommodationLocalFeesAndTaxes: 22,\r\n AccommodationExtraTransfer: 23,\r\n AccommodationExtraEvent: 24,\r\n AccommodationExtraAttraction: 25,\r\n AccommodationExtra: 26,\r\n };\r\n var costBreakdown = hotel.CostBreakdown;\r\n var extraCostItems = costBreakdown.filter(function (cost) {\r\n var match = _.get(cost, 'ParentId') && _.get(cost, 'TypeId') ===\r\n (costType.AccommodationExtraTransfer ||\r\n costType.AccommodationExtraEvent ||\r\n costType.AccommodationExtraAttraction ||\r\n costType.AccommodationExtra ||\r\n costType.AccommodationLocalFeesAndTaxes ||\r\n costType.AccommodationCancellationProtection ||\r\n costType.Discount);\r\n return match;\r\n }).filter(function (extra) { return extra; });\r\n var roomCostItems = costBreakdown.filter(function (cost) { return !_.get(cost, 'ParentId')\r\n && _.get(cost, 'TypeId') === costType.Accommodation; }).map(function (room, LinkId) {\r\n return __assign({}, room, { LinkId: LinkId });\r\n });\r\n if (extraCostItems && extraCostItems.length > 0 && roomCostItems && roomCostItems.length > 0) {\r\n var updatedRoomCostItems_1 = roomCostItems.map(function (room) {\r\n return { RoomId: room.Id, RoomDescription: room.Description };\r\n });\r\n var enhancedExtras = extraCostItems.map(function (extras) {\r\n return __assign({}, extras, updatedRoomCostItems_1.find(function (acc) { return acc.RoomId === extras.ParentId; }));\r\n });\r\n var updatedExtrasCostItems = enhancedExtras.map(function (extra, LinkId) {\r\n var splitDescription = _.get(extra, 'RoomDescription').toString().split('(');\r\n var Description = splitDescription[1] ?\r\n extra.Description + \" (\" + splitDescription[1] :\r\n extra.Description;\r\n return __assign({}, extra, { Description: Description,\r\n LinkId: LinkId });\r\n });\r\n var updatedCostBreakdown = roomCostItems.concat(updatedExtrasCostItems);\r\n var costsSortedById = updatedCostBreakdown.sort(function (a, b) { return (a.LinkId >= b.LinkId) ? 1 : -1; });\r\n _this.hotelCostBreakdown = costsSortedById;\r\n }\r\n else {\r\n _this.hotelCostBreakdown = hotel.CostBreakdown.filter(function (item) {\r\n return _this.hotelExtrasTypeIds.indexOf(item.TypeId) !== -1;\r\n });\r\n }\r\n _this.hotelExtrasCostBreakdown = _this.hotelCostBreakdown.filter(function (item) { return item.TypeId !== 1; });\r\n return;\r\n });\r\n };\r\n BookingSummary.prototype.getCostBreakdown = function (basketId) {\r\n var _this = this;\r\n this.$q.all([\r\n this.basketStore.totalDiscount(basketId),\r\n this.basketStore.totalDeposit(basketId, this.$routeParams.ProductId),\r\n this.basketStore.costBreakdownGrouped(basketId),\r\n this.basketStore.rules(basketId, this.$routeParams.ProductId),\r\n this.basketStore.payDirectTotal(basketId),\r\n this.basketStore.carHire(basketId),\r\n this.basketStore.isAtolProtected(basketId),\r\n this.basketStore.attractionCost(basketId)\r\n ]).then(function (_a) {\r\n var totalDiscount = _a[0], totalDeposit = _a[1], costBreakdownGrouped = _a[2], rules = _a[3], payDirectTotal = _a[4], carHire = _a[5], isAtolProtected = _a[6], attractionsCost = _a[7];\r\n _this.totalDiscount = totalDiscount;\r\n _this.totalDeposit = totalDeposit;\r\n _this.costBreakdown = costBreakdownGrouped;\r\n _this.totalCost = costBreakdownGrouped.total;\r\n _this.atolAvailable = isAtolProtected;\r\n _this.attractionsCost = attractionsCost;\r\n _.each(_this.costBreakdown, function (cb) {\r\n if (cb.group === 1) {\r\n // HOTEL\r\n _this.hotelCost = cb.costBreakdown\r\n .reduce(function (totalCost, currentHotel) {\r\n return totalCost\r\n + (currentHotel.UnitAmount > 0\r\n ? currentHotel.UnitAmount\r\n : (currentHotel.TypeId !== 20 ? currentHotel.UnitAmount : 0));\r\n }, 0); /* id: 20 is discounts */\r\n _this.cancellationProtection = _.get(cb.costBreakdown.find(function (cost) {\r\n return cost.TypeId === _this.costBreakdownCodes.CancellationProtection;\r\n }), 'UnitAmount', 0);\r\n _this.tax = cb.costBreakdown\r\n .reduce(function (totalCost, currentHotel) {\r\n return totalCost + (currentHotel.TypeId === _this.cityTaxTypeId ? currentHotel.UnitAmount : 0);\r\n }, 0);\r\n if (_this.tax && _this.tax > 0) {\r\n _this.hotelCost = _this.hotelCost - _this.tax;\r\n }\r\n if (_this.cancellationProtection) {\r\n _this.hotelCost = _this.hotelCost - _this.cancellationProtection;\r\n }\r\n _this.mandatoryTransfersCost = cb.costBreakdown\r\n .reduce(function (totalCost, currentHotel) {\r\n return totalCost + (currentHotel.TypeId === _this.mandatoryTransferTypeId ?\r\n currentHotel.UnitAmount : 0);\r\n }, 0);\r\n }\r\n else if (cb.group === 2) {\r\n // FLIGHTS\r\n // Isolate the ATOL cost\r\n // Ideally we would be able to search by type but we have to use the description\r\n var atol = _.find(cb.costBreakdown, function (item) {\r\n return item.Description.indexOf('ATOL') >= 0;\r\n });\r\n if (atol) {\r\n _this.atolCost = atol.UnitAmount * atol.Quantity;\r\n _this.flightCost = cb.total - _this.atolCost; // subtract the atol cost from the flights total\r\n }\r\n else {\r\n _this.flightCost = cb.total;\r\n }\r\n }\r\n else if (cb.group === 3) {\r\n // EXTRAS\r\n _this.extrasCost = cb.total;\r\n _this.extras = _this.basketStore.extrasBreakdown(cb.costBreakdown);\r\n }\r\n });\r\n _this.hasDeposit = rules.depositAllowed;\r\n _this.hasPayDirect = payDirectTotal > 0;\r\n var carHireExtras = _.get(carHire, 'RequestedItems');\r\n _this.carHireExtras = carHireExtras;\r\n _this.carHireExtrasTotal = carHireExtras ?\r\n carHireExtras.reduce(function (total, extra) { return total += extra.UnitAmount; }, 0) :\r\n undefined;\r\n });\r\n };\r\n BookingSummary.prototype.editEssentials = function () {\r\n this.analytics.track('mixpanel', 'EmailMeEditQuote');\r\n };\r\n BookingSummary.prototype.showDetails = function (e) {\r\n var passengers = this.occupancyService.getTotalPeopleCounts();\r\n e.preventDefault();\r\n this.broker.publish('showModalFlightDetails', { flight: this.flight.Details.Itinerary, passengers: passengers });\r\n };\r\n return BookingSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('bookingSummary', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n bindToController: {\r\n basketId: '=?',\r\n tripId: '=?',\r\n cardFeeForDeposit: '=?',\r\n cardFeeForTotal: '=?',\r\n changeFlightEnabled: '@?',\r\n continueToNextStep: '&?',\r\n occupancy: '=?',\r\n //for quotes we also watch out for price changes and tell the user so enable that functionality if\r\n //set. (i know not great but short of duplicating all of this code it seems like the best thing to do)\r\n priceDifference: '=?',\r\n modifyEssentials: '=?',\r\n currencyCode: '=',\r\n showAncillaries: '@?'\r\n },\r\n controller: BookingSummary,\r\n controllerAs: 'hbs',\r\n replace: true,\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=BookingSummary&version='\r\n + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=BookingSummary';\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var ONE_SEVEN = !!TRPCONFIG.Rtl ? '‎7 x 1' : '1 x 7';\r\n var ONE_TEN = !!TRPCONFIG.Rtl ? '‎10 x 1' : '1 x 10';\r\n var TWO_SEVEN = !!TRPCONFIG.Rtl ? '‎7 x 2' : '2 x 7';\r\n var ONE_TWO_THREE = !!TRPCONFIG.Rtl ? '‎23 x 1' : '1 x 23';\r\n var TWO_TWO_THREE = !!TRPCONFIG.Rtl ? '‎23 x 2' : '2 x 23';\r\n var TWO_THREE_TWO = !!TRPCONFIG.Rtl ? '‎32 x 2' : '2 x 32';\r\n var TransformedType;\r\n (function (TransformedType) {\r\n TransformedType[TransformedType[\"EconomySpecial\"] = 0] = \"EconomySpecial\";\r\n TransformedType[TransformedType[\"EconomySaver\"] = 1] = \"EconomySaver\";\r\n TransformedType[TransformedType[\"EconomyFlex\"] = 2] = \"EconomyFlex\";\r\n TransformedType[TransformedType[\"EconomyFlexPlus\"] = 3] = \"EconomyFlexPlus\";\r\n TransformedType[TransformedType[\"PremiumEconomyFlexPlus\"] = 4] = \"PremiumEconomyFlexPlus\";\r\n TransformedType[TransformedType[\"BusinessSpecial\"] = 5] = \"BusinessSpecial\";\r\n TransformedType[TransformedType[\"BusinessSaver\"] = 6] = \"BusinessSaver\";\r\n TransformedType[TransformedType[\"BusinessFlex\"] = 7] = \"BusinessFlex\";\r\n TransformedType[TransformedType[\"BusinessFlexPlus\"] = 8] = \"BusinessFlexPlus\";\r\n TransformedType[TransformedType[\"FirstSaver\"] = 9] = \"FirstSaver\";\r\n TransformedType[TransformedType[\"FirstFlex\"] = 10] = \"FirstFlex\";\r\n TransformedType[TransformedType[\"FirstFlexPlus\"] = 11] = \"FirstFlexPlus\";\r\n TransformedType[TransformedType[\"NotDefined\"] = 12] = \"NotDefined\";\r\n })(TransformedType = ekh.TransformedType || (ekh.TransformedType = {}));\r\n var AttributeTypes;\r\n (function (AttributeTypes) {\r\n AttributeTypes[AttributeTypes[\"Baggage\"] = 0] = \"Baggage\";\r\n AttributeTypes[AttributeTypes[\"CabinBaggage\"] = 1] = \"CabinBaggage\";\r\n AttributeTypes[AttributeTypes[\"SeatsSelection\"] = 2] = \"SeatsSelection\";\r\n AttributeTypes[AttributeTypes[\"Meals\"] = 3] = \"Meals\";\r\n AttributeTypes[AttributeTypes[\"WiFi\"] = 4] = \"WiFi\";\r\n AttributeTypes[AttributeTypes[\"Refundable\"] = 5] = \"Refundable\";\r\n AttributeTypes[AttributeTypes[\"Changes\"] = 6] = \"Changes\";\r\n AttributeTypes[AttributeTypes[\"PriorityCheckin\"] = 7] = \"PriorityCheckin\";\r\n AttributeTypes[AttributeTypes[\"FastTrack\"] = 8] = \"FastTrack\";\r\n })(AttributeTypes = ekh.AttributeTypes || (ekh.AttributeTypes = {}));\r\n var BrandedFareTypesService = /** @class */ (function () {\r\n function BrandedFareTypesService(dateUtil, guidService, resourceService, basketStore) {\r\n this.dateUtil = dateUtil;\r\n this.guidService = guidService;\r\n this.resourceService = resourceService;\r\n this.basketStore = basketStore;\r\n this.allPayloads = [];\r\n this.sentApi = false;\r\n this.brandedFares = [];\r\n this.flightMilesToPkgPP = 0;\r\n }\r\n BrandedFareTypesService.prototype.transform = function (brandedFareType) {\r\n var _this = this;\r\n var flightSectors = brandedFareType.FlightSectors.map(function (fs) {\r\n fs.TransformedType = _this._getTransformedType(fs.BrandTitle);\r\n fs.BaggageType = _this._getBaggageType(fs);\r\n fs.BaggageText = _this.getBaggage(fs);\r\n fs.CabinBaggageText = _this.getCabinBaggage(fs);\r\n fs.ChauffeurText = _this.getChauffeur(fs);\r\n fs.SeatsSelectionText = _this.getSeatsSelection(fs);\r\n return fs;\r\n });\r\n var brandedFareTypePrice = this.getBrandedFareTypePrice(brandedFareType);\r\n this.setSkywards(brandedFareType);\r\n var defaultPrice;\r\n return __assign({}, brandedFareType, { FlightSectors: flightSectors, BrandedFareTypeTotalPrice: brandedFareTypePrice });\r\n };\r\n BrandedFareTypesService.prototype.squeeze = function (brandedfareTypes) {\r\n var _this = this;\r\n return brandedfareTypes.reduce(function (prev, curBf) {\r\n if (prev.length) {\r\n var lastBf = prev.slice(-1)[0];\r\n var sectorFirstEqual = _this._isEqualFlightSectors(lastBf.FlightSectors[0], curBf.FlightSectors[0]);\r\n var sectorSecondEqual = _this._isEqualFlightSectors(lastBf.FlightSectors[1], curBf.FlightSectors[1]);\r\n if (!sectorFirstEqual || !sectorSecondEqual) {\r\n prev.push(curBf);\r\n }\r\n }\r\n else {\r\n prev.push(curBf);\r\n }\r\n return prev;\r\n }, []);\r\n };\r\n BrandedFareTypesService.prototype.getCabinName = function (title) {\r\n var classes = [\r\n 'Premium Economy',\r\n 'Economy',\r\n 'Business',\r\n 'First'\r\n ];\r\n for (var i = 0; i < classes.length; i++) {\r\n if (title.match(classes[i])) {\r\n return classes[i];\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype.addCabinType = function (data) {\r\n if (!data.CabinType) {\r\n var cabinType = this.getCabinName(data.BrandTitle);\r\n data.CabinType = cabinType;\r\n }\r\n };\r\n BrandedFareTypesService.prototype._isEqualFlightSectors = function (oneFs, secondFs) {\r\n this.addCabinType(oneFs);\r\n this.addCabinType(secondFs);\r\n var props = [\r\n 'BaggageText',\r\n 'CabinBaggageText',\r\n 'CabinType',\r\n 'SeatsSelectionText',\r\n 'ChauffeurText'\r\n ];\r\n var res = true;\r\n for (var i = 0; i < props.length; ++i) {\r\n var propName = props[i];\r\n if (oneFs[propName] !== secondFs[propName]) {\r\n res = false;\r\n break;\r\n }\r\n }\r\n return res;\r\n };\r\n BrandedFareTypesService.prototype.getBrandedFareTypePrice = function (brandedFareType) {\r\n if (brandedFareType.TotalAmount) {\r\n return brandedFareType.TotalAmount;\r\n }\r\n var adultPrice = this._getPricePerPassengerAge('Adult', brandedFareType);\r\n var childPrice = this._getPricePerPassengerAge('Child', brandedFareType);\r\n var infantPrice = this._getPricePerPassengerAge('Infant', brandedFareType);\r\n return adultPrice + childPrice + infantPrice;\r\n };\r\n BrandedFareTypesService.prototype._getPricePerPassengerAge = function (type, brandedFareType) {\r\n var fare = _.get(brandedFareType, type + \"Fare.Amount\") || 0;\r\n var fareQuantity = _.get(brandedFareType.priceQuantities, type + \"FareQuantity\") || 0;\r\n var tax = _.get(brandedFareType, type + \"Tax.Amount\") || 0;\r\n var taxQuantity = _.get(brandedFareType.priceQuantities, type + \"TaxQuantity\") || 0;\r\n return fare * fareQuantity + tax * taxQuantity;\r\n };\r\n BrandedFareTypesService.prototype.getCancellationCharges = function (id) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var payload, url, response, details, error_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n payload = {\r\n 'BasketId': id\r\n };\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n url = \"/api/holidays/basketcancellationcharges\";\r\n return [4 /*yield*/, fetch(url, {\r\n method: 'post',\r\n body: JSON.stringify(payload),\r\n mode: 'cors',\r\n headers: new Headers({\r\n 'Content-Type': 'application/json'\r\n })\r\n })];\r\n case 2:\r\n response = _a.sent();\r\n return [4 /*yield*/, response.json()];\r\n case 3:\r\n details = _a.sent();\r\n return [2 /*return*/, details];\r\n case 4:\r\n error_1 = _a.sent();\r\n console.log('error', error_1);\r\n throw error_1;\r\n case 5: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypesService.prototype.getBaggage = function (sector) {\r\n switch (sector.BaggageType) {\r\n case 'ONE_TWO_THREE':\r\n return ONE_TWO_THREE + \" \" + this.resourceService.get('BRANDED_FARE_TYPES_KGPP');\r\n case 'PIECE_CONCEPT':\r\n return this.resourceService.get('BRANDED_FARE_TYPES_BAGGAGE_PIECE_CONCEPT');\r\n case 'TWO_TWO_THREE':\r\n return TWO_TWO_THREE + \" \" + this.resourceService.get('BRANDED_FARE_TYPES_KGPP');\r\n case 'TWO_THREE_TWO':\r\n return TWO_THREE_TWO + \" \" + this.resourceService.get('BRANDED_FARE_TYPES_KGPP');\r\n case 'NOT_INCLUDED':\r\n return this.resourceService.get('BRANDED_FARE_TYPES_BAGGAGE_NOT_INCLUDED');\r\n default:\r\n return sector.BaggageAllowanceTotalKg + \" \" + this.resourceService.get('BRANDED_FARE_TYPES_KGPP');\r\n }\r\n };\r\n BrandedFareTypesService.prototype._getBaggageType = function (sector) {\r\n var attr = this._getAttribute(sector, AttributeTypes.Baggage);\r\n var checkedMatcher = attr.Text.match(/^Checked[^\\d]+(\\d+)kg/);\r\n var cabin = this._getCabin(sector);\r\n var isEconomySaver = sector.TransformedType === TransformedType.EconomySaver;\r\n var isEconomySpecial = sector.TransformedType === TransformedType.EconomySpecial;\r\n var isPremiumEconomyFlexPlus = sector.TransformedType === TransformedType.PremiumEconomyFlexPlus;\r\n if (attr.AttributeInclusionType === 0) {\r\n switch (true) {\r\n case checkedMatcher !== null:\r\n return checkedMatcher[1];\r\n case cabin === 1 && isEconomySpecial:\r\n return 'ONE_TWO_THREE';\r\n case cabin === 1 && isEconomySaver:\r\n return 'PIECE_CONCEPT';\r\n case cabin === 1:\r\n return 'TWO_TWO_THREE';\r\n default:\r\n return 'TWO_THREE_TWO';\r\n }\r\n }\r\n else if (isPremiumEconomyFlexPlus) {\r\n return sector.BaggageAllowanceTotalKg.toString();\r\n }\r\n else {\r\n return 'NOT_INCLUDED';\r\n }\r\n };\r\n BrandedFareTypesService.prototype.setCabinBaggage = function (attr, cabin) {\r\n var value = '';\r\n if (attr.AttributeInclusionType === 0 && cabin === 1) {\r\n value = ONE_SEVEN;\r\n }\r\n else if (attr.AttributeInclusionType === 0 && cabin === 2) {\r\n value = ONE_TEN;\r\n }\r\n else {\r\n value = TWO_SEVEN;\r\n }\r\n return value + \" \" + this.resourceService.get('BRANDED_FARE_TYPES_KGPP');\r\n };\r\n BrandedFareTypesService.prototype.getCabinBaggage = function (sector) {\r\n var cabin = this._getCabin(sector);\r\n var attr = this._getAttribute(sector, AttributeTypes.CabinBaggage);\r\n return this.setCabinBaggage(attr, cabin);\r\n };\r\n BrandedFareTypesService.prototype.getSeatsSelection = function (sector) {\r\n if (this.isRestrictedSeats(sector)) {\r\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_RESTRICTED');\r\n }\r\n var attr = this._getAttribute(sector, AttributeTypes.SeatsSelection);\r\n if (attr.AttributeInclusionType === 0) {\r\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_COMPLIMENTARY');\r\n }\r\n else {\r\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_AT_CHECK_IN');\r\n }\r\n };\r\n BrandedFareTypesService.prototype.isRestrictedSeats = function (sector) {\r\n var attr = this._getAttribute(sector, AttributeTypes.SeatsSelection);\r\n return (attr.AttributeInclusionType === 0 || attr.AttributeInclusionType === 3)\r\n && sector.TransformedType === TransformedType.BusinessSpecial;\r\n };\r\n BrandedFareTypesService.prototype.getChauffeur = function (sector) {\r\n var cabin = this._getCabin(sector);\r\n return sector.TransformedType === TransformedType.BusinessSpecial\r\n || sector.TransformedType === TransformedType.PremiumEconomyFlexPlus\r\n || cabin === 1 ?\r\n this.resourceService.get('BRANDED_FARE_TYPES_CHAUFFEUR_NOT_ELIGIBLE') :\r\n this.resourceService.get('BRANDED_FARE_TYPES_CHAUFFEUR_ELIGIBLE');\r\n };\r\n BrandedFareTypesService.prototype.containPieceBaggageConcept = function (fareTypes, sectorNumber) {\r\n var res = false;\r\n for (var i = 0; i < fareTypes.length; ++i) {\r\n var sector = fareTypes[i].FlightSectors[sectorNumber];\r\n if (sector.BaggageType === 'PIECE_CONCEPT') {\r\n res = true;\r\n break;\r\n }\r\n }\r\n return res;\r\n };\r\n BrandedFareTypesService.prototype.calculateTotalFares = function (fare, qtys) {\r\n if (fare && qtys && fare.AdultFare && fare.AdultFare.Amount) {\r\n var adultCost = fare.AdultFare.Amount;\r\n var adultQty = qtys.AdultFareQuantity;\r\n var childCost = fare.ChildFare.Amount;\r\n var childQty = qtys.ChildFareQuantity;\r\n var infantCost = fare.InfantFare.Amount;\r\n var infantQty = qtys.InfantFareQuantity;\r\n var totalAdultFares = adultCost * adultQty;\r\n var totalChildFares = childCost * childQty;\r\n var totalInfantFares = infantCost * infantQty;\r\n var totalFares = totalAdultFares + totalChildFares + totalInfantFares;\r\n return totalFares;\r\n }\r\n };\r\n BrandedFareTypesService.prototype.calculateTotalTaxes = function (fare, qtys) {\r\n if (fare && qtys && fare.AdultTax && fare.AdultTax.Amount) {\r\n var adultTaxCost = fare.AdultTax.Amount;\r\n var adultTaxQty = qtys.AdultTaxQuantity;\r\n var childTaxCost = fare.ChildTax.Amount;\r\n var childTaxQty = qtys.ChildTaxQuantity;\r\n var infantTaxCost = fare.InfantTax.Amount;\r\n var infantTaxQty = qtys.InfantTaxQuantity;\r\n var totalAdultTax = adultTaxCost * adultTaxQty;\r\n var totalChildTax = childTaxCost * childTaxQty;\r\n var totalInfantTax = infantTaxCost * infantTaxQty;\r\n var totalTaxes = totalAdultTax + totalChildTax + totalInfantTax;\r\n return totalTaxes;\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getPriceQtys = function (data) {\r\n return data;\r\n };\r\n BrandedFareTypesService.prototype.setSkywards = function (arr) {\r\n arr.AccruedMiles = [{\r\n Miles: 0\r\n }];\r\n };\r\n BrandedFareTypesService.prototype.setPriceDifference = function (arr, defaultPrice, i) {\r\n var farePrice = arr[i].BrandedFareTypeTotalPrice;\r\n var priceDiff = Math.ceil(farePrice - defaultPrice);\r\n arr[i].BrandedFarePriceDifference = priceDiff;\r\n };\r\n BrandedFareTypesService.prototype.getPriceDifference = function (fareTypes) {\r\n var defaultPrice;\r\n var undefinedIndexes = [];\r\n for (var i = 0; i < fareTypes.length; i++) {\r\n if (fareTypes[i].IsSelected) {\r\n defaultPrice = fareTypes[i].BrandedFareTypeTotalPrice;\r\n }\r\n if (defaultPrice === undefined) {\r\n undefinedIndexes.push(i);\r\n }\r\n this.setPriceDifference(fareTypes, defaultPrice, i);\r\n }\r\n if (undefinedIndexes.length > 0) {\r\n for (var j = 0; j < undefinedIndexes.length; j++) {\r\n this.setPriceDifference(fareTypes, defaultPrice, j);\r\n }\r\n }\r\n return fareTypes;\r\n };\r\n BrandedFareTypesService.prototype.getDepartureCode = function (legs) {\r\n if (legs) {\r\n for (var i = 0; i < legs.length; i++) {\r\n if (legs[i].LegType === 'outbound') {\r\n return legs[i].DepartureAirport.Code;\r\n }\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getDestinationCode = function (legs) {\r\n if (legs) {\r\n for (var i = 0; i < legs.length; i++) {\r\n if (legs[i].LegType === 'outbound') {\r\n return legs[i].ArrivalAirport.Code;\r\n }\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getDepartureDate = function (legs) {\r\n for (var i = 0; i < legs.length; i++) {\r\n if (legs[i].LegType === 'outbound') {\r\n return legs[i].DepartureDate;\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype.collatePayloads = function (payload, domainId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var elemCount, theCall;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n this.allPayloads.push(payload);\r\n elemCount = document.querySelectorAll('.flight-listing-container').length;\r\n elemCount = elemCount - 1;\r\n if (!(this.allPayloads.length === elemCount)) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.callMilesApi(this.allPayloads, domainId)];\r\n case 1:\r\n theCall = _a.sent();\r\n sessionStorage.setItem('flightsSkywards', JSON.stringify(theCall));\r\n TRPCONFIG.Domain.flightsSkywards = theCall;\r\n return [2 /*return*/, theCall];\r\n case 2: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypesService.prototype.callMilesApi = function (payload, domainId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var url, response, miles, error_2;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 3, , 4]);\r\n url = \"/api/skywards/Accrual/getMiles?domainId=\" + domainId + \"&bookingChannelId=2\";\r\n return [4 /*yield*/, fetch(url, {\r\n method: 'post',\r\n body: JSON.stringify(payload),\r\n mode: 'cors',\r\n headers: new Headers({\r\n 'Content-Type': 'application/json'\r\n })\r\n })];\r\n case 1:\r\n response = _a.sent();\r\n return [4 /*yield*/, response.json()];\r\n case 2:\r\n miles = _a.sent();\r\n return [2 /*return*/, miles];\r\n case 3:\r\n error_2 = _a.sent();\r\n console.log('error', error_2);\r\n throw error_2;\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypesService.prototype.payloadEntry = function (id, trip, legs, hotel, price) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var domainId, tripHotel, pid, payload;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n domainId = TRPCONFIG.Domain.DomainId;\r\n pid = id;\r\n if (trip.HotelsRequest) {\r\n tripHotel = trip.HotelsRequest;\r\n }\r\n else {\r\n tripHotel = trip.HotelInfo;\r\n }\r\n if (id === null) {\r\n pid = this.guidService.uuid();\r\n }\r\n payload = {\r\n id: pid,\r\n price: price,\r\n bookingDate: this.dateUtil.serialiseDate(Date.now()),\r\n flights: [\r\n {\r\n departureAirportCode: this.getDepartureCode(legs),\r\n departureDate: this.dateUtil.serialiseDate(this.getDepartureDate(legs))\r\n }\r\n ],\r\n hotels: [\r\n {\r\n estabGroupIds: hotel.EstabGroupIds,\r\n checkInDate: tripHotel.CheckInDate\r\n }\r\n ]\r\n };\r\n return [4 /*yield*/, this.callMilesApi([payload], domainId)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypesService.prototype.languageCheck = function (cabinType) {\r\n switch (cabinType) {\r\n case 'Economy':\r\n case 'Økonomi klasse':\r\n case 'Economy Class':\r\n case 'Ekonomiklass':\r\n case 'الدرجة السياحية':\r\n return 'Economy';\r\n case 'Premium Economy':\r\n case 'Premium ekonomiklass':\r\n case 'الدرجة الاقتصادية المميزة':\r\n return 'Premium Economy';\r\n case 'Business':\r\n case 'Business Class':\r\n case 'درجة رجال الأعمال':\r\n return 'Business';\r\n case 'First':\r\n case 'Erste Klasse':\r\n case 'Första klass':\r\n case 'الدرجة الأولى':\r\n return 'First';\r\n default:\r\n return '';\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getCabin = function (fareBrandLeg, cabinLeg) {\r\n var legArr = fareBrandLeg.split(' ');\r\n var updatedLegArr = [];\r\n var isPremium = legArr.includes('Premium');\r\n if (isPremium) {\r\n legArr.splice(0, 2);\r\n }\r\n legArr.forEach(function (cabin, i) {\r\n if (cabin !== cabinLeg) {\r\n if ((cabinLeg !== 'Premium Economy' && i === 1) ||\r\n (cabinLeg === 'Premium Economy' && i === 0)) {\r\n cabin = cabin.toLowerCase();\r\n }\r\n updatedLegArr.push(cabin);\r\n }\r\n });\r\n return updatedLegArr;\r\n };\r\n BrandedFareTypesService.prototype.getCabinCode = function (cabinType) {\r\n switch (cabinType) {\r\n case 'Economy':\r\n return 'Y';\r\n case 'Premium Economy':\r\n return 'W';\r\n case 'Business':\r\n return 'J';\r\n case 'First':\r\n return 'F';\r\n default:\r\n return '';\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getFlightMiles = function (hotelSearch, origin, destination, cabinCodeLeg, journeyType, fareBrandLegResult) {\r\n if (origin && destination && cabinCodeLeg && journeyType) {\r\n return hotelSearch.getFlightMiles(origin, destination, cabinCodeLeg, journeyType)\r\n .then(function (result) {\r\n if (result.getMilesFromCouchbase.miles &&\r\n result.getMilesFromCouchbase.miles.earn &&\r\n result.getMilesFromCouchbase.miles.earn.skywards[fareBrandLegResult]) {\r\n return result.getMilesFromCouchbase.miles.earn.skywards[fareBrandLegResult].skywardsMiles;\r\n }\r\n });\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getFareInfo = function (fareOrLegsSelection, fareOrLegsAndBrandtitles, bft, fare, hotelSearch, origin, destination, getBrandTitleFirstLeg, getBrandTitleSecondLeg) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var flight, journeyType, fareBrand, cabinType, updatedFirstLegArr, fareBrandResult, cabinCode, journeyType, fareBrandFirstLeg, cabinTypeFirstLeg, fareBrandSecondLeg, cabinTypeSecondLeg, updatedFirstLegArr, updatedSecondLegArr, fareBrandFirstLegResult, fareBrandSecondLegResult, cabinCodefirstLeg, cabinCodeSecondLeg, skywardFlightMileForFirstLeg, skywardFlightMileForSecondLeg, journeyType, fareBrand, cabinType, updatedFirstLegArr, fareBrandResult, cabinCode, journeyType, cabinTypeFirstLeg, cabinTypeSecondLeg, fareBrandFirstLeg, fareBrandSecondLeg, updatedFirstLegArr, updatedSecondLegArr, fareBrandFirstLegResult, fareBrandSecondLegResult, cabinCodefirstLeg, cabinCodeSecondLeg, skywardFlightMileForFirstLeg, skywardFlightMileForSecondLeg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n bft = Number(bft);\r\n flight = fare.FlightSectors;\r\n if (!fare.FlightSectors) {\r\n flight = fare.Legs;\r\n }\r\n if (!(fareOrLegsSelection && fareOrLegsSelection !== undefined)) return [3 /*break*/, 6];\r\n if (!fareOrLegsAndBrandtitles) return [3 /*break*/, 2];\r\n journeyType = 'RT';\r\n fareBrand = flight[0].BrandTitle;\r\n cabinType = flight[0].CabinType;\r\n if (!fareBrand) {\r\n fareBrand = getBrandTitleFirstLeg;\r\n }\r\n cabinType = this.languageCheck(cabinType);\r\n updatedFirstLegArr = this.getCabin(fareBrand, cabinType);\r\n fareBrandResult = updatedFirstLegArr.join('');\r\n cabinCode = this.getCabinCode(cabinType);\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCode, journeyType, fareBrandResult)];\r\n case 1:\r\n bft = _a.sent();\r\n return [3 /*break*/, 5];\r\n case 2:\r\n journeyType = 'OW';\r\n fareBrandFirstLeg = flight[0].BrandTitle;\r\n cabinTypeFirstLeg = flight[0].CabinType;\r\n fareBrandSecondLeg = flight[1].BrandTitle;\r\n cabinTypeSecondLeg = flight[1].CabinType;\r\n if (!fareBrandFirstLeg) {\r\n fareBrandFirstLeg = getBrandTitleFirstLeg;\r\n }\r\n if (!fareBrandSecondLeg) {\r\n fareBrandSecondLeg = getBrandTitleSecondLeg;\r\n }\r\n cabinTypeFirstLeg = this.languageCheck(cabinTypeFirstLeg);\r\n cabinTypeSecondLeg = this.languageCheck(cabinTypeSecondLeg);\r\n updatedFirstLegArr = this.getCabin(fareBrandFirstLeg, cabinTypeFirstLeg);\r\n updatedSecondLegArr = this.getCabin(fareBrandSecondLeg, cabinTypeSecondLeg);\r\n fareBrandFirstLegResult = updatedFirstLegArr.join('');\r\n fareBrandSecondLegResult = updatedSecondLegArr.join('');\r\n cabinCodefirstLeg = this.getCabinCode(cabinTypeFirstLeg);\r\n cabinCodeSecondLeg = this.getCabinCode(cabinTypeSecondLeg);\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCodefirstLeg, journeyType, fareBrandFirstLegResult)];\r\n case 3:\r\n skywardFlightMileForFirstLeg = _a.sent();\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCodeSecondLeg, journeyType, fareBrandSecondLegResult)];\r\n case 4:\r\n skywardFlightMileForSecondLeg = _a.sent();\r\n bft = parseInt(skywardFlightMileForFirstLeg, 10) +\r\n parseInt(skywardFlightMileForSecondLeg, 10);\r\n _a.label = 5;\r\n case 5: return [3 /*break*/, 11];\r\n case 6:\r\n if (!(fare.Legs[0].BrandTitle === fare.Legs[1].BrandTitle)) return [3 /*break*/, 8];\r\n journeyType = 'RT';\r\n fareBrand = fare.Legs[0].BrandTitle;\r\n cabinType = fare.Legs[0].CabinType;\r\n cabinType = this.languageCheck(cabinType);\r\n updatedFirstLegArr = this.getCabin(fareBrand, cabinType);\r\n fareBrandResult = updatedFirstLegArr.join('');\r\n cabinCode = this.getCabinCode(cabinType);\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCode, journeyType, fareBrandResult)];\r\n case 7:\r\n bft = _a.sent();\r\n return [3 /*break*/, 11];\r\n case 8:\r\n journeyType = 'OW';\r\n cabinTypeFirstLeg = fare.Legs[0].CabinType;\r\n cabinTypeSecondLeg = fare.Legs[1].CabinType;\r\n fareBrandFirstLeg = fare.Legs[0].BrandTitle;\r\n fareBrandSecondLeg = fare.Legs[1].BrandTitle;\r\n cabinTypeFirstLeg = this.languageCheck(cabinTypeFirstLeg);\r\n cabinTypeSecondLeg = this.languageCheck(cabinTypeSecondLeg);\r\n updatedFirstLegArr = this.getCabin(fareBrandFirstLeg, cabinTypeFirstLeg);\r\n updatedSecondLegArr = this.getCabin(fareBrandSecondLeg, cabinTypeSecondLeg);\r\n fareBrandFirstLegResult = updatedFirstLegArr.join('');\r\n fareBrandSecondLegResult = updatedSecondLegArr.join('');\r\n cabinCodefirstLeg = this.getCabinCode(cabinTypeFirstLeg);\r\n cabinCodeSecondLeg = this.getCabinCode(cabinTypeSecondLeg);\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCodefirstLeg, journeyType, fareBrandFirstLegResult)];\r\n case 9:\r\n skywardFlightMileForFirstLeg = _a.sent();\r\n return [4 /*yield*/, this.getFlightMiles(hotelSearch, origin, destination, cabinCodeSecondLeg, journeyType, fareBrandSecondLegResult)];\r\n case 10:\r\n skywardFlightMileForSecondLeg = _a.sent();\r\n bft = parseInt(skywardFlightMileForFirstLeg, 10) +\r\n parseInt(skywardFlightMileForSecondLeg, 10);\r\n _a.label = 11;\r\n case 11:\r\n this.flightMilesToPkgPP = bft;\r\n return [2 /*return*/, bft];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypesService.prototype._getCabin = function (sector) {\r\n return sector.Segments[0].Cabin;\r\n };\r\n BrandedFareTypesService.prototype._getAttribute = function (leg, attrType) {\r\n return _.find(leg.BrandAttributes, { AttributeType: attrType });\r\n };\r\n BrandedFareTypesService.prototype._getTransformedType = function (brandTitle) {\r\n switch (brandTitle.trim().toLowerCase()) {\r\n case 'economy special':\r\n return TransformedType.EconomySpecial;\r\n case 'eco special':\r\n return TransformedType.EconomySpecial;\r\n case 'economy saver':\r\n return TransformedType.EconomySaver;\r\n case 'eco saver':\r\n return TransformedType.EconomySaver;\r\n case 'economy flex':\r\n return TransformedType.EconomyFlex;\r\n case 'eco flex':\r\n return TransformedType.EconomyFlex;\r\n case 'economy flex plus':\r\n return TransformedType.EconomyFlexPlus;\r\n case 'eco flexplus':\r\n return TransformedType.EconomyFlexPlus;\r\n case 'premium economy flex plus':\r\n return TransformedType.PremiumEconomyFlexPlus;\r\n case 'prem eco flexplus':\r\n return TransformedType.PremiumEconomyFlexPlus;\r\n case 'business special':\r\n return TransformedType.BusinessSpecial;\r\n case 'business saver':\r\n return TransformedType.BusinessSaver;\r\n case 'business flex':\r\n return TransformedType.BusinessFlex;\r\n case 'business flex plus':\r\n return TransformedType.BusinessFlexPlus;\r\n case 'business flexplus':\r\n return TransformedType.BusinessFlexPlus;\r\n case 'first saver':\r\n return TransformedType.FirstSaver;\r\n case 'first flex':\r\n return TransformedType.FirstFlex;\r\n case 'first flex plus':\r\n return TransformedType.FirstFlexPlus;\r\n case 'first flexplus':\r\n return TransformedType.FirstFlexPlus;\r\n default:\r\n return TransformedType.NotDefined;\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getClassName = function (fc) {\r\n var classObj = {\r\n 'F': 'First Flex Plus',\r\n 'A': 'First Flex',\r\n 'Z': 'First Others',\r\n 'J': 'Business Flex Plus',\r\n 'C': 'Business Flex Plus',\r\n 'I': 'Business Flex',\r\n 'O': 'Business Saver',\r\n 'H': 'Business Special',\r\n 'D': 'Business Others',\r\n 'P': 'Business Others',\r\n 'W': 'Premium Economy Flex Plus',\r\n 'E': 'Premium Economy Flex Plus',\r\n 'N': 'Premium Economy Others',\r\n 'Y': 'Economy Flex Plus',\r\n 'R': 'Economy Flex Plus',\r\n 'M': 'Economy Flex',\r\n 'B': 'Economy Flex',\r\n 'U': 'Economy Flex',\r\n 'K': 'Economy Flex',\r\n 'Q': 'Economy Saver',\r\n 'L': 'Economy Saver',\r\n 'T': 'Economy Saver',\r\n 'X': 'Economy Special',\r\n 'V': 'Economy Special',\r\n 'G': 'Economy Others',\r\n 'S': 'Economy Others'\r\n };\r\n var coKey = Object.keys(classObj);\r\n for (var i = 0; i < coKey.length; i++) {\r\n if (coKey[i] === fc) {\r\n return classObj[coKey[i]];\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype.getBookingClassName = function (fc) {\r\n var classObj = {\r\n 'F': 'Flex Plus',\r\n 'A': 'Flex',\r\n 'Z': 'Others',\r\n 'J': 'Flex Plus',\r\n 'C': 'Flex Plus',\r\n 'I': 'Flex',\r\n 'O': 'Saver',\r\n 'H': 'Special',\r\n 'D': 'Others',\r\n 'P': 'Others',\r\n 'W': 'Flex Plus',\r\n 'E': 'Flex Plus',\r\n 'N': 'Others',\r\n 'Y': 'Flex Plus',\r\n 'R': 'Flex Plus',\r\n 'M': 'Flex',\r\n 'B': 'Flex',\r\n 'U': 'Flex',\r\n 'K': 'Flex',\r\n 'Q': 'Saver',\r\n 'L': 'Saver',\r\n 'T': 'Saver',\r\n 'X': 'Special',\r\n 'V': 'Special',\r\n 'G': 'Others',\r\n 'S': 'Others'\r\n };\r\n var coKey = Object.keys(classObj);\r\n for (var i = 0; i < coKey.length; i++) {\r\n if (coKey[i] === fc) {\r\n return classObj[coKey[i]];\r\n }\r\n }\r\n };\r\n BrandedFareTypesService.prototype._setClassName = function (type) {\r\n switch (type) {\r\n case ekh.TransformedType.EconomySpecial:\r\n return 'economy-special';\r\n case ekh.TransformedType.EconomySaver:\r\n return 'economy-saver';\r\n case ekh.TransformedType.EconomyFlex:\r\n return 'economy-flex';\r\n case ekh.TransformedType.EconomyFlexPlus:\r\n return 'economy-flex-plus';\r\n case ekh.TransformedType.PremiumEconomyFlexPlus:\r\n return 'premium-economy-flex-plus';\r\n case ekh.TransformedType.BusinessSpecial:\r\n return 'business-special';\r\n case ekh.TransformedType.BusinessSaver:\r\n return 'business-saver';\r\n case ekh.TransformedType.BusinessFlex:\r\n return 'business-flex';\r\n case ekh.TransformedType.BusinessFlexPlus:\r\n return 'business-flex-plus';\r\n case ekh.TransformedType.FirstSaver:\r\n return 'first-saver';\r\n case ekh.TransformedType.FirstFlex:\r\n return 'first-flex';\r\n case ekh.TransformedType.FirstFlexPlus:\r\n return 'first-flex-plus';\r\n default:\r\n return '';\r\n }\r\n };\r\n return BrandedFareTypesService;\r\n }());\r\n ekh.BrandedFareTypesService = BrandedFareTypesService;\r\n angular\r\n .module('ekh')\r\n .service('brandedFareTypesService', BrandedFareTypesService);\r\n})(ekh || (ekh = {}));\r\nvar Core;\r\n(function (Core) {\r\n var BrandedFare = /** @class */ (function () {\r\n function BrandedFare(brandedFareTypesService, resourceService, $filter, basketStore, guidService, tripService, $routeParams, hotelSearch) {\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.resourceService = resourceService;\r\n this.$filter = $filter;\r\n this.basketStore = basketStore;\r\n this.guidService = guidService;\r\n this.tripService = tripService;\r\n this.$routeParams = $routeParams;\r\n this.hotelSearch = hotelSearch;\r\n this.fs = sessionStorage.getItem('storeSelectedFlight');\r\n this.qtys = sessionStorage.getItem('priceQtys');\r\n this.collected = false;\r\n this.guid = this.guidService.uuid();\r\n this.hts = sessionStorage.getItem('hotelDetailsSkywards');\r\n this.skywardsPoints = 0;\r\n this.flightMilesToPkgPP = 0;\r\n this.code = TRPCONFIG.Domain.CultureCode;\r\n }\r\n BrandedFare.prototype.$onInit = function () {\r\n this.getPackage(this.fare);\r\n this.classNameIn = this.brandedFareTypesService._setClassName(this.fare.FlightSectors[0].TransformedType);\r\n this.classNameOut = this.brandedFareTypesService._setClassName(this.fare.FlightSectors[1].TransformedType);\r\n this.selectButtonLabel = this.resourceService.get('BRANDED_FARE_TYPES_BUTTON_SELECT');\r\n this.selectedButtonLabel = this.resourceService.get('BRANDED_FARE_TYPES_BUTTON_SELECTED');\r\n };\r\n BrandedFare.prototype.select = function () {\r\n TRPCONFIG.Domain.totalHolidayPrice = undefined;\r\n this.onSelect(this.fare);\r\n var oldPrice = TRPCONFIG.Domain.FlightFare.BrandedFareTypeTotalPrice;\r\n var t = this;\r\n var intvl = setInterval(function () {\r\n if (oldPrice !== TRPCONFIG.Domain.FlightFare.BrandedFareTypeTotalPrice) {\r\n clearInterval(intvl);\r\n t.getCancellationDetails();\r\n }\r\n }, 100);\r\n };\r\n BrandedFare.prototype.getCancellationDetails = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var cancellation;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.brandedFareTypesService.getCancellationCharges(TRPCONFIG.BasketId)];\r\n case 1:\r\n cancellation = _a.sent();\r\n TRPCONFIG.Domain.BrandedFareCancellations = cancellation;\r\n return [2 /*return*/, cancellation];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFare.prototype.getBaggage = function (sector) {\r\n return sector.BaggageText;\r\n };\r\n BrandedFare.prototype.getCabinBaggage = function (sector) {\r\n return sector.CabinBaggageText;\r\n };\r\n BrandedFare.prototype.getSeatsSelection = function (sector) {\r\n return sector.SeatsSelectionText;\r\n };\r\n BrandedFare.prototype.getChauffeur = function (sector) {\r\n return sector.ChauffeurText;\r\n };\r\n BrandedFare.prototype.getCancellations = function (sector) {\r\n var charge = sector.BrandedFareCancellationCharge.Amount;\r\n var date = sector.BrandedFareCancellationDate;\r\n var formatedDate = this._cancellationDateFormat(date);\r\n return this.$filter('roundedCurrency')(charge) + \" after \" + formatedDate;\r\n };\r\n BrandedFare.prototype.displaySkywards = function (sector) {\r\n return this.skywardsPoints;\r\n };\r\n BrandedFare.prototype.displayTotalPkgFlightMiles = function (sector) {\r\n TRPCONFIG.Domain.SkywardsFlightMiles = this.flightMilesToPkgPP;\r\n return this.flightMilesToPkgPP;\r\n };\r\n BrandedFare.prototype.getPackage = function (fare) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var trip, selectedFlight, legs, hotel, baseCost, qtys, totalFares, packageCost, accruedMiles, _a, origin, destination, fareAndFlightSelectors, fareAndFlightAndBrandtitles, miles, _b;\r\n return __generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0: return [4 /*yield*/, this.tripService.getTrip(this.$routeParams.tripId).then(function (t) {\r\n return t;\r\n })];\r\n case 1:\r\n trip = _c.sent();\r\n selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\r\n legs = fare.Legs || selectedFlight.Legs;\r\n hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\r\n baseCost = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\r\n qtys = JSON.parse(this.qtys);\r\n totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\r\n packageCost = baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\r\n if (!packageCost) return [3 /*break*/, 4];\r\n return [4 /*yield*/, this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost)];\r\n case 2:\r\n accruedMiles = _c.sent();\r\n if (!(accruedMiles[0] && accruedMiles[0].Miles)) return [3 /*break*/, 4];\r\n _a = this;\r\n return [4 /*yield*/, accruedMiles[0].Miles];\r\n case 3:\r\n _a.skywardsPoints = _c.sent();\r\n _c.label = 4;\r\n case 4:\r\n origin = this.brandedFareTypesService.getDepartureCode(legs);\r\n destination = this.brandedFareTypesService.getDestinationCode(legs);\r\n fareAndFlightSelectors = fare && fare.FlightSectors;\r\n fareAndFlightAndBrandtitles = fareAndFlightSelectors &&\r\n fare.FlightSectors[0].BrandTitle === fare.FlightSectors[1].BrandTitle;\r\n miles = this.brandedFareTypesService.getFareInfo(fareAndFlightSelectors, fareAndFlightAndBrandtitles, this.brandedFareTypesService.flightMilesToPkgPP, fare, this.hotelSearch, origin, destination, null, null);\r\n _b = this;\r\n return [4 /*yield*/, miles];\r\n case 5:\r\n _b.flightMilesToPkgPP = _c.sent();\r\n return [4 /*yield*/, miles];\r\n case 6: return [2 /*return*/, _c.sent()];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFare.prototype.getPriceDelta = function () {\r\n var dif = this.fare.BrandedFareTypeTotalPrice - this.selectedFareTotalPrice;\r\n if (Math.round(dif) === 0) {\r\n return '';\r\n }\r\n var sign = dif > 0 ? '+' : '';\r\n return \"\" + sign + this.$filter('roundedCurrency')(dif, this.currency);\r\n };\r\n BrandedFare.prototype.isRestrictedSeats = function (sector) {\r\n return this.brandedFareTypesService.isRestrictedSeats(sector);\r\n };\r\n BrandedFare.prototype.getSeatsSelectionTooltipText = function () {\r\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_RESTRICTED_TOOLTIP_TEXT');\r\n };\r\n BrandedFare.prototype.isSameClass = function (tripBound, flight) {\r\n if (flight.Segments.length > 1) {\r\n var fs = flight.Segments;\r\n if (fs) {\r\n var fareClassArr = fs.map(function (x) {\r\n if (x.FareClass) {\r\n return x.FareClass;\r\n }\r\n else {\r\n return x.SupplierFareClass;\r\n }\r\n });\r\n var allEqual = function (arr) { return arr.every(function (val) { return val !== undefined && val === arr[0]; }); };\r\n var result = allEqual(fareClassArr);\r\n return result;\r\n }\r\n }\r\n return true;\r\n };\r\n BrandedFare.prototype.titleHeader = function (fs, dir, bound, flight) {\r\n var brandTitle = flight.BrandTitle;\r\n if (brandTitle.match(/flex/i)) {\r\n var splitText = brandTitle.split('Flex');\r\n brandTitle = \"\" + splitText[0] + \"
Flex \" + splitText[1];\r\n }\r\n else if (brandTitle.match(/saver/i)) {\r\n var splitText = brandTitle.split('Saver');\r\n brandTitle = \"\" + splitText[0] + \"
Saver \" + splitText[1];\r\n }\r\n else if (brandTitle.match(/special/i)) {\r\n var splitText = brandTitle.split('Special');\r\n brandTitle = \"\" + splitText[0] + \"
Special \" + splitText[1];\r\n }\r\n var classCheck = this.isSameClass(bound, flight);\r\n var toolTipText = '';\r\n var codes = [];\r\n if (!classCheck) {\r\n if (fs) {\r\n var fsParse = JSON.parse(fs);\r\n var legs = bound === 'outbound' ? fsParse.Legs[0] : fsParse.Legs[1];\r\n codes = legs.Segments.map(function (x) {\r\n return x.DepartureAirportCode + \" - \" + x.DestinationAirportCode;\r\n });\r\n }\r\n var segments = [];\r\n for (var i = 0; i < flight.Segments.length; i++) {\r\n var fc = flight.Segments[i].FareClass;\r\n if (!fc) {\r\n fc = flight.Segments[i].SupplierFareClass;\r\n }\r\n var s = \"\" + codes[i] + \": \" + this.brandedFareTypesService.getClassName(fc) + \" Class\";\r\n segments.push(s);\r\n }\r\n var segmentText = segments.join('
');\r\n toolTipText = \"
\\n

\" + flight.BrandTitle + \" Class is partially available

\\n

\" + flight.BrandTitle + \" Class is not avaliable on all sectors of your journey\\n
\" + segmentText + \"

\\n
\\n \\n \\n Partially Available\\n \";\r\n }\r\n return \"\\n \" + brandTitle + \" \" + toolTipText;\r\n };\r\n BrandedFare.prototype.getCultureCode = function (code) {\r\n var data = {\r\n 'ar-ae': {\r\n 'MONTH': ['\\u064a\\u0646\\u0627\\u064a\\u0631', '\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631',\r\n '\\u0645\\u0627\\u0631\\u0633', '\\u0623\\u0628\\u0631\\u064a\\u0644', '\\u0645\\u0627\\u064a\\u0648',\r\n '\\u064a\\u0648\\u0646\\u064a\\u0648', '\\u064a\\u0648\\u0644\\u064a\\u0648',\r\n '\\u0623\\u063a\\u0633\\u0637\\u0633', '\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631',\r\n '\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631', '\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631',\r\n '\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631'],\r\n },\r\n 'de-de': {\r\n 'MONTH': ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',\r\n 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\r\n },\r\n 'dk-da': {\r\n 'MONTH': ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni',\r\n 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\r\n },\r\n 'en-gb': {\r\n 'MONTH': ['January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December']\r\n },\r\n 'it-it': {\r\n 'MONTH': ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',\r\n 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],\r\n },\r\n 'ru-ru': {\r\n 'MONTH': ['\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f', '\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f',\r\n '\\u043c\\u0430\\u0440\\u0442\\u0430', '\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f', '\\u043c\\u0430\\u044f',\r\n '\\u0438\\u044e\\u043d\\u044f', '\\u0438\\u044e\\u043b\\u044f',\r\n '\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430',\r\n '\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f',\r\n '\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f',\r\n '\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f',\r\n '\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f'],\r\n },\r\n 'sv-se': {\r\n 'MONTH': ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni',\r\n 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'],\r\n }\r\n };\r\n var months = data['en-gb'].MONTH;\r\n var d = Object.keys(data);\r\n for (var i = 0; i < d.length; i++) {\r\n if (code === d[i]) {\r\n months = data[d[i]].MONTH;\r\n }\r\n }\r\n return months;\r\n };\r\n BrandedFare.prototype._monthFormat = function (month) {\r\n var months = this.getCultureCode(this.code);\r\n return months[month];\r\n };\r\n BrandedFare.prototype._cancellationDateFormat = function (date) {\r\n var timestamp = Date.parse(date);\r\n var d = new Date(timestamp);\r\n var month = this._monthFormat(d.getMonth());\r\n return d.getDate() + \" \" + month + \" \" + d.getFullYear();\r\n };\r\n return BrandedFare;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('brandedFare', function () {\r\n return {\r\n restrict: 'E',\r\n controller: BrandedFare,\r\n controllerAs: 'bf',\r\n bindToController: {\r\n isSelected: '=',\r\n fare: '=',\r\n onSelect: '&',\r\n pieceConceptLegIn: '=',\r\n pieceConceptLegOut: '=',\r\n selectedFareTotalPrice: '=',\r\n currency: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=BrandedFares'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var BrandedFareTypes = /** @class */ (function () {\r\n function BrandedFareTypes(tripService, broker, $routeParams, flightDetail, $q, basketStore, basketService, $element, brandedFareTypesService, resourceService, $filter, analytics, occupancyService, hotelSearch) {\r\n this.tripService = tripService;\r\n this.broker = broker;\r\n this.$routeParams = $routeParams;\r\n this.flightDetail = flightDetail;\r\n this.$q = $q;\r\n this.basketStore = basketStore;\r\n this.basketService = basketService;\r\n this.$element = $element;\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.resourceService = resourceService;\r\n this.$filter = $filter;\r\n this.analytics = analytics;\r\n this.occupancyService = occupancyService;\r\n this.hotelSearch = hotelSearch;\r\n this.flight = {};\r\n this.originalCabinClass = 0;\r\n this.trip = {};\r\n this.brandedFareTypes = undefined;\r\n this.filteredBrandedFareTypes = undefined;\r\n this.selectedBrandedFareTypeIndex = 0;\r\n this.qtys = sessionStorage.getItem('priceQtys');\r\n this.baseCost = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\r\n }\r\n BrandedFareTypes.prototype.$onInit = function () {\r\n var _this = this;\r\n this.loadingBrandedFareTypes = true;\r\n this.expanded = !TRPCONFIG.IsMobileDevice;\r\n this._getTrip()\r\n .then(this._getFlight.bind(this))\r\n .then(this._getBrandedFareTypes.bind(this))\r\n .then(this._setCurrency.bind(this))\r\n .finally(function () {\r\n _this.loadingBrandedFareTypes = false;\r\n });\r\n };\r\n BrandedFareTypes.prototype.getTranslation = function (term) {\r\n return this.resourceService.get(term);\r\n };\r\n BrandedFareTypes.prototype.getPostLoadedHeader = function () {\r\n var priceDif = this._getStartUpgradePrice();\r\n if (this.filteredBrandedFareTypes && this.filteredBrandedFareTypes.length) {\r\n if (TRPCONFIG.IsMobileDevice || !priceDif || priceDif === '') {\r\n return String.format(this.getTranslation('BRANDED_FARE_TYPES_POSTLOADED_MOBILE_HEADER'), this.filteredBrandedFareTypes.length, priceDif);\r\n }\r\n else {\r\n return String.format(this.getTranslation('BRANDED_FARE_TYPES_POSTLOADED_HEADER'), this.filteredBrandedFareTypes.length, priceDif);\r\n }\r\n }\r\n return '';\r\n };\r\n BrandedFareTypes.prototype.getAirports = function (leg) {\r\n var arAir = _.get(leg, 'ArrivalAirport.Code');\r\n var depAir = _.get(leg, 'DepartureAirport.Code');\r\n return depAir + \"-\" + arAir;\r\n };\r\n BrandedFareTypes.prototype._getTrip = function () {\r\n var _this = this;\r\n return this.tripService.getTrip(this.$routeParams.tripId).then(function (trip) {\r\n _this.trip = trip;\r\n });\r\n };\r\n BrandedFareTypes.prototype._setStartingSelection = function (brandedFareTypes) {\r\n var selectedFarePrice = this.selectedBrandedFareType.BrandedFareTypeTotalPrice;\r\n brandedFareTypes.map(function (v) {\r\n v.IsSelected = false;\r\n var farePrice = v.BrandedFareTypeTotalPrice;\r\n farePrice = farePrice.toFixed(2);\r\n farePrice = Number(farePrice);\r\n if (farePrice === selectedFarePrice) {\r\n v.IsSelected = true;\r\n }\r\n });\r\n };\r\n BrandedFareTypes.prototype._skywardsInfo = function (arr, tripId, ts, bfs) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var trip, legs, hotel, i, taxes, price, accruedMiles;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!(arr.length && ts)) return [3 /*break*/, 5];\r\n return [4 /*yield*/, ts.getTrip(tripId).then(function (t) {\r\n return t;\r\n })];\r\n case 1:\r\n trip = _a.sent();\r\n legs = arr[0].Legs;\r\n hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\r\n i = 0;\r\n _a.label = 2;\r\n case 2:\r\n if (!(i < arr.length)) return [3 /*break*/, 5];\r\n if (arr[i].IsSelected) {\r\n taxes = [{\r\n adultTax: arr[i].AdultTax.Amount,\r\n childTax: arr[i].ChildTax.Amount,\r\n infantTax: arr[i].InfantTax.Amount\r\n }];\r\n sessionStorage.setItem('selectedFareTaxes', JSON.stringify(taxes));\r\n }\r\n price = arr[i].PackagePrice;\r\n if (!(price !== undefined && price !== null)) return [3 /*break*/, 4];\r\n return [4 /*yield*/, bfs.payloadEntry(null, trip, legs, hotel, price)];\r\n case 3:\r\n accruedMiles = _a.sent();\r\n arr[i].AccruedMiles = accruedMiles;\r\n if (arr[i].IsSelected) {\r\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\r\n }\r\n _a.label = 4;\r\n case 4:\r\n i++;\r\n return [3 /*break*/, 2];\r\n case 5: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypes.prototype._getBrandedFareTypes = function () {\r\n var _this = this;\r\n var tripId = this.trip && this.trip.TripId;\r\n var searchId = _.get(this.trip, 'FlightsRequest.AvailabilitySearchId');\r\n var flightId = _.get(this.trip, 'FlightsRequest.SelectedFlight.FlightId');\r\n if (tripId && searchId && flightId) {\r\n return this.flightDetail.getFlightDetails(tripId, {\r\n AvailabilitySearchId: searchId,\r\n FlightId: flightId,\r\n IncludeSeatPlan: true,\r\n MultiSector: false,\r\n IncludeBrandedFares: true\r\n })\r\n .then(function (details) {\r\n if (details) {\r\n _this._setPriceQuantities(details);\r\n _this._setDefaultBrandedFareType(details);\r\n _this._setSelectedFareType(_this.flight);\r\n var brandedFareTypes = _.get(details, 'Itinerary.BrandedFares', [])\r\n .map(function (b) {\r\n b.priceQuantities = _this.priceQuantities;\r\n return _this.brandedFareTypesService.transform(b);\r\n });\r\n if (!_this._isExistedDefaultFareType(brandedFareTypes)) {\r\n brandedFareTypes.unshift(_this.defaultBrandedFareType);\r\n }\r\n _this.brandedFareTypes = _this.brandedFareTypesService.squeeze(brandedFareTypes);\r\n _this.isContainPieceBaggageConceptInLeg = _this.brandedFareTypesService\r\n .containPieceBaggageConcept(_this.brandedFareTypes, 0);\r\n _this.isContainPieceBaggageConceptOutLeg = _this.brandedFareTypesService\r\n .containPieceBaggageConcept(_this.brandedFareTypes, 1);\r\n // This code is to get the Skywards Info\r\n _this._setStartingSelection(_this.brandedFareTypes);\r\n _this.getPriceDifference = _this.brandedFareTypesService\r\n .getPriceDifference(_this.brandedFareTypes);\r\n // This is a hack to get the Skywards info for the Branded Fares\r\n var si_1 = _this._skywardsInfo;\r\n var ts_1 = _this.tripService;\r\n var bfs_1 = _this.brandedFareTypesService;\r\n var intvl_1 = setInterval(function () {\r\n if (bfs_1.brandedFares.length) {\r\n clearInterval(intvl_1);\r\n si_1(bfs_1.brandedFares, tripId, ts_1, bfs_1);\r\n }\r\n }, 100);\r\n if (_this.brandedFareTypes && _this.originalCabinClass === 2) {\r\n _this.filteredBrandedFareTypes = _this.brandedFareTypes.filter(function (item) { return item.FlightSectors[0].TransformedType >=\r\n ekh.TransformedType.PremiumEconomyFlexPlus; });\r\n }\r\n else if (_this.brandedFareTypes && _this.originalCabinClass === 8) {\r\n _this.filteredBrandedFareTypes = _this.brandedFareTypes.filter(function (item) { return item.FlightSectors[0].TransformedType >= ekh.TransformedType.BusinessSpecial; });\r\n }\r\n else if (_this.brandedFareTypes && _this.originalCabinClass === 4) {\r\n _this.filteredBrandedFareTypes = _this.brandedFareTypes.filter(function (item) { return item.FlightSectors[0].TransformedType >= ekh.TransformedType.FirstSaver; });\r\n }\r\n else {\r\n _this.filteredBrandedFareTypes = _this.brandedFareTypes;\r\n }\r\n }\r\n });\r\n }\r\n return this.$q.when();\r\n };\r\n BrandedFareTypes.prototype._getFlight = function () {\r\n var _this = this;\r\n if (this.trip && this.trip.BasketId) {\r\n return this.basketStore.flight(this.trip.BasketId).then(function (flight) {\r\n _this.flight = _.get(flight, 'Details.Itinerary') || {};\r\n _this.flight.TotalAmount = flight.TotalAmount;\r\n _this.originalCabinClass = flight.Details.Itinerary.Legs[0].Segments[0].Cabin;\r\n });\r\n }\r\n return this.$q.when();\r\n };\r\n BrandedFareTypes.prototype.getPackagePrice = function (fare) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var trip, selectedFlight, legs, hotel, qtys, totalFares, totalTaxes, fareEachPerson, packageCost, accruedMiles, origin, destination, fareAndFlightSelectors, fareAndFlightAndBrandtitles, miles;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.tripService.getTrip(this.$routeParams.tripId).then(function (t) {\r\n return t;\r\n })];\r\n case 1:\r\n trip = _a.sent();\r\n selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\r\n legs = fare.Legs || selectedFlight.Legs;\r\n hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\r\n qtys = JSON.parse(this.qtys);\r\n TRPCONFIG.Domain.FlightFare = fare;\r\n sessionStorage.setItem('flightFare', JSON.stringify(fare));\r\n totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\r\n totalTaxes = this.brandedFareTypesService.calculateTotalTaxes(fare, qtys);\r\n fareEachPerson = fare.AdultFare.Amount;\r\n if (!TRPCONFIG.Domain.TransferPrice) {\r\n TRPCONFIG.Domain.TransferPrice = 0;\r\n }\r\n if (!(this.baseCost && totalFares)) return [3 /*break*/, 3];\r\n packageCost = this.baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\r\n return [4 /*yield*/, this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost)];\r\n case 2:\r\n accruedMiles = _a.sent();\r\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\r\n _a.label = 3;\r\n case 3:\r\n origin = this.brandedFareTypesService.getDepartureCode(legs);\r\n destination = this.brandedFareTypesService.getDestinationCode(legs);\r\n TRPCONFIG.Domain.SkywardsFlightMiles = sessionStorage.getItem('SkywardsMilesFlights');\r\n fareAndFlightSelectors = fare && fare.FlightSectors;\r\n fareAndFlightAndBrandtitles = fareAndFlightSelectors &&\r\n fare.FlightSectors[0].BrandTitle === fare.FlightSectors[1].BrandTitle;\r\n return [4 /*yield*/, this.brandedFareTypesService.getFareInfo(fareAndFlightSelectors, fareAndFlightAndBrandtitles, TRPCONFIG.Domain.SkywardsFlightMiles, fare, this.hotelSearch, origin, destination, null, null)];\r\n case 4:\r\n miles = _a.sent();\r\n TRPCONFIG.Domain.SkywardsFlightMiles = miles;\r\n sessionStorage.setItem('SkywardsMilesFlights', miles);\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n BrandedFareTypes.prototype._setSelectedFareType = function (flight) {\r\n this.getPackagePrice(flight);\r\n this.selectedBrandedFareType = this.brandedFareTypesService.transform(__assign({ FlightSectors: [\r\n this.flight.Legs[0],\r\n this.flight.Legs[1]\r\n ] }, flight, { priceQuantities: this.priceQuantities }));\r\n };\r\n BrandedFareTypes.prototype._setPriceQuantities = function (details) {\r\n var quantities = [\r\n 'AdultFareQuantity',\r\n 'AdultTaxQuantity',\r\n 'ChildFareQuantity',\r\n 'ChildTaxQuantity',\r\n 'InfantFareQuantity',\r\n 'InfantTaxQuantity'\r\n ];\r\n this.priceQuantities = _.pick(details.Itinerary, quantities);\r\n };\r\n BrandedFareTypes.prototype._getStartUpgradePrice = function () {\r\n if (this.flight && this.filteredBrandedFareTypes && this.filteredBrandedFareTypes.length\r\n && this.selectedBrandedFareTypeIndex < this.filteredBrandedFareTypes.length - 1) {\r\n var defPrice = _.get(this.filteredBrandedFareTypes[this.selectedBrandedFareTypeIndex], 'BrandedFareTypeTotalPrice');\r\n var firstPrice = _.get(this.filteredBrandedFareTypes[this.selectedBrandedFareTypeIndex + 1], 'BrandedFareTypeTotalPrice');\r\n var dif = firstPrice - defPrice;\r\n return this.$filter('roundedCurrency')(dif, this.currency);\r\n }\r\n return '';\r\n };\r\n BrandedFareTypes.prototype._setDefaultBrandedFareType = function (details) {\r\n this.defaultBrandedFareType = this.brandedFareTypesService.transform(__assign({ FlightSectors: [\r\n details.Itinerary.Legs[0],\r\n details.Itinerary.Legs[1]\r\n ] }, details.Itinerary, { detailsId: details.DetailsId, priceQuantities: this.priceQuantities }));\r\n };\r\n BrandedFareTypes.prototype._isEqualBrandedFareTypes = function (b1, b2) {\r\n if (b1 && b2) {\r\n return b1.FlightSectors[0].TransformedType === b2.FlightSectors[0].TransformedType &&\r\n b1.FlightSectors[1].TransformedType === b2.FlightSectors[1].TransformedType;\r\n }\r\n return false;\r\n };\r\n BrandedFareTypes.prototype._isExistedDefaultFareType = function (fareTypes) {\r\n var res = false;\r\n for (var i = 0; i < fareTypes.length; ++i) {\r\n if (this._isEqualBrandedFareTypes(this.defaultBrandedFareType, fareTypes[i])) {\r\n res = true;\r\n break;\r\n }\r\n }\r\n return res;\r\n };\r\n BrandedFareTypes.prototype._setCurrency = function () {\r\n var _this = this;\r\n return this.tripService.getCurrency(this.trip.TripId)\r\n .then(function (c) {\r\n _this.currency = c;\r\n });\r\n };\r\n BrandedFareTypes.prototype.isSelectedFare = function (b) {\r\n return this._isEqualBrandedFareTypes(b, this.selectedBrandedFareType);\r\n };\r\n BrandedFareTypes.prototype.initCarousel = function (isLastChild) {\r\n if (isLastChild) {\r\n this.$element.find('.bft-items').slick({\r\n infinite: false,\r\n slidesToShow: 5,\r\n slidesToScroll: 1,\r\n nextArrow: '.next-arrow',\r\n prevArrow: '.prev-arrow',\r\n rtl: !!TRPCONFIG.Rtl,\r\n draggable: false,\r\n touchMove: false,\r\n responsive: [\r\n {\r\n breakpoint: 600,\r\n settings: {\r\n slidesToShow: 2\r\n }\r\n },\r\n {\r\n breakpoint: 769,\r\n settings: {\r\n slidesToShow: 3\r\n }\r\n },\r\n {\r\n breakpoint: 1000,\r\n settings: {\r\n slidesToShow: 4\r\n }\r\n }\r\n ]\r\n });\r\n }\r\n };\r\n BrandedFareTypes.prototype.showField = function () {\r\n var show = false;\r\n if (TRPCONFIG.Domain.SkywardsInfo && TRPCONFIG.Domain.SkywardsInfo[0].Miles) {\r\n show = true;\r\n }\r\n return show;\r\n };\r\n BrandedFareTypes.prototype.resetSelection = function (brandedFareTypes, selectedFare) {\r\n for (var i = 0; i < brandedFareTypes.length; i++) {\r\n brandedFareTypes[i].IsSelected = false;\r\n }\r\n selectedFare.IsSelected = true;\r\n var bft = this.brandedFareTypesService.getPriceDifference(brandedFareTypes);\r\n this._skywardsInfo(bft, this.trip.TripId, null, null);\r\n };\r\n BrandedFareTypes.prototype.select = function (selectedFare, idx) {\r\n var _this = this;\r\n this.resetSelection(this.brandedFareTypes, selectedFare);\r\n this.savingSelectedFareType = true;\r\n this.selectedBrandedFareTypeIndex = idx;\r\n this.selectFare(selectedFare).then(function (_) {\r\n _this._updateBrandedFare(selectedFare);\r\n });\r\n var bLen = this.brandedFareTypes ? this.brandedFareTypes.length : 0;\r\n this._trackSelection(this.flight.Legs[0].ArrivalAirport.Code, idx + 1, bLen);\r\n };\r\n BrandedFareTypes.prototype.selectFare = function (selectedFare) {\r\n var _this = this;\r\n var detailsPromise;\r\n if (this._isEqualBrandedFareTypes(this.defaultBrandedFareType, selectedFare)) {\r\n detailsPromise = this.$q.when({\r\n DetailsId: this.defaultBrandedFareType.detailsId,\r\n Itinerary: this.defaultBrandedFareType\r\n });\r\n }\r\n else {\r\n detailsPromise = this.flightDetail.getBrandSpecificFlightDetails(selectedFare.Id);\r\n }\r\n this.flight.LeadAdultPrice = selectedFare.AdultFare.Amount;\r\n this.flight.LeadAdultTax = selectedFare.AdultTax.Amount;\r\n return detailsPromise.then(function (details) {\r\n var opts = {\r\n details: details,\r\n searchId: _.get(_this.trip, 'FlightsRequest.AvailabilitySearchId'),\r\n basketId: _this.trip.BasketId,\r\n packageId: _this.trip.PackageId,\r\n bags: _this.flight.bags,\r\n maxbags: _this.occupancyService.getNumberOfNonInfantPassengers() || 1\r\n };\r\n var selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\r\n selectedFlight.Legs = details.Itinerary.Legs;\r\n sessionStorage.setItem('storeSelectedFlight', JSON.stringify(selectedFlight));\r\n _this.broker.publish('updateBrandedFareFlight', selectedFlight.Legs);\r\n return _this.basketService.updateBrandedFare(opts);\r\n });\r\n };\r\n BrandedFareTypes.prototype._updateBrandedFare = function (selectedBrandedFare) {\r\n this.savingSelectedFareType = false;\r\n this.selectedBrandedFareType = selectedBrandedFare;\r\n this.getPackagePrice(selectedBrandedFare);\r\n };\r\n BrandedFareTypes.prototype._trackSelection = function (airport, position, bLen) {\r\n this.analytics.trackEvent({\r\n category: 'Branded Fares holidaysOptions',\r\n label: airport + \"_\" + position + \"_\" + bLen\r\n });\r\n };\r\n return BrandedFareTypes;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('brandedFareTypes', function () {\r\n return {\r\n restrict: 'E',\r\n controller: BrandedFareTypes,\r\n controllerAs: 'bft',\r\n bindToController: {\r\n flight: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=BrandedFareTypes'\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar core;\r\n(function (core) {\r\n var BreakdownTable = /** @class */ (function () {\r\n function BreakdownTable(modalService, $filter) {\r\n this.modalService = modalService;\r\n this.$filter = $filter;\r\n this.tax = this.$filter('customCurrency')(modalService.get('tax'));\r\n //this.currency = this.$filter('customCurrency')(modalService.get('currency'));\r\n this.total = this.$filter('customCurrency')(modalService.get('total'));\r\n this.package = this.$filter('customCurrency')(modalService.get('total') + modalService.get('tax'));\r\n }\r\n return BreakdownTable;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('breakdownTable', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=BreakdownTable',\r\n controllerAs: 'bt',\r\n controller: BreakdownTable\r\n };\r\n });\r\n})(core || (core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .directive('callToBookModal', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n show: '=',\r\n close: '&'\r\n },\r\n templateUrl: 'partials/Home/directivetemplate?type=CallToBookModal',\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CanonicalTag = /** @class */ (function () {\r\n function CanonicalTag($element, $rootScope) {\r\n this.$element = $element;\r\n this.$rootScope = $rootScope;\r\n $rootScope.$watch(function () {\r\n if ($element[0].href !== location.href) {\r\n $element[0].href = location.href;\r\n $element[0].href = $element[0].href.split('?')[0];\r\n }\r\n });\r\n $rootScope.$watch('canonicalSuffix', function (val, old) {\r\n if (val !== old && $element && $element[0] && $element[0].href) {\r\n $element[0].href = $element[0].href.split('?')[0] + val;\r\n }\r\n });\r\n }\r\n return CanonicalTag;\r\n }());\r\n ;\r\n angular\r\n .module('core')\r\n .directive('canonicalTag', function () {\r\n return {\r\n restrict: 'A',\r\n controller: CanonicalTag,\r\n bindToController: true\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('checkUserPrefs', checkUserPrefs);\r\n function checkUserPrefs(authService) {\r\n return {\r\n restrict: 'A',\r\n scope: '=',\r\n compile: function () {\r\n if (!window.TRPCONFIG.Domain2.ClearUserPrefs) {\r\n return;\r\n }\r\n return function postLink() {\r\n var cookieName = authService.createCookieName();\r\n authService.doesHttpOnlyCookieExist(cookieName);\r\n authService.checkUserPreferences();\r\n };\r\n }\r\n };\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var CheckboxPopup = /** @class */ (function () {\r\n function CheckboxPopup(analytics, $route) {\r\n this.analytics = analytics;\r\n this.$route = $route;\r\n this.checked = false;\r\n }\r\n CheckboxPopup.getEventData = function () {\r\n return {\r\n label: 'Hotel for only part of Holiday',\r\n category: 'Search Bar',\r\n action: 'Click',\r\n value: 1\r\n };\r\n };\r\n CheckboxPopup.prototype.$onInit = function () {\r\n this.labelText = this.getLabelText();\r\n this.popupMessageText = this.getPopupMessageText();\r\n this.popupHeaderText = this.getPopupHeaderText();\r\n };\r\n CheckboxPopup.prototype.closePopup = function () {\r\n this.checked = false;\r\n };\r\n CheckboxPopup.prototype.getCurrentRouteLabel = function () {\r\n return _.get(this.$route, 'current.$$route.pixelTrackingPageName');\r\n };\r\n CheckboxPopup.prototype.checkboxClick = function () {\r\n var eventData = CheckboxPopup.getEventData();\r\n var currentRouteName = this.getCurrentRouteLabel();\r\n if (currentRouteName) {\r\n eventData.category = eventData.category + \" \" + currentRouteName;\r\n }\r\n this.analytics.trackEvent(eventData);\r\n };\r\n return CheckboxPopup;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('checkboxPopup', function () {\r\n return {\r\n restrict: 'E',\r\n controller: CheckboxPopup,\r\n controllerAs: 'checkboxPopupCtrl',\r\n bindToController: {\r\n getLabelText: '&',\r\n getPopupHeaderText: '&',\r\n getPopupMessageText: '&'\r\n },\r\n template: \"\\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n {{checkboxPopupCtrl.labelText}}\\n \\n
\\n \"\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ConfidenceMessages = /** @class */ (function () {\r\n function ConfidenceMessages(resourceService) {\r\n this.showNortonLogo = true;\r\n this.messages = [];\r\n this.showAtolLogo = false;\r\n this.showCommissionOfAviation = false;\r\n if (this.flexiblePayments === 'true') {\r\n this.messages.unshift('USPFLEXIBLEPAYMENT');\r\n }\r\n if (this.atolProtected === 'true') {\r\n this.showAtolLogo = true;\r\n this.messages.unshift('ATOLPROTECTEDHOLIDAY');\r\n }\r\n if (this.commissionOfAviation === 'true') {\r\n this.showCommissionOfAviation = true;\r\n this.messages.unshift('COMMISSIONOFAVIATIONMESSAGE');\r\n }\r\n this.messagesResolved = this.messages.map(function (s) { return resourceService.get(s); });\r\n }\r\n return ConfidenceMessages;\r\n }());\r\n angular\r\n .module('core')\r\n .component('confidenceMessages', {\r\n bindings: {\r\n atolProtected: '@',\r\n commissionOfAviation: '@',\r\n flexiblePayments: '@',\r\n debitMessageType: '@'\r\n },\r\n controller: ConfidenceMessages,\r\n template: \"\\n
\\n
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n
    \\n
  • {{message}}
  • \\n
\\n
\\n
\\n \\n {{$ctrl.debitMessage}}\\n
\\n
\\n \"\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('contactForm', contactForm);\r\n function contactForm(bookingService) {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n transclude: true,\r\n scope: {\r\n contactDetail: '=',\r\n rootForm: '=',\r\n loggedInUser: '=',\r\n contactForm: '=',\r\n bookingTracker: '@',\r\n namePart: '@',\r\n signupPart: '@',\r\n emailPart: '@',\r\n isPostCodeRequired: '@',\r\n onNotYouClick: '&',\r\n enableEditEmailAlways: '@'\r\n },\r\n controller: function () {\r\n var cm = this;\r\n cm.form = cm.contactForm || cm.rootForm;\r\n cm.getContentUrl = function () {\r\n return \"partials/home/contactdetailsform?bookingTracker=\" + cm.bookingTracker;\r\n };\r\n cm.agentMode = TRPCONFIG.Domain.isAgentMode;\r\n cm.showNamePart = cm.namePart === 'true';\r\n cm.showSignupPart = cm.signupPart === 'true';\r\n cm.showEmailPart = cm.emailPart === 'true';\r\n cm.adultTitles = bookingService.getAdultTitles();\r\n },\r\n controllerAs: 'cm',\r\n bindToController: true,\r\n template: '
'\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('costBreakdown', costBreakdown);\r\n function costBreakdown(tripService, $routeParams, broker, $location) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n costs: '=',\r\n totalLabel: '@',\r\n isPackage: '=',\r\n hideAgentDetail: '@',\r\n isInsurance: '@'\r\n },\r\n templateUrl: 'partials/home/costbreakdown',\r\n controller: function () {\r\n var cm = this;\r\n cm.isTravelAgentMode = TRPCONFIG.Domain.IsTravelAgentMode;\r\n var localPaymentsList = [22]; // id's of payable locally products\r\n cm.localPayable = function (costBreakdownItem) {\r\n return (localPaymentsList.indexOf(costBreakdownItem.TypeId) !== -1);\r\n };\r\n cm.payableNow = function (costBreakdownItem) {\r\n return (localPaymentsList.indexOf(costBreakdownItem.TypeId) === -1);\r\n };\r\n },\r\n controllerAs: 'cm',\r\n link: function (scope) {\r\n function sumCosts() {\r\n return (scope.costs || []).reduce(function (sum, cost) {\r\n sum.total += (cost.Quantity * cost.UnitAmount);\r\n sum.netTotal += (cost.Quantity * cost.NetUnitAmount);\r\n sum.totalTravelAgentCommission += (cost.Quantity * cost.TravelAgentCommission);\r\n checkIsInsurance(cost);\r\n return sum;\r\n }, { total: 0, netTotal: 0, totalTravelAgentCommission: 0 });\r\n }\r\n function setClientCurrencyCode() {\r\n if (scope.costs && (scope.costs.length >= 1)) {\r\n if (scope.costs[0].ClientCurrencyCode) {\r\n scope.clientCurrencyCode = scope.costs[0].ClientCurrencyCode;\r\n }\r\n else {\r\n tripService.getCurrency($routeParams.tripId).then(function (currency) {\r\n scope.clientCurrencyCode = currency;\r\n });\r\n }\r\n }\r\n }\r\n function _setBinRangeDiscount(discount) {\r\n if (discount.data != null) {\r\n scope.binRangeDiscount = discount.data[0];\r\n }\r\n else {\r\n scope.binRangeDiscount = null;\r\n }\r\n calcCosts();\r\n }\r\n function calcCosts() {\r\n var sum = sumCosts();\r\n scope.total = sum.total;\r\n scope.netTotal = sum.netTotal;\r\n scope.totalTravelAgentCommission = sum.totalTravelAgentCommission;\r\n if (scope.binRangeDiscount != null) {\r\n scope.total -= scope.binRangeDiscount.DiscountValue;\r\n scope.deposit -= scope.binRangeDiscount.DiscountValue;\r\n }\r\n setClientCurrencyCode();\r\n }\r\n function checkIsInsurance(cost) {\r\n var isManageBooking = $location.path().indexOf('booking-details') > -1;\r\n var inInsuranceQoute = false;\r\n if (cost.Description) {\r\n inInsuranceQoute = cost.Description.toLowerCase().indexOf('insurance') > -1;\r\n }\r\n if (!scope.isInsurance && isManageBooking && inInsuranceQoute) {\r\n scope.isInsurance = true;\r\n }\r\n }\r\n scope.$watchCollection('costs', function () {\r\n calcCosts();\r\n });\r\n broker.subscribe('costBreakdownDirective', 'discountUpdated', _setBinRangeDiscount);\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('costBreakdownDirective');\r\n });\r\n }\r\n };\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var CrossSellType = Core.Booking.CrossSellType;\r\n var CrossSellSetting = /** @class */ (function () {\r\n function CrossSellSetting(iconClass, captionResourceKey, tagLineResourceKey) {\r\n this.iconClass = iconClass;\r\n this.captionResourceKey = captionResourceKey || null;\r\n this.tagLineResourceKey = tagLineResourceKey || null;\r\n }\r\n return CrossSellSetting;\r\n }());\r\n var CrossSellCard = /** @class */ (function () {\r\n function CrossSellCard($scope, $location, crossSellCommonService, resourceService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$location = $location;\r\n this.crossSellCommonService = crossSellCommonService;\r\n this.resourceService = resourceService;\r\n this.crossSellSettings = {};\r\n //set up our settings\r\n this.crossSellSettings[CrossSellType.Attractions] = new CrossSellSetting('attractions');\r\n this.crossSellSettings[CrossSellType.Baggage] =\r\n new CrossSellSetting('baggage', 'CROSSSELL_BAGS_CAPTION', 'CROSSSELL_BAGS_TAGLINE');\r\n this.crossSellSettings[CrossSellType.CarHire] =\r\n new CrossSellSetting('car-hire', 'CROSSSELL_CARHIRE_CAPTION', 'CROSSSELL_CARHIRE_TAGLINE');\r\n this.crossSellSettings[CrossSellType.Hotels] =\r\n new CrossSellSetting('hotels', 'CROSSSELL_HOTEL_CAPTION');\r\n this.crossSellSettings[CrossSellType.Parking] =\r\n new CrossSellSetting('parking', 'CROSSSELL_PARKING_CAPTION', 'CROSSSELL_PARKING_TAGLINE');\r\n this.crossSellSettings[CrossSellType.Seats] =\r\n new CrossSellSetting('seating', 'CROSSSELL_SEATS_CAPTION', 'CROSSSELL_SEATS_TAGLINE');\r\n this.crossSellSettings[CrossSellType.Transfers] =\r\n new CrossSellSetting('transfers', 'CROSSSELL_TRANSFER_CAPTION', 'CROSSSELL_TRANSFER_TAGLINE');\r\n this.cssClass = (this.layout === 'tall') ? 'cross-sell-card-tall' : 'cross-sell-card-wide';\r\n var watch = $scope.$watch('csc.model', function (m) {\r\n if (m) {\r\n var settings = _this.crossSellSettings[_this.model.CrossSellType];\r\n _this.icon = settings.iconClass;\r\n _this.teaserPrice = _this.model.TeaserPrice;\r\n if (settings.captionResourceKey) {\r\n _this.caption = _this.resourceService.get(settings.captionResourceKey);\r\n }\r\n else if (_this.model instanceof Customer.CrossSellProductOption) {\r\n _this.caption = _this.model.Title;\r\n }\r\n if (settings.tagLineResourceKey !== null) {\r\n _this.tagline = _this.resourceService.get(settings.tagLineResourceKey) || null;\r\n }\r\n if (_this.model instanceof Customer.CrossSellHotelOption) {\r\n _this.tagline = _this.model.Title;\r\n }\r\n watch();\r\n }\r\n });\r\n }\r\n CrossSellCard.prototype.click = function () {\r\n if (this.model instanceof Customer.CrossSellFlightExtraOption) {\r\n this.$location.url(this.model.Url);\r\n }\r\n else if (this.model instanceof Customer.CrossSellProductOption) {\r\n this.crossSellCommonService.startCrossSellJourney(this.model.BookingId, this.model.ProductDetails);\r\n }\r\n };\r\n return CrossSellCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('crossSellCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: CrossSellCard,\r\n controllerAs: 'csc',\r\n bindToController: {\r\n model: '=',\r\n layout: '@'\r\n },\r\n templateUrl: 'partials/customer/crosssellcard'\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var TripStage = Core.ManageBooking.TripStage;\r\n var CurrentTripType;\r\n (function (CurrentTripType) {\r\n CurrentTripType[CurrentTripType[\"Flight\"] = 1] = \"Flight\";\r\n CurrentTripType[CurrentTripType[\"Hotel\"] = 2] = \"Hotel\";\r\n CurrentTripType[CurrentTripType[\"Holiday\"] = 3] = \"Holiday\";\r\n })(CurrentTripType = Customer.CurrentTripType || (Customer.CurrentTripType = {}));\r\n var CurrentTripCard = /** @class */ (function () {\r\n function CurrentTripCard($scope, resourceService) {\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.titles = {\r\n Holiday: {\r\n PreTrip: {\r\n Days: 'CURRENTTRIP_HOLIDAY_STARTSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_HOLIDAY_STARTSTOMORROW',\r\n Today: 'CURRENTTRIP_HOLIDAY_STARTSTODAY'\r\n },\r\n OnTrip: {\r\n Days: 'CURRENTTRIP_HOLIDAY_ENDSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_HOLIDAY_ENDSTOMORROW',\r\n Today: 'CURRENTTRIP_HOLIDAY_ENDSTODAY'\r\n }\r\n },\r\n Hotel: {\r\n PreTrip: {\r\n Days: 'CURRENTTRIP_HOTEL_STARTSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_HOTEL_STARTSTOMORROW',\r\n Today: 'CURRENTTRIP_HOTEL_STARTSTODAY'\r\n },\r\n OnTrip: {\r\n Days: 'CURRENTTRIP_HOTEL_ENDSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_HOTEL_ENDSTOMORROW',\r\n Today: 'CURRENTTRIP_HOTEL_ENDSTODAY'\r\n }\r\n },\r\n Flight: {\r\n PreTrip: {\r\n Days: 'CURRENTTRIP_FLIGHT_STARTSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_FLIGHT_STARTSTOMORROW',\r\n Today: 'CURRENTTRIP_FLIGHT_STARTSTODAY'\r\n },\r\n OnTrip: {\r\n Days: 'CURRENTTRIP_FLIGHT_ENDSINXDAYS',\r\n Tomorrow: 'CURRENTTRIP_FLIGHT_ENDSTOMORROW',\r\n Today: 'CURRENTTRIP_FLIGHT_ENDSTODAY'\r\n }\r\n }\r\n };\r\n this.flightLegsToDisplay = [];\r\n this.showExtraProducts = false;\r\n }\r\n CurrentTripCard.prototype.init = function () {\r\n if (this.trip.FlightBooking && this.trip.HotelBooking) {\r\n this.tripType = CurrentTripType.Holiday;\r\n }\r\n else {\r\n this.tripType = this.trip.HotelBooking ? CurrentTripType.Hotel : CurrentTripType.Flight;\r\n }\r\n if (this.trip.FlightBooking) {\r\n if (this.trip.TripStage === TripStage.PreTrip) {\r\n this.flightLegsToDisplay = this.trip.FlightBooking.Legs;\r\n }\r\n else {\r\n this.flightLegsToDisplay.push(_.last(this.trip.FlightBooking.Legs));\r\n }\r\n }\r\n if (this.trip.TransferBooking\r\n || this.trip.CarHireBooking\r\n || this.trip.AirportParkingBooking\r\n || this.trip.InsuranceBooking) {\r\n this.showExtraProducts = true;\r\n }\r\n this.cardTitle = this.getTitle();\r\n };\r\n CurrentTripCard.prototype.getTitle = function () {\r\n var tripTypeKey = CurrentTripType[this.tripType];\r\n var tripStageKey = TripStage[this.trip.TripStage];\r\n var daysUntil = this.trip.TripStage === TripStage.PreTrip\r\n ? this.trip.DaysUntilDeparture\r\n : this.trip.DaysUntilReturn;\r\n // Days, Tomorrow OR Today\r\n var durationKey = 'Today';\r\n if (daysUntil > 1) {\r\n durationKey = 'Days';\r\n }\r\n else if (daysUntil === 1) {\r\n durationKey = 'Tomorrow';\r\n }\r\n else {\r\n durationKey = 'Today';\r\n }\r\n var resourceKey = this.titles[tripTypeKey][tripStageKey][durationKey];\r\n var title = this.resourceService.getDeferred(resourceKey)();\r\n if (daysUntil > 1) {\r\n title = title.replace('{0}', daysUntil);\r\n }\r\n return title;\r\n };\r\n return CurrentTripCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('currentTripCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: CurrentTripCard,\r\n controllerAs: 'ct',\r\n bindToController: {\r\n trip: '='\r\n },\r\n templateUrl: 'partials/customer/currenttripcard',\r\n link: function (scope, el, attr, controller) {\r\n controller.init();\r\n }\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var CrossSellType = Core.Booking.CrossSellType;\r\n var TripStage = Core.ManageBooking.TripStage;\r\n var CustomerDashboard = /** @class */ (function () {\r\n function CustomerDashboard($rootScope, $scope, $q, bookingsManagerService, crossSellCommonService, customerDashboardService, houseRecommender, currentUser, authService) {\r\n var _this = this;\r\n this.$rootScope = $rootScope;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.bookingsManagerService = bookingsManagerService;\r\n this.crossSellCommonService = crossSellCommonService;\r\n this.customerDashboardService = customerDashboardService;\r\n this.houseRecommender = houseRecommender;\r\n this.currentUser = currentUser;\r\n this.authService = authService;\r\n // Object literal defines which cross-sells are supported by each place holder.\r\n // Cross-sells are arranged in priority order.\r\n this.crossSellsByPlaceholder = {\r\n 2: [\r\n CrossSellType.Hotels,\r\n CrossSellType.Attractions\r\n ],\r\n 4: [\r\n CrossSellType.Transfers,\r\n CrossSellType.CarHire,\r\n CrossSellType.Seats,\r\n CrossSellType.Baggage\r\n ],\r\n 5: [\r\n CrossSellType.Transfers,\r\n CrossSellType.CarHire,\r\n CrossSellType.Seats,\r\n CrossSellType.Baggage\r\n ]\r\n };\r\n this.user = null;\r\n this.trip = null;\r\n this.lastViewedHotel = null;\r\n this.searches = [];\r\n this.destinations = [];\r\n this.crossSellOptions = {\r\n Hotels: null,\r\n Attractions: null,\r\n Transfers: null,\r\n CarHire: null,\r\n Baggage: null,\r\n Seats: null\r\n };\r\n this.tileTemplates = {\r\n 1: null,\r\n 2: null,\r\n 3: null,\r\n 4: null,\r\n 5: null\r\n };\r\n this.tileModels = {\r\n 1: null,\r\n 2: null,\r\n 3: null,\r\n 4: null,\r\n 5: null\r\n };\r\n this.tileTypes = {\r\n 1: null,\r\n 2: null,\r\n 3: null,\r\n 4: null,\r\n 5: null\r\n };\r\n $scope.$on('auth:signin', function () {\r\n _this.setDashboardState();\r\n });\r\n $scope.$on('auth:signout', function () {\r\n _this.setDashboardState();\r\n });\r\n this.setDashboardState();\r\n }\r\n CustomerDashboard.prototype.setDashboardState = function () {\r\n // Set local scope user\r\n this.user = this.currentUser.get();\r\n // Show this dashboard if the user is signed in\r\n this.showDashboard = this.user.AnonSignedIn || this.user.SignedIn;\r\n this.showDashboard && this.fetch();\r\n };\r\n CustomerDashboard.prototype.fetch = function () {\r\n var _this = this;\r\n this.fetching = true;\r\n this.tripReady = false;\r\n this.resetData();\r\n var bookingId = this.user.AnonSignedIn && this.authService.getSignedInBookingId();\r\n var tripPromise = bookingId\r\n ? this.bookingsManagerService.getTrip(bookingId)\r\n : this.bookingsManagerService.getCurrentTripForUser();\r\n tripPromise.then(function (trip) {\r\n _this.trip = trip;\r\n // // DEBUG -- force trip stage\r\n // if (this.trip) {\r\n // this.trip.TripStage = TripStage.PreTrip;\r\n // }\r\n // Set the dashboard template\r\n _this.dashboardTemplate = _this.customerDashboardService.getTemplateForDashboard(_this.trip);\r\n // If appropriate, set the trip template whilst other content loads\r\n if (_this.trip && (_this.trip.TripStage === TripStage.PreTrip\r\n || _this.trip.TripStage === TripStage.OnTrip)) {\r\n _this.tileTypes[1] = Customer.DashboardTileType.Trip;\r\n _this.tileTemplates[1] =\r\n _this.customerDashboardService.getTemplateForPlaceholder(Customer.DashboardTileType.Trip);\r\n _this.tripReady = true;\r\n }\r\n var promises = [];\r\n if (_this.trip && _this.trip.TripStage === TripStage.PreTrip) {\r\n // get cross sells\r\n promises.push(_this.customerDashboardService.getAllCrossSellOptions(_this.trip.MainBookingId));\r\n }\r\n else {\r\n promises.push(_this.$q.when()); // dummy the cross-sell promise\r\n // Get recent searches, last viewed hotel and recommended destinations\r\n //promises.push(this.customerDashboardService.getRecentSearches(2));\r\n promises.push(_this.$q.when());\r\n promises.push(_this.customerDashboardService.getLastViewedHotel());\r\n promises.push(_this.houseRecommender.getHouseRecs());\r\n }\r\n _this.$q.all(promises).then(function (_a) {\r\n var crossSells = _a[0], searches = _a[1], hotel = _a[2], destinations = _a[3];\r\n if (crossSells) {\r\n // Assign any cross-sell options to our object literal\r\n _.each(crossSells, function (option) {\r\n _this.crossSellOptions[CrossSellType[option.CrossSellType]] = option;\r\n });\r\n }\r\n if (searches) {\r\n _this.searches = searches;\r\n }\r\n if (hotel) {\r\n _this.lastViewedHotel = hotel;\r\n }\r\n if (destinations) {\r\n _this.destinations = destinations;\r\n }\r\n // Now that we have all information, set the templates for each cell\r\n _this.configureTiles().then(function () {\r\n // We are done - display everything else\r\n _this.fetching = false;\r\n _this.customerDashboardService.trackDashboardLoad(_this.trip, _this.tileTypes);\r\n });\r\n });\r\n });\r\n };\r\n CustomerDashboard.prototype.configureTiles = function () {\r\n var _this = this;\r\n var deferred = this.$q.defer();\r\n if (this.trip) {\r\n if (this.trip.TripStage === TripStage.PreTrip) {\r\n // *** PRE TRIP ***\r\n // Placeholder 1\r\n // Trip\r\n this.tileTypes[1] = Customer.DashboardTileType.Trip;\r\n // Placeholders 2, 3, 4, 5\r\n // Assign cross sell templates to placeholders according to our validity rules\r\n var assignedTypes_1 = [];\r\n // iterate placeholders which support cross-sells\r\n _.forOwn(this.crossSellsByPlaceholder, function (types, key) {\r\n // Take the first non-assigned cross-sell type which we have a cross-sell option for\r\n var chosenType = _.find(types, function (type) {\r\n return _this.crossSellOptions[CrossSellType[type]]\r\n && assignedTypes_1.indexOf(type) === -1;\r\n });\r\n if (chosenType) {\r\n // assign the placeholder type for this cross-sell\r\n assignedTypes_1.push(chosenType);\r\n _this.tileTypes[key] = Customer.DashboardTileType[\"CrossSell\" + CrossSellType[chosenType]];\r\n _this.tileModels[key] = _this.crossSellOptions[CrossSellType[chosenType]];\r\n }\r\n });\r\n // Placeholder 2 (if not populated by a cross-sell)\r\n // Small App Promo\r\n if (!this.tileTypes[2]) {\r\n this.tileTypes[2] = Customer.DashboardTileType.AppPromo;\r\n }\r\n // Placeholder 3 (if not populated by a cross-sell)\r\n // Insurance Confirmation OR Insurance Option\r\n if (!this.tileTypes[3]) {\r\n this.tileTypes[3] = this.trip.InsuranceBooking\r\n ? Customer.DashboardTileType.InsuranceConf\r\n : Customer.DashboardTileType.InsuranceOption;\r\n }\r\n }\r\n else if (this.trip.TripStage === TripStage.OnTrip) {\r\n // *** ON TRIP ***\r\n // Placeholder 1\r\n // Trip\r\n // *** ALREADY SET ***\r\n // Placeholder 2\r\n // TR Contact\r\n this.tileTypes[2] = Customer.DashboardTileType.ContactUs;\r\n // Placeholder 3\r\n // Insurance claim OR Travel guide\r\n this.tileTypes[3] = this.trip.InsuranceBooking\r\n ? Customer.DashboardTileType.InsuranceClaim\r\n : Customer.DashboardTileType.TravelGuide;\r\n }\r\n else if (this.trip.TripStage === TripStage.PostTrip) {\r\n // *** POST TRIP ***\r\n // Placeholder 1\r\n // Review your hotel OR App promo\r\n this.tileTypes[1] =\r\n this.trip.HotelBooking && !this.trip.HotelBooking.ReviewedByCustomer\r\n ? Customer.DashboardTileType.ReviewHotel\r\n : Customer.DashboardTileType.AppPromo;\r\n // Placeholder 2\r\n // Searches[0] OR Destinations[0]\r\n if (this.searches[0]) {\r\n this.tileTypes[2] = Customer.DashboardTileType.Search;\r\n this.tileModels[2] = this.searches[0];\r\n }\r\n else {\r\n this.tileTypes[2] = Customer.DashboardTileType.Destination;\r\n this.tileModels[2] = this.destinations[0];\r\n }\r\n // Placeholder 3\r\n // Destinations[0] OR Destinations[1]\r\n this.tileTypes[3] = Customer.DashboardTileType.Destination;\r\n if (this.tileTypes[2] === Customer.DashboardTileType.Search) {\r\n // show the first destination which doesn't match the destination of the search\r\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(this.tileModels[2], this.destinations);\r\n }\r\n else {\r\n // show the second destination\r\n this.tileModels[3] = this.destinations[1];\r\n }\r\n }\r\n }\r\n else {\r\n // *** NO TRIP ***\r\n // Placeholder 1\r\n // App promo\r\n this.tileTypes[1] = Customer.DashboardTileType.AppPromo;\r\n // Placeholder 2\r\n // Last Viewed Hotel OR Searches[0] OR Destinations[0]\r\n if (this.lastViewedHotel) {\r\n // show last viewed hotel\r\n this.tileTypes[2] = Customer.DashboardTileType.LastHotel;\r\n this.tileModels[2] = this.lastViewedHotel;\r\n }\r\n else if (this.searches[0]) {\r\n // show first search\r\n this.tileTypes[2] = Customer.DashboardTileType.Search;\r\n this.tileModels[2] = this.searches[0];\r\n }\r\n else {\r\n // show first destination\r\n this.tileTypes[2] = Customer.DashboardTileType.Destination;\r\n this.tileModels[2] = this.destinations[0];\r\n }\r\n // Placeholder 3\r\n // Searches[0] OR Destinations[0] OR Destinations[1]\r\n if (this.tileTypes[2] === Customer.DashboardTileType.LastHotel) {\r\n // show first search OR first Destination\r\n if (this.searches[0]) {\r\n this.tileTypes[3] = Customer.DashboardTileType.Search;\r\n this.tileModels[3] = this.searches[0];\r\n }\r\n else {\r\n this.tileTypes[3] = Customer.DashboardTileType.Destination;\r\n this.tileModels[3] = this.destinations[0];\r\n }\r\n }\r\n else if (this.tileTypes[2] === Customer.DashboardTileType.Search) {\r\n this.tileTypes[3] = Customer.DashboardTileType.Destination;\r\n // show the first destination which doesn't match the destination of the search\r\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(this.tileModels[2], this.destinations);\r\n }\r\n else {\r\n // show second destination\r\n this.tileTypes[3] = Customer.DashboardTileType.Destination;\r\n this.tileModels[3] = this.destinations[1];\r\n }\r\n }\r\n // map the templates to the types\r\n _.forOwn(this.tileTypes, function (type, key) {\r\n if (type) {\r\n _this.tileTemplates[key] = _this.customerDashboardService.getTemplateForPlaceholder(type);\r\n }\r\n });\r\n deferred.resolve();\r\n return deferred.promise;\r\n };\r\n CustomerDashboard.prototype.resetData = function () {\r\n // reset all data to initial state\r\n this.trip = null;\r\n this.lastViewedHotel = null;\r\n this.searches.length = 0;\r\n this.destinations.length = 0;\r\n _.forOwn(this.crossSellOptions, function (o) { return o = null; });\r\n // placeholder templates and models\r\n _.forOwn(this.tileTemplates, function (p) { return p = null; });\r\n _.forOwn(this.tileModels, function (p) { return p = null; });\r\n _.forOwn(this.tileTypes, function (p) { return p = null; });\r\n };\r\n CustomerDashboard.prototype.getModelForPlaceholder = function (position) {\r\n // We return the model in an array so that we can use ng-repeat\r\n // to declare a privately scoped model for the ng-included template\r\n return [this.tileModels[position]];\r\n };\r\n CustomerDashboard.prototype.crossSellClick = function (option) {\r\n //mybTrack.track('MYB - Cross Sell Click');\r\n this.crossSellCommonService.startCrossSellJourney(option.BookingId, option.ProductDetails);\r\n };\r\n CustomerDashboard.prototype.tileClick = function (position) {\r\n this.customerDashboardService.trackDashboardClick(position, this.tileTypes[position]);\r\n };\r\n return CustomerDashboard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('customerDashboard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: CustomerDashboard,\r\n controllerAs: 'cd',\r\n bindToController: {},\r\n templateUrl: 'partials/customer/customerdashboard'\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var DateOrMonthPicker = /** @class */ (function () {\r\n function DateOrMonthPicker($scope, dateUtil) {\r\n this.minimumDate = dateUtil.todayPlus(1);\r\n }\r\n return DateOrMonthPicker;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('dateOrMonthPicker', function () { return ({\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=DateOrMonthPicker',\r\n controller: DateOrMonthPicker,\r\n controllerAs: 'cm',\r\n bindToController: {\r\n show: '=',\r\n value: '=',\r\n flexibility: '=',\r\n },\r\n scope: {},\r\n }); });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var DestinationContentCard = /** @class */ (function () {\r\n function DestinationContentCard(houseRecommender) {\r\n this.houseRecommender = houseRecommender;\r\n }\r\n DestinationContentCard.prototype.trackClick = function () {\r\n this.houseRecommender.trackHouseClick(this.model);\r\n };\r\n return DestinationContentCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('destinationContentCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: DestinationContentCard,\r\n controllerAs: 'dc',\r\n replace: true,\r\n bindToController: {\r\n model: '=',\r\n header: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=DestinationContentCard'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('expander', expander);\r\n function expander($rootScope) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n title: '@',\r\n subtitle: '@',\r\n expanded: '=',\r\n expandable: '@',\r\n accordion: '@',\r\n accordionGroup: '@',\r\n headerClass: '@',\r\n bodyClass: '@',\r\n iconClassExpanded: '@',\r\n iconClassCollapsed: '@',\r\n forceHeaderClasses: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Expander',\r\n link: function (scope, el, attr) {\r\n scope.hClass = '';\r\n //set defaults for unset scope values\r\n if (!attr.iconClassExpanded) {\r\n attr.iconClassExpanded = 'icon icon-collapse';\r\n }\r\n if (!attr.iconClassCollapsed) {\r\n attr.iconClassCollapsed = 'icon icon-expand';\r\n }\r\n //we have to capture the expanded attribute and assign it to a new property\r\n //otherwise angular gets upset if the attribute is not assignable (which we as\r\n //a directive have no control over\r\n scope.$watch('expanded', function (val) {\r\n scope.e = val;\r\n });\r\n var accordion = attr.accordion === 'true';\r\n if (accordion) {\r\n scope.$on(String.format('{0}expanderExpanded', attr.accordionGroup ? attr.accordionGroup : ''), function (ev, s) {\r\n if (scope.$id !== s.$id && scope.e) {\r\n scope.toggle();\r\n }\r\n });\r\n }\r\n scope.$on('forceExpand', function () {\r\n scope.e = true;\r\n });\r\n scope.toggle = function () {\r\n if (scope.expandable === 'false') {\r\n return;\r\n }\r\n scope.e = !scope.e;\r\n if (scope.e) {\r\n $rootScope.$broadcast(String.format('{0}expanderExpanded', attr.accordionGroup ? attr.accordionGroup : ''), scope);\r\n }\r\n };\r\n scope.headerClasses = function () {\r\n if (scope.forceHeaderClasses === true) {\r\n scope.hClass = scope.headerClass == null ? '' : \" \" + scope.headerClass;\r\n }\r\n else {\r\n scope.hClass = '';\r\n }\r\n };\r\n scope.expanderClass = function () {\r\n if (scope.expandable === 'false') {\r\n scope.headerClasses();\r\n return 'ng-hide';\r\n }\r\n //update the hClass property\r\n scope.hClass = scope.e ? 'expanded' : 'collapsed';\r\n scope.hClass += scope.headerClass == null ? '' : \" \" + scope.headerClass;\r\n return scope.e ? scope.iconClassExpanded : scope.iconClassCollapsed;\r\n };\r\n scope.bClass = function () {\r\n return scope.bodyClass == null ? '' : scope.bodyClass;\r\n };\r\n }\r\n };\r\n }\r\n})();\r\nvar core;\r\n(function (core) {\r\n var Tag = /** @class */ (function () {\r\n function Tag(title, isNew) {\r\n this.title = title;\r\n this.isNew = isNew;\r\n }\r\n return Tag;\r\n }());\r\n var ExtendableTagList = /** @class */ (function () {\r\n function ExtendableTagList($scope, analytics) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.newTagTitle = '';\r\n this.tagLists = { predefined: [], userDefined: [] };\r\n var uniqueId = Math.random().toString(36).substr(2, 7);\r\n this.componentInputId = \"extendable-tag-list--\" + uniqueId;\r\n this.formName = \"tagForm_\" + uniqueId;\r\n //basic checks of our min, max values\r\n if (!this.maxTagLength || !this.minTagLength) {\r\n throw 'Extendable Tag List - Invalid parameters';\r\n }\r\n _.each(this.tags, function (t) {\r\n _this.tagLists.predefined.push(new Tag(t, false));\r\n });\r\n //sometimes our model will be set and may contain non-predefined tags, these need to be added to the\r\n //user defined list\r\n if (this.model && this.model.length > 0) {\r\n var userTags = _.difference(this.model, this.tags);\r\n _.each(userTags, function (t) { _this.addTagToUserDefinedList(t); });\r\n }\r\n if (this.analyticsTag) {\r\n $scope.$watchCollection('twi.model', function (n, o) {\r\n if (n && o && (n.length > 0 || o.length > 0)) {\r\n var changes = _.difference(n, o);\r\n //we are only interested in additions\r\n if (changes.length) {\r\n _.each(changes, function (c) {\r\n var userDefined = _.findIndex(_this.tagLists.userDefined, function (t) { return t.title === c; }) > -1;\r\n _this.analytics.track('mixpanel', _this.analyticsTag + \"_Add\", { value: c, userDefined: userDefined });\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n ExtendableTagList.prototype.addUserTag = function (form) {\r\n var _this = this;\r\n form.$setSubmitted();\r\n if (!form.$valid) {\r\n return;\r\n }\r\n //check we don't already have it in the predefined list (if we do just select it)\r\n var tag = _.find(this.tagLists.predefined, function (t) { return t.title.toLowerCase() === _this.newTagTitle.toLowerCase(); });\r\n if (tag) {\r\n if (!_.find(this.model, function (t) { return t === tag.title; })) {\r\n this.model.push(tag.title);\r\n }\r\n return;\r\n }\r\n //add it to our user defined list instead\r\n if (this.addTagToUserDefinedList(this.newTagTitle)) {\r\n this.model.push(this.newTagTitle); //also update our model\r\n }\r\n //clear our value and make sure the form is returned to a clean state\r\n this.newTagTitle = '';\r\n form.$setPristine();\r\n form.$setUntouched();\r\n };\r\n ExtendableTagList.prototype.removeUserTag = function (title) {\r\n var titleLowercase = title.toLowerCase();\r\n _.remove(this.tagLists.userDefined, function (t) { return t.title.toLowerCase() === titleLowercase; });\r\n _.remove(this.model, function (t) { return t.toLowerCase() === titleLowercase; });\r\n };\r\n ExtendableTagList.prototype.tagLimitReached = function () {\r\n return this.tagLists.userDefined.length >= this.maxExtraTags;\r\n };\r\n ExtendableTagList.prototype.$postLink = function () {\r\n //set our form correctly as it is dynamically named\r\n this.form = this.$scope[this.formName];\r\n };\r\n ;\r\n //adds a tag with the given title to the tags.userDefined list if it does not exist already. Returns a bool\r\n //indicating if anything was added\r\n ExtendableTagList.prototype.addTagToUserDefinedList = function (tagTitle) {\r\n //do we have the tag in our userdefined list? if so move on\r\n var tag = _.find(this.tagLists.userDefined, function (t) { return t.title.toLowerCase() === tagTitle.toLowerCase(); });\r\n if (!tag) {\r\n this.tagLists.userDefined.push(new Tag(tagTitle, true));\r\n return true;\r\n }\r\n return false;\r\n };\r\n return ExtendableTagList;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('extendableTagList', function () {\r\n return {\r\n restrict: 'E',\r\n template: \"
\\n
\\n
    \\n
  • \\n \\n
  • \\n \\n
  • \\n
\\n
\\n\\n \\n
\\n \\n
\\n \\n \\n
\\n
\\n Please ensure your entry is between {{::twi.minTagLength}} and \\n {{::twi.maxTagLength}} characters\\n
\\n
Please enter a value
\\n
\\n
\\n
\\n
\\n
\\n You are allowed to specify a maximum of {{::twi.maxExtraTags}} tags, you'll have \\n to remove tags before being able to add more.\\n
\\n
\",\r\n bindToController: {\r\n analyticsTag: '@',\r\n inputLabelText: '@',\r\n maxExtraTags: '=',\r\n maxTagLength: '@',\r\n minTagLength: '@',\r\n model: '=',\r\n labelText: '@',\r\n tags: '<'\r\n },\r\n scope: {},\r\n replace: true,\r\n controllerAs: 'twi',\r\n controller: ExtendableTagList\r\n };\r\n });\r\n})(core || (core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ExtraFocusTracker = /** @class */ (function () {\r\n function ExtraFocusTracker($element, $scope, extraFocusTrackerEventQueue) {\r\n var _this = this;\r\n this.$element = $element;\r\n this.$scope = $scope;\r\n this.extraFocusTrackerEventQueue = extraFocusTrackerEventQueue;\r\n this.cssClass = _.uniqueId('extra-focus-tracker-');\r\n var func = function (target) {\r\n if (target.is('body, body *')) {\r\n if (!target.is('a[href], a[href] *')) {\r\n _this.setFocus(target.is(\".\" + _this.cssClass + \", .\" + _this.cssClass + \" *\"));\r\n }\r\n }\r\n };\r\n extraFocusTrackerEventQueue.queue.push(func);\r\n $scope.$on('$destroy', function () { return _.pull(extraFocusTrackerEventQueue.queue, func); });\r\n }\r\n ExtraFocusTracker.prototype.setFocus = function (value) {\r\n var _this = this;\r\n if (this.$scope.extraFocusTrackerFocused !== value) {\r\n this.$scope.$evalAsync(function () { return _this.$scope.extraFocusTrackerFocused = value; });\r\n }\r\n };\r\n return ExtraFocusTracker;\r\n }());\r\n angular\r\n .module('core')\r\n .factory('extraFocusTrackerEventQueue', function () {\r\n var service = {\r\n queue: []\r\n };\r\n $(function () {\r\n $('body').on('focusin click touchstart', '*', function (event) {\r\n var target = $(event.target);\r\n service.queue.forEach(function (f) { return f(target); });\r\n });\r\n });\r\n return service;\r\n })\r\n .directive('extraFocusTracker', function ($timeout) {\r\n return {\r\n controller: ExtraFocusTracker,\r\n restrict: 'A',\r\n link: function (scope, element, attrs, controller) {\r\n element.addClass(controller.cssClass);\r\n scope.extraFocusTrackerFocused = false;\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/*\r\n Creates a dropdown menu of options for an input field.\r\n Header items must contain a truthy `header` property (will not be selectable).\r\n\r\n Configurable via attributes:\r\n Input field as `inputField`\r\n Data source as `data`.\r\n Options format as `headerFormat`, `optionFormat` (defaults to `Title`)\r\n `select` function receives arguments `(item, e)`.\r\n\r\n Other options defined in `bindToController`.\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var FieldOptions = /** @class */ (function () {\r\n function FieldOptions($scope, $element, $parse, $timeout, $q) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.$parse = $parse;\r\n this.$timeout = $timeout;\r\n this.$q = $q;\r\n this.uiState = {\r\n fieldFocused: false,\r\n menuShowing: false,\r\n menuPopulated: false,\r\n selectedIndex: -1,\r\n selectableOptions: {},\r\n selectableOpsCount: 0,\r\n denyHide: false,\r\n denyScroll: false,\r\n denyFocus: false,\r\n denyBlur: false\r\n };\r\n var self = this;\r\n // `no-hide` attribute\r\n if (this.noHide) {\r\n this.uiState.denyHide = true;\r\n this.uiState.menuShowing = true;\r\n }\r\n else {\r\n $element.hide();\r\n }\r\n this.createMenu = function (inputEl) {\r\n var uiState = _this.uiState, selectHandler = _this.select, formatHeader = $parse(_this.headerFormat || 'Title'), formatLabel = $parse(_this.optionFormat || 'Title'), ul = $element, eventNS = '.fieldOptions', selOptionClass = 'selected';\r\n var uiHandlers = {\r\n 9: selectCurrOption,\r\n 13: selectCurrOption,\r\n 16: angular.noop,\r\n 27: blurField,\r\n 38: function () { return traverseOptions(-1); },\r\n 40: function () { return traverseOptions(1); } // Down arrow\r\n };\r\n // Debounced menu refresh (thenable)\r\n var debouncedPopulateMenu = _.debounce(function (resolve) {\r\n populateMenu(_this.data);\r\n resolve();\r\n }, 100);\r\n init();\r\n function init() {\r\n // Watch `data` attribute\r\n $scope.$watch('fo.data', function (v) {\r\n if (v) {\r\n if (!uiState.denyFocus) {\r\n refreshMenu().then(showMenu);\r\n }\r\n }\r\n else {\r\n hideMenu();\r\n clearMenu();\r\n }\r\n });\r\n // DOM listeners on input field\r\n inputEl\r\n .on('focus' + eventNS, function () {\r\n focusField();\r\n })\r\n .on('keydown' + eventNS, function (e) {\r\n var handler = uiHandlers[e.keyCode];\r\n // Special keys i.e. escape, tab\r\n if (handler) {\r\n handler(e);\r\n }\r\n else {\r\n refreshMenu().then(showMenu);\r\n }\r\n })\r\n .on('click' + eventNS, function () {\r\n this.setSelectionRange(0, this.value.length);\r\n focusField();\r\n })\r\n .on('blur' + eventNS, function () {\r\n // IE fix (clicking scrollbar hides menu)\r\n $timeout(function () {\r\n if (uiState.denyBlur) {\r\n inputEl.focus();\r\n }\r\n else {\r\n blurField();\r\n }\r\n });\r\n });\r\n // DOM listeners on menu ul\r\n ul.on('mousedown' + eventNS, function () {\r\n uiState.denyBlur = true; // IE fix (above)\r\n suppressFocus();\r\n })\r\n .on('mouseup' + eventNS, function () { return uiState.denyBlur = false; })\r\n .on('mouseleave' + eventNS, function () { return uiState.denyBlur = false; })\r\n .on('mouseleave' + eventNS, function () { return clearHighlight(); })\r\n .on('mouseenter' + eventNS, '> li', function (e) {\r\n var index = ul.find('.field-options-item').index(e.target);\r\n if (index > -1) {\r\n highlightOption(index);\r\n }\r\n else {\r\n clearHighlight();\r\n }\r\n });\r\n $scope.$on('$destroy', deregister);\r\n }\r\n function showMenu() {\r\n if (uiState.menuPopulated && uiState.fieldFocused) {\r\n if (!uiState.menuShowing) {\r\n selectNone();\r\n uiState.menuShowing = true;\r\n $element.show();\r\n if (ul.isOnScreen && !ul.isOnScreen()) {\r\n scrollToMenu();\r\n }\r\n }\r\n }\r\n else {\r\n hideMenu();\r\n }\r\n }\r\n function hideMenu() {\r\n if (!uiState.denyHide && uiState.menuShowing) {\r\n uiState.menuShowing = false;\r\n selectNone();\r\n $element.hide();\r\n }\r\n }\r\n function refreshMenu() {\r\n return $q(function (res) { return debouncedPopulateMenu(res); });\r\n }\r\n function focusField() {\r\n if (!uiState.denyFocus) {\r\n uiState.fieldFocused = true;\r\n refreshMenu().then(showMenu);\r\n }\r\n }\r\n function blurField() {\r\n uiState.fieldFocused = false;\r\n hideMenu();\r\n }\r\n function scrollToMenu() {\r\n if (!uiState.denyScroll) {\r\n uiState.denyScroll = true;\r\n var winPos = $(window).scrollTop(), winHeight = $(window).height(), ulPos = ul.offset().top, ulHeight = ul.outerHeight(), ulBottom = ulPos - winPos + ulHeight + 10, // Arbitrary gap\r\n scrollPos = winPos + Math.min(ulBottom - winHeight, 150);\r\n if (scrollPos > 0) {\r\n $('html, body').animate({ scrollTop: scrollPos }, 200);\r\n }\r\n }\r\n }\r\n function getSelectedOption() {\r\n if (uiState.selectedIndex > -1) {\r\n return $element.find('li').eq(uiState.selectableOptions[uiState.selectedIndex].domIndex);\r\n }\r\n }\r\n function selectCurrOption() {\r\n if (uiState.menuShowing) {\r\n var op = getSelectedOption();\r\n if (op) {\r\n op.trigger('click');\r\n }\r\n hideMenu();\r\n }\r\n }\r\n function selectItem(params) {\r\n var item = params.item;\r\n if (params.e) {\r\n params.e.preventDefault();\r\n params.e.stopPropagation();\r\n }\r\n suppressFocus();\r\n hideMenu();\r\n if (item && !item.header) {\r\n self.$scope.$emit('fieldOptionSelected', item);\r\n $timeout(function () {\r\n selectHandler(params); // `select` attribute\r\n });\r\n }\r\n }\r\n function populateMenu(data) {\r\n clearMenu();\r\n if (data) {\r\n var opsCount_1 = 0;\r\n data.forEach(function (o, i) {\r\n // restricted Code for directive\r\n if (self.restricted != null\r\n && o.Code !== self.restricted\r\n && o.Title !== 'Airports') {\r\n return;\r\n }\r\n $(\"
  • \\n \" + getLabelHTML(o) + \"\\n
  • \")\r\n .click(function (e) { return selectItem({ item: o, e: e }); })\r\n .appendTo(ul);\r\n // Index non-headers\r\n if (!o.header) {\r\n uiState.selectableOptions[opsCount_1++] = { domIndex: i, item: o };\r\n }\r\n });\r\n uiState.selectableOpsCount = opsCount_1;\r\n if (opsCount_1) {\r\n selectNone();\r\n uiState.menuPopulated = true;\r\n }\r\n else {\r\n hideMenu();\r\n clearMenu();\r\n }\r\n }\r\n }\r\n function clearMenu() {\r\n uiState.selectableOptions = {};\r\n uiState.selectableOpsCount = 0;\r\n uiState.menuPopulated = false;\r\n ul.empty();\r\n }\r\n function getLabelHTML(item) {\r\n if (item.header) {\r\n return formatHeader(item);\r\n }\r\n var label = formatLabel(item), fieldVal = inputEl.val(), term = fieldVal && fieldVal.trim().toLowerCase();\r\n if (term) {\r\n var termPos = label.toLowerCase().indexOf(term);\r\n if (termPos > -1) {\r\n var termEnd = termPos + term.length, _a = [\r\n label.substring(0, termPos),\r\n label.substring(termPos, termEnd),\r\n label.substring(termEnd)\r\n ], str0 = _a[0], str1 = _a[1], str2 = _a[2];\r\n label = str0 + \"\" + str1 + \"\" + str2;\r\n }\r\n }\r\n // let icon = '';\r\n // if (item.icon) {\r\n // const cssClass = item.isChild ? 'field-options-child' : '';\r\n // icon = ``;\r\n // }\r\n //label = `${icon} ${label}`;\r\n return label;\r\n }\r\n function highlightOption(i) {\r\n clearHighlight();\r\n uiState.selectedIndex = loopIndex(i, 0, uiState.selectableOpsCount - 1);\r\n var selectedOption = getSelectedOption();\r\n if (selectedOption) {\r\n selectedOption.addClass(selOptionClass);\r\n }\r\n return selectedOption;\r\n }\r\n function clearHighlight() {\r\n $element.find('.' + selOptionClass).removeClass(selOptionClass);\r\n }\r\n function suppressFocus() {\r\n // Stops input focus showing menu again i.e. on menu click\r\n // NOTE: angular $timeout would run an unwanted digest\r\n uiState.denyFocus = true;\r\n setTimeout(function () { return uiState.denyFocus = false; }, 200);\r\n }\r\n function selectNone() {\r\n uiState.selectedIndex = -1;\r\n clearHighlight();\r\n }\r\n function traverseOptions(incr) {\r\n if (uiState.menuShowing) {\r\n var op = highlightOption(uiState.selectedIndex + incr), opPos = op.position(), opTop = opPos && opPos.top;\r\n if (opTop) {\r\n // Center option vertically\r\n ul.scrollTop(ul.scrollTop() + opTop - ul.height() / 2 + op.outerHeight(true) / 2);\r\n }\r\n }\r\n }\r\n function loopIndex(i, start, end) {\r\n return i < start ? end : (i > end ? start : i);\r\n }\r\n function deregister() {\r\n inputEl.off(eventNS);\r\n ul.off(eventNS);\r\n }\r\n function getItemClasses(item) {\r\n var classes = [];\r\n classes.push(item.header ? 'field-options-header' : 'field-options-item');\r\n if (item.isGroup) {\r\n classes.push('field-options-item-parent');\r\n }\r\n if (item.isChild) {\r\n classes.push('field-options-item-child');\r\n }\r\n return classes.join(' ');\r\n }\r\n };\r\n }\r\n return FieldOptions;\r\n }());\r\n ;\r\n angular\r\n .module('core')\r\n .directive('fieldOptions', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: FieldOptions,\r\n controllerAs: 'fo',\r\n bindToController: {\r\n inputField: '&',\r\n data: '=',\r\n select: '&',\r\n headerFormat: '@',\r\n optionFormat: '@',\r\n noHide: '=',\r\n classes: '@' // Additional CSS classes on wrapping
    \r\n },\r\n replace: true,\r\n template: \"
      \",\r\n link: function (scope) {\r\n // Initialise once input field exists\r\n var unwatchInit = scope.$watch(function () { return scope.fo.inputField(); }, function (inputEl) {\r\n if (inputEl) {\r\n unwatchInit();\r\n scope.fo.createMenu(inputEl);\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\n/*\r\n Creates a dropdown menu of options for an input field.\r\n Header items must contain a truthy `header` property (will not be selectable).\r\n*/\r\nvar Autocompleter;\r\n(function (Autocompleter) {\r\n var FieldOptions2 = /** @class */ (function () {\r\n function FieldOptions2($scope, $element, $timeout, $q, $parse) {\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.$timeout = $timeout;\r\n this.$q = $q;\r\n this.selOptionClass = 'selected';\r\n this.uiState = {\r\n menuPopulated: false,\r\n denyScroll: false,\r\n selectedIndex: -1,\r\n selectableOptions: {},\r\n selectableOpsCount: 0,\r\n };\r\n this.formatHeader = $parse(this.headerFormat || 'Title');\r\n this.formatLabel = $parse(this.optionFormat || 'Title');\r\n this.ul = $element;\r\n }\r\n FieldOptions2.prototype.createMenu = function () {\r\n var _this = this;\r\n var eventNS = '.fieldOptions';\r\n var uiHandlers = {\r\n 9: function () { return _this.selectCurrentOption(); },\r\n 13: function () { return _this.selectCurrentOption(); },\r\n 16: angular.noop,\r\n 38: function () { return _this.traverseOptions(-1); },\r\n 40: function () { return _this.traverseOptions(1); } // Down arrow\r\n };\r\n // Debounced menu refresh (thenable)\r\n var debouncedPopulateMenu = _.debounce(function (resolve) {\r\n _this.populateMenu(_this.data);\r\n resolve();\r\n }, 100, {\r\n 'leading': true,\r\n 'trailing': true\r\n });\r\n var refreshMenu = function () { return _this.$q(debouncedPopulateMenu); };\r\n this.$scope.$watch('fo.data', function (v) {\r\n if (v) {\r\n refreshMenu();\r\n }\r\n });\r\n // DOM listeners on input field\r\n this.inputEl\r\n .on('focus' + eventNS, refreshMenu)\r\n .on('keydown' + eventNS, function (event) {\r\n var handler = uiHandlers[event.keyCode];\r\n handler ? handler() : refreshMenu();\r\n })\r\n .on('click' + eventNS, function () {\r\n this.setSelectionRange(0, this.value.length);\r\n refreshMenu();\r\n });\r\n // DOM listeners on menu ul\r\n this.ul\r\n .on('mouseleave' + eventNS, function () { return _this.clearHighlight(); })\r\n .on('mouseenter' + eventNS, '> li', function (event) {\r\n var index = _this.ul.find('.field-options-item').index(event.target);\r\n if (index > -1) {\r\n _this.highlightOption(index);\r\n }\r\n else {\r\n _this.clearHighlight();\r\n }\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.inputEl.off(eventNS);\r\n _this.ul.off(eventNS);\r\n });\r\n };\r\n FieldOptions2.prototype.getCurrentOption = function () {\r\n if (this.uiState.selectedIndex > -1) {\r\n return this.$element.find('li').eq(this.uiState.selectableOptions[this.uiState.selectedIndex].domIndex);\r\n }\r\n };\r\n FieldOptions2.prototype.selectCurrentOption = function () {\r\n var op = this.getCurrentOption();\r\n if (op) {\r\n op.trigger('click');\r\n }\r\n };\r\n FieldOptions2.prototype.selectItem = function (params) {\r\n var _this = this;\r\n var item = params.item;\r\n if (params.e) {\r\n params.e.preventDefault();\r\n params.e.stopPropagation();\r\n }\r\n if (item && !item.header) {\r\n this.$scope.$emit('fieldOptionSelected', item);\r\n this.$timeout(function () {\r\n _this.select(params); // `select` attribute\r\n });\r\n }\r\n };\r\n FieldOptions2.prototype.clearMenu = function () {\r\n this.uiState.selectableOptions = {};\r\n this.uiState.selectableOpsCount = 0;\r\n this.uiState.menuPopulated = false;\r\n this.ul.empty();\r\n };\r\n FieldOptions2.prototype.populateMenu = function (data) {\r\n var _this = this;\r\n this.clearMenu();\r\n if (data) {\r\n var opsCount_2 = 0;\r\n data.forEach(function (o, i) {\r\n $(\"
    • \\n \" + _this.getLabelHTML(o) + \"\\n
    • \")\r\n .click(function (e) { return _this.selectItem({ item: o, e: e }); })\r\n .appendTo(_this.ul);\r\n // Index non-headers\r\n if (!o.header) {\r\n _this.uiState.selectableOptions[opsCount_2++] = { domIndex: i, item: o };\r\n }\r\n });\r\n this.uiState.selectableOpsCount = opsCount_2;\r\n if (opsCount_2) {\r\n this.selectNone();\r\n this.uiState.menuPopulated = true;\r\n this.scrollToMenu();\r\n }\r\n else {\r\n this.clearMenu();\r\n }\r\n }\r\n };\r\n FieldOptions2.prototype.scrollToMenu = function () {\r\n var _this = this;\r\n this.$timeout(function () {\r\n if (!_this.uiState.denyScroll && _this.ul.is(':visible')) {\r\n var winPos = $(window).scrollTop(), winHeight = $(window).height(), ulPos = _this.ul.offset().top, ulHeight = _this.ul.outerHeight(), ulBottom = ulPos - winPos + ulHeight + 10, // Arbitrary gap\r\n scrollPos = winPos + Math.min(ulBottom - winHeight, 150);\r\n if (scrollPos > 0) {\r\n _this.uiState.denyScroll = true;\r\n $('html, body').animate({ scrollTop: scrollPos }, 200);\r\n }\r\n }\r\n });\r\n };\r\n FieldOptions2.prototype.getLabelHTML = function (item) {\r\n if (item.header) {\r\n return this.formatHeader(item);\r\n }\r\n var label = this.formatLabel(item), fieldVal = this.inputEl.val(), term = fieldVal && fieldVal.trim().toLowerCase();\r\n if (term) {\r\n var termPos = label.toLowerCase().indexOf(term);\r\n if (termPos > -1) {\r\n var termEnd = termPos + term.length, _a = [\r\n label.substring(0, termPos),\r\n label.substring(termPos, termEnd),\r\n label.substring(termEnd)\r\n ], str0 = _a[0], str1 = _a[1], str2 = _a[2];\r\n label = str0 + \"\" + str1 + \"\" + str2;\r\n }\r\n }\r\n var icon = '';\r\n if (item.icon) {\r\n //const cssClass = item.isChild ? 'field-options-child' : '';\r\n //icon = ``;\r\n //icon = ``;\r\n }\r\n label = icon + \" \" + label;\r\n return label;\r\n };\r\n FieldOptions2.prototype.highlightOption = function (i) {\r\n this.clearHighlight();\r\n this.uiState.selectedIndex = this.loopIndex(i, 0, this.uiState.selectableOpsCount - 1);\r\n var currentOption = this.getCurrentOption();\r\n if (currentOption) {\r\n currentOption.addClass(this.selOptionClass);\r\n }\r\n };\r\n FieldOptions2.prototype.clearHighlight = function () {\r\n this.$element.find('.' + this.selOptionClass).removeClass(this.selOptionClass);\r\n };\r\n FieldOptions2.prototype.selectNone = function () {\r\n this.uiState.selectedIndex = -1;\r\n this.clearHighlight();\r\n };\r\n FieldOptions2.prototype.traverseOptions = function (incr) {\r\n var op = this.highlightOption(this.uiState.selectedIndex + incr), opPos = op.position(), opTop = opPos && opPos.top;\r\n if (opTop) {\r\n // Center option vertically\r\n this.ul.scrollTop(this.ul.scrollTop() + opTop - this.ul.height() / 2 + op.outerHeight(true) / 2);\r\n }\r\n };\r\n FieldOptions2.prototype.loopIndex = function (i, start, end) {\r\n return i < start ? end : (i > end ? start : i);\r\n };\r\n FieldOptions2.prototype.getItemClasses = function (item) {\r\n var classes = [];\r\n classes.push(item.header ? 'field-options-header' : 'field-options-item');\r\n if (item.isGroup) {\r\n classes.push('field-options-item-parent');\r\n }\r\n if (item.isChild) {\r\n classes.push('field-options-item-child');\r\n }\r\n return classes.join(' ');\r\n };\r\n return FieldOptions2;\r\n }());\r\n ;\r\n angular\r\n .module('core')\r\n .directive('fieldOptions2', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: FieldOptions2,\r\n controllerAs: 'fo',\r\n bindToController: {\r\n inputField: '&',\r\n data: '=',\r\n select: '&',\r\n headerFormat: '@',\r\n optionFormat: '@' // Expression for option text format in menu (via $parse)\r\n },\r\n replace: true,\r\n template: \"
        \",\r\n link: function (scope) {\r\n // Initialise once input field exists\r\n var unwatchInit = scope.$watch(function () { return scope.fo.inputField(); }, function (inputEl) {\r\n if (inputEl) {\r\n unwatchInit();\r\n scope.fo.inputEl = inputEl;\r\n scope.fo.createMenu();\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})(Autocompleter || (Autocompleter = {}));\r\nvar Core;\r\n(function (Core) {\r\n var FlightExtraTitles = /** @class */ (function () {\r\n function FlightExtraTitles() {\r\n }\r\n return FlightExtraTitles;\r\n }());\r\n var FlightExtrasSummary = /** @class */ (function () {\r\n function FlightExtrasSummary($scope, resourceService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.flightExtrasDescription = '';\r\n this.flightStrings = {\r\n Bag: resourceService.getDeferred('BREAKDOWNBAG'),\r\n Bags: resourceService.getDeferred('BREAKDOWNBAGS'),\r\n Extra: resourceService.getDeferred('BREAKDOWNFLIGHTEXTRA'),\r\n Extras: resourceService.getDeferred('BREAKDOWNFLIGHTEXTRAS'),\r\n Seat: resourceService.getDeferred('BREAKDOWNSEAT'),\r\n Seats: resourceService.getDeferred('BREAKDOWNSEATS')\r\n };\r\n $scope.$watch('fes.optionCounts', function (v) {\r\n if (v) {\r\n _this.updateFlightExtrasDescription();\r\n }\r\n });\r\n }\r\n FlightExtrasSummary.prototype.updateFlightExtrasDescription = function () {\r\n //we want to build a description of the extras included with our flight eg (+ bags, seats)\r\n var labels = [];\r\n if (this.optionCounts.HoldBags > 0) {\r\n var bagslabel = this.optionCounts.HoldBags === 1 ? this.flightStrings.Bag() : this.flightStrings.Bags();\r\n labels.push(\"\" + bagslabel);\r\n }\r\n if (this.optionCounts.Seats > 0) {\r\n labels.push(this.optionCounts.Seats === 1 ? this.flightStrings.Seat() : this.flightStrings.Seats());\r\n }\r\n if (labels.length > 0) {\r\n this.flightExtrasDescription = String.format.apply(String, [labels.length > 1 ? this.flightStrings.Extras() : this.flightStrings.Extra()].concat(labels));\r\n }\r\n else {\r\n this.flightExtrasDescription = '';\r\n }\r\n };\r\n return FlightExtrasSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('flightExtrasSummary', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n bindToController: {\r\n optionCounts: '='\r\n },\r\n controller: FlightExtrasSummary,\r\n controllerAs: 'fes',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=FlightExtrasSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n//This directive is to delay the loading of all Google Tag Manager type scripts\r\n//until after AngularJS has has a change to load itself.\r\nvar Core;\r\n(function (Core) {\r\n var Gtm = /** @class */ (function () {\r\n function Gtm($element, $timeout) {\r\n $timeout(function () {\r\n $element.append('');\r\n if (TRPCONFIG.Domain.GtmHelpersScriptEnabled) {\r\n $element.append('');\r\n }\r\n }, 1000);\r\n }\r\n return Gtm;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('gtm', function () {\r\n return {\r\n restrict: 'E',\r\n controller: Gtm\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var HotelContentCard = /** @class */ (function () {\r\n function HotelContentCard() {\r\n }\r\n return HotelContentCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('hotelContentCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n controller: HotelContentCard,\r\n controllerAs: 'hc',\r\n replace: true,\r\n bindToController: {\r\n model: '=',\r\n click: '&',\r\n header: '@',\r\n href: '@',\r\n teaserPrice: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=HotelContentCard'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CancellationInformation = /** @class */ (function () {\r\n function CancellationInformation(nonRefundable, refundableCutOff, cancellationCutOff, payAtHotel) {\r\n if (nonRefundable === true) {\r\n this.nonRefundable = nonRefundable;\r\n }\r\n else if (refundableCutOff != null) {\r\n this.amendableUntil = refundableCutOff;\r\n }\r\n else if (cancellationCutOff != null) {\r\n this.freeCancellationUntil = cancellationCutOff;\r\n }\r\n this.isPayAtHotel = payAtHotel;\r\n }\r\n return CancellationInformation;\r\n }());\r\n var HotelStaySummaryRoom = /** @class */ (function () {\r\n function HotelStaySummaryRoom(quantity, roomDescription, boardDescription, cancellationPolicy) {\r\n this.quantity = 1;\r\n this.quantity = quantity;\r\n this.roomDescription = roomDescription;\r\n this.boardDescription = boardDescription;\r\n this.cancellationInfo = cancellationPolicy;\r\n }\r\n return HotelStaySummaryRoom;\r\n }());\r\n var HotelStaySummary = /** @class */ (function () {\r\n function HotelStaySummary($scope, modalService, basketService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.modalService = modalService;\r\n this.basketService = basketService;\r\n this.$scope.$watch('hss.hotel.Details.BookedItems', function (v) {\r\n if (!_.isArray(v)) {\r\n return;\r\n }\r\n // concatenate rooms which have matching descriptions, board types and cancellation messages\r\n _this.rooms = [];\r\n _.each(v, function (bi) {\r\n var room = bi.RoomDescription;\r\n var board = bi.BoardDescription;\r\n var info = new CancellationInformation(bi.NonRefundable, _this.hotel.RefundableCutOffDate, _this.hotel.FreeCancellationCutOffDate, bi.IsPayAtHotel);\r\n if (_this.groupRooms === false) {\r\n _this.rooms.push(new HotelStaySummaryRoom(1, room, board, info));\r\n }\r\n else {\r\n var match = _.find(_this.rooms, function (r) {\r\n return r.roomDescription === room\r\n && r.boardDescription === board\r\n && _.isEqual(r.cancellationInfo, info);\r\n });\r\n if (match) {\r\n match.quantity += 1;\r\n }\r\n else {\r\n _this.rooms.push(new HotelStaySummaryRoom(1, room, board, info));\r\n }\r\n }\r\n });\r\n });\r\n }\r\n HotelStaySummary.prototype.showModal = function (url) {\r\n this.modalService.launch(url);\r\n };\r\n HotelStaySummary.prototype.changeHotel = function () {\r\n this.basketService.changeJourneyUrl(20);\r\n };\r\n return HotelStaySummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('hotelStaySummary', function () {\r\n return {\r\n scope: {},\r\n controller: HotelStaySummary,\r\n controllerAs: 'hss',\r\n replace: true,\r\n bindToController: {\r\n atolAvailable: '=',\r\n hotel: '=',\r\n occupancy: '=',\r\n groupRooms: '='\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=HotelStaySummary&version='\r\n + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=HotelStaySummary';\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n ;\r\n var HowToGetThere = /** @class */ (function () {\r\n function HowToGetThere(flightStaticService, geo, $q) {\r\n var _this = this;\r\n this.geo = geo;\r\n this.$q = $q;\r\n this.getDepartureAirports().then(function (departureAirports) {\r\n var departureAirportGroups = _.map(departureAirports, function (a) { return a.Code; });\r\n var destinationAirportGroups = [_this.destinationAirports];\r\n flightStaticService.getFlightDurations(departureAirportGroups, destinationAirportGroups)\r\n .then(function (durations) {\r\n _this.options = _.chain(departureAirports)\r\n .map(function (a) { return ({\r\n a: a,\r\n d: _.find(durations, function (d) { return d.DurationMinutesDepartureAirport === a.Code; })\r\n }); })\r\n .filter(function (tuple) { return tuple.d; })\r\n .map(function (tuple) {\r\n var option = {\r\n departureTitle: tuple.a.Title,\r\n duration: _this.formatDuration(tuple.d.DurationMinutes)\r\n };\r\n return option;\r\n })\r\n .value();\r\n });\r\n });\r\n }\r\n HowToGetThere.prototype.getDepartureAirports = function () {\r\n if (TRPCONFIG.Domain.HowToGetThereDepartureAirports) {\r\n var departureAirports = angular.fromJson(TRPCONFIG.Domain.HowToGetThereDepartureAirports);\r\n return this.$q.when(departureAirports);\r\n }\r\n return this.geo.getNearestAirportTitles();\r\n };\r\n HowToGetThere.prototype.formatDuration = function (minutes) {\r\n var hours = Math.floor(minutes / 60);\r\n var duration = hours > 0 ? (hours + 'h ') : '';\r\n duration += (minutes % 60) + 'm';\r\n return duration;\r\n };\r\n return HowToGetThere;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('howToGetThere', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=LandingPage/HowToGetThere',\r\n bindToController: {\r\n destinationTitle: '@',\r\n destinationAirports: '@'\r\n },\r\n scope: {},\r\n controller: HowToGetThere,\r\n controllerAs: 'ht'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n angular\r\n .module('ekh')\r\n .directive('imageResize', function (imageService) {\r\n return {\r\n restrict: 'A',\r\n link: function ($scope, $element, $attrs) {\r\n var size = imageService.getAppropriateSize($(window).width())[0];\r\n var source = $attrs['imageResize'];\r\n if (!source) {\r\n var imageObserver_1 = $attrs.$observe('imageResize', function (value) {\r\n if (value) {\r\n source = value;\r\n applySource();\r\n imageObserver_1();\r\n }\r\n });\r\n }\r\n else {\r\n applySource();\r\n }\r\n function applySource() {\r\n if (source) {\r\n source = source.replace(/(width|height)=\\d+&?/g, '');\r\n var hasParams = /\\?/.test(source);\r\n source += (hasParams ? '&' : '?') + \"width=\" + size;\r\n if ($element[0].tagName.toUpperCase() === 'IMG') {\r\n $element.attr('src', source);\r\n }\r\n else {\r\n $element.css({ 'background-image': \"url('\" + source + \"')\" });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n var count = 1;\r\n var startTime = new Date().toISOString();\r\n function uniqueId() {\r\n return startTime + count++;\r\n }\r\n function newCompile($element) {\r\n if (TRPCONFIG.Domain.AutocompleteFix === 'remove') {\r\n $element.removeAttr('autocomplete');\r\n }\r\n else if (TRPCONFIG.Domain.AutocompleteFix === 'nope') {\r\n //https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\r\n $element.attr('autocomplete', 'nope');\r\n }\r\n else if (TRPCONFIG.Domain.AutocompleteFix === 'unique') {\r\n $element.attr('autocomplete', uniqueId());\r\n }\r\n }\r\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.AutocompleteFix) {\r\n TR.config(function ($provide) {\r\n $provide.decorator('inputDirective', function ($delegate) {\r\n var formDirective = $delegate[0];\r\n var oldCompile = formDirective.compile;\r\n formDirective.compile = function ($element) {\r\n newCompile($element);\r\n // eslint-disable-next-line prefer-rest-params\r\n return oldCompile.apply(this, arguments);\r\n };\r\n return $delegate;\r\n });\r\n });\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n /*\r\n * This is for cases where we have nested forms and we'd like to validate the nested form independently of its\r\n * parent form\r\n * \"borrowed\" from here: https://github.com/angular/angular.js/issues/5858\r\n */\r\n var IsolateForm = /** @class */ (function () {\r\n function IsolateForm() {\r\n this.link = function (scope, element, attrs, controller) {\r\n if (!controller) {\r\n return;\r\n }\r\n element.addClass('isolated-form');\r\n // Do a copy of the controller\r\n var copy = {};\r\n angular.copy(controller, copy);\r\n // Get the parent of the form\r\n var parent = element.parent().controller('form');\r\n // Remove parent link to the controller\r\n parent.$removeControl(controller);\r\n // Replace form controller with a \"isolated form\"\r\n var isolatedFormCtrl = {\r\n $setValidity: function (validationToken, isValid, control) {\r\n copy.$setValidity(validationToken, isValid, control);\r\n parent.$setValidity(validationToken, true, controller);\r\n },\r\n $setDirty: function () {\r\n element.removeClass('ng-pristine').addClass('ng-dirty');\r\n controller.$dirty = true;\r\n controller.$pristine = false;\r\n }\r\n };\r\n angular.extend(controller, isolatedFormCtrl);\r\n };\r\n this.restrict = 'A';\r\n this.require = '?form';\r\n }\r\n IsolateForm.factory = function () {\r\n var directive = function () { return new IsolateForm(); };\r\n directive.$inject = [];\r\n return directive;\r\n };\r\n return IsolateForm;\r\n }());\r\n var TR = angular.module('TR');\r\n TR.directive('isolateForm', IsolateForm.factory());\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('isolatedNestedForm', isolatedNestedForm);\r\n function isolatedNestedForm() {\r\n return {\r\n restrict: 'A',\r\n require: '?form',\r\n link: function (scope, element, attrs, formController) {\r\n var isolatedFormEnabled = true;\r\n if (attrs.isolatedNestedFormEnabled !== undefined) {\r\n isolatedFormEnabled = (attrs.isolatedNestedFormEnabled === 'true');\r\n }\r\n if (!formController) {\r\n return;\r\n }\r\n var parentForm = formController.$$parentForm;\r\n if (!parentForm) {\r\n return;\r\n }\r\n // Remove this form from parent controller\r\n if (isolatedFormEnabled) {\r\n parentForm.$removeControl(formController);\r\n }\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var allImages = {};\r\n angular\r\n .module('core')\r\n .directive('lazySrc', lazySrc);\r\n function lazySrc($window, imageService, broker, $document) {\r\n var lazyLoader = (function () {\r\n var images = [];\r\n var renderTimer = null;\r\n var renderDelay = 100;\r\n var win = $($window);\r\n var doc = $document;\r\n var documentHeight = doc.height();\r\n var documentTimer = null;\r\n var documentDelay = 2000;\r\n var isWatchingWindow = false;\r\n function addImage(image) {\r\n images.push(image);\r\n if (!renderTimer) {\r\n startRenderTimer();\r\n }\r\n if (!isWatchingWindow) {\r\n startWatchingWindow();\r\n }\r\n }\r\n function removeImage(image) {\r\n images = _.reject(images, function (i) { return i === image; });\r\n if (!images.length) {\r\n clearRenderTimer();\r\n stopWatchingWindow();\r\n }\r\n }\r\n function checkDocumentHeight() {\r\n if (renderTimer) {\r\n return;\r\n }\r\n var currentDocumentHeight = doc.height();\r\n if (currentDocumentHeight === documentHeight) {\r\n return;\r\n }\r\n documentHeight = currentDocumentHeight;\r\n startRenderTimer();\r\n }\r\n function checkImages() {\r\n var windowHeight = win.height();\r\n var topFoldOffset = win.scrollTop();\r\n var bottomFoldOffset = (topFoldOffset + windowHeight);\r\n images = _.filter(images, function (image) {\r\n var visible = image.isVisible(topFoldOffset, bottomFoldOffset);\r\n if (visible) {\r\n image.render();\r\n }\r\n return !visible;\r\n });\r\n clearRenderTimer();\r\n if (!images.length) {\r\n stopWatchingWindow();\r\n }\r\n }\r\n function clearRenderTimer() {\r\n clearTimeout(renderTimer);\r\n renderTimer = null;\r\n }\r\n function startRenderTimer() {\r\n renderTimer = setTimeout(checkImages, renderDelay);\r\n }\r\n function startWatchingWindow() {\r\n isWatchingWindow = true;\r\n win.on('resize.lazySrc', windowChanged);\r\n win.on('scroll.lazySrc', windowChanged);\r\n documentTimer = setInterval(checkDocumentHeight, documentDelay);\r\n broker.subscribe('LazySrc', 'LazySrcRetry', windowChanged);\r\n }\r\n function stopWatchingWindow() {\r\n isWatchingWindow = false;\r\n win.off('resize.lazySrc');\r\n win.off('scroll.lazySrc');\r\n clearInterval(documentTimer);\r\n broker.unsubscribe('LazySrc');\r\n }\r\n function windowChanged() {\r\n if (!renderTimer) {\r\n startRenderTimer();\r\n }\r\n }\r\n return ({ addImage: addImage, removeImage: removeImage });\r\n })();\r\n function LazyImage(element, isFixedSize, isRendered) {\r\n var source = null;\r\n var height = null;\r\n $(element).addClass('lazy-load');\r\n function isVisible(topFoldOffset, bottomFoldOffset) {\r\n if (!element.is(':visible')) {\r\n return false;\r\n }\r\n if (height === null) {\r\n height = element.height();\r\n }\r\n var top = element.offset().top;\r\n var bottom = top + height;\r\n return (top <= bottomFoldOffset && top >= topFoldOffset) ||\r\n (bottom <= bottomFoldOffset && bottom >= topFoldOffset) ||\r\n (top <= topFoldOffset && bottom >= bottomFoldOffset);\r\n }\r\n function setSource(newSource) {\r\n source = newSource;\r\n if (isRendered) {\r\n render();\r\n }\r\n }\r\n function render() {\r\n isRendered ? renderSource() : setTimeout(renderSource);\r\n }\r\n function renderSource() {\r\n var el = element[0];\r\n if (!isFixedSize) {\r\n var elWidth = element.outerWidth();\r\n var elHeight = element.outerHeight();\r\n var appropWidth = void 0;\r\n var appropHeight = void 0;\r\n source = source.replace(/(width|height)=\\d+&?/g, '');\r\n if (!/\\?/.test(source)) {\r\n source += '?';\r\n }\r\n if (elWidth < 2 || elHeight < 2) {\r\n // i.e. a 1x1 placeholder (no `src` fails ':visible' test above)\r\n // Use parent width, leave height unspecified\r\n appropWidth = elWidth > 2 ? elWidth : 0;\r\n appropWidth = appropWidth || element.parent().width() || element.parent().parent().width() || 0;\r\n }\r\n else {\r\n // Else add height to the img src string\r\n _a = imageService.getAppropriateSize(elWidth, elHeight), appropWidth = _a[0], appropHeight = _a[1];\r\n }\r\n var isRatio16x9 = $(element).is('.sc-c-responsive-image--16x9, .sc-c-responsive-image--16x9 *');\r\n if (isRatio16x9) {\r\n appropHeight = Math.ceil(appropWidth * 9 / 16);\r\n source += '&crop=true';\r\n }\r\n source += \"&width=\" + appropWidth;\r\n if (appropHeight) {\r\n source += \"&height=\" + appropHeight;\r\n }\r\n source = source.replace(/\\?&+/g, '?');\r\n source = source.replace(/&&+/g, '&');\r\n }\r\n if (isRendered) {\r\n addSourceToElement(el, source);\r\n }\r\n else {\r\n // preload the image before we set the src (for smooth fade in)\r\n var image = new Image();\r\n image.onload = function () { return addSourceToElement(el, source); };\r\n image.src = source;\r\n }\r\n isRendered = true;\r\n var _a;\r\n }\r\n function addSourceToElement(el, source) {\r\n if (el.tagName.toUpperCase() === 'IMG') {\r\n el.src = source;\r\n }\r\n else {\r\n el.style.backgroundImage = \"url(\" + source + \")\";\r\n }\r\n $(el).addClass('lazy-loaded');\r\n }\r\n return ({ isVisible: isVisible, render: render, setSource: setSource });\r\n }\r\n function link($scope, element, attributes) {\r\n var isRendered = (function () {\r\n if (attributes.lazySrcIsPrerender === 'true') {\r\n return true;\r\n }\r\n if (attributes.lazySrcIsPrerender === 'false') {\r\n return false;\r\n }\r\n if (attributes.lazySrc && allImages[attributes.lazySrc]) {\r\n return true;\r\n }\r\n return TRPCONFIG.IsPrerender;\r\n })();\r\n allImages[attributes.lazySrc] = true;\r\n var isFixedSize = attributes.lazySrcFixedSize === 'true';\r\n var lazyImage = new LazyImage(element, isFixedSize, isRendered);\r\n lazyLoader.addImage(lazyImage);\r\n attributes.$observe('lazySrc', function (newSource) { return lazyImage.setSource(newSource); });\r\n $scope.$on('$destroy', function () { return lazyLoader.removeImage(lazyImage); });\r\n }\r\n return ({ link: link, restrict: 'A' });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('loadingSpinner', loadingSpinner);\r\n function loadingSpinner(resourceService) {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n block: '=loadingSpinner',\r\n message: '@message'\r\n },\r\n link: function (scope, el) {\r\n var loadingTemplate = \"\" + '
        ' +\r\n '
        ' +\r\n '

        ' + resourceService.get(scope.message ? scope.message : 'LOADING') + \"

        \" +\r\n '
        ' +\r\n (\"

        \" + resourceService.get('THISMAYTAKE') + \"

        \") +\r\n '
        ' +\r\n '
        ';\r\n var wait = angular.element(loadingTemplate);\r\n el.css('display', 'none');\r\n el.after(wait);\r\n var sw = scope.$watch('block', function (val) {\r\n if (val) {\r\n el.css('display', '');\r\n wait.css('display', 'none');\r\n sw();\r\n }\r\n });\r\n }\r\n };\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var ModalCancellationsBasketDetails = /** @class */ (function () {\r\n function ModalCancellationsBasketDetails($scope, broker) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.isCancellationReady = false;\r\n }\r\n ModalCancellationsBasketDetails.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('modalCancellationsBasketDetails', 'showModalCancellationsBasketDetails', function (e) {\r\n _this.show = true;\r\n if (TRPCONFIG.Domain.BrandedFareCancellations) {\r\n _this.cancellationData = TRPCONFIG.Domain.BrandedFareCancellations.CancellationChargeEvents;\r\n }\r\n else if (sessionStorage.getItem('BrandedFareCancellations') !== null) {\r\n var BrandedFareCancellations = JSON.parse(sessionStorage.getItem('BrandedFareCancellations') || '');\r\n _this.cancellationData = BrandedFareCancellations.CancellationChargeEvents;\r\n }\r\n _this.formatEventName(_this.cancellationData);\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalCancellationsBasketDetails');\r\n });\r\n };\r\n ModalCancellationsBasketDetails.prototype.formatEventName = function (data) {\r\n for (var i = 0; i < data.length; i++) {\r\n var eventType = data[i].EventTypes;\r\n for (var j = 0; j < eventType.length; j++) {\r\n var chargeName = data[i].EventTypes[j];\r\n chargeName = chargeName.replace(/([A-Z])/g, ' $1').trim();\r\n data[i].EventTypes[j] = chargeName;\r\n }\r\n }\r\n };\r\n return ModalCancellationsBasketDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalCancellationsBasketDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalCancellationsBasketDetails,\r\n controllerAs: 'mcbd',\r\n templateUrl: 'partials/home/directivetemplate?type=CancellationsBasketDetails',\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ModalCancellationsDetails = /** @class */ (function () {\r\n function ModalCancellationsDetails($scope, broker) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.marhabaCost = Number(sessionStorage.getItem('marhabaCost'));\r\n this.hotelData = sessionStorage.getItem('hotelData');\r\n }\r\n ModalCancellationsDetails.prototype.init = function (container) {\r\n var _this = this;\r\n var t = this;\r\n if (this.hotelData) {\r\n var hotelDataJson = JSON.parse(this.hotelData);\r\n if (hotelDataJson.RequestedRooms.length > 1) {\r\n this.$scope.$on('multiRoomCancellationCharges', function (e, data) {\r\n t.roomCancellationCharges = data;\r\n t.formatEventName(t.roomCancellationCharges);\r\n });\r\n }\r\n }\r\n this.broker.subscribe('modalCancellationsDetails', 'showModalCancellationsDetails', function (e) {\r\n _this.show = true;\r\n _this.roomId = e.data;\r\n if (_this.hotelData) {\r\n var hotelDataJson = JSON.parse(_this.hotelData);\r\n if (hotelDataJson.RequestedRooms.length === 1) {\r\n _this.cancellationData = TRPCONFIG.Domain.CancellationData;\r\n _this.compareData(_this.cancellationData, _this.roomId);\r\n }\r\n }\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalCancellationsDetails');\r\n });\r\n };\r\n ModalCancellationsDetails.prototype.findEventType = function (eventType, price) {\r\n for (var i = 0; i < eventType.length; i++) {\r\n if (eventType[i] === 'Departure') {\r\n return price + this.marhabaCost;\r\n }\r\n }\r\n return price;\r\n };\r\n ModalCancellationsDetails.prototype.formatEventName = function (data) {\r\n for (var i = 0; i < data.length; i++) {\r\n var eventType = data[i].EventTypes;\r\n for (var j = 0; j < eventType.length; j++) {\r\n var chargeName = data[i].EventTypes[j];\r\n chargeName = chargeName.replace(/([A-Z])/g, ' $1').trim();\r\n data[i].EventTypes[j] = chargeName;\r\n }\r\n }\r\n };\r\n ModalCancellationsDetails.prototype.compareData = function (data, id) {\r\n var roomCancellationData = data.filter(function (d) {\r\n if (d.Id === id) {\r\n return d;\r\n }\r\n });\r\n this.roomCancellationCharges = roomCancellationData[0].CancellationCharges;\r\n this.formatEventName(this.roomCancellationCharges);\r\n };\r\n return ModalCancellationsDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalCancellationsDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalCancellationsDetails,\r\n controllerAs: 'mcd',\r\n templateUrl: 'partials/home/directivetemplate?type=CancellationsDetails',\r\n bindToController: {\r\n roomId: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ModalFlightDetails = /** @class */ (function () {\r\n function ModalFlightDetails($scope, broker, flightDetail) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.flightDetail = flightDetail;\r\n this.customiseMessage = false;\r\n }\r\n ModalFlightDetails.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('modalFlightDetails', 'showModalFlightDetails', function (e) {\r\n _this.flight = e.data.flight;\r\n _this.passengers = e.data.passengers;\r\n _this.show = true;\r\n _this.customiseMessage = e.data.customiseMessage;\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalFlightDetails');\r\n });\r\n };\r\n ModalFlightDetails.prototype.isHFareFlightType = function () {\r\n return this.flightDetail.isHFlightType(this.flight);\r\n };\r\n return ModalFlightDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalFlightDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalFlightDetails,\r\n controllerAs: 'fdc',\r\n templateUrl: 'partials/home/directivetemplate?type=FlightListingDetails',\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Booking;\r\n(function (Booking) {\r\n var ModalLink = /** @class */ (function () {\r\n function ModalLink($element, $location, currentUser, accountMenuService, postBookingLookup, modalService, analytics) {\r\n this.$element = $element;\r\n this.$location = $location;\r\n this.currentUser = currentUser;\r\n this.accountMenuService = accountMenuService;\r\n this.postBookingLookup = postBookingLookup;\r\n this.modalService = modalService;\r\n this.analytics = analytics;\r\n }\r\n ModalLink.prototype.select = function (event) {\r\n switch (this.modalType) {\r\n case 'termsconditions':\r\n this.modalService.launch('partials/popups/agencyterms');\r\n break;\r\n case 'unsubscribe':\r\n this.analytics.track('mixpanel', 'GDPRUnsubscribe');\r\n this.modalService.launch('partials/popups/unsubscribe');\r\n break;\r\n default:\r\n this.manage();\r\n break;\r\n }\r\n };\r\n ModalLink.prototype.manage = function () {\r\n if (this.currentUser.AnonSignedIn && !this.currentUser.SignedIn) {\r\n return this.postBookingLookup.redirect();\r\n }\r\n if (!this.currentUser.AnonSignedIn && this.currentUser.SignedIn) {\r\n return this.$location.path('dashboard/bookings/current');\r\n }\r\n return this.accountMenuService.launchOption('bookingsignin');\r\n };\r\n return ModalLink;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalLink', function () {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n transclude: true,\r\n scope: {},\r\n bindToController: {\r\n modalType: '@'\r\n },\r\n controller: ModalLink,\r\n controllerAs: 'ml',\r\n template: ''\r\n };\r\n });\r\n})(Booking || (Booking = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ModalTransferDetails = /** @class */ (function () {\r\n function ModalTransferDetails($scope, broker, $filter) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.$filter = $filter;\r\n this.passengers = { adults: 0, children: 0 };\r\n this.show = false;\r\n this.details = [];\r\n }\r\n ModalTransferDetails.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('modalTransferDetails', 'showModalTransferDetails', function (e) {\r\n _this.show = true;\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalTransferDetails');\r\n });\r\n if (this.transfers) {\r\n this.passengers = {\r\n adults: this.transfers.Details.Adults || 0,\r\n children: this.transfers.Details.ChildAges ? this.transfers.Details.ChildAges.length : 0\r\n };\r\n this.details = ['Outbound', 'Inbound'].map(function (direction) {\r\n var itinerary = _this.transfers.Details.Itinerary;\r\n return {\r\n Direction: direction,\r\n Departure: _.get(itinerary, \"[\" + direction + \"Leg].DeparturePoint\", ''),\r\n DepartureDate: _this.$filter('date')(_.get(itinerary, \"[\" + direction + \"Leg].DepartureDate\", ''), 'EEE d MMM yyyy, hh:mm'),\r\n Destination: _.get(itinerary, \"[\" + direction + \"Leg].DestinationPoint\", ''),\r\n FlightDate: _this.$filter('date')(_.get(itinerary, \"[\" + direction + \"Leg].FlightDate\", ''), 'EEE d MMM yyyy, hh:mm'),\r\n TransferType: _.get(itinerary, \"[\" + direction + \"Leg].TransferType\", '')\r\n };\r\n });\r\n }\r\n };\r\n return ModalTransferDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalTransferDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalTransferDetails,\r\n controllerAs: 'mtd',\r\n templateUrl: 'partials/home/directivetemplate?type=TransferDetails',\r\n bindToController: {\r\n transfers: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ModalUspPopupDetails = /** @class */ (function () {\r\n function ModalUspPopupDetails($scope, broker) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.hasSplit = false;\r\n }\r\n ModalUspPopupDetails.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('modalUspPopupDetails', 'showModalUspPopupDetails', function (e) {\r\n _this.show = true;\r\n _this.popupContent = e.data;\r\n var contentSplit = _this.popupContent.split('|');\r\n _this.header = contentSplit[0];\r\n _this.content = contentSplit[1];\r\n });\r\n if (TRPCONFIG.IsMobileDevice) {\r\n document.querySelector('.great-reasons-banner > div')\r\n .classList.add('isMobile');\r\n }\r\n else {\r\n document.querySelector('.great-reasons-banner > div')\r\n .classList.remove('isMobile');\r\n }\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('modalUspPopupDetails');\r\n });\r\n };\r\n return ModalUspPopupDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('modalUspPopupDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalUspPopupDetails,\r\n controllerAs: 'muspd',\r\n templateUrl: 'partials/home/directivetemplate?type=UspPopupDetails',\r\n bindToController: {\r\n popupContent: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var NewsFlash = /** @class */ (function () {\r\n function NewsFlash($element, cookieService) {\r\n this.$element = $element;\r\n this.cookieService = cookieService;\r\n this.isDismissed = false;\r\n this.isDismissed = this.cookieService.get('newsflash') !== null;\r\n }\r\n NewsFlash.prototype.onClosed = function () {\r\n this.$element.slideUp();\r\n this.persist();\r\n };\r\n NewsFlash.prototype.persist = function () {\r\n this.cookieService.set('newsflash', 'dismissed');\r\n };\r\n return NewsFlash;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('newsflash', function (cookieService) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n transclude: true,\r\n controller: NewsFlash,\r\n controllerAs: 'nf',\r\n scope: {},\r\n bindToController: {\r\n dismissable: '@',\r\n text: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Newsflash'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var PayLater = /** @class */ (function () {\r\n function PayLater($scope, analytics, modalService, $route) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.modalService = modalService;\r\n this.$route = $route;\r\n this.enabled = false;\r\n this.validAreas = {\r\n Holidays: 'holidays',\r\n Hotels: 'hotels'\r\n };\r\n if (this.overrideEnabled) {\r\n this.enabled = true;\r\n }\r\n else {\r\n var total_1 = this.$scope.$watch('pl.total', function (value) {\r\n if (value) {\r\n _this.enabled = _this.getEnabled();\r\n total_1();\r\n }\r\n });\r\n var area_1 = this.$scope.$watch('pl.area', function (value) {\r\n if (value) {\r\n _this.enabled = _this.getEnabled();\r\n area_1();\r\n }\r\n });\r\n }\r\n }\r\n PayLater.prototype.getEnabled = function () {\r\n var area = this.area || this.$route.current.area;\r\n return (area.toLowerCase() === this.validAreas.Holidays || area.toLowerCase() === this.validAreas.Hotels)\r\n && TRPCONFIG.Domain.BuyNowPayLaterEnabled && this.total > TRPCONFIG.Domain.BuyNowPayLaterCost;\r\n };\r\n PayLater.prototype.showPayLaterModal = function () {\r\n this.analytics.track('mixpanel', 'PayLaterModal');\r\n this.modalService.launch('partials/popups/paylater');\r\n };\r\n return PayLater;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('payLater', function ($filter) {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n bindToController: {\r\n message: '@',\r\n total: '@',\r\n viewType: '@',\r\n area: '@',\r\n overrideEnabled: '='\r\n },\r\n controller: PayLater,\r\n controllerAs: 'pl',\r\n template: function (elem, attrs) {\r\n if (attrs.viewType === 'link') {\r\n return \"\";\r\n }\r\n else if (attrs.viewType === 'banner') {\r\n return \"
        \\n \\n
        \";\r\n }\r\n else if (attrs.viewType === 'block') {\r\n return \"
        \\n
        \\n
        \\n

        \\n
        \\n
        \";\r\n }\r\n return \"
        \\n {{ pl.message }}\\n
        \";\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Payment;\r\n(function (Payment_1) {\r\n var PaymentCategory;\r\n (function (PaymentCategory) {\r\n PaymentCategory[PaymentCategory[\"SavedCard\"] = 1] = \"SavedCard\";\r\n PaymentCategory[PaymentCategory[\"PayPal\"] = 2] = \"PayPal\";\r\n PaymentCategory[PaymentCategory[\"Card\"] = 3] = \"Card\";\r\n })(PaymentCategory || (PaymentCategory = {}));\r\n var year = new Date().getFullYear();\r\n var Payment = /** @class */ (function () {\r\n function Payment($scope, paymentsService, paymentsUtilService, broker) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.paymentsService = paymentsService;\r\n this.paymentsUtilService = paymentsUtilService;\r\n this.broker = broker;\r\n this.currentDate = new Date();\r\n this.currentMonth = this.currentDate.getMonth();\r\n this.currentYear = this.currentDate.getFullYear();\r\n this.monthFrom = 1;\r\n this.months = _.range(1, 13);\r\n this.years = _.range(year, year + 21);\r\n this.yearsPast = _.range(year - 10, year + 1);\r\n //use the viewPage property to determine which functions and watches we should be using.\r\n // This is only here so that we can support the old template for the cards\r\n this.usingOldTemplate = /v1/i.test(this.viewPage);\r\n var wait = $scope.$watch('pay.ready', function (b) {\r\n if (b) {\r\n _this.initPaymentOptions();\r\n _this.initSavedCards();\r\n if (_this.paymentAmount != null) {\r\n $scope.$watch('pay.paymentAmount', function (v) {\r\n if (v != null) {\r\n _this.setCardFee(v);\r\n }\r\n });\r\n }\r\n _this.setDefaultSelection();\r\n wait();\r\n }\r\n });\r\n if (this.usingOldTemplate) {\r\n $scope.$watch('pay.selectedSavedCard', function (v) {\r\n if (v) {\r\n _this.savedCardSelected_TabVersion(v);\r\n }\r\n });\r\n }\r\n else {\r\n //better to watch the change of options like this. Radio button onChange seems to get it self in to\r\n //a muddle and each click generates 3 changes!\r\n $scope.$watch('pay.selectedPaymentOptionId', function (v) {\r\n if (v) {\r\n if (v.length > 1) {\r\n _this.savedCardSelected(v);\r\n }\r\n else {\r\n _this.paymentOptionChanged(parseInt(v, 10));\r\n }\r\n }\r\n });\r\n }\r\n $scope.$watch('[pay.model.cardDetail.expiryDate.year]', function (v) {\r\n var expiryDateYear = _this.model.cardDetail.expiryDate.year;\r\n var expiryDateMonth = _this.model.cardDetail.expiryDate.month;\r\n if (expiryDateYear === _this.currentYear) {\r\n _this.monthFrom = _this.currentMonth + 1;\r\n expiryDateMonth < _this.currentMonth ? _this.model.cardDetail.expiryDate.month = 0 : null;\r\n _this.months = _.range(_this.monthFrom, 13);\r\n }\r\n else {\r\n _this.months = _.range(1, 13);\r\n }\r\n });\r\n $scope.$watch('pay.creditCardErrors', function (value, previousValue) {\r\n if (value && value !== previousValue) {\r\n if (value.invalid) {\r\n _this.updateSelectedLogo(0);\r\n }\r\n }\r\n });\r\n }\r\n Payment.prototype.updateCardType = function () {\r\n this.model.cardDetail.cardNumber = undefined;\r\n if (this.model.cardDetail.cardTypeId) {\r\n var card = _.find(this.paymentOptions, { 'CardTypeId': this.model.cardDetail.cardTypeId });\r\n this.model.isPayPalPayment = false;\r\n this.model.cardDetail.isSavedCard = false;\r\n this.model.cardDetail.paymentOptionId = card.Id;\r\n this.model.cardDetail.paymentTypeId = card.PaymentType;\r\n this.model.cardDetail.cardTypeId = card.CardTypeId;\r\n this.fullCardDetailsRequired = card.FullDetailsRequired;\r\n this.isExternalFop = card.IsExternalFop;\r\n this.model.externalFop = this.paymentsUtilService.createEmptyExternalFop();\r\n this.setCardFee(this.paymentAmount);\r\n this.updateSelectedLogo(this.model.cardDetail.cardTypeId);\r\n }\r\n else {\r\n this.clearModel();\r\n }\r\n };\r\n Payment.prototype.selectTab = function (category) {\r\n //USED in tab version of template\r\n this.clearModel();\r\n this.paymentCategory = category;\r\n if (category === PaymentCategory.SavedCard) {\r\n this.selectedSavedCard = this.savedCards[0];\r\n }\r\n else {\r\n this.selectedSavedCard = null;\r\n if (category === PaymentCategory.PayPal) {\r\n this.selectPayPalOption();\r\n }\r\n else {\r\n this.model.saveCard = TRPCONFIG.Domain.SavedCardsEnabled && this.cardCanBeSaved;\r\n }\r\n }\r\n };\r\n Payment.prototype.updateDfReferenceId = function (dfReferenceId) {\r\n this.onReceive({ dfReferenceId: dfReferenceId });\r\n };\r\n Payment.prototype.addPreBookCommand = function (command) {\r\n this.addCommand({ command: command });\r\n };\r\n Payment.prototype.checkCreditCardNumber = function (cardNumber) {\r\n var _this = this;\r\n this.cardTypeChanged = '';\r\n if (!cardNumber) {\r\n return;\r\n }\r\n this.paymentsService.checkCardNumber(this.paymentOptions, cardNumber, this.model.cardDetail.cardTypeId)\r\n .then(function (result) {\r\n _this.updateSelectedLogo(result);\r\n }, function (result) {\r\n var cardOption = _.find(_this.paymentOptions, function (o) { return (o.CardTypeId === result); });\r\n var correctId = cardOption ? cardOption.CardTypeId : undefined;\r\n if (_this.model.cardDetail.cardTypeId !== correctId) {\r\n _this.clearModel();\r\n _this.model.cardDetail.cardTypeId = correctId;\r\n _this.updateCardType();\r\n _this.model.cardDetail.cardNumber = cardNumber;\r\n _this.cardTypeChanged = _this.paymentsService.getCardTitle(_this.paymentOptions, correctId);\r\n }\r\n });\r\n };\r\n Payment.prototype.selectPayPalOption = function () {\r\n this.model.isPayPalPayment = true;\r\n this.model.cardDetail.cardTypeId = this.payPalOption.CardTypeId;\r\n this.model.cardDetail.paymentOptionId = this.payPalOption.Id;\r\n this.model.cardDetail.paymentTypeId = this.payPalOption.PaymentType;\r\n this.setCardFee(this.paymentAmount);\r\n };\r\n Payment.prototype.savedCardSelected = function (cardId) {\r\n this.clearModel();\r\n var selectedCard = _.find(this.savedCards, { 'CardId': cardId });\r\n this.fullCardDetailsRequired = selectedCard.FullDetailsRequired;\r\n this.model.isPayPalPayment = false;\r\n this.model.cardDetail.isSavedCard = true;\r\n this.model.cardDetail.paymentOptionId = selectedCard.CardType;\r\n this.model.cardDetail.paymentTypeId = selectedCard.PaymentTypeId;\r\n this.model.cardDetail.savedCardId = selectedCard.CardId;\r\n this.setCardFee(this.paymentAmount);\r\n };\r\n Payment.prototype.savedCardSelected_TabVersion = function (card) {\r\n //USED in tab version of template\r\n this.clearModel();\r\n this.model.isPayPalPayment = false;\r\n this.model.cardDetail.isSavedCard = true;\r\n this.model.cardDetail.savedCardId = card.CardId;\r\n this.model.cardDetail.paymentOptionId = card.CardType;\r\n this.model.cardDetail.paymentTypeId = card.PaymentTypeId;\r\n this.fullCardDetailsRequired = card.FullDetailsRequired;\r\n this.setCardFee(this.paymentAmount);\r\n };\r\n Payment.prototype.paymentOptionChanged = function (category) {\r\n this.clearModel();\r\n if (category === PaymentCategory.Card) {\r\n this.model.saveCard = TRPCONFIG.Domain.SavedCardsEnabled && this.cardCanBeSaved;\r\n }\r\n else if (category === PaymentCategory.PayPal) {\r\n this.selectPayPalOption();\r\n }\r\n };\r\n Payment.prototype.initPaymentOptions = function () {\r\n this.paymentOptions = angular.copy(this.piPaymentOptions);\r\n this.paymentOptions.map(function (payment) {\r\n if (payment.CardTypeId !== payment.Id) {\r\n payment.CardTypeId = payment.Id;\r\n }\r\n });\r\n var paypalOptions = _.remove(this.paymentOptions, function (o) { return o.IsPayPal === true; });\r\n if (paypalOptions && paypalOptions.length === 1) {\r\n this.payPalOption = paypalOptions[0];\r\n }\r\n this.logoList = this.paymentsService.getLogosList(this.paymentOptions.concat(this.payPalOption || []));\r\n };\r\n Payment.prototype.updateSelectedLogo = function (selected) {\r\n this.broker.publish('Qubit:TRB-4:cardTypeUpdated', { id: selected });\r\n };\r\n Payment.prototype.initSavedCards = function () {\r\n var _this = this;\r\n if (this.piSavedCards && this.piSavedCards.length > 0) {\r\n this.savedCards = _.filter(this.piSavedCards, { 'IsExpired': false });\r\n if (this.usingOldTemplate === false) {\r\n this.savedCards = _.take(this.savedCards, 3);\r\n }\r\n }\r\n else {\r\n this.savedCards = [];\r\n }\r\n this.haveSavedCards = this.savedCards.length > 0;\r\n if (this.haveSavedCards && !this.savedCardsWatch) {\r\n //watch if our original list is ever changed\r\n this.savedCardsWatch = this.$scope.$watch('pay.piSavedCards', function () {\r\n _this.initSavedCards();\r\n _this.setDefaultSelection();\r\n });\r\n }\r\n };\r\n Payment.prototype.setDefaultSelection = function () {\r\n if (this.savedCards && this.savedCards.length > 0) {\r\n if (this.usingOldTemplate) {\r\n this.selectTab(PaymentCategory.SavedCard);\r\n }\r\n else {\r\n this.selectedPaymentOptionId = this.savedCards[0].CardId; //default to the 1st card\r\n }\r\n }\r\n else {\r\n if (this.usingOldTemplate) {\r\n this.selectTab(PaymentCategory.Card);\r\n }\r\n else {\r\n this.selectedPaymentOptionId = PaymentCategory.Card.toString();\r\n this.paymentOptionChanged(PaymentCategory.Card);\r\n }\r\n }\r\n };\r\n Payment.prototype.setCardFee = function (total) {\r\n var _this = this;\r\n //figure out which card type we are dealing with and update the\r\n //fee as required\r\n var setFee = function (amount, total, percent) {\r\n var fee = amount || total * (percent / 100);\r\n if (fee !== _this.model.fee) {\r\n _this.model.fee = fee;\r\n }\r\n _this.cardPercentage = percent;\r\n };\r\n if (this.model.cardDetail.isSavedCard === true) {\r\n //get saved card id, find card and update\r\n var card = _.find(this.savedCards, { 'CardId': this.model.cardDetail.savedCardId });\r\n if (card) {\r\n setFee(card.FeeAmount, total, card.FeePercent);\r\n }\r\n }\r\n else if (this.model.isPayPalPayment === true) {\r\n setFee(this.payPalOption.FeeAmount, total, this.payPalOption.FeePercent);\r\n }\r\n else if (this.model.cardDetail.cardTypeId != null) {\r\n //get payment option info and set fee\r\n var card = _.find(this.paymentOptions, { 'CardTypeId': this.model.cardDetail.cardTypeId });\r\n setFee(card.FeeAmount, total, card.FeePercent);\r\n }\r\n };\r\n Payment.prototype.clearModel = function () {\r\n this.model = this.paymentsUtilService.createEmptyPaymentModel();\r\n this.fullCardDetailsRequired = false;\r\n this.isExternalFop = false;\r\n this.cardPercentage = 0;\r\n };\r\n return Payment;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('payment', function () {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n transclude: true,\r\n scope: {\r\n piPaymentOptions: '=',\r\n piSavedCards: '=',\r\n atolProtected: '@',\r\n cardCanBeSaved: '=',\r\n flexiblePayments: '@',\r\n modal: '=',\r\n model: '=',\r\n onReceive: '&',\r\n addCommand: '&',\r\n paymentAmount: '=',\r\n ready: '=',\r\n rootForm: '=',\r\n viewPage: '@'\r\n },\r\n controller: Payment,\r\n controllerAs: 'pay',\r\n bindToController: true,\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return \"partials/booking/template?name=PaymentWithTabs&version=\" + attr.templateVersion;\r\n }\r\n return \"partials/home/PaymentDirective?form=\" + attr.viewPage;\r\n }\r\n };\r\n });\r\n})(Payment || (Payment = {}));\r\nvar Core;\r\n(function (Core) {\r\n var PaymentAmountSelection = /** @class */ (function () {\r\n function PaymentAmountSelection(currencyService, $scope) {\r\n var _this = this;\r\n this.currencyService = currencyService;\r\n this.$scope = $scope;\r\n this.payFull = true;\r\n this.currencySymbol = this.currencyService.getSymbol(this.currencyCode);\r\n var partPaymentAmountWatch;\r\n this.$scope.$watch('cm.payFull', function (payFull) {\r\n if (payFull) {\r\n _this.paymentAmount.$setViewValue(_this.maxValue);\r\n partPaymentAmountWatch && partPaymentAmountWatch();\r\n _this.partPaymentAmount = undefined;\r\n }\r\n else {\r\n partPaymentAmountWatch = _this._setPartPaymentAmountWatch();\r\n }\r\n });\r\n }\r\n PaymentAmountSelection.prototype._setPartPaymentAmountWatch = function () {\r\n var _this = this;\r\n return this.$scope.$watch('cm.partPaymentAmount', function (val) {\r\n _this.paymentAmount.$setViewValue(val);\r\n });\r\n };\r\n return PaymentAmountSelection;\r\n }());\r\n angular\r\n .module('core')\r\n .component('paymentAmountSelection', {\r\n require: {\r\n form: '?^form',\r\n paymentAmount: 'ngModel'\r\n },\r\n bindings: {\r\n maxValue: '@',\r\n currencyCode: '@',\r\n payFull: '='\r\n },\r\n controller: PaymentAmountSelection,\r\n controllerAs: 'cm',\r\n templateUrl: 'partials/dashboard/paymentamountselection'\r\n });\r\n})(Core || (Core = {}));\r\nvar core;\r\n(function (core) {\r\n var PriceInfo = /** @class */ (function () {\r\n function PriceInfo(modalService) {\r\n this.modalService = modalService;\r\n }\r\n PriceInfo.prototype.onInfoClicked = function () {\r\n this.modalService.launch('partials/popups/tax', {\r\n tax: this.tax,\r\n currency: this.currency,\r\n total: this.total\r\n });\r\n };\r\n ;\r\n return PriceInfo;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('priceInfo', function () {\r\n return {\r\n restrict: 'E',\r\n template: '
        ',\r\n bindToController: {\r\n total: '=',\r\n tax: '=?',\r\n currency: '@?'\r\n },\r\n scope: {},\r\n replace: true,\r\n controllerAs: 'pi',\r\n controller: PriceInfo\r\n };\r\n });\r\n})(core || (core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .directive('pricingModals', function (voucherModalService, tripService, $route, cookieService) {\r\n return {\r\n restrict: 'E',\r\n template: ''\r\n + ''\r\n + '',\r\n link: function ($scope) {\r\n $scope.voucherModalInfo = {};\r\n $scope.showCallToBookModal = false;\r\n $scope.showVoucherModal = false;\r\n $scope.closeVoucherModal = function () {\r\n $scope.showVoucherModal = false;\r\n };\r\n $scope.closeCallToBookModal = function () {\r\n $scope.showCallToBookModal = false;\r\n };\r\n var voucherInfoResponse = function (data) {\r\n var showedModals = JSON.parse(sessionStorage.getItem('pricingShowedModals')\r\n || '{ \"callToBook\": false, \"vouchers\": [] }');\r\n $scope.voucherModalInfo = data && data.ModalForm || {};\r\n $scope.showCallToBook = (data && data.CallToBookRequested || '') && !showedModals.callToBook;\r\n if (!_.isEmpty($scope.voucherModalInfo)) {\r\n var isShowedVoucher_1 = false;\r\n _.forEach(showedModals.vouchers, function (voucher) {\r\n if (voucher === $scope.voucherModalInfo.VoucherCode) {\r\n isShowedVoucher_1 = true;\r\n return false;\r\n }\r\n });\r\n if (!isShowedVoucher_1) {\r\n $scope.showVoucherModal = true;\r\n $scope.showCallToBookModal = false;\r\n showedModals.vouchers.unshift($scope.voucherModalInfo.VoucherCode);\r\n }\r\n }\r\n else if ($scope.showCallToBook) {\r\n $scope.showVoucherModal = false;\r\n $scope.showCallToBookModal = true;\r\n showedModals.callToBook = true;\r\n }\r\n sessionStorage.setItem('pricingShowedModals', JSON.stringify(showedModals));\r\n };\r\n $scope.$on('$locationChangeSuccess', function () {\r\n var paramBoardTypes = $route.current.params && $route.current.params.fbt || '';\r\n var tripId = $route.current.params && $route.current.params.tripId || '';\r\n var userId = $route.current.params && $route.current.params.userId || '';\r\n var estabId = Number($route.current.params && $route.current.params.estabId || 0);\r\n var sourceId = Number(cookieService.get('visitSource') || 0);\r\n var boardType = paramBoardTypes.length > 0 ?\r\n paramBoardTypes.split(',').map(function (item) {\r\n var board = item && parseInt(item, 10) || null;\r\n if (board) {\r\n return board;\r\n }\r\n }) : [];\r\n if (tripId) {\r\n tripService.getTrip(tripId).then(function (trip) {\r\n var adults = trip.HotelsRequest.Rooms.map(function (x) { return x.Adults; })\r\n .reduce(function (a, b) { return a + b; });\r\n var children = trip.HotelsRequest.Rooms.map(function (x) { return x.ChildAges.length; })\r\n .reduce(function (a, b) { return a + b; });\r\n var selections = JSON.parse(localStorage.getItem('flightsSelections') || '{}');\r\n var inboundSegmentDetails = selections.InboundSegmentDetails\r\n && selections.InboundSegmentDetails[0] || {};\r\n var outboundSegmentDetails = selections.OutboundSegmentDetails\r\n && selections.OutboundSegmentDetails[0] || {};\r\n var options = {\r\n DestinationAirport: inboundSegmentDetails.DepartureAirport || null,\r\n OriginalAirport: outboundSegmentDetails.DepartureAirport || null,\r\n Adults: adults,\r\n Children: children,\r\n CheckInDate: trip.HotelsRequest.CheckInDate,\r\n CheckOutDate: trip.HotelsRequest.CheckOutDate,\r\n IsPackage: trip.PackageId ? true : false,\r\n IsFlightPlus: trip.HotelsRequest.IsFlightPlus || false,\r\n Cabin: outboundSegmentDetails.Cabin || 0,\r\n UserId: userId,\r\n EstabId: estabId,\r\n VisitSourceId: sourceId,\r\n BoardType: boardType,\r\n DepartureDate: trip.FlightsRequest && trip.FlightsRequest.DepartureDate || '',\r\n RoomsCount: trip.HotelsRequest.Rooms.length,\r\n Carrier: outboundSegmentDetails.CarrierCode\r\n };\r\n voucherModalService.getVoucherInfo(options).then(voucherInfoResponse);\r\n });\r\n }\r\n else {\r\n voucherModalService.getVoucherInfo().then(voucherInfoResponse);\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var DestinationType = Core.Destinations.DestinationType;\r\n var RecentSearchCard = /** @class */ (function () {\r\n function RecentSearchCard($scope, imageService, savedSearchService, basketService, analytics, dateUtil) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.imageService = imageService;\r\n this.savedSearchService = savedSearchService;\r\n this.basketService = basketService;\r\n this.analytics = analytics;\r\n this.dateUtil = dateUtil;\r\n this.icons = {\r\n 1: ['flights'],\r\n 2: ['hotels'],\r\n 3: ['flights', 'hotels']\r\n };\r\n this.titles = {\r\n 1: 'SEARCHUNITTITLEFLIGHTS',\r\n 2: 'SEARCHUNITTITLEHOTELS',\r\n 3: 'SEARCHUNITTITLEHOLIDAYS'\r\n };\r\n this.viewModel = null;\r\n this.busy = false;\r\n this.$scope.$watch('rs.model', function (val, old) {\r\n if (val) {\r\n _this.viewModel = _this.enhanceModel(val);\r\n }\r\n });\r\n }\r\n RecentSearchCard.prototype.enhanceModel = function (s) {\r\n var details = s.DisplayDetails;\r\n // get destination for image\r\n var dest;\r\n if (details.Destinations) {\r\n // if hotel, use that\r\n var first = _.head(details.Destinations);\r\n if (first.Type === DestinationType.Establishment) {\r\n dest = first;\r\n }\r\n else {\r\n // get province OR first destination\r\n dest = _.find(details.Destinations, ['Type', DestinationType.Province])\r\n || first;\r\n }\r\n }\r\n else {\r\n // flight only - use airport\r\n dest = details.DestinationAirports[0].Destination;\r\n }\r\n // Return the display details only\r\n return _.assignIn(details, {\r\n Title: dest.Title,\r\n ImageUrl: this.imageService.getDestinationImage({ Id: dest.Id, Type: dest.Type }),\r\n Icons: this.icons[s.SearchType],\r\n TitleResource: this.titles[s.SearchType],\r\n StartDate: s.FromDate.Date,\r\n EndDate: s.ToDate.Date,\r\n Duration: s.OneWayOnly ? null : this.dateUtil.numberOfNights(s.FromDate.Date, s.ToDate.Date),\r\n Adults: s.Adults,\r\n Children: s.Children,\r\n Rooms: s.Rooms ? s.Rooms.length : null\r\n });\r\n };\r\n // public deleteSearch(event, s: any) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n // this.savedSearchService.removeSavedSearch(s.SavedSearchId);\r\n // }\r\n RecentSearchCard.prototype.restoreSearch = function (event, s) {\r\n var _this = this;\r\n event.preventDefault();\r\n if (!this.busy) {\r\n this.busy = true;\r\n this.savedSearchService.restoreSearch(s)\r\n .then(function () {\r\n _this.analytics.trackEvent({ label: 'restore saved search' });\r\n return _this.basketService.startWorkflow(_this.basketService.workflowType[s.SearchType]);\r\n })\r\n .catch()\r\n .then(function () { return _this.busy = false; });\r\n }\r\n };\r\n return RecentSearchCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('recentSearchCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: RecentSearchCard,\r\n controllerAs: 'rs',\r\n bindToController: {\r\n model: '='\r\n },\r\n templateUrl: 'partials/customer/recentsearchcontentcard'\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var RefreshView = /** @class */ (function () {\r\n function RefreshView($q, $routeParams, $scope, $window, basketService, broker, tripService, windowUtil) {\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.$window = $window;\r\n this.basketService = basketService;\r\n this.broker = broker;\r\n this.tripService = tripService;\r\n this.windowUtil = windowUtil;\r\n this._initialised = false;\r\n this.showWarning = false;\r\n }\r\n RefreshView.prototype.init = function () {\r\n var _this = this;\r\n if (this._initialised) {\r\n return;\r\n }\r\n this._initialised = true;\r\n if (!this.isLocalStorageSupported()) {\r\n return;\r\n }\r\n var updateData = function () {\r\n if (_this.$routeParams['tripId']) {\r\n _this.getInfoFromTrip(_this.$routeParams['tripId']).then(function (info) {\r\n _this.setData(info);\r\n });\r\n }\r\n };\r\n this.broker.subscribe('RefreshView', 'flightAddedToBasket', updateData);\r\n this.broker.subscribe('RefreshView', 'roomsAddedToBasket', updateData);\r\n var selectionHandler = this.selectionChanged.bind(this);\r\n this.$window.addEventListener('storage', selectionHandler);\r\n this.$scope.$on('$destroy', function () {\r\n _this.$window.removeEventListener('storage', selectionHandler);\r\n _this.broker.unsubscribe('RefreshView');\r\n });\r\n };\r\n RefreshView.prototype.selectionChanged = function (ev) {\r\n var _this = this;\r\n //leave if this page is not on a trip type page\r\n var tripId = this.$routeParams['tripId'];\r\n if (!tripId) {\r\n return;\r\n }\r\n //is the current page somewhere where we'd like to monitor the basket change on?\r\n var pageProduct = this.productsRelatedToPage(this.$window.location.toString());\r\n if (pageProduct === null) {\r\n return;\r\n }\r\n if (ev.key === 'trip') {\r\n var actual_1 = JSON.parse(ev.newValue);\r\n //check if it is our trip and if our other ids don't match\r\n if (actual_1.TripId === tripId) {\r\n this.getInfoFromTrip(tripId).then(function (my) {\r\n var displayWarning = false;\r\n if (pageProduct !== null && (pageProduct & Product.Flight) === Product.Flight) {\r\n displayWarning = actual_1.FlightInfo.ProductId !== my.FlightInfo.ProductId ||\r\n actual_1.TripType !== my.TripType;\r\n }\r\n if (!displayWarning && pageProduct !== null && (pageProduct & Product.Hotel) === Product.Hotel) {\r\n displayWarning = actual_1.HotelInfo !== my.HotelInfo\r\n && actual_1.HotelInfo.ProductId !== my.HotelInfo.ProductId;\r\n }\r\n if (displayWarning) {\r\n _this.$scope.$evalAsync(function () {\r\n _this.showWarning = true;\r\n });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n RefreshView.prototype.refreshPage = function () {\r\n var _this = this;\r\n //this is a bit tricky now, depending on what is in the actual trip, where we are\r\n //in our journey and the type of journey we want to redirect the user to the most useful point.\r\n var tripId = this.$routeParams['tripId'];\r\n var currentLocation = this.$window.location.toString();\r\n if (currentLocation.indexOf('/holidays/options/') > -1\r\n || currentLocation.indexOf('/holidays/book/') > -1\r\n || /\\/holidays\\/[a-zA-Z\\-0-9]{36}\\/\\d{4,}/.test(currentLocation)) {\r\n //for holidays always go back to hotel availability if we are on the hotels details page,\r\n //options page or the booking form.\r\n //This is to handle the situation where changing flights also changes the hotel results\r\n //due to filtering based on proximity to airports (Canary islands)\r\n this.getInfoFromTrip(tripId).then(function (my) {\r\n if (my.TripType === Core.Trip.TripType.Holiday) {\r\n _this.windowUtil.location.href('holidays/hotels/' + tripId);\r\n return;\r\n }\r\n _this.$window.location.reload();\r\n });\r\n }\r\n else {\r\n this.$window.location.reload();\r\n }\r\n };\r\n RefreshView.prototype.setData = function (productIds) {\r\n // date is needed to force refresh on the hotels on flights workflow on the second change to flight workflow\r\n localStorage.setItem('trip', JSON.stringify(__assign({}, productIds, { date: Date.now() })));\r\n };\r\n RefreshView.prototype.getInfoFromTrip = function (tripId) {\r\n var _this = this;\r\n return this.tripService.getTrip(tripId).then(function (trip) {\r\n var basketId = trip.BasketId;\r\n return _this.$q.all([\r\n _this.basketService.getHotel(basketId),\r\n _this.basketService.getFlight(basketId)\r\n ]).then(function (results) {\r\n var flightProductId = results[1] && results[1].ProductId || null;\r\n var hotelInfo = null;\r\n if (trip.TripType === Core.Trip.TripType.Hotel\r\n || trip.TripType === Core.Trip.TripType.Holiday) {\r\n hotelInfo = new HotelInfo(results[0] && results[0].ProductId, results[0] && results[0].Details.Id, trip.HotelsRequest.CheckInDate, trip.HotelsRequest.CheckOutDate);\r\n }\r\n return new SelectedProductInfo(tripId, trip.TripType, new FlightInfo(flightProductId), hotelInfo);\r\n });\r\n });\r\n };\r\n RefreshView.prototype.getInfoFromStorage = function (tripId) {\r\n var info = JSON.parse(localStorage.getItem('trip') || '');\r\n if (info.TripId === tripId) {\r\n return info;\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n RefreshView.prototype.isLocalStorageSupported = function () {\r\n var key = 'test';\r\n try {\r\n localStorage.setItem(key, '1');\r\n localStorage.removeItem(key);\r\n return true;\r\n }\r\n catch (error) {\r\n return false;\r\n }\r\n };\r\n RefreshView.prototype.productsRelatedToPage = function (url) {\r\n var map = [\r\n { Regex: /\\/(hotels)\\/book\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel },\r\n { Regex: /\\/(holidays)\\/book\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight },\r\n { Regex: /\\/holidays\\/hotels\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight },\r\n { Regex: /\\/holidays\\/[a-zA-Z\\-0-9]{36}\\/\\d{4,}/, Products: Product.Flight },\r\n { Regex: /\\/holidays\\/options\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight }\r\n ];\r\n for (var i = 0; i < map.length; i++) {\r\n if (map[i].Regex.test(url)) {\r\n return map[i].Products;\r\n }\r\n }\r\n return null;\r\n };\r\n return RefreshView;\r\n }());\r\n ///Enum for holding product types should be keyed so that you can use bitwise operators\r\n ///to decide if a product is included in a set\r\n var Product;\r\n (function (Product) {\r\n Product[Product[\"Flight\"] = 1] = \"Flight\";\r\n Product[Product[\"Hotel\"] = 2] = \"Hotel\";\r\n })(Product || (Product = {}));\r\n var FlightInfo = /** @class */ (function () {\r\n function FlightInfo(ProductId) {\r\n this.ProductId = ProductId;\r\n }\r\n return FlightInfo;\r\n }());\r\n var HotelInfo = /** @class */ (function () {\r\n function HotelInfo(ProductId, Id, CheckInDate, CheckOutDate) {\r\n this.ProductId = ProductId;\r\n this.Id = Id;\r\n this.CheckInDate = CheckInDate;\r\n this.CheckOutDate = CheckOutDate;\r\n }\r\n return HotelInfo;\r\n }());\r\n var SelectedProductInfo = /** @class */ (function () {\r\n function SelectedProductInfo(TripId, TripType, FlightInfo, HotelInfo, date) {\r\n this.TripId = TripId;\r\n this.TripType = TripType;\r\n this.FlightInfo = FlightInfo;\r\n this.HotelInfo = HotelInfo;\r\n this.date = date;\r\n }\r\n return SelectedProductInfo;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('refreshView', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'rv',\r\n controller: RefreshView,\r\n templateUrl: 'partials/home/directivetemplate?type=RefreshView',\r\n link: function (scope, el, attr, controller) {\r\n controller.init();\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var ReviewHotelCard = /** @class */ (function () {\r\n function ReviewHotelCard() {\r\n }\r\n return ReviewHotelCard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('reviewHotelCard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: ReviewHotelCard,\r\n controllerAs: 'rh',\r\n bindToController: {\r\n trip: '='\r\n },\r\n templateUrl: 'partials/customer/reviewhotelcard'\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .directive('sash', function () {\r\n return {\r\n scope: {\r\n ribbon: '=?',\r\n isFromOverlay: '=?'\r\n },\r\n restrict: 'E',\r\n link: function (scope, element, attrs) {\r\n scope.$watch('ribbon', function (value) {\r\n // TODO - refactor, fixes attaching several child content elements\r\n element.empty();\r\n var ribbon = scope.isFromOverlay ?\r\n scope.ribbon && scope.ribbon.hotel && scope.ribbon.hotel.OverlaysNew[0]\r\n || (scope.ribbon && scope.ribbon.OverlaysNew[0] || scope.ribbon)\r\n : scope.ribbon;\r\n if (ribbon) {\r\n ribbon = !scope.isFromOverlay ? ribbon && (ribbon.ribbon || ribbon)\r\n && (ribbon.ribbon && ribbon.ribbon.ribbon || ribbon.ribbon) : ribbon; // Find ribbon object\r\n var prefix_2 = 'sc-c-sash--'; // Sash base style class\r\n var styles_1 = [\r\n 'sc-c-sash',\r\n \"\" + prefix_2 + (ribbon && ribbon.ColourClass)\r\n ]; // Sash color class style\r\n ribbon.EffectClasses.forEach(function (effect) {\r\n styles_1.push(\"\" + prefix_2 + effect); // Sets effect class to sash\r\n });\r\n var styleClass = styles_1.join(' '); // Join all styles into one\r\n var contentClass = 'sc-c-sash__label';\r\n var ribbonElement = angular.element(\"
        \").addClass(styleClass);\r\n var ribbonContent_1 = angular.element(\"
        \").addClass(contentClass);\r\n var textLengthValidator = function (text) { return text && text.slice(0, 10); };\r\n var textSeparator = ribbon.Text.includes('|') ? '|' : ' ';\r\n var textArray_1 = ribbon.Text.toUpperCase()\r\n .split(textSeparator)\r\n .map(textLengthValidator);\r\n var boldStrClass_1 = 'star-rating sc-u-bold sc-c-sash__row row-gutter-y__zero';\r\n var normalStrClass_1 = 'star-rating sc-c-sash__row row-gutter-y__zero';\r\n textArray_1.forEach(function (current, index) {\r\n var isBold = ((textArray_1.length - 1) === index && textArray_1.length > 2) || index === 0;\r\n var label = angular.element(\"\" + current + \"\")\r\n .addClass(isBold ? boldStrClass_1 : normalStrClass_1);\r\n ribbonContent_1.append(label);\r\n });\r\n ribbonElement.append(ribbonContent_1);\r\n element.append(ribbonElement);\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ScrollAndClickCtrl = /** @class */ (function () {\r\n function ScrollAndClickCtrl($scope, $timeout, scrollService) {\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.scrollService = scrollService;\r\n }\r\n ScrollAndClickCtrl.prototype.scrollAndClick = function () {\r\n var _this = this;\r\n this.scrollService.scrollTo(this.scrollTarget, { animate: true });\r\n this.$timeout(function () {\r\n var clickTarget = angular.element(_this.clickTarget);\r\n if (!clickTarget.hasClass(_this.activeClass)) {\r\n clickTarget.click();\r\n }\r\n });\r\n };\r\n return ScrollAndClickCtrl;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('scrollAndClick', function () {\r\n return {\r\n bindToController: {\r\n scrollTarget: '@',\r\n clickTarget: '@',\r\n activeClass: '@'\r\n },\r\n controller: ScrollAndClickCtrl,\r\n controllerAs: 'scr',\r\n replace: false,\r\n restrict: 'E',\r\n scope: {},\r\n template: '',\r\n transclude: true\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('scrollPage', scrollPage);\r\n function scrollPage() {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n toBottom: '='\r\n },\r\n template: '',\r\n link: function (scope) {\r\n var scrollTo = 0;\r\n var offset = 400;\r\n var maxDuration = 500;\r\n var win = $(window);\r\n var toBottom = scope.toBottom;\r\n scope.visible = false;\r\n scope.checkVisibility = function () {\r\n scrollTo = win.scrollTop() + (toBottom ? win.height() : 0);\r\n if ((toBottom && scope.visible !== (scrollTo <= $(document).height() - offset))\r\n || !toBottom && scope.visible !== (scrollTo >= offset)) {\r\n scope.$apply(scope.visible = !scope.visible);\r\n }\r\n };\r\n win.on(toBottom ? 'scroll.scrollBottom' : 'scroll.scrollTop', _.debounce(scope.checkVisibility, 100));\r\n scope.scrollPage = function () {\r\n // set a duration relative to the distance we need to scroll\r\n var duration = Math.min(maxDuration, Math.abs(Math.round(scrollTo * 0.3)));\r\n var scrollInfo = { scrollTop: toBottom ? $(document).height() : 0 };\r\n $('html, body').stop().animate(scrollInfo, { easing: 'swing', duration: duration });\r\n };\r\n scope.$on('$destroy', function () {\r\n win.off(toBottom ? 'scroll.scrollBottom' : 'scroll.scrollTop');\r\n });\r\n }\r\n };\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var ScrollerCtrl = /** @class */ (function () {\r\n function ScrollerCtrl($scope, scrollService) {\r\n this.$scope = $scope;\r\n this.scrollService = scrollService;\r\n }\r\n ScrollerCtrl.prototype.scroll = function () {\r\n var options = {\r\n animate: true,\r\n offset: this.offset\r\n };\r\n if (angular.element('.scroller-relative-container').length !== 0) {\r\n options.container = '.scroller-relative-container';\r\n }\r\n this.scrollService.scrollTo(this.target, options);\r\n };\r\n return ScrollerCtrl;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('scroller', function () {\r\n return {\r\n bindToController: {\r\n target: '@',\r\n offset: '@',\r\n linkClass: '@'\r\n },\r\n controller: ScrollerCtrl,\r\n controllerAs: 'scr',\r\n replace: false,\r\n restrict: 'E',\r\n scope: {},\r\n template: '',\r\n transclude: true\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedAttractionSummary = /** @class */ (function () {\r\n function SelectedAttractionSummary($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.show = false;\r\n var stop = this.$scope.$watch('sas.attraction', function (v) {\r\n if (v) {\r\n _this.init(v);\r\n stop();\r\n }\r\n });\r\n }\r\n SelectedAttractionSummary.prototype.init = function (attraction) {\r\n var tickets = [];\r\n _.each(attraction, function (a) {\r\n _.each(a.CostBreakdown, function (i) {\r\n tickets.push({ quantity: i.Quantity, title: i.Description });\r\n });\r\n });\r\n this.tickets = tickets;\r\n this.show = tickets.length > 0;\r\n };\r\n return SelectedAttractionSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedAttractionSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedAttractionSummary,\r\n controllerAs: 'sas',\r\n replace: true,\r\n bindToController: {\r\n attraction: '=',\r\n titleText: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=SelectedAttractionSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedCarhireSummary = /** @class */ (function () {\r\n function SelectedCarhireSummary($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.show = false;\r\n var stop = this.$scope.$watch('scs.carhire', function (v) {\r\n if (v) {\r\n _this.init(v);\r\n stop();\r\n }\r\n });\r\n }\r\n SelectedCarhireSummary.prototype.init = function (carhire) {\r\n this.details = carhire.Details.HireDetails;\r\n this.show = true;\r\n };\r\n return SelectedCarhireSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedCarhireSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedCarhireSummary,\r\n controllerAs: 'scs',\r\n replace: true,\r\n bindToController: {\r\n carhire: '=',\r\n titleText: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=SelectedCarHireSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedFlightSummary = /** @class */ (function () {\r\n function SelectedFlightSummary(broker, flightSearch, $scope, resourceService, basketService, occupancyService) {\r\n this.broker = broker;\r\n this.flightSearch = flightSearch;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.basketService = basketService;\r\n this.occupancyService = occupancyService;\r\n this.hideCaption = false;\r\n this.changeFlightEnabled = this.changeFlightEnabled === 'true';\r\n }\r\n SelectedFlightSummary.prototype.init = function (container) {\r\n };\r\n SelectedFlightSummary.prototype.showDetails = function (e) {\r\n var passengers = this.occupancyService.getTotalPeopleCounts();\r\n e.preventDefault();\r\n this.broker.publish('showModalFlightDetails', {\r\n flight: this.flight.Details.Itinerary,\r\n passengers: passengers\r\n });\r\n };\r\n SelectedFlightSummary.prototype.changeFlight = function () {\r\n this.flightSearch.resetPageIndex();\r\n this.basketService.changeJourneyUrl(10, this.tripId);\r\n if (this.changeFlightInterstitial) {\r\n this.$scope.$emit('block', {\r\n title: this.resourceService.get('SEARCHINGFLIGHTS'),\r\n subtitle: this.resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-searchUnitCtrl'\r\n });\r\n }\r\n };\r\n return SelectedFlightSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedFlightSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedFlightSummary,\r\n controllerAs: 'sfs',\r\n replace: true,\r\n bindToController: {\r\n tripId: '=?',\r\n flight: '=',\r\n changeFlightEnabled: '@',\r\n changeFlightInterstitial: '<',\r\n hideCaption: '@'\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=SelectedFlightSummary&version='\r\n + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=SelectedFlightSummary';\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedInsuranceSummary = /** @class */ (function () {\r\n function SelectedInsuranceSummary($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.show = false;\r\n var stop = this.$scope.$watch('sis.insurance', function (v) {\r\n if (v) {\r\n _this.init(v);\r\n stop();\r\n }\r\n });\r\n }\r\n SelectedInsuranceSummary.prototype.init = function (insurance) {\r\n this.quote = insurance.Details.InsuranceQuotes[0];\r\n this.show = true;\r\n };\r\n return SelectedInsuranceSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedInsuranceSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedInsuranceSummary,\r\n controllerAs: 'sis',\r\n replace: true,\r\n bindToController: {\r\n insurance: '=',\r\n titleText: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=SelectedInsuranceSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedParkingSummary = /** @class */ (function () {\r\n function SelectedParkingSummary($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.show = false;\r\n var stop = this.$scope.$watch('sps.parking', function (v) {\r\n if (v) {\r\n _this.init(v);\r\n stop();\r\n }\r\n });\r\n }\r\n SelectedParkingSummary.prototype.init = function (parking) {\r\n this.quote = parking.Details.Quote;\r\n this.show = true;\r\n };\r\n return SelectedParkingSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedParkingSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedParkingSummary,\r\n controllerAs: 'sps',\r\n replace: true,\r\n bindToController: {\r\n parking: '=',\r\n titleText: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=SelectedParkingSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectedTransferSummary = /** @class */ (function () {\r\n function SelectedTransferSummary($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.show = false;\r\n var stop = this.$scope.$watch('sts.transfer', function (v) {\r\n if (v) {\r\n _this.init(v);\r\n stop();\r\n }\r\n });\r\n }\r\n SelectedTransferSummary.prototype.init = function (transfer) {\r\n var legs = [];\r\n if (transfer.Details.Itinerary.OutboundLeg) {\r\n legs.push(__assign({}, transfer.Details.Itinerary.OutboundLeg, { isOutboundLeg: true }));\r\n }\r\n if (transfer.Details.Itinerary.InboundLeg) {\r\n legs.push(__assign({}, transfer.Details.Itinerary.InboundLeg, { isOutboundLeg: false }));\r\n }\r\n this.legs = [].concat(legs);\r\n this.show = true;\r\n };\r\n return SelectedTransferSummary;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectedTransferSummary', function () {\r\n return {\r\n scope: {},\r\n controller: SelectedTransferSummary,\r\n controllerAs: 'sts',\r\n replace: true,\r\n bindToController: {\r\n transfer: '=',\r\n titleText: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=SelectedTransferSummary'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var SignInDashboard = /** @class */ (function () {\r\n function SignInDashboard($rootScope, $scope, $q, customerDashboardService, houseRecommender, analytics, currentUser) {\r\n var _this = this;\r\n this.$rootScope = $rootScope;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.customerDashboardService = customerDashboardService;\r\n this.houseRecommender = houseRecommender;\r\n this.analytics = analytics;\r\n this.currentUser = currentUser;\r\n this.user = null;\r\n this.searches = [];\r\n this.destinations = [];\r\n this.tileTemplates = {\r\n 1: null,\r\n 2: null,\r\n 3: null\r\n };\r\n this.tileModels = {\r\n 1: null,\r\n 2: null,\r\n 3: null\r\n };\r\n this.tileTypes = {\r\n 1: null,\r\n 2: null,\r\n 3: null,\r\n 4: null,\r\n 5: null\r\n };\r\n $scope.$on('auth:signin', function () {\r\n _this.setDashboardState();\r\n });\r\n $scope.$on('auth:signout', function () {\r\n _this.setDashboardState();\r\n _this.user = null;\r\n });\r\n this.setDashboardState();\r\n }\r\n SignInDashboard.prototype.setDashboardState = function () {\r\n // Set local scope user\r\n this.user = this.currentUser.get();\r\n // Show this dashboard if the user is NOT signed in\r\n this.showDashboard = !this.user.AnonSignedIn && !this.user.SignedIn;\r\n this.showDashboard && this.fetch();\r\n };\r\n SignInDashboard.prototype.fetch = function () {\r\n var _this = this;\r\n this.fetching = true;\r\n this.resetData();\r\n // The sign-in card doesn't require data so we can load it immediately\r\n this.tileTypes[1] = Customer.DashboardTileType.InspirationalContent;\r\n this.tileTemplates[1] = this.customerDashboardService.getTemplateForPlaceholder(Customer.DashboardTileType.InspirationalContent);\r\n var promises = [];\r\n // Get 2 recent searches\r\n promises.push(this.customerDashboardService.getRecentSearches(2));\r\n // Get recommended destinations\r\n promises.push(this.houseRecommender.getHouseRecs());\r\n this.$q.all(promises).then(function (_a) {\r\n var searches = _a[0], destinations = _a[1];\r\n _this.searches = searches;\r\n _this.destinations = destinations;\r\n _this.configureTiles().then(function () {\r\n _this.fetching = false;\r\n _this.customerDashboardService.trackDashboardLoad(null, _this.tileTypes);\r\n });\r\n });\r\n };\r\n SignInDashboard.prototype.configureTiles = function () {\r\n var _this = this;\r\n var deferred = this.$q.defer();\r\n // Placeholder 1\r\n // Sign-in card\r\n // *** ALREADY SET ***\r\n // Placeholder 2\r\n // Searches[0] OR Destinations[0]\r\n var type;\r\n if (this.searches[0]) {\r\n // show the first search\r\n this.tileTypes[2] = Customer.DashboardTileType.Search;\r\n this.tileModels[2] = this.searches[0];\r\n }\r\n else {\r\n // show the first destination\r\n this.tileTypes[2] = Customer.DashboardTileType.Destination;\r\n this.tileModels[2] = this.destinations[0];\r\n }\r\n // Placeholder 3\r\n // Searches[1] OR Destinations[0] OR Destinations[1]\r\n if (this.searches[1]) {\r\n // show the second search\r\n this.tileTypes[3] = Customer.DashboardTileType.Search;\r\n this.tileModels[3] = this.searches[1];\r\n }\r\n else {\r\n // show a destination\r\n this.tileTypes[3] = Customer.DashboardTileType.Destination;\r\n if (this.tileTypes[2] === Customer.DashboardTileType.Search) {\r\n // show the first destination which doesn't match the destination of the search\r\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(this.tileModels[2], this.destinations);\r\n }\r\n else {\r\n // show the second destination\r\n this.tileModels[3] = this.destinations[1];\r\n }\r\n }\r\n // map the templates to the types\r\n _.forOwn(this.tileTypes, function (type, key) {\r\n if (type) {\r\n _this.tileTemplates[key] = _this.customerDashboardService.getTemplateForPlaceholder(type);\r\n }\r\n });\r\n deferred.resolve();\r\n return deferred.promise;\r\n };\r\n SignInDashboard.prototype.resetData = function () {\r\n // reset all data to initial state\r\n this.searches.length = 0;\r\n this.destinations.length = 0;\r\n // placeholder templates and models\r\n _.forOwn(this.tileTemplates, function (p) { return p = null; });\r\n _.forOwn(this.tileModels, function (p) { return p = null; });\r\n _.forOwn(this.tileTypes, function (p) { return p = null; });\r\n };\r\n SignInDashboard.prototype.getModelForPlaceholder = function (position) {\r\n // We return the model in an array so that we can use ng-repeat\r\n // to declare a privately scoped model for the ng-included template\r\n return [this.tileModels[position]];\r\n };\r\n SignInDashboard.prototype.tileClick = function (position) {\r\n this.customerDashboardService.trackDashboardClick(position, this.tileTypes[position]);\r\n };\r\n return SignInDashboard;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('signInDashboard', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: SignInDashboard,\r\n controllerAs: 'sid',\r\n bindToController: {},\r\n templateUrl: 'partials/customer/signindashboard'\r\n };\r\n });\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular.module('core')\r\n .directive('stickyElement', function () {\r\n return {\r\n restrict: 'E',\r\n template: '
        0 ? bottomLimitId : \\'0\\'}}\">' +\r\n '
        ' +\r\n '
        ',\r\n transclude: true,\r\n compile: function (el, attrs, transclude) {\r\n return function ($scope) {\r\n var stickyTopOffset = 0;\r\n var fixedClass = 'fixed';\r\n var absoluteClass = 'absolute';\r\n var $stickyWrapper = el.find('.sticky-wrapper');\r\n var $stickyContent = el.find('.sticky-content');\r\n var bottomLimit = 'true' === attrs.bottomLimit;\r\n var bottomSelector = parseInt(attrs.bottomLimitId, 10) > 0 ? \"[data-id=\" + attrs.bottomLimitId + \"]\" : '.page-content';\r\n var debounceThreshold = 100;\r\n var resizeStickyContent = _.debounce(function () {\r\n var stickyWrapperWidth = $stickyWrapper.width();\r\n var stickyContentWidth = $stickyContent.outerWidth();\r\n if (stickyContentWidth !== stickyWrapperWidth) {\r\n $stickyContent.css({ width: stickyWrapperWidth + 'px' });\r\n $stickyWrapper.css({ height: $stickyContent.outerHeight() + 'px' });\r\n }\r\n }, debounceThreshold);\r\n var checkStickyOffset = function () {\r\n var checkOffset = $stickyWrapper.offset().top;\r\n if (!stickyTopOffset || (!$stickyWrapper.hasClass(fixedClass) &&\r\n stickyTopOffset !== checkOffset)) {\r\n stickyTopOffset = checkOffset;\r\n }\r\n };\r\n var handleScroll = function () {\r\n checkStickyOffset();\r\n var scrollOffset = $(window).scrollTop();\r\n var isAtBottomLimit = false;\r\n if (bottomLimit) {\r\n var $pageContent = $(bottomSelector);\r\n if ($pageContent.length && $stickyWrapper.hasClass(fixedClass)) {\r\n var bottomLimit_1 = $pageContent.offset().top + $pageContent.outerHeight();\r\n var currentBottom = scrollOffset + $stickyContent.outerHeight();\r\n if (bottomLimit_1 <= currentBottom) {\r\n isAtBottomLimit = true;\r\n if (!$stickyWrapper.hasClass(absoluteClass)) {\r\n $stickyWrapper.addClass(absoluteClass);\r\n $stickyContent.css({ top: (bottomLimit_1 - $stickyContent.outerHeight()) + 'px' });\r\n }\r\n }\r\n else {\r\n if ($stickyWrapper.hasClass(absoluteClass)) {\r\n $stickyWrapper.removeClass(absoluteClass);\r\n $stickyContent.css({ top: 0 });\r\n }\r\n }\r\n }\r\n }\r\n if (!isAtBottomLimit) {\r\n if (scrollOffset >= stickyTopOffset && !$stickyWrapper.hasClass(fixedClass)) {\r\n var wrapperHeight = $stickyWrapper.outerHeight();\r\n if (wrapperHeight) {\r\n var contentWidth = $stickyContent.outerWidth();\r\n $stickyWrapper.css({ height: wrapperHeight + 'px' });\r\n $stickyContent.css({ width: contentWidth + 'px' });\r\n $stickyWrapper.addClass(fixedClass);\r\n window.addEventListener('resize', resizeStickyContent, false);\r\n }\r\n }\r\n else if (scrollOffset < stickyTopOffset && $stickyWrapper.hasClass(fixedClass)) {\r\n $stickyWrapper.removeClass(fixedClass);\r\n $stickyWrapper.removeAttr('style');\r\n $stickyContent.removeAttr('style');\r\n window.removeEventListener('resize', resizeStickyContent, false);\r\n }\r\n }\r\n };\r\n transclude($scope, function (clone) {\r\n $stickyContent.append(clone);\r\n $scope.wrapperClass = attrs.wrapperClass;\r\n $scope.bottomLimitId = attrs.bottomLimitId;\r\n /// Watch the height of the content in the sticky wrapper. Height can change as the data is\r\n /// being loaded in the sticky element. If the height of the wrapper is zero, it will not\r\n /// stick.\r\n var initialContentHeight = $stickyContent.outerHeight();\r\n $scope.$watch(function () {\r\n var contentHeight = $stickyContent.outerHeight();\r\n var wrapperHeight = $stickyWrapper.outerHeight();\r\n if (0 === initialContentHeight && contentHeight > 0) {\r\n initialContentHeight = -1;\r\n handleScroll();\r\n }\r\n else if (contentHeight !== wrapperHeight && $stickyWrapper.hasClass(fixedClass)) {\r\n $stickyWrapper.css({ height: contentHeight + 'px' });\r\n }\r\n });\r\n window.addEventListener('scroll', handleScroll, false);\r\n $scope.$on('$destroy', function () {\r\n window.removeEventListener('scroll', handleScroll, false);\r\n });\r\n });\r\n };\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var CampaignTelephoneNumber = /** @class */ (function () {\r\n function CampaignTelephoneNumber(cookieService, resourceService) {\r\n this.cookieService = cookieService;\r\n this.resourceService = resourceService;\r\n var matchedCampaign = [];\r\n this.telephoneNumber = this.resourceService.get('TELEPHONENUMBER');\r\n var ref = this.cookieService.get('CampaignReferrer');\r\n if (ref && ref.includes('_')) {\r\n var referrerList = ref.split('_');\r\n var referrer_1 = {\r\n Source: referrerList[0].toLowerCase(),\r\n Medium: referrerList[1].toLowerCase()\r\n };\r\n matchedCampaign = this.campaigns.filter(function (campaign) {\r\n var campSource = campaign.Source.toLowerCase();\r\n var referSource = referrer_1.Source.toLowerCase();\r\n var campMedium = campaign.Medium.toLowerCase();\r\n var referMedium = referrer_1.Medium.toLowerCase();\r\n return CampaignTelephoneNumber.isMatched(campSource, referSource)\r\n && CampaignTelephoneNumber.isMatched(campMedium, referMedium);\r\n });\r\n }\r\n if (matchedCampaign.length && matchedCampaign[0].Number) {\r\n this.telephoneNumber = matchedCampaign[0].Number;\r\n }\r\n }\r\n CampaignTelephoneNumber.isMatched = function (campVal, referVal) {\r\n if (campVal === referVal) {\r\n return true;\r\n }\r\n if (campVal.indexOf('%') !== -1) {\r\n campVal = campVal.replace(/[-\\/\\\\^$*+?.()|\\[\\]{}]/g, '\\\\$&');\r\n campVal = campVal.replace(/%/g, '.*');\r\n var regEx = new RegExp(\"^\" + campVal + \"$\");\r\n return regEx.test(referVal);\r\n }\r\n return false;\r\n };\r\n return CampaignTelephoneNumber;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('campaignTelephoneNumber', function (cookieService) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n controller: CampaignTelephoneNumber,\r\n controllerAs: 'tn',\r\n scope: {},\r\n bindToController: {\r\n campaigns: '=',\r\n eventTracker: '@',\r\n eventCategory: '@',\r\n eventAction: '@',\r\n eventLabel: '@',\r\n },\r\n template: function (element, attrs) {\r\n if (!attrs.eventCategory) {\r\n return \"\\n {{ tn.telephoneNumber }}\";\r\n }\r\n return \"{{ tn.telephoneNumber }}\";\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar Core;\r\n(function (Core) {\r\n var UniqueSellingPoint = /** @class */ (function () {\r\n function UniqueSellingPoint(modalService, $location) {\r\n this.modalService = modalService;\r\n this.$location = $location;\r\n this.autoLaunch();\r\n }\r\n UniqueSellingPoint.prototype.launchModal = function () {\r\n if (this.modal !== '') {\r\n this.modalService.launch(this.modal);\r\n }\r\n };\r\n UniqueSellingPoint.prototype.autoLaunch = function () {\r\n var usp = this.$location.search().usp;\r\n if (usp && this.modal !== '' && this.modal.indexOf('/') > 0) {\r\n if (usp === this.modal.split('/').pop()) {\r\n this.launchModal();\r\n }\r\n }\r\n };\r\n return UniqueSellingPoint;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('uniqueSellingPoint', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n controller: UniqueSellingPoint,\r\n controllerAs: 'usp',\r\n scope: {},\r\n bindToController: {\r\n icon: '@',\r\n title: '@',\r\n text: '@',\r\n modal: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=UniqueSellingPoint'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var UrlDiscount = /** @class */ (function () {\r\n function UrlDiscount($http) {\r\n var _this = this;\r\n this.$http = $http;\r\n if (TRPCONFIG.DiscountCode === null || TRPCONFIG.DiscountCode === undefined) {\r\n $http.get('?dlc=' + this.code).then(function () {\r\n TRPCONFIG.DiscountCode = _this.code;\r\n });\r\n }\r\n }\r\n return UrlDiscount;\r\n }());\r\n angular.module('core')\r\n .directive('urlDiscount', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n bindToController: {\r\n code: '@'\r\n },\r\n controller: UrlDiscount,\r\n controllerAs: 'urld'\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .directive('voucherModal', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n show: '=',\r\n close: '&',\r\n voucherInfo: '='\r\n },\r\n templateUrl: 'partials/Home/directivetemplate?type=VoucherModal',\r\n link: function ($scope) {\r\n $scope.copyVoucherToClipboard = function (voucher) {\r\n var copyElement = document.createElement('textarea');\r\n copyElement.style.position = 'fixed';\r\n copyElement.style.opacity = '0';\r\n copyElement.textContent = voucher;\r\n var body = document.getElementsByTagName('body')[0];\r\n body.appendChild(copyElement);\r\n copyElement.select();\r\n document.execCommand('copy');\r\n body.removeChild(copyElement);\r\n };\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .filter('roundedCurrency', roundedCurrency)\r\n .filter('roundUpToNearest', roundUpToNearest);\r\n function roundedCurrency(currencyFilter, $locale, currencyService, decimalAdjust) {\r\n var formats = $locale.NUMBER_FORMATS;\r\n function separate(decimals, formats, result) {\r\n if (!decimals) {\r\n return result.lastIndexOf(formats.DECIMAL_SEP);\r\n }\r\n return result.lastIndexOf(formats.DECIMAL_SEP) + 3;\r\n }\r\n return function (amount, code, type, decimals, exp, spaced) {\r\n if (code === void 0) { code = TRPCONFIG.Domain.CurrencyCode; }\r\n if (type === void 0) { type = 'ceil'; }\r\n if (decimals === void 0) { decimals = false; }\r\n if (exp === void 0) { exp = 0; }\r\n if (spaced === void 0) { spaced = false; }\r\n if (amount == null) {\r\n return undefined;\r\n }\r\n var sym = currencyService.getSymbol(code);\r\n if (isNaN(amount)) {\r\n if (amount.toString().indexOf(sym) >= 0) {\r\n var patt = new RegExp(sym + \"|,| \", 'g');\r\n var amountStr = amount.toString().replace(patt, '');\r\n amount = parseFloat(amountStr);\r\n }\r\n else {\r\n return undefined;\r\n }\r\n }\r\n if (type !== 'cut') {\r\n amount = decimalAdjust(type, amount, exp);\r\n }\r\n var res = sym ? currencyFilter(amount, sym) : currencyFilter(amount);\r\n var separated = separate(decimals, formats, res);\r\n var result = res.substring(0, separated) + res.substring(separated + 3);\r\n if (spaced) {\r\n var indexOfNumber = result.indexOf(result.match(/\\d/));\r\n return result.substring(0, indexOfNumber) + \" \" + result.substring(indexOfNumber);\r\n }\r\n var finalResult;\r\n if (amount < 0 && result.includes('(') && result.includes(')')) {\r\n finalResult = result.replace('(', '-').replace(')', '');\r\n }\r\n else {\r\n finalResult = result;\r\n }\r\n return finalResult;\r\n };\r\n }\r\n // use to round a value up to nearest specified whole number\r\n // used for ensuring price values are always rounded higher;\r\n // defaults to use nearest 5 and 9\r\n function roundUpToNearest(currencyFilter, currencyService) {\r\n return function (amount, code, targets) {\r\n if (code === void 0) { code = TRPCONFIG.Domain.CurrencyCode; }\r\n if (targets === void 0) { targets = [5, 9]; }\r\n if (angular.isNumber(targets)) {\r\n targets = [targets];\r\n }\r\n var value = Math.ceil(amount);\r\n var diff = Math.abs(value) % 10;\r\n //check if the amount already ends in the specified targets\r\n if (targets.indexOf(diff) === -1) {\r\n targets = targets.concat(targets.map(function (i) { return i + 10; }));\r\n targets.sort(function (a, b) { return a - b; });\r\n for (var i = 0; i < targets.length; i++) {\r\n if (diff < targets[i]) {\r\n value += (targets[i] - diff);\r\n break;\r\n }\r\n }\r\n }\r\n var sym = currencyService.getSymbol(code);\r\n var res = currencyFilter(value, sym, 0);\r\n return res;\r\n };\r\n }\r\n angular\r\n .module('core')\r\n .filter('customCurrency', customCurrency);\r\n function customCurrency(currencyFilter, currencyService) {\r\n return function (cost, code) {\r\n if (cost == null || isNaN(cost)) {\r\n return undefined;\r\n }\r\n if (!code) {\r\n code = TRPCONFIG.Domain.CurrencyCode;\r\n }\r\n var symbol = currencyService.getCurrencies()[code];\r\n if (!symbol) {\r\n symbol = code + \" \";\r\n }\r\n else {\r\n symbol = symbol();\r\n }\r\n return currencyFilter(cost, symbol);\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .filter('insuranceBandFilter', function () {\r\n return function (bands, guest) {\r\n var filteredBands = [];\r\n if (guest.Type === 1) {\r\n angular.forEach(bands, function (band) {\r\n if (guest.Type === band.PassengerType) {\r\n filteredBands.push(band);\r\n }\r\n });\r\n }\r\n else {\r\n angular.forEach(bands, function (band) {\r\n if (guest.Age <= band.EndAge && guest.Age >= band.StartAge) {\r\n filteredBands.push(band);\r\n }\r\n });\r\n }\r\n return filteredBands;\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .filter('parseUtilityClasses', function () {\r\n return function (classes, prefix) { return classes && classes.map(function (i) { return prefix + \"--\" + i; }).join(' '); };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .filter('unadjustedDate', unadjustedDate);\r\n function unadjustedDate(dateFilter, dateUtil) {\r\n return function (date, format) {\r\n return date == null\r\n ? undefined\r\n : dateFilter(dateUtil.parseDate(date), format);\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('core')\r\n .filter('unique', function () {\r\n return function (collection, keyname) {\r\n var output = [];\r\n var keys = [];\r\n angular.forEach(collection, function (item) {\r\n var key = item[keyname];\r\n if (keys.indexOf(key) === -1) {\r\n keys.push(key);\r\n output.push(item);\r\n }\r\n });\r\n return output;\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .factory('authService', authService);\r\n function authService($rootScope, $window, $http, $location, $q, $route, $timeout, currentUser, broker, urlUtils, discountsService, criteoService, preferences, analytics, cookieService, dateUtil) {\r\n var _this = this;\r\n var domain = TRPCONFIG.Domain;\r\n var url = '/api2/useraccounts/';\r\n var preferencesUrl = '/api2/useraccounts/preferences/get';\r\n var bufferedRoute = {\r\n route: null,\r\n reload: false\r\n };\r\n var regPromise;\r\n var signInLevel = {\r\n None: 0,\r\n Soft: 1,\r\n Hard: 2\r\n };\r\n var skywardsResult;\r\n broker.subscribe('authService', 'bookingComplete', function () {\r\n $timeout(function () {\r\n var cu = currentUser.get();\r\n var userToExtend = {\r\n Agent: cu ? cu.Agent : null,\r\n AnonSignedIn: !!cu && cu.AnonSignedIn,\r\n BookingId: getSignedInBookingId()\r\n };\r\n _extendUser(userToExtend);\r\n }, 2000);\r\n });\r\n broker.subscribe('authService', 'agentSignIn', signOut);\r\n var service = {\r\n register: register,\r\n registerForNewsletter: registerForNewsletter,\r\n unsubscribeFromNewsletter: unsubscribeFromNewsletter,\r\n signin: signin,\r\n socialSignin: socialSignin,\r\n verify: verify,\r\n forgotPassword: forgotPassword,\r\n changeEmail: changeEmail,\r\n changePasswordWithToken: changePasswordWithToken,\r\n changePassword: changePassword,\r\n signOut: signOut,\r\n changeContactDetails: changeContactDetails,\r\n changeContactInfo: changeContactInfo,\r\n deleteAccount: deleteAccount,\r\n getUser: getUser,\r\n setUser: setUser,\r\n getUrl: getUrl,\r\n bufferRoute: bufferRoute,\r\n anonSignIn: anonSignIn,\r\n bookingSignInByAgent: bookingSignInByAgent,\r\n getNextRoute: getNextRoute,\r\n newsletterSignUp: newsletterSignUp,\r\n redirectToBufferedRoute: redirectToBufferedRoute,\r\n getSignedinBooking: getSignedinBooking,\r\n impersonatedSignIn: impersonatedSignIn,\r\n getUserByAgent: getUserByAgent,\r\n anyEndUser: anyEndUser,\r\n getSignedInBookingId: getSignedInBookingId,\r\n doesHttpOnlyCookieExist: doesHttpOnlyCookieExist,\r\n checkUserPreferences: checkUserPreferences,\r\n createCookieName: createCookieName,\r\n getSkywardsUserDetails: getSkywardsUserDetails,\r\n };\r\n function _postRequest(path, data, options) {\r\n if (data) {\r\n data.CultureCode = domain.CultureCode;\r\n data.TenantId = domain.TenantId;\r\n }\r\n return $http\r\n .post(url + path, data, options || {})\r\n .then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n function _extendUser(user) {\r\n return $http\r\n .get(url + \"getsignedinuser\")\r\n .then(function (res) {\r\n user.Provider = res.data.Identity.Provider;\r\n user.Email = res.data.Identity.Email;\r\n user.UserIdHash = res.data.Identity.UserIdHash;\r\n user.EmailHash = res.data.Identity.EmailHash;\r\n user.HardSignedIn = res.data.SigninLevel === signInLevel.Hard;\r\n user.SoftSignedIn = res.data.SigninLevel >= signInLevel.Soft;\r\n user.ImpersonatedSignedIn = !!res.data.Identity.IsImpersonated;\r\n user.SignedIn = user.HardSignedIn || user.SoftSignedIn || user.ImpersonatedSignedIn;\r\n //soft signed in - Contact.Email is not populated, but Identity.Email always is, so don't overwrite it\r\n if (res.data.Contact) {\r\n delete res.data.Contact.Email;\r\n }\r\n user = angular.extend(user, res.data.Contact);\r\n currentUser.set(user);\r\n broker.publish('userExtended', user);\r\n skywardsResult = res;\r\n if (!sessionStorage.getItem('skywardsLoginUser')) {\r\n sessionStorage.setItem('skywardsLoginUser', JSON.stringify(skywardsResult));\r\n }\r\n return user;\r\n });\r\n }\r\n function _updateUserFromResponse(user) {\r\n if (user != null) {\r\n user.Contact = user.Contact || {};\r\n var hard = user.SigninLevel === signInLevel.Hard;\r\n var soft = user.SigninLevel >= signInLevel.Soft;\r\n var existUser = currentUser.get();\r\n user.Contact = user.SigninLevel < signInLevel.Soft && !!existUser\r\n ? angular.extend(user.Contact, {\r\n AnonSignedIn: existUser.AnonSignedIn,\r\n Contact: existUser.Contact,\r\n BookingSummary: existUser.BookingSummary\r\n })\r\n : angular.extend(user.Contact, { AnonSignedIn: false });\r\n currentUser.set(angular.extend(user.Contact, {\r\n Provider: 'TRP',\r\n Agent: existUser ? existUser.Agent : null,\r\n Email: user.Identity.Email,\r\n UserIdHash: user.Identity.UserIdHash,\r\n EmailHash: user.Identity.EmailHash,\r\n HardSignedIn: hard,\r\n SoftSignedIn: soft,\r\n ImpersonatedSignedIn: !!user.Identity.IsImpersonated,\r\n SignedIn: hard || soft || !!user.Identity.IsImpersonated\r\n }));\r\n broker.publish('userExtended', user);\r\n preferences.clear();\r\n $rootScope.user = currentUser.get();\r\n $rootScope.$broadcast('auth:signin', user.Contact);\r\n }\r\n }\r\n function register(createRequest) {\r\n return regPromise || (regPromise = _postRequest('register', createRequest)\r\n .then(function (res) {\r\n regPromise = null;\r\n if (res.Result === 0) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n }));\r\n }\r\n function registerForNewsletter(createRequest) {\r\n if (createRequest) {\r\n createRequest.CultureCode = domain.CultureCode;\r\n createRequest.TenantId = domain.TenantId;\r\n createRequest.DomainId = domain.DomainId;\r\n }\r\n return $http.post(url + \"registerfornewsletter\", createRequest, { ignoreErrors: true });\r\n }\r\n function unsubscribeFromNewsletter(createRequest) {\r\n return $http.post(url + \"unsubscribe\", _.assignIn({}, createRequest, { DomainId: domain.DomainId }), {\r\n ignoreErrors: false\r\n });\r\n }\r\n function verify(verifyRequest) {\r\n return _postRequest('verify', verifyRequest).then(function (res) {\r\n if (res.Success) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n function afterPostSignin(res) {\r\n if (0 === res.Result) {\r\n if (currentUser.get() && currentUser.get().AnonSignedIn) {\r\n $http.post('/api2/managebooking/signout');\r\n }\r\n return discountsService.getDiscountCodeForUser().then(function () {\r\n _updateUserFromResponse(res.User);\r\n if ($location.search().cb) {\r\n // if cb starts with '?' redirect to homepage\r\n $location.url($location.search().cb.indexOf('?') ? $location.search().cb : '');\r\n }\r\n else {\r\n redirectToBufferedRoute();\r\n }\r\n criteoService.enqueue(currentUser.get(), 'signin');\r\n if (currentUser.get().Email) {\r\n analytics.setMixpanelEmail(currentUser.get().Email);\r\n }\r\n bufferedRoute.route = null;\r\n return res;\r\n });\r\n }\r\n return res;\r\n }\r\n function signin(signInRequest) {\r\n return _postRequest('signin', signInRequest)\r\n .then(afterPostSignin);\r\n }\r\n function socialSignin(signInRequest) {\r\n return _postRequest('externalsignin', signInRequest)\r\n .then(afterPostSignin);\r\n }\r\n function forgotPassword(req) {\r\n return _postRequest('initiatechangepassword', req);\r\n }\r\n function changeEmail(req) {\r\n return _postRequest('changeemail', req)\r\n .then(function (res) {\r\n if (res.Result === 0) {\r\n currentUser.set({ SignedIn: false });\r\n $rootScope.$broadcast('auth:signout');\r\n $location.path('changeemailsent');\r\n }\r\n return res;\r\n });\r\n }\r\n function changePasswordWithToken(req) {\r\n return _postRequest('changepasswordwithtoken', req)\r\n .then(function (res) {\r\n if (res.Result === 0) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n function clearAllBrowserSessions(e) {\r\n if (e.key === 'clear-sessions' && e.newValue === 'session-cleared') {\r\n _updateUserSignedOut();\r\n }\r\n }\r\n $window.addEventListener('storage', clearAllBrowserSessions);\r\n function changePassword(req) {\r\n return _postRequest('changepassword', req).then(function (res) {\r\n if (res.Result === 0) {\r\n localStorage.setItem('clear-sessions', 'session-cleared');\r\n _updateUserSignedOut();\r\n if ($route.current.requiresHardAuth || $route.current.requiresAnonAuth) {\r\n $location.path('/signin');\r\n }\r\n }\r\n return res;\r\n });\r\n }\r\n function signOut(req) {\r\n var promises = [];\r\n if (currentUser.get().SignedIn) {\r\n promises.push(_postRequest('signout', req));\r\n }\r\n if (currentUser.get().AnonSignedIn) {\r\n promises.push($http.post('/api2/managebooking/signout'));\r\n }\r\n if (currentUser.get().HardSignedIn) {\r\n closeSkywardsOktaSession();\r\n sessionStorage.removeItem('skywardsLoginUser');\r\n }\r\n return $q\r\n .all(promises)\r\n .then(function () {\r\n discountsService.validate(TRPCONFIG.DiscountCode);\r\n })\r\n .then(function () {\r\n _updateUserSignedOut();\r\n if ($route.current.requiresHardAuth || $route.current.requiresAnonAuth) {\r\n $location.path('');\r\n }\r\n });\r\n }\r\n function changeContactDetails(c) {\r\n return _postRequest('setcontact', c);\r\n }\r\n function changeContactInfo(c) {\r\n return _postRequest('setcontactinformation', c, { customErrCallback: function () { return true; } });\r\n }\r\n function getSkywardsUserDetails() {\r\n return skywardsResult;\r\n }\r\n function closeSkywardsOktaSession() {\r\n var url = TRPCONFIG.Domain.SkywardsOktaBaseUri + \"/api/v1/sessions/me\";\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('DELETE', url, true);\r\n xhr.withCredentials = true;\r\n xhr.send(null);\r\n }\r\n function _updateUserSignedOut() {\r\n currentUser.set(angular.extend({}, currentUser.get(), {\r\n SignedIn: false,\r\n AnonSignedIn: false,\r\n HardSignedIn: false,\r\n SoftSignedIn: false,\r\n ImpersonatedSignedIn: false,\r\n Contact: null\r\n }));\r\n preferences.clear();\r\n $rootScope.$broadcast('auth:signout');\r\n $rootScope.user = currentUser.get();\r\n var signedOut = localStorage.getItem('clear-sessions');\r\n if (signedOut === 'session-cleared') {\r\n $timeout(localStorage.removeItem('clear-sessions'), 500);\r\n }\r\n }\r\n function deleteAccount(req) {\r\n return _postRequest('delete', req)\r\n .then(function (res) {\r\n if (res.Success) {\r\n _updateUserSignedOut();\r\n $location.path('');\r\n }\r\n return res;\r\n });\r\n }\r\n function getUser() {\r\n return currentUser.get();\r\n }\r\n function setUser(user) {\r\n currentUser.set(user);\r\n if (user.SignedIn) {\r\n if (user.AnonSignedIn && user.SigninLevel >= signInLevel.Soft) {\r\n //Only if the user is not impersonated\r\n $http.post('/api2/managebooking/signout');\r\n }\r\n _extendUser(user);\r\n }\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n function bufferRoute(r, reload) {\r\n if (reload === void 0) { reload = false; }\r\n bufferedRoute.route = r;\r\n bufferedRoute.reload = reload;\r\n }\r\n function redirectToBufferedRoute() {\r\n var redirect = !!(bufferedRoute.route && bufferedRoute.route.indexOf('?'));\r\n if (redirect) {\r\n if (bufferedRoute.reload) {\r\n //Relaoding the location immediately after $location.path will fail in some browser.\r\n window.location.href = bufferedRoute.route;\r\n }\r\n else {\r\n var parsedUri = urlUtils.parse(bufferedRoute.route);\r\n $location.path(parsedUri && parsedUri.url).search(parsedUri.qs);\r\n }\r\n }\r\n return redirect;\r\n }\r\n function bookingSignInByAgent(bookingId) {\r\n return $http.post('api2/bookings/manage/signinByAgent', {\r\n BookingId: bookingId\r\n }).then(function (res) {\r\n return res;\r\n })\r\n .then(function (res) { return _signInResult(res); });\r\n }\r\n function anonSignIn(bookingRef, lastName) {\r\n var user = currentUser.get();\r\n return (user.SignedIn ?\r\n _postRequest('signout') :\r\n $q.when()).then(function () {\r\n return $http.post('/api2/bookings/manage/signinv2', {\r\n BookingRef: bookingRef,\r\n Surname: lastName,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }).then(function (res) { return _signInResult(res); });\r\n });\r\n }\r\n function _signInResult(res) {\r\n if (!res.data.Success) {\r\n return $q.when(false);\r\n }\r\n return getSignedinBooking().then(function (booking) {\r\n var user = angular.extend({}, currentUser.get(), {\r\n AnonSignedIn: res.data.Success,\r\n Contact: booking.Contact,\r\n BookingSummary: booking.Summary\r\n });\r\n setUser(user);\r\n if (user.AnonSignedIn) {\r\n analytics.track('mixpanel', 'UserSignedIn', {\r\n IdentityProvider: 'bookingLookup'\r\n });\r\n $rootScope.$broadcast('auth:signin', user);\r\n }\r\n return user.AnonSignedIn;\r\n });\r\n }\r\n function newsletterSignUp(userId, signupreason) {\r\n if (signupreason === void 0) { signupreason = 'Newsletter Signup'; }\r\n var data = {\r\n UserId: userId,\r\n Channel: 1,\r\n Status: 1,\r\n Source: 'TravelRepublic',\r\n Reason: signupreason,\r\n Date: (new Date()).toISOString()\r\n };\r\n return $http.post(url + \"Setcommunicationpreference\", data);\r\n }\r\n function getNextRoute() {\r\n return bufferedRoute.route || '';\r\n }\r\n function getSignedinBooking() {\r\n return $http.post('/api2/bookings/manage/getsignedinbookingcontact')\r\n .then(function (result) {\r\n return result && result.data ? result.data : null;\r\n });\r\n }\r\n function getHost() {\r\n return $location.host();\r\n }\r\n function getDomain() {\r\n var host = getHost();\r\n var cookieDomain;\r\n var domainParts;\r\n if (host.startsWith('pp2.')) {\r\n cookieDomain = host.replace('pp2.', '.pp2.');\r\n }\r\n else {\r\n domainParts = host.split('.');\r\n domainParts.shift();\r\n cookieDomain = \".\" + domainParts.join('.');\r\n }\r\n return cookieDomain;\r\n }\r\n function createCookieName() {\r\n var domainParts;\r\n var host = getHost();\r\n var devEnv = _.get(TRPCONFIG, 'Domain2.CookieEnv');\r\n domainParts = host.split('.');\r\n var match = domainParts.some(function (part) { return devEnv && devEnv.includes(part); });\r\n var devEnvStr = (match) ? 'DEV' : '';\r\n return devEnvStr + \".ASPXAUTH\";\r\n }\r\n var getUserPreferences = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var response, status;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, fetch(preferencesUrl)];\r\n case 1:\r\n response = _a.sent();\r\n status = response.status;\r\n if (status === 401 || status === 403) {\r\n return [2 /*return*/, status];\r\n }\r\n return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n function checkUserPreferences() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var enabled, getUserPrefResponse, user, signedIn;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n enabled = _.get(TRPCONFIG, 'Domain2.ClearUserPrefs');\r\n if (!enabled) {\r\n return [2 /*return*/];\r\n }\r\n user = getUser();\r\n signedIn = _.get(user, 'SignedIn');\r\n if (!signedIn) return [3 /*break*/, 2];\r\n return [4 /*yield*/, getUserPreferences()];\r\n case 1:\r\n getUserPrefResponse = _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n if (getUserPrefResponse && signedIn === true) {\r\n _updateUserSignedOut();\r\n $location.path('/signin');\r\n }\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function doesHttpOnlyCookieExist(cookiename) {\r\n var enabled = _.get(TRPCONFIG, 'Domain2.ClearUserPrefs');\r\n if (!enabled) {\r\n return;\r\n }\r\n var cookieDomain = getDomain();\r\n var duration = dateUtil.addDays(new Date(), 14);\r\n var expires = \"expires= + \" + duration;\r\n cookieService.set(cookiename, 1, expires, cookieDomain);\r\n var cookies = \"\" + document.cookie;\r\n var cookieASPXAUTH = cookieService.get(cookiename, cookies);\r\n var user = currentUser.get();\r\n var requiresHardAuth = _.get($route, 'current.requiresHardAuth');\r\n var requiresAnonAuth = _.get($route, 'current.requiresAnonAuth');\r\n if (cookieASPXAUTH !== null && _.get(user, 'SignedIn')) {\r\n _updateUserSignedOut();\r\n if (requiresHardAuth || requiresAnonAuth) {\r\n $location.path('/signin');\r\n }\r\n }\r\n }\r\n function impersonatedSignIn(userId) {\r\n return _postRequest('impersonatedsignin', { userId: userId })\r\n .then(function (res) {\r\n if (res.Success === false) {\r\n broker.publish('userDeimpersonated', null);\r\n }\r\n else {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n function getUserByAgent(userId) {\r\n return $http.get(url + \"getuserbyagent?request.userId=\" + userId, { ignoreErrors: true });\r\n }\r\n //True, if there is either Travel agent / Customer is selected\r\n function anyEndUser() {\r\n return TRPCONFIG.Domain.IsTravelAgentMode || (!!currentUser.get() && currentUser.get().ImpersonatedSignedIn);\r\n }\r\n function getSignedInBookingId() {\r\n var user = getUser();\r\n return user && user.AnonSignedIn ? (user.Contact ? user.Contact.BookingId : user.BookingId) : null;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var Booking;\r\n (function (Booking) {\r\n var BookingRequest = /** @class */ (function () {\r\n function BookingRequest(TripId, BookingProcessId, UserData, CultureCode, DomainId, ApplicationType, LinkedBookingId, TrackingTag, CheckLivePrices, BasketId) {\r\n this.TripId = TripId;\r\n this.BookingProcessId = BookingProcessId;\r\n this.UserData = UserData;\r\n this.CultureCode = CultureCode;\r\n this.DomainId = DomainId;\r\n this.ApplicationType = ApplicationType;\r\n this.LinkedBookingId = LinkedBookingId;\r\n this.TrackingTag = TrackingTag;\r\n this.CheckLivePrices = CheckLivePrices;\r\n this.BasketId = BasketId;\r\n }\r\n return BookingRequest;\r\n }());\r\n Booking.BookingRequest = BookingRequest;\r\n angular\r\n .module('core')\r\n .service('bookingService', bookingService);\r\n function bookingService($http, resourceService, basketStore, searchUnitService, $q, $location, $timeout, $interval, preferences, loggingService, urlUtils, $routeParams, localStorageProvider, $window, mandatoryTransferService, authService, $rootScope) {\r\n var url = '/api2/bookings/';\r\n var gmtUrl = '/api2/callmgmt/';\r\n var driverOptions = [\r\n { name: resourceService.getDeferred('NOTADRIVER'), value: Booking.DriverType.NotADriver },\r\n { name: resourceService.getDeferred('MAINDRIVER'), value: Booking.DriverType.MainDriver },\r\n { name: resourceService.getDeferred('ADDITIONALDRIVER'), value: Booking.DriverType.AdditionalDriver }\r\n ];\r\n var promise;\r\n var service = {\r\n driverOptions: driverOptions,\r\n trimBooking: trimBooking,\r\n prepareBooking: prepareBooking,\r\n getBooking: getBooking,\r\n updateBooking: updateBooking,\r\n book: book,\r\n getCpgStatus: getCpgStatus,\r\n getUrl: getUrl,\r\n getAdultTitles: getAdultTitles,\r\n copyFromContact: copyFromContact,\r\n detailsMatch: detailsMatch,\r\n clearContact: clearContact,\r\n clearGuests: clearGuests,\r\n checkValidEmail: checkValidEmail,\r\n updateDeposit: updateDeposit,\r\n paypalPostBooking: paypalPostBooking,\r\n getDiscountForCard: getDiscountForCard,\r\n getCardDiscountsForDomain: getCardDiscountsForDomain,\r\n setTrackingTag: setTrackingTag,\r\n getTrackingTag: getTrackingTag,\r\n pauseRecording: pauseRecording,\r\n resumeRecording: resumeRecording,\r\n browserDetails: browserDetails\r\n };\r\n function setTrackingTag(tag) {\r\n return localStorageProvider.setItem('trackingTag', tag);\r\n }\r\n function getTrackingTag(cb) {\r\n return localStorageProvider.getItem('trackingTag', function (error, value) { return cb(value); });\r\n }\r\n function removeTrackingTag() {\r\n return localStorageProvider.removeItem('trackingTag');\r\n }\r\n function _enhanceBooking(booking) {\r\n //this has to be done on the client because PayPalEnabled is dictated by whether or not cookies are enabled.\r\n booking.PaymentOptions = _.filter(booking.PaymentOptions, function (option) { return TRPCONFIG.PayPalEnabled || !option.IsPayPalPayment; });\r\n return $q.when(booking).then(setDashboardPreferences);\r\n }\r\n function setDashboardPreferences(booking) {\r\n if (!TRPCONFIG.Domain.DashboardSettingsEnabled) {\r\n return $q.when(booking);\r\n }\r\n return preferences.get('smokingRoom').then(function (smokingRoom) {\r\n return __assign({}, booking, { UserData: __assign({}, booking.UserData, { Rooms: booking.UserData.Rooms.map(function (room) {\r\n var _a = [1, 2], yes = _a[0], no = _a[1];\r\n var hasSpecialRequest = room.SpecialRequest === '' || room.SpecialRequest == null;\r\n var isSmokingRoomSet = smokingRoom === yes || smokingRoom === no;\r\n if (hasSpecialRequest && isSmokingRoomSet) {\r\n var smokingRequestResource = smokingRoom === yes\r\n ? 'SMOKINGROOMREQUEST'\r\n : 'NOSMOKINGROOMREQUEST';\r\n room.SpecialRequest = resourceService.getDeferred(smokingRequestResource)();\r\n }\r\n return room;\r\n }) }) });\r\n });\r\n }\r\n function paypalPostBooking(paypalResult) {\r\n if (TRPCONFIG.Domain.PaypalInContextEnabled) {\r\n var token = urlUtils.parse(paypalResult.AcsUrl).qs.token;\r\n $window.paypal.checkout.startFlow(token);\r\n }\r\n else {\r\n $window.location.href = paypalResult.AcsUrl;\r\n }\r\n }\r\n function trimBooking(booking) {\r\n var copy = _.cloneDeep(booking);\r\n return {\r\n UserData: copy.UserData,\r\n BookingProcessId: copy.BookingProcessId,\r\n LinkedBookingId: copy.LinkedBookingId\r\n };\r\n }\r\n function prepareBooking(basketId, bookingId, tripId, userData) {\r\n var req = {\r\n BookingProcessId: bookingId,\r\n BasketId: basketId,\r\n TripId: tripId,\r\n IsRebook: !!$routeParams.BookingRef,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n promise = $http.post('website/booking/preparebooking', req)\r\n .then(function (_a) {\r\n var booking = _a.data;\r\n return basketStore.applyCancelations(basketId, booking.BookingProcessId)\r\n .then(function () { return booking; });\r\n })\r\n .then(function (booking) {\r\n if (userData) {\r\n booking.UserData = userData;\r\n }\r\n return $q.all([\r\n basketStore.rules(basketId),\r\n basketStore.carHire(basketId),\r\n _enhanceBooking(_.cloneDeep(booking))\r\n ]);\r\n })\r\n .then(function (_a) {\r\n var rules = _a[0], carHire = _a[1], booking = _a[2];\r\n if (rules.captureFlight) {\r\n var mode = searchUnitService.transfer;\r\n booking.UserData.ConnectingFlight = {\r\n OutboundDate: searchUnitService.startDate(mode),\r\n InboundDate: searchUnitService.endDate(mode)\r\n };\r\n }\r\n if (TRPCONFIG.Domain.MandatoryExtrasEnabled) {\r\n var connectingFlight = booking.UserData.ConnectingFlight;\r\n var flightWithDetaild = mandatoryTransferService.addFlightDetails(connectingFlight);\r\n booking.UserData.ConnectingFlight = flightWithDetaild;\r\n }\r\n if (carHire) {\r\n booking.BookingRules.AdditionalDrivers = carHire.AdditionalDrivers;\r\n }\r\n if (rules.captureMainDriver) {\r\n var main_1 = false;\r\n var additional_1 = 0;\r\n var additionalDrivers_1 = booking.BookingRules.AdditionalDrives;\r\n booking.UserData.Rooms = booking.UserData.Rooms.map(function (room) { return (__assign({}, room, { Guests: room.Guests.map(function (guest) {\r\n if (!main_1 && guest.DriverType !== 1) {\r\n main_1 = true;\r\n guest.DriverType = 1;\r\n }\r\n else if (additional_1 < additionalDrivers_1 && guest.Type === 1) {\r\n guest.DriverType = 2;\r\n additional_1++;\r\n }\r\n return guest;\r\n }) })); });\r\n }\r\n service.updateBooking(booking);\r\n return booking;\r\n });\r\n return promise;\r\n }\r\n function checkValidEmail(email) {\r\n var domain = TRPCONFIG.Domain;\r\n return $http.post(url + \"validateemail\", {\r\n DomainId: domain.DomainId,\r\n CultureCode: domain.CultureCode,\r\n Email: email\r\n }).then(function (result) {\r\n if (result && result.data) {\r\n return $q.resolve();\r\n }\r\n return $q.reject();\r\n });\r\n }\r\n function getBooking(bookingId, tripId) {\r\n if (promise != null && !TRPCONFIG.Domain.isAgentMode) {\r\n return promise.then(_enhanceBooking);\r\n }\r\n promise = $http.get(\"website/booking/getbooking?\" + $.param({\r\n TripId: tripId,\r\n BookingProcessId: bookingId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n }), {\r\n customErrCallback: function (data) {\r\n if (data.status === 404) {\r\n loggingService.logError(\"Booking Already Done: booking.service: getbooking?\" + $.param({\r\n TripId: tripId, BookingProcessId: bookingId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n }) + \", DomainId:\" + TRPCONFIG.Domain.DomainId + \", href:\\\"\" + $location.absUrl());\r\n $location.path('bookingalreadydone');\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n }).then(function (result) {\r\n if (result) {\r\n return _enhanceBooking(_.cloneDeep(result.data));\r\n }\r\n promise = null;\r\n });\r\n return promise;\r\n }\r\n function updateBooking(booking, description) {\r\n var copy = _.cloneDeep(booking);\r\n //make sure that we are not sending card data when calling update booking\r\n _.get(copy, 'UserData.PaymentDetails.CardDetails') && delete copy.UserData.PaymentDetails.CardDetails;\r\n promise = $q.when(booking);\r\n return $http.post(url + \"updatebooking\", {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n BookingProcessId: booking.BookingProcessId,\r\n UserData: copy.UserData,\r\n Description: description\r\n }, { ignoreErrors: true }).then(function () { return promise != null ? promise : booking; }).then(function () {\r\n var cookieName = authService.createCookieName();\r\n if (cookieName) {\r\n authService.doesHttpOnlyCookieExist(cookieName);\r\n }\r\n });\r\n }\r\n function browserDetails() {\r\n var browserDetails = {\r\n ScreenHeight: window.screen.height,\r\n ScreenWidth: window.screen.width,\r\n ColorDepth: window.screen.colorDepth,\r\n AdditionalDetails: {\r\n ExtraData: [\r\n {\r\n Name: null,\r\n value: null\r\n }\r\n ]\r\n }\r\n };\r\n return browserDetails;\r\n }\r\n function book(booking, tripId, basketId) {\r\n var domain = TRPCONFIG.Domain;\r\n //enable timeouts only for desktop\r\n var isMobile = TRPCONFIG.IsMobileView;\r\n var checkLivePrice = domain.CheckLivePrices && !isMobile;\r\n var skywardsUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\r\n var skywardsLoyalityNumber = sessionStorage.getItem('SkywardsLoyalityNumber');\r\n return $q(function (res, rej) {\r\n service.getTrackingTag(function (value) {\r\n if (skywardsUser && skywardsUser.data && skywardsUser.data.Contact) {\r\n booking.UserData.Contact.LoyaltyNumber = skywardsUser.data.Contact.LoyaltyId;\r\n }\r\n else if (skywardsLoyalityNumber) {\r\n booking.UserData.Contact.LoyaltyNumber = skywardsLoyalityNumber;\r\n }\r\n booking.UserData['BrowserDetails'] = browserDetails();\r\n var req = new BookingRequest(tripId, booking.BookingProcessId, booking.UserData, domain.CultureCode, domain.DomainId, TRPCONFIG.ApplicationType, booking.LinkedBookingId, value, checkLivePrice, basketId);\r\n $http.post(url + \"createbooking\", req).then(function (result) {\r\n // Discard booking after creation if there are no messages and the status is complete\r\n if (result.data.Messages && result.data.Messages.length === 0 &&\r\n result.data.Status === Booking.CreateBookingStatus.Complete) {\r\n promise = null;\r\n removeTrackingTag();\r\n }\r\n res(result.data);\r\n });\r\n });\r\n });\r\n }\r\n function getCpgStatus(prePaymentId) {\r\n var pollDelayMs = TRPCONFIG.Domain.CpgStatusIntervalDelay;\r\n var stopApiMs = TRPCONFIG.Domain.CpgStatusTimeout;\r\n if (!prePaymentId) {\r\n return null;\r\n }\r\n var host = $location.host();\r\n var protocol = $location.protocol();\r\n var cpgstatusURL = protocol + \"://\" + host + \"/cpgstatus?prebookpaymentid=\" + prePaymentId;\r\n return $q(function (res, rej) {\r\n var interval = $interval(function () {\r\n $http.get(\"\" + cpgstatusURL).then(function (result) {\r\n var bookingPath = $location.path();\r\n if (result.data.Status === 'SUCCESS') {\r\n var cpgStatus = result.data.Status;\r\n var authCode = result.data && result.data.AuthCode;\r\n var paRes = cpgStatus === 'SUCCESS'\r\n ? \"^\" + authCode + \"^^^AUTHORISED\"\r\n : '';\r\n var response = {\r\n paRes: paRes,\r\n prePaymentId: prePaymentId,\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (bookingPath && !bookingPath.includes('book')) {\r\n console.log('cpgStatus cancelled');\r\n var response = {\r\n paRes: '',\r\n prePaymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result && result.status !== 200) {\r\n console.log('cpgStatus result.status', result.status);\r\n var response = {\r\n paRes: '',\r\n prePaymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result.data.Status === 'FAILED') {\r\n // payment failed so stop polling\r\n // Log an error?\r\n var error = 'FAILED';\r\n var response = {\r\n paRes: '',\r\n prePaymentId: '',\r\n error: error,\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result.data.Status === 'STOP') {\r\n // stop polling\r\n // Duplicate, log error\r\n console.log('stop polling');\r\n var response = {\r\n paRes: '',\r\n prePaymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n });\r\n }, pollDelayMs);\r\n $timeout(function () {\r\n $interval.cancel(interval);\r\n var error = 'TIMER';\r\n var response = {\r\n paRes: '',\r\n prePaymentId: '',\r\n error: error,\r\n };\r\n $rootScope.$broadcast('cpgStatusAPIError', response);\r\n }, stopApiMs);\r\n });\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n function _getTitleIndex(t) {\r\n if (!t) {\r\n return -1;\r\n }\r\n var clean = function (s) {\r\n return s.toLowerCase()\r\n .replace(/[.-/#!$%^&*;:{}=\\-_`~()]/g, '')\r\n .replace(/\\s{2,}/g, ' ');\r\n };\r\n var titlesString = clean(getAdultTitles()());\r\n var titleArray = titlesString.split(',');\r\n return titleArray\r\n .indexOf(clean(t));\r\n }\r\n function copyFromContact(booking, e) {\r\n var guest = _.get(booking, 'UserData.Rooms[0].Guests[0]');\r\n var contact = booking.UserData.Contact;\r\n var titles = getAdultTitles()();\r\n guest.FirstName = contact.FirstName;\r\n guest.LastName = contact.LastName;\r\n var index = _getTitleIndex(contact.Title);\r\n if (index !== -1) {\r\n guest.Title = titles.split(',')[index];\r\n }\r\n if (!!guest.FirstName && !!guest.LastName && index !== -1) {\r\n service.updateBooking(booking);\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n }\r\n }\r\n function getAdultTitles() {\r\n return resourceService.getDeferred('ADULTTITLES');\r\n }\r\n function detailsMatch(booking) {\r\n var guest = _.get(booking, 'UserData.Rooms[0].Guests[0]');\r\n var contact = booking.UserData.Contact;\r\n return (!contact.FirstName && !contact.LastName && !contact.Title)\r\n ? true\r\n : guest.FirstName === contact.FirstName &&\r\n guest.LastName === contact.LastName &&\r\n _getTitleIndex(contact.Title) === getAdultTitles()().split(',').indexOf(guest.Title);\r\n }\r\n function clearContact(userData) {\r\n document.querySelector('.contact-section.page-content-panel [name=\"contactForm\"] [name=\"LoyaltyNumber\"]')\r\n .removeAttribute('disabled');\r\n document.querySelectorAll('[name=\"passengers\"] .guest-panel [name=\"loyaltyNumber\"]')[0]\r\n .removeAttribute('disabled');\r\n document.querySelectorAll('[name=\"passengers\"] .guest-panel [name=\"loyaltyNumber\"]')[0].value = '';\r\n userData.Contact = {\r\n CountryCode: TRPCONFIG.Domain.CountryCode,\r\n Title: '',\r\n FirstName: '',\r\n LastName: '',\r\n MobileTel: '',\r\n HomeTel: '',\r\n };\r\n }\r\n function clearGuests(rooms) {\r\n _.forEach(rooms, function (room) {\r\n _.forEach(room.Guests, function (g) {\r\n g.Title = '';\r\n g.FirstName = '';\r\n g.LastName = '';\r\n g.DateOfBirth = '';\r\n g.LoyaltyNumber = '';\r\n });\r\n });\r\n }\r\n function updateDeposit(deposit, payment, totalCost, minDeposit) {\r\n $timeout(function () {\r\n if (deposit && deposit.$valid) {\r\n payment.PaymentAmount = parseFloat(deposit.$modelValue);\r\n return;\r\n }\r\n var errors = Object.keys(deposit.$error);\r\n if (errors.length === 1) {\r\n if (deposit.$error.maxValue) {\r\n payment.PaymentAmount = parseFloat(totalCost);\r\n return;\r\n }\r\n }\r\n payment.PaymentAmount = parseFloat(minDeposit);\r\n });\r\n }\r\n function getDiscountForCard(bookingId, cardNumber, domainId, cultureCode) {\r\n return $http.get(url + \"getdiscountforcard\", {\r\n params: {\r\n 'basketId': bookingId,\r\n 'cardNumber': cardNumber,\r\n 'domainId': domainId,\r\n 'cultureCode': cultureCode\r\n }\r\n }).then(function (result) {\r\n return result.data.DiscountDetails.Discount;\r\n });\r\n }\r\n function getCardDiscountsForDomain(domainId, cultureCode) {\r\n return $http.get(url + \"getcarddiscountsfordomain\", {\r\n params: {\r\n 'domainId': domainId,\r\n 'cultureCode': cultureCode\r\n },\r\n cache: true\r\n }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function pauseRecording(agentIpAddress) {\r\n return $http.post(gmtUrl + \"pauserecording\", {\r\n params: {\r\n 'AgentIpAddress': agentIpAddress\r\n }\r\n });\r\n }\r\n function resumeRecording(agentIpAddress) {\r\n return $http.post(gmtUrl + \"resumerecording\", {\r\n params: {\r\n 'AgentIpAddress': agentIpAddress\r\n }\r\n });\r\n }\r\n return service;\r\n }\r\n })(Booking = Core.Booking || (Core.Booking = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ManageBooking;\r\n (function (ManageBooking) {\r\n angular\r\n .module('core')\r\n .service('bookingsManagerService', BookingsManagerService);\r\n function BookingsManagerService($http, $q, $routeParams, dateUtil, imageService, destinationService) {\r\n var service = {\r\n getCurrentTripForUser: getCurrentTripForUser,\r\n getCancellationOptions: getCancellationOptions,\r\n getTrip: getTrip\r\n };\r\n var BookingTypePropertyMap;\r\n (function (BookingTypePropertyMap) {\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"FlightBooking\"] = 1] = \"FlightBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"AttractionsBooking\"] = 2] = \"AttractionsBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"CarHireBooking\"] = 4] = \"CarHireBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"HotelBooking\"] = 8] = \"HotelBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"AirportParkingBooking\"] = 16] = \"AirportParkingBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"TransferBooking\"] = 32] = \"TransferBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"InsuranceBooking\"] = 64] = \"InsuranceBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"MarhabaBooking\"] = 256] = \"MarhabaBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"BundleBooking\"] = 1024] = \"BundleBooking\";\r\n BookingTypePropertyMap[BookingTypePropertyMap[\"AdHocBooking\"] = 2048] = \"AdHocBooking\";\r\n })(BookingTypePropertyMap || (BookingTypePropertyMap = {}));\r\n function getCancellationOptions(bookingId) {\r\n var url = \"/api/bookings/cancellations/options?bookingId=\" + bookingId;\r\n return $http.get(url).then(function (response) { return response && response.data; });\r\n }\r\n function getCurrentTripForUser() {\r\n var url = \"/api/bookings/trips/current?culturecode=\" + TRPCONFIG.Domain.CultureCode;\r\n return $http.get(url).then(function (response) {\r\n if (response.status === 204) {\r\n // 'No content' - this is expected if there is no current trip!\r\n return null;\r\n }\r\n return _enrichBookedTrip(response.data);\r\n });\r\n }\r\n function getTrip(bookingId) {\r\n var url = \"/api/bookings/\" + bookingId + \"/trip?culturecode=\" + TRPCONFIG.Domain.CultureCode;\r\n return $http.get(url)\r\n .then(function (_a) {\r\n var data = _a.data;\r\n if ($routeParams.ref) {\r\n var refs_1 = $routeParams.ref.toUpperCase().split('|');\r\n data.Bookings = _.filter(data.Bookings, function (b) { return _.find(refs_1, function (r) { return r === b['BookingRef'].toUpperCase(); }); });\r\n }\r\n return _enrichBookedTrip(data);\r\n });\r\n }\r\n function _enrichBookedTrip(booking) {\r\n // Decorate trip with properties not returned by the API response\r\n var trip = new ManageBooking.BookedTrip();\r\n trip.StartDate = booking.StartDate;\r\n trip.EndDate = booking.EndDate;\r\n trip.Adults = booking.Adults;\r\n trip.Children = booking.Children;\r\n trip.Infants = booking.Infants;\r\n var startDate = dateUtil.parseDate(trip.StartDate);\r\n var endDate = dateUtil.parseDate(trip.EndDate);\r\n trip.Duration = dateUtil.getDifferenceInDays(startDate, endDate);\r\n trip.DaysUntilDeparture = dateUtil.getDifferenceInDays(new Date(), startDate);\r\n trip.DaysUntilReturn = dateUtil.getDifferenceInDays(new Date(), endDate);\r\n //payment bits\r\n _.each(booking.Bookings, function (b) {\r\n //set the currency code to be the same as the first bookings cleared payment currency\r\n //handle cases where agents skip a payment (no payment info)\r\n if (!trip.PaymentDetails.CurrencyCode) {\r\n var head = _.head(b.PaymentInfo.ClearedPayments);\r\n trip.PaymentDetails.CurrencyCode = head ? head.ClientCurrencyCode : '';\r\n }\r\n if (TRPCONFIG.Domain2.MonthlyPaymentsEnabled) {\r\n trip.PaymentDetails.Paid += _.reduce(b.PaymentInfo.ClearedPayments, function (r, p) {\r\n var isAmountSkipped = p.IsScheduledPayment && p.ClientCurrencyPaymentAmount < 0;\r\n return isAmountSkipped ? r : r + p.ClientCurrencyPaymentAmount;\r\n }, 0);\r\n }\r\n else {\r\n trip.PaymentDetails.Paid += _.reduce(b.PaymentInfo.ClearedPayments, function (r, p) { return r + p.ClientCurrencyPaymentAmount; }, 0);\r\n }\r\n _.each(b.PaymentInfo.FuturePayments, function (p) {\r\n var updateArray = function (arr, amount, due, currencyCode) {\r\n var item = _.find(arr, { 'Due': due, 'CurrencyCode': currencyCode });\r\n if (item) {\r\n item.Amount += amount;\r\n }\r\n else {\r\n arr.push({ Amount: amount, BookingType: b.BookingType, CurrencyCode: currencyCode, Due: due });\r\n }\r\n };\r\n trip.PaymentDetails.Total += p.ClientCurrencyPaymentAmount;\r\n updateArray(trip.PaymentDetails.Balances, p.ClientCurrencyPaymentAmount, p.PaymentDate, p.ClientCurrencyCode);\r\n });\r\n _.each(b.PaymentInfo.DirectPayments, function (p) {\r\n trip.PaymentDetails.PayDirect.push({ Amount: p.Amount,\r\n LocalAmount: p.LocalAmount,\r\n LocalCurrency: p.LocalCurrency,\r\n BookingType: b.BookingType\r\n });\r\n trip.PaymentDetails.Total += p.Amount;\r\n });\r\n delete b.PaymentInfo; //remove the payment info as we shouldn't need it going forward\r\n });\r\n trip.PaymentDetails.Total += trip.PaymentDetails.Paid; //set the total correctly\r\n trip.PaymentDetails.Outstanding = trip.PaymentDetails.Total - trip.PaymentDetails.Paid;\r\n trip.PaymentDetails.Balances = _.sortBy(trip.PaymentDetails.Balances, 'Due'); //tidy up\r\n //map our bookings array to our bookedTrip properties\r\n _mapBookingsArrayToProperties(trip, booking.Bookings);\r\n var mainBooking = (trip.FlightBooking || trip.HotelBooking);\r\n if (!mainBooking) {\r\n mainBooking = booking.Bookings[0];\r\n }\r\n trip.MainBookingId = mainBooking.BookingId;\r\n if (trip.DaysUntilDeparture > 0) {\r\n trip.TripStage = ManageBooking.TripStage.PreTrip;\r\n }\r\n else if (trip.DaysUntilReturn > 0) {\r\n trip.TripStage = ManageBooking.TripStage.OnTrip;\r\n }\r\n else {\r\n trip.TripStage = ManageBooking.TripStage.PostTrip;\r\n }\r\n // get destination based on either hotel OR flight destination airport\r\n var dest = null;\r\n if (trip.HotelBooking) {\r\n var b = trip.HotelBooking;\r\n // use Province OR first destination\r\n var dests = b.Hotel.Destinations;\r\n dest = _.find(dests, ['Type', Core.Destinations.DestinationType.Province])\r\n || dests[0];\r\n }\r\n else if (trip.FlightBooking) {\r\n // use destination of arrival airport\r\n dest = _.head(trip.FlightBooking.Legs).ArrivalAirport.Destination;\r\n }\r\n else if (trip.TransferBooking) {\r\n //we handle sorting out the destination info a little further down\r\n //look there\r\n }\r\n else if (trip.AttractionsBooking) {\r\n dest = _.head(trip.AttractionsBooking.Attractions).Destination;\r\n }\r\n var destPromise;\r\n if (dest) {\r\n trip.Destination = dest;\r\n trip.Destination.ImageUrl = imageService.getDestinationImage({ Id: dest.Id, Type: dest.Type });\r\n // Make an additional API call to get the destination landing page path\r\n destPromise = destinationService.getDetails(angular.copy(trip.Destination), ['PagePath']);\r\n }\r\n else {\r\n destPromise = $q.when();\r\n }\r\n //extend product infos\r\n if (trip.HotelBooking) {\r\n var b = trip.HotelBooking;\r\n trip.HotelBooking.Duration = dateUtil.dayDiff(b.CheckInDate, b.CheckOutDate);\r\n // get hotel image url\r\n var d = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n b.Hotel.ImageUrl = imageService.getMainImageUrl(b.Hotel.EstabId, d, d, true);\r\n }\r\n if (trip.FlightBooking) {\r\n _.each(trip.FlightBooking.Legs, function (l) {\r\n var start = dateUtil.parseDate(l.DepartureTime);\r\n var end = dateUtil.parseDate(l.ArrivalTime);\r\n l.DayDiff = dateUtil.getDifferenceInDays(start, end);\r\n });\r\n }\r\n if (trip.TransferBooking) {\r\n trip.TransferBooking.Legs = [];\r\n if (trip.TransferBooking.Outbound) {\r\n trip.TransferBooking.Legs.push(trip.TransferBooking.Outbound);\r\n }\r\n if (trip.TransferBooking.Return) {\r\n trip.TransferBooking.Legs.push(trip.TransferBooking.Return);\r\n }\r\n trip.TransferBooking.Title = trip.TransferBooking.Legs[0].Title;\r\n //a bit of a hack to use a default image for transfers\r\n if (!trip.Destination) {\r\n trip.Destination = {\r\n Id: 0,\r\n Type: Core.Destinations.DestinationType.Universal,\r\n Title: trip.TransferBooking.Legs[0].DropOffPoint,\r\n ImageUrl: '/build/img/backdrops/transfers-dec16.jpg'\r\n };\r\n }\r\n }\r\n return destPromise.then(function (response) {\r\n if (response && trip.Destination) {\r\n trip.Destination.PagePath = response.PagePath;\r\n }\r\n return trip;\r\n });\r\n }\r\n function _mapBookingsArrayToProperties(trip, bookings) {\r\n //go through the array setting our properties, currently we support only one of each product\r\n //type, this may change in future possibly\r\n _.each(bookings, function (b) {\r\n var property = BookingTypePropertyMap[b.BookingType];\r\n trip[property] = b;\r\n });\r\n }\r\n return service;\r\n }\r\n })(ManageBooking = Core.ManageBooking || (Core.ManageBooking = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CrossSellType = Core.Booking.CrossSellType;\r\n var BookingStatus;\r\n (function (BookingStatus) {\r\n BookingStatus[BookingStatus[\"Confirmed\"] = 1] = \"Confirmed\";\r\n BookingStatus[BookingStatus[\"Pending\"] = 2] = \"Pending\";\r\n BookingStatus[BookingStatus[\"Canceled\"] = 3] = \"Canceled\";\r\n })(BookingStatus || (BookingStatus = {}));\r\n ;\r\n // this enum used for mapping cross sells to priorities\r\n // (required because the API fails to define a ProductType for each cross sell)\r\n var productTypeByCrossSellKey;\r\n (function (productTypeByCrossSellKey) {\r\n productTypeByCrossSellKey[productTypeByCrossSellKey[\"Attractions\"] = 2] = \"Attractions\";\r\n productTypeByCrossSellKey[productTypeByCrossSellKey[\"Hotels\"] = 8] = \"Hotels\";\r\n productTypeByCrossSellKey[productTypeByCrossSellKey[\"CarHire\"] = 4] = \"CarHire\";\r\n productTypeByCrossSellKey[productTypeByCrossSellKey[\"Parking\"] = 16] = \"Parking\";\r\n productTypeByCrossSellKey[productTypeByCrossSellKey[\"Transfer\"] = 32] = \"Transfer\";\r\n })(productTypeByCrossSellKey = Core.productTypeByCrossSellKey || (Core.productTypeByCrossSellKey = {}));\r\n ;\r\n var crossSellTypeByCrossSellKey;\r\n (function (crossSellTypeByCrossSellKey) {\r\n crossSellTypeByCrossSellKey[crossSellTypeByCrossSellKey[\"Attractions\"] = 2] = \"Attractions\";\r\n crossSellTypeByCrossSellKey[crossSellTypeByCrossSellKey[\"Hotels\"] = 1] = \"Hotels\";\r\n crossSellTypeByCrossSellKey[crossSellTypeByCrossSellKey[\"CarHire\"] = 4] = \"CarHire\";\r\n crossSellTypeByCrossSellKey[crossSellTypeByCrossSellKey[\"Parking\"] = 7] = \"Parking\";\r\n crossSellTypeByCrossSellKey[crossSellTypeByCrossSellKey[\"Transfer\"] = 3] = \"Transfer\";\r\n })(crossSellTypeByCrossSellKey = Core.crossSellTypeByCrossSellKey || (Core.crossSellTypeByCrossSellKey = {}));\r\n ;\r\n var CrossSellCommonService = /** @class */ (function () {\r\n function CrossSellCommonService($http, $location, $window, searchUnitService, dateUtil, $q, occupancyService, $locale, currentUser) {\r\n this.$http = $http;\r\n this.$location = $location;\r\n this.$window = $window;\r\n this.searchUnitService = searchUnitService;\r\n this.dateUtil = dateUtil;\r\n this.$q = $q;\r\n this.occupancyService = occupancyService;\r\n this.$locale = $locale;\r\n this.currentUser = currentUser;\r\n this.baseUrl = '/api2/crosssell/';\r\n this.sourceId = 2010;\r\n this.crossSellsCache = {};\r\n this.productTypeProperties = {\r\n Attractions: {\r\n CrossSellType: crossSellTypeByCrossSellKey['Attractions'],\r\n ProductType: productTypeByCrossSellKey['Attractions'],\r\n Icon: 'icon-attractions',\r\n Code: 'ATTRACTIONS'\r\n },\r\n Hotels: {\r\n CrossSellType: crossSellTypeByCrossSellKey['Hotels'],\r\n ProductType: productTypeByCrossSellKey['Hotels'],\r\n Icon: 'icon-hotels',\r\n Code: 'HOTELS'\r\n },\r\n CarHire: {\r\n CrossSellType: crossSellTypeByCrossSellKey['CarHire'],\r\n ProductType: productTypeByCrossSellKey['CarHire'],\r\n Icon: 'icon-car-hire',\r\n Code: 'CARHIRE'\r\n },\r\n Parking: {\r\n CrossSellType: crossSellTypeByCrossSellKey['Parking'],\r\n ProductType: productTypeByCrossSellKey['Parking'],\r\n Icon: 'icon-parking',\r\n Code: 'PARKING'\r\n },\r\n Transfer: {\r\n CrossSellType: crossSellTypeByCrossSellKey['Transfer'],\r\n ProductType: productTypeByCrossSellKey['Transfer'],\r\n Icon: 'icon-transfers',\r\n Code: 'TRANSFERS'\r\n }\r\n };\r\n }\r\n CrossSellCommonService.prototype.getBookingCrossSell = function (bookingId) {\r\n var crossSellUrl = this.baseUrl + 'bookingcrosssell/';\r\n if (this.currentUser.get() && this.currentUser.get().AnonSignedIn) {\r\n crossSellUrl = this.baseUrl + 'bookingcrosssell/linked/';\r\n }\r\n return this.$http.get(crossSellUrl\r\n + this.sourceId + '/'\r\n + bookingId + '/'\r\n + TRPCONFIG.Domain.DomainId, { ignoreErrors: true }).catch(_.noop);\r\n };\r\n CrossSellCommonService.prototype._trackCrossSell = function (bookingId, productType) {\r\n return this.$http.get(this.baseUrl\r\n + 'trackcrosssell/'\r\n + this.sourceId + '/'\r\n + bookingId + '/'\r\n + TRPCONFIG.Domain.DomainId + '/'\r\n + productType, { ignoreErrors: true });\r\n };\r\n CrossSellCommonService.prototype.getBasketCrossSell = function (basketId) {\r\n return this.$http.get(this.baseUrl\r\n + 'basketcrosssells/'\r\n + TRPCONFIG.Domain.DomainId + '/'\r\n + TRPCONFIG.ApplicationType + '/'\r\n + basketId, { ignoreErrors: true }).then(function (res) {\r\n return res.data.Predictions;\r\n });\r\n };\r\n CrossSellCommonService.prototype.getTripCrossSell = function (tr, getBookingCrossSell) {\r\n var _this = this;\r\n var isCurrent = this.dateUtil.compareDates(tr.EndDate, this.dateUtil.todayPlus(-1, 0, true)) === 1;\r\n if (TRPCONFIG.Domain.DashboardCrossSellEnabled &&\r\n isCurrent &&\r\n tr.Bookings) {\r\n if (this.crossSellsCache[tr.TripId]) {\r\n return this.$q.when(this.crossSellsCache[tr.TripId]);\r\n }\r\n var booking = _.find(tr.Bookings, function (b) { return b.Status !== BookingStatus.Canceled; });\r\n if (booking && booking.BookingId && getBookingCrossSell) {\r\n return getBookingCrossSell(booking.BookingId).then(function (cs) {\r\n _this.crossSellsCache[tr.TripId] = cs;\r\n return cs;\r\n });\r\n }\r\n return this.$q.when();\r\n }\r\n return this.$q.when();\r\n };\r\n CrossSellCommonService.prototype.startCrossSellJourney = function (bookingId, crossSellProduct) {\r\n var _this = this;\r\n this._trackCrossSell(bookingId, crossSellProduct.ProductType);\r\n switch (crossSellProduct.CrossSellType) {\r\n case CrossSellType.Transfers:\r\n var direction;\r\n if (crossSellProduct.ReturnDate && crossSellProduct.ArrivalDate) {\r\n direction = 1;\r\n }\r\n else if (crossSellProduct.ArrivalDate) {\r\n direction = 2;\r\n }\r\n else if (crossSellProduct.ReturnDate) {\r\n direction = 3;\r\n }\r\n this.searchUnitService.setDirection(direction);\r\n var transferIndex = this.searchUnitService.transfer;\r\n this.searchUnitService.endDate(transferIndex, crossSellProduct.ReturnDate || null);\r\n this.searchUnitService.startDate(transferIndex, crossSellProduct.ArrivalDate || null);\r\n this.searchUnitService.setDestinationAirport({\r\n Title: crossSellProduct.AirportName,\r\n Code: crossSellProduct.AirportCode\r\n });\r\n this.searchUnitService.setResort({\r\n Type: 5,\r\n Code: crossSellProduct.ResortLocationId,\r\n Description: crossSellProduct.DestinationResort\r\n });\r\n this.occupancyService.setOccupancy([{\r\n Adults: crossSellProduct.Adults,\r\n ChildAges: crossSellProduct.ChildAges\r\n }]);\r\n this.$location.path('transfers').search('source', 'MYB cross-sell');\r\n break;\r\n case CrossSellType.CarHire:\r\n this.$window.location = TRPCONFIG.Domain.CarHireCrossSellUrl + '/book?' + $.param({\r\n pickupDateTime: crossSellProduct.PickUpDate,\r\n returnDateTime: crossSellProduct.DropOffDate,\r\n pickupIATACode: crossSellProduct.AirportCode,\r\n returnIATACode: crossSellProduct.AirportCode,\r\n age: crossSellProduct.DriverAge,\r\n residencyId: this.$locale.id.split('-')[1]\r\n });\r\n break;\r\n case CrossSellType.Attractions:\r\n this.$window.location = TRPCONFIG.DesktopUrlRoot\r\n + '/Attractions/ProductView.aspx?PIV='\r\n + crossSellProduct.ProductViewId;\r\n break;\r\n case CrossSellType.Hotels:\r\n var hotelIndex = this.searchUnitService.hotel;\r\n this.searchUnitService.endDate(hotelIndex, crossSellProduct.CheckOutDate || null);\r\n this.searchUnitService.startDate(hotelIndex, crossSellProduct.CheckInDate || null);\r\n //We should not go to the availability page directly, take the user to the landing page.\r\n this.$location.path(crossSellProduct.Url).search('source', 'MYB cross-sell');\r\n break;\r\n case CrossSellType.Parking:\r\n var promise = this.searchUnitService.getAirport(crossSellProduct.AirportCode);\r\n var parkingIndex = this.searchUnitService.parking;\r\n this.searchUnitService.startDate(parkingIndex, crossSellProduct.DepartureDate || null);\r\n this.searchUnitService.endDate(parkingIndex, crossSellProduct.ReturnDate || null);\r\n this.occupancyService.setPassengerCount(crossSellProduct.PassengerCount);\r\n promise.then(function (airport) {\r\n _this.searchUnitService.setDepartureAirports(airport);\r\n _this.$location.path('parking').search('source', 'MYB cross-sell');\r\n });\r\n }\r\n };\r\n return CrossSellCommonService;\r\n }());\r\n Core.CrossSellCommonService = CrossSellCommonService;\r\n angular\r\n .module('core')\r\n .service('crossSellCommonService', CrossSellCommonService);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Customer;\r\n (function (Customer) {\r\n var CrossSellType = Core.Booking.CrossSellType;\r\n var TripStage = Core.ManageBooking.TripStage;\r\n angular\r\n .module('core')\r\n .service('customerDashboardService', CustomerDashboardService);\r\n function CustomerDashboardService($http, $q, $interpolate, $rootScope, flightSearch, hotelService, imageService, destinationService, crossSellCommonService, flightExtrasService, bookingActionLink, hotelRehydrator, savedSearchService, searchTypesService, recentHotels, bookingsManagerService, analytics) {\r\n var service = {\r\n rehydrateHotelForHotelCard: rehydrateHotelForHotelCard,\r\n getRecentSearches: getRecentSearches,\r\n getLastViewedHotel: getLastViewedHotel,\r\n getAllCrossSellOptions: getAllCrossSellOptions,\r\n getTemplateForDashboard: getTemplateForDashboard,\r\n getTemplateForPlaceholder: getTemplateForPlaceholder,\r\n trackDashboardLoad: trackDashboardLoad,\r\n trackDashboardClick: trackDashboardClick,\r\n getDestinationExcludingSearch: getDestinationExcludingSearch\r\n };\r\n function getAllCrossSellOptions(bookingId) {\r\n var promises = [];\r\n promises.push(crossSellCommonService.getBookingCrossSell(bookingId));\r\n promises.push(flightExtrasService.getExtrasCrossSell(bookingId));\r\n var crossSellOptions = [];\r\n var hotelPromise = $q.when();\r\n return $q.all(promises).then(function (_a) {\r\n var crossSells = _a[0], flightExtras = _a[1];\r\n if (crossSells && crossSells.data) {\r\n _.forOwn(crossSells.data, function (product, key) {\r\n if (product && (key !== 'Priorities')) {\r\n // build cross sell option\r\n var type = Core.crossSellTypeByCrossSellKey[key], minPrice = 0, imageUrl = '', title = '';\r\n // this is the original product (required for onward journey to remain compatible with MYB)\r\n product.CrossSellType = type;\r\n if (type === CrossSellType.CarHire ||\r\n type === CrossSellType.Parking ||\r\n type === CrossSellType.Transfers) {\r\n // use cheapest option\r\n minPrice = _.minBy(product.CrossSells, function (cs) { return cs.Price.Value; }).Price.Value;\r\n }\r\n if (type === CrossSellType.Attractions) {\r\n // use first attraction option\r\n var cs = _.head(product.CrossSells);\r\n minPrice = cs.AdultPrice.Value;\r\n imageUrl = \"/attractions/Handlers/crosssellimage.ashx?acsid=\" + cs.Id;\r\n title = cs.Title;\r\n }\r\n if (type === CrossSellType.Hotels) {\r\n // use first hotel option\r\n var cs = _.head(product.CrossSells);\r\n // we need to get additional hotel info before we return the cross sells\r\n hotelPromise = rehydrateHotelForHotelCard(cs.EstabId);\r\n return; //we will add this in after the promise completes as it is a different structure\r\n }\r\n crossSellOptions.push(new Customer.CrossSellProductOption(bookingId, type, product.CrossSellType === CrossSellType.Transfers\r\n || product.CrossSellType === CrossSellType.Attractions, minPrice, imageUrl, product, title));\r\n }\r\n });\r\n // build cross sell options for flight extras\r\n _.forEach(flightExtras, function (extra) {\r\n crossSellOptions.push(new Customer.CrossSellFlightExtraOption(bookingId, extra.CrossSellType, true, extra.Price.Value, $interpolate(bookingActionLink.get()[extra.Name])(_.pick(extra, 'BookingId'))));\r\n });\r\n return hotelPromise.then(function (hotel) {\r\n if (hotel) {\r\n var product = crossSells.data.Hotels;\r\n var cs = _.find(product.CrossSells, { 'EstabId': hotel.Id });\r\n product.Url = cs.Url; // use hotel landing page Url\r\n crossSellOptions.push(new Customer.CrossSellHotelOption(bookingId, CrossSellType.Hotels, false, cs.Price.Value, '', product, hotel.Title, hotel));\r\n }\r\n return crossSellOptions;\r\n });\r\n }\r\n });\r\n }\r\n function getRecentSearches(max) {\r\n // Restrict search types to Hotels/Holidays/Flights\r\n var searchTypes = [\r\n searchTypesService.searchType.Flight,\r\n searchTypesService.searchType.Hotels,\r\n searchTypesService.searchType.Holidays\r\n ];\r\n return savedSearchService.getSavedSearches(searchTypes).then(function (searches) {\r\n return _.take(searches, max);\r\n });\r\n }\r\n function getLastViewedHotel() {\r\n return recentHotels.getIds().then(function (ids) {\r\n return ids.length > 0 ? rehydrateHotelForHotelCard(ids[0]) : $q.when();\r\n });\r\n }\r\n function rehydrateHotelForHotelCard(estabId) {\r\n return hotelRehydrator.hotels([estabId], {\r\n fields: [\r\n 'Id',\r\n 'Title',\r\n 'Province',\r\n 'Country',\r\n 'StarRating',\r\n 'CustomerRating',\r\n 'CustomerRatingTitle',\r\n 'CustomerRatingCount',\r\n 'Url',\r\n 'IndicativeMinPrice'\r\n ],\r\n imageWidth: TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize,\r\n imageHeight: TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize\r\n }).then(function (hotels) {\r\n return hotels[0];\r\n });\r\n }\r\n function getTemplateForDashboard(trip) {\r\n var templateSuffix = trip\r\n ? TripStage[trip.TripStage]\r\n : 'NoTrip';\r\n return \"partials/customer/CustomerDashboard\" + templateSuffix;\r\n }\r\n function getTemplateForPlaceholder(type) {\r\n return \"partials/customer/Placeholder\" + Customer.DashboardTileType[type];\r\n }\r\n function trackDashboardLoad(trip, tiles) {\r\n var tripData = trip\r\n ? {\r\n MainBookingId: trip.MainBookingId,\r\n TripStage: TripStage[trip.TripStage],\r\n HasFlight: trip.FlightBooking ? true : false,\r\n HasHotel: trip.HotelBooking ? true : false,\r\n HasTransfer: trip.TransferBooking ? true : false,\r\n HasCarHire: trip.CarHireBooking ? true : false,\r\n HasAttractions: trip.AttractionsBooking ? true : false,\r\n HasParking: trip.AirportParkingBooking ? true : false,\r\n HasInsurance: trip.InsuranceBooking ? true : false\r\n }\r\n : null;\r\n var data = {\r\n SignedIn: $rootScope.user.SignedIn,\r\n Trip: tripData,\r\n Tiles: _.mapValues(tiles, function (type) {\r\n return Customer.DashboardTileType[type];\r\n })\r\n };\r\n analytics.track('mixpanel', 'CustomerDashboardLoad', data);\r\n }\r\n function trackDashboardClick(position, type) {\r\n var data = {\r\n position: position,\r\n type: Customer.DashboardTileType[type]\r\n };\r\n analytics.track('mixpanel', 'CustomerDashboardClick', data);\r\n }\r\n function getDestinationExcludingSearch(search, destinations) {\r\n var searchDestination = _.get(search, 'DisplayDetails.Destinations[0]');\r\n if (!searchDestination && destinations) {\r\n return destinations[0];\r\n }\r\n // return the first destination which doesn't match the destination of the search\r\n return _.find(destinations, function (dest) {\r\n return dest.Id !== searchDestination.Id && dest.Type !== searchDestination.Type;\r\n });\r\n }\r\n return service;\r\n }\r\n })(Customer = Core.Customer || (Core.Customer = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n angular\r\n .module('core')\r\n .config(function ($provide, $httpProvider) {\r\n $provide.factory('domainIdHeaderInterceptor', function () { return ({\r\n request: function (config) {\r\n if (config && config.headers) {\r\n config.headers['x-domain-id'] = TRPCONFIG.Domain.DomainId;\r\n }\r\n return config;\r\n }\r\n }); });\r\n if ($httpProvider.interceptors.indexOf('domainIdHeaderInterceptor') < 0) {\r\n $httpProvider.interceptors.push('domainIdHeaderInterceptor');\r\n }\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n function fidParser($location) {\r\n return {\r\n parse: function () {\r\n var fid = $location.search().fid;\r\n if (!fid && (TRPCONFIG.Domain.UseIdBasedUrls)) {\r\n var path = ($location.path() || '').match(/(?:\\d+-\\d+-\\d+-)(\\d+)/);\r\n if (path && path[1]) {\r\n fid = path[1];\r\n }\r\n }\r\n fid = fid === '0' || fid === 0 ? null : fid;\r\n return fid == null ? null : _.toNumber(fid);\r\n }\r\n };\r\n }\r\n angular\r\n .module('core')\r\n .service('fidParser', fidParser);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var FieldType;\r\n (function (FieldType) {\r\n FieldType[FieldType[\"Global\"] = 0] = \"Global\";\r\n FieldType[FieldType[\"Titles\"] = 1] = \"Titles\";\r\n FieldType[FieldType[\"IndicativePrice\"] = 2] = \"IndicativePrice\";\r\n FieldType[FieldType[\"ReviewSnippets\"] = 3] = \"ReviewSnippets\";\r\n FieldType[FieldType[\"Description\"] = 4] = \"Description\";\r\n FieldType[FieldType[\"UrgencyMessaging\"] = 5] = \"UrgencyMessaging\";\r\n FieldType[FieldType[\"Url\"] = 6] = \"Url\";\r\n FieldType[FieldType[\"Summary\"] = 7] = \"Summary\";\r\n FieldType[FieldType[\"Characteristics\"] = 8] = \"Characteristics\";\r\n FieldType[FieldType[\"Distances\"] = 9] = \"Distances\";\r\n FieldType[FieldType[\"Facilities\"] = 10] = \"Facilities\";\r\n FieldType[FieldType[\"Destinations\"] = 11] = \"Destinations\";\r\n FieldType[FieldType[\"EstabGroupIds\"] = 12] = \"EstabGroupIds\";\r\n FieldType[FieldType[\"RoomNightsBooked\"] = 13] = \"RoomNightsBooked\";\r\n FieldType[FieldType[\"LegacyFacilities\"] = 14] = \"LegacyFacilities\";\r\n FieldType[FieldType[\"RoomDetails\"] = 15] = \"RoomDetails\";\r\n FieldType[FieldType[\"Pricing\"] = 16] = \"Pricing\";\r\n FieldType[FieldType[\"RoomAvailability\"] = 17] = \"RoomAvailability\";\r\n FieldType[FieldType[\"HolidayDeals\"] = 18] = \"HolidayDeals\";\r\n FieldType[FieldType[\"Airports\"] = 19] = \"Airports\";\r\n FieldType[FieldType[\"Weather\"] = 20] = \"Weather\";\r\n FieldType[FieldType[\"Recommendations\"] = 21] = \"Recommendations\";\r\n FieldType[FieldType[\"TransferTimes\"] = 22] = \"TransferTimes\";\r\n FieldType[FieldType[\"UserClicks\"] = 23] = \"UserClicks\";\r\n FieldType[FieldType[\"UserBookings\"] = 24] = \"UserBookings\";\r\n FieldType[FieldType[\"AltTitles\"] = 25] = \"AltTitles\";\r\n FieldType[FieldType[\"HotelDeals\"] = 26] = \"HotelDeals\";\r\n FieldType[FieldType[\"HotelAwards\"] = 27] = \"HotelAwards\";\r\n })(FieldType = Core.FieldType || (Core.FieldType = {}));\r\n ;\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .factory('funcUtil', funcUtil);\r\n function funcUtil($timeout, $q, $rootScope) {\r\n var service = {\r\n memoize: memoize,\r\n debounce: debounce,\r\n waitForValue: waitForValue,\r\n compose: compose\r\n };\r\n function has(obj, key) {\r\n return obj != null && obj.hasOwnProperty(key);\r\n }\r\n function memoize(func, hasher) {\r\n var m = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var key = args[0];\r\n var cache = m.cache;\r\n var address = \"\" + (hasher ? hasher.apply(void 0, args) : key);\r\n if (!has(cache, address)) {\r\n cache[address] = func.apply(void 0, args);\r\n }\r\n return cache[address];\r\n };\r\n m.cache = {};\r\n return m;\r\n }\r\n function compose() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n return function (x) {\r\n var retVal = x;\r\n for (var i = args.length - 1; i >= 0; i--) {\r\n retVal = args[i](retVal);\r\n }\r\n return retVal;\r\n };\r\n }\r\n /* This is a little bit tricksy in that you call debounce and it *returns* you the function\r\n that you want to debounce. */\r\n function debounce(fn, delay) {\r\n var timer;\r\n return function () {\r\n var _this = this;\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n if (timer != null) {\r\n $timeout.cancel(timer);\r\n }\r\n timer = $timeout(function () {\r\n fn.apply(_this, args);\r\n }, delay);\r\n };\r\n }\r\n function waitForValue(factory) {\r\n var initalValue = factory();\r\n if (initalValue) {\r\n return $q.when(initalValue);\r\n }\r\n var defered = $q.defer();\r\n var watch = $rootScope.$watch(factory, function (val) {\r\n if (val) {\r\n watch();\r\n defered.resolve(val);\r\n }\r\n });\r\n return defered.promise;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var Hotels;\r\n (function (Hotels) {\r\n /*\r\n Describes services for a single hotel e.g. hotel information and reviews\r\n */\r\n angular\r\n .module('core')\r\n .service('hotelService', hotelService);\r\n function hotelService(hotelFromSession, $filter, $http, $q, imageService, broker, $cacheFactory, tripService, $routeParams, fieldGroupService, cmsService) {\r\n var domain = TRPCONFIG.Domain;\r\n var url = '/api/hotels/';\r\n var hotelInfoCache = $cacheFactory('hotelInfoCache');\r\n var promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n var service = {\r\n getUrl: getUrl,\r\n getHotelDetails: getHotelDetails,\r\n //This is used to rehydrate the basket's hotel product\r\n rehydrate: rehydrate,\r\n getHotel: getHotel,\r\n trackHotelClick: trackHotelClick,\r\n getPaginationMode: getPaginationMode,\r\n getSimilarHotels: getSimilarHotels\r\n };\r\n var fieldFlags = fieldGroupService.getFieldGroup(Core.FieldType.Global, Core.FieldType.Titles, Core.FieldType.IndicativePrice, Core.FieldType.ReviewSnippets, Core.FieldType.Description, Core.FieldType.Url, Core.FieldType.Summary, Core.FieldType.Characteristics, Core.FieldType.Distances, Core.FieldType.Facilities, Core.FieldType.RoomDetails, Core.FieldType.LegacyFacilities, Core.FieldType.Recommendations, Core.FieldType.EstabGroupIds, Core.FieldType.Airports, Core.FieldType.AltTitles, Core.FieldType.HotelAwards);\r\n var fieldTypes = fieldGroupService.getFieldGroup(Core.FieldType.Global, Core.FieldType.Titles, Core.FieldType.Url, Core.FieldType.EstabGroupIds);\r\n function getUrl() {\r\n return url;\r\n }\r\n function getHotelDetails(req) {\r\n return $http.post(url + 'details/getdetails', req, {\r\n customErrCallback: function () {\r\n broker.publish('hotelDetailCallFailed', req);\r\n return true;\r\n }\r\n }).then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n function rehydrate(detailsId) {\r\n if (!promiseCache.get(detailsId)) {\r\n promiseCache.put(detailsId, $http.post(url + 'details/getdetailsbyid', { DetailsId: detailsId })\r\n .then(function (res) {\r\n return service.getHotel(null, res.data.Itinerary.EstabId, $routeParams.tripId)\r\n .then(function (h) {\r\n return angular.extend({}, h, res.data);\r\n });\r\n }));\r\n }\r\n return promiseCache.get(detailsId);\r\n }\r\n function getHotel(searchId, estabId, tripId) {\r\n var promises = [];\r\n if (searchId && tripId) {\r\n promises.push(hotelFromSession.getHotel(searchId, estabId, tripId));\r\n }\r\n else {\r\n promises.push(hotelInfoCache.get(String(estabId)) ||\r\n $http.get(url + 'static/gethotel', {\r\n params: {\r\n fieldsX: 'MinCost,OriginalCost',\r\n Id: estabId,\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId,\r\n FieldFlags: fieldFlags\r\n },\r\n cache: true\r\n }));\r\n }\r\n promises.push(tripId ? tripService.getCurrency(tripId) : $q.when());\r\n if (TRPCONFIG.Domain.OverrideHotelInformationFromCms) {\r\n promises.push(cmsService.getHotelInformation(estabId));\r\n }\r\n return $q.all(promises)\r\n .then(function (results) {\r\n var hotel = _.assign({}, results[0].data || results[0]);\r\n var currency = results[1] || TRPCONFIG.Domain.CurrencyCode;\r\n var cmsHotelInformation = results[2];\r\n hotelInfoCache.put(String(estabId), hotel);\r\n hotel.ImageUrl = imageService.getMainImageUrl(estabId, TRPCONFIG.DeviceSettings.HotelDetailImageSize, TRPCONFIG.DeviceSettings.HotelDetailImageSize, true);\r\n hotel.ObjectTypeId = 1;\r\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice, currency);\r\n hotel.HasReviewSnippets = !_.isEmpty(hotel.ReviewSnippets);\r\n if (cmsHotelInformation) {\r\n hotel.HotelName = cmsHotelInformation.HotelName;\r\n hotel.Address = cmsHotelInformation.Address;\r\n var imageList = _.get(cmsHotelInformation, 'ImageUrls', []);\r\n if (imageList && imageList.length > 0) {\r\n imageList = imageList.filter(function (e) {\r\n if (e != null) {\r\n return e;\r\n }\r\n });\r\n }\r\n hotel.CmsImageUrls = imageList && imageList.length > 0 ? imageList : null;\r\n hotel.Description = cmsHotelInformation.ReplaceDefaultDescription ?\r\n cmsHotelInformation.Description :\r\n hotel.Description + cmsHotelInformation.Description;\r\n hotel.IsPlatinumHotel = cmsHotelInformation.IsPlatinumHotel;\r\n hotel.HideFacilitiesList = cmsHotelInformation.HideFacilitiesList;\r\n hotel.HideRoomFacilitiesList = cmsHotelInformation.HideRoomFacilitiesList;\r\n hotel.IsBoutiqueHotel = cmsHotelInformation.IsBoutiqueHotel;\r\n hotel.IsDsfHotel = cmsHotelInformation.IsDsfHotel;\r\n }\r\n //various other bits of code assume that the rooms array will always exist\r\n if (hotel.Rooms == null) {\r\n hotel.Rooms = [];\r\n }\r\n return hotel;\r\n });\r\n }\r\n function trackHotelClick(estabId, hotelIndex, boostReason, sortCriterion, searchId) {\r\n $http.post('/api/useractions/selections', {\r\n Type: 2,\r\n EstabId: estabId,\r\n DomainId: _.get(TRPCONFIG, 'Domain.DomainId'),\r\n SearchResultsIndex: hotelIndex,\r\n SortCriterion: sortCriterion,\r\n BoostReason: boostReason,\r\n SearchId: searchId\r\n }, { ignoreErrors: true });\r\n }\r\n function getSimilarHotels(estabId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var config, response, data;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n config = {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n EstabId: estabId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Radius: 10,\r\n ResultsToTakeFromNearestHotels: 3,\r\n ResultsToTakeFromSeoRanking: 3,\r\n FieldFlags: fieldTypes,\r\n FilterCriteria: {\r\n Stars: [3, 4, 5],\r\n MinNumberOfRatings: 1,\r\n OnlyShowAvailable: true\r\n },\r\n PageStrand: 1\r\n })\r\n };\r\n return [4 /*yield*/, fetch('/api/hotels/static/gethotelalternatives', config)];\r\n case 1:\r\n response = _a.sent();\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n return [4 /*yield*/, response.json()];\r\n case 2:\r\n data = _a.sent();\r\n return [2 /*return*/, data || []];\r\n }\r\n });\r\n });\r\n }\r\n function getPaginationMode(destinationId) {\r\n if (domain.PagingDisabled) {\r\n return domain.PagingDisabledForDestinations.find(function (id) { return id === destinationId; });\r\n }\r\n return false;\r\n }\r\n return service;\r\n }\r\n })(Hotels = Core.Hotels || (Core.Hotels = {}));\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Hotels;\r\n (function (Hotels) {\r\n angular.module('core')\r\n .service('hotelFromSession', hotelFromSession);\r\n /*\r\n This exists to retrieve a single hotel's availability results from the cache.\r\n It is used by the map directive for showing information windows and is also used\r\n by the hotel page when in search mode. Calls are cached for the duration of a user's\r\n session\r\n */\r\n function hotelFromSession($filter, $location, $http, $cacheFactory, $q, imageService, $injector, $timeout, tripService, fieldGroupService, loggingService, occupancyService) {\r\n var cache = $cacheFactory('hotelfromSessionCache');\r\n var service = {\r\n getHotel: getHotel,\r\n getRoomTypes: getRoomTypes\r\n };\r\n var fieldFlags = fieldGroupService.getFieldGroup(Core.FieldType.Global, Core.FieldType.Titles, Core.FieldType.IndicativePrice, Core.FieldType.ReviewSnippets, Core.FieldType.Description, Core.FieldType.Url, Core.FieldType.Summary, Core.FieldType.Characteristics, Core.FieldType.Distances, Core.FieldType.Facilities, Core.FieldType.LegacyFacilities, Core.FieldType.RoomDetails, Core.FieldType.Pricing, Core.FieldType.RoomAvailability, Core.FieldType.Recommendations, Core.FieldType.EstabGroupIds, Core.FieldType.Airports, Core.FieldType.HotelAwards);\r\n function getSkywardsTier() {\r\n var SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\r\n var Tier = (SkywardsLoginUser && SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\r\n SkywardsLoginUser.data.Contact.Tier : null;\r\n return Tier;\r\n }\r\n function getHotel(searchId, estabId, tripId) {\r\n return _getHotelFromSession(searchId, estabId, tripId);\r\n }\r\n function getRoomTypes(estabId, searchId, boardTypeFilter) {\r\n var url = '/api/hotels/availability/gethotel';\r\n var flags = fieldGroupService.getFieldGroup(Core.FieldType.RoomAvailability, Core.FieldType.RoomDetails, Core.FieldType.LegacyFacilities);\r\n var request = {\r\n Id: estabId,\r\n AvailabilitySearchId: searchId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FieldFlags: flags\r\n };\r\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\r\n request.LoyaltyInfo = {\r\n SkywardsTier: getSkywardsTier()\r\n };\r\n }\r\n return $http.post(url, request)\r\n .then(function (res) { return res.data; })\r\n .then(function (res) {\r\n if (!res || !res.RequestedRooms) {\r\n return [];\r\n }\r\n return res.RequestedRooms[0].Availability.map(function (r) {\r\n _.assignIn(r, {\r\n RoomDetails: _.find(res.RoomDetails, function (rd) { return rd.MasterId === r.MasterId; })\r\n });\r\n var uniqBoardTypes = {};\r\n r.BoardOptions.forEach(function (bt) {\r\n var current = uniqBoardTypes[bt.BoardType];\r\n // is the unique cheapest boardType\r\n // is in the filtered boardtypes if defined\r\n if ((!current || current.Cost > bt.Cost) &&\r\n (!boardTypeFilter.length || boardTypeFilter.indexOf(bt.BoardType) > -1)) {\r\n uniqBoardTypes[bt.BoardType] = bt;\r\n }\r\n });\r\n r.BoardOptions = _.values(uniqBoardTypes);\r\n return r;\r\n }).filter(function (r) { return r.BoardOptions.length > 0; });\r\n });\r\n }\r\n function _createCacheKey(_a) {\r\n var DiscountCode = _a.DiscountCode, Id = _a.Id, AvailabilitySearchId = _a.AvailabilitySearchId, BoardTypesFilter = _a.BoardTypesFilter;\r\n return DiscountCode + \",\" + Id + \", \" + AvailabilitySearchId + \", \" + BoardTypesFilter.sort().join('');\r\n }\r\n function _getHotelFromSession(searchId, estabId, tripId) {\r\n var hs = $injector.get('hotelSearch'); //this is absolutely fine. Not dodgy at all.\r\n var url = '/api/hotels/availability/gethotel';\r\n var request = {\r\n Id: estabId,\r\n AvailabilitySearchId: searchId,\r\n CultureCode: TRPCONFIG.Domain.OverrideAPIHotelsCulture ?\r\n TRPCONFIG.Domain.DefaultPosCultureCode : TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n BoardTypesFilter: hs.getFilter().BoardTypes,\r\n FieldFlags: fieldFlags,\r\n DiscountCode: TRPCONFIG.DiscountCode,\r\n TripId: tripId\r\n };\r\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\r\n request.LoyaltyInfo = {\r\n SkywardsTier: getSkywardsTier()\r\n };\r\n }\r\n var cacheKey = _createCacheKey(request);\r\n var cachedHotel = cache.get(cacheKey);\r\n if (cachedHotel && TRPCONFIG.Domain.DefaultHotelDates) {\r\n return $q.when(cachedHotel);\r\n }\r\n else {\r\n // Updated AvailabilitySearchID after adjust Dates (Nights Allocation)\r\n tripService.getTrip(tripId).then(function (trip) {\r\n trip && trip.HotelsRequest ? request.AvailabilitySearchId =\r\n trip.HotelsRequest.AvailabilitySearchId : '';\r\n });\r\n }\r\n var d = $q.defer();\r\n var start = new Date().getTime();\r\n var interval = 1000;\r\n var timeout = 60000;\r\n var goneResponses = 0;\r\n return $q.all([\r\n tripService.getCurrency(tripId),\r\n tripService.getHotelsRequestNumberOfNights(tripId),\r\n tripService.getTripOccupancy(tripId),\r\n tripService.isKidsFree(tripId)\r\n ]).then(function (_a) {\r\n var c = _a[0], n = _a[1], o = _a[2], k = _a[3];\r\n request.CurrencyCode = c || TRPCONFIG.Domain.CurrencyCode;\r\n $http.get('/api/hotels/boardtypes/inclusions').then(function (res) {\r\n sessionStorage.setItem('incExcList', JSON.stringify(res.data));\r\n getResult(c, n, o, k);\r\n }, function (err) {\r\n sessionStorage.setItem('incExcList', JSON.stringify([]));\r\n getResult(c, n, o, k);\r\n });\r\n $http.get('/api/hotels/boardtypes/get').then(function (res) {\r\n var formatedData = [];\r\n for (var i = 0; i < res.data.length; i++) {\r\n var data = res.data[i];\r\n var title = res.data[i].Title;\r\n if (title) {\r\n data.Title = title.toLowerCase();\r\n formatedData.push(data);\r\n }\r\n }\r\n sessionStorage.setItem('boardList', JSON.stringify(formatedData));\r\n TRPCONFIG.Domain.BoardTypes = JSON.stringify(formatedData);\r\n }, function (err) {\r\n sessionStorage.setItem('boardList', JSON.stringify([]));\r\n });\r\n return d.promise;\r\n });\r\n function getResult(currency, nights, occupancy, isKidsFree) {\r\n if (isKidsFree === void 0) { isKidsFree = false; }\r\n $http.post(url, request, { ignoreErrors: true })\r\n .then(_processHotelFactory(d, estabId, cacheKey, currency, nights, occupancy, isKidsFree), _handleErrors);\r\n }\r\n function _handleErrors(res) {\r\n switch (res.status) {\r\n case 404:\r\n return _notFound();\r\n case 410:\r\n return _gone();\r\n }\r\n return $q.when();\r\n }\r\n function logMissing(code) {\r\n tripService.getHotelsRequest(tripId).then(function (req) {\r\n loggingService.logWarn(code + \" received getting hotel from session for request:\\n \" + (req ? JSON.stringify(req) : null));\r\n });\r\n }\r\n function _notFound() {\r\n var now = new Date().getTime();\r\n if (now - start < timeout) {\r\n $timeout(getResult, interval); //recurse\r\n return $q.reject();\r\n }\r\n //resolve even in case of no results!\r\n logMissing('404');\r\n return d.resolve();\r\n }\r\n function _gone() {\r\n if (goneResponses === 0) {\r\n goneResponses += 1;\r\n $timeout(getResult, interval); //recurse\r\n return $q.reject();\r\n }\r\n logMissing('410');\r\n d.reject();\r\n $location.path('hotels/notfound');\r\n }\r\n }\r\n function _processHotelFactory(d, estabId, cacheKey, currency, nights, occupancy, isKidsFree) {\r\n if (isKidsFree === void 0) { isKidsFree = false; }\r\n return function (result) {\r\n var hotel;\r\n if (result.data != null) {\r\n var dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n var numPeoplePaying = isKidsFree\r\n ? occupancyService.getOnlyPayingIndividuals()\r\n : occupancyService.getNumberOfNonInfantPassengers();\r\n hotel = _formatHotelData(result.data, occupancy);\r\n hotel.ImageUrl = imageService.getMainImageUrl(estabId, dim, dim);\r\n hotel.MinCostStr = $filter('roundedCurrency')(hotel.MinCost, currency);\r\n hotel.OriginalCostStr = $filter('roundedCurrency')(hotel.OriginalCost, currency);\r\n hotel.MinCostPerNight = hotel.MinCost / nights;\r\n hotel.MinCostPerPerson = hotel.MinCost / (numPeoplePaying || 1);\r\n hotel.MinCostPerPersonPerNight = hotel.MinCostPerPerson / nights;\r\n hotel.OriginalCostPerNight = hotel.OriginalCost / nights;\r\n hotel.OriginalCostPerPerson = hotel.OriginalCost / (numPeoplePaying || 1);\r\n hotel.OriginalCostPerPersonPerNight = hotel.OriginalCostPerPerson / nights;\r\n hotel.MinCostStr =\r\n $filter('roundedCurrency')(hotel.MinCost, currency);\r\n hotel.MinCostPerNightStr =\r\n $filter('roundedCurrency')(hotel.MinCostPerNight, currency);\r\n hotel.MinCostPerPersonPerNightStr =\r\n $filter('roundedCurrency')(hotel.MinCostPerPersonPerNight, currency);\r\n hotel.OriginalCostStr =\r\n $filter('roundedCurrency')(hotel.OriginalCost, currency);\r\n hotel.OriginalCostPerNightStr =\r\n $filter('roundedCurrency')(hotel.OriginalCostPerNight, currency);\r\n hotel.OriginalCostPerPersonPerNightStr =\r\n $filter('roundedCurrency')(hotel.OriginalCostPerPersonPerNight, currency);\r\n hotel.LowDepositValue = 0;\r\n hotel.IsPayAtHotelOnly = true;\r\n hotel.Rooms.filter(function (rr) { return !_.isEmpty(rr.Availability); })\r\n .forEach(function (rr, i) {\r\n var minRoomDeposit = 0;\r\n var cheapest;\r\n _.forEach(rr.Availability, function (room) {\r\n room.CostPerNight = room.Cost / nights;\r\n room.OriginalCostPerNight = room.OriginalCost / nights;\r\n if (hotel.IsPayAtHotelOnly && room.IsPayAtHotel === false) {\r\n hotel.IsPayAtHotelOnly = false;\r\n }\r\n if (room.LowDepositValue\r\n && (!minRoomDeposit || room.LowDepositValue < minRoomDeposit)) {\r\n minRoomDeposit = room.LowDepositValue;\r\n }\r\n if (!cheapest || cheapest.Cost > room.Cost) {\r\n cheapest = room;\r\n }\r\n });\r\n if (cheapest !== undefined) {\r\n cheapest.IsCheapest = true;\r\n }\r\n if (minRoomDeposit) {\r\n hotel.LowDepositValue = hotel.LowDepositValue + minRoomDeposit;\r\n }\r\n });\r\n cache.put(cacheKey, hotel);\r\n d.resolve(hotel);\r\n return hotel;\r\n }\r\n d.resolve();\r\n return null;\r\n };\r\n }\r\n function _formatHotelData(data, occupancy) {\r\n // Convert room data in response to flat list\r\n var hotel = _.assign({}, data);\r\n var incExcList = JSON.parse(sessionStorage.getItem('incExcList') || '[]');\r\n hotel.Rooms = _.map(data.RequestedRooms, function (rr, i) {\r\n var availableRoomsList = [];\r\n function boardOptionMapping(option, incExcList) {\r\n option.map(function (boardOption) {\r\n var item = incExcList\r\n .find(function (item) {\r\n if (item.Id === boardOption.InclusionId) {\r\n boardOption.Title =\r\n item.Title.replace('{0}', boardOption.ReplacementText || '');\r\n }\r\n });\r\n return boardOption;\r\n });\r\n }\r\n rr.Availability.forEach(function (room) {\r\n room.BoardOptions.forEach(function (option) {\r\n if (incExcList && incExcList.length > 0) {\r\n if (option.BTInclusions && option.BTInclusions.length > 0) {\r\n boardOptionMapping(option.BTInclusions, incExcList);\r\n }\r\n if (option.BTExclusions && option.BTExclusions.length > 0) {\r\n boardOptionMapping(option.BTExclusions, incExcList);\r\n }\r\n }\r\n var ra = _.omit(room, 'BoardOption');\r\n availableRoomsList.push(_.assign({}, option, ra));\r\n });\r\n });\r\n return {\r\n Title: occupancyService.getOccupancyStringForRoom(i, occupancy),\r\n Availability: availableRoomsList\r\n };\r\n });\r\n return hotel;\r\n }\r\n return service;\r\n }\r\n })(Hotels = Core.Hotels || (Core.Hotels = {}));\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .factory('paymentsService', PaymentsService);\r\n function PaymentsService($http, $q, $routeParams, tokeniser, tripService) {\r\n var _clientServerCardsMap = {};\r\n var _cardsUrl = '/api2/payments/cards';\r\n var _userCardUrl = '/api2/payments/cards/customer/';\r\n var _enbdCardUrl = '/api2/bookings/';\r\n var payPalResponses = {\r\n cancel: 'PAYPALCANCELLED',\r\n fail: 'PAYPALFAILED'\r\n };\r\n var enbdOptionId = TRPCONFIG.Domain2.EnbdPaymentOptionId;\r\n var service = {\r\n checkCardNumber: checkCardNumber,\r\n checkCardNumberV2: checkCardNumberV2,\r\n getScheme: getScheme,\r\n getCardFromId: getCardFromId,\r\n getCardTitle: getCardTitle,\r\n getLogosList: getLogosList,\r\n addCardDetails: addCardDetails,\r\n removeCard: removeCard,\r\n generateTokens: generateTokens,\r\n getSavedBookingCards: getSavedBookingCards,\r\n getEmptyPaymentDetails: getEmptyPaymentDetails,\r\n getPayPalResponseMessage: getPayPalResponseMessage,\r\n cpgValidation: cpgValidation,\r\n resendOtpConfirmation: resendOtpConfirmation,\r\n verifyOtp: verifyOtp\r\n };\r\n function getCardFromId(paymentOptions, cardId) {\r\n for (var i = 0, ii = paymentOptions.length; i < ii; i++) {\r\n //CardTypeId has been renamed to Id in new API.\r\n if (paymentOptions[i].CardTypeId === cardId || paymentOptions[i].Id === cardId) {\r\n return paymentOptions[i];\r\n }\r\n }\r\n }\r\n function getScheme(cardNumber) {\r\n return $http.get(_cardsUrl + \"/getscheme?cardNumber=\" + cardNumber, { cache: true, ignoreErrors: true });\r\n }\r\n function getLogosList(paymentOptions) {\r\n //Removing getpaymentoptions as it became obsolete\r\n var logos = {\r\n amex: ['american express'],\r\n bitcoin: ['bitcoin'],\r\n dankort: ['dankort'],\r\n diners: ['diners card'],\r\n discover: ['discover'],\r\n maestro: ['maestro'],\r\n mastercard: ['mastercard'],\r\n paypal: ['paypal'],\r\n visa: ['visa', 'connect'],\r\n external: ['offline']\r\n };\r\n return _.filter(Object.keys(logos), function (key) { return _.some(logos[key], function (cardName) { return _.some(paymentOptions, function (option) { return _.includes(_.toLower(option.Title || option.Name), cardName); }); }); });\r\n }\r\n function checkCardNumberV2(paymentOptions, cardNumber, cardType) {\r\n //To support new payment option structure, not changing the old one\r\n if (cardNumber != null) {\r\n cardNumber = cardNumber.replace(/ /g, '').replace(/-/g, '');\r\n }\r\n if (TRPCONFIG.Domain.CardNumberCheckEnabled) {\r\n for (var i = 0, ii = paymentOptions.length; i < ii; i++) {\r\n //Check with master card type\r\n if (paymentOptions[i].CardType === cardType) {\r\n if (paymentOptions[i].FeePercent > 0 || paymentOptions[i].FeeAmount > 0) {\r\n return $q.when();\r\n }\r\n }\r\n }\r\n }\r\n var result = getScheme(cardNumber);\r\n return result.then(function (res) {\r\n var actualType = res.data;\r\n if (actualType !== parseInt(cardType)) {\r\n return $q.reject(actualType);\r\n }\r\n }, function () {\r\n return cardType;\r\n });\r\n }\r\n function checkCardNumber(paymentOptions, cardNumber, selectedCardId) {\r\n if (cardNumber != null) {\r\n cardNumber = cardNumber.replace(/ /g, '').replace(/-/g, '');\r\n }\r\n var result = $q.all([\r\n _mapPaymentsType(paymentOptions),\r\n $http.get(_cardsUrl + \"/getscheme?cardNumber=\" + cardNumber, { cache: true, ignoreErrors: true })\r\n ]);\r\n return result.then(function _numberChecker(res) {\r\n var verifiedClientId = _clientServerCardsMap[res[1].data];\r\n if (!verifiedClientId) {\r\n return;\r\n }\r\n if (verifiedClientId !== parseInt(selectedCardId)) {\r\n return $q.reject(verifiedClientId);\r\n }\r\n else if (verifiedClientId === parseInt(selectedCardId)) {\r\n return $q.resolve(verifiedClientId);\r\n }\r\n }, function () {\r\n return selectedCardId;\r\n });\r\n }\r\n function getCardTitle(paymentOptions, cardTypeId) {\r\n //TODO: CardTypeId, Title needs to be removed once after booking page started using new booking options API.\r\n for (var i = 0, ii = paymentOptions.length; i < ii; i++) {\r\n //CardTypeId has been renamed to Id in new API.\r\n var cardType = paymentOptions[i].CardTypeId || paymentOptions[i].Id;\r\n if (cardType === cardTypeId) {\r\n //Title has been renamed to Name in new API.\r\n return paymentOptions[i].Title || paymentOptions[i].Name;\r\n }\r\n }\r\n }\r\n function _mapPaymentsType(cp) {\r\n return tripService.getCurrency($routeParams.tripId).then(function (cur) {\r\n var url = _cardsUrl + \"/gettypes\" +\r\n (\"?domainId=\" + TRPCONFIG.Domain.DomainId + \"¤cyCode=\" + (cur || TRPCONFIG.Domain.CurrencyCode));\r\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function _mergePaymentClientServer(res) {\r\n var sp = res.data;\r\n for (var i = 0, ii = sp.length; i < ii; i++) {\r\n var clientCard = _compareTitle(cp, sp[i].Title);\r\n if (clientCard) {\r\n _clientServerCardsMap[sp[i].CardType] = clientCard.CardTypeId;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n function _compareTitle(paymentOptions, title) {\r\n for (var j = 0, jj = paymentOptions.length; j < jj; j++) {\r\n if (paymentOptions[j].Title === title) {\r\n return paymentOptions[j];\r\n }\r\n }\r\n }\r\n function addCardDetails(card, savedFrom) {\r\n var cardRequest = {\r\n MasterCardTypeId: card.paymentType,\r\n Number: card.CardNumber,\r\n MaskedCardNumber: card.MaskedCardNumber,\r\n ExpiryMonth: card.ExpiryDate.Month,\r\n ExpiryYear: card.ExpiryDate.Year,\r\n SavedFrom: savedFrom\r\n };\r\n return $http.post(_userCardUrl + \"set\", cardRequest, { ignoreErrors: true });\r\n }\r\n function removeCard(cardId) {\r\n return $http.post(_userCardUrl + \"remove\", { CardId: cardId });\r\n }\r\n function getSavedBookingCards(allowedCards) {\r\n var allBookingTypes = 0;\r\n return $http.post(_userCardUrl + \"getSavedBookingCards\", {\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n bookingTypeId: allBookingTypes // 0 to get cards for all types of booking\r\n }, { ignoreErrors: true }).then(function (result) {\r\n var savedCards = result.data;\r\n if (savedCards.length > 0) {\r\n var filteredCardList = _.filter(savedCards, function (c) {\r\n return allowedCards[c.CardTypeId] !== undefined;\r\n });\r\n savedCards = _.map(filteredCardList, function (c) {\r\n c.Title = allowedCards[c.CardTypeId].Title;\r\n return c;\r\n });\r\n }\r\n return savedCards;\r\n }, function () {\r\n return null;\r\n });\r\n }\r\n function getEmptyPaymentDetails() {\r\n return {\r\n PaypalDetails: {\r\n //Not part of UserData contract in create booking\r\n IsPaypalPayment: false\r\n },\r\n CardDetails: {\r\n PaymentTypeId: 0,\r\n CardType: 0,\r\n CardNumber: null,\r\n StartDate: {\r\n Month: null,\r\n Year: null\r\n },\r\n ExpiryDate: {\r\n Month: null,\r\n Year: null\r\n },\r\n SecurityCode: null,\r\n IssueNumber: null,\r\n CardId: null,\r\n IsExpired: false\r\n },\r\n SaveThisCard: false\r\n };\r\n }\r\n function getPayPalResponseMessage(key) {\r\n return payPalResponses[key] || '';\r\n }\r\n function generateTokens(expiryMonth, expiryYear, saveCard) {\r\n //figure out if we need to generate tokens and if there should be an expiry\r\n //if pci compliant\r\n var requireTokens = TRPCONFIG.Domain.PCICompliant;\r\n var expiryDate = saveCard && expiryMonth !== 0 && expiryYear !== 0 ? new Date(expiryYear, expiryMonth) : null;\r\n if (saveCard && !expiryDate) {\r\n return $q.when(); //no point tokenising because the form is not valid\r\n }\r\n if (requireTokens) {\r\n return tokeniser.execute(expiryDate ? expiryDate.toISOString() : null);\r\n }\r\n return $q.when();\r\n }\r\n function cpgValidation(params) {\r\n var validationRequest = {\r\n CardNumber: params.cardNumber,\r\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CardTypeId: enbdOptionId\r\n };\r\n return $http.post(_enbdCardUrl + \"validateenbdcardnumber\", validationRequest);\r\n }\r\n function resendOtpConfirmation(params) {\r\n var requestParams = {\r\n SessionToken: params.SessionToken,\r\n TransactionId: params.TransactionId,\r\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: params.domainId,\r\n CardTypeId: enbdOptionId\r\n };\r\n return $http.post(_enbdCardUrl + \"resendotp\", requestParams);\r\n }\r\n function verifyOtp(params) {\r\n var requestParams = {\r\n CardNumber: params.cardNumber,\r\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: params.domainId,\r\n CardTypeId: enbdOptionId,\r\n SessionToken: params.SessionToken,\r\n TransactionId: params.TransactionId,\r\n OTP: params.OTP\r\n };\r\n return $http.post(_enbdCardUrl + \"verifyotp\", requestParams);\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n //Our final payment option shape\r\n var PaymentType;\r\n (function (PaymentType) {\r\n PaymentType[PaymentType[\"CreditCard\"] = 1] = \"CreditCard\";\r\n PaymentType[PaymentType[\"DebitCard\"] = 2] = \"DebitCard\";\r\n PaymentType[PaymentType[\"PayPal\"] = 14] = \"PayPal\";\r\n })(PaymentType || (PaymentType = {}));\r\n ;\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n var inTestingEnvironment = typeof __karma__ !== 'undefined';\r\n function decorate(service, $provide, $injector) {\r\n if (!$injector.has(service)) {\r\n return;\r\n }\r\n $provide.decorator(service, ['$delegate', '$q', function ($delegate, $q) {\r\n var newService = inTestingEnvironment ? $delegate : Object.assign({}, $delegate);\r\n var _loop_3 = function (fnName) {\r\n var fn = $delegate[fnName];\r\n newService[fnName] = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var res = fn.apply(void 0, args);\r\n return !inTestingEnvironment && res instanceof Promise ? $q.when(res) : res;\r\n };\r\n };\r\n for (var fnName in $delegate) {\r\n _loop_3(fnName);\r\n }\r\n return newService;\r\n }]);\r\n }\r\n angular\r\n .module('TR')\r\n .config(['$provide', '$injector', function ($provide, $injector) {\r\n [\r\n 'agentModeService',\r\n 'animationUtil',\r\n 'basketCrossSellService',\r\n 'cmsService',\r\n 'destinationAirport',\r\n 'discountsService',\r\n 'flightDetail',\r\n 'flightSeatPlanService',\r\n 'flightStaticService',\r\n 'globalisationService',\r\n 'googleStaticMap',\r\n 'hotelStaticMapService',\r\n 'languageService',\r\n 'localStorageProvider',\r\n 'loggingService',\r\n 'postcodeService',\r\n 'primaryNavigationService',\r\n 'productService',\r\n 'publicityService',\r\n 'scrollService',\r\n 'urgencyMessaging'\r\n ].forEach(function (service) { return decorate(service, $provide, $injector); });\r\n }]);\r\n angular\r\n .module('core')\r\n .config(['$provide', '$injector', function ($provide, $injector) {\r\n [\r\n 'adHocService',\r\n 'flightsTerminalService'\r\n ].forEach(function (service) { return decorate(service, $provide, $injector); });\r\n }]);\r\n})();\r\nvar Quote;\r\n(function (Quote) {\r\n var QuoteService = /** @class */ (function () {\r\n function QuoteService($http, $window, broker, $q, dateUtil, basketStore, brandedFareTypesService, localStorageProvider) {\r\n this.$http = $http;\r\n this.$window = $window;\r\n this.broker = broker;\r\n this.$q = $q;\r\n this.dateUtil = dateUtil;\r\n this.basketStore = basketStore;\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.localStorageProvider = localStorageProvider;\r\n this.url = '/api2/quotes/';\r\n this.basketQuote = {};\r\n this.cachedQuoteSearch = null;\r\n this.domain = $window.TRPCONFIG.Domain;\r\n }\r\n QuoteService.prototype.setTrackingTag = function (tag) {\r\n return this.localStorageProvider.setItem('trackingTag', tag);\r\n };\r\n QuoteService.prototype.getTrackingTag = function (cb) {\r\n return this.localStorageProvider.getItem('trackingTag', function (error, value) { return cb(value); });\r\n };\r\n QuoteService.prototype.removeTrackingTag = function () {\r\n return this.localStorageProvider.removeItem('trackingTag');\r\n };\r\n QuoteService.prototype.getQuoteByReference = function (quoteRef) {\r\n return this.$http.get(this.url + 'getbyreference' + '?reference=' + quoteRef + '&domainId=' +\r\n this.domain.DomainId + '&allowMultipleProductTypes=false', { ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n });\r\n };\r\n QuoteService.prototype.getCancellationDetails = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var cancellation;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.brandedFareTypesService.getCancellationCharges(TRPCONFIG.BasketId)];\r\n case 1:\r\n cancellation = _a.sent();\r\n TRPCONFIG.Domain.BrandedFareCancellations = cancellation;\r\n return [2 /*return*/, cancellation];\r\n }\r\n });\r\n });\r\n };\r\n QuoteService.prototype.refreshQuote = function (quoteId, productIds) {\r\n var _this = this;\r\n return this.$http.post(this.url + 'refreshproducts', { QuoteId: quoteId, ProductIds: productIds }, { ignoreErrors: true }).then(function (res) {\r\n _this.basketStore.destroyBasket();\r\n TRPCONFIG.BasketId = res.data.BasketId;\r\n if (sessionStorage.getItem('storeSelectedFlight') !== null) {\r\n _this.getCancellationDetails();\r\n }\r\n _this.broker.publish('quoteLoadedToBasket');\r\n return res.data;\r\n }, function (res) {\r\n return { Error: res.data };\r\n });\r\n };\r\n QuoteService.prototype.createQuote = function (basketId, sharedUseFlag, cache) {\r\n var _this = this;\r\n if (cache === void 0) { cache = true; }\r\n if (this.basketQuote[basketId]) {\r\n return this.basketQuote[basketId];\r\n }\r\n return this.$q(function (res, rej) {\r\n _this.getTrackingTag(function (value) {\r\n var params = {\r\n BasketId: basketId,\r\n SharedUse: sharedUseFlag,\r\n QuoteId: '',\r\n TrackingTag: value\r\n };\r\n res(_this.create(params, cache));\r\n });\r\n });\r\n };\r\n QuoteService.prototype.create = function (params, cache) {\r\n var _this = this;\r\n if (cache === void 0) { cache = true; }\r\n params.DomainId = params.DomainId || this.domain.DomainId;\r\n params.CultureCode = params.CultureCode || this.domain.CultureCode;\r\n this.basketQuote[params.BasketId || ''] = this.$http.post(this.url + 'create', params, {\r\n cache: cache,\r\n ignoreErrors: true\r\n }).then(function (res) {\r\n _this.removeTrackingTag();\r\n return res.data;\r\n }, function (res) {\r\n return { Error: res.data };\r\n });\r\n return this.basketQuote[params.BasketId || ''];\r\n };\r\n QuoteService.prototype.get = function (quoteId) {\r\n return this.$http.get(this.url + 'get' + '?quoteId=' + quoteId, { cache: true, ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n });\r\n };\r\n QuoteService.prototype.replaceProduct = function (quoteId, productId, replacementId) {\r\n return this.$http.post(this.url + 'replaceproduct', {\r\n QuoteId: quoteId,\r\n ProductId: productId,\r\n ReplacementId: replacementId\r\n }, { ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n });\r\n };\r\n QuoteService.prototype.addBookings = function (quoteId, bookingIds) {\r\n return this.$http.post(this.url + 'addbookings', {\r\n QuoteId: quoteId,\r\n BookingIds: bookingIds\r\n }, { ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n }, function () {\r\n return true;\r\n });\r\n };\r\n QuoteService.prototype.linkQuote = function (bookingReferences, quoteId) {\r\n if (quoteId) {\r\n var bookingIds = bookingReferences.map(function (ref) {\r\n return parseInt(ref.replace(/[^0-9]/gi, ''), 10);\r\n });\r\n return this.addBookings(quoteId, bookingIds);\r\n }\r\n else {\r\n return this.$q.when({});\r\n }\r\n };\r\n QuoteService.prototype.addNote = function (quoteId, noteText) {\r\n var _this = this;\r\n return this.$http.post(this.url + 'addnote', { QuoteId: quoteId, NoteText: noteText }, { ignoreErrors: true })\r\n .then(function (res) {\r\n return res.data;\r\n }, function () {\r\n return _this.$q.when({});\r\n });\r\n };\r\n QuoteService.prototype.validateSearchModel = function (model) {\r\n var _this = this;\r\n var empty = function (v) { return !_.toString(v); };\r\n var today = this.dateUtil.todayPlus(0, 0, true);\r\n var isDatesAreInRange = function (start, end) {\r\n return !empty(start) && !empty(end) && _this.dateUtil.dayDiff(start, end) <= 30;\r\n };\r\n var isQuotedByDatesAreInRange = function (start, end) {\r\n return (!empty(start) && _this.dateUtil.dayDiff(start, today) <= 30)\r\n || isDatesAreInRange(start, end);\r\n };\r\n return empty(model.quoteRef)\r\n && !isQuotedByDatesAreInRange(model.from, model.to)\r\n && empty(model.quotedById)\r\n && empty(model.userId)\r\n && empty(model.destination)\r\n && empty(model.externalAgentId)\r\n && empty(model.hotelName);\r\n };\r\n QuoteService.prototype.search = function (request) {\r\n var _this = this;\r\n this.cachedQuoteSearch = null;\r\n return this.validateSearchModel(request)\r\n ? this.$q.reject({ status: 400 })\r\n : this.$http.get(this.url + 'search?' + $.param(request), { ignoreErrors: true }).then(function (res) {\r\n _this.cachedQuoteSearch = {\r\n searchModel: request,\r\n searchResponse: res.data\r\n };\r\n return res.data;\r\n });\r\n };\r\n QuoteService.prototype.getCachedSearch = function () {\r\n return this.cachedQuoteSearch;\r\n };\r\n QuoteService.prototype.getTravelAgentNameForQuote = function (quote) {\r\n if (quote && (quote.TravelAgentFirstName || quote.TravelAgentLastName)) {\r\n return [quote.TravelAgentTitle, quote.TravelAgentFirstName, quote.TravelAgentLastName]\r\n .filter(function (i) { return null != i; }).join(' ');\r\n }\r\n return null;\r\n };\r\n QuoteService.prototype.getCustomerNameForQuote = function (quote, contact) {\r\n if (contact) {\r\n return contact.Title + \" \" + contact.FirstName + \" \" + contact.LastName;\r\n }\r\n else if (quote && quote.CustomerFirstName && quote.CustomerLastName) {\r\n return quote.CustomerFirstName + \" \" + quote.CustomerLastName;\r\n }\r\n return null;\r\n };\r\n QuoteService.prototype.getCustomerEmailForQuote = function (quote, contact) {\r\n if (contact && contact.Email) {\r\n return contact.Email;\r\n }\r\n else if (quote && quote.CustomerEmailAddress) {\r\n return quote.CustomerEmailAddress;\r\n }\r\n return null;\r\n };\r\n QuoteService.prototype.getCustomerPhoneNumberForQuote = function (contact) {\r\n return contact && (contact.MobileTel || contact.HomeTel || contact.Phone || contact.CustomerPhoneNumber);\r\n };\r\n QuoteService.prototype.getCustomerSkywardNumberForQuote = function (data) {\r\n if (data && (data.CustomerLoyaltyNumber || data.LoyaltyId)) {\r\n return data.CustomerLoyaltyNumber || data.LoyaltyId;\r\n }\r\n return null;\r\n };\r\n QuoteService.prototype.getPriceDifference = function (products) {\r\n var totalBaseCost = 0;\r\n var priceDifferenceAbs = 0;\r\n products.forEach(function (product) {\r\n totalBaseCost += product.QuotedCost;\r\n priceDifferenceAbs += (product.CurrentCost - product.QuotedCost);\r\n });\r\n var priceDifferencePercentage = (priceDifferenceAbs / totalBaseCost) * 100;\r\n return {\r\n priceDifferenceAbs: priceDifferenceAbs,\r\n priceDifferencePercentage: priceDifferencePercentage\r\n };\r\n };\r\n QuoteService.prototype.getEarliestDate = function (earliestDate, date) {\r\n var emptyValue = '';\r\n var compareDatesResult = this.dateUtil.compareDates(date, earliestDate) === -1;\r\n return (earliestDate === emptyValue) || compareDatesResult ? date : earliestDate;\r\n };\r\n QuoteService.prototype.extractEarliestDate = function (products) {\r\n var _this = this;\r\n var emptyValue = '';\r\n return _.reduce(products, function (acc, p) {\r\n var startDate;\r\n switch (p.TypeId) {\r\n case Quote.QuoteProductType.Accommodation:\r\n startDate = p.CheckInDate;\r\n break;\r\n case Quote.QuoteProductType.Flight:\r\n startDate = p.OutboundLeg.Segments[0].DepartureDate;\r\n break;\r\n case Quote.QuoteProductType.Transfer:\r\n startDate = p.OutboundDate || emptyValue;\r\n break;\r\n case Quote.QuoteProductType.CarHire:\r\n startDate = p.PickUpDate;\r\n break;\r\n default:\r\n startDate = emptyValue;\r\n break;\r\n }\r\n return _this.getEarliestDate(acc, startDate);\r\n }, emptyValue);\r\n };\r\n QuoteService.prototype.validForDays = function (refreshedQuoteProducts) {\r\n var validForDaysLength = 30;\r\n var earliestDate = this.extractEarliestDate(refreshedQuoteProducts);\r\n if (earliestDate.length > 0) {\r\n var days = this.dateUtil.getDifferenceInDays(new Date(), this.dateUtil.parseDate(earliestDate));\r\n if (days < validForDaysLength) {\r\n return days;\r\n }\r\n }\r\n return validForDaysLength;\r\n };\r\n return QuoteService;\r\n }());\r\n Quote.QuoteService = QuoteService;\r\n angular\r\n .module('TR')\r\n .service('quoteService', QuoteService);\r\n})(Quote || (Quote = {}));\r\nvar QuoteManager;\r\n(function (QuoteManager_1) {\r\n var QuoteManager = /** @class */ (function () {\r\n function QuoteManager($http, $window, cookieService) {\r\n this.$http = $http;\r\n this.$window = $window;\r\n this.cookieService = cookieService;\r\n this.url = '/api/quotes/';\r\n this.domain = $window.TRPCONFIG.Domain;\r\n }\r\n QuoteManager.prototype.create = function (params, cache) {\r\n if (cache === void 0) { cache = true; }\r\n params.DomainId = params.DomainId || this.domain.DomainId;\r\n params.CultureCode = params.CultureCode || this.domain.CultureCode;\r\n params.VisitSourceId = Number(this.cookieService.get('visitSource')) || null;\r\n return this.$http.post(this.url + 'create', params, {\r\n cache: cache,\r\n ignoreErrors: true\r\n }).then(function (res) {\r\n return res.data;\r\n }, function (res) {\r\n return { Error: res.data };\r\n });\r\n };\r\n return QuoteManager;\r\n }());\r\n QuoteManager_1.QuoteManager = QuoteManager;\r\n angular\r\n .module('TR')\r\n .service('quoteManager', QuoteManager);\r\n})(QuoteManager || (QuoteManager = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .config(function ($provide, $httpProvider) {\r\n var codesToRetry = [500, 503, 12152, 12002, 12031, 12029, 12030, 12041, 12019, 444];\r\n $provide.factory('retryInterceptor', function ($injector, $q) { return ({\r\n responseError: function (resp) {\r\n if (codesToRetry.indexOf(resp.status) >= 0 &&\r\n resp.config.headers['x-auto-retry'] == null) {\r\n resp.config.headers['x-auto-retry'] = resp.status;\r\n var $http = $injector.get('$http');\r\n return $http(resp.config);\r\n }\r\n return $q.reject(resp);\r\n }\r\n }); });\r\n if ($httpProvider.interceptors.indexOf('retryInterceptor') < 0) {\r\n $httpProvider.interceptors.push('retryInterceptor');\r\n }\r\n });\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var PassengerType;\r\n (function (PassengerType) {\r\n PassengerType[PassengerType[\"Adult\"] = 1] = \"Adult\";\r\n PassengerType[PassengerType[\"Child\"] = 2] = \"Child\";\r\n })(PassengerType || (PassengerType = {}));\r\n var ApiUrl = '/api/taxation/getCityTax';\r\n var TaxationService = /** @class */ (function () {\r\n function TaxationService($q, $http, basketStore, tripService) {\r\n this.$q = $q;\r\n this.$http = $http;\r\n this.basketStore = basketStore;\r\n this.tripService = tripService;\r\n }\r\n TaxationService.prototype.getCityTax = function (tripId, basketId) {\r\n var _this = this;\r\n if (TRPCONFIG.Domain.EnableCityTax) {\r\n var EstabId_1;\r\n return this.$q.all([\r\n this.basketStore.hotel(basketId),\r\n this.basketStore.hotelCost(basketId)\r\n ]).then(function (results) {\r\n var hotelFromBasket = results[0], hotelCost = results[1];\r\n if (hotelFromBasket) {\r\n EstabId_1 = hotelFromBasket.Details.Itinerary.EstabId;\r\n var Estabs = [\r\n {\r\n EstabId: EstabId_1,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n TotalCost: hotelCost\r\n }\r\n ];\r\n return _this.getCityTaxes(tripId, Estabs);\r\n }\r\n else {\r\n return _this.$q.when();\r\n }\r\n }).then(function (res) { return _.find(res, function (t) { return t.EstabId === EstabId_1; }); });\r\n }\r\n else {\r\n return this.$q.when();\r\n }\r\n };\r\n TaxationService.prototype.getCityTaxes = function (tripId, Estabs) {\r\n var _this = this;\r\n if (TRPCONFIG.Domain.EnableCityTax) {\r\n return this.$q.all([\r\n this.tripService.getHotelsRequestCheckInDate(tripId, true),\r\n this.tripService.getHotelsRequestCheckOutDate(tripId, true),\r\n this.tripService.getTripOccupancy(tripId)\r\n ]).then(function (_a) {\r\n var CheckInDate = _a[0], CheckOutDate = _a[1], occupancy = _a[2];\r\n return _this.$http.post(ApiUrl, {\r\n CheckInDate: CheckInDate,\r\n CheckOutDate: CheckOutDate,\r\n Estabs: Estabs,\r\n Rooms: _this.roomsFromOccupancy(occupancy)\r\n }, { ignoreErrors: true });\r\n }).then(function (res) { return res.data; });\r\n }\r\n else {\r\n return this.$q.when();\r\n }\r\n };\r\n TaxationService.prototype.roomsFromOccupancy = function (occupancy) {\r\n var defaultAdultAge = TRPCONFIG.Domain.MaximumChildAge + 1;\r\n return _.map(occupancy, function (r, i) {\r\n var room = {};\r\n room.RoomId = i + 1; //A random roomId\r\n var adults = _.fill(Array(r.Adults), { PassengerType: PassengerType.Adult, Age: defaultAdultAge });\r\n var children = _.map(r.ChildAges ? r.ChildAges : [], function (a) {\r\n return {\r\n PassengerType: PassengerType.Child,\r\n Age: a\r\n };\r\n });\r\n room.Passengers = _.concat(adults, children);\r\n return room;\r\n });\r\n };\r\n return TaxationService;\r\n }());\r\n Core.TaxationService = TaxationService;\r\n angular.module('TR').service('taxationService', TaxationService);\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .config(configure);\r\n function configure($provide, $httpProvider) {\r\n $provide.factory('timerInterceptor', timerInterceptor);\r\n function timerInterceptor() {\r\n var COMMON_THRESHOLD = 20;\r\n return {\r\n request: function (config) {\r\n try {\r\n config.headers['x-timer'] = new Date().getTime();\r\n }\r\n catch (e) { }\r\n return config;\r\n },\r\n response: function (data) {\r\n try {\r\n var timeElapsed = (new Date().getTime() - data.config.headers['x-timer']) / 1000;\r\n var threshold = data.config.headers['x-threshold'] || COMMON_THRESHOLD;\r\n if (timeElapsed > threshold) {\r\n var utm = JSON.parse($('body').attr('user')).UtmId;\r\n var msg = \"OVERTHRESHOLD | \" + timeElapsed + \"s | \" + data.config.url + \" | \" + utm + \" | \" + window.navigator.userAgent;\r\n var r = new XMLHttpRequest();\r\n r.open('POST', 'website/logging/log', true);\r\n r.setRequestHeader('content-type', 'application/json');\r\n r.send(JSON.stringify({ LogLevel: 'Warn', Message: msg }));\r\n }\r\n }\r\n catch (e) { }\r\n return data;\r\n }\r\n };\r\n }\r\n if ($httpProvider.interceptors.indexOf('timerInterceptor') < 0) {\r\n $httpProvider.interceptors.push('timerInterceptor');\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('tripService', tripService);\r\n function tripService(loggingService, $q, dateUtil, $http, searchUnitService, broker, occupancyService, $routeParams, $location, destinationService) {\r\n var url = '/api2/tripstate/';\r\n var promiseCache = {};\r\n var tripTypes = {\r\n None: 0,\r\n Flight: 1,\r\n Hotel: 2,\r\n Transfer: 3,\r\n Holiday: 4,\r\n Marhaba: 5,\r\n Parking: 6,\r\n Attractions: 7,\r\n DynamicPackage: 8,\r\n Insurance: 9,\r\n MultiDestHoliday: 10\r\n };\r\n var defaultOpts = {\r\n bags: 0\r\n };\r\n var tripQueue = $q.when();\r\n var service = {\r\n tripTypes: tripTypes,\r\n persist: persist,\r\n getTrip: getTrip,\r\n getTripDestination: getTripDestination,\r\n recordHotelSearch: recordHotelSearch,\r\n recordFlightSearch: recordFlightSearch,\r\n recordMultiFlightSearch: recordMultiFlightSearch,\r\n recordTransferSearch: recordTransferSearch,\r\n recordMarhabaSearch: recordMarhabaSearch,\r\n recordInsuranceSearch: recordInsuranceSearch,\r\n recordCarHireSearch: recordCarHireSearch,\r\n recordParkingSearch: recordParkingSearch,\r\n recordAttractionSearch: recordAttractionSearch,\r\n clearOptionalExtras: clearOptionalExtras,\r\n changeTripType: changeTripType,\r\n setBookingId: setBookingId,\r\n setBasketId: setBasketId,\r\n setQuoteId: setQuoteId,\r\n setKidsFree: setKidsFree,\r\n setSelectedFlight: setSelectedFlight,\r\n supportsTransfers: supportsTransfers,\r\n setDirectToHotel: setDirectToHotel,\r\n restoreSearchUnit: restoreSearchUnit,\r\n getCurrency: getCurrency,\r\n isKidsFree: isKidsFree,\r\n getTripIdForDeal: getTripIdForDeal,\r\n getTripIdForHolidayDeal: getTripIdForHolidayDeal,\r\n getHotelsRequest: getHotelsRequest,\r\n getHotelsRequestCheckInDate: getHotelsRequestCheckInDate,\r\n getHotelsRequestCheckOutDate: getHotelsRequestCheckOutDate,\r\n getHotelsRequestNumberOfNights: getHotelsRequestNumberOfNights,\r\n getFlightsRequest: getFlightsRequest,\r\n getFlightsRequestDepartureDate: getFlightsRequestDepartureDate,\r\n getFlightsRequestReturnDate: getFlightsRequestReturnDate,\r\n getParkingDropOffDate: getParkingDropOffDate,\r\n getParkingPickUpDate: getParkingPickUpDate,\r\n getSelectedDepartureAirport: getSelectedDepartureAirport,\r\n getDepartureAirports: getDepartureAirports,\r\n getSelectedDestinationAirport: getSelectedDestinationAirport,\r\n getDestinationAirports: getDestinationAirports,\r\n getFlightCabin: getFlightCabin,\r\n getParkingAirport: getParkingAirport,\r\n isOneWayFlightEnabled: isOneWayFlightEnabled,\r\n getTripNumberOfNights: getTripNumberOfNights,\r\n getDurationSummary: getDurationSummary,\r\n getTripOccupancy: getTripOccupancy,\r\n getTripReducedOccupancy: getTripReducedOccupancy,\r\n getTransfersRequestSummary: getTransfersRequestSummary,\r\n getTransferDestinationAirport: getTransferDestinationAirport,\r\n getParkingRequestSummary: getParkingRequestSummary,\r\n getTripFromQuote: getTripFromQuote,\r\n usePackageRates: usePackageRates,\r\n getInsuranceRequestSummary: getInsuranceRequestSummary,\r\n getTransfersRequest: getTransfersRequest\r\n };\r\n function _updateTrip(tripId, fn) {\r\n return service.getTrip(tripId).then(function (trip) {\r\n service.persist(tripId, fn(trip));\r\n return $q.when(trip);\r\n });\r\n }\r\n function _recordSearch(tripId, search, name) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip[name] = search;\r\n return trip;\r\n });\r\n }\r\n function persist(tripId, trip) {\r\n promiseCache[tripId] = $http.post(url + \"updatetripstate\", {\r\n TripId: tripId,\r\n TripState: trip\r\n }).then(function () {\r\n var tripCopy = angular.copy(trip);\r\n broker.publish('tripUpdated', tripCopy);\r\n return tripCopy;\r\n });\r\n return promiseCache[tripId];\r\n }\r\n function supportsTransfers(trip) {\r\n return trip.TripType !== Core.Trip.TripType.Flight;\r\n }\r\n function getTrip(tripId) {\r\n if (!tripId) {\r\n return $q.when();\r\n }\r\n if (promiseCache[tripId] === undefined) {\r\n var validateUser = Boolean(TRPCONFIG.Domain.ValidateUserForTripstate);\r\n promiseCache[tripId] = $http.get(url + \"gettripstate?tripId=\" + tripId + \"&validateUser=\" + validateUser).then(function (res) {\r\n if (res.data.TripId !== $routeParams.tripId) {\r\n //load new trip and basket clone\r\n $location.path($location.path().replace($routeParams.tripId, res.data.TripId));\r\n }\r\n return _enrichTripDestination(res.data);\r\n });\r\n }\r\n tripQueue = tripQueue.then(function () {\r\n return promiseCache[tripId].then(function (trip) {\r\n return angular.copy(trip);\r\n });\r\n });\r\n return tripQueue;\r\n function _enrichTripDestination(trip) {\r\n var detailsPromise = [];\r\n detailsPromise.push(trip.FlightsRequest && trip.FlightsRequest.Destination\r\n ? destinationService.getDetails(trip.FlightsRequest.Destination)\r\n : $q.when());\r\n detailsPromise.push(trip.HotelsRequest\r\n && trip.HotelsRequest.Destination\r\n ? destinationService.getDetails(trip.HotelsRequest.Destination)\r\n : $q.when());\r\n return $q.all(detailsPromise).then(function (_a) {\r\n var flightDest = _a[0], hotelDest = _a[1];\r\n if (flightDest && trip.FlightsRequest) {\r\n trip.FlightsRequest.Destination = flightDest;\r\n }\r\n if (hotelDest && trip.HotelsRequest) {\r\n trip.HotelsRequest.Destination = hotelDest;\r\n }\r\n return trip;\r\n }, function () {\r\n loggingService.logInfo(\"Get Details is failing for \" + trip.TripId);\r\n return trip;\r\n });\r\n }\r\n }\r\n function getTripDestination(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n if (trip) {\r\n var flightDest = trip.FlightsRequest && trip.FlightsRequest.Destination;\r\n var hotelsDest = trip.HotelsRequest && trip.HotelsRequest.Destination;\r\n return flightDest || hotelsDest || null;\r\n }\r\n return null;\r\n }, function () { tripQueue = $q.when(); });\r\n }\r\n function getCurrency(tripId) {\r\n if (tripId == null) {\r\n return $q.when();\r\n }\r\n return getTrip(tripId).then(function (trip) {\r\n if (trip.HotelsRequest != null) {\r\n return trip.HotelsRequest.CurrencyCode;\r\n }\r\n });\r\n }\r\n function isKidsFree(tripId) {\r\n if (tripId == null) {\r\n return $q.when(false);\r\n }\r\n return getTrip(tripId).then(function (trip) {\r\n return !!trip.IsKidsFree;\r\n });\r\n }\r\n function getTripIdForHolidayDeal(deal, occupancy) {\r\n var tripId;\r\n var params = _.assignIn({}, deal, {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Occupancy: _.first(occupancy)\r\n });\r\n return $http.post(url + \"createtripfromholidaydeal\", params, { ignoreErrors: true })\r\n .then(function (res) { return tripId = res.data.TripId; }, function (res) { return $q.reject(res); })\r\n .then(function () { return _updateTrip(tripId, function (trip) {\r\n trip.HotelsRequest.DirectToHotel = false;\r\n return trip;\r\n }); })\r\n .then(function () { return tripId; });\r\n }\r\n function getTripIdForDeal(deal, originPath) {\r\n return $http.post(url + \"createtripfromdeal\", {\r\n AvailabilitySearchId: deal.AvailabilitySearchId,\r\n EstablishmentId: deal.EstablishmentId,\r\n Deal: deal,\r\n OriginPath: originPath,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }, { ignoreErrors: true }).then(function (res) { return res.data.TripId; }, function (res) {\r\n if (res.status === 404) {\r\n loggingService.logWarn(\"Unable to create a trip for deal \" + deal.Id + \" with availabilityId \" + deal.AvailabilitySearchId);\r\n }\r\n return $q.reject(res);\r\n });\r\n }\r\n function recordHotelSearch(tripId, search) {\r\n search.DirectToHotel = true;\r\n return _recordSearch(tripId, search, 'HotelsRequest');\r\n }\r\n function recordFlightSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'FlightsRequest');\r\n }\r\n function recordMultiFlightSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'MultiFlightsRequest');\r\n }\r\n function recordTransferSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'TransfersRequest');\r\n }\r\n function recordMarhabaSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'MarhabaRequest');\r\n }\r\n function recordInsuranceSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'InsuranceRequest');\r\n }\r\n function recordCarHireSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'CarHireRequest');\r\n }\r\n function recordParkingSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'ParkingRequest');\r\n }\r\n function recordAttractionSearch(tripId, search) {\r\n return _recordSearch(tripId, search, 'AttractionRequest');\r\n }\r\n function clearOptionalExtras(tripId) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.TransfersRequest = undefined;\r\n trip.InsuranceRequest = undefined;\r\n trip.CarHireRequest = undefined;\r\n trip.ParkingRequest = undefined;\r\n trip.AttractionRequest = undefined;\r\n //TODO - set other optional extra requests to undefined\r\n return trip;\r\n });\r\n }\r\n function changeTripType(tripId, typeId) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.TripType = typeId;\r\n return trip;\r\n });\r\n }\r\n function setBookingId(tripId, bookingId) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.BookingId = bookingId;\r\n return trip;\r\n });\r\n }\r\n function setKidsFree(tripId, isKidsFree) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.IsKidsFree = isKidsFree;\r\n return trip;\r\n });\r\n }\r\n function setBasketId(tripId, basketId) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.BasketId = basketId;\r\n return trip;\r\n });\r\n }\r\n function setQuoteId(tripId, quoteId) {\r\n return _updateTrip(tripId, function (trip) {\r\n trip.QuoteId = quoteId;\r\n return trip;\r\n });\r\n }\r\n function setDirectToHotel(tripId, direct) {\r\n return service.getTrip(tripId).then(function (trip) {\r\n if (trip.HotelsRequest && trip.HotelsRequest.DirectToHotel !== direct) {\r\n return _updateTrip(tripId, function (trip) {\r\n if (trip.HotelsRequest) {\r\n trip.HotelsRequest.DirectToHotel = direct;\r\n }\r\n return trip;\r\n });\r\n }\r\n return trip;\r\n });\r\n }\r\n function setSelectedFlight(tripId, flight, opts) {\r\n opts = opts || defaultOpts;\r\n return _updateTrip(tripId, function (trip) {\r\n if (trip.FlightsRequest) {\r\n trip.FlightsRequest.SelectedFlight = {\r\n FlightId: flight.FlightId,\r\n DetailsId: flight.DetailsId,\r\n LeadAdultPrice: flight.LeadAdultPrice,\r\n LeadAdultTax: flight.LeadAdultTax,\r\n LeadBaggagePrice: flight.LeadBaggagePrice,\r\n AllBagsOrNone: flight.AllBagsOrNone,\r\n BaggageCount: opts.bags\r\n };\r\n }\r\n return trip;\r\n });\r\n }\r\n function restoreSearchUnit(tripId) {\r\n if (!tripId) {\r\n return $q.when();\r\n }\r\n return service.getTrip(tripId).then(function (trip) {\r\n return $q.all([\r\n searchUnitService.restoreFlightSearch(trip),\r\n searchUnitService.restoreMultiFlightSearch(trip),\r\n searchUnitService.restoreTransferSearch(trip),\r\n searchUnitService.restoreMarhabaSearch(trip),\r\n searchUnitService.restoreHotelSearch(trip),\r\n searchUnitService.restoreParkingSearch(trip),\r\n searchUnitService.restoreInsuranceSearch(trip)\r\n ])\r\n .then(function () {\r\n return trip;\r\n });\r\n });\r\n }\r\n function getHotelsRequest(tripId) {\r\n return service.getTrip(tripId).then(function (trip) { return trip.HotelsRequest; });\r\n }\r\n function getTransfersRequest(tripId) {\r\n return service.getTrip(tripId).then(function (trip) { return trip.TransfersRequest; });\r\n }\r\n function _getTripDate(tripId, requestType, dateType, serialised) {\r\n return service.getTrip(tripId).then(function (trip) {\r\n return trip && trip[requestType] && trip[requestType][dateType] ?\r\n (serialised ? dateUtil.serialiseDate : dateUtil.parseDate)(trip[requestType][dateType])\r\n : null;\r\n });\r\n }\r\n function getHotelsRequestCheckInDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'HotelsRequest', 'CheckInDate', serialised);\r\n }\r\n function getHotelsRequestCheckOutDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'HotelsRequest', 'CheckOutDate', serialised);\r\n }\r\n function getFlightsRequestDepartureDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'FlightsRequest', 'DepartureDate', serialised);\r\n }\r\n function getFlightsRequestReturnDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'FlightsRequest', 'ReturnDate', serialised);\r\n }\r\n function getSelectedDepartureAirport(tripId) {\r\n return service.getTrip(tripId).then(function (trip) {\r\n return trip && trip.FlightsRequest ? trip.FlightsRequest.SelectedDepartureAirport : null;\r\n });\r\n }\r\n //TODO - this needs investigating because DepartureAirports does not exist on the FlightsRequest\r\n function getDepartureAirports(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return trip && trip.FlightsRequest ? trip.FlightsRequest.DepartureAirports : [];\r\n });\r\n }\r\n function getParkingAirport(tripId) {\r\n return service.getTrip(tripId).then(function (trip) {\r\n return trip && trip.ParkingRequest ? _.omit(trip.ParkingRequest.Airport, 'ShortTitle') : {};\r\n });\r\n }\r\n //TODO - this return type mayes no sense because SelectedDestinationAirport is not an array\r\n function getSelectedDestinationAirport(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return trip && trip.FlightsRequest ? trip.FlightsRequest.SelectedDestinationAirport : [];\r\n });\r\n }\r\n //TODO - this needs investigating because DestinationAirports does not exist on the FlightsRequest\r\n function getDestinationAirports(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return trip && trip.FlightsRequest ? trip.FlightsRequest.DestinationAirports : [];\r\n });\r\n }\r\n function getFlightCabin(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return trip && trip.FlightsRequest ? trip.FlightsRequest.Cabin : null;\r\n });\r\n }\r\n function getParkingDropOffDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'ParkingRequest', 'DepartureDate', serialised);\r\n }\r\n function getParkingPickUpDate(tripId, serialised) {\r\n if (serialised === void 0) { serialised = false; }\r\n return _getTripDate(tripId, 'ParkingRequest', 'ReturnDate', serialised);\r\n }\r\n function _parseTripDates(tripId) {\r\n var dates = [\r\n new dateUtil.DateRange(),\r\n new dateUtil.DateRange(),\r\n new dateUtil.DateRange(),\r\n new dateUtil.DateRange()\r\n ];\r\n return getTrip(tripId).then(function (trip) {\r\n if (trip) {\r\n if (trip.HotelsRequest) {\r\n if (trip.HotelsRequest.CheckInDate) {\r\n setStartDate(searchUnitService.hotel, trip.HotelsRequest.CheckInDate);\r\n }\r\n if (trip.HotelsRequest.CheckOutDate) {\r\n setEndDate(searchUnitService.hotel, trip.HotelsRequest.CheckOutDate);\r\n }\r\n }\r\n if (trip.FlightsRequest) {\r\n if (trip.FlightsRequest.DepartureDate) {\r\n setStartDate(searchUnitService.flight, trip.FlightsRequest.DepartureDate);\r\n }\r\n if (trip.FlightsRequest.ReturnDate) {\r\n setEndDate(searchUnitService.flight, trip.FlightsRequest.ReturnDate);\r\n }\r\n }\r\n if (trip.TransfersRequest) {\r\n if (trip.TransfersRequest.ArrivalDate) {\r\n setStartDate(searchUnitService.transfer, trip.TransfersRequest.ArrivalDate);\r\n }\r\n if (trip.TransfersRequest.ReturnDate) {\r\n setEndDate(searchUnitService.transfer, trip.TransfersRequest.ReturnDate);\r\n }\r\n }\r\n if (trip.MarhabaRequest && trip.MarhabaRequest.DateAndTime) {\r\n setStartDate(searchUnitService.marhaba, trip.MarhabaRequest.DateAndTime);\r\n }\r\n }\r\n return dates;\r\n });\r\n function setStartDate(mode, date) {\r\n dates[mode].setStart(date);\r\n }\r\n function setEndDate(mode, date) {\r\n dates[mode].setEnd(date);\r\n }\r\n }\r\n function getTripNumberOfNights(mode, tripId) {\r\n return (!tripId || null == mode)\r\n ? $q.when()\r\n : _parseTripDates(tripId)\r\n .then(function (dates) { return dates && dates[mode] && dates[mode].numberOfNights(); });\r\n }\r\n function getDurationSummary(mode, tripId) {\r\n if (!tripId) {\r\n return $q.when('');\r\n }\r\n return _parseTripDates(tripId).then(function (dates) {\r\n return (mode === searchUnitService.flight)\r\n ? isOneWayFlightEnabled(tripId)\r\n .then(function (oneWay) {\r\n return oneWay ? dateUtil.format(dates[mode].start) : dates[mode].getDurationSummary();\r\n })\r\n : dates[mode].getDurationSummary();\r\n });\r\n }\r\n function isOneWayFlightEnabled(tripId) {\r\n return getTrip(tripId)\r\n .then(function (trip) { return trip && trip.FlightsRequest && trip.FlightsRequest.OneWayOnly; });\r\n }\r\n function getTripOccupancy(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n if (!trip) {\r\n return null;\r\n }\r\n var req = trip.HotelsRequest\r\n || trip.FlightsRequest\r\n || trip.TransfersRequest\r\n || trip.MarhabaRequest\r\n || trip.InsuranceRequest;\r\n if (!req) {\r\n if (trip.ParkingRequest) {\r\n return trip.ParkingRequest.PassengerCount;\r\n }\r\n return null;\r\n }\r\n return req.Rooms || [_.pick(req.Occupancy || req, 'Adults', 'ChildAges')];\r\n });\r\n }\r\n function getTripReducedOccupancy(tripId) {\r\n return getTripOccupancy(tripId).then(function (occupancy) {\r\n return occupancy &&\r\n occupancy.map(function (o) { return o.ChildAges ? o : _.set(o, 'ChildAges', []); })\r\n .reduce(function (o1, o2) { return ({\r\n Adults: o1.Adults + o2.Adults,\r\n ChildAges: (o1.ChildAges || []).concat(o2.ChildAges || [])\r\n }); });\r\n });\r\n }\r\n function getTransferDestinationAirport(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return trip && trip.TransfersRequest ? trip.TransfersRequest.DestinationAirport : null;\r\n });\r\n }\r\n function getTransfersRequestSummary(tripId) {\r\n function getTransferNumericDirection(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n if (trip && trip.TransfersRequest && trip.TransfersRequest) {\r\n var _a = trip.TransfersRequest, ArrivalDate = _a.ArrivalDate, ReturnDate = _a.ReturnDate;\r\n if (ArrivalDate && ReturnDate) {\r\n return 1;\r\n }\r\n if (ArrivalDate) {\r\n return 2;\r\n }\r\n if (ReturnDate) {\r\n return 3;\r\n }\r\n return null;\r\n }\r\n });\r\n }\r\n function getTransferDestination(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n if (trip && trip.TransfersRequest && trip.TransfersRequest.LocationId) {\r\n return destinationService.getDetails({\r\n LocationId: trip.TransfersRequest.LocationId\r\n });\r\n }\r\n });\r\n }\r\n function _getTransferPickupPoint(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return _.get(trip, 'TransfersRequest.Route.PickUpPoint.Description');\r\n });\r\n }\r\n function _getTransferDropOffPoint(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n return _.get(trip, 'TransfersRequest.Route.DropOffPoint.Description');\r\n });\r\n }\r\n return $q.all([\r\n getTransferDestinationAirport(tripId),\r\n _getTripDate(tripId, 'TransfersRequest', 'ArrivalDate', true),\r\n _getTripDate(tripId, 'TransfersRequest', 'ReturnDate', true),\r\n service.getTripOccupancy(tripId),\r\n getTransferNumericDirection(tripId),\r\n getTransferDestination(tripId),\r\n _getTransferPickupPoint(tripId),\r\n _getTransferDropOffPoint(tripId)\r\n ]).then(function (_a) {\r\n var DestinationAirport = _a[0], StartDate = _a[1], EndDate = _a[2], occupancy = _a[3], NumericDirection = _a[4], Destination = _a[5], PickUpPointTitle = _a[6], DropOffPointTitle = _a[7];\r\n return {\r\n StartDate: StartDate,\r\n EndDate: EndDate,\r\n OccupancyString: occupancyService.getOccupancyString(occupancy),\r\n NumericDirection: NumericDirection,\r\n DestinationTitle: (Destination && Destination.ShortTitle)\r\n || (DestinationAirport && DestinationAirport.Title),\r\n PickUpPointTitle: PickUpPointTitle,\r\n DropOffPointTitle: DropOffPointTitle,\r\n TransferType: searchUnitService.getTransferType()\r\n };\r\n });\r\n }\r\n function getInsuranceRequestSummary(tripId) {\r\n return getTrip(tripId).then(function (trip) {\r\n var insuranceReq = (trip && trip.InsuranceRequest) || {};\r\n return {\r\n PolicyType: insuranceReq.TripType,\r\n StartDate: dateUtil.serialiseDate(insuranceReq.StartDate),\r\n EndDate: dateUtil.serialiseDate(insuranceReq.EndDate),\r\n Destination: insuranceReq.TravelDestination\r\n };\r\n });\r\n }\r\n function getParkingRequestSummary(tripId) {\r\n return getTrip(tripId)\r\n .then(function (trip) {\r\n var parkingReq = (trip && trip.ParkingRequest) || {};\r\n return {\r\n Airport: parkingReq.Airport.ShortTitle,\r\n DepartureDate: dateUtil.serialiseDate(parkingReq.DepartureDate),\r\n ReturnDate: dateUtil.serialiseDate(parkingReq.ReturnDate),\r\n PassengerCount: parkingReq.PassengerCount\r\n };\r\n });\r\n }\r\n function getHotelsRequestNumberOfNights(tripId) {\r\n if (!tripId) {\r\n return $q.when(0);\r\n }\r\n return $q.all([\r\n service.getHotelsRequestCheckInDate(tripId, false),\r\n service.getHotelsRequestCheckOutDate(tripId, false)\r\n ]).then(function (dates) { return dateUtil.numberOfNights.apply(dateUtil, dates); });\r\n }\r\n function getTripFromQuote(quote) {\r\n //create request object\r\n var tripFromQuoteRequest = {\r\n QuoteId: quote.Id,\r\n BasketId: quote.BasketId,\r\n ForHoliday: quote.ForHoliday\r\n };\r\n quote.Products.reduce(function (req, _a) {\r\n var AvailabilityId = _a.AvailabilityId, Type = _a.Type;\r\n switch (Type) {\r\n case 'Accommodation':\r\n req.HotelsRequestId = AvailabilityId;\r\n break;\r\n case 'Airport Parking':\r\n req.ParkingRequestId = AvailabilityId;\r\n break;\r\n case 'Attraction Ticket':\r\n req.AttractionsRequestId = AvailabilityId;\r\n break;\r\n case 'Car Hire':\r\n req.CarHireRequestId = AvailabilityId;\r\n break;\r\n case 'Flight':\r\n req.FlightsRequestId = AvailabilityId;\r\n break;\r\n case 'Insurance':\r\n req.InsuranceRequestId = AvailabilityId;\r\n break;\r\n case 'Marhaba':\r\n req.MarhabaRequestId = AvailabilityId;\r\n break;\r\n case 'Transfer':\r\n req.TransfersRequestId = AvailabilityId;\r\n break;\r\n }\r\n return req;\r\n }, tripFromQuoteRequest);\r\n return $http.post(url + \"createtripfromquote\", tripFromQuoteRequest, { ignoreErrors: true }).then(function (res) { return res.data; });\r\n }\r\n function usePackageRates(tripId) {\r\n if (tripId === void 0) { tripId = $routeParams && $routeParams.tripId; }\r\n return getTrip(tripId)\r\n .then(function (trip) {\r\n return trip && trip.TripType === tripTypes.Holiday && (TRPCONFIG.Domain.PackagePrice || trip.PackageId);\r\n })\r\n .then(function (result) { return !!result; });\r\n }\r\n function getPackageId(tripId) {\r\n if (tripId === void 0) { tripId = $routeParams && $routeParams.tripId; }\r\n return getTrip(tripId).then(function (trip) { return trip && trip.PackageId; });\r\n }\r\n function getFlightsRequest(tripId) {\r\n return service.getTrip(tripId).then(function (trip) { return trip && trip.FlightsRequest; });\r\n }\r\n return service;\r\n }\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var Collections;\r\n (function (Collections) {\r\n var Dictionary = /** @class */ (function () {\r\n function Dictionary() {\r\n this._items = {};\r\n this._count = 0;\r\n }\r\n Dictionary.prototype.add = function (key, value) {\r\n if (this.containsKey(key)) {\r\n throw new TypeError('Key already exists');\r\n }\r\n this._items[key] = value;\r\n this._count++;\r\n };\r\n Dictionary.prototype.containsKey = function (key) {\r\n return this._items.hasOwnProperty(key);\r\n };\r\n Dictionary.prototype.count = function () {\r\n return this._count;\r\n };\r\n Dictionary.prototype.item = function (key) {\r\n return this._items[key];\r\n };\r\n Dictionary.prototype.values = function () {\r\n var v = [];\r\n for (var p in this._items) {\r\n if (this._items.hasOwnProperty(p)) {\r\n v.push(this._items[p]);\r\n }\r\n }\r\n return v;\r\n };\r\n return Dictionary;\r\n }());\r\n Collections.Dictionary = Dictionary;\r\n })(Collections = Core.Collections || (Core.Collections = {}));\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n var isPrerender = /prerender/i.test(navigator.userAgent);\r\n if (!isPrerender) {\r\n return;\r\n }\r\n var core = angular.module('core');\r\n var apiCallLog = [];\r\n //This is to record what api requests are made, so to track down what is going wrong with the prerender.\r\n core.decorator('$http', function ($delegate) {\r\n var $http = $delegate;\r\n var oldGet = $http.get;\r\n $http.get = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var log = {\r\n url: args[0],\r\n time: new Date()\r\n };\r\n apiCallLog.push(log);\r\n return oldGet.apply($http, args)\r\n .then(function (response) {\r\n log.status = response.status + \" \" + response.statusText;\r\n return response;\r\n })\r\n .catch(function (error) {\r\n log.error = error.status + \" \" + error.statusText;\r\n throw error;\r\n })\r\n .finally(function () {\r\n log.time = new Date() - log.time;\r\n });\r\n };\r\n return $delegate;\r\n });\r\n core.directive('prerenderLogging', function () { return ({\r\n restrict: 'E',\r\n template: '{{apiCallLog|json:false}}',\r\n link: function (scope) { return scope.apiCallLog = apiCallLog; }\r\n }); });\r\n if (console) {\r\n var oldError_1 = console.error;\r\n console.error = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n apiCallLog.push({\r\n jsError: args\r\n });\r\n oldError_1 && oldError_1.apply(console, args);\r\n };\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardHome = /** @class */ (function () {\r\n function DashboardHome(dashboardNotificationService, $interpolate, $location) {\r\n var _this = this;\r\n this.dashboardNotificationService = dashboardNotificationService;\r\n this.$interpolate = $interpolate;\r\n this.$location = $location;\r\n this.notificationClicked = function (n) {\r\n _this.dashboardNotificationService.notificationClicked(n);\r\n };\r\n this.formatNotification = function (n) { return _this.dashboardNotificationService.formatNotification(n); };\r\n this.dashboardNotificationService.getNotifications()\r\n .then(function (data) { _this.alerts = data; });\r\n }\r\n return DashboardHome;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .controller('Dashboard', DashboardHome);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var Notifications = /** @class */ (function () {\r\n function Notifications(dashboardNotificationService, $interpolate, $location) {\r\n var _this = this;\r\n this.dashboardNotificationService = dashboardNotificationService;\r\n this.$interpolate = $interpolate;\r\n this.$location = $location;\r\n this.notificationClicked = function (n) {\r\n _this.dashboardNotificationService.notificationClicked(n);\r\n };\r\n this.formatNotification = function (n) { return _this.dashboardNotificationService.formatNotification(n); };\r\n this.dashboardNotificationService.getNotifications()\r\n .then(function (data) { _this.alerts = data; });\r\n }\r\n return Notifications;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .controller('Notifications', Notifications);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var AddAPI = /** @class */ (function () {\r\n function AddAPI($routeParams, dashboardBookingService, bookingsManagerService, addAPIService, globalisationService, $scope, resourceService, broker) {\r\n var _this = this;\r\n this.$routeParams = $routeParams;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.bookingsManagerService = bookingsManagerService;\r\n this.addAPIService = addAPIService;\r\n this.globalisationService = globalisationService;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.broker = broker;\r\n this.apiSubmitted = false;\r\n this.bookingId = parseInt($routeParams.bookingId, 10);\r\n addAPIService.getPassengerInfo(this.bookingId).then(function (passengers) {\r\n _this.apiSubmitted = _.some(passengers, function (p) { return p.DetailsSubmitted; });\r\n _this.passengers = passengers;\r\n });\r\n globalisationService.getCountries().then(function (countries) { return _this.countries = countries; });\r\n this.documentTypes = addAPIService.getDocumentTypes();\r\n }\r\n AddAPI.prototype.submitAPI = function () {\r\n var _this = this;\r\n this.busy = true;\r\n this.addAPIService.addAPI(this.$routeParams.bookingId, this.passengers).then(function () {\r\n _this.apiSubmitted = true;\r\n _this.busy = false;\r\n _this.broker.publish('apiAdded');\r\n }, function () {\r\n _this.$scope.$broadcast('flash:error', _this.resourceService.get('ADDAPIFAILURE'));\r\n _this.busy = false;\r\n });\r\n };\r\n AddAPI.prototype.getDocumentTypeLabel = function (id) {\r\n var docType = _.find(this.documentTypes, function (type) { return type.id === id; });\r\n return docType ? docType.label() : '';\r\n };\r\n AddAPI.prototype.getCountryName = function (id) {\r\n var country = _.find(this.countries, function (country) { return country.CountryCodeIso3 === id; });\r\n return country ? country.Name : '';\r\n };\r\n return AddAPI;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .controller('AddAPI', AddAPI);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var AddOption = /** @class */ (function () {\r\n function AddOption($location, $q, $routeParams, $scope, $window, // unable to assign to $window.location if its type is declared\r\n broker, customCurrencyFilter, dashboardBookingService, flightExtrasService, mybTrack, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, rootPath, urlUtils, dateUtil, currentUser) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.$window = $window;\r\n this.broker = broker;\r\n this.customCurrencyFilter = customCurrencyFilter;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.flightExtrasService = flightExtrasService;\r\n this.mybTrack = mybTrack;\r\n this.paymentDetailsService = paymentDetailsService;\r\n this.paymentsService = paymentsService;\r\n this.paymentsUtilService = paymentsUtilService;\r\n this.resourceService = resourceService;\r\n this.rootPath = rootPath;\r\n this.urlUtils = urlUtils;\r\n this.dateUtil = dateUtil;\r\n this.currentUser = currentUser;\r\n this.paymentMethodText = ['New Card', 'PayPal', 'Saved Card'];\r\n this.selectedOptionsTotalPrice = 0;\r\n var flightBookingType = 1;\r\n this.bookingId = parseInt(this.$routeParams.bookingId, 10);\r\n var getOptions = this.paymentDetailsService.getPaymentOptions(flightBookingType, this.bookingId, TRPCONFIG.Domain.CurrencyCode);\r\n var getCards = this.paymentDetailsService.getSavedPaymentCards(flightBookingType, this.bookingId, TRPCONFIG.Domain.CurrencyCode);\r\n this.$q.all([getOptions, getCards])\r\n .then(function (results) {\r\n _this.paymentOptions = _this.paymentsUtilService.convertMybPaymentOptions(results[0]);\r\n if (results[1]) {\r\n _this.savedCards = _this.paymentsUtilService.convertMybSavedCards(results[1], results[0]);\r\n }\r\n });\r\n this.paymentModel = this.paymentsUtilService.createEmptyPaymentModel();\r\n this.flightExtrasService.getOptionsData(this.bookingId).then(function (optionsData) {\r\n if (!optionsData || !_this.canAddOption(optionsData) || !optionsData[_this.getConfig().optionsType]) {\r\n $location.path(\"dashboard/bookings/reference/\" + _this.bookingId);\r\n return;\r\n }\r\n _this[_this.getConfig().availableOptionsBinding] = optionsData[_this.getConfig().optionsType];\r\n _this.amendBookingOptionsId = optionsData.AmendBookingOptionsId;\r\n _this.handBaggageInformation = optionsData.HandBaggageInformation;\r\n if (_this.$routeParams.ppResp) {\r\n _this.showError(_this.resourceService.get(_this.paymentsService.getPayPalResponseMessage(_this.$routeParams.ppResp)));\r\n }\r\n }, function () { return _this.$location.path(\"dashboard/bookings/reference/\" + _this.bookingId); });\r\n this.$scope.$on('3DSValidationComplete', function (ev, data) {\r\n _this.finaliseOptions(data);\r\n });\r\n this.dashboardBookingService.getFlightBooking(this.$routeParams.bookingId).then(function (r) {\r\n _this.supplierIds = r.data.SupplierIds;\r\n _this.mybTrack.track(_this.getConfig().analyticsTag, {\r\n Source: _this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\r\n SupplierId: _this.supplierIds,\r\n BookingId: _this.bookingId\r\n });\r\n });\r\n this.dashboardBookingService.isPartOfHoliday(this.$routeParams.bookingId)\r\n .then(function (r) { return _this.isPartOfHoliday = r; });\r\n this.dataLoaded = true;\r\n }\r\n AddOption.prototype.generateTokens = function () {\r\n return this.paymentsService.generateTokens(this.paymentModel.cardDetail.expiryDate.month, this.paymentModel.cardDetail.expiryDate.year, this.paymentModel.saveCard);\r\n };\r\n AddOption.prototype.makePayment = function () {\r\n var _this = this;\r\n this.analyticsTrackOpenOption();\r\n var expires = this.paymentModel.cardDetail.expiryDate;\r\n var today = this.dateUtil.todayPlus();\r\n if (expires &&\r\n expires.year\r\n && expires.month\r\n && expires.year <= today.getFullYear()\r\n && expires.month < (today.getMonth() + 1)) {\r\n this.showError(this.resourceService.get('CARDHASEXPIRED'));\r\n return;\r\n }\r\n this.block(true);\r\n var requireValidation = this.paymentModel.cardDetail.isSavedCard === false\r\n && !this.paymentModel.isPayPalPayment;\r\n this.flightExtrasService.addOptionsToBooking(this.formatClearRequestPayload(), requireValidation)\r\n .then(function (result) {\r\n if (result.Success) {\r\n if (result.AcsRedirectRequired) {\r\n if (_this.paymentModel.isPayPalPayment) {\r\n //Paypal redirection\r\n _this.$window.location = result.AcsUrl;\r\n }\r\n else {\r\n //3ds redirection\r\n _this.redirectTo3dSecurePayment(result);\r\n }\r\n }\r\n else {\r\n //Show complete page\r\n _this.$location.path(String.format(_this.getConfig().completeUrl, _this.bookingId));\r\n }\r\n }\r\n else {\r\n if (result.PostPayment) {\r\n _this.handlePaymentSuccessOptionsError();\r\n return;\r\n }\r\n var message = result.ReasonCode ?\r\n _this.paymentDetailsService.getcardFailureReasonMessage(result.ReasonCode)\r\n : result.PaymentMessage;\r\n _this.handleFailurePayment(message);\r\n }\r\n }, function () {\r\n _this.showError(_this.resourceService.get('PAYBALANCEERROR'));\r\n });\r\n };\r\n AddOption.prototype.formatClearRequestPayload = function () {\r\n var root = this.urlUtils.getOrigin() + this.rootPath.getRootPath();\r\n var payPalCallbackUrl = '{0}addoptionspaypalcallback?paymentId={1}&bookingId={2}&ppResp={3}' +\r\n '&amendBookingOptionsId={4}&pageUrl={5}';\r\n var request = (_a = {\r\n BookingId: this.bookingId,\r\n AmendBookingOptionsId: this.amendBookingOptionsId,\r\n PaymentRequest: {\r\n BookingId: this.bookingId,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n Amount: this.selectedOptionsTotalPrice,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n PayPalCallbackUrl: String.format(payPalCallbackUrl, root, '$PaymentId', this.bookingId, 'success', this.amendBookingOptionsId, this.getConfig().pageUrl),\r\n PayPalCancellationUrl: String.format(payPalCallbackUrl, root, 0, this.bookingId, 'cancel', this.amendBookingOptionsId, this.getConfig().pageUrl)\r\n }\r\n },\r\n _a[this.getConfig().selectedOptionsRequest] = this[this.getConfig().selectedOptionsBinding],\r\n _a);\r\n this.paymentsUtilService.addPaymentDetailsToClearRequest(this.paymentModel, request.PaymentRequest);\r\n return request;\r\n var _a;\r\n };\r\n AddOption.prototype.finaliseOptions = function (data) {\r\n var _this = this;\r\n this.block(true);\r\n this.flightExtrasService.finaliseOptions(this.formatFinaliseOptionsRequestPayload(data))\r\n .then(function (result) {\r\n _this.$scope.$broadcast('3DSValidationFinished', result.Success);\r\n if (result.Success) {\r\n _this.$location.path(String.format(_this.getConfig().completeUrl, _this.bookingId));\r\n }\r\n else {\r\n if (result.PostPayment) {\r\n _this.handlePaymentSuccessOptionsError();\r\n return;\r\n }\r\n _this.handleFailurePayment(result.PaymentMessage);\r\n }\r\n }, function () {\r\n _this.showError(_this.resourceService.get('AUTHORISEEERROR'));\r\n });\r\n this.$scope.$apply(function () {\r\n _this.threedsRedirecting = false;\r\n });\r\n };\r\n AddOption.prototype.formatFinaliseOptionsRequestPayload = function (data) {\r\n return {\r\n BookingId: this.bookingId,\r\n AmendBookingOptionsId: this.amendBookingOptionsId,\r\n PaymentId: data.prePaymentId,\r\n PaRes: decodeURIComponent(data.paRes),\r\n MD: data.md,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n };\r\n AddOption.prototype.showError = function (msg) {\r\n this.$scope.$broadcast('flash:error', msg);\r\n };\r\n AddOption.prototype.block = function (completing) {\r\n this.$scope.$emit('block', {\r\n title: this.resourceService.get(completing ? 'COMPLETINGPAYMENT' : 'PREPARINGPAYMENT'),\r\n loadingScreenStyle: 'default-addBaggage'\r\n });\r\n };\r\n AddOption.prototype.redirectTo3dSecurePayment = function (result) {\r\n var root = this.urlUtils.getOrigin() + this.rootPath.getRootPath();\r\n //Create threeDSecure object\r\n this.ThreeDSecure = {\r\n PaReq: result.PaReq,\r\n MD: result.MD,\r\n TermUrl: String.format('{0}threedsecure?prePaymentID={1}', root, result.PaymentId),\r\n AcsUrl: result.AcsUrl,\r\n CanByPass: result.AllowThreeDSecureBypass,\r\n PrePaymentID: result.PaymentId\r\n };\r\n this.$scope.$broadcast('request3DSValidation', this.ThreeDSecure, {\r\n Journey: 'AddOptions',\r\n BookingID: this.bookingId,\r\n SignedIn: this.currentUser.get().SignedIn\r\n });\r\n this.threedsRedirecting = true;\r\n this.broker.publish('unblock');\r\n this.$scope.$emit('unblock');\r\n };\r\n AddOption.prototype.handleFailurePayment = function (msg) {\r\n var messages = [this.resourceService.get('PAYMENTFAILED') + msg,\r\n String.format(this.resourceService.get('PAYMENTASSISTENCE'), this.resourceService.get('TELEPHONENUMBER'))];\r\n this.showErrorMessages(messages);\r\n };\r\n AddOption.prototype.handlePaymentSuccessOptionsError = function () {\r\n var message = String.format(this.resourceService.get('AMENDMENTERRORMSG'), this.resourceService.get('TELEPHONENUMBER'));\r\n this.showErrorMessages(message);\r\n };\r\n AddOption.prototype.showErrorMessages = function (messages) {\r\n this.showError(messages);\r\n this.broker.publish('unblock');\r\n this.$scope.$emit('unblock');\r\n };\r\n return AddOption;\r\n }());\r\n Dashboard.AddOption = AddOption;\r\n})(Dashboard || (Dashboard = {}));\r\n///\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var AddBaggage = /** @class */ (function (_super) {\r\n __extends(AddBaggage, _super);\r\n function AddBaggage($location, $q, $routeParams, $scope, $window, broker, customCurrencyFilter, dashboardBookingService, flightExtrasService, mybTrack, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, rootPath, urlUtils, dateUtil, currentUser) {\r\n var _this = _super.call(this, $location, $q, $routeParams, $scope, $window, broker, customCurrencyFilter, dashboardBookingService, flightExtrasService, mybTrack, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, rootPath, urlUtils, dateUtil, currentUser) || this;\r\n _this.$location = $location;\r\n _this.$q = $q;\r\n _this.$routeParams = $routeParams;\r\n _this.$scope = $scope;\r\n _this.$window = $window;\r\n _this.broker = broker;\r\n _this.customCurrencyFilter = customCurrencyFilter;\r\n _this.dashboardBookingService = dashboardBookingService;\r\n _this.flightExtrasService = flightExtrasService;\r\n _this.mybTrack = mybTrack;\r\n _this.paymentDetailsService = paymentDetailsService;\r\n _this.paymentsService = paymentsService;\r\n _this.paymentsUtilService = paymentsUtilService;\r\n _this.resourceService = resourceService;\r\n _this.rootPath = rootPath;\r\n _this.urlUtils = urlUtils;\r\n _this.dateUtil = dateUtil;\r\n _this.currentUser = currentUser;\r\n _this.$scope.$watch('cm.selectedOptions', function () { return _this.updateButtonLabel(); });\r\n _this.$scope.$watch('cm.paymentModel.fee', function () { return _this.updateButtonLabel(); });\r\n return _this;\r\n }\r\n AddBaggage.prototype.updateButtonLabel = function () {\r\n this.buttonLabel = this.getButtonLabel();\r\n };\r\n AddBaggage.prototype.getButtonLabel = function () {\r\n if (this.selectedOptions && this.selectedOptions.length === 1) {\r\n return String.format(this.resourceService.get('PAYFORONEBAG'), this.customCurrencyFilter(this.selectedOptionsTotalPrice + this.paymentModel.fee));\r\n }\r\n if (this.selectedOptions && this.selectedOptions.length > 1) {\r\n return String.format(this.resourceService.get('PAYFORBAGS'), this.customCurrencyFilter(this.selectedOptionsTotalPrice + this.paymentModel.fee), this.selectedOptions.length);\r\n }\r\n return this.resourceService.get('ADDBAGSTOPAY');\r\n };\r\n AddBaggage.prototype.analyticsTrackOpenOption = function () {\r\n this.mybTrack.track('MYB - Add Bag Payment', {\r\n NumberOfHoldBags: this.selectedOptions.length || 0,\r\n NumberOfHandBags: this.handBaggageInformation &&\r\n this.handBaggageInformation.PiecesAllowed,\r\n PaymentMethod: this.paymentMethodText[this.paymentTab] || '',\r\n Source: this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\r\n SuplierIds: this.supplierIds\r\n });\r\n };\r\n AddBaggage.prototype.getConfig = function () {\r\n return {\r\n completeUrl: 'dashboard/add-baggage/complete/{0}',\r\n optionsType: 'BagOptions',\r\n availableOptionsBinding: 'bagOptions',\r\n selectedOptionsBinding: 'selectedOptions',\r\n selectedOptionsRequest: 'SelectedOptions',\r\n analyticsTag: 'MYB - Open Add Bag',\r\n pageUrl: 'dashboard/add-baggage'\r\n };\r\n };\r\n AddBaggage.prototype.canAddOption = function (optionsData) {\r\n return !!(optionsData && optionsData.CanAddBags);\r\n };\r\n return AddBaggage;\r\n }(Dashboard.AddOption));\r\n angular\r\n .module('dashboard')\r\n .controller('AddBaggage', AddBaggage);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('ContactDetail', ContactDetail);\r\n function ContactDetail($routeParams, $rootScope, $location, $q, dashboardBookingService, deliveryAddressService, resourceService, mybTrack) {\r\n var cm = this;\r\n cm.updateDeliveryAddressWithlLeadContact = true;\r\n cm.bookingId = $routeParams.bookingId ? parseInt($routeParams.bookingId) : 0;\r\n cm.user = $rootScope.user;\r\n cm.isContactSaved = false;\r\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\r\n cm.cancelContactChange = cancelContactChange;\r\n mybTrack.track('MYB - Open Contact Details');\r\n cm.updateContactDetails = function () {\r\n var putContact = dashboardBookingService.putContact(cm.bookingId, cm.ContactDetails, cm.updateRelatedBooking);\r\n var putDeliveryAddress = cm.requireDeliverAddress ? deliveryAddressService.put(cm.bookingId, cm.updateDeliveryAddressWithlLeadContact ? cm.ContactDetails : cm.DeliveryAddress) : null;\r\n $q.all([putContact, putDeliveryAddress]).then(function () {\r\n cm.isContactSaved = true;\r\n }, function () {\r\n $rootScope.$broadcast('flash:error', resourceService.get('CONTACTSAVEDERROR'));\r\n cm.isContactSaved = false;\r\n });\r\n };\r\n dashboardBookingService.getContact(cm.bookingId).then(function (contactDetail) {\r\n cm.ContactDetails = contactDetail.data;\r\n });\r\n function _processDeliveryAddress(bookingType) {\r\n if (bookingType === cm.bookingType.attraction) {\r\n //Require delivery address only for attractions\r\n cm.requireDeliverAddress = true;\r\n deliveryAddressService.get(cm.bookingId).then(function (deliveryAddress) {\r\n cm.DeliveryAddress = deliveryAddress.data;\r\n //Setting this to true, only if on load, delivery address is matched with contact address.\r\n cm.updateDeliveryAddressWithlLeadContact = _.isMatch(cm.ContactDetails, cm.DeliveryAddress);\r\n });\r\n }\r\n }\r\n dashboardBookingService.getOutstandingTrips(null, $routeParams.bookingId).then(function (trips) {\r\n var trip = trips && trips.length > 0 ? trips[0] : null;\r\n cm.hasLinkedBookings = trip.Bookings.length > 1;\r\n var bookingInfo = cm.hasLinkedBookings ? _.find(trip.Bookings, function (b) { return b.BookingId === cm.bookingId; }) : trip.Bookings.length > 0 ? trip.Bookings[0] : null;\r\n _processDeliveryAddress(bookingInfo.Type);\r\n cm.bk = bookingInfo;\r\n cm.leadPassenegr = { FirstName: bookingInfo.LeadPassengerFirstName, LastName: bookingInfo.LeadPassengerLastName };\r\n });\r\n function cancelContactChange() {\r\n $location.path(\"dashboard/bookings/reference/\" + cm.bookingId);\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('Csr', Csr);\r\n function Csr($routeParams, $location, $timeout, dashboardCsrService, dashboardBookingService, bookingsManagerService, resourceService, broker, mybTrack) {\r\n var cm = this;\r\n cm.bookingId = $routeParams.bookingId;\r\n cm.getCSRStatus = dashboardCsrService.getCSRStatus;\r\n cm.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n cm.next = next;\r\n cm.previous = previous;\r\n cm.createCsr = createCsr;\r\n cm.currentStep = 2;\r\n cm.view = view;\r\n cm.resetCsrForm = resetCsrForm;\r\n cm.goToCreateCsr = goToCreateCsr;\r\n cm.CsrFaqCheckEnabled = TRPCONFIG.Domain.CsrFaqCheckEnabled;\r\n cm.csrCategoryChanged = csrCategoryChanged;\r\n cm.returnUrl = \"/dashboard/csr/\" + cm.bookingId;\r\n cm.baseUrl = '/dashboard';\r\n cm.disableFaq = TRPCONFIG.Domain.DisableFAQs;\r\n cm.isInProgress = false;\r\n mybTrack.track('MYB - Open CSR');\r\n function _linkCSR(csrs) {\r\n cm.csr = csrs;\r\n cm.allCsr = csrs.pending.concat(csrs.completed);\r\n }\r\n function _rejectCSR() {\r\n $location.path('dashboard/bookings/current');\r\n }\r\n dashboardCsrService.getCSRSummary(cm.bookingId).then(_linkCSR, _rejectCSR);\r\n dashboardBookingService.getBookingInfo(cm.bookingId).then(function (booking) {\r\n cm.bk = booking;\r\n dashboardCsrService.getCsrCategories(booking.Type, cm.bookingId).then(function (categories) {\r\n cm.csrCategories = categories;\r\n if (TRPCONFIG.Domain.HideCancelCSRForAutoCancellableBooking) {\r\n var csrCancelId_1 = TRPCONFIG.Domain.CancelCSRId || 3;\r\n bookingsManagerService.getCancellationOptions(booking.BookingId).then(function (booking) {\r\n if (booking.CanAutoCancel) {\r\n $timeout(function () {\r\n cm.csrCategories = _.filter(categories, function (c) {\r\n return c.Id !== csrCancelId_1;\r\n });\r\n });\r\n }\r\n });\r\n }\r\n if ($routeParams.id) {\r\n cm.newCsr.Category = _.find(cm.csrCategories, function (c) { return c.Id === parseInt($routeParams.id); });\r\n csrCategoryChanged();\r\n }\r\n });\r\n cm.newCsr = {};\r\n cm.newCsr.TextAlerts = TRPCONFIG.Domain.CsrTextAlertsEnabled;\r\n cm.childActions = dashboardBookingService.getChildActions(booking.BookingOptions.Actions, 'CSR');\r\n });\r\n dashboardBookingService.getContact(cm.bookingId).then(function (contactDetail) {\r\n cm.ContactDetails = contactDetail.data;\r\n });\r\n function resetCsrForm() {\r\n cm.newCsr = {};\r\n cm.newCsr.TextAlerts = TRPCONFIG.Domain.CsrTextAlertsEnabled;\r\n }\r\n function next() {\r\n cm.currentStep++;\r\n }\r\n function previous() {\r\n cm.currentStep--;\r\n }\r\n function createCsr() {\r\n cm.isInProgress = true;\r\n var csrTrackingData = {\r\n CategoryId: cm.newCsr.Category.Id,\r\n CategoryText: cm.newCsr.Category.Text,\r\n TextAlert: !!cm.newCsr.TextAlerts\r\n };\r\n mybTrack.track('MYB - CSR', csrTrackingData);\r\n dashboardCsrService.createCsr(cm.newCsr, cm.bookingId, cm.ContactDetails.MobileTel).then(function (data) {\r\n //if text alert is selected // update contact details.\r\n if (cm.newCsr.TextAlerts) {\r\n dashboardBookingService.putContact(cm.bookingId, cm.ContactDetails).then(function () { return cm.isInProgress = false; });\r\n }\r\n else {\r\n cm.isInProgress = false;\r\n }\r\n cm.newCsr.csrId = data.Id;\r\n next();\r\n broker.publish('csrRaised');\r\n cm.csrCreated = true;\r\n });\r\n }\r\n function view(csr) {\r\n $location.path(cm.baseUrl + \"/csr-details/\" + csr.BookingId + \"/\" + csr.CsrId);\r\n }\r\n function goToCreateCsr(couldNotFindAnswer) {\r\n if (cm.CsrFaqCheckEnabled && !couldNotFindAnswer) {\r\n return false;\r\n }\r\n $location.path(\"dashboard/create-csr/\" + cm.bookingId);\r\n }\r\n function csrCategoryChanged() {\r\n cm.newCsr.Subject = cm.newCsr.Category.Text;\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('CsrDetails', CsrDetails);\r\n function CsrDetails($routeParams, dashboardCsrService) {\r\n var cm = this;\r\n cm.getCSRStatus = function (status) { return dashboardCsrService.getCSRStatus(status); };\r\n cm.bookingId = $routeParams.bookingId;\r\n cm.getCsrStatusClass = function (status) { return dashboardCsrService.getCsrStatusClass(status); };\r\n cm.returnUrl = \"/dashboard/csr/\" + cm.bookingId;\r\n dashboardCsrService.getCSRDetail($routeParams.csrId).then(function (res) {\r\n cm.csrDetails = res;\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('DashboardBookings', DashboardBookings);\r\n function DashboardBookings(currentUser, $location, $interpolate, dashboardBookingService, $routeParams, resourceService, dateUtil, crossSellService, onlineCheckinService, preferences, dashboardBookingsErrorMessage, dashboardNotificationService, scrollService, $q, imageService, mybTrack, dashboardCsrService, enumService) {\r\n if (!$routeParams.bookingId && $routeParams.bookingPeriod !== 'current' && $routeParams.bookingPeriod !== 'previous') {\r\n $location.path('dashboard/bookings/current');\r\n }\r\n var cm = this;\r\n if ($routeParams.selectBooking) {\r\n cm.selectBooking = true;\r\n cm.bookingSelected = bookingSelected;\r\n cm.redirectUrlPostBookingSelect = $routeParams.redirectUrlPostBookingSelect;\r\n cm.previousBookings = \"dashboard/bookings/previous/selectbooking/\" + cm.redirectUrlPostBookingSelect;\r\n cm.currentBookings = \"dashboard/bookings/current/selectbooking/\" + cm.redirectUrlPostBookingSelect;\r\n }\r\n else {\r\n cm.previousBookings = 'dashboard/bookings/previous';\r\n cm.currentBookings = 'dashboard/bookings/current';\r\n }\r\n cm.user = currentUser.get();\r\n cm.translateActionLink = translateActionLink;\r\n cm.limitBooking = dashboardBookingService.getLimitBooking();\r\n cm.next = next;\r\n cm.actionLink = dashboardBookingService.getActionLinks();\r\n cm.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n cm.setExpandedTrip = setExpandedTrip;\r\n cm.addDays = dateUtil.todayPlus;\r\n cm.bookCrossSell = bookCrossSell;\r\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\r\n cm.formatBookingMessage = dashboardBookingService.formatBookingMessage;\r\n cm.getCrossSellTeaserText = getCrossSellTeaserText;\r\n cm.getCrossSellStartingFromText = getCrossSellStartingFromText;\r\n cm.getTripTitle = dashboardBookingService.getTripTitle;\r\n cm.getCrossSellTitle = getCrossSellTitle;\r\n cm.getTripDateText = dashboardBookingService.getTripDateText;\r\n cm.actionClick = dashboardBookingService.actionClick;\r\n cm.getFuturePayments = dashboardBookingService.getFuturePayments;\r\n var pageSize = 10;\r\n cm.bookingStatus = dashboardBookingService.getBookingStatus();\r\n cm.loadingBooking = true;\r\n var trackEvent = {\r\n current: 'MYB - Current Booking',\r\n previous: 'MYB - Previous Booking'\r\n };\r\n if (trackEvent[$routeParams.bookingPeriod]) {\r\n mybTrack.track(trackEvent[$routeParams.bookingPeriod]);\r\n }\r\n $q.all([\r\n preferences.get('canceledBooking'),\r\n dashboardBookingService.getOutstandingTrips($routeParams.bookingPeriod, $routeParams.bookingId, true)\r\n ]).then(function (results) {\r\n var showCanceledBookings = results[0];\r\n cm.loadingBooking = false;\r\n cm.trips = results[1];\r\n if (showCanceledBookings === false) {\r\n cm.trips = dashboardBookingService.removeCanceledBookings(cm.trips);\r\n }\r\n if (TRPCONFIG.Domain.FlightCheckinEnabled && $routeParams.bookingPeriod === 'current') {\r\n onlineCheckinService.addCheckinData(cm.trips);\r\n }\r\n cm.bookingNotYoursId = dashboardBookingsErrorMessage.getMessage();\r\n if (cm.bookingNotYoursId) {\r\n cm.bookingNotYours = true;\r\n }\r\n bookingConfirmed();\r\n dashboardCsrService.addCsrToBooking(cm.trips);\r\n });\r\n //Notifications\r\n cm.notificationClicked = function (notification) { return dashboardNotificationService.notificationClicked(notification); };\r\n cm.formatNotification = function (notification) { return dashboardNotificationService.formatNotification(notification); };\r\n //End notifications\r\n function translateActionLink(link, booking) {\r\n return link ? $interpolate(link)(booking) : '';\r\n }\r\n function next() {\r\n cm.limitBooking += pageSize;\r\n dashboardBookingService.setLimitBooking(cm.limitBooking);\r\n }\r\n function setExpandedTrip(tr, $event) {\r\n if (!tr.isExpanded) {\r\n tr.isExpanded = true;\r\n cm.trips.forEach(function (t) {\r\n t.isExpanded = (t.TripId === tr.TripId);\r\n });\r\n scrollService.scrollTo($event.target, { animate: true });\r\n var flightBooking_1 = _.find(tr.Bookings, function (b) { return b.Type === 1; });\r\n crossSellService.addExtrasAndCrossSells(tr);\r\n if (flightBooking_1 && !flightBooking_1.ObjectId) {\r\n dashboardBookingService.getObjectFromBooking(flightBooking_1.BookingId).then(function (obj) {\r\n return flightBooking_1.ImageUrl = imageService.getDestinationImage(obj, 300, 190);\r\n });\r\n }\r\n }\r\n }\r\n function bookCrossSell(trip, crossSell) {\r\n if (crossSell) {\r\n mybTrack.track('MYB - Cross Sell Click', {\r\n ProductType: crossSell.Code\r\n });\r\n }\r\n if (crossSell.CrossSellType === enumService.CrossSellType.Seats ||\r\n crossSell.CrossSellType === enumService.CrossSellType.Baggage) {\r\n if (cm.actionLink) {\r\n var path = cm.translateActionLink(cm.actionLink[crossSell.Name], { BookingId: crossSell.BookingId });\r\n $location.url(path);\r\n }\r\n }\r\n else {\r\n crossSellService.startCrossSellJourney(trip.Bookings[0].BookingId, crossSell);\r\n }\r\n }\r\n function bookingConfirmed() {\r\n var isConfirmed = false;\r\n if (cm.trips.length > 0 && cm.trips[0].Bookings.length > 0) {\r\n isConfirmed = cm.trips[0].Bookings[0].Status === 1;\r\n }\r\n mybTrack.track('MYB - Booking Dashboard', {\r\n Reciepted: isConfirmed\r\n });\r\n }\r\n function bookingSelected(bookingId) {\r\n $location.path(\"dashboard/\" + cm.redirectUrlPostBookingSelect + \"/\" + bookingId);\r\n }\r\n function getCrossSellTeaserText(productType) {\r\n return resourceService.get(productType.toUpperCase() + \"_CROSSSELL_TEASER\");\r\n }\r\n function getCrossSellStartingFromText(productType) {\r\n return resourceService.get(productType.toUpperCase() + \"_CROSSSELL_STARTING_FROM\");\r\n }\r\n function getCrossSellTitle(productType) {\r\n return resourceService.get(productType.toUpperCase() + \"_CROSSSELL_TITLE\");\r\n }\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardBookingDetails = /** @class */ (function () {\r\n function DashboardBookingDetails($routeParams, dashboardBookingService, imageService, dateUtil, resourceService, paymentsService, mybTrack, authService) {\r\n this.$routeParams = $routeParams;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.imageService = imageService;\r\n this.dateUtil = dateUtil;\r\n this.resourceService = resourceService;\r\n this.paymentsService = paymentsService;\r\n this.mybTrack = mybTrack;\r\n this.authService = authService;\r\n this.ActiveTab = 'Holiday';\r\n this.hotelsRooms = [];\r\n this.hotelsRoomsEnGb = [];\r\n this.accessBooking = true;\r\n this.fallbackEn = false;\r\n this.bookingId = parseInt($routeParams['bookingId'], 10);\r\n this.bookingTypeMap = dashboardBookingService.getBookingTypeMap();\r\n this.bookingInfoItemType = dashboardBookingService.getBookingInfoItemType();\r\n if (TRPCONFIG.Domain.CultureCode !== TRPCONFIG.Domain.MYBDefaultCultureCode) {\r\n this.getFallbackEnGbData();\r\n }\r\n this.getBookingInfo();\r\n this.getBookingDetail();\r\n }\r\n DashboardBookingDetails.prototype.getBookingInfo = function () {\r\n var _this = this;\r\n this.dashboardBookingService.getBookingInfo(this.bookingId)\r\n .then(function (booking) {\r\n _this.booking = booking;\r\n _this.pah = _this.dashboardBookingService.getPahFromNotifications(booking.Notifications);\r\n _this.accessBooking = _this.canAccessBooking(booking);\r\n if (booking.BookingOptions && booking.BookingOptions.Actions) {\r\n _this.childActions = _this.dashboardBookingService\r\n .getChildActions(booking.BookingOptions.Actions, 'VIEWBOOKINGDETAILS');\r\n }\r\n });\r\n };\r\n DashboardBookingDetails.prototype.canAccessBooking = function (bnd) {\r\n var access = true;\r\n // Checks bundle has a BookingUIStatus of 'OK'\r\n if (bnd.Status !== 1) {\r\n access = false;\r\n }\r\n return access;\r\n };\r\n DashboardBookingDetails.prototype.resendEmailToLead = function () {\r\n var _this = this;\r\n this.dashboardBookingService.sendConfirmationEmail([this.leadPassengerEmail], this.bookingId).then(function (res) {\r\n _this.emailSent = true;\r\n _this.mybTrack.track('MYB - Resend Email');\r\n });\r\n ;\r\n };\r\n DashboardBookingDetails.prototype.getBookingDetail = function () {\r\n var _this = this;\r\n this.dashboardBookingService.getBookingDetail(this.bookingId, true)\r\n .then(function (data) {\r\n _this.bk = data;\r\n _this.leadPassengerEmail = data.LeadPassenger.Email;\r\n _this.hotelsRooms = [];\r\n var holidayDestinationsArr = [];\r\n var EstabTitle = '';\r\n var roomText = {};\r\n var finalTripItineraries = _this.dashboardBookingService.filterFinalBookings(data.TripItineraries);\r\n finalTripItineraries.forEach(function (t) {\r\n t.Itineraries.forEach(function (i) {\r\n /* look for the earliest date in all booked products */\r\n if (_this.holidayStartDate) {\r\n if (_this.dateUtil.compareDates(_this.holidayStartDate, i.StartDate) === 1) {\r\n _this.holidayStartDate = i.StartDate;\r\n }\r\n }\r\n else {\r\n _this.holidayStartDate = i.StartDate;\r\n }\r\n /* look for the last date in all booked products */\r\n if (_this.holidayReturnDate) {\r\n if (_this.dateUtil.compareDates(i.EndDate, _this.holidayReturnDate) === 1) {\r\n _this.holidayReturnDate = i.EndDate;\r\n }\r\n }\r\n else {\r\n _this.holidayReturnDate = i.EndDate;\r\n }\r\n });\r\n });\r\n for (var i = 0; i < data.TripItineraries.length; i++) {\r\n if (data.TripItineraries[i].BookingType === 8 && data.TripItineraries[i].BookingStatus === 2) {\r\n if (holidayDestinationsArr.indexOf(data.TripItineraries[i].Itineraries[0].Province) === -1\r\n && data.TripItineraries[i].Itineraries[0].Province) {\r\n holidayDestinationsArr.push(data.TripItineraries[i].Itineraries[0].Province);\r\n }\r\n EstabTitle = data.TripItineraries[i].Itineraries[0].EstabTitle;\r\n roomText = {\r\n numberOfRooms: data.TripItineraries[i].Itineraries.length,\r\n EstabTitle: EstabTitle,\r\n EstabId: data.TripItineraries[i].Itineraries[0].EstabId\r\n };\r\n if (!EstabTitle) {\r\n _this.fallbackEn = true;\r\n }\r\n _this.hotelsRooms.push(roomText);\r\n }\r\n }\r\n _this.holidayDestination = holidayDestinationsArr.toString();\r\n _this.holidayDestination = _this.holidayDestination.length > 1 ?\r\n _this.holidayDestination.split(',').join(', ') : _this.holidayDestination;\r\n _this.Adults = [];\r\n _this.Children = [];\r\n _this.Infants = [];\r\n data.Passengers.forEach(function (Pass) {\r\n if (Pass.TypeId === 1) {\r\n _this.Adults.push(Pass);\r\n }\r\n else if (Pass.TypeId === 2) {\r\n _this.Children.push(Pass);\r\n }\r\n else if (Pass.TypeId === 3) {\r\n _this.Infants.push(Pass);\r\n }\r\n });\r\n if (_this.holidayStartDate) {\r\n _this.daysToGo = _this.dateUtil.numberOfNights(new Date(), _this.holidayStartDate);\r\n }\r\n if (_this.holidayStartDate && _this.holidayReturnDate) {\r\n _this.nights = _this.dateUtil.numberOfNights(_this.holidayStartDate, _this.holidayReturnDate);\r\n }\r\n _this.template = data.Itineraries ?\r\n \"partials/dashboard/ItineraryTemplate?Type=\" + data.Booking.LongType.template : null;\r\n _this.displaySupplierRef = data.BalanceDueInfo ?\r\n !(data.Booking.Type === 1 && data.BalanceDueInfo.BalanceDueAmount >\r\n TRPCONFIG.Domain.SupplierRefBalanceThreshold) : true;\r\n if (data.BookedItemAndPackageCost) {\r\n _this.packageCost = (TRPCONFIG.Domain.PackagePrice || data.PackageId)\r\n && data.BookedItemAndPackageCost.PackageCost;\r\n _this.isAtolProtectedBooking = data.BookedItemAndPackageCost.IsAtolProtected;\r\n _this.bookedItems = data.BookedItemAndPackageCost.BookedItems;\r\n _this.totalPackagePrice = _this.sumCosts(_this.bookedItems);\r\n }\r\n _this.mybTrack.track('MYB - View Booking Details', {\r\n PaidInFull: _this.bk.BalanceDueInfo === null ? true : false\r\n });\r\n _.forEach(_this.bk.ClearedPayments, function (p) {\r\n p.LogoName = _.first(_this.paymentsService.getLogosList([{ Title: p.CardTypeTitle }])) || 'external';\r\n });\r\n });\r\n };\r\n DashboardBookingDetails.prototype.getFallbackEnGbData = function () {\r\n var _this = this;\r\n this.dashboardBookingService.getBookingDetail(this.bookingId, true, 'en-gb')\r\n .then(function (data) {\r\n if (TRPCONFIG.Domain.MYBDefaultCultureCodeEnable) {\r\n _this.fallbackEn = true;\r\n }\r\n _this.bk = data;\r\n var hotelData = _this.getHotelsData(data);\r\n _this.hotelsRoomsEnGb = hotelData[1];\r\n _this.holidayDestinationEnGb = hotelData[0].toString();\r\n _this.holidayDestinationEnGb = _this.holidayDestinationEnGb.length > 1 ?\r\n _this.holidayDestinationEnGb.split(',').join(', ') : _this.holidayDestinationEnGb;\r\n });\r\n };\r\n DashboardBookingDetails.prototype.getHotelsData = function (data) {\r\n var holidayDestinationsArr = [];\r\n var hotelsRooms = [];\r\n var roomText = {};\r\n for (var i = 0; i < data.TripItineraries.length; i++) {\r\n if (data.TripItineraries[i].BookingType === 8 && data.TripItineraries[i].BookingStatus === 2) {\r\n if (holidayDestinationsArr.indexOf(data.TripItineraries[i].Itineraries[0].Province) === -1\r\n && data.TripItineraries[i].Itineraries[0].Province) {\r\n holidayDestinationsArr.push(data.TripItineraries[i].Itineraries[0].Province);\r\n }\r\n roomText[data.TripItineraries[i].Itineraries[0].EstabId] = {\r\n numberOfRooms: data.TripItineraries[i].Itineraries.length,\r\n EstabTitle: data.TripItineraries[i].Itineraries[0].EstabTitle,\r\n Address: data.TripItineraries[i].Itineraries[0].Address\r\n };\r\n hotelsRooms.push(roomText);\r\n }\r\n }\r\n return [holidayDestinationsArr, hotelsRooms];\r\n };\r\n DashboardBookingDetails.prototype.getTitle = function (id) {\r\n if (this.hotelsRoomsEnGb && this.hotelsRoomsEnGb[0][id] && this.hotelsRoomsEnGb[0][id].EstabTitle) {\r\n return this.hotelsRoomsEnGb[0][id].EstabTitle;\r\n }\r\n };\r\n DashboardBookingDetails.prototype.actionClick = function (action, bk) {\r\n this.dashboardBookingService.actionClick(action, bk);\r\n };\r\n DashboardBookingDetails.prototype.getResourceValue = function (resource) {\r\n return this.resourceService.get(resource);\r\n };\r\n DashboardBookingDetails.prototype.getPaymentTitle = function (payment) {\r\n return \"\" + (payment.CardTypeTitle != null ?\r\n payment.CardTypeTitle : payment.Title != null ? payment.Title : '');\r\n };\r\n DashboardBookingDetails.prototype.sumCosts = function (costs) {\r\n return (costs || []).reduce(function (sum, cost) {\r\n sum.total += (cost.Quantity * cost.UnitAmount);\r\n sum.netTotal += (cost.Quantity * cost.NetUnitAmount);\r\n sum.totalTravelAgentCommission += (cost.Quantity * cost.TravelAgentCommission);\r\n return sum;\r\n }, { total: 0, netTotal: 0, totalTravelAgentCommission: 0 });\r\n };\r\n DashboardBookingDetails.prototype.signOut = function () {\r\n this.authService.signOut();\r\n };\r\n return DashboardBookingDetails;\r\n }());\r\n Dashboard.DashboardBookingDetails = DashboardBookingDetails;\r\n angular\r\n .module('dashboard')\r\n .controller('DashboardBookingDetails', DashboardBookingDetails);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('ResendVoucher', ResendVoucher);\r\n function ResendVoucher(dashboardBookingService, $routeParams, $rootScope, resourceService) {\r\n var cm = this;\r\n var bookingId = $routeParams.bookingId;\r\n cm.sendConfirmationEmail = sendConfirmationEmail;\r\n var validEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n dashboardBookingService.getContact(bookingId).then(function (contactDetail) {\r\n cm.Emails = contactDetail.data.Email;\r\n });\r\n dashboardBookingService.getBookingInfo(bookingId).then(function (booking) {\r\n cm.bk = booking;\r\n });\r\n function sendConfirmationEmail() {\r\n var emailsArray = cm.Emails.split(',');\r\n for (var i = emailsArray.length - 1; i >= 0; i--) {\r\n var email = emailsArray[i].trim();\r\n if (!validEmail.test(email)) {\r\n $rootScope.$broadcast('flash:error', String.format(resourceService.get('VOUCHERINVALID'), email));\r\n return;\r\n }\r\n }\r\n dashboardBookingService.sendConfirmationEmail(emailsArray, bookingId).then(function () {\r\n //$rootScope.$broadcast('flash:success', resourceService.get('VOUCHERSENT'));\r\n cm.isEmailSent = true;\r\n }, function () {\r\n $rootScope.$broadcast('flash:error', resourceService.get('VOUCHERSENTERROR'));\r\n });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('DashboardReview', DashboardReview);\r\n function DashboardReview($q, $location, $routeParams, dashboardService, dashboardReviewService, dashboardBookingService, preferences, dateUtil, imageService, reviewService, scrollService, broker, action, resourceService, mybTrack, currentUser) {\r\n var cm = this;\r\n cm.bookingReviewStatus = {\r\n CannotLeaveReview: 0,\r\n CanLeaveReview: 1,\r\n HasLeftReview: 2\r\n };\r\n cm.showMoreReviews = showMoreReviews;\r\n cm.getRatingTitleText = getRatingTitleText;\r\n cm.saveReview = saveReview;\r\n cm.editReview = dashboardReviewService.editReview;\r\n cm.ratingRange = dashboardReviewService.ratingRange;\r\n cm.sutabilityAnswers = dashboardReviewService.sutabilityAnswers;\r\n cm.recommendTRPAnswers = dashboardReviewService.recommendTRPAnswers;\r\n cm.recommendTRPChange = dashboardReviewService.recommendTRPChange;\r\n cm.reviewLater = reviewLater;\r\n cm.reviews = [];\r\n cm.limitToNumber = 10;\r\n cm.reviewsPage = 0; //--for client pagination\r\n cm.loadingReviews = true;\r\n cm.loadingHotelReviews = true;\r\n cm.reviewsVisibleCount = 0;\r\n cm.sortOptions = dashboardReviewService.getReviewSortCriteria();\r\n cm.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n cm.showBookingBreadcrumb = 'review-hotel' === action;\r\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\r\n cm.hideHotelHeader = true;\r\n if (action !== 'review-submitted') {\r\n mybTrack.track('MYB - My Reviews');\r\n var urlSource = $location.search().source ? $location.search().source : 'MYB';\r\n if (!($routeParams.userId && $routeParams.token && urlSource === 'MYB')) {\r\n // the extra condition is a work around, because url from email reloads the page twice,\r\n // so to ignore the tracking in second reload, using this condition, Will remove the condition when the reloading issue is fixed\r\n mybTrack.track('HotelReviewForm Landing', { source: urlSource });\r\n }\r\n }\r\n $q.all([dashboardReviewService.getRatingTitles(), dashboardReviewService.getStatements()]).then(function () {\r\n cm.reviewEnable = true;\r\n var objectId = $routeParams.objectId;\r\n if (action === 'review-hotel') {\r\n //not great but we want to follow a slightly different path if we are doing a non authenticated booking\r\n if ($routeParams.bookingId && $routeParams.userId && $routeParams.token) {\r\n //we need to have a booking id, user id and token\r\n _checkEnterReviewPage($routeParams.bookingId, $routeParams.token, $routeParams.userId);\r\n $location.search({});\r\n cm.showBookingBreadcrumb = false;\r\n }\r\n else {\r\n _checkEnterReviewPage($routeParams.bookingId, null, null);\r\n }\r\n }\r\n else if (action === 'review-submitted' && !objectId) {\r\n dashboardBookingService.getBookingInfo($routeParams.bookingId).then(function (bk) {\r\n if (bk.Type === cm.bookingType.accommodation) {\r\n _reviewPageFactory(bk.ObjectId, $routeParams.bookingId, null, null);\r\n }\r\n else {\r\n cm.reviewStatus = cm.bookingReviewStatus.CannotLeaveReview;\r\n cm.notHotelBooking = true;\r\n }\r\n });\r\n }\r\n else {\r\n _reviewPageFactory(objectId, $routeParams.bookingId, null, null);\r\n }\r\n });\r\n //for default sort by likes\r\n cm.sortoption = cm.sortOptions[1].val;\r\n cm.showUnreviewedHotels = true;\r\n cm.reviewNow = reviewNow;\r\n cm.cancelReview = cancelReview;\r\n cm.selectVisitedHotel = selectVisitedHotel;\r\n function _reviewPageFactory(objectId, bookingId) {\r\n var user = currentUser.get();\r\n if (action === 'review-submitted') {\r\n _prepareReviewCompletePage(bookingId, objectId);\r\n }\r\n else if (user && user.HardSignedIn) {\r\n _processDashboardAggregateData();\r\n }\r\n else {\r\n _errorCallback();\r\n }\r\n }\r\n function _errorCallback() {\r\n cm.loadingReviews = false;\r\n cm.reviewsLoadError = true;\r\n }\r\n function _checkEnterReviewPage(bookingId, token, userId) {\r\n var dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\r\n var processData = function (data) {\r\n //do some checks to make sure the review hasn't already been submitted / they can leave a review\r\n var getSelectedHotelInfo = function (reviewData) {\r\n var estabId = reviewData.EstabId;\r\n return dashboardService.getHotelsById([estabId]).then(function (hotels) {\r\n return {\r\n EstablishmentDetail: hotels[0],\r\n ImageUrl: imageService.getMainImageUrl(estabId, dim, dim),\r\n BookingDetail: {\r\n StartDate: reviewData.CheckInDate,\r\n BookingRef: reviewData.BookingRef,\r\n BookingId: bookingId,\r\n LeadPassengerContact: {\r\n Title: reviewData.LeadContact.Title,\r\n FirstName: reviewData.LeadContact.FirstName,\r\n Surname: reviewData.LeadContact.LastName\r\n }\r\n },\r\n reviewSaved: false\r\n };\r\n });\r\n };\r\n var status = data.ReviewStatus;\r\n if (status === reviewService.reviewStatus.CanLeaveReview) {\r\n getSelectedHotelInfo(data).then(function (selectedHotel) {\r\n cm.selectedHotel = selectedHotel;\r\n cm.feedback = dashboardReviewService.getBookingFeedback();\r\n cm.hideHotelHeader = false;\r\n });\r\n }\r\n else if (status === reviewService.reviewStatus.HasLeftReview) {\r\n var user = currentUser.get();\r\n if (user && user.SignedIn) {\r\n $q.all([\r\n dashboardReviewService.getReview(bookingId),\r\n getSelectedHotelInfo(data)\r\n ]).then(function (results) {\r\n cm.existingReview = results[0];\r\n cm.selectedHotel = results[1];\r\n cm.hideHotelHeader = false;\r\n });\r\n }\r\n }\r\n cm.reviewStatus = status;\r\n };\r\n //we need to make different calls depending on what params we have\r\n if (token && userId) {\r\n reviewService.getReviewDetailsUsingToken(bookingId, token, userId).then(function (d) { return processData(d); });\r\n }\r\n else {\r\n reviewService.getReviewDetails(bookingId).then(function (d) { return processData(d); });\r\n }\r\n }\r\n function _prepareReviewHeader(bookingId, objectId) {\r\n dashboardReviewService.getReviewHeaderData(bookingId, objectId).then(function (result) {\r\n cm.loadingReviewHeader = false;\r\n cm.selectedHotel = result;\r\n if (!cm.selectedHotel.EstablishmentDetail) {\r\n $location.path('dashboard/reviews');\r\n }\r\n });\r\n }\r\n function _processDashboardAggregateData() {\r\n dashboardService.getAggregate().then(function (result) {\r\n _splitByReviewed(result);\r\n cm.reviewsVisibleCount = ((cm.reviews.length / cm.limitToNumber) > 1 ? cm.limitToNumber : cm.reviews.length);\r\n _prepareMyReviewPageData(cm.unreviewedHotels[0]);\r\n }, _errorCallback);\r\n }\r\n function _prepareMyReviewPageData(unreviewedHotel) {\r\n if (unreviewedHotel) {\r\n _canShowUnreviewedHotels().then(function (result) {\r\n cm.loadingReviews = false;\r\n cm.showUnreviewedHotels = result;\r\n cm.selectedHotel = unreviewedHotel;\r\n cm.selectedHotel.BookingDetail.BookingRef = cm.selectedHotel.BookingDetail.BookingType + \"/\" + cm.selectedHotel.BookingDetail.BookingId;\r\n cm.feedback = dashboardReviewService.getBookingFeedback();\r\n cm.selectedHotelIndex = 0;\r\n cm.reviewStatus = cm.bookingReviewStatus.CanLeaveReview;\r\n cm.reviewLaterEnable = true;\r\n cm.hideHotelHeader = false;\r\n }, _errorCallback);\r\n }\r\n else {\r\n cm.loadingReviews = false;\r\n }\r\n }\r\n function _prepareReviewCompletePage(bookingId, objectId) {\r\n if (bookingId) {\r\n //get review site details\r\n dashboardReviewService.getReviewSiteDetails(bookingId).then(function (result) {\r\n cm.reviewSiteDetails = result;\r\n cm.reviewSiteDetails.Image = \"/build/img/otherlogo\" + result.Image.substr(result.Image.lastIndexOf('/'));\r\n });\r\n if (objectId) {\r\n _prepareReviewHeader(bookingId, objectId);\r\n reviewService.getReviews({ Id: objectId }, 0).then(function (result) {\r\n cm.hotelReviews = result.reviews;\r\n cm.loadingHotelReviews = false;\r\n });\r\n }\r\n }\r\n }\r\n function saveReview() {\r\n dashboardReviewService.saveReview(cm.selectedHotel, cm.feedback, $routeParams.token, $routeParams.userId)\r\n .then(function (result) {\r\n if (result) {\r\n broker.publish('reviewEntered');\r\n mybTrack.track('MYB - Review submitted', { UserRating: cm.feedback.rating });\r\n //goto submitted review page\r\n $location.path(\"dashboard/reviews/submitted/\" + cm.selectedHotel.BookingDetail.BookingId + \"/\" + cm.selectedHotel.EstablishmentDetail.Id);\r\n }\r\n else {\r\n scrollService.scrollTo('#reviews-container');\r\n }\r\n });\r\n }\r\n function _splitByReviewed(aggregate) {\r\n //Reviewed Hotels\r\n cm.reviews = aggregate.reviews;\r\n cm.ReviewAggregates = {\r\n TotalReviews: cm.reviews.length,\r\n TotalLikeCount: countLikes()\r\n };\r\n //Unreviewed Hotels\r\n aggregate.estabs.UnreviewedHotels.sort(_dateSortReview);\r\n cm.unreviewedHotels = angular.copy(aggregate.estabs.UnreviewedHotels);\r\n cm.reviewedHotels = angular.copy(aggregate.estabs.ReviewedHotels);\r\n }\r\n function _dateSortReview(a, b) {\r\n var aDate = new Date(a.BookingDetail.EndDate);\r\n var bDate = new Date(b.BookingDetail.EndDate);\r\n return aDate >= bDate ? -1 : aDate < bDate ? 1 : 0;\r\n }\r\n function countLikes() {\r\n var likeCount = 0;\r\n angular.forEach(cm.reviews, function (review) {\r\n likeCount += review.LikeCount;\r\n });\r\n return likeCount;\r\n }\r\n function showMoreReviews() {\r\n cm.reviewsPage += 1;\r\n var count = cm.limitToNumber * (cm.reviewsPage + 1);\r\n cm.reviewsVisibleCount = ((cm.reviews.length / count) > 1 ? (count) : cm.reviews.length);\r\n }\r\n function getRatingTitleText(n) {\r\n return dashboardReviewService.getRatingTitleText(n);\r\n }\r\n function _canShowUnreviewedHotels() {\r\n return preferences.get('reviewReminder').then(function (reminderDate) {\r\n return !(reminderDate && dateUtil.parseDate(reminderDate) > new Date());\r\n });\r\n }\r\n function reviewLater() {\r\n cm.showUnreviewedHotels = false;\r\n var dt = dateUtil.todayPlus(0, TRPCONFIG.Domain.ReviewReminderHours, true);\r\n preferences.set('reviewReminder', dt);\r\n scrollService.scrollTo('#reviews-container');\r\n }\r\n function reviewNow() {\r\n $location.path(\"review-hotel/\" + cm.selectedHotel.BookingDetail.BookingId);\r\n }\r\n function cancelReview() {\r\n $location.path('dashboard/reviews');\r\n }\r\n function selectVisitedHotel(index) {\r\n cm.selectedHotel = cm.unreviewedHotels[index];\r\n cm.selectedHotelIndex = index;\r\n }\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardSeatSelection = /** @class */ (function (_super) {\r\n __extends(DashboardSeatSelection, _super);\r\n function DashboardSeatSelection($location, $q, $routeParams, $scope, $window, broker, customCurrencyFilter, dashboardBookingService, flightExtrasService, mybTrack, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, rootPath, urlUtils, dateUtil, currentUser) {\r\n var _this = _super.call(this, $location, $q, $routeParams, $scope, $window, broker, customCurrencyFilter, dashboardBookingService, flightExtrasService, mybTrack, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, rootPath, urlUtils, dateUtil, currentUser) || this;\r\n _this.$location = $location;\r\n _this.$q = $q;\r\n _this.$routeParams = $routeParams;\r\n _this.$scope = $scope;\r\n _this.$window = $window;\r\n _this.broker = broker;\r\n _this.customCurrencyFilter = customCurrencyFilter;\r\n _this.dashboardBookingService = dashboardBookingService;\r\n _this.flightExtrasService = flightExtrasService;\r\n _this.mybTrack = mybTrack;\r\n _this.paymentDetailsService = paymentDetailsService;\r\n _this.paymentsService = paymentsService;\r\n _this.paymentsUtilService = paymentsUtilService;\r\n _this.resourceService = resourceService;\r\n _this.rootPath = rootPath;\r\n _this.urlUtils = urlUtils;\r\n _this.dateUtil = dateUtil;\r\n _this.currentUser = currentUser;\r\n return _this;\r\n }\r\n DashboardSeatSelection.prototype.selectSeats = function (seats, seatsPostAdd) {\r\n this.selectedSeats = seatsPostAdd;\r\n };\r\n DashboardSeatSelection.prototype.getSelectedSeats = function () {\r\n return [];\r\n };\r\n DashboardSeatSelection.prototype.analyticsTrackOpenOption = function () {\r\n this.mybTrack.track('MYB - Add Seats Payment', {\r\n PaymentMethod: this.paymentMethodText[this.paymentTab] || '',\r\n Source: this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\r\n SuplierIds: this.supplierIds\r\n });\r\n };\r\n DashboardSeatSelection.prototype.getConfig = function () {\r\n return {\r\n completeUrl: 'dashboard/seat-selection/complete/{0}',\r\n optionsType: 'SeatPlan',\r\n availableOptionsBinding: 'seatPlan',\r\n selectedOptionsBinding: 'selectedSeats',\r\n selectedOptionsRequest: 'SelectedSeats',\r\n analyticsTag: 'MYB - Open Add Seats',\r\n pageUrl: 'dashboard/seat-selection'\r\n };\r\n };\r\n DashboardSeatSelection.prototype.canAddOption = function (optionsData) {\r\n return !!(optionsData && optionsData.CanAddSeats);\r\n };\r\n return DashboardSeatSelection;\r\n }(Dashboard.AddOption));\r\n angular\r\n .module('dashboard')\r\n .controller('DashboardSeatSelection', DashboardSeatSelection);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('DashboardSettings', Settings);\r\n function Settings($rootScope, $scope, userSettingsService, preferences, currentUser, authService, resourceService, arrayUtil, broker, paymentDetailsService, paymentsService, tokeniser, $timeout, $q, mybTrack) {\r\n var cm = this;\r\n var thisYear = new Date().getFullYear();\r\n var confirmed = false;\r\n cm.starRatings = userSettingsService.getStarRatings();\r\n cm.smokingRoom = userSettingsService.getSmokingRoomOptions();\r\n cm.footerToolbar = userSettingsService.getFooterToolbarOptions();\r\n cm.flightClass = userSettingsService.getFlightClassOptions();\r\n cm.hotelSortOrder = userSettingsService.getHotelCriteria();\r\n cm.flightSortOrder = userSettingsService.getFlightCriteria();\r\n cm.priceMode = userSettingsService.getPricMode();\r\n cm.titles = userSettingsService.getAdultTitles();\r\n cm.canceledBooking = userSettingsService.getCanceledBookingOprions();\r\n cm.savePreferences = saveUserPreferences;\r\n cm.cancelPreferences = cancelPreferences;\r\n cm.openChangePasswordPanel = openChangePasswordPanel;\r\n cm.closeChangePassword = closeChangePassword;\r\n cm.openChangeEmailPanel = openChangeEmailPanel;\r\n cm.changeContactDetails = changeContactDetails;\r\n cm.openEditContact = openEditContact;\r\n cm.changeEmail = changeEmail;\r\n cm.closeChangeEmail = closeChangeEmail;\r\n cm.changePassword = changePassword;\r\n cm.confirmRemoveCard = confirmRemoveCard;\r\n cm.closeEditRemoveCard = closeEditRemoveCard;\r\n cm.addCardDetails = addCardDetails;\r\n cm.addNewCard = addNewCard;\r\n cm.removeCard = removeCard;\r\n cm.cancelLoginDetailsChange = cancelLoginDetailsChange;\r\n cm.user = $rootScope.user;\r\n cm.months = arrayUtil.numberArray(1, 12);\r\n cm.years = arrayUtil.numberArray(thisYear, thisYear + 20);\r\n cm.deleteAccount = deleteAccount;\r\n cm.deleteButton = resourceService.getDeferred('DELETEACCOUNT');\r\n cm.deleteAccountConfirmed = deleteAccountConfirmed;\r\n cm.closeConfirmDeleteAccount = closeConfirmDeleteAccount;\r\n cm.showConfirmDeleteAccount = showConfirmDeleteAccount;\r\n cm.padZero = padZero;\r\n cm.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n var prefrenceOptionsMap = {\r\n starRatings: cm.starRatings,\r\n flightSortOrder: cm.flightSortOrder,\r\n hotelSortOrder: cm.hotelSortOrder,\r\n smokingRoom: cm.smokingRoom,\r\n priceMode: cm.priceMode,\r\n footerToolbar: cm.footerToolbar,\r\n flightClass: cm.flightClass,\r\n canceledBooking: cm.canceledBooking\r\n };\r\n var savedFrom = {\r\n SettingsTab: 1,\r\n BookingForm: 2\r\n };\r\n var userPreferenceBeforeChange = null;\r\n mybTrack.track('MYB - My Settings');\r\n function getPreferences() {\r\n var prefs = {};\r\n prefs.starRatings = cm.starRatings[0];\r\n prefs.flightSortOrder = cm.flightSortOrder[0];\r\n prefs.hotelSortOrder = cm.hotelSortOrder[0];\r\n prefs.smokingRoom = cm.smokingRoom[0];\r\n prefs.footerToolbar = cm.footerToolbar[1];\r\n prefs.priceMode = cm.priceMode[0];\r\n prefs.flightClass = cm.flightClass[0];\r\n prefs.canceledBooking = cm.smokingRoom[1];\r\n return preferences.getAllPreferences(cm.user).then(function (result) {\r\n prefs = organiseUserPreferenceData(prefs, result);\r\n userPreferenceBeforeChange = angular.copy(prefs);\r\n return prefs;\r\n });\r\n }\r\n getPreferences().then(function (p) { cm.userPreferences = p; });\r\n function savePreferences(prefs) {\r\n var prefsToBeSaved = {};\r\n angular.forEach(prefs, function (v, k) {\r\n prefsToBeSaved[k] = v.val instanceof Array ? v.val[0] : v.val;\r\n });\r\n preferences.setAllPreferences(prefsToBeSaved, cm.user).then(function () {\r\n cm.userPreferences = organiseUserPreferenceData(cm.userPreferences, prefsToBeSaved);\r\n userPreferenceBeforeChange = angular.copy(cm.userPreferences);\r\n cm.editHotelPref = false;\r\n cm.editFlightPref = false;\r\n cm.editSitePref = false;\r\n });\r\n }\r\n function saveUserPreferences() {\r\n if (cm.userPreferences.footerToolbar !== userPreferenceBeforeChange.footerToolbar) {\r\n broker.publish('footerToolbarChanged', cm.userPreferences.footerToolbar.val);\r\n }\r\n savePreferences(cm.userPreferences);\r\n }\r\n function cancelPreferences() {\r\n angular.forEach((userPreferenceBeforeChange), function (value, key) {\r\n var arrayToLook = prefrenceOptionsMap[key];\r\n var index = arrayUtil.indexOf(arrayToLook, function (item) {\r\n var itemVal = item.val instanceof Array ? item.val[0] : item.val;\r\n var valueVal = value.val instanceof Array ? value.val[0] : value.val;\r\n return itemVal === valueVal;\r\n });\r\n cm.userPreferences[key] = arrayToLook[index];\r\n });\r\n cm.editHotelPref = false;\r\n cm.editFlightPref = false;\r\n cm.editSitePref = false;\r\n }\r\n function organiseUserPreferenceData(prefs, userPreferences) {\r\n for (var key in prefs) {\r\n setModelForPreference(key, prefs, userPreferences);\r\n }\r\n return prefs;\r\n }\r\n function setModelForPreference(key, prefs, userPreferences) {\r\n var arrayToLook = prefrenceOptionsMap[key];\r\n if (arrayToLook && userPreferences[key] !== undefined) {\r\n for (var i = 0; i < arrayToLook.length; i++) {\r\n var checkVal = arrayToLook[i].val instanceof Array ? arrayToLook[i].val[0] : arrayToLook[i].val;\r\n if (userPreferences[key].toString() === checkVal.toString()) {\r\n prefs[key] = arrayToLook[i];\r\n break;\r\n }\r\n }\r\n }\r\n else if (arrayToLook) {\r\n prefs[key] = arrayToLook[0];\r\n }\r\n }\r\n function openChangePasswordPanel() {\r\n cm.showChangePassword = true;\r\n }\r\n function closeChangePassword() {\r\n cm.showChangePassword = false;\r\n }\r\n function openChangeEmailPanel() {\r\n cm.userEdit = angular.copy(cm.user);\r\n cm.showChangeEmail = true;\r\n }\r\n function closeChangeEmail() {\r\n cm.showChangeEmail = false;\r\n }\r\n function changeContactDetails() {\r\n authService.changeContactDetails(cm.userEdit).then(function () {\r\n cm.editContact = false;\r\n currentUser.set(cm.userEdit);\r\n $rootScope.user = currentUser.get();\r\n cm.user = $rootScope.user;\r\n });\r\n }\r\n function openEditContact() {\r\n cm.editContact = true;\r\n cm.userEdit = angular.copy(cm.user);\r\n }\r\n function changeEmail(model) {\r\n authService.changeEmail({\r\n Password: model.currentPassword,\r\n NewEmail: model.email\r\n }).then(function (res) {\r\n if (res.Result !== 0) {\r\n $scope.$broadcast('flash:error', resourceService.get('CHANGEEMAILFAILURE'));\r\n }\r\n });\r\n }\r\n function changePassword(model) {\r\n authService.changePassword({\r\n Password: model.currentPassword,\r\n NewPassword: model.newPassword\r\n }).then(function (res) {\r\n if (res.Result === 0) {\r\n $scope.$broadcast('flash:success', resourceService.get('CHANGEPASSWORDSUCCESS'));\r\n closeChangePassword();\r\n }\r\n else {\r\n $scope.$broadcast('flash:error', resourceService.get('CHANGEPASSWORDFAILURE'));\r\n }\r\n });\r\n }\r\n function cancelLoginDetailsChange() {\r\n cm.showChangeEmail = false;\r\n cm.showChangePassword = false;\r\n cm.changeEmailModel = null;\r\n cm.changePasswordModel = null;\r\n $scope.$broadcast('flash:hide');\r\n }\r\n broker.subscribe('dashboardSettingsCtrl', 'footerToolbarChanged', function (ev) {\r\n cm.userPreferences.footerToolbar = ev.data ? cm.footerToolbar[0] : cm.footerToolbar[1];\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('dashboardSettingsCtrl', 'footerToolbarChanged');\r\n });\r\n function confirmRemoveCard(card) {\r\n card.showConfirmRemoveCard = true;\r\n }\r\n function closeEditRemoveCard(card) {\r\n card.showConfirmRemoveCard = false;\r\n }\r\n function _refreshPaymentCards() {\r\n paymentDetailsService.getPaymentCards().then(function (result) {\r\n cm.paymentCards = result;\r\n });\r\n }\r\n function addNewCard() {\r\n cm.addCard = true;\r\n cm.cardChangedTo = undefined;\r\n cm.paymentSuccess = false;\r\n }\r\n function addCardDetails(card) {\r\n var today = new Date();\r\n if (card.ExpiryDate.Year === today.getFullYear() && card.ExpiryDate.Month < today.getMonth() + 1) {\r\n cm.CardHasExpired = true;\r\n }\r\n else {\r\n cm.addingCard = true;\r\n cm.CardHasExpired = false;\r\n paymentsService.addCardDetails(card, savedFrom.SettingsTab).then(function () {\r\n cm.addCard = false;\r\n cm.newCard = null;\r\n cm.addingCard = false;\r\n _refreshPaymentCards();\r\n cm.paymentSuccess = true;\r\n $timeout(function () {\r\n cm.paymentSuccess = false;\r\n }, 5000);\r\n });\r\n }\r\n }\r\n function removeCard(card) {\r\n paymentsService.removeCard(card.CardId).then(function () {\r\n _refreshPaymentCards();\r\n closeEditRemoveCard(card);\r\n });\r\n }\r\n if (TRPCONFIG.Domain.SavedCardsEnabled) {\r\n var uniqueMasterCards = true; // if uniqueMasterCards is requested. return unique types with respect to MasterdCardId.\r\n paymentDetailsService.getPaymentTypes(uniqueMasterCards).then(function (result) {\r\n cm.paymentTypes = result;\r\n });\r\n paymentDetailsService.getPaymentTypes().then(function (result) {\r\n cm.allPaymentTypes = result;\r\n });\r\n _refreshPaymentCards();\r\n }\r\n cm.generateTokens = function () {\r\n //figure out if we need to generate tokens and if there should be an expiry\r\n //if pci compliant\r\n var requireTokens = TRPCONFIG.Domain.PCICompliant;\r\n var newCard = cm.newCard || { ExpiryDate: {} };\r\n var month = newCard.ExpiryDate ? newCard.ExpiryDate.Month : null;\r\n var year = newCard.ExpiryDate ? newCard.ExpiryDate.Year : null;\r\n var expiryDate = month != null && year != null ? new Date(year, month) : null;\r\n if (!expiryDate) {\r\n return $q.when(); //no point tokenising because the form is not valid\r\n }\r\n if (requireTokens) {\r\n return tokeniser.execute(expiryDate ? expiryDate.toISOString() : null);\r\n }\r\n return $q.when();\r\n };\r\n cm.checkCreditCardNumber = function (cardNumber) {\r\n cm.cardChangedTo = undefined;\r\n if (!cardNumber) {\r\n return;\r\n }\r\n paymentsService\r\n .checkCardNumber(cm.allPaymentTypes, cardNumber, cm.newCard.paymentType)\r\n .then(undefined, function setCorrectCard(correctId) {\r\n for (var i = 0; i < cm.allPaymentTypes.length; i++) {\r\n if (cm.allPaymentTypes[i].CardTypeId === correctId && cm.newCard.paymentType !== cm.allPaymentTypes[i].MasterCardTypeId) {\r\n cm.newCard.paymentType = cm.allPaymentTypes[i].MasterCardTypeId;\r\n cm.cardChangedTo =\r\n paymentsService.getCardTitle(cm.allPaymentTypes, correctId);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n cm.updateCardType = function () {\r\n cm.newCard.CardNumber = undefined;\r\n cm.cardChangedTo = undefined;\r\n };\r\n function deleteAccount(password) {\r\n if (!confirmed) {\r\n cm.deleteButton = resourceService.getDeferred('CONFIRMDELETE');\r\n confirmed = true;\r\n return;\r\n }\r\n authService.deleteAccount({\r\n Password: password\r\n }).then(function (resp) {\r\n if (!resp.Success) {\r\n cm.deleteButton = resourceService.getDeferred('DELETEACCOUNT');\r\n confirmed = false;\r\n cm.showconfirmDeleteAccount = false;\r\n $scope.$broadcast('flash:error', resourceService.get('DELETEACCOUNTFAILURE'));\r\n }\r\n });\r\n }\r\n function deleteAccountConfirmed(password) {\r\n confirmed = true;\r\n deleteAccount(password);\r\n }\r\n function showConfirmDeleteAccount() {\r\n cm.showconfirmDeleteAccount = true;\r\n $scope.$broadcast('flash:hide');\r\n }\r\n function closeConfirmDeleteAccount() {\r\n cm.showconfirmDeleteAccount = false;\r\n confirmed = false;\r\n }\r\n function padZero(n) {\r\n return (n < 10) ? (\"0\" + n) : n;\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('MemberDetails', MemberDetails);\r\n function MemberDetails($rootScope, dashboardNotificationService) {\r\n var md = this;\r\n md.user = $rootScope.user;\r\n //Notifications\r\n md.notificationClicked = function (notification) { return dashboardNotificationService.notificationClicked(notification); };\r\n md.formatNotification = function (notification) { return dashboardNotificationService.formatNotification(notification); };\r\n dashboardNotificationService.getNotifications().then(function (data) { return md.alerts = data; });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('dashboard').controller('OnlineCheckin', OnlineCheckin);\r\n function OnlineCheckin(onlineCheckinService, arrayUtil, $routeParams, $scope, resourceService, $rootScope, dashboardBookingService) {\r\n var cm = this;\r\n cm.legs = [];\r\n cm.SupplierConditionsList = [];\r\n cm.bookingId = $routeParams.bookingId;\r\n cm.checkinSelected = false;\r\n cm.loadingCheckinOptions = true;\r\n cm.checkinInProgress = false;\r\n cm.checkinError = false;\r\n cm.showProceedBtn = false;\r\n cm.checkedInLegs = 0;\r\n cm.legCheckinAllSelected = legCheckinAllSelected;\r\n cm.printBoardingPass = printBoardingPass;\r\n cm.doCheckin = doCheckin;\r\n $rootScope.lockScreen($scope, {\r\n title: resourceService.get('ONLINECHECKIN_FETCHINGCHECKININFO'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-onlineCheckinCtrl'\r\n });\r\n dashboardBookingService.getBookingInfo($routeParams.bookingId).then(function (booking) {\r\n cm.booking = booking;\r\n });\r\n onlineCheckinService.getOnlineCheckinOptions(cm.bookingId).then(function (result) {\r\n cm.loadingCheckinOptions = false;\r\n $rootScope.unlockScreen($scope);\r\n cm.bookingRef = result.BookingRef;\r\n cm.leadPassengerLastname = result.LeadPassengerLastName;\r\n angular.forEach(result.Legs, function (leg) {\r\n leg.checkinAll = false;\r\n leg.showSeatWarning = false;\r\n if (leg.CheckinState === 'Available') {\r\n cm.showProceedBtn = true;\r\n leg.checkinAll = true;\r\n if (leg.SupplierConditions) {\r\n _formatSupplierConditions(leg.SupplierConditions, leg.LegType);\r\n }\r\n }\r\n else if (leg.CheckinState === 'CheckedIn') {\r\n cm.checkedInLegs++;\r\n }\r\n angular.forEach(leg.Passengers, function (passenger) {\r\n if (passenger.OptionalCharges) {\r\n passenger.OptionalCharges[0].Quantity = null;\r\n var maxQuantity = passenger.OptionalCharges[0].MaximumQuantity;\r\n if (maxQuantity > 0) {\r\n passenger.showBaggageSelection = true;\r\n passenger.maxBags = arrayUtil.numberArray(0, passenger.OptionalCharges[0].MaximumQuantity);\r\n }\r\n }\r\n if (passenger.SeatSelections) {\r\n passenger.seats = passenger.SeatSelections.join(', ');\r\n }\r\n else {\r\n leg.showSeatWarning = true;\r\n }\r\n });\r\n cm.checkinSelected = cm.checkinSelected || leg.checkinAll;\r\n });\r\n if (result.Legs) {\r\n cm.legs = result.Legs;\r\n }\r\n });\r\n function _formatSupplierConditions(conditions, legType) {\r\n var supplierConditions = { header: '', text: [] };\r\n supplierConditions.header = legType.toLowerCase();\r\n if (conditions.indexOf('\\n') !== -1) {\r\n supplierConditions.text = conditions.split('\\n');\r\n supplierConditions.text.pop();\r\n }\r\n else {\r\n supplierConditions.text[0] = conditions;\r\n }\r\n cm.SupplierConditionsList.push(supplierConditions);\r\n }\r\n cm.showBagsError = false;\r\n function doCheckin() {\r\n if (!cm.checkinSelected) {\r\n return false;\r\n }\r\n var legsToCheckin = arrayUtil.filter(cm.legs, function (leg) {\r\n return leg.checkinAll;\r\n });\r\n angular.forEach(legsToCheckin, function (leg) {\r\n angular.forEach(leg.Passengers, function (passenger) {\r\n if (passenger.OptionalCharges) {\r\n if (passenger.OptionalCharges[0].Quantity === null) {\r\n cm.showBagsError = true;\r\n }\r\n }\r\n });\r\n });\r\n if (cm.showBagsError) {\r\n return false;\r\n }\r\n cm.checkinInProgress = true;\r\n onlineCheckinService.doCheckin(cm.bookingId, legsToCheckin).then(function (data) {\r\n cm.checkinInProgress = false;\r\n if (data.Result === 'Success') {\r\n angular.forEach(legsToCheckin, function (leg) {\r\n leg.CheckinState = 'CheckedIn';\r\n onlineCheckinService.getCheckinType(leg);\r\n leg.checkinAll = false;\r\n legCheckinAllSelected();\r\n });\r\n }\r\n else {\r\n cm.checkinError = true;\r\n }\r\n });\r\n }\r\n function legCheckinAllSelected() {\r\n cm.showBagsError = false;\r\n cm.checkinSelected = false;\r\n angular.forEach(cm.legs, function (leg) {\r\n cm.checkinSelected = cm.checkinSelected || leg.checkinAll;\r\n });\r\n }\r\n function printBoardingPass(leg) {\r\n window.open(\"/api2/flightscheckin/boardingpass?bookingId=\" + cm.bookingId + \"&leg=\" + leg.LegType, '', 'width=768, height=700, location=no');\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('PayBalance', PayBalance);\r\n function PayBalance($scope, $q, $routeParams, $location, $timeout, broker, rootPath, dashboardBookingService, paymentDetailsService, paymentsService, paymentsUtilService, resourceService, urlUtils, mybTrack, currentUser) {\r\n var cm = this;\r\n var threeDSecure = null;\r\n var root = urlUtils.getOrigin() + rootPath.getRootPath();\r\n var completeUrl = 'dashboard/pay-balance/complete/{0}';\r\n var bookingReferenceUrl = 'dashboard/bookings/reference/{0}';\r\n var payPalCallbackUrl = '{0}paybalancepaypalcallback?paymentId={1}&bookingId={2}&ppResp={3}';\r\n var cpgStatusApiEnabled = TRPCONFIG.Domain.CpgStatusApiEnabled;\r\n var cpgStatusStartPollingDelay = TRPCONFIG.Domain.CpgStatusStartPollingDelay;\r\n cm.bookingId = parseInt($routeParams.bookingId);\r\n cm.threedsRedirecting = false;\r\n cm.payFull = true;\r\n mybTrack.track('MYB - Open Pay Balance', {\r\n ReferralMethod: $routeParams.ReferralMethod\r\n });\r\n cm.paymentModel = paymentsUtilService.createEmptyPaymentModel();\r\n dashboardBookingService.getBookingInfo(cm.bookingId).then(function (booking) {\r\n cm.bk = booking;\r\n });\r\n //Get booking detail for the common ManageHeader\r\n dashboardBookingService.getBookingDetail(cm.bookingId).then(function (data) {\r\n _processBalanceDue(data.BalanceDueInfo);\r\n cm.isPartOfHoliday = data.IsPartOfHoliday;\r\n //getsavedbookingcards is obsolete now. So calling get and joining with PaymentOptions\r\n var getOptions = paymentDetailsService.getPaymentOptions(data.Booking.Type, cm.bookingId, data.BalanceDueInfo.ClientCurrencyCode);\r\n var getCards = TRPCONFIG.Domain.SavedCardsEnabled && $scope.user.HardSignedIn ? paymentDetailsService.getPaymentCards() : null;\r\n $q.all([getOptions, getCards]).then(function (results) {\r\n cm.paymentOptions = paymentsUtilService.convertMybPaymentOptions(results[0]);\r\n if (results[1]) {\r\n cm.savedCards = paymentsUtilService.convertMybSavedCards(results[1], results[0]);\r\n }\r\n cm.dataLoaded = true;\r\n });\r\n if ($routeParams.ppResp) {\r\n _showError(resourceService.get(paymentsService.getPayPalResponseMessage([$routeParams.ppResp])));\r\n }\r\n });\r\n cm.preBookCommands = [];\r\n cm.addPreBookCommand = function (command) {\r\n if (!cm.preBookCommands.includes(command)) {\r\n cm.preBookCommands.push(command);\r\n }\r\n };\r\n cm.generateTokens = function () {\r\n return paymentsService.generateTokens(cm.paymentModel.cardDetail.expiryDate.month, cm.paymentModel.cardDetail.expiryDate.year, cm.paymentModel.saveCard);\r\n };\r\n cm.addPreBookCommand(cm.generateTokens);\r\n cm.executePrebookCommands = function () {\r\n return Promise.all(cm.preBookCommands.map(function (preBookCommand) { return preBookCommand(); }));\r\n };\r\n cm.makePayment = function () {\r\n var expires = cm.paymentModel.cardDetail.expiryDate;\r\n var today = new Date();\r\n if (expires &&\r\n expires.year\r\n && expires.month\r\n && expires.year <= today.getFullYear()\r\n && expires.month < (today.getMonth() + 1)) {\r\n _showError(resourceService.get('CARDHASEXPIRED'));\r\n return;\r\n }\r\n _block(true);\r\n var requireValidation = cm.paymentModel.cardDetail.isSavedCard === false\r\n && cm.paymentModel.isPayPalPayment === false\r\n && cm.paymentModel.externalFop === undefined;\r\n paymentDetailsService.clearPayment(_formatClearRequestPayload(), requireValidation).then(function (result) {\r\n if (result.Success) {\r\n if (result.AcsRedirectRequired) {\r\n if (cm.paymentModel.isPayPalPayment) {\r\n //Paypal redirection\r\n window.location = result.AcsUrl;\r\n }\r\n else {\r\n //3ds redirection\r\n if (cpgStatusApiEnabled) {\r\n $timeout(function () {\r\n cpgValidationComplete(cm.bookingId, result.PaymentId);\r\n }, cpgStatusStartPollingDelay);\r\n }\r\n _redirectTo3dSecurePayment(result);\r\n }\r\n }\r\n else {\r\n //Show complete page\r\n $location.path(String.format(completeUrl, cm.bookingId));\r\n }\r\n }\r\n else {\r\n var message = result.ReasonCode ? paymentDetailsService.getcardFailureReasonMessage(result.ReasonCode) : result.PaymentMessage;\r\n _handleFailurePayment(message);\r\n }\r\n }, function () {\r\n _showError(resourceService.get('PAYBALANCEERROR'));\r\n });\r\n mybTrack.track('MYB - Pay Balance', {\r\n PaymentType: cm.paymentModel.isPayPalPayment ? 'PayPal' : 'Card',\r\n PartPayment: !cm.payFull\r\n });\r\n };\r\n cm.updateDfReferenceId = function (dfReferenceId) {\r\n cm.DfReferenceId = dfReferenceId;\r\n return cm.DfReferenceId;\r\n };\r\n cm.bypassThreeDS = function () {\r\n var data = {\r\n paRes: '',\r\n md: '',\r\n prePaymentId: threeDSecure.PrePaymentID\r\n };\r\n _authorisePayment(data, false);\r\n };\r\n function cpgValidationComplete(BookingId, PaymentId) {\r\n if (BookingId && PaymentId) {\r\n paymentDetailsService.getCpgStatus(BookingId, PaymentId).then(function (data) {\r\n if (data && data.error) {\r\n _handleFailurePayment(data.error);\r\n }\r\n });\r\n }\r\n }\r\n //Watches\r\n $scope.$on('3DSValidationComplete', function (ev, data) {\r\n _authorisePayment(data, true);\r\n });\r\n $scope.$watch('cm.paymentAmount', function (val) {\r\n val = val && !isNaN(val) ? val : 0;\r\n cm.paymentAmountDecimal = parseFloat(val);\r\n _updateBlanceDueDetail();\r\n });\r\n $scope.$watch('cm.paymentModel.fee', function () {\r\n _updateBlanceDueDetail();\r\n });\r\n //Private methods\r\n function _formatClearRequestPayload() {\r\n var request = {\r\n BookingId: cm.bookingId,\r\n PaymentId: 0,\r\n CurrencyCode: cm.currencyCode,\r\n Amount: cm.totalPaymentAmount,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n PayPalCallbackUrl: String.format(payPalCallbackUrl, root, '$PaymentId', cm.bookingId, 'success'),\r\n PayPalCancellationUrl: String.format(payPalCallbackUrl, root, 0, cm.bookingId, 'cancel'),\r\n ApplicationType: TRPCONFIG.ApplicationType,\r\n DfReferenceId: cm.DfReferenceId,\r\n ReturnUrl: String.format('{0}threedsecure?prePaymentID=', root),\r\n };\r\n //add in our payment details\r\n paymentsUtilService.addPaymentDetailsToClearRequest(cm.paymentModel, request);\r\n return request;\r\n }\r\n function _formatAuthoriseRequestPayload(data) {\r\n return {\r\n PaymentId: data.paymentId && data.paymentId.length ? data.paymentId : data.prePaymentId,\r\n PaRes: decodeURIComponent(data.paRes),\r\n MD: data.md,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n }\r\n function _authorisePayment(data, threeDSecure) {\r\n if (threeDSecure === void 0) { threeDSecure = false; }\r\n _block(true);\r\n paymentDetailsService.authorisePayment(_formatAuthoriseRequestPayload(data)).then(function (result) {\r\n if (threeDSecure) {\r\n $scope.$broadcast('3DSValidationFinished', result.Success);\r\n }\r\n if (result.Success) {\r\n $location.path(String.format(completeUrl, cm.bookingId));\r\n }\r\n else {\r\n _handleFailurePayment(result.PaymentMessage);\r\n }\r\n }, function () {\r\n _showError(resourceService.get('AUTHORISEEERROR'));\r\n });\r\n $scope.$apply(function () {\r\n cm.threedsRedirecting = false;\r\n });\r\n }\r\n function _redirectTo3dSecurePayment(result) {\r\n //Create threeDSecure object\r\n threeDSecure = {\r\n PaReq: result.PaReq,\r\n MD: result.MD,\r\n TermUrl: String.format('{0}threedsecure?prePaymentID={1}', root, result.PaymentId),\r\n AcsUrl: result.AcsUrl,\r\n CanByPass: result.AllowThreeDSecureBypass,\r\n PrePaymentID: result.PaymentId\r\n };\r\n $scope.$broadcast('request3DSValidation', threeDSecure, {\r\n Journey: 'PostBooking',\r\n BookingID: cm.bookingId,\r\n SignedIn: currentUser.get().SignedIn\r\n });\r\n cm.threedsRedirecting = true;\r\n cm.ThreeDSecure = threeDSecure;\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n function _handleFailurePayment(msg) {\r\n var messages = [resourceService.get('PAYMENTFAILED') + msg, String.format(resourceService.get('PAYMENTASSISTENCE'), resourceService.get('TELEPHONENUMBER'))];\r\n _showError(messages);\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n function _showError(msg) {\r\n $scope.$broadcast('flash:error', msg);\r\n }\r\n function _block(completing) {\r\n $scope.$emit('block', {\r\n title: resourceService.get(completing ? 'COMPLETINGPAYMENT' : 'PREPARINGPAYMENT'),\r\n loadingScreenStyle: 'default-payBalance'\r\n });\r\n }\r\n function _processBalanceDue(balanceDue) {\r\n _initDueDetails(balanceDue);\r\n _updateBlanceDueDetail();\r\n cm.BalanceDueDate = balanceDue.DueDate;\r\n }\r\n function _updateBlanceDueDetail() {\r\n cm.totalPaymentAmount = cm.paymentAmountDecimal + cm.paymentModel.fee;\r\n cm.balanceDueAfterPayment = cm.balanceDue - cm.paymentAmountDecimal;\r\n }\r\n function _initDueDetails(dueDetail) {\r\n if (!dueDetail) {\r\n //If there is no due amount redirect to booking reference page.\r\n $location.path(String.format(bookingReferenceUrl, cm.bookingId));\r\n }\r\n else {\r\n cm.balanceDue = dueDetail.BalanceDueAmount - dueDetail.PendingElvPayments;\r\n //cm.balanceDue = cm.balanceDue.toFixed(2);\r\n cm.currencyCode = dueDetail.ClientCurrencyCode;\r\n cm.paymentAmount = cm.balanceDue.toFixed(2);\r\n cm.paymentAmountDecimal = parseFloat(cm.paymentAmount);\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .controller('PayBalanceComplete', PayBalanceComplete);\r\n function PayBalanceComplete($scope, $routeParams, broker, dashboardBookingService, resourceService) {\r\n var cm = this;\r\n cm.bookingId = parseInt($routeParams.bookingId);\r\n cm.bookingActions = dashboardBookingService.getBookingActions();\r\n cm.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n broker.publish('paymentComplete');\r\n dashboardBookingService.getBookingDetail(cm.bookingId).then(function (data) {\r\n if (data) {\r\n var paymentData = _.last(data.Payments.filter(function (p) { return p.Status === 1; }));\r\n var dueDetail = data.BalanceDueInfo;\r\n cm.amountPaid = paymentData.Amount;\r\n cm.currencyCode = paymentData.ClientCurrencyCode;\r\n if (dueDetail) {\r\n cm.balanceDueAfterPayment = dueDetail.BalanceDueAmount - dueDetail.PendingElvPayments;\r\n cm.BalanceDueDate = dueDetail.DueDate;\r\n }\r\n }\r\n });\r\n //dashboardBookingService.getBookingInfo(cm.bookingId).then(function (booking) {\r\n // cm.bk = booking;\r\n //});\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var AmendBookingPreviousSummary = /** @class */ (function () {\r\n function AmendBookingPreviousSummary($scope, hotelService, dashboardBookingService) {\r\n this.$scope = $scope;\r\n this.hotelService = hotelService;\r\n this.dashboardBookingService = dashboardBookingService;\r\n dashboardBookingService.getMybBooking()\r\n .then(function (booking) {\r\n $scope.booking = booking;\r\n var estabId = _.get(booking, 'Itinerary.Stays[0].Hotel.EstabId');\r\n return hotelService.getHotel(undefined, estabId, undefined);\r\n })\r\n .then(function (hotel) {\r\n $scope.hotel = hotel;\r\n hotel.BookingRef = $scope.booking.BookingCore.BookingRef;\r\n });\r\n }\r\n return AmendBookingPreviousSummary;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .directive('amendBookingPreviousSummary', function () { return ({\r\n restrict: 'E',\r\n controller: AmendBookingPreviousSummary,\r\n scope: {},\r\n templateUrl: 'partials/home/directivetemplate?type=amendBookingPreviousSummary'\r\n }); });\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardBookingItinerary = /** @class */ (function () {\r\n function DashboardBookingItinerary(imageService, dashboardBookingService, dateUtil, resourceService, brandedFareTypesService) {\r\n this.imageService = imageService;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.dateUtil = dateUtil;\r\n this.resourceService = resourceService;\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.templateMap = {\r\n 1: 'flight',\r\n 2: 'tickets',\r\n 4: 'car-hire',\r\n 8: 'accommodation',\r\n 9: 'holiday',\r\n 16: 'parking',\r\n 32: 'transfer',\r\n 64: 'insurance',\r\n 128: 'package-holidays',\r\n 256: 'marhaba',\r\n 1024: 'bundle',\r\n 2048: 'adhoc'\r\n };\r\n this.productsMap = {\r\n 1: 'Flight',\r\n 8: 'Accommodation',\r\n 32: 'Transfer',\r\n 256: 'Ground Handling',\r\n 2048: 'Adhoc'\r\n };\r\n this.isMobile = TRPCONFIG.IsMobileDevice;\r\n this.template = this.templateMap[this.bookingType];\r\n this.bookingTypes = dashboardBookingService.getBookingTypeMap();\r\n this.itineraryType = dashboardBookingService.getItineraryType();\r\n this.expandable = TRPCONFIG.Domain.MYBProductsDetailsExpanded;\r\n if (this.bookingType === this.bookingTypes.travelInsurance) {\r\n this.insuranceProvider = this.bookingTitle.split(':')[0];\r\n }\r\n }\r\n DashboardBookingItinerary.prototype.getResourceValue = function (resource) {\r\n return this.resourceService.get(resource);\r\n };\r\n DashboardBookingItinerary.prototype.filterTransfer = function (itinerary) {\r\n return itinerary.Type === this.itineraryType['TransferArrival'] ||\r\n itinerary.Type === this.itineraryType['TransferReturn'];\r\n };\r\n DashboardBookingItinerary.prototype.getImage = function (estabId) {\r\n return this.imageService.getImageUrl(estabId, 180, 180, 1);\r\n };\r\n DashboardBookingItinerary.prototype.getAcommImage = function (estabId) {\r\n return this.imageService.getMainImageUrl(estabId, 370, 370);\r\n };\r\n DashboardBookingItinerary.prototype.getContentUrl = function () {\r\n return 'partials/dashboard/ItineraryTemplate?Type=' + this.template;\r\n };\r\n DashboardBookingItinerary.prototype.getNights = function (start, end) {\r\n return this.dateUtil.numberOfNights(start, end);\r\n };\r\n DashboardBookingItinerary.prototype.getBookingClassName = function (fc) {\r\n return this.brandedFareTypesService.getBookingClassName(fc);\r\n };\r\n DashboardBookingItinerary.prototype.getClassName = function (fc) {\r\n var fareName = this.brandedFareTypesService.getClassName(fc);\r\n var type = this.brandedFareTypesService._getTransformedType(fareName);\r\n return this.brandedFareTypesService._setClassName(type);\r\n };\r\n DashboardBookingItinerary.prototype.getTitle = function (id) {\r\n if (this.hotelData && this.hotelData[0][id] && this.hotelData[0][id].EstabTitle) {\r\n return this.hotelData[0][id].EstabTitle;\r\n }\r\n };\r\n DashboardBookingItinerary.prototype.getAddress = function (id) {\r\n if (this.hotelData && this.hotelData[0][id] && this.hotelData[0][id].Address) {\r\n return this.hotelData[0][id].Address;\r\n }\r\n };\r\n return DashboardBookingItinerary;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .component('dashboardBookingItinerary', {\r\n bindings: {\r\n bookingTitle: '=',\r\n itineraries: '=',\r\n bookingType: '=',\r\n hotelData: '=',\r\n fallbackEn: '='\r\n },\r\n controller: DashboardBookingItinerary,\r\n controllerAs: 'bi',\r\n template: '' +\r\n '
        ' + '
        ' +\r\n '
        '\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .directive('dashboardBookingSummary', dashboardBookingSummary);\r\n function dashboardBookingSummary(dashboardBookingService, resourceService, authService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/dashboard/bookingsummary',\r\n scope: {\r\n bk: '=',\r\n bnd: '=',\r\n currentUser: '=',\r\n passenger: '=',\r\n showTripDate: '@',\r\n bookingMessage: '@',\r\n showActions: '@'\r\n },\r\n link: function (scope) {\r\n scope.bookingType = dashboardBookingService.getBookingTypeMap();\r\n var stopWatch = scope.$watch('bk', function (val) {\r\n if (val) {\r\n dashboardBookingService.formatTitle(val);\r\n stopWatch();\r\n }\r\n });\r\n scope.showTripDate = scope.showTripDate === 'true';\r\n scope.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n scope.formatBookingMessage = dashboardBookingService.formatBookingMessage;\r\n scope.bookingMessage = scope.bookingMessage === 'true';\r\n scope.showActions = scope.showActions === 'true';\r\n scope.actionRedirect = dashboardBookingService.actionRedirect;\r\n scope.actionClick = dashboardBookingService.actionClick;\r\n scope.signOut = function () {\r\n authService.signOut();\r\n };\r\n function revealOptions(bk) {\r\n bk.showOptions = true;\r\n }\r\n function hideOptions(bk) {\r\n bk.showOptions = false;\r\n }\r\n scope.toggleOptions = function (bk) {\r\n if (bk.showOptions) {\r\n hideOptions(bk);\r\n }\r\n else {\r\n revealOptions(bk);\r\n }\r\n };\r\n function canAccessBooking(bnd) {\r\n var access = true;\r\n // Checks bundle has a BookingUIStatus of 'OK'\r\n var type = _.get(bnd, '[0].Status');\r\n if (type !== 1) {\r\n return false;\r\n }\r\n // Checks bundle components are not BookingUIStatus of 'Pending'\r\n access = _.every(bnd, function (item) {\r\n return item.Status !== 2;\r\n });\r\n return access;\r\n }\r\n if (scope.bnd !== undefined) {\r\n scope.canAccessBooking = canAccessBooking(scope.bnd);\r\n }\r\n }\r\n };\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardBreadcrumb = /** @class */ (function () {\r\n function DashboardBreadcrumb(dashboardBreadCrumbDetails, dashboardBookingService, $routeParams) {\r\n var _this = this;\r\n this.dashboardBreadCrumbDetails = dashboardBreadCrumbDetails;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.$routeParams = $routeParams;\r\n this.bookingId = parseInt(this.$routeParams.bookingId, 10);\r\n this.dashboardBookingService.getBookingInfo(this.bookingId).then(function (booking) {\r\n _this.crumbs = _this.dashboardBreadCrumbDetails.get(_this.pages, booking);\r\n });\r\n }\r\n return DashboardBreadcrumb;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .directive('dashboardBreadcrumb', function () {\r\n return {\r\n restrict: 'E',\r\n bindToController: {\r\n pages: '@'\r\n },\r\n controller: DashboardBreadcrumb,\r\n controllerAs: 'dbc',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=DashboardBreadcrumb'\r\n };\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardCarousel = /** @class */ (function () {\r\n function DashboardCarousel() {\r\n var _this = this;\r\n this.selected = 0;\r\n this.formatedItem = function (item) { return _this.formatItem({ item: item }); };\r\n this.onItemClick = function (item) { _this.itemClick({ item: item }); };\r\n }\r\n DashboardCarousel.prototype.init = function (scope, carousel, prev, next) {\r\n this.carousel = carousel;\r\n this.scope = scope;\r\n this.prev = prev;\r\n this.next = next;\r\n };\r\n DashboardCarousel.prototype.initCarousel = function () {\r\n var _this = this;\r\n this.carousel.slick({\r\n prevArrow: this.prev,\r\n nextArrow: this.next,\r\n infinite: false\r\n });\r\n this.carousel.on('beforeChange', function (event, slick, currentSlide, nextSlide) {\r\n _this.selected = nextSlide;\r\n _this.onCarouselChange({ index: nextSlide });\r\n _this.scope.$apply();\r\n });\r\n this.scope.$on('$destroy', function () {\r\n _this.carousel.off('beforeChange');\r\n });\r\n };\r\n return DashboardCarousel;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .directive('dashboardCarousel', function () {\r\n return {\r\n scope: {},\r\n bindToController: {\r\n itemlist: '=',\r\n onCarouselChange: '&',\r\n itemClick: '&',\r\n itemPartial: '=',\r\n formatItem: '&'\r\n },\r\n controller: DashboardCarousel,\r\n controllerAs: 'dc',\r\n templateUrl: function (el, attrs) {\r\n if (attrs.itemPartial) {\r\n return 'partials/dashboard/DashboardCarousel?itemPartial=' + attrs.itemPartial;\r\n }\r\n return 'partials/dashboard/DashboardCarousel';\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(scope, $('.dashboard-carousel'), $('#arrow-prev'), $('#arrow-next'));\r\n }\r\n };\r\n }).directive('carouselItem', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n transclude: false,\r\n require: '^dashboardCarousel',\r\n link: function (scope, el, attr, controller) {\r\n // wait for the last item in the ng-repeat then call init\r\n if (scope.$last) {\r\n $timeout(function () {\r\n controller.initCarousel();\r\n });\r\n }\r\n }\r\n };\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardCsrConversation = /** @class */ (function () {\r\n function DashboardCsrConversation($scope, dashboardCsrService, $timeout) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.dashboardCsrService = dashboardCsrService;\r\n this.$timeout = $timeout;\r\n this.isInProgress = false;\r\n this.submitMessage = function (csr) {\r\n _this.isInProgress = true;\r\n _this.dashboardCsrService.submitMessage(csr).then(function () { return _this.isInProgress = false; });\r\n };\r\n this.getSenderTitle = function (conversation) { return _this.dashboardCsrService.getSenderTitle(conversation); };\r\n $('.header-main').addClass('unfix');\r\n $scope.$watch('csd.csr.newMessage', function () { return _this.moveConversationWithTextbox(); });\r\n }\r\n DashboardCsrConversation.prototype.goToBottom = function () {\r\n this.$timeout(function () {\r\n scrollTo(0, document.body.scrollHeight);\r\n }, 2000);\r\n };\r\n DashboardCsrConversation.prototype.moveConversationWithTextbox = function () {\r\n //to move the conversation are when the input are height increases.\r\n var el = $('.csr-conversation');\r\n el.css('padding-bottom', $('.csr-send-message').css('height'));\r\n };\r\n return DashboardCsrConversation;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .component('dashboardCsrConversation', {\r\n bindings: {\r\n csr: '='\r\n },\r\n controller: DashboardCsrConversation,\r\n controllerAs: 'csd',\r\n templateUrl: 'partials/dashboard/CsrConversation'\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var CsrSummary = /** @class */ (function () {\r\n function CsrSummary($scope, $q, $routeParams, scrollService, $location, dashboardCsrService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.scrollService = scrollService;\r\n this.$location = $location;\r\n this.dashboardCsrService = dashboardCsrService;\r\n this.getCsrStatusClass = function (status) { return _this.dashboardCsrService.getCsrStatusClass(status); };\r\n this.returnUrl = '/dashboard/csr/' + this.$routeParams.bookingId;\r\n this.baseUrl = '/dashboard';\r\n var killTheWatch = $scope.$watchCollection(function () { return _this.csrlist; }, function (val) {\r\n if (val && val.length > 0) {\r\n killTheWatch();\r\n }\r\n });\r\n }\r\n CsrSummary.prototype.view = function (csr) {\r\n this.$location.path(this.baseUrl + '/csr-details/' + csr.BookingId + '/' + csr.CsrId);\r\n };\r\n return CsrSummary;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .directive('dashboardCsrSummary', function () {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n replace: true,\r\n templateUrl: 'partials/dashboard/csrSummary',\r\n bindToController: {\r\n csrlist: '='\r\n },\r\n scope: {},\r\n controller: CsrSummary,\r\n controllerAs: 'cs'\r\n };\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .directive('gravatarImage', function (resourceService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n email: '='\r\n },\r\n template: '',\r\n link: function (scope, element) {\r\n scope.gravatarProfile = 'https://gravatar.com/profiles/no-such-user';\r\n scope.$watch('email', function (email) {\r\n if (email) {\r\n scope.changeText = resourceService.get('CHANGE');\r\n // eslint-disable-next-line new-cap\r\n var hash = window.md5(email);\r\n var image_1 = new Image();\r\n image_1.onload = function () {\r\n element.append(image_1);\r\n };\r\n //fallback to mysterymen avatar\r\n image_1.src = \"https://www.gravatar.com/avatar/\" + hash + \"?d=mm\";\r\n image_1.alt = 'user avatar';\r\n scope.gravatarProfile = \"https://www.gravatar.com/profiles/\" + hash;\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n angular\r\n .module('dashboard')\r\n .directive('elastic', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n link: function ($scope, element, attrs) {\r\n var initialHeight = element[0].style.height;\r\n var maxRows = $scope.$eval(attrs.elastic);\r\n var maxHeight = (element[0].clientHeight - 18) * maxRows;\r\n var resize = _.debounce(function () {\r\n element[0].style.height = initialHeight;\r\n element[0].style.height = (maxHeight <= element[0].scrollHeight ?\r\n maxHeight : element[0].scrollHeight) + 'px';\r\n }, 250);\r\n element.on('input change', resize);\r\n $timeout(resize, 0);\r\n }\r\n };\r\n });\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n var DS = angular.module('dashboard');\r\n DS.directive('visitedHotelItem', function () {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n templateUrl: 'partials/dashboard/VisitedHotelDetails',\r\n scope: {\r\n item: '='\r\n }\r\n };\r\n });\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var AddAPIService = /** @class */ (function () {\r\n function AddAPIService($http, $q, resourceService) {\r\n this.$http = $http;\r\n this.$q = $q;\r\n this.resourceService = resourceService;\r\n this.documentTypes = [\r\n {\r\n id: 1,\r\n label: this.resourceService.getDeferred('PASSPORT')\r\n },\r\n {\r\n id: 2,\r\n label: this.resourceService.getDeferred('IDENTITYCARD')\r\n }\r\n ];\r\n }\r\n AddAPIService.prototype.getDocumentTypes = function () {\r\n return this.documentTypes;\r\n };\r\n AddAPIService.prototype.addAPI = function (bookingId, passengers) {\r\n return this.$http.post('/api/bookings/flights/apis/update', {\r\n BookingId: bookingId,\r\n PassengerInfo: passengers\r\n });\r\n };\r\n AddAPIService.prototype.getAPI = function (bookingId) {\r\n return this.$http.get('/api/bookings/flights/apis/get?' + $.param({\r\n BookingId: bookingId\r\n })).then(function (r) { return r.data; });\r\n };\r\n AddAPIService.prototype.getPassengers = function (bookingId) {\r\n return this.$http.get('api/bookings/myb/get?' + $.param({\r\n bookingId: bookingId,\r\n fields: 'passengers'\r\n })).then(function (r) { return r.data.Passengers; });\r\n };\r\n AddAPIService.prototype.getPassengerInfo = function (bookingId) {\r\n return this.$q.all([\r\n this.getPassengers(bookingId),\r\n this.getAPI(bookingId)\r\n ]).then(function (_a) {\r\n var passengers = _a[0], passengersFromAPI = _a[1];\r\n return passengers.map(function (p) {\r\n var pa = _.find(passengersFromAPI, function (pa) { return pa.PassengerId === p.Id; });\r\n var passenger = {\r\n PassengerId: p.Id,\r\n Name: p.Title + \" \" + p.FirstName + \" \" + p.SurName\r\n };\r\n if (pa) {\r\n _.assign(passenger, {\r\n DocumentNumber: pa.DocumentNumber,\r\n Nationality: pa.Nationality,\r\n DocumentIssuingCountry: pa.DocumentIssuingCountry,\r\n CountryOfBirth: pa.CountryOfBirth,\r\n DocumentType: pa.DocumentType,\r\n DateOfBirth: pa.DateOfBirth,\r\n DocumentIssuedDate: pa.DocumentIssuedDate,\r\n DocumentExpiryDate: pa.DocumentExpiryDate,\r\n DetailsSubmitted: true\r\n });\r\n }\r\n return passenger;\r\n });\r\n });\r\n };\r\n return AddAPIService;\r\n }());\r\n angular\r\n .module('dashboard')\r\n .service('addAPIService', AddAPIService);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var BookingStatus;\r\n (function (BookingStatus) {\r\n BookingStatus[BookingStatus[\"Pending\"] = 1] = \"Pending\";\r\n BookingStatus[BookingStatus[\"Receipted\"] = 2] = \"Receipted\";\r\n BookingStatus[BookingStatus[\"Ticketed\"] = 4] = \"Ticketed\";\r\n BookingStatus[BookingStatus[\"Complete\"] = 5] = \"Complete\";\r\n BookingStatus[BookingStatus[\"CancelledByCustomer\"] = 6] = \"CancelledByCustomer\";\r\n BookingStatus[BookingStatus[\"Void\"] = 7] = \"Void\";\r\n BookingStatus[BookingStatus[\"HoldAwaitingConfirmation\"] = 8] = \"HoldAwaitingConfirmation\";\r\n BookingStatus[BookingStatus[\"DeclinedByEstab\"] = 9] = \"DeclinedByEstab\";\r\n BookingStatus[BookingStatus[\"ConfirmedByEstab\"] = 10] = \"ConfirmedByEstab\";\r\n BookingStatus[BookingStatus[\"CancellationConfirmedByEstab\"] = 11] = \"CancellationConfirmedByEstab\";\r\n BookingStatus[BookingStatus[\"CancellationDeclinedByEstab\"] = 12] = \"CancellationDeclinedByEstab\";\r\n BookingStatus[BookingStatus[\"FailedSecurityCheck\"] = 13] = \"FailedSecurityCheck\";\r\n BookingStatus[BookingStatus[\"HoldSwap\"] = 14] = \"HoldSwap\";\r\n })(BookingStatus = Dashboard.BookingStatus || (Dashboard.BookingStatus = {}));\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('dashboardReviewService', dashboardReviewService);\r\n function dashboardReviewService($http, $q, dashboardService, dashboardBookingService, imageService, resourceService, authService, currentUser) {\r\n var reviewUrl = '/api2/users/reviews/';\r\n var userReviewUrl = '/api2/users/reviews/user/';\r\n var ratingRange = {\r\n Min: 0,\r\n Max: 10\r\n };\r\n var sutabilityAnswers = [\r\n {\r\n name: resourceService.getDeferred('YES'),\r\n val: true\r\n },\r\n {\r\n name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'),\r\n val: false\r\n },\r\n {\r\n name: resourceService.getDeferred('DASHBOARDRESOURCE_UNSURE'),\r\n val: 'Unsure'\r\n }\r\n ];\r\n var recommendTRPAnswers = [\r\n {\r\n name: resourceService.getDeferred('YES'),\r\n val: true\r\n },\r\n {\r\n name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'),\r\n val: false\r\n }\r\n ];\r\n var reviewCriteria = [\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_CHECKINDATE'), val: 'ReviewerCheckInDate' },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_MOSTLIKES'), val: 'LikeCount' },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_MYRATING'), val: 'Rating' },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_FEEDBACKDATE'), val: 'FeedBackDate' }\r\n ];\r\n var ratingTitles = null;\r\n var hotelSuitabilityTypes = null;\r\n var service = {\r\n getBookingFeedback: getBookingFeedback,\r\n editReview: editReview,\r\n saveReview: saveReview,\r\n recommendTRPChange: recommendTRPChange,\r\n ratingRange: ratingRange,\r\n recommendTRPAnswers: recommendTRPAnswers,\r\n sutabilityAnswers: sutabilityAnswers,\r\n getRatingTitles: getRatingTitles,\r\n getRatingTitleText: getRatingTitleText,\r\n getStatements: getStatements,\r\n getReviewSortCriteria: getReviewSortCriteria,\r\n getReviewSiteDetails: getReviewSiteDetails,\r\n getReview: getReview,\r\n getReviewHeaderData: getReviewHeaderData,\r\n getReviewStatus: getReviewStatus\r\n };\r\n function getStatements() {\r\n if (hotelSuitabilityTypes === null) {\r\n return $http.get(reviewUrl + \"getstatements?\" + $.param({\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n })).then(function (result) {\r\n addDefaultAnswerToStatements(result.data);\r\n hotelSuitabilityTypes = result.data;\r\n return hotelSuitabilityTypes;\r\n });\r\n }\r\n return hotelSuitabilityTypes;\r\n }\r\n function addDefaultAnswerToStatements(data) {\r\n for (var i = 0; i < data.length; i++) {\r\n data[i].SelectedOpinion = sutabilityAnswers[2].val;\r\n }\r\n }\r\n function getRatingTitles() {\r\n if (ratingTitles === null) {\r\n return $http.get(reviewUrl + \"getratingcategories?\" + $.param({\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n })).then(function (result) {\r\n ratingTitles = result.data;\r\n return ratingTitles;\r\n });\r\n }\r\n return $q.when(ratingTitles);\r\n }\r\n function BookingFeedback() {\r\n var feedback = {\r\n rating: 0,\r\n comments: '',\r\n topTip: '',\r\n notRecommendUsComment: '',\r\n statements: null\r\n };\r\n return feedback;\r\n }\r\n function getBookingFeedback() {\r\n var feedback = new BookingFeedback();\r\n feedback.statements = angular.copy(hotelSuitabilityTypes);\r\n feedback.recommendTRP = true;\r\n return feedback;\r\n }\r\n function editReview(hotel) {\r\n hotel.reviewSaved = false;\r\n }\r\n function saveReview(hotel, feedback, token, userId) {\r\n if (feedback.rating === 0) {\r\n hotel.submitTry = true;\r\n return $q.when(false);\r\n }\r\n return _saveReview(hotel.EstablishmentDetail.Id, hotel.BookingDetail.BookingId, feedback, token, userId).then(function () {\r\n hotel.reviewSaved = true;\r\n dashboardService.clearAggregate();\r\n _setFeedbackStatements(hotel.BookingDetail.BookingId, hotel.EstablishmentDetail.Id, feedback.statements, token, userId);\r\n return true;\r\n });\r\n }\r\n function _saveReview(estabId, bookingId, reviewData, token, userId) {\r\n var url = '';\r\n var request = {\r\n BookingId: bookingId,\r\n ObjectId: estabId,\r\n RatingDecimal: reviewData.rating,\r\n Comments: reviewData.comments,\r\n TopTip: reviewData.topTip,\r\n RecommendTRP: reviewData.recommendTRP,\r\n NotRecommendUsComment: reviewData.notRecommendUsComment,\r\n DomainDefaultCultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n if (token && userId) {\r\n request.VerificationToken = token;\r\n request.UserId = userId;\r\n url = userReviewUrl + \"settoken\";\r\n }\r\n else {\r\n url = userReviewUrl + \"set\";\r\n }\r\n return $http.post(url, request, { ignoreErrors: true });\r\n }\r\n function recommendTRPChange(feedback) {\r\n if (!feedback.recommendTRP) {\r\n feedback.showNotRecommendTRPComment = true;\r\n document.getElementById('review-content').scrollTop += 150;\r\n document.getElementById('notRecommendUsComment').focus();\r\n }\r\n else {\r\n feedback.showNotRecommendTRPComment = false;\r\n }\r\n }\r\n function getRatingTitleText(n) {\r\n if (n !== undefined) {\r\n var i = 0;\r\n if (n === 0) {\r\n return ratingTitles[i].Description;\r\n }\r\n for (i = 1; i < ratingTitles.length; i++) {\r\n if (n < ratingTitles[i].MinimumRating) {\r\n return ratingTitles[i - 1].Description;\r\n }\r\n }\r\n return ratingTitles[i - 1].Description;\r\n }\r\n return '';\r\n }\r\n function getReviewSortCriteria() {\r\n return reviewCriteria;\r\n }\r\n function _setFeedbackStatements(bookingId, objectId, statements, token, userId) {\r\n var filteredStatements = _.filter(statements, function (s) {\r\n delete s.Description;\r\n return s.SelectedOpinion !== 'Unsure';\r\n });\r\n var request = {\r\n BookingId: bookingId,\r\n ObjectId: objectId,\r\n Statements: filteredStatements\r\n };\r\n if (filteredStatements.length > 0) {\r\n var url = '';\r\n if (token && userId) {\r\n request.VerificationToken = token;\r\n request.UserId = userId;\r\n url = userReviewUrl + \"setstatementstoken\";\r\n }\r\n else {\r\n url = userReviewUrl + \"setstatements\";\r\n }\r\n return $http.post(url, request, { ignoreErrors: true });\r\n }\r\n return $q.when();\r\n }\r\n function getReviewSiteDetails(bookingId) {\r\n return $http.get(userReviewUrl + \"getreviewsite?bookingId=\" + bookingId + \"&domainId=\" + TRPCONFIG.Domain.DomainId, { ignoreErrors: true }).then(function (result) {\r\n var reviewSiteDetails = result.data;\r\n return reviewSiteDetails;\r\n });\r\n }\r\n function getReview(bookingId) {\r\n return $http.get(userReviewUrl + \"booking/\" + bookingId + \"?cultureCode=\" + TRPCONFIG.Domain.CultureCode, { ignoreErrors: true })\r\n .then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getReviewHeaderData(bookingId, objectId) {\r\n var dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\r\n var hotelDetail = dashboardService.getHotelsById([objectId]);\r\n var bookingDetail = dashboardBookingService.getBookingSummary(bookingId);\r\n var contactDetail = dashboardBookingService.getContact(bookingId);\r\n return $q.all([hotelDetail, bookingDetail, contactDetail]).then(function (results) {\r\n var hotel = (results[0]) ? results[0][0] : null;\r\n var contact = results[2] && results[2].data;\r\n return {\r\n EstablishmentDetail: hotel,\r\n ImageUrl: imageService.getMainImageUrl(objectId, dim, dim),\r\n BookingDetail: {\r\n StartDate: results[1].Booking.StartDate,\r\n BookingRef: results[1].Booking.BookingRef,\r\n BookingId: bookingId,\r\n LeadPassengerContact: {\r\n Title: contact.Title,\r\n FirstName: contact.FirstName,\r\n Surname: contact.LastName\r\n }\r\n }\r\n };\r\n });\r\n }\r\n function getReviewStatus(bookingId) {\r\n var user = currentUser.get();\r\n return (user.AnonSignedIn ? authService.getSignedinBooking() : $.when()).then(function (booking) {\r\n if (booking && booking.Summary && booking.Summary.BookingId) {\r\n var url = \"/api/bookings/\" + booking.Summary.BookingId + \"/trip?culturecode=\" + TRPCONFIG.Domain.CultureCode;\r\n return $http.get(url).then(function (response) {\r\n var bk = _.find(response.data.Bookings, function (bk) {\r\n return bk.BookingId === parseInt(bookingId);\r\n });\r\n return bk.ReviewStatus;\r\n });\r\n }\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('dashboardService', dashboardService);\r\n function dashboardService($http, arrayUtil, imageService, fieldGroupService) {\r\n var domain = TRPCONFIG.Domain;\r\n var dashBoardAggPromise = null;\r\n var fieldTypes = fieldGroupService.getFieldTypes();\r\n var service = {\r\n getAggregate: getAggregate,\r\n clearAggregate: clearAggregate,\r\n getHotelsById: getHotelsById\r\n };\r\n function clearAggregate() {\r\n dashBoardAggPromise = null;\r\n }\r\n function _getDashBoardAggregates() {\r\n if (dashBoardAggPromise == null) {\r\n dashBoardAggPromise = $http.post('website/userdashboard/getestabbookings', {\r\n SortCriterion: 'Likes',\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId\r\n }, { ignoreErrors: true }).then(function (result) {\r\n var allEstabs = result.data.EstabBookingDetails;\r\n var userReviews = result.data.Reviews;\r\n var visitedEstabInfo = {\r\n ReviewedHotels: [],\r\n UnreviewedHotels: []\r\n };\r\n enrichData(allEstabs);\r\n angular.forEach(allEstabs, function (estab) {\r\n estab.EstablishmentDetail.Url = estab.EstablishmentDetail.Url.replace('/', '');\r\n if (estab.IsReviewedByUser) {\r\n visitedEstabInfo.ReviewedHotels.push(estab);\r\n }\r\n else {\r\n visitedEstabInfo.UnreviewedHotels.push(estab);\r\n }\r\n });\r\n var estabDict = arrayUtil.toDict(allEstabs, function (e) { return e.EstablishmentDetail.Id; }, function (e) {\r\n e.EstablishmentDetail.ImageUrl = e.ImageUrl;\r\n return e.EstablishmentDetail;\r\n });\r\n arrayUtil.map(userReviews, function (r) {\r\n r.Establishment = estabDict[r.EstabId];\r\n return r;\r\n });\r\n return {\r\n estabs: visitedEstabInfo,\r\n reviews: userReviews\r\n };\r\n });\r\n }\r\n return dashBoardAggPromise;\r\n }\r\n function enrichData(estabs) {\r\n angular.forEach(estabs, function (estab) {\r\n var dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\r\n estab.ImageUrl = imageService.getMainImageUrl(estab.EstablishmentDetail.Id, dim, dim);\r\n });\r\n }\r\n function getHotelsById(estabIds) {\r\n return $http.post('/api/hotels/static/gethotelsbyid', {\r\n Ids: estabIds,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FieldFlags: fieldGroupService.getFieldGroup([\r\n fieldTypes.Global,\r\n fieldTypes.Titles\r\n ])\r\n }, { ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getAggregate() {\r\n return _getDashBoardAggregates();\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('dashboardBookingService', dashboardBookingService);\r\n function dashboardBookingService($http, $q, $routeParams, resourceService, dateUtil, broker, $location, crossSellService, customCurrencyFilter, dashboardBookingsErrorMessage, authService, bookingActionLink, imageService, $interpolate, unadjustedDateFilter, mybTrack) {\r\n var bookingActions = {\r\n VIEWBOOKINGDETAILS: {\r\n label: 'DASHBOARDRESOURCE_VIEWDETAILS',\r\n icon: 'icon-menu'\r\n },\r\n CSR: {\r\n label: 'DASHBOARDRESOURCE_CSR',\r\n icon: 'icon-support'\r\n },\r\n VOUCHERACTIONS: {\r\n label: 'DASHBOARDRESOURCE_RESENDEMAIL',\r\n icon: 'icon-email',\r\n trackEvent: 'MYB - Resend Email'\r\n },\r\n CHANGECONTACTDETAILS: {\r\n label: 'DASHBOARDRESOURCE_CHANGECONTACTDETAILS',\r\n icon: 'icon-edit'\r\n },\r\n CANCELBOOKINGS: {\r\n label: 'DASHBOARDRESOURCE_CANCELBOOKINGS',\r\n icon: 'icon-close',\r\n trackEvent: 'MYB - Cancel Click'\r\n },\r\n PAYBALANCE: {\r\n label: 'DASHBOARDRESOURCE_PAYBALANCE',\r\n icon: TRPCONFIG.Domain.CurrencyCode === 'EUR' ? 'icon-symbol-eur' : 'icon-symbol-gbp' //TODO: only two currencies?\r\n },\r\n ENTERAPI: {\r\n label: 'DASHBOARDRESOURCE_ENTERPASSENGERDETAILS',\r\n icon: 'icon-passenger'\r\n },\r\n PRINTVOUCHER: {\r\n label: 'DASHBOARDRESOURCE_PRINTVOUCHER',\r\n icon: 'icon-print',\r\n trackEvent: 'MYB - Print Booking'\r\n },\r\n PRINTRECEIPT: {\r\n label: 'DASHBOARDRESOURCE_PRINTRECEIPT',\r\n icon: 'icon-print',\r\n trackEvent: 'MYB - Print Booking'\r\n },\r\n AMENDBOOKING: {\r\n label: 'DASHBOARDRESOURCE_AMENDBOOKING',\r\n icon: 'icon-edit-booking',\r\n trackEvent: 'MYB - Amend Click'\r\n },\r\n ENTERREVIEW: {\r\n label: 'DASHBOARDRESOURCE_ENTERREVIEW',\r\n icon: 'icon-reviews'\r\n },\r\n ADDBAGGAGE: {\r\n label: 'ADDBAGGAGE',\r\n icon: 'icon-baggage'\r\n },\r\n DERWENTLINK: {\r\n label: 'DASHBOARDRESOURCE_DERWENTLINK',\r\n icon: 'icon-menu'\r\n },\r\n PRINTINVOICE: {\r\n label: 'DASHBOARDRESOURCE_PRINTINVOICE',\r\n icon: 'icon-print'\r\n }\r\n };\r\n var bookingTypes = {\r\n 1: { template: 'flight', code: 'MANAGEFLIGHT', ticket: 'TICKETS', icon: 'icon-flights' },\r\n 2: { template: 'tickets', code: 'MANAGETICKETS', ticket: 'TICKETS', icon: 'icon-attractions', defaultImage: '/build/img/assets/product/attractions.jpg' },\r\n 4: { template: 'car-hire', code: 'MANAGECARHIRE', ticket: 'VOUCHERS', icon: 'icon-car-hire', defaultImage: '/build/img/assets/car_hire.jpg' },\r\n 8: { template: 'accommodation', code: 'MANAGEACCOMODATION', ticket: 'VOUCHERS', icon: 'icon-hotels' },\r\n 9: { template: 'holiday', code: 'MANAGEHOLIDAY' },\r\n 16: { template: 'parking', code: 'MANAGEPARKING', icon: 'icon-parking', defaultImage: '/build/img/assets/product/parking.jpg' },\r\n 32: { template: 'transfer', code: 'MANAGETRANSFER', icon: 'icon-transfers', defaultImage: '/build/img/assets/product/transfers.jpg' },\r\n 64: { template: 'insurance', code: 'MANAGEINSURANCE', icon: 'icon-insurance', defaultImage: '/build/img/assets/product/travel-insurance.jpg' },\r\n 128: { template: 'package-holidays', code: 'MANAGEPACKAGE' },\r\n 256: { template: 'marhaba', code: 'MANAGEMARHARBA', icon: 'icon-marhaba', defaultImage: '/build/img/assets/product/marhaba.jpg' },\r\n 1024: { template: 'bundle', code: 'MANAGEBUNDLE', icon: 'icon-stack', defaultImage: '/build/img/assets/product/bundle.jpg' },\r\n 2048: { template: 'adhoc', code: 'MANAGEADHOC', icon: 'icon-attractions', defaultImage: '/build/img/assets/product/adhoc.jpg' }\r\n };\r\n var bookingTypeMap = {\r\n accommodation: 8,\r\n flight: 1,\r\n attraction: 2,\r\n carhire: 4,\r\n transfer: 32,\r\n travelInsurance: 64,\r\n bundle: 1024\r\n };\r\n var bookingInfoItemType = {\r\n Generic: 1,\r\n CancellationCondition: 2\r\n };\r\n var baseManageUrl = '/api2/managebooking';\r\n var v2ManageUrl = '/api2/bookings/manage';\r\n var bookingStatus = {\r\n confirmed: 1,\r\n pending: 2,\r\n canceled: 3\r\n };\r\n var limitBooking = 10;\r\n var itineraryType = {\r\n FlightOutbound: 1,\r\n FlightInbound: 2,\r\n CarHire: 3,\r\n HotelRoom: 4,\r\n AttractionTicket: 5,\r\n FlightInfo: 6,\r\n CarParking: 7,\r\n TransferArrival: 8,\r\n TransferReturn: 9,\r\n Insurance: 10,\r\n PackageHoliday: 11,\r\n Marhaba: 13\r\n };\r\n var tripsPromiseCache = {};\r\n var destinationType = {\r\n None: 0,\r\n Establishment: 1,\r\n Location: 2,\r\n Province: 3,\r\n Country: 4,\r\n Place: 5,\r\n Polygon: 10,\r\n Universal: 12\r\n };\r\n var bookingImageWidth = 300;\r\n var bookingImageHeight = 190;\r\n var service = {\r\n getBookingDetailsForTrip: getBookingDetailsForTrip,\r\n getOutstandingTrips: getOutstandingTrips,\r\n getBookingStatus: function () { return angular.copy(bookingStatus); },\r\n getBookingTypeMap: function () { return angular.copy(bookingTypeMap); },\r\n getBookingInfoItemType: function () { return angular.copy(bookingInfoItemType); },\r\n getLimitBooking: function () { return limitBooking; },\r\n getItineraryType: function () { return angular.copy(itineraryType); },\r\n getBookingDetail: getBookingDetail,\r\n getFuturePayments: getFuturePayments,\r\n getBookingSummary: getBookingSummary,\r\n getConfirmationEmailInfo: getConfirmationEmailInfo,\r\n getActionLinks: function () { return bookingActionLink.get(); },\r\n formatTitle: formatTitle,\r\n sendConfirmationEmail: sendConfirmationEmail,\r\n getContact: getContact,\r\n putContact: putContact,\r\n removeCanceledBookings: removeCanceledBookings,\r\n calculateType: calculateType,\r\n formatBookingMessage: formatBookingMessage,\r\n setLimitBooking: setLimitBooking,\r\n getBookingInfo: getBookingInfo,\r\n getObjectFromBooking: getObjectFromBooking,\r\n actionRedirect: actionRedirect,\r\n actionClick: actionClick,\r\n getChildActions: getChildActions,\r\n getPahFromNotifications: getPahFromNotifications,\r\n getBookingActions: getBookingActions,\r\n translateActionLink: translateActionLink,\r\n getTripTitle: getTripTitle,\r\n getFlightBooking: getFlightBooking,\r\n isPartOfHoliday: isPartOfHoliday,\r\n getMybBooking: getMybBooking,\r\n getTripDateText: getTripDateText,\r\n filterFinalBookings: filterFinalBookings\r\n };\r\n function calculateType(abbr) {\r\n return bookingTypes[abbr] || abbr;\r\n }\r\n function getBookingActions() {\r\n return angular.copy(bookingActions);\r\n }\r\n // Gets the list of trips linked to the user\r\n function _getTripsInformation(period, tripId) {\r\n return $http.post('website/dashboard/trips/information', {\r\n Period: period,\r\n TripId: tripId\r\n }).then(function (res) {\r\n if (!res || !res.data || !res.data.Trips || (!res.data.Trips.length && tripId) || res.data.InValidOwner) {\r\n return _bookingOwnershipRejection(tripId);\r\n }\r\n return res.data.Trips;\r\n });\r\n }\r\n function getBookingDetailsForTrip(tripId) {\r\n return $http.post(v2ManageUrl + \"/getbookingdetailsfortrip\", { TripId: tripId, CultureCode: TRPCONFIG.Domain.CultureCode })\r\n .then(function (res) {\r\n var bookingDetails = angular\r\n .copy(res.data.BookingDetails)\r\n .filter(function (d) { return d.BookedItems && d.BookedItems.length && d.Booking && d.LeadPassenger; });\r\n bookingDetails.forEach(function (detail) {\r\n if (detail.Booking) {\r\n detail.Booking.LongType = calculateType(detail.Booking.Type);\r\n }\r\n });\r\n return bookingDetails;\r\n });\r\n }\r\n function getOutstandingTrips(period, tripId, crossSell) {\r\n if (crossSell === void 0) { crossSell = false; }\r\n if (tripsPromiseCache[period]) {\r\n return tripsPromiseCache[period];\r\n }\r\n if (tripId && tripsPromiseCache.reference && tripsPromiseCache.reference[tripId]) {\r\n return tripsPromiseCache.reference[tripId];\r\n }\r\n var tripsPromise = _getTripsInformation(period, tripId)\r\n .then(function _parseOutstandingTrip(trips) {\r\n ['userSet', 'bookingComplete', 'paymentComplete', 'reviewEntered', 'csrRaised', 'apiAdded']\r\n .forEach(function (event) { return broker.subscribe('dashboardBookingService', event, function () { return tripsPromiseCache = {}; }); });\r\n if (trips && trips.length) {\r\n trips[0].isExpanded = true;\r\n if (tripId && trips.length === 1) {\r\n trips[0].Bookings[0].showOptions = true;\r\n }\r\n trips.forEach(function (tr) {\r\n tr.Bookings.forEach(function (bk) {\r\n bk.LongType = calculateType(bk.Type);\r\n _createActionList(bk);\r\n _addBookingImage(bk);\r\n });\r\n _processPackageTripIfNeeded(tr);\r\n });\r\n var flightBooking_2 = _.find(trips[0].Bookings, function (b) { return b.Type === 1; });\r\n if (flightBooking_2 && !flightBooking_2.ObjectId) {\r\n service.getObjectFromBooking(flightBooking_2.BookingId).then(function (obj) {\r\n return flightBooking_2.ImageUrl = imageService.getDestinationImage(obj, bookingImageWidth, bookingImageHeight);\r\n });\r\n }\r\n if (crossSell) {\r\n crossSellService.addExtrasAndCrossSells(trips[0]);\r\n }\r\n }\r\n return trips;\r\n });\r\n if (period) {\r\n tripsPromiseCache[period] = tripsPromise;\r\n }\r\n else {\r\n if (!tripsPromiseCache.reference) {\r\n tripsPromiseCache.reference = {};\r\n }\r\n tripsPromiseCache.reference[tripId] = tripsPromise;\r\n }\r\n return tripsPromise;\r\n }\r\n function getTripTitle(tr) {\r\n return _.uniqBy(tr.Bookings, 'Type').reduce(function (title, bk, index) {\r\n return title + (index ? ' + ' : '') + resourceService.get(bk.LongType.code);\r\n }, '');\r\n }\r\n function isPartOfHoliday(bookingId) {\r\n return getOutstandingTrips(null, bookingId).then(function (trips) {\r\n return _.every(trips, function (tr) { return _.some(tr.Bookings, function (bk) { return bk.Type === bookingTypeMap.flight; })\r\n && _.some(tr.Bookings, function (bk) { return bk.Type === bookingTypeMap.accommodation; }); });\r\n });\r\n }\r\n function getTripDateText(tr) {\r\n var bookings = angular.copy(tr.Bookings);\r\n var cancelled = _.remove(bookings, function (bk) { return bk.Status === bookingStatus.canceled; });\r\n var oldBookings = _.remove(bookings, function (bk) { return dateUtil.compareDates(bk.ReturnDate, dateUtil.todayPlus(0, 0, true)) === -1; });\r\n if (cancelled.length === tr.Bookings.length) {\r\n return resourceService.get('TRIPCANCELLED');\r\n }\r\n var bookingsForTrip = bookings.length ? bookings : oldBookings;\r\n if (bookingsForTrip.length > 0) {\r\n return resourceService.get('TRIPDATE') + \" \" + unadjustedDateFilter(_.reduce(bookingsForTrip, function (startDate, bk) {\r\n return (dateUtil.compareDates(bk.StartDate, startDate) === -1) ? bk.StartDate : startDate;\r\n }, bookingsForTrip[0].StartDate), 'dd MMM yyyy');\r\n }\r\n }\r\n function _createActionList(booking) {\r\n booking.BookingOptions.Actions.map(function (a) {\r\n var action = bookingActions[a.Name];\r\n a.label = action ? action.label : a.Name;\r\n if (action) {\r\n a.icon = action.icon;\r\n a.trackEvent = action.trackEvent;\r\n }\r\n return a;\r\n });\r\n }\r\n function _addBookingImage(bk) {\r\n if (bk.Type === bookingTypeMap.accommodation) {\r\n bk.ImageUrl = imageService.getMainImageUrl(bk.ObjectId, bookingImageWidth, bookingImageHeight, true);\r\n }\r\n if (!bk.ImageUrl) {\r\n bk.ImageUrl = bookingTypes[bk.Type].defaultImage;\r\n }\r\n }\r\n function _processPackageTripIfNeeded(trip) {\r\n var _a = [8, 1].map(function (type) { return _.chain(trip)\r\n .get('Bookings')\r\n .find(['Type', type]); }), hotelBooking = _a[0], flightBooking = _a[1];\r\n var removePayBalance = [hotelBooking, flightBooking].every(function (booking) {\r\n return booking.get('PackageId').value();\r\n });\r\n if (removePayBalance) {\r\n var messages = _.chain([flightBooking, hotelBooking])\r\n .map(function (booking) { return booking.pick(['BalanceDueInfo', 'BookingId']).value(); })\r\n .filter('BalanceDueInfo')\r\n .value();\r\n var actions = _.chain([flightBooking, hotelBooking]).flatMap(function (booking) {\r\n booking.unset('BalanceDueInfo')\r\n .value();\r\n booking.get('TopInfoTexts')\r\n .remove(function (info) { return info && info.type === 8; })\r\n .value();\r\n return booking.get('BookingOptions.Actions')\r\n .remove(function (action) { return action && action.Name === 'PAYBALANCE'; })\r\n .value();\r\n }).value();\r\n trip.packagePaymentsData = _.zipWith(messages, actions, function (message, action) { return _.defaults(message, { Action: action }); });\r\n }\r\n }\r\n function getObjectFromBooking(bookingId) {\r\n var obj = {};\r\n return service.getFlightBooking(bookingId).then(function (result) {\r\n var bookedItems = result.data;\r\n var destinationAirportCode = _.find(bookedItems.Itineraries, function (i) { return i.ItineraryTypeId === 1; }).DestinationAiport;\r\n return $http.get(\"/api2/destination/airports/getairportlocation?\" + $.param({\r\n airportCode: destinationAirportCode,\r\n cultureCode: TRPCONFIG.Domain.CultureCode\r\n }), { ignoreErrors: true }).then(function (r) {\r\n var destination = r.data;\r\n obj.ObjectId = destination.LocationId !== 0 ? destination.LocationId : destination.ProvinceId;\r\n obj.ObjectTypeId = destination.LocationId !== 0 ? destinationType.Location : destinationType.Province;\r\n return obj;\r\n });\r\n });\r\n }\r\n function getFlightBooking(bookingId) {\r\n return $http.get(\"/api2/flightsnew/booking/\" + bookingId, { cache: true, ignoreErrors: true });\r\n }\r\n function getBookingInfo(bookingId) {\r\n return getOutstandingTrips(null, bookingId, true).then(function (trips) {\r\n return _.find(trips[0].Bookings, function (bk) {\r\n return bk.BookingId === parseInt(bookingId);\r\n });\r\n });\r\n }\r\n function setLimitBooking(n) {\r\n limitBooking = n;\r\n }\r\n // This function basically redirects the login straight to the booking details.\r\n function actionRedirect(action, booking) {\r\n var actionLink = service.getActionLinks();\r\n var path = translateActionLink(actionLink.VIEWBOOKINGDETAILS, booking);\r\n $location.url(path);\r\n }\r\n function actionClick(action, booking) {\r\n var actionLink = service.getActionLinks();\r\n if (action.disabled) {\r\n return false;\r\n }\r\n if (TRPCONFIG.Domain2.BookingCtaRedirectEnabled) {\r\n var enableRedirect = ['CANCELBOOKINGS', 'CSR', 'AMENDBOOKING'].includes(action.Name);\r\n if (enableRedirect) {\r\n window.open(TRPCONFIG.Domain2.BookingCtaRedirectUrl, '_blank');\r\n return false;\r\n }\r\n }\r\n if (actionLink) {\r\n if (action.trackEvent) {\r\n mybTrack.track(action.trackEvent);\r\n }\r\n var path = translateActionLink(actionLink[action.Name], booking);\r\n if (action.OpenNewTab) {\r\n window.open(path, '_blank');\r\n return false;\r\n }\r\n $location.url(path);\r\n }\r\n }\r\n function translateActionLink(link, booking) {\r\n return link ? $interpolate(link)(booking) : '';\r\n }\r\n var TopInfo = {\r\n PayAtHotel: 7\r\n };\r\n var notificationData = {\r\n 3: 'BalanceDue',\r\n 7: 'PayAtHotel'\r\n };\r\n function formatBookingMessage(info, bk) {\r\n var resourceVal = resourceService.get(info.text);\r\n if (info.action.Name) {\r\n var actionLink = service.getActionLinks();\r\n var actionPath = translateActionLink(actionLink[info.action.Name], bk);\r\n resourceVal = String.format(resourceVal, actionPath);\r\n }\r\n switch (info.type) {\r\n case TopInfo.PayAtHotel: {\r\n var pah = getPahFromNotifications(bk.Notifications);\r\n return pah ? String.format(resourceVal, customCurrencyFilter(pah.Amount, pah.CurrencyCode)) : '';\r\n }\r\n }\r\n return resourceVal;\r\n }\r\n function getPahFromNotifications(notifications) {\r\n return _.reduce(notifications, function (pah, n) {\r\n if (TopInfo.PayAtHotel === TopInfo[notificationData[n.Type]]) {\r\n pah.Amount += n.Amount;\r\n pah.CurrencyCode = n.CurrencyCode;\r\n }\r\n return pah;\r\n }, { Amount: 0 });\r\n }\r\n function removeCanceledBookings(trips) {\r\n var filteredTrips = [];\r\n _.forEach(trips, function (t) {\r\n t.Bookings = _.filter(t.Bookings, function (b) { return b.Status !== bookingStatus.canceled; });\r\n if (t.Bookings.length > 0) {\r\n filteredTrips.push(t);\r\n }\r\n });\r\n return filteredTrips;\r\n }\r\n /* This function to filter the bookings of EKH suppported products with Receipted status */\r\n function filterFinalBookings(TripItineraries) {\r\n var bookingTypeArr = [1, 8, 32, 256, 2048]; /* flight, accomodation, transfer, marhaba, adhoc */\r\n TripItineraries = TripItineraries.filter(function (t) {\r\n return t.BookingStatus === 2 && bookingTypeArr.indexOf(t.BookingType) !== -1;\r\n });\r\n return TripItineraries;\r\n }\r\n // This funciton has been created to remove duplications of passengers where one is a type of ADULT and one a type of CHILD.\r\n function dedupePassengers(paxData) {\r\n var hotelPax = paxData.filter(function (p) {\r\n return p.ItineraryId > 0;\r\n });\r\n paxData = hotelPax.length > 0 ? hotelPax : paxData;\r\n paxData = paxData.filter(function (data, index, self) {\r\n return index === self.findIndex(function (d) { return (d.FirstName === data.FirstName && d.LastName === data.LastName && (d.AgeOnReturn === data.AgeOnReturn || d.AgeOnReturn <= data.AgeOnReturn)); });\r\n });\r\n return paxData;\r\n }\r\n // Gets details regarding a booking and adds full booking type\r\n function getBookingDetail(bookingId, viewDetail, culture) {\r\n if (viewDetail === void 0) { viewDetail = false; }\r\n var cultureCode = culture === 'en-gb' ? TRPCONFIG.Domain.MYBDefaultCultureCode : TRPCONFIG.Domain.CultureCode;\r\n var promise = viewDetail\r\n ? $http.get(\"website/bookingdetails/\" + bookingId + \"/\" + cultureCode) : $http.post(v2ManageUrl + \"/getbookingdetailv2\", { BookingId: bookingId, Culture: cultureCode });\r\n return promise.then(function (res) {\r\n if (res.data && res.data.Passengers) {\r\n res.data.Passengers = dedupePassengers(res.data.Passengers);\r\n }\r\n if (!res || !res.data) {\r\n return;\r\n }\r\n if (res.data.InValidOwner) {\r\n return _bookingOwnershipRejection(bookingId);\r\n }\r\n if (viewDetail) {\r\n return parseBooking(res.data);\r\n }\r\n return res.data;\r\n });\r\n }\r\n function getFuturePayments(booking) {\r\n if (!booking) {\r\n return $q.when();\r\n }\r\n return getBookingDetail(booking.BookingId, true).then(function (details) { return _.get(details, 'FuturePayments'); })\r\n .then(function (fp) { return booking.FuturePayments = fp; });\r\n }\r\n function parseBooking(detail) {\r\n var booking = detail.Booking;\r\n booking.LongType = calculateType(booking.Type);\r\n var passengerTitles = {\r\n accommodation: {\r\n plural: 'GUESTS',\r\n singular: 'LEADGUEST'\r\n },\r\n tickets: {\r\n plural: 'VISITORS',\r\n singular: 'VISITOR'\r\n },\r\n defaultTitle: {\r\n plural: 'PASSENGERS',\r\n singular: 'PASSENGER'\r\n }\r\n };\r\n var titles = passengerTitles[booking.LongType.template] || passengerTitles.defaultTitle;\r\n booking.PassengersTitlePlural = resourceService.get(titles.plural);\r\n booking.PassengersTitleSingular = resourceService.get(titles.singular);\r\n return detail;\r\n }\r\n // Gets booking summary\r\n function getBookingSummary(bookingId) {\r\n return $http.get(v2ManageUrl + \"/bookingsummary?bookingId=\" + bookingId, { ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n // Gets details regarding the confirmation email\r\n function getConfirmationEmailInfo(bookingId) {\r\n var cultureCode = TRPCONFIG.Domain.CultureCode;\r\n return $http.post(baseManageUrl + \"/getconfirmationemailinfo\", { BookingId: bookingId, Culture: cultureCode });\r\n }\r\n // Gets contact\r\n function getContact(bookingId) {\r\n return $http.get(v2ManageUrl + \"/contactdetails/\" + bookingId);\r\n }\r\n // updates contact\r\n function putContact(bookingId, contactDetail, updateRelatedBookings) {\r\n if (updateRelatedBookings) {\r\n contactDetail.BookingId = bookingId;\r\n return $http.post(String.format('{0}/{1}/{2}', v2ManageUrl, 'contactdetails', 'updatecontactdetailsforlinkedbookings'), contactDetail);\r\n }\r\n return $http.put(String.format('{0}/{1}/{2}', v2ManageUrl, 'contactdetails', bookingId), contactDetail);\r\n }\r\n // Format the Title by removing the supplier name\r\n function formatTitle(bk) {\r\n //If not Insurance booking\r\n if (bk.Type !== bookingTypeMap.travelInsurance && bk.Type !== bookingTypeMap.bundle && bk.Title) {\r\n var titleArray = bk.Title.split(':');\r\n bk.Title = (titleArray.length > 1) ? titleArray[1].trim() : titleArray[0];\r\n }\r\n }\r\n //Resend Email Confirmation\r\n function sendConfirmationEmail(emails, bookingId) {\r\n return $http.post(baseManageUrl + \"/sendconfirmationemail\", {\r\n BookingId: bookingId,\r\n Culture: TRPCONFIG.Domain.CultureCode,\r\n Emails: emails\r\n });\r\n }\r\n function _bookingOwnershipRejection(id) {\r\n dashboardBookingsErrorMessage.setMessage(id);\r\n var user = authService.getUser();\r\n if (user.HardSignedIn) {\r\n $location.path('/dashboard/bookings/current');\r\n }\r\n var bookingId = authService.getSignedInBookingId();\r\n if (bookingId) {\r\n $location.path(\"/dashboard/bookings/reference/\" + bookingId);\r\n }\r\n return $q.reject();\r\n }\r\n function getChildActions(actions, parent) {\r\n return _.filter(actions, function (a) {\r\n return a.ParentActionName === parent;\r\n });\r\n }\r\n function getMybBooking(BookingId) {\r\n if (BookingId === void 0) { BookingId = $routeParams.BookingId; }\r\n return $http.get('/api/bookings/myb/getbooking', {\r\n params: {\r\n BookingId: BookingId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n },\r\n cache: true,\r\n })\r\n .then(function (_a) {\r\n var data = _a.data;\r\n return data;\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardBookingsErrorMessage = /** @class */ (function () {\r\n function DashboardBookingsErrorMessage() {\r\n }\r\n DashboardBookingsErrorMessage.prototype.setMessage = function (bookingId) {\r\n this.bookingNotYours = bookingId;\r\n };\r\n DashboardBookingsErrorMessage.prototype.getMessage = function () {\r\n var bookingId = this.bookingNotYours;\r\n this.bookingNotYours = null;\r\n return bookingId;\r\n };\r\n return DashboardBookingsErrorMessage;\r\n }());\r\n Dashboard.DashboardBookingsErrorMessage = DashboardBookingsErrorMessage;\r\n angular\r\n .module('dashboard')\r\n .service('dashboardBookingsErrorMessage', DashboardBookingsErrorMessage);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var DashboardBreadCrumb = /** @class */ (function () {\r\n function DashboardBreadCrumb(resourceService, unadjustedDateFilter, dashboardBookingService, currentUser, $routeParams) {\r\n this.resourceService = resourceService;\r\n this.unadjustedDateFilter = unadjustedDateFilter;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.currentUser = currentUser;\r\n this.$routeParams = $routeParams;\r\n this.extraCrumbs = {\r\n MYBOOKINGS: {\r\n label: this.resourceService.get(this.currentUser.get().HardSignedIn\r\n ? 'DASHBOARDRESOURCE_MYBOOKINGS'\r\n : 'DASHBOARDRESOURCE_MYBOOKING'),\r\n PagePath: this.currentUser.get().HardSignedIn ?\r\n 'dashboard/bookings/current' : 'dashboard/bookings/reference/{{::BookingId}}'\r\n },\r\n RAISECSR: {\r\n label: 'DASHBOARDRESOURCE_RAISECSR',\r\n PagePath: 'dashboard/create-csr/{{::BookingId}}'\r\n },\r\n CSRDETAILS: {\r\n label: this.resourceService.get('CSRREF') + ': {{::CsrId}}',\r\n PagePath: 'dashboard/csr-details/{{::BookingId}}/{{::CsrId}}'\r\n },\r\n SEATSELECTION: {\r\n label: this.resourceService.get('SEATSELECTIONBREADCRUMB'),\r\n PagePath: 'dashboard/seat-selection/{{::BookingId}}'\r\n }\r\n };\r\n this.bookingTypes = dashboardBookingService.getBookingTypeMap();\r\n }\r\n DashboardBreadCrumb.prototype.get = function (pages, bk) {\r\n var _this = this;\r\n if (bk) {\r\n var bookingType = this.getBookingTypeText(bk);\r\n var title = bk.Title ? (bk.Title + ' ') : '';\r\n this.extraCrumbs['VIEWBOOKINGDETAILS'] = {\r\n label: \"\" + title + bookingType + \" \" + this.unadjustedDateFilter(bk.StartDate, 'dd MMM yyyy'),\r\n PagePath: 'dashboard/booking-details/{{::BookingId}}'\r\n };\r\n }\r\n var actions = _.extend(this.dashboardBookingService.getBookingActions(), this.extraCrumbs);\r\n if (pages) {\r\n var actionLinks_1 = this.dashboardBookingService.getActionLinks();\r\n var crumbTrail = pages.split('|').map(function (page) { return ({\r\n Title: _this.dashboardBookingService.translateActionLink(actions[page]\r\n && _this.resourceService.get(actions[page].label), {\r\n BookingId: bk && bk.BookingId,\r\n CsrId: _this.$routeParams.csrId\r\n }),\r\n PagePath: _this.dashboardBookingService.translateActionLink(actions[page] && actions[page].PagePath\r\n || actionLinks_1[page], {\r\n BookingId: bk && bk.BookingId,\r\n CsrId: _this.$routeParams.csrId\r\n })\r\n }); }).filter(function (page) { return page.PagePath && page.Title; });\r\n return crumbTrail;\r\n }\r\n return [];\r\n };\r\n DashboardBreadCrumb.prototype.getBookingTypeText = function (bk) {\r\n return _.includes([\r\n this.bookingTypes.transfer,\r\n this.bookingTypes.accommodation,\r\n this.bookingTypes.attraction,\r\n ], bk.Type) ? '' : this.resourceService.get(bk.LongType.code);\r\n };\r\n return DashboardBreadCrumb;\r\n }());\r\n Dashboard.DashboardBreadCrumb = DashboardBreadCrumb;\r\n angular\r\n .module('dashboard')\r\n .service('dashboardBreadCrumbDetails', DashboardBreadCrumb);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('dashboardCsrService', dashboardCsrService);\r\n function dashboardCsrService($http, $q, resourceService, dateUtil, dashboardBookingService) {\r\n var csrStatus = {\r\n 1: 'CSRUNALLOCATED',\r\n 2: 'CSRINPROGRESS',\r\n 3: 'CSRSTATUSCOMPLETED',\r\n 4: 'CSRAWAITINGRESPONSE',\r\n 5: 'CSRAWAITINGACKNOWLEDGEMENT'\r\n };\r\n var csrStatusClass = {\r\n 1: 'csr-unallocated',\r\n 2: 'csr-inprogress',\r\n 3: 'csr-completed',\r\n 4: 'csr-awaiting-response',\r\n 5: 'csr-waiting-acknowledge'\r\n };\r\n var baseCsrUrl = '/api2/csr/customer';\r\n var service = {\r\n getCSRStatus: getCSRStatus,\r\n getCSRStatusCode: getCSRStatusCode,\r\n getCSRSummary: getCSRSummary,\r\n getCSRDetail: getCSRDetail,\r\n getCsrCategories: getCsrCategories,\r\n createCsr: createCsr,\r\n getAllCSRs: getAllCSRs,\r\n htmlifyLineBreaks: htmlifyLineBreaks,\r\n getCsrStatusClass: getCsrStatusClass,\r\n getConvertationFromCsr: getConvertationFromCsr,\r\n addCsrToBooking: addCsrToBooking,\r\n getSenderTitle: getSenderTitle,\r\n submitMessage: submitMessage\r\n };\r\n function getAllCSRs() {\r\n return $http.get(baseCsrUrl + \"?domainId=\" + TRPCONFIG.Domain.DomainId, { ignoreErrors: true }).then(function (res) {\r\n return _.map(res.data, function (csr) { return _enrichCSR(csr); });\r\n });\r\n }\r\n function getCSRStatus(id) {\r\n return resourceService.get(csrStatus[id]);\r\n }\r\n function getCSRStatusCode(id) {\r\n return angular.copy(csrStatus[id]);\r\n }\r\n function getCsrStatusClass(id) {\r\n return angular.copy(csrStatusClass[id]);\r\n }\r\n function getCSRSummary(bookingId) {\r\n return $http.get(baseCsrUrl + \"/booking/\" + bookingId).then(_parseCSRSummary);\r\n }\r\n function getCSRDetail(bookingId) {\r\n return $http.get(baseCsrUrl + \"/\" + bookingId).then(function (r) { return _enrichCSR(r.data); });\r\n }\r\n function _parseCSRSummary(res) {\r\n var csr = {\r\n completed: [],\r\n pending: []\r\n };\r\n res.data.forEach(function (item) {\r\n _enrichCSR(item);\r\n if (item.Status === 3) {\r\n csr.completed.push(item);\r\n }\r\n else {\r\n csr.pending.push(item);\r\n }\r\n });\r\n csr.pending = _.orderBy(csr.pending, function (csr) { return csr.lastUpdated; }, 'desc');\r\n return csr;\r\n }\r\n function _enrichCSR(item) {\r\n item.conversation = getConvertationFromCsr(item);\r\n item.openQuestion = _.find(item.Questions, function (q) { return !q.Answer; });\r\n item.lastUpdated = _.reduce(item.conversation, function (updatedDate, c) {\r\n return (dateUtil.compareDates(c.date, updatedDate) === 1) ? c.date : updatedDate;\r\n }, item.CreatedDate);\r\n item.StatusResource = getCSRStatus(item.Status);\r\n item.AddNoteAllowed = item.Status !== 3;\r\n return item;\r\n }\r\n function getCsrCategories(bookingType, bookingId) {\r\n return $http.get(\"/api2/csr/categories?\" + $.param({\r\n BookingType: bookingType,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n BookingId: bookingId\r\n })).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function createCsr(csr, bookingId, mobileTel) {\r\n return $http.post(baseCsrUrl, {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n BookingId: bookingId,\r\n CategoryId: csr.Category.Id,\r\n TextAlerts: csr.TextAlerts,\r\n Subject: csr.Subject,\r\n Text: csr.Text,\r\n MobileTel: mobileTel\r\n }).then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n function _answerToQuestion(questionId, answerText) {\r\n return $http.post(baseCsrUrl + \"/question/\" + questionId + \"/answer\", {\r\n AnswerText: answerText\r\n });\r\n }\r\n function _addLogToCsr(log, csrId) {\r\n return $http.post(baseCsrUrl + \"/\" + csrId + \"/log\", log);\r\n }\r\n function submitMessage(csr) {\r\n var question = _.find(csr.conversation, function (c) { return c.openQuestion; });\r\n if (question && (question.questionId > -1)) {\r\n return _answerToQuestion(question.questionId, csr.newMessage).then(function () {\r\n csr.conversation.push({\r\n text: htmlifyLineBreaks(csr.newMessage),\r\n createdByCustomer: true\r\n });\r\n csr.newMessage = null;\r\n question.openQuestion = null;\r\n return true;\r\n });\r\n }\r\n if (csr.AddNoteAllowed) {\r\n return _addLogToCsr({ Text: csr.newMessage }, csr.CsrId).then(function () {\r\n csr.conversation.push({\r\n text: htmlifyLineBreaks(csr.newMessage),\r\n createdByCustomer: true\r\n });\r\n csr.newMessage = null;\r\n return true;\r\n });\r\n }\r\n return $q.when(false);\r\n }\r\n function htmlifyLineBreaks(text) {\r\n return text ? text.replace(/\\s*\\n|\\n\\s*/g, '
        ').replace(/\\n/g, '
        ') : text;\r\n }\r\n function getConvertationFromCsr(csr) {\r\n var openQuestion = _.find(csr.Questions, function (q) { return !q.Answer; });\r\n var sortedCoversation = _.orderBy(_.concat(csr.Questions, csr.Logs), function (c) { return c.QuestionDate || c.CreatedDate; });\r\n var initialText = {\r\n text: htmlifyLineBreaks(csr.Text),\r\n date: csr.CreatedDate,\r\n createdByCustomer: !csr.AgentName,\r\n agentName: csr.AgentName\r\n };\r\n var conversations = _.flatMap(sortedCoversation, function (c) {\r\n if (c.QuestionDate) {\r\n //c is a question and answer\r\n if (c.Answer) {\r\n var q = {\r\n text: htmlifyLineBreaks(c.QuestionText),\r\n date: c.QuestionDate,\r\n agentName: c.AgentName\r\n };\r\n var a = {\r\n text: htmlifyLineBreaks(c.Answer),\r\n date: c.AnswerDate,\r\n createdByCustomer: true\r\n };\r\n return [q, a];\r\n }\r\n }\r\n else {\r\n // c is a log\r\n var l = {\r\n text: htmlifyLineBreaks(c.Text),\r\n date: c.CreatedDate,\r\n createdByCustomer: c.CreatedByCustomer,\r\n agentName: c.AgentName\r\n };\r\n return l;\r\n }\r\n });\r\n if (openQuestion) {\r\n var q = {\r\n text: htmlifyLineBreaks(openQuestion.QuestionText),\r\n date: openQuestion.QuestionDate,\r\n questionId: openQuestion.Id,\r\n openQuestion: true,\r\n agentName: openQuestion.AgentName\r\n };\r\n conversations.push(q);\r\n }\r\n var validConversation = _.filter(conversations, function (c) { return c != null; });\r\n if (initialText.text != null && initialText.text.length > 0) {\r\n validConversation.unshift(initialText);\r\n }\r\n return validConversation;\r\n }\r\n function getSenderTitle(conversation) {\r\n return conversation.createdByCustomer ?\r\n resourceService.get('CSRYOUASKED') :\r\n String.format(resourceService.get('CSRAGENTASKED'), conversation.agentName);\r\n }\r\n function addCsrToBooking(trips) {\r\n service.getAllCSRs().then(function (csrs) {\r\n var allCsrs = _.orderBy(csrs, 'lastUpdated', 'desc');\r\n _.each(trips, function (tr) {\r\n _.each(tr.Bookings, function (bk) {\r\n bk.csr = {\r\n message: _getCsrMessage(bk.BookingId, allCsrs),\r\n statusClass: _getCsrStatusClass(bk.BookingId, allCsrs)\r\n };\r\n });\r\n });\r\n });\r\n }\r\n function _getCsrMessage(bookingId, allCsrs) {\r\n var csr = _.find(allCsrs, ['BookingId', bookingId]);\r\n var resourceVal = csr ? resourceService.get(\"MYB\" + service.getCSRStatusCode(csr.Status)) : '';\r\n var actionPath = dashboardBookingService.translateActionLink('dashboard/csr/{{BookingId}}', { BookingId: bookingId });\r\n if (csr) {\r\n if (csr.Status === 4) {\r\n var openQuestion = _.find(csr.Questions, function (q) { return !q.Answer; });\r\n resourceVal = String.format(decodeURI(resourceVal), openQuestion.AgentName, actionPath);\r\n }\r\n else {\r\n resourceVal = String.format(decodeURI(resourceVal), actionPath);\r\n }\r\n }\r\n return resourceVal;\r\n }\r\n function _getCsrStatusClass(bookingId, allCsrs) {\r\n var csr = _.find(allCsrs, ['BookingId', bookingId]);\r\n return csr ? service.getCsrStatusClass(csr.Status) : '';\r\n }\r\n return service;\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var Notification;\r\n (function (Notification) {\r\n Notification[Notification[\"CreateProfile\"] = 0] = \"CreateProfile\";\r\n Notification[Notification[\"TravelChange\"] = 1] = \"TravelChange\";\r\n Notification[Notification[\"CsrQuestion\"] = 2] = \"CsrQuestion\";\r\n Notification[Notification[\"DuePayment\"] = 3] = \"DuePayment\";\r\n Notification[Notification[\"PassengerApi\"] = 4] = \"PassengerApi\";\r\n Notification[Notification[\"NewsletterSignup\"] = 5] = \"NewsletterSignup\";\r\n Notification[Notification[\"HotelReview\"] = 6] = \"HotelReview\";\r\n Notification[Notification[\"PayAtHotel\"] = 7] = \"PayAtHotel\";\r\n Notification[Notification[\"OutboundFlightCheckin\"] = 8] = \"OutboundFlightCheckin\";\r\n Notification[Notification[\"InboundFlightCheckin\"] = 9] = \"InboundFlightCheckin\";\r\n })(Notification || (Notification = {}));\r\n ;\r\n var DashboardNotificationService = /** @class */ (function () {\r\n //private _notificationLinks: _.Dictionary = {1:'a'};\r\n function DashboardNotificationService($http, $location, $interpolate, $filter, dateUtil, resourceService, dashboardBookingService, notificationLink) {\r\n var _this = this;\r\n this.$http = $http;\r\n this.$location = $location;\r\n this.$interpolate = $interpolate;\r\n this.$filter = $filter;\r\n this.dateUtil = dateUtil;\r\n this.resourceService = resourceService;\r\n this.dashboardBookingService = dashboardBookingService;\r\n this.notificationLink = notificationLink;\r\n this._notificationTypes = {\r\n 1: function () { return _.identity('NOTICSRCHANGE'); },\r\n 2: function () { return _.identity('NOTICSR'); },\r\n 3: function (n) { return _this._getPaymentDueString(n); },\r\n 4: function () { return _.identity('NOTIAPI'); },\r\n 6: function () { return _.identity('NOTIREVIEW'); },\r\n 10: function () { return _.identity('NOTICREATEPROFILE'); }\r\n };\r\n this._notificationActionTypes = {\r\n 1: 'NOTICSRCHANGE_ACTION',\r\n 2: 'NOTICSR_ACTION',\r\n 3: 'NOTIPAYMENT_DUE_ACTION',\r\n 4: 'NOTIAPI_ACTION',\r\n 6: 'NOTIREVIEW_ACTION',\r\n 10: 'NOTICREATEPROFILE_ACTION'\r\n };\r\n this._paymentDueType = {\r\n hotelDue: 'NOTIDUEHOTEL',\r\n hotelOverDue: 'NOTIOVERDUEHOTEL',\r\n flightDue: 'NOTIDUEFLIGHT',\r\n flightOverDue: 'NOTIOVERDUEFLIGHT',\r\n transferDue: 'NOTIDUETRANSFER',\r\n transferOverDue: 'NOTIOVERDUETRANSFER'\r\n };\r\n this._desktopUrl = 'desktop-url/{{SiteId}}/{{BookingId}}/{{LastName}}';\r\n this.getNotificationLinks = function () { return _this.notificationLink.get(); };\r\n }\r\n DashboardNotificationService.prototype.getNotifications = function () {\r\n var _this = this;\r\n return this.$http.post('/api2/bookings/manage/getbookingnotifications', {\r\n Culture: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }, { ignoreErrors: true }).then(function (result) { return _this._postProcess(result); });\r\n };\r\n //getNotificationLinks() {\r\n // return angular.copy(this._notificationLinks);\r\n //}\r\n DashboardNotificationService.prototype.notificationClicked = function (notification) {\r\n var path = this._translateActionLink(this.getNotificationLinks()[notification.Type], notification);\r\n this.$location.url(path);\r\n };\r\n DashboardNotificationService.prototype.formatNotification = function (noti) {\r\n var resourceVal = this.resourceService.get(noti.templateString);\r\n var bookingType = this.resourceService.get(this.dashboardBookingService.calculateType(noti.BookingType).code);\r\n switch (noti.Type) {\r\n case Notification.TravelChange:\r\n return String.format(resourceVal, bookingType, noti.DestinationName);\r\n case Notification.CsrQuestion:\r\n return String.format(resourceVal, noti.AgentName, bookingType, noti.DestinationName);\r\n case Notification.DuePayment:\r\n var dueDateText = this.dueDateText(noti);\r\n return String.format(resourceVal, this.$filter('customCurrency')(noti.Amount, noti.CurrencyCode), noti.DestinationName, dueDateText);\r\n case Notification.PassengerApi:\r\n return String.format(resourceVal, noti.DestinationName);\r\n case Notification.HotelReview:\r\n return String.format(resourceVal, noti.DestinationName);\r\n }\r\n return resourceVal;\r\n };\r\n DashboardNotificationService.prototype.dueDateText = function (noti) {\r\n var days = this.dateUtil.dayDiff(this.dateUtil.todayPlus(0, 0, true), noti.DueDate) - 1;\r\n if (days > 1) {\r\n var daysWithin = this.resourceService.get('DAYSWITHIN');\r\n return String.format(daysWithin, days);\r\n }\r\n if (days === 1) {\r\n return this.resourceService.get('TOMORROW');\r\n }\r\n if (days === 0) {\r\n return this.resourceService.get('TODAY');\r\n }\r\n return '';\r\n };\r\n DashboardNotificationService.prototype._translateActionLink = function (link, booking) {\r\n return link ? this.$interpolate(link)(booking) : '';\r\n };\r\n DashboardNotificationService.prototype._getPaymentDueString = function (n) {\r\n var accommodationBooking = 8;\r\n var transferBooking = 32;\r\n var dayDiff = this.dateUtil.compareDates(this.dateUtil.todayPlus(1), n.DueDate);\r\n if (n.BookingType === accommodationBooking) {\r\n return (dayDiff === 1)\r\n ? this._paymentDueType.hotelOverDue : this._paymentDueType.hotelDue;\r\n }\r\n if (n.BookingType === transferBooking) {\r\n return (dayDiff === 1)\r\n ? this._paymentDueType.transferOverDue : this._paymentDueType.transferDue;\r\n }\r\n return (dayDiff === 1)\r\n ? this._paymentDueType.flightOverDue : this._paymentDueType.flightDue;\r\n };\r\n DashboardNotificationService.prototype._postProcess = function (result) {\r\n var _this = this;\r\n var notifications = result.data.Notifications;\r\n var validNoti = [];\r\n _.each(notifications, function (n) {\r\n if (_this._notificationTypes[n.Type]) {\r\n n.templateString = _this._notificationTypes[n.Type](n);\r\n n.actionString = _this.resourceService.get(_this._notificationActionTypes[n.Type]);\r\n validNoti.push(n);\r\n }\r\n });\r\n return validNoti;\r\n };\r\n return DashboardNotificationService;\r\n }());\r\n Dashboard.DashboardNotificationService = DashboardNotificationService;\r\n angular\r\n .module('dashboard')\r\n .service('dashboardNotificationService', DashboardNotificationService);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('deliveryAddressService', deliveryAddressService);\r\n function deliveryAddressService($http) {\r\n var url = '/api2/attractions/deliveryaddress/';\r\n return {\r\n get: function (bookingId) {\r\n return $http.get(url + bookingId);\r\n },\r\n put: function (bookingId, deliveryAddress) {\r\n return $http.put(String.format('{0}/{1}', url, bookingId), deliveryAddress);\r\n }\r\n };\r\n }\r\n})();\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var PassengerType = Core.Booking.PassengerType;\r\n var CrossSellType = Core.Booking.CrossSellType;\r\n var FlightExtrasService = /** @class */ (function () {\r\n function FlightExtrasService($http, dateUtil, paymentDetailsService, flightSeatPlanService, $q, broker) {\r\n var _this = this;\r\n this.$http = $http;\r\n this.dateUtil = dateUtil;\r\n this.paymentDetailsService = paymentDetailsService;\r\n this.flightSeatPlanService = flightSeatPlanService;\r\n this.$q = $q;\r\n this.broker = broker;\r\n this.extraProperties = {\r\n Bags: {\r\n Icon: 'icon-baggage',\r\n Code: 'HOLDBAGS'\r\n },\r\n Seats: {\r\n Icon: 'icon-seating',\r\n Code: 'SEATS'\r\n }\r\n };\r\n this.extrasCache = {};\r\n // make sure cross sells are updated after a payment\r\n broker.subscribe('flightExtraService', 'paymentComplete', function () { return _this.extrasCache = {}; });\r\n }\r\n FlightExtrasService.prototype.getOptionsData = function (bookingId) {\r\n var _this = this;\r\n return this.$http.post('/api2/bookings/flights/checkoptions', {\r\n BookingId: bookingId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }).then(function (_a) {\r\n var data = _a.data;\r\n // multi sector seat selection not yet supported\r\n var legs = data && data.Flight && data.Flight.Legs;\r\n var numberOfInfants = _.remove(data.Passengers, function (p) { return p.Type === PassengerType.Infant; }).length;\r\n var SeatPlan = legs && legs.length && legs.length <= 2\r\n ? {\r\n Segments: {\r\n Outbound: legs[0].Segments,\r\n Inbound: legs[1].Segments\r\n },\r\n Passengers: _.sortBy(data.Passengers, 'Type')\r\n .map(function (p, pIndex) { return _.defaults({\r\n Id: p.Id,\r\n Seats: _.flatMap(legs, function (leg) { return leg.Segments.map(function (seg) { return ({\r\n Number: null,\r\n Price: 0,\r\n LegId: leg.LegId,\r\n Segement: seg.SegmentHash //intentionally misspelt\r\n }); }); }),\r\n IsChild: p.Type === PassengerType.Child,\r\n HasInfant: p.Type === PassengerType.Adult && pIndex < numberOfInfants\r\n }, p); })\r\n }\r\n : null;\r\n SeatPlan && _this.flightSeatPlanService.addMinCostPerPerson(SeatPlan);\r\n return _.defaults(data, { SeatPlan: SeatPlan });\r\n });\r\n };\r\n FlightExtrasService.prototype.getExtrasCrossSell = function (bookingId) {\r\n var _this = this;\r\n if (this.extrasCache[bookingId]) {\r\n return this.$q.when(this.extrasCache[bookingId]);\r\n }\r\n var extras = [];\r\n return this.getOptionsData(bookingId).then(function (options) {\r\n if (options && options.CanAddBags && options.BagOptions && options.BagOptions.length > 0) {\r\n var extraBags = {\r\n CrossSellType: CrossSellType.Baggage,\r\n Price: {\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n Value: options.BagOptions[0].UnitAmount / 2\r\n },\r\n Priority: null,\r\n IsFlightExtra: true,\r\n BookingId: bookingId,\r\n Name: 'ADDBAGGAGE',\r\n Icon: _this.extraProperties.Bags.Icon,\r\n Code: _this.extraProperties.Bags.Code\r\n };\r\n extraBags.Priority = extras.push(extraBags) - 1;\r\n }\r\n if (TRPCONFIG.Domain.DashboardAddSeatsEnabled && options && options.CanAddSeats) {\r\n var extraSeats = {\r\n CrossSellType: CrossSellType.Seats,\r\n Price: {\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n Value: options.SeatPlan.minCostPerPerson\r\n },\r\n Priority: null,\r\n IsFlightExtra: true,\r\n BookingId: bookingId,\r\n Name: 'ADDSEATS',\r\n Icon: _this.extraProperties.Seats.Icon,\r\n Code: _this.extraProperties.Seats.Code\r\n };\r\n extraSeats.Priority = extras.push(extraSeats) - 1;\r\n }\r\n _this.extrasCache[bookingId] = extras;\r\n return extras;\r\n }, function () { return extras; });\r\n };\r\n //Transaction\r\n FlightExtrasService.prototype.addOptionsToBooking = function (request, requireCardValidation) {\r\n var _this = this;\r\n if (requireCardValidation) {\r\n var paymentRequest = request.PaymentRequest;\r\n var validateRequest = {\r\n CardNumber: TRPCONFIG.Domain.PCICompliant ?\r\n paymentRequest.CardNumberMasked : paymentRequest.CardNumber,\r\n StartDate: paymentRequest.CardStartYear && paymentRequest.CardEndMonth\r\n && this.dateUtil.serialiseDate(new Date(paymentRequest.CardStartYear, paymentRequest.CardStartMonth)),\r\n ExpiryDate: this.dateUtil.serialiseDate(new Date(paymentRequest.CardEndYear, paymentRequest.CardEndMonth)),\r\n CV2: paymentRequest.CardCvc,\r\n IssueNumber: paymentRequest.CardIssueNumber\r\n };\r\n return this.paymentDetailsService.validateCard(validateRequest).then(function (response) {\r\n if (response.Success) {\r\n return _this._clear(request);\r\n }\r\n return _this.$q.when(response);\r\n });\r\n }\r\n return this._clear(request);\r\n };\r\n FlightExtrasService.prototype._clear = function (request) {\r\n return this.$http.post('/api2/bookings/flights/addoptions', request).then(function (result) { return result.data; });\r\n };\r\n FlightExtrasService.prototype.finaliseOptions = function (request) {\r\n return this.$http.post('/api2/bookings/flights/finaliseoptions', request).then(function (result) { return result.data; });\r\n };\r\n return FlightExtrasService;\r\n }());\r\n Dashboard.FlightExtrasService = FlightExtrasService;\r\n angular\r\n .module('dashboard')\r\n .service('flightExtrasService', FlightExtrasService);\r\n})(Dashboard || (Dashboard = {}));\r\nvar Dashboard;\r\n(function (Dashboard) {\r\n var MybTrack = /** @class */ (function () {\r\n function MybTrack(analytics, currentUser) {\r\n this.analytics = analytics;\r\n this.currentUser = currentUser;\r\n }\r\n MybTrack.prototype.track = function (event, props) {\r\n if (props == null) {\r\n props = {};\r\n }\r\n props.SignIn = !!this.currentUser.get().HardSignedIn;\r\n this.analytics.track('mixpanel', event, props);\r\n };\r\n return MybTrack;\r\n }());\r\n Dashboard.MybTrack = MybTrack;\r\n angular\r\n .module('dashboard')\r\n .service('mybTrack', MybTrack);\r\n})(Dashboard || (Dashboard = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('onlineCheckinService', onlineCheckinService);\r\n function onlineCheckinService($http, $filter, resourceService) {\r\n var checkinURL = '/api2/flightscheckin';\r\n var service = {\r\n getOnlineCheckinOptions: getOnlineCheckinOptions,\r\n doCheckin: doCheckin,\r\n getCheckinAvailability: getCheckinAvailability,\r\n getCheckinType: getCheckinType,\r\n addCheckinData: addCheckinData\r\n };\r\n var flightClass = {\r\n 1: resourceService.getDeferred('ECONOMYCLASS'),\r\n 2: resourceService.getDeferred('PREMIUMECONOMYCLASS'),\r\n 4: resourceService.getDeferred('FIRSTCLASS'),\r\n 8: resourceService.getDeferred('BUSINESSCLASS')\r\n };\r\n var checkinType = {\r\n Unknown: { label: resourceService.getDeferred('ONLINECHECKIN_CHECKINSTATUSUNKNOWN'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\r\n NotSupported: { label: resourceService.getDeferred('ONLINECHECKIN_ONLINECHECKINNOTSUPPORTED'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\r\n Available: { label: resourceService.getDeferred('ONLINECHECKIN_CANCHECKIN'), isEnabled: true, isSupported: true, isCheckedIn: false, apiRequired: false },\r\n CheckedIn: { label: resourceService.getDeferred('ONLINECHECKIN_ALREADYCHECKEDIN'), isEnabled: false, isSupported: false, isCheckedIn: true, apiRequired: false },\r\n ApiRequired: { label: resourceService.getDeferred('ONLINECHECKIN_PENDINGPASSENGERDETAILS'), isEnabled: false, isSupported: true, isCheckedIn: false, apiRequired: true },\r\n Closed: { label: resourceService.getDeferred('ONLINECHECKIN_CHECKINCLOSED'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\r\n WaitingToOpen: { label: resourceService.getDeferred('ONLINECHECKIN_NOTINCHECKINWINDOW'), isEnabled: false, isSupported: true, isCheckedIn: false, apiRequired: false }\r\n };\r\n function getOnlineCheckinOptions(bookingId) {\r\n return $http.post(checkinURL + \"/options\", bookingId).then(function (result) {\r\n angular.forEach(result.data.Legs, function (leg) {\r\n getCheckinType(leg);\r\n leg.flightClass = flightClass[leg.FlightClass];\r\n angular.forEach(leg.Passengers, function (passenger) {\r\n passenger.passengerType = resourceService.get(passenger.Type);\r\n });\r\n });\r\n return result.data;\r\n });\r\n }\r\n function doCheckin(bookingId, legs) {\r\n return $http.post(checkinURL + \"/checkin\", { BookingId: bookingId, Legs: legs }).then(function (response) {\r\n return response.data;\r\n });\r\n }\r\n function getCheckinAvailability(bookingIds) {\r\n return $http.post(checkinURL + \"/availability\", { BookingIds: bookingIds }, { ignoreErrors: true }).then(function (result) {\r\n var data = result.data;\r\n angular.forEach(data, function (legs, bookingId) {\r\n var checkinData = {};\r\n var startTime;\r\n angular.forEach(legs, function (leg) {\r\n var isLegEarlier = (leg && (leg.CheckinStartTime < startTime)) || !startTime;\r\n startTime = leg && isLegEarlier ? leg.CheckinStartTime : startTime;\r\n });\r\n checkinData.checkinDisabled = !(startTime && (new Date() > new Date(startTime)));\r\n checkinData.checkinMessage = !checkinData.checkinDisabled ? resourceService.get('ONLINECHECKIN_CHECKINENABLED') : String.format(resourceService.get('ONLINECHECKIN_CHECKINSTARTFROM'), $filter('date')(startTime, 'dd MMM yyyy'), $filter('date')(startTime, 'HH:mm'));\r\n data[bookingId] = checkinData;\r\n });\r\n return data;\r\n });\r\n }\r\n function getCheckinType(leg) {\r\n leg.checkinType = checkinType[leg.CheckinState] ? checkinType[leg.CheckinState] : checkinType.Unknown;\r\n }\r\n function addCheckinData(trips) {\r\n var bookingIds = [];\r\n angular.forEach(trips, function (trip) {\r\n var booking = _.find(trip.Bookings, function (bk) { return bk.Status !== 2 && bk.DoesSupportOnlineCheckin; });\r\n if (booking) {\r\n bookingIds.push(booking.BookingId);\r\n }\r\n });\r\n if (bookingIds.length > 0) {\r\n getCheckinAvailability(bookingIds).then(function (checkinData) {\r\n angular.forEach(trips, function (trip) {\r\n angular.forEach(trip.Bookings, function (bk) {\r\n if (checkinData[bk.BookingId]) {\r\n var checkinAction = _.find(bk.BookingOptions.Actions, function (action) {\r\n return action.Name === 'ONLINECHECKIN';\r\n });\r\n if (checkinAction) {\r\n checkinAction.disabled = checkinData[bk.BookingId].checkinDisabled;\r\n checkinAction.disabledInfo = checkinData[bk.BookingId].checkinMessage;\r\n }\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('paymentDetailsService', paymentDetailsService);\r\n function paymentDetailsService($http, $interval, $location, $q, $rootScope, $timeout, dateUtil, resourceService, currentUser, bookingService) {\r\n var url = '/api2/payments/cards/customer/';\r\n var cardUrl = '/api2/payments/cards/';\r\n var transactionUrl = '/api2/payments/transactions/';\r\n var baseUrl = '/api2/payments/';\r\n var ddcTokenUrl = '/api2/payments/tokens/ddctoken';\r\n var service = {\r\n getPaymentTypes: getPaymentTypes,\r\n getPaymentCards: getPaymentCards,\r\n getPaymentOptions: getPaymentOptions,\r\n getSavedPaymentCards: getSavedPaymentCards,\r\n clearPayment: clearPayment,\r\n authorisePayment: authorisePayment,\r\n getCpgStatus: getCpgStatus,\r\n getcardFailureReasonCode: getcardFailureReasonCode,\r\n getcardFailureReasonMessage: getcardFailureReasonMessage,\r\n getPaymentLogos: getPaymentLogos,\r\n convertToPaymentCards: convertToPaymentCards,\r\n validateCard: validateCard,\r\n getDeviceDataCollectionToken: getDeviceDataCollectionToken\r\n };\r\n var cardFailureReasonCode = {\r\n Unknown: 0,\r\n InvalidCardNumber: 1,\r\n InvalidCardNumberLength: 2,\r\n CardHasExpired: 3,\r\n CardNotYetValid: 4,\r\n InvalidIssueNumber: 5\r\n };\r\n var cardFailureReasonMessage = {\r\n 0: 'INVALIDCARD',\r\n 1: 'INVALIDCARDNUMBER',\r\n 2: 'INVALIDCARDNUMBERLENGTH',\r\n 3: 'CARDHASEXPIRED',\r\n 4: 'CARDNOTYETVALID',\r\n 5: 'INVALIDISSUENUMBER'\r\n };\r\n function getcardFailureReasonCode() {\r\n return cardFailureReasonCode;\r\n }\r\n function getcardFailureReasonMessage(reasonCode) {\r\n return resourceService.get(cardFailureReasonMessage[reasonCode]);\r\n }\r\n //Payment Details\r\n function getPaymentCards() {\r\n return $http.get(url + \"get\", { ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getPaymentTypes(uniqueMasterCards, bookingType) {\r\n var allTypeOfCards = 0;\r\n return $http.get(cardUrl + \"gettypes?\" + $.param({\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n bookingTypeId: bookingType || allTypeOfCards\r\n }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n if (uniqueMasterCards) {\r\n //if uniqueMasterCards is requested. return unique types with respect to MasterdCardId.\r\n return _uniqueMasterCards(result.data);\r\n }\r\n //else return result as it is.\r\n return result.data;\r\n });\r\n }\r\n function _uniqueMasterCards(allCards) {\r\n var uniqueCards = [];\r\n var seen = {};\r\n var len = allCards.length;\r\n var j = 0;\r\n for (var i = 0; i < len; i++) {\r\n var card = allCards[i];\r\n var masterId = card.MasterCardTypeId;\r\n if (seen[masterId] !== 1) {\r\n seen[masterId] = 1;\r\n uniqueCards[j++] = card;\r\n }\r\n }\r\n return uniqueCards;\r\n }\r\n //End- Payment Details\r\n function getSavedPaymentCards(bookingType, bookingId, clientCurrencyCode) {\r\n //getsavedbookingcards is obsolete now. So calling get and joining with PaymentOptions\r\n var getOptions = service.getPaymentOptions(bookingType, bookingId, clientCurrencyCode);\r\n var getCards = TRPCONFIG.Domain.SavedCardsEnabled && currentUser.get() && currentUser.get().HardSignedIn ? service.getPaymentCards() : null;\r\n return $q.all([getOptions, getCards]).then(function (results) {\r\n return convertToPaymentCards.apply(void 0, results);\r\n });\r\n }\r\n function convertToPaymentCards(options, cards) {\r\n var paymentCards = [];\r\n _.each(cards, function (card) {\r\n var paymentOption = _.find(options, function (o) { return o.CardType === card.MasterCardTypeId; });\r\n if (paymentOption && !card.IsExpired) {\r\n card.CardTypeId = paymentOption.Id; //In payment directive PaymentOptionId is named as CardTypeId\r\n paymentCards.push(card);\r\n }\r\n });\r\n return paymentCards;\r\n }\r\n function getCardTypeId() {\r\n document.addEventListener('click', function (e) {\r\n var seEl = document.querySelectorAll('select[name=\"paymentType\"]')[0];\r\n if (e.target.classList.value.includes('button')) {\r\n var cardTypeId = seEl.value;\r\n if (cardTypeId !== '') {\r\n cardTypeId = cardTypeId.split(':');\r\n cardTypeId = Number(cardTypeId[1]);\r\n TRPCONFIG.Domain.CardTypeId = cardTypeId;\r\n }\r\n }\r\n }, true);\r\n }\r\n function getPaymentOptions(bookingType, bookingId, currencyCode) {\r\n getCardTypeId();\r\n return $http.get(baseUrl + \"getpaymentoptionsforbooking?\" + $.param({\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CurrencyCode: currencyCode,\r\n BookingTypeId: bookingType,\r\n BookingId: bookingId\r\n }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function validateCard(request) {\r\n return $http.post(cardUrl + \"validate\", request).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getDeviceDataCollectionToken(cardTypeId, timeout) {\r\n var requestParams = {\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n cardTypeId: cardTypeId\r\n };\r\n var networkParams = {\r\n ignoreErrors: true\r\n };\r\n if (timeout) {\r\n networkParams.timeout = timeout;\r\n }\r\n return $http.post(\"\" + ddcTokenUrl, requestParams, networkParams)\r\n .then(function (result) { return result.data; });\r\n }\r\n //Transaction\r\n function clearPayment(request, requireCardValidation) {\r\n if (requireCardValidation) {\r\n var validateRequest = {\r\n CardNumber: TRPCONFIG.Domain.PCICompliant ?\r\n request.CardNumberMasked : request.CardNumber,\r\n StartDate: dateUtil.serialiseDate(new Date(request.CardStartYear, request.CardStartMonth)),\r\n ExpiryDate: dateUtil.serialiseDate(new Date(request.CardEndYear, request.CardEndMonth)),\r\n CV2: request.CardCvc,\r\n IssueNumber: request.CardIssueNumber\r\n };\r\n return validateCard(validateRequest).then(function (response) {\r\n if (response.Success) {\r\n return _clear(request);\r\n }\r\n return $q.when(response);\r\n });\r\n }\r\n return _clear(request);\r\n }\r\n function _clear(request) {\r\n var updatedReq = __assign({}, request, { BrowserDetails: bookingService.browserDetails() });\r\n return $http.post(transactionUrl + \"clear\", updatedReq).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function authorisePayment(request) {\r\n return $http.post(transactionUrl + \"authorise\", request).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getCpgStatus(bookingId, paymentId) {\r\n var pollDelayMs = TRPCONFIG.Domain.CpgStatusIntervalDelay;\r\n var stopApiMs = TRPCONFIG.Domain.CpgStatusTimeout;\r\n if (!paymentId) {\r\n return null;\r\n }\r\n var siteID = TRPCONFIG.Domain.DomainId;\r\n var cpgstatusURL = transactionUrl + \"getcpgorderstatusforpostbookingpayment?bookingId=\" + bookingId + \"&siteId=\" + siteID + \"&paymentId=\" + paymentId;\r\n return $q(function (res) {\r\n var interval = $interval(function () {\r\n $http.get(\"\" + cpgstatusURL).then(function (result) {\r\n var postBookingPath = $location.path();\r\n if (result.data === 'SUCCESS') {\r\n var cpgStatus = result.data;\r\n var authCode = result.data && result.data;\r\n var paRes = cpgStatus === 'SUCCESS'\r\n ? \"^\" + authCode + \"^^^AUTHORISED\"\r\n : '';\r\n var response = {\r\n paRes: paRes,\r\n paymentId: paymentId,\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (postBookingPath && !postBookingPath.includes('pay-balance')) {\r\n console.log('cpgStatus cancelled');\r\n var response = {\r\n paRes: '',\r\n paymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result && result.status !== 200) {\r\n console.log('cpgStatus result.status', result.status);\r\n var response = {\r\n paRes: '',\r\n paymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result.data === 'FAILED') {\r\n // payment failed so stop polling\r\n // Log an error?\r\n var error = 'FAILED';\r\n var response = {\r\n paRes: '',\r\n paymentId: '',\r\n error: error,\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n if (result.data === 'STOP') {\r\n // stop polling\r\n // Duplicate, log error\r\n console.log('stop polling');\r\n var response = {\r\n paRes: '',\r\n paymentId: '',\r\n error: '',\r\n };\r\n res(response);\r\n $interval.cancel(interval);\r\n }\r\n });\r\n }, pollDelayMs);\r\n $timeout(function () {\r\n $interval.cancel(interval);\r\n var error = 'TIMER';\r\n var response = {\r\n paRes: '',\r\n paymentId: '',\r\n error: error,\r\n };\r\n $rootScope.$broadcast('cpgStatusAPIError', response);\r\n }, stopApiMs);\r\n });\r\n }\r\n function getPaymentLogos() {\r\n var parameters = $.param({\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n bookingTypeId: 8\r\n });\r\n var url = baseUrl + \"getpaymentoptions?\" + parameters;\r\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function (result) { return result.data; });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('dashboard')\r\n .factory('userSettingsService', userSettingsService);\r\n function userSettingsService(resourceService) {\r\n var starRatings = [\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_ANY'), val: 1 },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_2STARSANDHIGHER'), val: 2 },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_3STARSANDHIGHER'), val: 3 },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_4STARSANDHIGHER'), val: 4 },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_5STARS'), val: 5 }\r\n ];\r\n var smokingRoom = [\r\n { name: resourceService.getDeferred('NOPREFERENCE'), val: 0 },\r\n { name: resourceService.getDeferred('YES'), val: 1 },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'), val: 2 }\r\n ];\r\n var boolianOptions = [\r\n { name: resourceService.getDeferred('YES'), val: true },\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'), val: false }\r\n ];\r\n var priceMode = [\r\n { name: resourceService.getDeferred('PERPERSON'), val: 0 },\r\n { name: resourceService.getDeferred('TOTALPRICE'), val: 1 }\r\n ];\r\n var flightClass = [\r\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_ANY'), val: 0 },\r\n { name: resourceService.getDeferred('BUSINESSCLASS'), val: 8 },\r\n { name: resourceService.getDeferred('ECONOMYCLASS'), val: 1 },\r\n { name: resourceService.getDeferred('PREMIUMECONOMYCLASS'), val: 2 },\r\n { name: resourceService.getDeferred('FIRSTCLASS'), val: 4 }\r\n ];\r\n var hotelCriteria = [\r\n { name: resourceService.getDeferred('OURRECOMMENDATIONS'), val: 1 },\r\n { name: resourceService.getDeferred('CUSTOMERRATING'), val: 2 },\r\n { name: resourceService.getDeferred('PRICELOWTOHIGH'), val: 5 },\r\n { name: resourceService.getDeferred('PRICEHIGHTOLOW'), val: 6 },\r\n { name: resourceService.getDeferred('STARRATINGLOWTOHIGH'), val: 7 },\r\n { name: resourceService.getDeferred('STARRATINGHIGHTOLOW'), val: 8 }\r\n ];\r\n var flightCriteria = [\r\n { name: resourceService.getDeferred('OURRECOMMENDATIONS'), val: [10] },\r\n { name: resourceService.getDeferred('PRICELOWTOHIGH'), val: 1 },\r\n { name: resourceService.getDeferred('PRICEHIGHTOLOW'), val: 2 },\r\n { name: resourceService.getDeferred('DEPARTURETIMELOWTOHIGH'), val: 4 },\r\n { name: resourceService.getDeferred('DEPARTURETIMEHIGHTOLOW'), val: 5 },\r\n { name: resourceService.getDeferred('RETURNTIMELOWTOHIGH'), val: 6 },\r\n { name: resourceService.getDeferred('RETURNTIMEHIGHTOLOW'), val: 7 },\r\n { name: resourceService.getDeferred('TOTALJOURNEYTIMELOWTOHIGH'), val: 9 },\r\n { name: resourceService.getDeferred('TOTALJOURNEYTIMEHIGHTOLOW'), val: 8 }\r\n ];\r\n var adultTitles = resourceService.getDeferred('ADULTTITLES');\r\n var service = {\r\n getAdultTitles: getAdultTitles,\r\n getStarRatings: getStarRatings,\r\n getSmokingRoomOptions: getSmokingRoomOptions,\r\n getPricMode: getPricMode,\r\n getFooterToolbarOptions: getFooterToolbarOptions,\r\n getFlightClassOptions: getFlightClassOptions,\r\n getHotelCriteria: getHotelCriteria,\r\n getFlightCriteria: getFlightCriteria,\r\n getCanceledBookingOprions: getCanceledBookingOprions\r\n };\r\n function getStarRatings() {\r\n return starRatings;\r\n }\r\n function getSmokingRoomOptions() {\r\n return smokingRoom;\r\n }\r\n function getFooterToolbarOptions() {\r\n return boolianOptions;\r\n }\r\n function getCanceledBookingOprions() {\r\n return boolianOptions;\r\n }\r\n function getPricMode() {\r\n return priceMode;\r\n }\r\n function getFlightClassOptions() {\r\n return flightClass;\r\n }\r\n function getAdultTitles() {\r\n return adultTitles;\r\n }\r\n function getHotelCriteria() {\r\n return hotelCriteria;\r\n }\r\n function getFlightCriteria() {\r\n return flightCriteria;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('deals').directive('dealTypeCards', dealTypeCards);\r\n function dealTypeCards(holidayDeals) {\r\n var imgUrl = TRPCONFIG.DestinationImagesClientDomain + \"api2/destination/images/getfromobject\";\r\n function link(scope) {\r\n scope.holidayDealsEnabled = TRPCONFIG.Domain.HolidayDealsEnabled;\r\n scope.cruiseEnabled = TRPCONFIG.Domain.HolidayDealsCruisesEnabled;\r\n if (scope.holidayDealsEnabled && !scope.cruiseEnabled) {\r\n bestDestination().then(function (dest) { return scope.dest = dest; });\r\n }\r\n }\r\n function bestDestination() {\r\n var depAir = TRPCONFIG.Domain.HolidayDealsDefaultAirports;\r\n return holidayDeals.getAggregates(false, { depAir: depAir })\r\n .then(function (response) { return _.get(response, 'Aggregates.HotelsByChildDestination'); })\r\n .then(function (destMap) { return _.chain(destMap)\r\n .mapValues(function (dest, key) { return _.merge(dest, { id: key }); })\r\n .values()\r\n .sortBy('Position')\r\n .first()\r\n .value(); })\r\n .then(function (dest) {\r\n var _a = _.chain(dest).get('id').split('|').value(), type = _a[0], id = _a[1];\r\n var href = \"holidaydeals?depAir=\" + depAir + \"&ChildDestinations=\" + type + \"|\" + id;\r\n return {\r\n title: _.get(dest, 'Title'),\r\n image: imgUrl + \"?\" + jQuery.param({\r\n height: 316,\r\n useDealsImages: true,\r\n type: type,\r\n id: id\r\n }),\r\n href: window.encodeURI(href),\r\n minPrice: _.get(dest, 'MinPrice')\r\n };\r\n });\r\n }\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: true,\r\n templateUrl: 'partials/home/directivetemplate?type=DealTypeCards',\r\n link: link\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('ekh')\r\n .controller('EmiratesHome', EmiratesHome);\r\n function EmiratesHome(destinationService, cmsPageMapping) {\r\n var cm = this;\r\n cm.controls = { experiences: {} };\r\n cmsPageMapping.getHomePage().then(function (homepage) {\r\n var page = homepage[0];\r\n if (page) {\r\n destinationService.getTiles({ ControlId: page.controlid }).then(function (components) {\r\n var componentsByType = (_.groupBy(components, 'controltype'));\r\n _.forEach(componentsByType, function (component) {\r\n component.forEach(function (c) {\r\n destinationService.getTiles({ ControlId: c.controlid }).then(function (tiles) {\r\n if (c.controltype === 'experiences') {\r\n tiles.forEach(function (carousel) {\r\n destinationService.getTiles({ ControlId: carousel.controlid })\r\n .then(function (tiles) {\r\n return cm.controls.experiences[carousel.controlid] = { title: carousel.name, tiles: tiles };\r\n });\r\n cm.selectedTab = _.head(tiles).controlid;\r\n });\r\n }\r\n else {\r\n cm.controls[c.controltype] = tiles;\r\n }\r\n });\r\n });\r\n });\r\n });\r\n }\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('ekh').controller('EmiratesOffers', EmiratesOffers);\r\n function EmiratesOffers(destinationService, cmsPageMapping, $routeParams, $window) {\r\n var cm = this;\r\n var route = '';\r\n cm.controls = {};\r\n cm.cmsItemsFound = true;\r\n cmsPageMapping.getOfferTypes().then(function (types) {\r\n var type = _.filter(types, function (type) {\r\n if ($routeParams.type != null) {\r\n route = $routeParams.type.replace('/', '');\r\n }\r\n else {\r\n route = $window.location.pathname.replace('?tm=1', '').substring(1);\r\n }\r\n return type.linkurl === route;\r\n })[0];\r\n if (type) {\r\n cm.controls.name = type.name;\r\n destinationService.getTiles({ ControlId: type.controlid }).then(function (components) {\r\n var componentsByType = (_.groupBy(components, 'controltype'));\r\n _.forEach(componentsByType, function (component) {\r\n component.forEach(function (c) {\r\n destinationService.getTiles({ ControlId: c.controlid }).then(function (tiles) {\r\n cm.controls[c.controltype] = tiles;\r\n });\r\n });\r\n });\r\n });\r\n }\r\n else {\r\n cm.cmsItemsFound = false;\r\n }\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('ekh').controller('EmiratesSingleOffers', EmiratesSingleOffers);\r\n function EmiratesSingleOffers(destinationService, cmsPageMapping, $routeParams, $anchorScroll, $window, broker, resourceService, $scope) {\r\n $anchorScroll(0, 0);\r\n var cm = this;\r\n broker.subscribe('EmiratesSingleOffers', 'hotelDetailCallFailed', function () {\r\n $scope.$emit('flash:error', resourceService.get('HOTELDETAILERROR'));\r\n });\r\n if (!TRPCONFIG.Domain.OverrideHotelInformationFromCms) {\r\n cm.controls = {};\r\n cm.cmsItemsFound = true;\r\n cmsPageMapping.getSingleOffers().then(function (types) {\r\n var type = _.filter(types, function (type) {\r\n if ($routeParams.estabId != null) {\r\n return type.estabid === $routeParams.estabId;\r\n }\r\n return type.linkurl ? type.linkurl.indexOf($window.location.pathname) > -1 : false;\r\n })[0];\r\n if (type) {\r\n cm.controls.name = type.name;\r\n destinationService.getTiles({ ControlId: type.controlid }).then(function (components) {\r\n var componentsByType = (_.groupBy(components, 'controltype'));\r\n _.forEach(componentsByType, function (component) {\r\n component.forEach(function (c) {\r\n destinationService.getTiles({ ControlId: c.controlid }).then(function (tiles) {\r\n cm.controls[c.controltype] = tiles;\r\n });\r\n });\r\n });\r\n });\r\n }\r\n else {\r\n cm.cmsItemsFound = false;\r\n }\r\n });\r\n }\r\n }\r\n})();\r\nvar ekh;\r\n(function (ekh) {\r\n var NewsLetterSignUpFullForm = /** @class */ (function () {\r\n function NewsLetterSignUpFullForm(resourceService, $location, analytics, $scope, $timeout) {\r\n this.resourceService = resourceService;\r\n this.$location = $location;\r\n this.analytics = analytics;\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.showExtended = false;\r\n this.gaEventIsSent = false;\r\n this.signUpReason = 'Newsletter Signup Header';\r\n this.subscribePrimaryButtonLabel = 'NEWSLETTERSIGNUPNOW';\r\n this.salutationOptions = resourceService.getDeferred('NEWSLETTERSIGNUPSALUTATIONOPTIONS');\r\n this._initData();\r\n }\r\n NewsLetterSignUpFullForm.prototype._initData = function () {\r\n this.email = null;\r\n this.firstName = null;\r\n this.lastName = null;\r\n this.title = '';\r\n };\r\n NewsLetterSignUpFullForm.prototype.onEmailFocused = function () {\r\n this.showExtended = true;\r\n if (!this.gaEventIsSent && TRPCONFIG.Domain.TrackNewsletterSignup) {\r\n var page = this.$location.path();\r\n this.analytics.trackEvent({\r\n category: 'newsletterSignup',\r\n action: 'emailInputFocused',\r\n label: page,\r\n dimension9: 'newsletterSignup'\r\n });\r\n this.gaEventIsSent = true;\r\n }\r\n };\r\n NewsLetterSignUpFullForm.prototype._getLanguageCode = function () {\r\n var langCode;\r\n try {\r\n langCode = TRPCONFIG.Domain.CultureCode.split('-')[0];\r\n }\r\n catch (err) {\r\n langCode = '';\r\n }\r\n return langCode;\r\n };\r\n ;\r\n NewsLetterSignUpFullForm.prototype._getData = function () {\r\n return {\r\n Email: this.email,\r\n FirstName: this.firstName,\r\n LastName: this.lastName,\r\n LanguageCode: this._getLanguageCode(),\r\n ContextTag: 'Source:Website-Newsletter',\r\n Source: 'TravelRepublic',\r\n SignupReason: this.signUpReason,\r\n Title: this.title\r\n };\r\n };\r\n NewsLetterSignUpFullForm.prototype._getGaTrackData = function () {\r\n var page = this.$location.path();\r\n return {\r\n category: 'newsletterSignup',\r\n action: 'signedUp',\r\n label: page,\r\n dimension9: 'newsletterSignup'\r\n };\r\n };\r\n NewsLetterSignUpFullForm.prototype.getSubscribePrimaryButtonLabel = function () {\r\n return this.resourceService.get(this.subscribePrimaryButtonLabel);\r\n };\r\n NewsLetterSignUpFullForm.prototype.submit = function () {\r\n var _this = this;\r\n if (!this.showExtended) {\r\n this.showExtended = true;\r\n return false;\r\n }\r\n var data = this._getData();\r\n this.$scope.formState.resetSubmitResult();\r\n return this.$scope.formState.submit(data)\r\n .then(function () {\r\n if (TRPCONFIG.Domain.TrackNewsletterSignup) {\r\n _this.analytics.trackEvent(_this._getGaTrackData());\r\n }\r\n _this.$timeout(function () {\r\n _this.$scope.formState.resetFormState();\r\n _this.showExtended = false;\r\n _this._initData();\r\n }, 5000);\r\n });\r\n };\r\n ;\r\n return NewsLetterSignUpFullForm;\r\n }());\r\n ekh.NewsLetterSignUpFullForm = NewsLetterSignUpFullForm;\r\n angular\r\n .module('ekh')\r\n .directive('newsletterSignUpFullForm', function (authService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=newslettersignupfullform',\r\n controllerAs: 'nsu',\r\n bindToController: {\r\n allowUnsubscribe: '='\r\n },\r\n scope: {},\r\n link: function ($scope) {\r\n $scope.formState.setSubmitFn(function (data) {\r\n return authService\r\n .registerForNewsletter(data);\r\n });\r\n },\r\n controller: NewsLetterSignUpFullForm\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n/// \r\nvar ekh;\r\n(function (ekh) {\r\n var NewsLetterSignUpPopupForm = /** @class */ (function (_super) {\r\n __extends(NewsLetterSignUpPopupForm, _super);\r\n function NewsLetterSignUpPopupForm(resourceService, $location, analytics, $scope, $timeout) {\r\n var _this = _super.call(this, resourceService, $location, analytics, $scope, $timeout) || this;\r\n _this.resourceService = resourceService;\r\n _this.$location = $location;\r\n _this.analytics = analytics;\r\n _this.$scope = $scope;\r\n _this.$timeout = $timeout;\r\n _this.showExtended = true;\r\n _this.signUpReason = 'Newsletters Signup pop up';\r\n _this.subscribePrimaryButtonLabel = 'NEWSLETTERSIGNUPPOPUPSUBSCRIBEBUTTON';\r\n return _this;\r\n }\r\n NewsLetterSignUpPopupForm.prototype._getGaTrackData = function () {\r\n var page = this.$location.path();\r\n return {\r\n category: 'newsletterSignup',\r\n action: 'signedUp_PopUp',\r\n label: page,\r\n dimension9: 'newsletterSignup'\r\n };\r\n };\r\n NewsLetterSignUpPopupForm.prototype.submit = function () {\r\n var _this = this;\r\n var data = this._getData();\r\n this.$scope.formState.resetSubmitResult();\r\n return this.$scope.formState.submit(data)\r\n .then(function () {\r\n if (TRPCONFIG.Domain.TrackNewsletterSignup) {\r\n _this.analytics.trackEvent(_this._getGaTrackData());\r\n }\r\n _this.onSuccess();\r\n });\r\n };\r\n return NewsLetterSignUpPopupForm;\r\n }(ekh.NewsLetterSignUpFullForm));\r\n ekh.NewsLetterSignUpPopupForm = NewsLetterSignUpPopupForm;\r\n angular\r\n .module('ekh')\r\n .directive('newsletterSignUpPopupForm', function (authService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=newslettersignupfullform',\r\n controllerAs: 'nsu',\r\n bindToController: {\r\n allowUnsubscribe: '=',\r\n onSuccess: '&',\r\n primaryButton: '='\r\n },\r\n scope: {},\r\n link: function ($scope) {\r\n $scope.formState.setSubmitFn(function (data) {\r\n return authService\r\n .registerForNewsletter(data);\r\n });\r\n },\r\n controller: NewsLetterSignUpPopupForm\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('boardTypeFilters', function (broker, hotelSearch) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=BoardTypeFilters',\r\n scope: {\r\n hotel: '=',\r\n buttonClass: '='\r\n },\r\n link: function (scope) {\r\n var cancel = scope.$watch('hotel.Rooms', function (h) {\r\n if (!h || _.isEmpty(h)) {\r\n return;\r\n }\r\n cancel();\r\n scope.showMenu = false;\r\n if (scope.hotel == null || scope.hotel.Rooms == null) {\r\n return;\r\n }\r\n scope.$watchCollection('filter.BoardTypes', function (v, o) {\r\n if (v == null || v === o) {\r\n return;\r\n }\r\n broker.publish('boardTypeFilterUpdated', v);\r\n });\r\n var boardTypes = {};\r\n scope.hotel.Rooms.forEach(function (r) {\r\n r.Availability.forEach(function (a) {\r\n if (!boardTypes[a.BoardType] || boardTypes[a.BoardType].Text.length > a.BoardDescription.length) {\r\n boardTypes[a.BoardType] = {\r\n Text: a.BoardDescription,\r\n Value: a.BoardType,\r\n Count: 0\r\n };\r\n }\r\n boardTypes[a.BoardType].Count += 1;\r\n });\r\n scope.showMenu = Object.keys(boardTypes).length > 1;\r\n // convert object to array for the dropdown multi select control\r\n scope.boardTypeOptions = [];\r\n _.forEach(boardTypes, function (b) {\r\n scope.boardTypeOptions.push(b);\r\n });\r\n });\r\n var filterBoardTypes = angular.copy(hotelSearch.getFilter().BoardTypes);\r\n filterBoardTypes = _.filter(filterBoardTypes, function (fbt) {\r\n return _.some(scope.boardTypeOptions, function (option) { return option.Value === fbt; });\r\n });\r\n scope.filter = {\r\n BoardTypes: filterBoardTypes\r\n };\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar ekh;\r\n(function (ekh) {\r\n var CountryPickerService = /** @class */ (function () {\r\n function CountryPickerService(globalisationService) {\r\n this.globalisationService = globalisationService;\r\n }\r\n CountryPickerService.prototype.getDomain = function () {\r\n var _this = this;\r\n if (this.getDomainInfo) {\r\n return this.getDomainInfo;\r\n }\r\n this.getDomainInfo = this.globalisationService.getSelectedRegionalContext()\r\n .then(function (regionalContext) {\r\n return _this.globalisationService.getRegions(regionalContext.TenantId, regionalContext.ParentDomainId)\r\n .then(function (regions) {\r\n return {\r\n Context: regionalContext,\r\n Regions: regions\r\n };\r\n });\r\n });\r\n return this.getDomainInfo;\r\n };\r\n ;\r\n CountryPickerService.prototype.selectRegionalContext = function (regionalContext) {\r\n var _this = this;\r\n return this.globalisationService.setRegionalContext({\r\n ParentDomainId: regionalContext.ParentDomainId,\r\n PointOfSaleId: regionalContext.PointOfSale.Id,\r\n CountryCode: regionalContext.PointOfSale.CountryCode,\r\n CultureCode: regionalContext.Language ? regionalContext.Language.Code : ''\r\n }).then(function (resp) { return _this.globalisationService.getSelectedRegionalContext(); });\r\n };\r\n ;\r\n return CountryPickerService;\r\n }());\r\n ekh.CountryPickerService = CountryPickerService;\r\n angular\r\n .module('ekh')\r\n .service('countryPickerService', CountryPickerService);\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var CardBinMessagesController = /** @class */ (function () {\r\n function CardBinMessagesController(bookingService) {\r\n this.bookingService = bookingService;\r\n this.messages = [];\r\n }\r\n CardBinMessagesController.prototype.$onInit = function () {\r\n var _this = this;\r\n this.bookingService.getCardDiscountsForDomain(TRPCONFIG.Domain.DomainId, TRPCONFIG.Domain.CultureCode)\r\n .then(function (_a) {\r\n var DiscountDetails = _a.DiscountDetails;\r\n _this.messages = DiscountDetails && DiscountDetails.Discount;\r\n _this.messages = _this.sortArr(_this.messages);\r\n })\r\n .catch(function () {\r\n _this.messages = [];\r\n });\r\n };\r\n CardBinMessagesController.prototype.showMore = function () {\r\n this.numberOfVisible = this.messages.length;\r\n };\r\n CardBinMessagesController.prototype.sortArr = function (arr) {\r\n return arr.sort(function (_a, _b) {\r\n var highlightA = _a.Highlight;\r\n var highlightB = _b.Highlight;\r\n return highlightA > highlightB ? -1 : 1;\r\n });\r\n };\r\n return CardBinMessagesController;\r\n }());\r\n angular\r\n .module('ekh')\r\n .component('cardBinMessages', {\r\n bindings: {\r\n numberOfVisible: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=CardBinMessages',\r\n controller: CardBinMessagesController,\r\n controllerAs: 'ctrl'\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var ClearBasketAlert = /** @class */ (function () {\r\n function ClearBasketAlert(basketStore, modalService, tripService, $location, $window, $routeParams) {\r\n var _this = this;\r\n this.basketStore = basketStore;\r\n this.modalService = modalService;\r\n this.tripService = tripService;\r\n this.$location = $location;\r\n this.$window = $window;\r\n this.$routeParams = $routeParams;\r\n this.basketStore.getProductCount().then(function (count) {\r\n if (count > 0) {\r\n return _this.modalService.launch('partials/home/directivetemplate?type=clearBasketAlert', {\r\n postClearAction: _this.postClearAction,\r\n cancelAction: _this.cancelAction\r\n }, true);\r\n }\r\n _this.basketStore.createBasket()\r\n .then(function (basket) {\r\n if (_this.$routeParams.tripId) {\r\n return _this.tripService.setBasketId(_this.$routeParams.tripId, basket.BasketId);\r\n }\r\n })\r\n .then(function () {\r\n if (_this.postClearAction) {\r\n _this.postClearAction().then(function () {\r\n if (_.includes(_this.$location.path(), '/dp/book/')) {\r\n _this.$location.path('');\r\n }\r\n _this.$window.location.reload();\r\n });\r\n }\r\n });\r\n });\r\n }\r\n ;\r\n return ClearBasketAlert;\r\n }());\r\n var ClearBasketAlertModal = /** @class */ (function () {\r\n function ClearBasketAlertModal(basketStore, modalService, $location, $window, tripService, $routeParams) {\r\n this.basketStore = basketStore;\r\n this.modalService = modalService;\r\n this.$location = $location;\r\n this.$window = $window;\r\n this.tripService = tripService;\r\n this.$routeParams = $routeParams;\r\n this.postClearAction = modalService.get('postClearAction');\r\n this.cancelAction = modalService.get('cancelAction');\r\n }\r\n ;\r\n ClearBasketAlertModal.prototype.clear = function () {\r\n var _this = this;\r\n return this.basketStore.createBasket()\r\n .then(function (basket) {\r\n if (_this.$routeParams.tripId) {\r\n return _this.tripService.setBasketId(_this.$routeParams.tripId, basket.BasketId);\r\n }\r\n })\r\n .then(function () {\r\n if (_this.postClearAction) {\r\n return _this.postClearAction();\r\n }\r\n })\r\n .then(function () {\r\n _this.modalService.close();\r\n if (_.includes(_this.$location.path(), '/dp/book/')) {\r\n _this.$location.path('');\r\n }\r\n _this.$window.location.reload();\r\n });\r\n };\r\n ClearBasketAlertModal.prototype.cancel = function () {\r\n if (this.cancelAction) {\r\n this.cancelAction();\r\n }\r\n this.modalService.close();\r\n };\r\n return ClearBasketAlertModal;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('clearBasketAlert', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n 'postClearAction': '&?onClear',\r\n 'cancelAction': '&cancel'\r\n },\r\n bindToController: true,\r\n controller: ClearBasketAlert,\r\n controllerAs: 'cba'\r\n };\r\n });\r\n angular\r\n .module('ekh')\r\n .controller('ClearBasketAlertModal', ClearBasketAlertModal);\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var CountryPickerDropdown = /** @class */ (function () {\r\n function CountryPickerDropdown(countryPickerService, broker, resourceService) {\r\n var _this = this;\r\n this.countryPickerService = countryPickerService;\r\n this.broker = broker;\r\n this.resourceService = resourceService;\r\n this.open = false;\r\n this.selectRegion = function (id) {\r\n _this.activeContext.Region = _.find(_this.regions, (function (r) { return r.Id === id; }));\r\n _this.pointsOfSale = _this.getPointsOfSale();\r\n _this.activeContext.PointOfSale = _this.pointsOfSale[0];\r\n var languages = _this.activeContext.PointOfSale.Context.Languages;\r\n _this.activeContext.Language = languages.length > 0 ? languages[0] : null;\r\n };\r\n this.getPointsOfSale = function () {\r\n var france = {\r\n Id: 999,\r\n Name: 'France',\r\n PosEnglishName: 'France',\r\n RegionId: 2,\r\n Context: {\r\n AccountingCurrency: 'EUR',\r\n CultureCode: 'fr-fr',\r\n DefaultCurrency: 'EUR',\r\n DomainName: 'emiratesholidays.com',\r\n IsAgent: false,\r\n Languages: [\r\n { Code: 'en-fr', Name: 'French' }\r\n ],\r\n LegacyDomain: 999,\r\n TradingGroup: 999,\r\n },\r\n Country: {\r\n Code: 'FR',\r\n LocalName: 'France',\r\n LocalisedNames: [\r\n { Name: 'France', CultureCode: 'fr-fr' }\r\n ],\r\n Name: 'France',\r\n },\r\n CountryCode: 'FR',\r\n CountryId: 999,\r\n Enabled: true\r\n };\r\n var activeContextPOS = _this.activeContext.Region.PointsOfSale;\r\n if (_this.activeContext.Region.Id === 2) {\r\n activeContextPOS = [france].concat(activeContextPOS);\r\n }\r\n var pointsofsale = activeContextPOS.map(function (pos) {\r\n var names = pos.Country.LocalisedNames.find(function (name) {\r\n return name.CultureCode === _.get(_this.currentDomain, 'Context.Language.Code', '');\r\n });\r\n var localisedNames = names ? [names] : pos.Country.LocalisedNames;\r\n return __assign({}, pos, { PosEnglishName: _this.getPosEnglishName(pos), Country: __assign({}, pos.Country, { LocalisedNames: localisedNames, LocalName: localisedNames[0].Name }) });\r\n });\r\n pointsofsale.sort(function (a, b) {\r\n return (a.Country.LocalName).localeCompare(b.Country.LocalName);\r\n });\r\n return pointsofsale;\r\n };\r\n this.selectPointOfSale = function (pos) {\r\n if (pos) {\r\n _this.activeContext.Language = pos.Context.Languages.length > 0 ? pos.Context.Languages[0] : null;\r\n }\r\n };\r\n this.getPosEnglishName = function (pos) {\r\n if (!pos || !pos.Country || !(pos.Country.LocalisedNames instanceof Array)) {\r\n return '';\r\n }\r\n var englishCountryName = pos.Country.LocalisedNames.filter(function (langObj) {\r\n return langObj.CultureCode === 'en-GB';\r\n });\r\n return englishCountryName.length ? englishCountryName[0].Name : '';\r\n };\r\n this.regionTitles = [\r\n { Id: 1, Title: this.resourceService.getDeferred('REGIONTITLE_AMERICA'), GaEventLabel: 'Americas' },\r\n { Id: 2, Title: this.resourceService.getDeferred('REGIONTITLE_EUROPE'), GaEventLabel: 'Europe' },\r\n { Id: 3, Title: this.resourceService.getDeferred('REGIONTITLE_MIDDLEEAST'), GaEventLabel: 'MiddleEast' },\r\n { Id: 4, Title: this.resourceService.getDeferred('REGIONTITLE_AFRICA'), GaEventLabel: 'Africa' },\r\n { Id: 5, Title: this.resourceService.getDeferred('REGIONTITLE_ASIA'), GaEventLabel: 'Asia&SouthPacific' },\r\n { Id: 6, Title: this.resourceService.getDeferred('REGIONTITLE_RESTOFTHEWORLD'),\r\n GaEventLabel: 'RestOfTheWorld' }\r\n ];\r\n this.countryPickerService.getDomain()\r\n .then(function (domain) {\r\n _this.regions = domain.Regions.map(function (r) {\r\n var _a = _.find(_this.regionTitles, function (region) { return region.Id === r.Id; }), Title = _a.Title, GaEventLabel = _a.GaEventLabel;\r\n r.Title = Title;\r\n return __assign({}, r, { Title: Title,\r\n GaEventLabel: GaEventLabel });\r\n });\r\n _this.currentDomain = _.cloneDeep(domain);\r\n _this.activeContext = domain.Context;\r\n _this.pointsOfSale = _this.getPointsOfSale();\r\n if (_this.activeContext.Inferred) {\r\n _this.confirmRegionalContext(true);\r\n }\r\n });\r\n }\r\n CountryPickerDropdown.prototype.confirmRegionalContext = function (inferred) {\r\n if (this.activeContext.PointOfSale.Name === 'France') {\r\n window.location.replace('https://www.emiratesholidays.fr/');\r\n }\r\n else {\r\n this.open = false;\r\n this.activeContext.Inferred = inferred;\r\n this.broker.publish('RegionalContextSelected', this.activeContext);\r\n }\r\n };\r\n return CountryPickerDropdown;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('countryPickerDropdown', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n open: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=countrypickerdropdown',\r\n controller: CountryPickerDropdown,\r\n controllerAs: 'cm',\r\n bindToController: true\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var CountryPickerPopup = /** @class */ (function () {\r\n function CountryPickerPopup($scope, broker, countryPickerService, $location, resourceService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.countryPickerService = countryPickerService;\r\n this.$location = $location;\r\n this.resourceService = resourceService;\r\n this.countryPickerPopupOpen = false;\r\n this.getPointOfSaleUrl = function () {\r\n if (_this.activeContext && _this.activeContext.PointOfSale) {\r\n if (_this.activeContext.PointOfSale.Id === 0) {\r\n return '/';\r\n }\r\n var countryCode = _this.activeContext.PointOfSale.CountryCode.toLowerCase();\r\n var languageCode = _this.activeContext.Language ? _this.activeContext.Language.Code.substr(0, 2) : 'en';\r\n return \"/\" + countryCode + \"_\" + languageCode;\r\n }\r\n return '';\r\n };\r\n this.setPointOfSale = function (e) {\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n _this.countryPickerService.selectRegionalContext(_this.activeContext)\r\n .then(function (regionalContext) {\r\n _this.activeContext = regionalContext;\r\n _this.countryPickerPopupOpen = false;\r\n });\r\n };\r\n this.countryPickerSelectionMessage = this.resourceService.get('COUNTRYPICKERWESELECTEDMESSAGE');\r\n this.countryPickerHeaderMessage = this.resourceService.get('COUNTRYPICKERWESELECTEDHEADERMESSAGE');\r\n broker.subscribe('countryPickerPopup', 'RegionalContextSelected', function (ev) {\r\n _this.activeContext = ev.data;\r\n _this.countryPickerPopupOpen = true;\r\n _this.countryPickerSelectionMessage = String.format(_this.resourceService.get(!_this.activeContext.Inferred\r\n ? 'COUNTRYPICKERYOUSELECTEDMESSAGE'\r\n : 'COUNTRYPICKERWESELECTEDMESSAGE'), _this.activeContext.PointOfSale.Country.Name);\r\n _this.countryPickerHeaderMessage = String.format(_this.resourceService.get(!_this.activeContext.Inferred\r\n ? 'COUNTRYPICKERYOUSELECTEDHEADERMESSAGE'\r\n : 'COUNTRYPICKERWESELECTEDHEADERMESSAGE'), _this.activeContext.PointOfSale.Country.Name, _this.activeContext.Language ? _this.activeContext.Language.Name : '');\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('countryPickerPopup');\r\n });\r\n }\r\n return CountryPickerPopup;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('countryPickerPopup', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/popups/countrypicker',\r\n controller: CountryPickerPopup,\r\n controllerAs: 'cpp',\r\n bindToController: true\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var DEVICE_DATA_COLLECTOR_URL = '/partials/home/directivetemplate?type=DeviceDataCollector';\r\n var DDCController = /** @class */ (function () {\r\n function DDCController($element, paymentDetailsService, $window, $timeout) {\r\n this.$element = $element;\r\n this.paymentDetailsService = paymentDetailsService;\r\n this.$window = $window;\r\n this.$timeout = $timeout;\r\n this.MESSAGE_EVENT = 'message';\r\n this.TIMEOUT = TRPCONFIG.Domain.ThreeDS2RetryTimeout;\r\n this.THRESHOLD = TRPCONFIG.Domain.ThreeDS2RetryThreshold;\r\n this.retryCount = 0;\r\n }\r\n DDCController.prototype.$onInit = function () {\r\n this.setUpHandlers();\r\n };\r\n DDCController.prototype.$onDestroy = function () {\r\n this.$window.removeEventListener(this.MESSAGE_EVENT, this.messageEventListener);\r\n };\r\n DDCController.prototype.startGetToken = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var jwtTokenData, dfReferenceId;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n dfReferenceId = null;\r\n /*\r\n retry to get to get JWT token.\r\n _getDeviceData() returns promise which may be rejected\r\n because of network errors or because of timeout (this.TIMEOUT)\r\n */\r\n this.retryCount = 0;\r\n _a.label = 1;\r\n case 1:\r\n if (!(!jwtTokenData && this.retryCount < this.THRESHOLD)) return [3 /*break*/, 3];\r\n return [4 /*yield*/, this._getDeviceData()];\r\n case 2:\r\n jwtTokenData = _a.sent();\r\n this.retryCount++;\r\n return [3 /*break*/, 1];\r\n case 3:\r\n if (!jwtTokenData) {\r\n this.onReceive({ dfReferenceId: dfReferenceId });\r\n return [2 /*return*/, true];\r\n }\r\n /*\r\n retry to submit form with JWT token and receive ReferenceId.\r\n _submitForm() returns promise which may be rejected\r\n because of problems to load iframe from the URL or\r\n because of not receiving POST Message from iframe.\r\n */\r\n this.retryCount = 0;\r\n _a.label = 4;\r\n case 4:\r\n if (!(!dfReferenceId && this.retryCount < this.THRESHOLD)) return [3 /*break*/, 6];\r\n return [4 /*yield*/, this._getIdReference(jwtTokenData.jwtToken)];\r\n case 5:\r\n dfReferenceId = _a.sent();\r\n this.retryCount++;\r\n return [3 /*break*/, 4];\r\n case 6:\r\n this.onReceive({ dfReferenceId: dfReferenceId });\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n DDCController.prototype._reloadIframe = function () {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n var reloadTimer;\r\n _this.$element.attr('src', '');\r\n _this.$timeout(function (_) {\r\n _this.$element[0].onload = function (_) {\r\n _this.$element[0].onload = angular.noop;\r\n _this.$timeout.cancel(reloadTimer);\r\n //below block is to ensure that iframe template is loaded successfully\r\n //if 404 error it is not able to get form\r\n if (_this.getForm(_this.$element[0])) {\r\n resolve();\r\n }\r\n else {\r\n reject();\r\n }\r\n };\r\n _this.$element.attr('src', DEVICE_DATA_COLLECTOR_URL);\r\n });\r\n /*\r\n Reject iframe reloadIframePromise if its not possible\r\n to get template because of network problems and try again\r\n */\r\n reloadTimer = _this.$timeout(function (_) {\r\n _this.$element[0].onload = angular.noop;\r\n reject(null);\r\n }, _this.TIMEOUT);\r\n });\r\n };\r\n DDCController.prototype._getIdReference = function (jwtToken) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var idReference, err_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n idReference = null;\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, this._reloadIframe()];\r\n case 2:\r\n _a.sent();\r\n return [4 /*yield*/, this._submitForm(jwtToken)];\r\n case 3:\r\n idReference = _a.sent();\r\n return [3 /*break*/, 5];\r\n case 4:\r\n err_1 = _a.sent();\r\n console.error('Error getting Id Reference', err_1);\r\n return [3 /*break*/, 5];\r\n case 5: return [2 /*return*/, idReference];\r\n }\r\n });\r\n });\r\n };\r\n DDCController.prototype._getDeviceData = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var tokenResponse, error_3;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 2, , 3]);\r\n return [4 /*yield*/, this.getDDCToken()];\r\n case 1:\r\n tokenResponse = _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n error_3 = _a.sent();\r\n console.error('Error getting device data', error_3);\r\n tokenResponse = null;\r\n return [3 /*break*/, 3];\r\n case 3: return [2 /*return*/, tokenResponse];\r\n }\r\n });\r\n });\r\n };\r\n DDCController.prototype._completeForm = function (cardNumber, jwtValue) {\r\n var binValue = cardNumber && cardNumber.slice(0, 6);\r\n if (binValue && jwtValue) {\r\n this.form = this.getForm(this.$element[0]);\r\n this.setFieldValue(this.getField(this.form, 'bin'), binValue);\r\n this.setFieldValue(this.getField(this.form, 'jwt'), jwtValue);\r\n }\r\n };\r\n DDCController.prototype.setUpHandlers = function () {\r\n this.addCommand({ command: this.startGetToken.bind(this) });\r\n };\r\n DDCController.prototype._submitForm = function (jwtToken) {\r\n var _this = this;\r\n this._completeForm(this.cardNumber, jwtToken);\r\n return new Promise(function (resolve, reject) {\r\n var getTimer;\r\n _this._clearMessageListener();\r\n _this.messageEventListener = function (event) {\r\n _this.$timeout.cancel(getTimer);\r\n console.log('Recieved event response', event);\r\n if (event.origin === TRPCONFIG.Domain.CardinalCommerceUrl) {\r\n var data = JSON.parse(event.data);\r\n console.warn('Merchant received a message:', data);\r\n if (data && data.Status) {\r\n resolve(data.SessionId);\r\n }\r\n else {\r\n reject(null);\r\n }\r\n }\r\n };\r\n _this.$window.addEventListener(_this.MESSAGE_EVENT, _this.messageEventListener, false);\r\n getTimer = _this.$timeout(function (_) {\r\n _this._clearMessageListener();\r\n reject(null);\r\n }, _this.TIMEOUT);\r\n _this.form.submit();\r\n });\r\n };\r\n DDCController.prototype._clearMessageListener = function () {\r\n if (this.messageEventListener) {\r\n this.$window.removeEventListener(this.MESSAGE_EVENT, this.messageEventListener);\r\n }\r\n };\r\n DDCController.prototype.getDDCToken = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!this.cardType) {\r\n return [2 /*return*/, Promise.reject('Card details are invalid')];\r\n }\r\n return [4 /*yield*/, this.paymentDetailsService.getDeviceDataCollectionToken(this.cardType, this.TIMEOUT)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n });\r\n };\r\n DDCController.prototype.getForm = function (iframe) {\r\n return iframe.contentWindow.document.getElementById('collectionForm');\r\n };\r\n DDCController.prototype.getField = function (form, className) {\r\n return form.getElementsByClassName(className)[0];\r\n };\r\n DDCController.prototype.setFieldValue = function (field, value) {\r\n field.value = value;\r\n };\r\n return DDCController;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('deviceDataCollector', function () {\r\n return {\r\n replace: true,\r\n scope: {},\r\n bindToController: {\r\n cardNumber: '<',\r\n cardType: '<',\r\n addCommand: '&',\r\n onReceive: '&'\r\n },\r\n controller: DDCController,\r\n controllerAs: 'ddc',\r\n template: \"\"\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('dropdownMultiSelect', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n caption: '@',\r\n model: '=',\r\n options: '=',\r\n valueName: '@',\r\n labelName: '@',\r\n classes: '@',\r\n ulClasses: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=dropdownmultiselect',\r\n transclude: true,\r\n link: function (scope, el) {\r\n scope.open = false;\r\n scope.focusIndex = -1;\r\n scope.selectedIndexes = [];\r\n scope.toggle = function (e) {\r\n e.preventDefault();\r\n if (scope.open) {\r\n close();\r\n }\r\n else {\r\n open();\r\n }\r\n };\r\n function open() {\r\n scope.open = true;\r\n }\r\n function close() {\r\n scope.open = false;\r\n scope.focusIndex = -1;\r\n }\r\n $(document).on('click.dropdownmultiselect', function (e) {\r\n // close panel if the click target is not a child of the element\r\n var isChild = el.find(e.target).length > 0;\r\n if (!isChild) {\r\n scope.$apply(function () {\r\n close();\r\n });\r\n }\r\n });\r\n // set up watches for the model and the options\r\n scope.$watch('model', function (v) {\r\n if (v == null) {\r\n return;\r\n }\r\n scope.updateOnWatch();\r\n }, true);\r\n scope.$watch('options', function (v) {\r\n if (v == null) {\r\n return;\r\n }\r\n scope.updateOnWatch();\r\n }, true);\r\n scope.updateOnWatch = function () {\r\n // either the model or options have changed\r\n // iterate options\r\n _.forEach(scope.options, function (o, index) {\r\n // is this option in the model array?\r\n var match = _.find(scope.model, function (m) {\r\n return o[scope.valueName] === m;\r\n });\r\n var selectedIndex = scope.selectedIndexes.indexOf(index);\r\n if (_.isUndefined(match)) {\r\n // remove this index\r\n if (selectedIndex > -1) {\r\n scope.selectedIndexes.splice(selectedIndex, 1);\r\n }\r\n }\r\n else if (selectedIndex === -1) {\r\n // add this index\r\n scope.selectedIndexes.push(index);\r\n }\r\n });\r\n };\r\n scope.optionClick = function (index) {\r\n applyOption(index);\r\n //scope.open = false;\r\n el.find('a').focus();\r\n };\r\n function applyOption(index) {\r\n // get option at this index\r\n var value = scope.options[index][scope.valueName];\r\n // change the model\r\n if (scope.selectedIndexes.indexOf(index) > -1) {\r\n // remove this value from the model array\r\n scope.model = _.reject(scope.model, function (m) {\r\n return m === value;\r\n });\r\n }\r\n else {\r\n // add this value to the model array\r\n scope.model.push(value);\r\n }\r\n // set \"focus\" to this option\r\n scope.focusIndex = index;\r\n }\r\n var behaviours = {\r\n // Tab\r\n 9: function () {\r\n close();\r\n },\r\n // Escape\r\n 27: function () {\r\n close();\r\n },\r\n // Up Arrow\r\n 38: function (e) {\r\n e.preventDefault();\r\n open();\r\n if ((scope.focusIndex - 1) > -1) {\r\n scope.focusIndex -= 1;\r\n }\r\n },\r\n // Down Arrow\r\n 40: function (e) {\r\n e.preventDefault();\r\n open();\r\n if ((scope.focusIndex + 1) <= scope.options.length - 1) {\r\n scope.focusIndex += 1;\r\n }\r\n },\r\n // Return\r\n 13: function (e) {\r\n if (scope.focusIndex > -1) {\r\n e.preventDefault();\r\n applyOption(scope.focusIndex);\r\n }\r\n else {\r\n scope.toggle(e);\r\n }\r\n }\r\n };\r\n scope.onKeydown = function (e) {\r\n var fn = behaviours[e.keyCode] || angular.noop;\r\n fn(e);\r\n };\r\n scope.$on('$destroy', function () {\r\n $(document).off('click.dropdownmultiselect');\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar ekh;\r\n(function (ekh) {\r\n angular\r\n .module('ekh')\r\n .directive('emailMyQuote', function ($routeParams, tripService, quoteManager, resourceService, authService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=emailmyquote',\r\n controllerAs: 'emq',\r\n bindToController: true,\r\n scope: {},\r\n link: function ($scope) {\r\n $scope.formState.setSubmitFn(function (data) {\r\n return quoteManager.create(data);\r\n });\r\n },\r\n controller: function ($scope) {\r\n var _this = this;\r\n this.salutationOptions = resourceService.getDeferred('EMAILQUOTESALUTATIONOPTIONS');\r\n this.customer = {};\r\n this.isSkywardsUser = false;\r\n this.user = authService.getUser();\r\n this.isSendEmailToSelfEnabled = false;\r\n this.processCustomerDetails = function (bindWithSkywards) {\r\n if (bindWithSkywards) {\r\n _this.customer = {\r\n title: _this.user.Title || '',\r\n quoteSignupEmail: _this.user.Email || '',\r\n firstName: _this.user.FirstName || '',\r\n lastName: _this.user.LastName || '',\r\n mobileTel: ''\r\n };\r\n }\r\n else {\r\n _this.customer = {};\r\n }\r\n };\r\n this.checkSkywardsUser = function () {\r\n if (_this.user && _this.user.HardSignedIn) {\r\n _this.isSkywardsUser = true;\r\n _this.isSendEmailToSelfEnabled = true;\r\n _this.processCustomerDetails(_this.isSkywardsUser);\r\n }\r\n else {\r\n _this.isSkywardsUser = false;\r\n _this.isSendEmailToSelfEnabled = false;\r\n _this.processCustomerDetails(_this.isSkywardsUser);\r\n }\r\n };\r\n this.checkSkywardsUser();\r\n this.toggleSendEmailToSelfOption = function () {\r\n _this.processCustomerDetails(_this.isSendEmailToSelfEnabled);\r\n $scope.formState.resetSubmitResult();\r\n };\r\n this.submit = function (customer, shouldSignUp) { return __awaiter(_this, void 0, void 0, function () {\r\n var trip, request;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, tripService.getTrip($routeParams.tripId)];\r\n case 1:\r\n trip = _a.sent();\r\n request = {\r\n BasketId: trip.BasketId,\r\n QuoteId: '',\r\n EmailAddress: customer.quoteSignupEmail,\r\n EmailSignUp: shouldSignUp,\r\n User: {\r\n Title: customer.title || '',\r\n FirstName: customer.firstName,\r\n LastName: customer.lastName,\r\n Email: customer.quoteSignupEmail,\r\n MobileTel: ''\r\n },\r\n TrackingTag: null,\r\n SendEmail: true,\r\n SharedUse: true,\r\n SkywardsTotalMiles: (TRPCONFIG.Domain.SkywardsInfo &&\r\n TRPCONFIG.Domain.SkywardsInfo.length > 0 &&\r\n TRPCONFIG.Domain.SkywardsInfo[0].Miles > 0) ?\r\n TRPCONFIG.Domain.SkywardsInfo[0].Miles : null\r\n };\r\n $scope.formState.resetSubmitResult();\r\n return [2 /*return*/, $scope.formState.submit(request)];\r\n }\r\n });\r\n }); };\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var FooterCookies = /** @class */ (function () {\r\n function FooterCookies($scope, broker) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n }\r\n FooterCookies.prototype.init = function (container) {\r\n var _this = this;\r\n this.broker.subscribe('footerCookies', 'showFooterCookies', function (e) {\r\n _this.show = true;\r\n var header = document.querySelectorAll('.header-wrapper')[0];\r\n var selectionToolbar = document.querySelectorAll('.selection-toolbar')[0];\r\n var mainCol = document.querySelectorAll('.main-col')[0];\r\n header.style.zIndex = '0';\r\n selectionToolbar.style.zIndex = '0';\r\n mainCol.style.zIndex = '0';\r\n var cookieModal = document.querySelectorAll('.cookie-modal')[0];\r\n var close = cookieModal.querySelectorAll('.close')[0];\r\n close.addEventListener('click', function (e) {\r\n header.removeAttribute('style');\r\n selectionToolbar.removeAttribute('style');\r\n mainCol.removeAttribute('style');\r\n });\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n _this.broker.unsubscribe('footerCookies');\r\n });\r\n };\r\n FooterCookies.prototype.showCookiePopup = function () {\r\n this.broker.publish('showFooterCookies');\r\n };\r\n return FooterCookies;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('footerCookies', function () {\r\n return {\r\n scope: {},\r\n controller: FooterCookies,\r\n controllerAs: 'fc',\r\n templateUrl: 'partials/home/directivetemplate?type=FooterCookies',\r\n bindToController: {\r\n popupContent: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var FormState = /** @class */ (function () {\r\n function FormState(form, $q) {\r\n var _this = this;\r\n this.form = form;\r\n this.$q = $q;\r\n this.successSubmitResult = false;\r\n this.errorSubmitResult = false;\r\n this.formSubmitted = false;\r\n this.formOnceClicked = false;\r\n this._submit = function () { return _this.$q.resolve(); };\r\n this.isSubmitInProcess = false;\r\n }\r\n FormState.prototype.setSubmitFn = function (submit) {\r\n this._submit = submit;\r\n };\r\n FormState.prototype.isSubmitResultError = function () {\r\n return this.errorSubmitResult;\r\n };\r\n FormState.prototype.isSubmitResultSuccess = function () {\r\n return this.successSubmitResult;\r\n };\r\n FormState.prototype.isFormOnceClicked = function () {\r\n return this.formOnceClicked;\r\n };\r\n FormState.prototype.submit = function (data) {\r\n var _this = this;\r\n this.formOnceClicked = true;\r\n if (this.form.$invalid) {\r\n return this.$q.reject();\r\n }\r\n this.isSubmitInProcess = true;\r\n return this._submit(data)\r\n .then(function (res) {\r\n _this.successSubmitResult = true;\r\n _this.errorSubmitResult = false;\r\n _this.isSubmitInProcess = false;\r\n return _this.$q.resolve(res);\r\n })\r\n .catch(function (err) {\r\n _this.successSubmitResult = false;\r\n _this.errorSubmitResult = true;\r\n _this.isSubmitInProcess = false;\r\n return _this.$q.reject(err);\r\n });\r\n };\r\n FormState.prototype.resetFormState = function () {\r\n this.resetSubmitResult();\r\n this.formOnceClicked = false;\r\n localStorage.setItem('subscriptionState', 'subscribed'); /*setting subscriptionState in localstorage*/\r\n };\r\n FormState.prototype.resetSubmitResult = function () {\r\n this.successSubmitResult = false;\r\n this.errorSubmitResult = false;\r\n this.formSubmitted = false;\r\n this.isSubmitInProcess = false;\r\n };\r\n FormState.prototype.isFormValid = function () {\r\n return this.form.$valid;\r\n };\r\n FormState.prototype.showFieldError = function (fieldName) {\r\n if (!this.form || !this.form[fieldName]) {\r\n return false;\r\n }\r\n var fieldObj = this.form[fieldName];\r\n return fieldObj.$invalid && this.formOnceClicked && !fieldObj.focused;\r\n };\r\n FormState.prototype.showFieldValidatorError = function (fieldName, validationError) {\r\n if (!this.form || !this.form[fieldName]) {\r\n return false;\r\n }\r\n var formField = this.form[fieldName];\r\n var fieldError = formField.$error[validationError];\r\n return fieldError && this.formOnceClicked && !formField.focused;\r\n };\r\n return FormState;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('formState', function ($q) {\r\n return {\r\n restrict: 'A',\r\n link: function ($scope, $element, $attrs) {\r\n $scope.formState = new FormState($scope[$attrs.name], $q);\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n(function () {\r\n 'use strict';\r\n angular.module('ekh')\r\n .directive('hideSubmenuOnClick', function ($window, broker) {\r\n var directive = {};\r\n var elements = [];\r\n var hsHeights = [];\r\n var isMobile = TRPCONFIG.IsMobileView;\r\n directive.link = function (scope, element, attr) {\r\n if (_.find(elements, element) == null) {\r\n elements.push(element);\r\n }\r\n var index = _.findIndex(elements, element);\r\n function touchedFalsify() {\r\n elements.forEach(function (el) {\r\n el.touched = false;\r\n });\r\n }\r\n function onMouseEnter() {\r\n element.addClass('hover');\r\n element.siblings().removeClass('hover');\r\n if (!isMobile) {\r\n var hs = element.find('.grid-container > div > div > :first-child');\r\n for (var i = 0; i < hs.length; i++) {\r\n hsHeights.push($(hs[i]).height());\r\n }\r\n var maxHeight = Math.max.apply(Math, hsHeights);\r\n hs.attr('style', \"height: \" + maxHeight + \"px\");\r\n }\r\n // Add `keep-in-viewport-x` attribute to keep element on screen\r\n if ('keepInViewportX' in attr) {\r\n keepInViewportX(attr.keepInViewportX);\r\n }\r\n }\r\n function keepInViewportX(selector) {\r\n var win = $($window);\r\n var el = selector ? element.find(selector) : element;\r\n el.css('left', 0);\r\n var winRight = win.width() + win.scrollLeft() - 28; // Scrollbar\r\n var elRight = el.offset().left + el.width();\r\n var delta = elRight - winRight;\r\n if (delta > 0) {\r\n el.css('left', el.position().left - delta);\r\n }\r\n }\r\n element.on('click', function () {\r\n if ($window.TRPCONFIG.IsTouchDevice) {\r\n if (elements[index].touched === false || elements[index].touched == null) {\r\n onMouseEnter();\r\n touchedFalsify();\r\n elements[index].touched = true;\r\n }\r\n else if (elements[index].touched === true) {\r\n element.removeClass('hover');\r\n element.siblings().removeClass('hover');\r\n touchedFalsify();\r\n }\r\n }\r\n });\r\n element.on('mouseenter', function () {\r\n if (!$window.TRPCONFIG.IsTouchDevice) {\r\n onMouseEnter();\r\n }\r\n });\r\n element.children('.sub-menu').find('a').on('click', function () {\r\n element.removeClass('hover');\r\n });\r\n element.on('mouseleave', function () {\r\n element.removeClass('hover');\r\n });\r\n element.find('.menu-item-link').click(function () {\r\n broker.publish('hideNavigationDrawer');\r\n });\r\n };\r\n return directive;\r\n })\r\n .directive('slidePanelItem', function (broker, resourceService) {\r\n var isMobile = TRPCONFIG.IsMobileView;\r\n var enableSubMenu = TRPCONFIG.Domain.EnableDestinationsSubMenu;\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n hasChildren: '@'\r\n },\r\n link: function ($scope, element) {\r\n $scope.onItemSelected = function () {\r\n if ($scope.hasChildren === 'true') {\r\n var dropdowns = document.querySelectorAll('.dropdown');\r\n var classes = element[0].classList.value;\r\n if (dropdowns.length) {\r\n dropdowns[0].classList.remove('dropdown');\r\n }\r\n if (!classes.includes('dropdown')) {\r\n element.addClass('dropdown');\r\n if (isMobile && enableSubMenu) {\r\n if (element[0].children[1].children[1].children[0].className === 'menu-item-link') {\r\n var items = element[0].children[1].children[1].children;\r\n for (var i = 0; i < items.length; i++) {\r\n items[i].style.display = 'block';\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n element.removeClass('dropdown');\r\n if (isMobile && enableSubMenu) {\r\n var items = element[0].children[1].children[1].children;\r\n for (var i = 0; i < items.length; i++) {\r\n items[i].style.display = '';\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n broker.publish('hideNavigationDrawer');\r\n }\r\n };\r\n if (isMobile && enableSubMenu) {\r\n document.addEventListener('click', function (e) {\r\n var target = e.target;\r\n var headerTypes = ['h1', 'h2', 'h3', 'h4', 'h5'];\r\n if (target.parentElement.firstElementChild.text === resourceService.get('DESTINATIONS')) {\r\n $('.menu-item-link').css('display', 'none');\r\n var destHeaders = target.parentElement.querySelectorAll('h1,h2,h3,h4,h5');\r\n var destHeadersLength = destHeaders ? destHeaders.length : 0;\r\n if (destHeadersLength > 0) {\r\n for (var i = 0; i < destHeadersLength; i++) {\r\n if (destHeaders[i].children[0] && destHeaders[i].classList.length === 0) {\r\n destHeaders[i].children[0].removeAttribute('class');\r\n destHeaders[i].children[0].classList.add('expand-icon', 'bg-position');\r\n }\r\n else {\r\n if (destHeaders[i].children[0] && destHeaders[i].children[0].classList.length > 0) {\r\n destHeaders[i].children[0].removeAttribute('class');\r\n }\r\n destHeaders[i].removeAttribute('class');\r\n destHeaders[i].classList.add('expand-icon', 'bg-position-one');\r\n }\r\n }\r\n }\r\n }\r\n if (target.parentElement.firstElementChild.tagName && headerTypes.includes(target.parentElement.firstElementChild.tagName.toLowerCase())) {\r\n $(target).parents('.menu-item')[0].classList.add('dropdown');\r\n var items = target.parentElement.children[1].children;\r\n if (items.length > 0) {\r\n subMenuReset(target);\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].style.display !== 'block') {\r\n items[i].style.display = 'block';\r\n if (headerTypes.includes(target.tagName.toLowerCase())) {\r\n target.removeAttribute('class');\r\n target.classList.add('collapse-icon', 'bg-position-two');\r\n }\r\n }\r\n else {\r\n items[i].style.display = 'none';\r\n if (headerTypes.includes(target.tagName.toLowerCase())) {\r\n if (target.children[0] && target.children[0].classList.length > 0) {\r\n target.children[0].removeAttribute('class');\r\n }\r\n target.removeAttribute('class');\r\n target.classList.add('expand-icon', 'bg-position-one');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else if (target.parentElement.firstElementChild.tagName && target.parentElement.firstElementChild.tagName === 'A' &&\r\n (headerTypes.includes(target.parentElement.tagName.toLowerCase()))) {\r\n $(target).parents('.menu-item')[0].classList.add('dropdown');\r\n var items = target.parentElement.parentElement.children[1].children;\r\n if (items.length > 0) {\r\n subMenuReset(target);\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].style.display !== 'block') {\r\n items[i].style.display = 'block';\r\n if (target.tagName === 'A') {\r\n if (target.parentElement.classList.length > 0) {\r\n target.parentElement.removeAttribute('class');\r\n }\r\n target.removeAttribute('class');\r\n target.classList.add('collapse-icon', 'bg-position-three');\r\n }\r\n }\r\n else {\r\n items[i].style.display = 'none';\r\n if (target.tagName === 'A') {\r\n if (target.parentElement.classList.length > 0) {\r\n target.parentElement.removeAttribute('class');\r\n }\r\n target.removeAttribute('class');\r\n target.classList.add('expand-icon', 'bg-position');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }, false);\r\n }\r\n function subMenuReset(target) {\r\n if (target.parentElement.firstElementChild.className.includes('expand-icon')) {\r\n $('.menu-item-link').css('display', 'none');\r\n var grid = $(target).parents('.grid-container');\r\n var destHeaders = grid[0].querySelectorAll('h1,h2,h3,h4,h5');\r\n var destHeadersLength = destHeaders ? destHeaders.length : 0;\r\n if (destHeadersLength > 0) {\r\n for (var i = 0; i < destHeadersLength; i++) {\r\n if (destHeaders[i].children[0] && destHeaders[i].classList.length === 0) {\r\n destHeaders[i].children[0].removeAttribute('class');\r\n destHeaders[i].children[0].classList.add('expand-icon', 'bg-position');\r\n }\r\n else {\r\n if (destHeaders[i].children[0] && destHeaders[i].children[0].classList.length > 0) {\r\n destHeaders[i].children[0].removeAttribute('class');\r\n }\r\n destHeaders[i].removeAttribute('class');\r\n destHeaders[i].classList.add('expand-icon', 'bg-position-one');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n template: '
      • '\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('ekh')\r\n .directive('metaOverride', metaOverride);\r\n function metaOverride() {\r\n function _linker(scope) {\r\n var metaInfo = scope.metaInfo;\r\n $.each({\r\n 'title': \"\" + metaInfo.PageTitle,\r\n 'meta[name=title]': \"<meta name=\\\"keywords\\\" content=\\\"\" + (metaInfo.MetaKeywords || '') + \"\\\">\",\r\n 'meta[name=description]': \"<meta name=\\\"description\\\" content=\\\"\" + (metaInfo.MetaDescription || '') + \"\\\">\",\r\n 'meta[property=\"og:description\"]': \"<meta property=\\\"og:description\\\" content=\\\"\" + (metaInfo.MetaDescription || '') + \"\\\">\"\r\n }, function (selector, htmlStr) {\r\n $(selector).remove();\r\n $('head').append(htmlStr);\r\n });\r\n }\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n metaInfo: '='\r\n },\r\n link: _linker\r\n };\r\n }\r\n})();\r\nvar ekh;\r\n(function (ekh) {\r\n var t = Date.now();\r\n var NavToolbar = /** @class */ (function () {\r\n function NavToolbar($scope, broker, globalisationService, signUpPopupService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.globalisationService = globalisationService;\r\n this.signUpPopupService = signUpPopupService;\r\n this.dropdownToggled = false;\r\n this.parentThis = this;\r\n globalisationService.getSelectedRegionalContext().then(function (regionalContext) {\r\n _this.activeContext = regionalContext;\r\n });\r\n broker.subscribe('navToolbar', 'RegionalContextSelected', function (ev) {\r\n return _this.activeContext;\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('navToolbar');\r\n });\r\n this.idleLogout();\r\n }\r\n NavToolbar.prototype.toggleCountryPicker = function () {\r\n this.dropdownToggled = !this.dropdownToggled;\r\n };\r\n ;\r\n NavToolbar.prototype.openSignUpPopup = function () {\r\n this.signUpPopupService.showPopup();\r\n };\r\n NavToolbar.prototype.idleLogout = function () {\r\n this.showPopup();\r\n window.onload = this.resetTimer;\r\n window.onmousemove = this.resetTimer;\r\n window.onmousedown = this.resetTimer;\r\n window.ontouchstart = this.resetTimer;\r\n window.ontouchmove = this.resetTimer;\r\n window.onclick = this.resetTimer;\r\n window.onkeydown = this.resetTimer;\r\n window.addEventListener('scroll', this.resetTimer, true);\r\n };\r\n NavToolbar.prototype.resetTimer = function () {\r\n t = Date.now();\r\n };\r\n /*this method used to show popup by calling \"resetTimer\" method. its a recursive method*/\r\n NavToolbar.prototype.showPopup = function () {\r\n var _this = this;\r\n var self = this;\r\n var d = Date.now();\r\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\r\n if ((d - t) > 10000\r\n && localStorage.getItem('popState') !== 'shown'\r\n && TRPCONFIG.searchState !== 'searching'\r\n && localStorage.getItem('subscriptionState') !== 'subscribed') {\r\n this.openSignUpPopup();\r\n localStorage.setItem('popState', 'shown');\r\n }\r\n setTimeout(function () {\r\n if (TRPCONFIG.searchState === 'searching') {\r\n t = Date.now();\r\n }\r\n }.bind(this), 1000);\r\n }\r\n document.addEventListener('mouseleave', function (event) {\r\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\r\n if ((event.clientY <= 0 || event.clientX <= 0 || (event.clientX >= window.innerWidth\r\n || event.clientY >= window.innerHeight))\r\n && localStorage.getItem('popState') !== 'shown'\r\n && TRPCONFIG.searchState !== 'searching'\r\n && localStorage.getItem('subscriptionState') !== 'subscribed') {\r\n _this.openSignUpPopup();\r\n localStorage.setItem('popState', 'shown');\r\n }\r\n }\r\n });\r\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\r\n setTimeout(function () {\r\n self.showPopup();\r\n }.bind(this), 10000);\r\n }\r\n };\r\n return NavToolbar;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('navToolbar', function () {\r\n return {\r\n restrict: 'E',\r\n scope: true,\r\n templateUrl: 'partials/home/directivetemplate?type=navtoolbar',\r\n controller: NavToolbar,\r\n controllerAs: 'nt'\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var PhoneNumberInput = /** @class */ (function () {\r\n function PhoneNumberInput($scope, $element) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.ngModel = '';\r\n this.onInit();\r\n this.$scope.$on('$destroy', function () {\r\n _this.onDestroy();\r\n });\r\n }\r\n PhoneNumberInput.prototype.onInit = function () {\r\n var _this = this;\r\n this.countryCode = this._getDefaultCountryCode();\r\n this.initCcPicker();\r\n this.$element.on('countrySelect', function (e, data) {\r\n _this.onCountryCodeChange(data);\r\n });\r\n this.$countryPickerElement = angular.element('.cc-picker.cc-picker-code-select-enabled');\r\n this.$countryPickerElement.on('click', this.setTouched.bind(this));\r\n this.setCountryByCode(this.countryCode);\r\n this.$scope.$watch('phoneNumberCtrl.ngModel', this.updateExternalModel.bind(this));\r\n this.$scope.$watch('phoneNumberCtrl.exportValueToModel', this.syncExportValueModel.bind(this));\r\n };\r\n PhoneNumberInput.prototype.initCcPicker = function () {\r\n this.$element = this.$element.CcPicker({\r\n dataUrl: './build/country-phone-codes/data.json',\r\n });\r\n };\r\n PhoneNumberInput.prototype.setCountryByCode = function (countryCode) {\r\n this.$element.CcPicker('setCountryByCode', countryCode);\r\n };\r\n PhoneNumberInput.prototype.setCountryByPhoneCode = function (countryPhoneCode) {\r\n this.$element.CcPicker('setCountryByPhoneCode', countryPhoneCode);\r\n };\r\n PhoneNumberInput.prototype.setTouched = function () {\r\n this.$scope.ngModelCtrl.$setTouched();\r\n };\r\n PhoneNumberInput.prototype.onDestroy = function () {\r\n this.$element.off('countrySelect');\r\n this.$countryPickerElement.off('click');\r\n };\r\n PhoneNumberInput.prototype.onCountryCodeChange = function (_a) {\r\n var _this = this;\r\n var code = _a.code, phoneCode = _a.phoneCode;\r\n this.countryCode = code;\r\n this.countryCodeNumber = phoneCode;\r\n this.updateExternalModel();\r\n this.$scope.$applyAsync(function () {\r\n _this.updateBooking();\r\n });\r\n };\r\n PhoneNumberInput.prototype.updateExternalModel = function () {\r\n this.exportValueToModel = this.countryCodeNumber + \" \" + this.ngModel;\r\n };\r\n PhoneNumberInput.prototype.updateBooking = function () {\r\n if (this.$scope.ngModelCtrl && this.$scope.ngModelCtrl.$touched) {\r\n if (this.$scope.ngModelCtrl.$updateBooking) {\r\n this.$scope.$evalAsync(this.$scope.ngModelCtrl.$updateBooking);\r\n }\r\n }\r\n };\r\n PhoneNumberInput.prototype._getDefaultCountryCode = function () {\r\n if (TRPCONFIG && TRPCONFIG.Domain && TRPCONFIG.Domain.CountryCode) {\r\n return TRPCONFIG.Domain.CountryCode;\r\n }\r\n return 'gb';\r\n };\r\n PhoneNumberInput.prototype.syncExportValueModel = function (value) {\r\n if (!value) {\r\n return false;\r\n }\r\n var _a = value.split(' '), countryPhoneCode = _a[0], phoneNumber = _a[1];\r\n phoneNumber = !phoneNumber || phoneNumber === 'undefined' ? '' : phoneNumber;\r\n if (phoneNumber !== this.ngModel) {\r\n this.ngModel = phoneNumber;\r\n }\r\n if (countryPhoneCode !== this.countryCodeNumber) {\r\n this.countryCodeNumber = countryPhoneCode;\r\n this.setCountryByPhoneCode(this.countryCodeNumber);\r\n }\r\n };\r\n return PhoneNumberInput;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('phoneNumberInput', function () {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n exportValueToModel: '=',\r\n ngModel: '='\r\n },\r\n require: ['ngModel'],\r\n bindToController: true,\r\n controller: PhoneNumberInput,\r\n controllerAs: 'phoneNumberCtrl',\r\n link: function ($scope, $element, attr, ctrls) {\r\n $scope.ngModelCtrl = ctrls[0];\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('ekh')\r\n .directive('productCarousel', productCarousel);\r\n function productCarousel($timeout) {\r\n function _linker(scope, el, attr) {\r\n var baseOptions = {\r\n speed: 1000,\r\n slidesToShow: parseInt(attr.items) || 4,\r\n swipeToSlide: true,\r\n rtl: !!TRPCONFIG.Rtl\r\n };\r\n var itemOptions = {\r\n 4: {\r\n slidesToShow: 4,\r\n responsive: [{\r\n breakpoint: 500,\r\n settings: { slidesToShow: 1 }\r\n }, {\r\n breakpoint: 910,\r\n settings: { slidesToShow: 2 }\r\n }, {\r\n breakpoint: 1280,\r\n settings: { slidesToShow: 3 }\r\n }]\r\n },\r\n 9: {\r\n slidesToShow: 6,\r\n responsive: [{\r\n breakpoint: 480,\r\n settings: { slidesToShow: 2 }\r\n }, {\r\n breakpoint: 768,\r\n settings: { slidesToShow: 3 }\r\n }, {\r\n breakpoint: 1280,\r\n settings: { slidesToShow: 4 }\r\n }]\r\n },\r\n 1: {\r\n autoplay: true,\r\n autoplaySpeed: parseInt(attr.autoplayTimeout) || 3000,\r\n slidesToShow: 1\r\n }\r\n };\r\n var carouselOptions = angular.extend(baseOptions, itemOptions[attr.itemOptions]);\r\n if (attr.staticItems) {\r\n el.slick(carouselOptions);\r\n }\r\n else {\r\n $timeout(function () {\r\n if (scope.tiles != null && scope.tiles.length > 1) {\r\n el.slick(carouselOptions);\r\n }\r\n });\r\n }\r\n }\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n tiles: '='\r\n },\r\n link: _linker\r\n };\r\n }\r\n})();\r\nvar Quote;\r\n(function (Quote) {\r\n var QuoteControllerStatus;\r\n (function (QuoteControllerStatus) {\r\n QuoteControllerStatus[QuoteControllerStatus[\"Busy\"] = 0] = \"Busy\";\r\n QuoteControllerStatus[QuoteControllerStatus[\"NotFound\"] = 1] = \"NotFound\";\r\n QuoteControllerStatus[QuoteControllerStatus[\"Ready\"] = 2] = \"Ready\";\r\n QuoteControllerStatus[QuoteControllerStatus[\"RefreshError\"] = 3] = \"RefreshError\";\r\n QuoteControllerStatus[QuoteControllerStatus[\"RefreshFailed\"] = 4] = \"RefreshFailed\";\r\n })(QuoteControllerStatus = Quote.QuoteControllerStatus || (Quote.QuoteControllerStatus = {}));\r\n var QuotePublicController = /** @class */ (function () {\r\n function QuotePublicController($location, $routeParams, analytics, basketService, basketStore, bookingService, dateUtil, tripService, quoteService) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$routeParams = $routeParams;\r\n this.analytics = analytics;\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.bookingService = bookingService;\r\n this.dateUtil = dateUtil;\r\n this.tripService = tripService;\r\n this.quoteService = quoteService;\r\n this.controllerStatus = QuoteControllerStatus;\r\n this.currentStatus = QuoteControllerStatus.Busy;\r\n this.priceDifference = 0;\r\n this.priceDifferencePercentage = 0;\r\n this.validForDays = 30; //maybe the API should tell us this\r\n this.hasEssentials = false;\r\n this.productsLength = 0;\r\n this.analytics.track('mixpanel', 'EmailMeLanding');\r\n var url = $routeParams.quoteRef + \"/\" + $routeParams.quoteNo;\r\n this.quoteStatusPromise = quoteService.getQuoteByReference(url)\r\n .then(function (quote) {\r\n if (!quote || quote.Error) {\r\n return _this.currentStatus = QuoteControllerStatus.NotFound;\r\n }\r\n //get the product ids\r\n var productIds = _.map(quote.Products, function (p) { return p.Id; });\r\n //seems that we can't do a single thing going forward without a trip being setup. As we are refreshing\r\n //the quote we might as well create a trip from the quote too. Unfortunately the trip service\r\n //relies on the basket and the basket is there until the refresh has happened :(\r\n return quoteService.refreshQuote(quote.Id, productIds).then(function (refreshedQuote) {\r\n if (refreshedQuote.Error) {\r\n return _this.currentStatus = QuoteControllerStatus.RefreshError;\r\n }\r\n else {\r\n var restoreFailed = _.some(refreshedQuote.Products, { 'RestoreFailed': true });\r\n _this.productsLength = refreshedQuote.Products.length;\r\n if (restoreFailed) {\r\n _this.quote = quote;\r\n return _this.currentStatus = QuoteControllerStatus.RefreshFailed;\r\n }\r\n _this.hasEssentials = _.some(refreshedQuote.Products, function (_a) {\r\n var Ty = _a.Ty;\r\n return Ty === 'Transfer' || Ty === 'Car Hire' || Ty === 'Marhaba' || Ty === 'Insurance';\r\n });\r\n return tripService.getTripFromQuote(refreshedQuote).then(function (trip) {\r\n _this.trip = trip;\r\n _this.quote = refreshedQuote;\r\n _this.validForDays = quoteService.validForDays(refreshedQuote.Products);\r\n _this._setPriceDifference(refreshedQuote.Products);\r\n return _this.currentStatus = QuoteControllerStatus.Ready;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n QuotePublicController.prototype._setPriceDifference = function (products) {\r\n var _a = this.quoteService.getPriceDifference(products), priceDifferenceAbs = _a.priceDifferenceAbs, priceDifferencePercentage = _a.priceDifferencePercentage;\r\n this.priceDifference = priceDifferenceAbs;\r\n this.priceDifferencePercentage = priceDifferencePercentage;\r\n };\r\n QuotePublicController.prototype.searchAgain = function () {\r\n var _this = this;\r\n if (this.trip) {\r\n this.tripService.restoreSearchUnit(this.trip.TripId).then(function () {\r\n _this.$location.path('/holidays');\r\n });\r\n }\r\n else {\r\n this.$location.path('/');\r\n }\r\n };\r\n ;\r\n QuotePublicController.prototype.bookQuote = function (position) {\r\n var _this = this;\r\n var bookingRedirectPath = 'holidays/book';\r\n var _a = this.trip, BookingId = _a.BookingId, TripId = _a.TripId;\r\n var BasketId = this.quote.BasketId;\r\n this.basketService\r\n .bookBasket(TripId, BasketId);\r\n this.bookingService\r\n .prepareBooking(BasketId, BookingId, TripId)\r\n .then(function () {\r\n _this.$location.path(bookingRedirectPath + \"/\" + TripId);\r\n });\r\n if (position) {\r\n this.analytics.track('mixpanel', 'EmailMeBookButton', { position: position });\r\n }\r\n };\r\n QuotePublicController.prototype.hideLoadingScreenOverlay = function () {\r\n var _a = this, quote = _a.quote, currentStatus = _a.currentStatus, controllerStatus = _a.controllerStatus;\r\n return quote && (currentStatus === controllerStatus.Ready ||\r\n currentStatus === controllerStatus.RefreshError ||\r\n currentStatus === controllerStatus.RefreshFailed);\r\n };\r\n return QuotePublicController;\r\n }());\r\n angular\r\n .module('quote')\r\n .controller('QuotePublic', QuotePublicController);\r\n})(Quote || (Quote = {}));\r\n/// <reference path='../../core/contracts/quote.contracts.ts'/>\r\n/// <reference path='../../quote/controllers/quotePublic.controller.ts'/>\r\n/// <reference path='../../core/services/quote.service.ts'/>\r\n/// <reference path='../../core/services/resource.service.ts'/>\r\n/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\r\n/// <reference path=\"../../../../../../typings/globals/lodash/index.d.ts\" />\r\nvar ekh;\r\n(function (ekh) {\r\n var PublicQuoteSummaryController = /** @class */ (function () {\r\n function PublicQuoteSummaryController(basketService, basketStore, bookingService, dateUtil, tripService, quoteService, flightDetail, $q, $timeout, $rootScope, resourceService, $scope) {\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.bookingService = bookingService;\r\n this.dateUtil = dateUtil;\r\n this.tripService = tripService;\r\n this.quoteService = quoteService;\r\n this.flightDetail = flightDetail;\r\n this.$q = $q;\r\n this.$timeout = $timeout;\r\n this.$rootScope = $rootScope;\r\n this.resourceService = resourceService;\r\n this.$scope = $scope;\r\n this.quoteStatus = Quote.QuoteControllerStatus.Busy;\r\n this.controllerLoaded = false;\r\n this.clientReadConfirm = false;\r\n this.detailsStorageConsent = false;\r\n this.detailsStorageMandatory = false;\r\n $rootScope.lockScreen($scope, {\r\n title: resourceService.get('PREPARINGBOOKING'),\r\n loadingScreenStyle: 'booking-optionsCtrl'\r\n });\r\n }\r\n PublicQuoteSummaryController.prototype.$onInit = function () {\r\n var _this = this;\r\n this.quoteStatusPromise.then(function (status) {\r\n _this.$timeout(function (_) {\r\n _this._checkAllProductsRefreshed(status).then(function (status) {\r\n _this.quoteStatus = status;\r\n switch (status) {\r\n case Quote.QuoteControllerStatus.Ready:\r\n _this.$timeout(function (_) {\r\n _this._init(_this.quote);\r\n });\r\n break;\r\n default:\r\n _this.$rootScope.unlockScreen(_this.$scope);\r\n }\r\n });\r\n });\r\n })\r\n .catch(function () {\r\n _this.quoteStatus = Quote.QuoteControllerStatus.RefreshError;\r\n });\r\n };\r\n PublicQuoteSummaryController.prototype._init = function (quote) {\r\n var _this = this;\r\n this._setTransfer(quote);\r\n this._setParking(quote);\r\n this.$q.all([\r\n this.basketStore.hotel(quote.BasketId),\r\n this.basketStore.flight(quote.BasketId)\r\n ]).then(function (_a) {\r\n var hotel = _a[0], flight = _a[1];\r\n _this.$rootScope.unlockScreen(_this.$scope);\r\n _this.controllerLoaded = true;\r\n _this.flight = flight;\r\n _this.hotel = hotel;\r\n });\r\n };\r\n PublicQuoteSummaryController.prototype._setTransfer = function (quote) {\r\n this.transfer = _.find(quote.Products, { TypeId: 2 });\r\n };\r\n PublicQuoteSummaryController.prototype._setParking = function (quote) {\r\n this.parking = _.find(quote.Products, { TypeId: 3 });\r\n };\r\n PublicQuoteSummaryController.prototype._checkAllProductsRefreshed = function (status) {\r\n var _this = this;\r\n if (!this.trip || !this.quote) {\r\n return this.$q.when(Quote.QuoteControllerStatus.RefreshError);\r\n }\r\n return this.basketStore.getBasket(this.quote.BasketId)\r\n .then(function (basket) {\r\n var basketProds = basket.Products.map(function (p) { return p.ProductType; }).sort();\r\n var quoteProds = _this.quote.Products.map(function (p) { return p.TypeId; }).sort();\r\n return _.isEqual(basketProds, quoteProds) ? status : Quote.QuoteControllerStatus.RefreshError;\r\n });\r\n };\r\n PublicQuoteSummaryController.prototype.isHFareFlightType = function () {\r\n return this.flightDetail.isHFlightType(_.get(this.flight, 'Details.Itinerary'), false);\r\n };\r\n ;\r\n PublicQuoteSummaryController.prototype.book = function () {\r\n this.bookQuote();\r\n };\r\n PublicQuoteSummaryController.prototype.isBookingDisabled = function () {\r\n return !this.clientReadConfirm ||\r\n (this.detailsStorageMandatory && !this.detailsStorageConsent);\r\n };\r\n PublicQuoteSummaryController.prototype.quoteIsReady = function () {\r\n return this.quoteStatus === Quote.QuoteControllerStatus.Ready;\r\n };\r\n return PublicQuoteSummaryController;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('publicQuoteSummary', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=publicquotesummary',\r\n controllerAs: 'qps',\r\n bindToController: {\r\n quoteStatusPromise: '=',\r\n trip: '=',\r\n quote: '=',\r\n bookQuote: '&',\r\n priceDifferencePercentage: '='\r\n },\r\n controller: PublicQuoteSummaryController\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n/// <reference path='../../core/contracts/quote.contracts.ts'/>\r\n/// <reference path='../../quote/controllers/quotePublic.controller.ts'/>\r\n/// <reference path='../../core/services/quote.service.ts'/>\r\n/// <reference path='../../core/services/resource.service.ts'/>\r\n/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\r\n/// <reference path=\"../../../../../../typings/globals/lodash/index.d.ts\" />\r\nvar ekh;\r\n(function (ekh) {\r\n var QuoteStatusMessagesController = /** @class */ (function () {\r\n function QuoteStatusMessagesController(resourceService) {\r\n this.resourceService = resourceService;\r\n this.phoneNumber = this.resourceService.get('TELEPHONENUMBER');\r\n var priceRange = parseFloat(TRPCONFIG.Domain2.QuoteSamePricePercentRange);\r\n this.samePriceRange = !isNaN(priceRange) ? priceRange : 0;\r\n }\r\n QuoteStatusMessagesController.prototype.getTitle = function (messType) {\r\n switch (messType) {\r\n case 'EXPIRED':\r\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_EXPIRED_TITLE'), this.quoteRef);\r\n default:\r\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_TITLE'), this.quoteRef);\r\n }\r\n };\r\n QuoteStatusMessagesController.prototype.getMessageText = function (messType) {\r\n switch (messType) {\r\n case 'EXPIRED':\r\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_EXPIRED_TEXT'), \"<b>\" + this.phoneNumber + \"</b>\");\r\n case 'PRICE_DECREASED':\r\n return this.resourceService.get('QUOTE_STATUS_MESSAGE_PRICE_DECREASED_TEXT');\r\n case 'PRICE_INCREASED':\r\n return this.resourceService.get('QUOTE_STATUS_MESSAGE_PRICE_INCREASED_TEXT');\r\n default:\r\n return '';\r\n }\r\n };\r\n QuoteStatusMessagesController.prototype.isExpiredMessage = function () {\r\n return this.quoteStatus !== Quote.QuoteControllerStatus.Ready &&\r\n this.quoteStatus !== Quote.QuoteControllerStatus.Busy;\r\n };\r\n QuoteStatusMessagesController.prototype.isPriceDecreasedMessage = function () {\r\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\r\n return false;\r\n }\r\n return !this.isSamePriceMessage() && this.priceDifferencePercentage < 0;\r\n };\r\n QuoteStatusMessagesController.prototype.isPriceIncreasedMessage = function () {\r\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\r\n return false;\r\n }\r\n return !this.isSamePriceMessage() && this.priceDifferencePercentage > 0;\r\n };\r\n QuoteStatusMessagesController.prototype.isSamePriceMessage = function () {\r\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\r\n return false;\r\n }\r\n return Math.abs(this.priceDifferencePercentage) <= this.samePriceRange;\r\n };\r\n QuoteStatusMessagesController.prototype.getButtonLabel = function () {\r\n return this.resourceService.get('HOLIDAYSEARCH');\r\n };\r\n return QuoteStatusMessagesController;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('quoteStatusMessages', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n controllerAs: 'quoteMess',\r\n bindToController: {\r\n quoteStatus: '=',\r\n priceDifferencePercentage: '=',\r\n quoteRef: '='\r\n },\r\n controller: QuoteStatusMessagesController,\r\n template: \"\\n <div class=\\\"quote-status-messages\\\">\\n\\n <div class=\\\"message-block expired-quote\\\" ng-if-start=\\\"quoteMess.isExpiredMessage()\\\">\\n <div class=\\\"quote-ref\\\" ng-bind-html=\\\"::quoteMess.getTitle('EXPIRED')\\\"></div>\\n <div class=\\\"message\\\" ng-bind-html=\\\"::quoteMess.getMessageText('EXPIRED')\\\"></div>\\n </div>\\n <a href=\\\"./\\\" ng-if-end class=\\\"button primary\\\">\\n {{::quoteMess.getButtonLabel()}}\\n </a>\\n \\n <div class=\\\"message-block increased-price\\\" ng-if=\\\"quoteMess.isPriceIncreasedMessage()\\\">\\n <div class=\\\"quote-ref\\\" ng-bind-html=\\\"::quoteMess.getTitle('PRICE_INCREASED')\\\"></div>\\n <div class=\\\"message\\\" ng-bind-html=\\\"::quoteMess.getMessageText('PRICE_INCREASED')\\\"></div>\\n </div>\\n \\n <div class=\\\"message-block decreased-price\\\" ng-if=\\\"quoteMess.isPriceDecreasedMessage()\\\">\\n <div class=\\\"quote-ref\\\" ng-bind-html=\\\"::quoteMess.getTitle('PRICE_DECREASED')\\\"></div>\\n <div class=\\\"message\\\" ng-bind-html=\\\"::quoteMess.getMessageText('PRICE_DECREASED')\\\"></div>\\n </div>\\n \\n <div class=\\\"message-block same-price\\\" ng-if=\\\"quoteMess.isSamePriceMessage()\\\">\\n <div class=\\\"quote-ref\\\" ng-bind-html=\\\"::quoteMess.getTitle('SAME_PRICE')\\\"></div>\\n </div>\\n \\n </div>\\n \",\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\r\nvar ekh;\r\n(function (ekh) {\r\n var SelectedHotelController = /** @class */ (function () {\r\n function SelectedHotelController(basketStore, flightSearch, $q, arrayUtil, imageService) {\r\n this.basketStore = basketStore;\r\n this.flightSearch = flightSearch;\r\n this.$q = $q;\r\n this.arrayUtil = arrayUtil;\r\n this.imageService = imageService;\r\n this.totalCost = 0;\r\n this.totalDeposit = 0;\r\n this.depositAllowed = false;\r\n this.showHotelImages = false;\r\n this.imgWidth = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\r\n this.imgHeight = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\r\n this.hotelImageIndex = 0;\r\n this.showCancellationsPopUp = false;\r\n }\r\n SelectedHotelController.prototype.$onInit = function () {\r\n var _this = this;\r\n this._initHotelImages();\r\n this.$q.all([\r\n this.basketStore.totalCost(this.basketId),\r\n this.basketStore.totalDeposit(this.basketId),\r\n this.basketStore.rules(this.basketId)\r\n ]).then(function (_a) {\r\n var totalCost = _a[0], totalDeposit = _a[1], rules = _a[2];\r\n _this.totalCost = totalCost;\r\n _this.totalDeposit = totalDeposit;\r\n _this.depositAllowed = rules.depositAllowed;\r\n });\r\n this.findCancellationData();\r\n };\r\n SelectedHotelController.prototype.findCancellationData = function () {\r\n if (TRPCONFIG.Domain.BrandedFareCancellations) {\r\n this.showCancellationsPopUp = true;\r\n }\r\n };\r\n ;\r\n SelectedHotelController.prototype.showCancellationsDetails = function () {\r\n return this.flightSearch.showCancellationsDetailsModal();\r\n };\r\n ;\r\n SelectedHotelController.prototype._initHotelImages = function () {\r\n var _this = this;\r\n var numberImages = this.hotel.Details.NumberOfPhotos - 1;\r\n var hotelId = this.hotel.Details.Id;\r\n this.hotelImages = this.arrayUtil.map(this.arrayUtil.numberArray(0, numberImages), function (i) {\r\n return {\r\n src: _this.imageService.getImageUrl(hotelId, _this.imgWidth, _this.imgHeight, i, false)\r\n };\r\n });\r\n };\r\n SelectedHotelController.prototype.openImageGallery = function () {\r\n this.showHotelImages = true;\r\n };\r\n return SelectedHotelController;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('selectedHotel', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=selectedhotel',\r\n controller: SelectedHotelController,\r\n controllerAs: 'shCtrl',\r\n bindToController: {\r\n hotel: '=',\r\n basketId: '='\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\nvar ekh;\r\n(function (ekh) {\r\n var StickyNavBar = /** @class */ (function () {\r\n function StickyNavBar($scope, $element, $window, scrollService, $interval) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.$window = $window;\r\n this.scrollService = scrollService;\r\n this.$interval = $interval;\r\n this.selectedIndex = 0;\r\n this.menuToggled = false;\r\n this.currentTop = 0;\r\n this.previousTop = 0;\r\n this.isFixed = false;\r\n this.fixedYPosition = 0;\r\n this.yOffset = 0;\r\n this.elementHeight = 0;\r\n this.offsetValue = 0;\r\n this.paddingTop = 0;\r\n this.isAutoScrolling = false;\r\n this.selectAnchor = function (index) {\r\n _this.updateSelectedIndex(index);\r\n if (_this.menuToggled) {\r\n _this.menuToggled = false;\r\n }\r\n };\r\n this.gotoAnchor = function (anchor) {\r\n if (_this.menuItems[_this.selectedIndex]) {\r\n var target = _this.menuItems[_this.selectedIndex].offset;\r\n var targetValue = _this.yOffset + _this.offsetValue + 30;\r\n if (!TRPCONFIG.IsMobileDevice) {\r\n var signup = $('.cms-newsletter-sign-up');\r\n if (signup.length > 0) {\r\n targetValue += signup.outerHeight();\r\n }\r\n }\r\n if (target) {\r\n $('body,html').animate({ scrollTop: target - (targetValue) }, {\r\n duration: 'slow',\r\n start: function () { _this.isAutoScrolling = true; },\r\n done: function () { _this.isAutoScrolling = false; }\r\n });\r\n }\r\n }\r\n };\r\n this.toggle = function () {\r\n _this.menuToggled = !_this.menuToggled;\r\n };\r\n this.attachElements = function (value) {\r\n var stickyHeight = _this.$element.height();\r\n var totalHeight = stickyHeight;\r\n var signup = $('.cms-newsletter-sign-up');\r\n if (signup.length > 0) {\r\n totalHeight += signup.outerHeight();\r\n if (value) {\r\n signup.css({ top: _this.offsetValue + stickyHeight });\r\n signup.addClass('fixed');\r\n }\r\n else {\r\n signup.removeClass('fixed');\r\n }\r\n }\r\n var siblingSection = _this.$element.nextAll('section');\r\n if (siblingSection.length > 0 && siblingSection[0].tagName === 'SECTION') {\r\n var elem = $(siblingSection[0]);\r\n elem.css({ 'paddingTop': value ? totalHeight + 'px' : '0px' });\r\n }\r\n };\r\n this.fix = function () {\r\n _this.currentTop = _this.scrollService.getScrollOffsets(_this.$window).y;\r\n if (!_this.isFixed) {\r\n _this.fixedYPosition = _this.$element.offset().top;\r\n }\r\n if (_this.currentTop > _this.previousTop) {\r\n if (_this.currentTop >= _this.fixedYPosition - _this.offsetValue) {\r\n _this.$scope.$apply(function () {\r\n _this.isFixed = true;\r\n if (!TRPCONFIG.IsMobileDevice) {\r\n _this.attachElements(true);\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n if (_this.currentTop <= _this.fixedYPosition - _this.offsetValue) {\r\n _this.$scope.$apply(function () {\r\n _this.isFixed = false;\r\n if (!TRPCONFIG.IsMobileDevice) {\r\n _this.attachElements(false);\r\n }\r\n });\r\n }\r\n }\r\n var index = _this.findClosestTarget();\r\n if (index) {\r\n _this.updateSelectedIndex(index);\r\n }\r\n _this.previousTop = _this.currentTop;\r\n };\r\n var menuElement = $('#navbarcont');\r\n if (menuElement) {\r\n this.yOffset = menuElement.height();\r\n this.offsetValue = menuElement.outerHeight();\r\n }\r\n $(window).on('scroll.stickynav', (function () {\r\n _this.fix();\r\n }));\r\n this.fixedYPosition = this.$element.offset().top - this.offsetValue;\r\n this.paddingTop = parseInt(this.$element.next().css('paddingTop'), 10) || 0;\r\n this.titleHtml = \"<\" + this.headingType + \">\" + this.title + \"</\" + this.headingType + \">\";\r\n $scope.$on('$destroy', function () {\r\n $(window).off('scroll.stickynav');\r\n });\r\n }\r\n ;\r\n StickyNavBar.prototype.findClosestTarget = function () {\r\n if (this.isAutoScrolling) {\r\n return;\r\n }\r\n var index = 0;\r\n var height = this.$element.height();\r\n var headings = $('h1,h2,h3,h4,h5,h6');\r\n for (var i = 0; i < this.menuItems.length; i++) {\r\n var item = this.menuItems[i];\r\n if (item.offset) {\r\n var itemText = \":contains(\" + item.value + \")\";\r\n var domItem = headings.filter(itemText).first();\r\n if (domItem.length > 0) {\r\n item.offset = domItem.offset().top;\r\n if (this.currentTop + height > (item.offset - (this.yOffset + this.offsetValue + 30))) {\r\n index = i;\r\n }\r\n }\r\n }\r\n }\r\n return index;\r\n };\r\n StickyNavBar.prototype.updateSelectedIndex = function (index) {\r\n this.selectedIndex = index;\r\n };\r\n return StickyNavBar;\r\n }());\r\n angular\r\n .module('ekh')\r\n .directive('stickyNavBar', function ($document, $anchorScroll, $compile) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {},\r\n bindToController: {\r\n scrollOffsetElement: '@',\r\n contentElement: '@',\r\n menuOffsetElement: '@',\r\n title: '@',\r\n data: '@',\r\n headingType: '@'\r\n },\r\n controllerAs: 'cm',\r\n templateUrl: 'partials/home/directivetemplate?type=StickyNavBar',\r\n controller: StickyNavBar,\r\n link: function (scope, element, attrs, navBarCtrl, transcludeFn) {\r\n var items = [];\r\n var cloned = transcludeFn(scope, function (elements) {\r\n var count = 0;\r\n angular.forEach(elements, function (item) {\r\n if (item.nodeType !== 3) {\r\n var text = $.trim(item.textContent);\r\n items.push({ value: text });\r\n var gtmOptions = getGtmOptions(item);\r\n element\r\n .find('ul.sticky-navbar-menu-list')\r\n .append(createCloneElement(count, text, gtmOptions));\r\n element\r\n .find('ul.sticky-navbar-touch-menu-list')\r\n .append(createCloneElement(count, text, gtmOptions));\r\n count++;\r\n }\r\n });\r\n });\r\n function createCloneElement(count, text, gtmOptions) {\r\n if (gtmOptions === void 0) { gtmOptions = {}; }\r\n var eventTrackerDirective = '';\r\n if (Object.keys(gtmOptions).length) {\r\n eventTrackerDirective = \"\\n event-tracker\\n event-category=\\\"\" + gtmOptions.category + \"\\\" \\n event-action=\\\"\" + gtmOptions.action + \"\\\" \\n event-label=\\\"\" + gtmOptions.label + \"\\\" \\n \";\r\n }\r\n return $compile(\"<li ng-class=\\\"{ selected : cm.selectedIndex == \" + count + \"}\\\">\\n <a sticky-nav-bar-item title=\\\"\" + text + \"\\\" \\n target=\\\"\" + text.replace(/\\s/g, '').toLowerCase() + \"\\\" \\n index=\\\"\" + count + \"\\\"\\n \" + eventTrackerDirective + \"\\n >\\n </a>\\n </li>\")(scope, undefined, {\r\n transcludeControllers: {\r\n stickyNavBar: {\r\n instance: StickyNavBar\r\n }\r\n }\r\n });\r\n }\r\n var targets = document.querySelectorAll('h1,h2,h3,h4,h5,h6');\r\n angular.forEach(items, function (item) {\r\n var domTarget = _.filter(targets, function (target) {\r\n return item.value === target.textContent;\r\n });\r\n if (domTarget.length) {\r\n item.offset = $(domTarget).offset().top;\r\n }\r\n });\r\n //for each h1 , if text matches store top value for link to click on\r\n navBarCtrl.menuItems = items;\r\n function getGtmOptions(element) {\r\n element = $(element).find('[event-tracker]');\r\n if (element.length) {\r\n return {\r\n category: element.attr('event-category'),\r\n action: element.attr('event-action'),\r\n label: element.attr('event-label')\r\n };\r\n }\r\n return {};\r\n }\r\n }\r\n };\r\n });\r\n var StickyNavBarItem = /** @class */ (function () {\r\n function StickyNavBarItem($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.selectAnchor = function () {\r\n _this.$scope.$parent.cm.selectAnchor(_this.index);\r\n _this.$scope.$parent.cm.gotoAnchor(_this.target);\r\n };\r\n }\r\n return StickyNavBarItem;\r\n }());\r\n angular.module('ekh')\r\n .directive('stickyNavBarItem', function () {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n require: 'stickyNavBar',\r\n scope: {},\r\n bindToController: {\r\n title: '@',\r\n index: '@',\r\n target: '@'\r\n },\r\n controller: StickyNavBarItem,\r\n controllerAs: 'snbi',\r\n template: '<a ng-click=\"snbi.selectAnchor()\"><span>{{ snbi.title }}</span></a>'\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n;\r\nvar ekh;\r\n(function (ekh) {\r\n var ValidateCardType = /** @class */ (function () {\r\n function ValidateCardType($scope, paymentsService, $q) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.paymentsService = paymentsService;\r\n this.$q = $q;\r\n $scope.$watchGroup(['validateCtrl.cardType', 'validateCtrl.maskModel'], function (_a) {\r\n var valCardType = _a[0], maskModel = _a[1];\r\n if (!_this.paymentForm || !_this.paymentForm.cardNumber) {\r\n return false;\r\n }\r\n if (!valCardType && _this.cardNumber) {\r\n _this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\r\n return false;\r\n }\r\n if (maskModel) {\r\n _this.paymentsService.checkCardNumber(_this.paymentOptions, maskModel, valCardType)\r\n .then(function (cardNumber) {\r\n if (!cardNumber) {\r\n _this.cardType = null;\r\n return $q.reject();\r\n }\r\n })\r\n .then(function () {\r\n $scope.ngModelCardNumberCtrl.$setViewValue(maskModel);\r\n _this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', true);\r\n })\r\n .catch(function () {\r\n $scope.ngModelCardNumberCtrl.$setViewValue(undefined);\r\n _this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\r\n });\r\n }\r\n else {\r\n $scope.ngModelCardNumberCtrl.$setViewValue(undefined);\r\n _this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\r\n }\r\n });\r\n }\r\n return ValidateCardType;\r\n }());\r\n angular.module('ekh')\r\n .directive('validateCardType', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n controllerAs: 'validateCtrl',\r\n bindToController: {\r\n paymentForm: '=',\r\n cardNumber: '=ngModel',\r\n paymentOptions: '=',\r\n maskModel: '=',\r\n cardType: '='\r\n },\r\n controller: ValidateCardType,\r\n template: '',\r\n link: function ($scope, $element, $attrs, ngModelCtrl) {\r\n $scope.ngModelCardNumberCtrl = ngModelCtrl;\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n;\r\nvar ekh;\r\n(function (ekh) {\r\n var ValidateCvvTokenErrors = /** @class */ (function () {\r\n function ValidateCvvTokenErrors($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n $scope.$watch('validateCvvCtrl.tokenErrors', function (tokenErrors) {\r\n if (!_this.paymentForm || !_this.paymentForm.securityCode) {\r\n return false;\r\n }\r\n if (!tokenErrors || !Object.keys(tokenErrors).length) {\r\n $scope.ngModelCvvCtrl.$setViewValue('***');\r\n _this.paymentForm.securityCode.$setValidity('validCvvCode', true);\r\n }\r\n else {\r\n $scope.ngModelCvvCtrl.$setViewValue();\r\n _this.paymentForm.securityCode.$setValidity('validCvvCode', false);\r\n }\r\n });\r\n }\r\n return ValidateCvvTokenErrors;\r\n }());\r\n angular.module('ekh')\r\n .directive('validateCvvTokenErrors', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n controllerAs: 'validateCvvCtrl',\r\n bindToController: {\r\n tokenErrors: '=',\r\n paymentForm: '='\r\n },\r\n controller: ValidateCvvTokenErrors,\r\n template: '',\r\n link: function ($scope, $element, $attrs, ngModelCtrl) {\r\n $scope.ngModelCvvCtrl = ngModelCtrl;\r\n }\r\n };\r\n });\r\n})(ekh || (ekh = {}));\r\n;\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('ekh')\r\n .service('cmsPageMapping', cmsPageMapping);\r\n function cmsPageMapping(destinationService) {\r\n function filterPages(filterType) {\r\n return destinationService.getTiles({ ControlId: 222 })\r\n .then(function (tiles) { return _.filter(tiles[0], function (tile) {\r\n if (tile.pagetype === filterType) {\r\n return {\r\n Name: tile.name,\r\n ControlId: tile.controlid,\r\n LinkUrl: tile.linkurl\r\n };\r\n }\r\n }); });\r\n }\r\n return {\r\n getDestinations: function () { return filterPages('destination'); },\r\n getHomePage: function () { return filterPages('homepage'); },\r\n getOfferTypes: function () { return filterPages('offer'); },\r\n getSingleOffers: function () { return filterPages('singleoffer'); }\r\n };\r\n }\r\n})();\r\nvar Insurance;\r\n(function (Insurance) {\r\n var InsuranceResults = /** @class */ (function () {\r\n function InsuranceResults($location, resourceService, $scope, tripService, $routeParams, insuranceService, broker, basketService, $q, analytics) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.resourceService = resourceService;\r\n this.$scope = $scope;\r\n this.tripService = tripService;\r\n this.$routeParams = $routeParams;\r\n this.insuranceService = insuranceService;\r\n this.broker = broker;\r\n this.basketService = basketService;\r\n this.$q = $q;\r\n this.analytics = analytics;\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGINSURANCE'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-insuranceSearchCtrl'\r\n });\r\n analytics.track('mixpanel', 'TransferPage');\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n var insuranceReq = trip && trip.InsuranceRequest;\r\n if (insuranceReq) {\r\n var searchId_1 = insuranceReq.AvailabilitySearchId;\r\n _this.$q.all([\r\n insuranceService.getSearchResults(searchId_1, trip.TripId),\r\n tripService.getInsuranceRequestSummary($routeParams.tripId)\r\n ]).then(function (results) {\r\n _this.insuranceQuotes = results[0];\r\n _this.summary = results[1];\r\n _this.typeSummary = _this.summary && _this.summary.Destination && _this.summary.PolicyType ?\r\n _this.summary.PolicyType.Name + ' - '\r\n + _this.summary.Destination.Name + ' - ' : '';\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n });\r\n _this.selectPolicy = function (policy) {\r\n var data = {\r\n Title: policy.QuoteType.Type,\r\n CostTotal: policy.Price,\r\n TotalOptions: this.insuranceQuotes.length,\r\n SupplierName: policy.SupplierName\r\n };\r\n analytics.track('mixpanel', 'OptionsInsuranceSelected', data);\r\n basketService.selectInsurance(policy, searchId_1, trip.BasketId, trip.TripId);\r\n this.selectedInsurance = policy;\r\n };\r\n _this.documentPaths = insuranceService.getDocumentPaths();\r\n }\r\n });\r\n }\r\n return InsuranceResults;\r\n }());\r\n angular.module('insurance')\r\n .controller('InsuranceResults', InsuranceResults);\r\n})(Insurance || (Insurance = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('insurance')\r\n .service('insuranceService', insuranceService);\r\n function insuranceService($http, $browser, tripService, $filter, resourceService, analytics, searchUnitService, occupancyService, $q, insuranceSearchValidator, broker, $cacheFactory, loggingService) {\r\n var domain = TRPCONFIG.Domain;\r\n var service = {\r\n getInsuranceQuotes: getInsuranceQuotes,\r\n getInsuranceQuotesFromSession: getInsuranceQuotesFromSession,\r\n getDocumentPaths: getDocumentPaths,\r\n passengerInsuranceBand: passengerInsuranceBand,\r\n composeOptionId: composeOptionId,\r\n decomposeOptionId: decomposeOptionId,\r\n clearSearchResults: clearSearchResults,\r\n validateSearchCriteria: validateSearchCriteria,\r\n search: search,\r\n getSearchResults: getSearchResults,\r\n getInsuranceDetails: getInsuranceDetails,\r\n rehydrate: rehydrate,\r\n isVatMessageInclusive: isVatMessageInclusive\r\n };\r\n var results;\r\n var inProgress;\r\n var url = '/api2/insurance/availability/';\r\n var detailsUrl = '/api2/insurance/details/';\r\n var timeout;\r\n var promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n function _doRequest(r, tripId, newSearch) {\r\n return newSearch ?\r\n getInsuranceQuotes(tripId, r) :\r\n getInsuranceQuotesFromSession(r.AvailabilitySearchId);\r\n }\r\n function passengerInsuranceBand(insuranceBands, bandId, costOnly) {\r\n if (!bandId) {\r\n return costOnly ?\r\n '-'\r\n : String.format('{0} ({1}: -)', resourceService.get('INSURANCENOTREQUIRED'), resourceService.get('INSURANCECOST'));\r\n }\r\n var option = _.find(insuranceBands, { Id: bandId });\r\n var priceString = $filter('customCurrency')(option.Price);\r\n if (!option.Available) {\r\n priceString = resourceService.get('INSURANCECOSTNA');\r\n }\r\n return costOnly ?\r\n priceString\r\n : String.format('{0} ({1}: {2})', option.Label, resourceService.get('INSURANCECOST'), priceString);\r\n }\r\n function validateSearchCriteria() {\r\n return insuranceSearchValidator.validate(searchUnitService.getPolicyType(), searchUnitService.getTravelDestination(), searchUnitService.startDate(searchUnitService.insurance), searchUnitService.endDate(searchUnitService.insurance), occupancyService.reduceOccupancy());\r\n }\r\n function search(args) {\r\n if (inProgress != null && !args.newSearch) {\r\n return inProgress;\r\n }\r\n var tripId = args.tripId;\r\n var request = {\r\n AvailabilitySearchId: args.searchId,\r\n TripId: tripId\r\n };\r\n if (args.newSearch) {\r\n //request for standalone insurance search\r\n request.SearchType = 1;\r\n request.TripType = searchUnitService.getPolicyType();\r\n request.TravelDestination = searchUnitService.getTravelDestination();\r\n request.StartDate = searchUnitService.startDate(searchUnitService.insurance);\r\n request.EndDate = searchUnitService.endDate(searchUnitService.insurance);\r\n request.PolicyExtras = searchUnitService.getPolicyExtra();\r\n }\r\n inProgress = tripService.getTripReducedOccupancy(tripId).then(function (o) {\r\n o = o || occupancyService.reduceOccupancy();\r\n var ages = _.concat(o.AdultAges ? o.AdultAges : _.times(o.Adults, function () { return 21; }), o.ChildAges);\r\n request.Ages = ages;\r\n return _doRequest(request, tripId, args.newSearch).then(function (res) {\r\n inProgress = null;\r\n results = res;\r\n return results;\r\n }, function () {\r\n inProgress = null;\r\n results = null;\r\n });\r\n });\r\n return inProgress;\r\n }\r\n function getInsuranceQuotes(tripId, request) {\r\n var req = angular.extend({\r\n DomainId: domain.DomainId,\r\n Currency: domain.CurrencyCode,\r\n CultureCode: domain.CultureCode\r\n }, request);\r\n tripService.recordInsuranceSearch(tripId, request);\r\n analytics.startTimer('InsuranceAvailabilityRequest');\r\n return $http.post(url + \"get\", req, { ignoreErrors: true }).then(function (res) {\r\n analytics.endTimer('InsuranceAvailabilityRequest');\r\n return enrichData(res.data.Quotes);\r\n });\r\n }\r\n function getInsuranceQuotesFromSession(availabilitySearchId) {\r\n return $http.post(url + \"getfromsession\", {\r\n AvailabilitySearchId: availabilitySearchId\r\n }, { ignoreErrors: true }).then(function (res) {\r\n return enrichData(res.data.Quotes);\r\n });\r\n }\r\n function getDocumentPaths() {\r\n //these paths should probably be coming back from the service call really and\r\n //the docs be served from the service ideally.\r\n var baseRoute = $browser.baseHref() + \"build/docs/BookingConditions/\";\r\n return {\r\n PolicyWording: \"\" + baseRoute + TRPCONFIG.Domain.InsurancePolicyWordingDoc,\r\n SilverPolicyWording: \"\" + baseRoute + TRPCONFIG.Domain2.InsuranceSilverPolicyWordingDoc,\r\n Disclosure: \"\" + baseRoute + TRPCONFIG.Domain.StatusDisclosureDoc,\r\n PolicySummary: \"\" + baseRoute + TRPCONFIG.Domain.InsuranceKeyFactsDoc,\r\n InsuranceProductInformation: TRPCONFIG.Domain.InsuranceProductInformation ?\r\n \"\" + baseRoute + TRPCONFIG.Domain.InsuranceProductInformation : '',\r\n };\r\n }\r\n function enrichData(quotes) {\r\n if (TRPCONFIG.Domain.InsurancePerPersonPricing === false) {\r\n return quotes;\r\n }\r\n angular.forEach(quotes, function (quote) {\r\n quote.PerPersonPrice = quote.Price / (quote.AdultCount + quote.ChildCount + quote.InfantCount);\r\n });\r\n return quotes;\r\n }\r\n function composeOptionId(schemeId, typeId, supplierId) {\r\n return schemeId + \"|\" + typeId + \"|\" + supplierId;\r\n }\r\n function decomposeOptionId(id) {\r\n //takes a key like 1|1|208 and returns a correctly set object\r\n var parts = id.split('|');\r\n var obj = {\r\n schemeId: parseInt(parts[0]),\r\n typeId: parseInt(parts[1]),\r\n supplierId: parseInt(parts[2])\r\n };\r\n if (parts[3]) {\r\n obj.relationshipId = parseInt(parts[3]);\r\n }\r\n else {\r\n loggingService.logWarn(\"RelationshipId - insurance.service.js, decomposeOptionId() warn \" + id);\r\n }\r\n return obj;\r\n }\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n function getSearchResults(searchId, tripId) {\r\n if (results && results !== 'null') {\r\n return $q.when(_.cloneDeep(results));\r\n }\r\n return search({ searchId: searchId, tripId: tripId });\r\n }\r\n function getInsuranceDetails(params) {\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n timeout = $q.defer();\r\n return $http.get(detailsUrl + \"get\", {\r\n timeout: timeout.promise,\r\n params: {\r\n availabilityId: params.AvailabilityId,\r\n schemeId: params.SchemeId,\r\n tripTypeId: params.TripTypeId,\r\n supplierId: params.SupplierId,\r\n destinationId: params.DestinationId,\r\n relationshipId: params.RelationshipId\r\n },\r\n customErrCallback: function (args) {\r\n if (args.status) {\r\n broker.publish('insuranceRequestFailed');\r\n }\r\n return true;\r\n }\r\n }).then(function (res) {\r\n promiseCache.remove(res.data.DetailSearchId);\r\n timeout = null;\r\n return res.data;\r\n });\r\n }\r\n function rehydrate(id) {\r\n if (!promiseCache.get(id)) {\r\n promiseCache.put(id, $http.post(detailsUrl + \"getfromsession?detailSearchId=\" + id, { ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n }));\r\n }\r\n return promiseCache.get(id);\r\n }\r\n function isVatMessageInclusive(insuranceQuotes, isMultiple) {\r\n if (!isMultiple && (insuranceQuotes && insuranceQuotes.length === 1)) {\r\n return true;\r\n }\r\n else if (isMultiple && (insuranceQuotes && insuranceQuotes.length > 1)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar liveChatModule;\r\n(function (liveChatModule) {\r\n var LiveChat = /** @class */ (function () {\r\n function LiveChat(liveChatService, $timeout) {\r\n var _this = this;\r\n this.liveChatService = liveChatService;\r\n this.$timeout = $timeout;\r\n this.showThanks = false;\r\n this.startChat = function () {\r\n if (TRPCONFIG.Domain.LiveChat.Ready) {\r\n _this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ButtonCode);\r\n }\r\n };\r\n this.rejectChat = function () {\r\n if (TRPCONFIG.Domain.LiveChat.Ready) {\r\n _this.liveChatService.rejectChat(TRPCONFIG.Domain.LiveChat.ButtonCode);\r\n }\r\n };\r\n this.closeThanks = function () {\r\n _this.$timeout(function () {\r\n _this.showThanks = false;\r\n }, 1000);\r\n };\r\n this.showThanks = false;\r\n }\r\n return LiveChat;\r\n }());\r\n angular\r\n .module('liveChatModule')\r\n .directive('liveChat', function () {\r\n return {\r\n scope: {},\r\n replace: true,\r\n bindToController: {},\r\n controller: LiveChat,\r\n controllerAs: 'lc',\r\n templateUrl: \"partials/home/liveChat\"\r\n };\r\n });\r\n})(liveChatModule || (liveChatModule = {}));\r\nvar liveChatModule;\r\n(function (liveChatModule) {\r\n var LiveChatButton = /** @class */ (function () {\r\n function LiveChatButton(liveChatService) {\r\n var _this = this;\r\n this.liveChatService = liveChatService;\r\n this.showThanks = false;\r\n this.startChat = function () {\r\n if (TRPCONFIG.Domain.LiveChat.Ready) {\r\n _this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ReactiveButtonCode);\r\n }\r\n };\r\n this.startOfflineChat = function () {\r\n if (TRPCONFIG.Domain.LiveChat.Ready) {\r\n _this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ReactiveOfflineButtonCode);\r\n }\r\n };\r\n this.liveChatService.addReactiveButton();\r\n }\r\n return LiveChatButton;\r\n }());\r\n angular\r\n .module('liveChatModule')\r\n .directive('liveChatButton', function () {\r\n return {\r\n scope: {},\r\n replace: true,\r\n bindToController: {},\r\n controller: LiveChatButton,\r\n controllerAs: 'lcb',\r\n templateUrl: \"partials/home/liveChatButton\"\r\n };\r\n });\r\n})(liveChatModule || (liveChatModule = {}));\r\nvar liveChatModule;\r\n(function (liveChatModule) {\r\n var LiveChatService = /** @class */ (function () {\r\n function LiveChatService(loaderService, $rootScope) {\r\n this.loaderService = loaderService;\r\n this.$rootScope = $rootScope;\r\n this.scriptUrl = TRPCONFIG.Domain.LiveChat.Script;\r\n this.liveUrl = TRPCONFIG.Domain.LiveChat.ChatLocation;\r\n window['_laq'] = window['_laq'] || [];\r\n }\r\n LiveChatService.prototype.initialise = function () {\r\n var _this = this;\r\n if (typeof this.interval === 'undefined') {\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | Loading script: \" + this.scriptUrl);\r\n }\r\n this.loaderService.loadJS(window.document, 'script', 'liveChat', this.scriptUrl, true);\r\n this.interval = setInterval(function () {\r\n if (typeof window['liveagent'] !== 'undefined') {\r\n var liveChatConfig = TRPCONFIG.Domain.LiveChat;\r\n var apiKey = liveChatConfig.ApiKey;\r\n var code = liveChatConfig.Code;\r\n var site = liveChatConfig.Site;\r\n var popupWidth = liveChatConfig.Sizes.Width;\r\n var popupHeight = liveChatConfig.Sizes.Height;\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.addCustomDetail('Site Name', \" +\r\n (\"'\" + TRPCONFIG.Domain.LiveChat.Site + \"').saveToTranscript('SiteName__c');\"));\r\n }\r\n window['liveagent'].addCustomDetail('Site Name', site).saveToTranscript('SiteName__c');\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.setChatWindowWidth(\" + popupWidth + \");\");\r\n console.log(\"LIVECHAT | liveagent.setChatWindowHeight(\" + popupHeight + \");\");\r\n }\r\n window['liveagent'].setChatWindowWidth(popupWidth);\r\n window['liveagent'].setChatWindowHeight(popupHeight);\r\n //add current page\r\n _this.newPage();\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.init('\" + _this.liveUrl + \"', '\" + code + \"', '\" + apiKey + \"');\");\r\n }\r\n window['liveagent'].init(_this.liveUrl, code, apiKey);\r\n _this.routeChange = _this.$rootScope.$on('$routeChangeSuccess', function () { return _this.reinit(); });\r\n clearInterval(_this.interval);\r\n TRPCONFIG.Domain.LiveChat.Ready = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n LiveChatService.prototype.reinit = function () {\r\n this.routeChange();\r\n this.disconnect();\r\n TRPCONFIG.Domain.LiveChat.Ready = false;\r\n delete this.interval;\r\n delete window['liveagent'];\r\n delete window['liveAgentDeployment'];\r\n this.initialise();\r\n };\r\n LiveChatService.prototype.disconnect = function () {\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.disconnect();\");\r\n }\r\n window['liveagent'].disconnect();\r\n };\r\n LiveChatService.prototype.newPage = function () {\r\n var currUrl = document.location.href;\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.addCustomDetail('Current URL', '\" + currUrl + \"')\" +\r\n \".saveToTranscript('Current_URL__c')\");\r\n }\r\n window['liveagent'].addCustomDetail('Current URL', currUrl).saveToTranscript('Current_URL__c');\r\n };\r\n LiveChatService.prototype.startChat = function (code) {\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.startChat('\" + code + \"')\");\r\n }\r\n window['liveagent'].startChat(code);\r\n };\r\n LiveChatService.prototype.rejectChat = function (code) {\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.rejectChat('\" + code + \"')\");\r\n }\r\n window['liveagent'].rejectChat(code);\r\n };\r\n LiveChatService.prototype.addReactiveButton = function () {\r\n window['_laq'].push(function () {\r\n var reactiveCode = TRPCONFIG.Domain.LiveChat.ReactiveButtonCode;\r\n var reactiveOfflineCode = TRPCONFIG.Domain.LiveChat.ReactiveOfflineButtonCode;\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.showWhenOnline('\" + reactiveCode + \"', \" +\r\n (\"document.getElementById('liveagent_button_online_\" + reactiveCode + \"'))\"));\r\n }\r\n window['liveagent'].showWhenOnline(reactiveCode, document.getElementById(\"liveagent_button_online_\" + reactiveCode));\r\n if (TRPCONFIG.Domain.LiveChat.ShowButtonWhenOffline) {\r\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\r\n console.log(\"LIVECHAT | liveagent.showWhenOffline('\" + reactiveCode + \"', \" +\r\n (\"document.getElementById('liveagent_button_offline_\" + reactiveOfflineCode + \"'))\"));\r\n console.log(\"LIVECHAT | liveagent.showWhenOnline('\" + reactiveOfflineCode + \"', \" +\r\n (\"document.getElementById('liveagent_button_online_\" + reactiveOfflineCode + \"'))\"));\r\n }\r\n window['liveagent'].showWhenOffline(reactiveCode, document.getElementById(\"liveagent_button_offline_\" + reactiveOfflineCode));\r\n window['liveagent'].showWhenOnline(reactiveOfflineCode, document.getElementById(\"liveagent_button_online_\" + reactiveOfflineCode));\r\n }\r\n });\r\n };\r\n return LiveChatService;\r\n }());\r\n liveChatModule.LiveChatService = LiveChatService;\r\n angular\r\n .module('liveChatModule')\r\n .service('liveChatService', LiveChatService);\r\n})(liveChatModule || (liveChatModule = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .controller('Parking', Parking);\r\n function Parking($filter, $routeParams, $scope, arrayUtil, basketService, basketStore, broker, extraProductsService, parkingDetailsService, scrollService, tripService, flightsTerminalService) {\r\n var ap = this;\r\n ap.noneParking = '-1';\r\n ap.currentParkingLimit = ap.parkingLimit = 5;\r\n ap.parkingAvailabilityBusy = true;\r\n broker.subscribe('Parking', 'parkingRequestFailed', function () {\r\n ap.showDetailsError = true;\r\n ap.parking = angular.copy(ap.noneParking);\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('Parking');\r\n });\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n var basketId = trip.BasketId;\r\n var tripId = trip.TripId;\r\n var parkingSearchId = trip.ParkingRequest ? trip.ParkingRequest.AvailabilitySearchId : null;\r\n var onewayonly = trip.FlightsRequest.OneWayOnly;\r\n basketStore.parking(basketId, $routeParams.productId).then(function (results) {\r\n var parking = results ? results.Details.AirportParkingQuoteId : null;\r\n if (parking) {\r\n ap.parking = angular.copy(parking);\r\n }\r\n else if (TRPCONFIG.Domain.DefaultAirportParkingSelection) {\r\n ap.parking = ap.noneParking;\r\n }\r\n if (TRPCONFIG.Domain.AirportParkingEnabled && !onewayonly) {\r\n basketService.getParkingQuotes(parkingSearchId, basketId, tripId).then(function (parkingQuotes) {\r\n var setResults = function (results) {\r\n ap.parkingQuotes = results;\r\n _updateSubtitle();\r\n ap.parkingAvailabilityBusy = false;\r\n $scope.$watch('ap.parking', function (val) {\r\n if (val == null) {\r\n return;\r\n }\r\n _updateSubtitle();\r\n if (TRPCONFIG.Domain.EnforceParkingOptionSelection && results.length > 0) {\r\n $scope.$emit('sendParkingSelection', val);\r\n }\r\n else {\r\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\r\n }\r\n if (val !== ap.noneParking) {\r\n var quote_1 = arrayUtil.first(ap.parkingQuotes, function (q) {\r\n return angular.equals(q.QuoteId, val);\r\n });\r\n if (quote_1) {\r\n quote_1.parkingBusy = !quote_1.Details;\r\n ap.showDetailsError = false;\r\n tripService.getTrip(tripId).then(function (t) {\r\n parkingSearchId = t.ParkingRequest.AvailabilitySearchId;\r\n basketService.selectParking(val, parkingSearchId, basketId).then(function (d) {\r\n ap.showDetailsError = false;\r\n quote_1.Details = d.Details;\r\n quote_1.parkingBusy = false;\r\n quote_1.viewDetails = true;\r\n basketService.updateBasket();\r\n }, function () {\r\n quote_1.parkingBusy = false;\r\n quote_1.showDetailsError = true;\r\n });\r\n });\r\n }\r\n else {\r\n ap.parking = ap.noneParking;\r\n }\r\n }\r\n else {\r\n basketStore.removeParking(basketId).then(basketService.updateBasket);\r\n }\r\n }, true);\r\n };\r\n if (parkingQuotes && parkingQuotes.length) {\r\n parkingQuotes = arrayUtil.sort(parkingQuotes, 'Price');\r\n setResults(parkingQuotes);\r\n }\r\n else {\r\n ap.parkingAvailabilityBusy = false;\r\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\r\n }\r\n }, function () {\r\n ap.parkingAvailabilityBusy = false;\r\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\r\n });\r\n }\r\n }).then(null, basketService.restartHolidayWorkflow);\r\n // get flight departure terminal\r\n basketStore.flight(trip.BasketId).then(function (flight) {\r\n var leg = flight.Details.Itinerary.Legs[0];\r\n flightsTerminalService.getTerminalForFlight(leg.DepartureAirport.Code, leg.Segments[0].FlightNumber, leg.DepartureDate)\r\n .then(function (terminal) {\r\n if (terminal) {\r\n ap.terminal = terminal;\r\n }\r\n });\r\n });\r\n ap.appendDetails = function (quote, $event) {\r\n if ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n tripService.getTrip(tripId).then(function (trip) { return parkingDetailsService.appendDetails(quote, angular.copy(trip)); }).then(function () { ap.currentInfo = quote; });\r\n };\r\n ap.showMoreOrLess = function () {\r\n var moreParkingQuotes = ap.currentParkingLimit !== ap.parkingQuotes.length;\r\n var currentParkingLimit = moreParkingQuotes ? ap.parkingQuotes.length : 5;\r\n if (!moreParkingQuotes) {\r\n scrollService.scrollTo('#parking-product-expander', { animate: true, offset: 70 }).then(function () {\r\n ap.moreParkingQuotes = false;\r\n ap.currentParkingLimit = currentParkingLimit;\r\n });\r\n }\r\n else {\r\n ap.moreParkingQuotes = true;\r\n ap.currentParkingLimit = currentParkingLimit;\r\n }\r\n };\r\n ap.filterQuotes = extraProductsService.filterQuotes;\r\n function _updateSubtitle() {\r\n if (ap.parkingQuotes && ap.parking) {\r\n var parkingQuote = arrayUtil.first(ap.parkingQuotes, function (p) {\r\n return angular.equals(p.QuoteId, ap.parking);\r\n });\r\n ap.parkingQuoteDescription = parkingQuote ? parkingQuote.CarPark + \" (\" + $filter('customCurrency')(parkingQuote.Price) + \")\" : null;\r\n }\r\n }\r\n }, basketService.bookingAlreadyDone(\"parking: '\" + $routeParams.tripId + \"'\"));\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .controller('ParkingResults', ParkingResults);\r\n function ParkingResults($scope, parkingService, parkingDetailsService, $location, broker, tripService, $routeParams, basketService) {\r\n var cm = this;\r\n var tripId = $routeParams.tripId;\r\n cm.appendDetails = appendDetails;\r\n tripService.getTrip(tripId).then(function (trip) {\r\n var parkingRq = trip && trip.ParkingRequest;\r\n if (parkingRq) {\r\n parkingService.getSearchResults(tripId)\r\n .then(function (data) {\r\n cm.parkingQuotes = data;\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }, function () { return $location.path('parking'); })\r\n .then(function () { return tripService.getParkingRequestSummary(tripId); })\r\n .then(function (summary) { return cm.summary = summary; });\r\n cm.selectParking = function (parking) {\r\n basketService.selectParking(parking.QuoteId, parkingRq.AvailabilitySearchId, trip.BasketId, tripId);\r\n cm.selectedParking = parking.QuoteId;\r\n };\r\n }\r\n });\r\n function appendDetails(quote) {\r\n tripService.getTrip(tripId).then(function (trip) { return parkingDetailsService.appendDetails(quote, angular.copy(trip)); });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .controller('ParkingSearchUnit', Parking);\r\n function Parking(searchUnitService, dateUtil, $window, $scope, resourceService, broker, basketService, $timeout) {\r\n var cm = this;\r\n var mode = searchUnitService.parking;\r\n $timeout(function () {\r\n var selectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\r\n if (selectedDepartureAirport && selectedDepartureAirport.Code && selectedDepartureAirport.Code.indexOf(',') > -1) {\r\n searchUnitService.clearDepartureAirports();\r\n }\r\n cm.summary = searchUnitService.getSummary(mode);\r\n });\r\n var minimumDate = dateUtil.todayPlus(1, 0, true);\r\n var minimumDatePlusOne = dateUtil.addDays(minimumDate, 1, true) || dateUtil.todayPlus(1, 0, true);\r\n var initStartPlusOne;\r\n cm.setStartDate = setStartDate;\r\n cm.setEndDate = setEndDate;\r\n cm.search = search;\r\n cm.startDate = searchUnitService.startDate(mode);\r\n cm.endDate = searchUnitService.endDate(mode);\r\n if (cm.startDate) {\r\n initStartPlusOne = dateUtil.addDays(cm.startDate, 1, true);\r\n }\r\n cm.minDates = {\r\n minimumDate: minimumDate,\r\n startPlusOne: initStartPlusOne || minimumDatePlusOne\r\n };\r\n function setStartDate(date, back) {\r\n if (date) {\r\n cm.minDates.startPlusOne = dateUtil.addDays(date, 1, true);\r\n }\r\n searchUnitService.startDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n if (back) {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n function setEndDate(date, back) {\r\n searchUnitService.endDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.showEndCalendar = false;\r\n if (back) {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n var flow = basketService.parkingBooking;\r\n /*Can be moved to a directive*/\r\n function search() {\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGPARKING'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-parkingSearchUnit'\r\n });\r\n basketService.startWorkflow(flow).then(null, function (errors) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n $scope.$emit('flash:error', errors);\r\n });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .service('parkingService', parkingService);\r\n function parkingService($http, $q, analytics, dateUtil, guidService, occupancyService, parkingSearchValidator, searchUnitService, tripService, loggingService) {\r\n var domain = TRPCONFIG.Domain;\r\n var service = {\r\n getParkingQuotes: getParkingQuotes,\r\n getParkingQuotesFromSession: getParkingQuotesFromSession,\r\n validateSearchCriteria: validateSearchCriteria,\r\n clearSearchResults: clearSearchResults,\r\n getSearchResults: getSearchResults\r\n };\r\n var results;\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n function getSearchResults(tripId) {\r\n if (results && results !== 'null') {\r\n return $q.when(results);\r\n }\r\n return getParkingQuotes(tripId);\r\n }\r\n function getParkingQuotes(tripId, request) {\r\n if (request === void 0) { request = _buildStandaloneParkingRequest(); }\r\n // `request` argument supplied in holiday mode i.e. basketService.getParkingQuotes()\r\n // Availability request format\r\n var availabilityReq = angular.extend({\r\n DomainId: domain.DomainId,\r\n CultureCode: domain.CultureCode\r\n }, request);\r\n // Trip service format\r\n var tripServiceReq = angular.extend({\r\n Airport: searchUnitService.getSelectedDepartureAirport()\r\n }, request);\r\n delete tripServiceReq.AirportCode;\r\n tripService.recordParkingSearch(tripId, tripServiceReq);\r\n analytics.startTimer('ParkingAvailabilityRequest');\r\n return $http.post('/api2/airportparking/availability/get', availabilityReq, { ignoreErrors: true })\r\n .then(function (res) {\r\n if (res.data.CarParkingQuotes.length === 0) {\r\n loggingService.logError(\"No airport parking information found for \" + tripId + \", fn.getParkingQuotes\");\r\n }\r\n analytics.endTimer('ParkingAvailabilityRequest');\r\n return _enrichData(res.data.CarParkingQuotes, availabilityReq.DepartureDate, availabilityReq.ReturnDate);\r\n }, function () {\r\n return null;\r\n });\r\n }\r\n function getParkingQuotesFromSession(availabilitySearchId, availabilityRequest) {\r\n return $http.post('/api2/airportparking/availability/getfromsession', { AvailabilitySearchId: availabilitySearchId }, { ignoreErrors: true }).then(function (results) {\r\n if (results.data.CarParkingQuotes.length === 0) {\r\n loggingService.logError(\"No airport parking information found for \" + availabilitySearchId + \", fn.getParkingQuotesFromSession\");\r\n }\r\n return _enrichData(results.data.CarParkingQuotes, availabilityRequest.DepartureDate, availabilityRequest.ReturnDate);\r\n }, function () {\r\n return null;\r\n });\r\n }\r\n function validateSearchCriteria() {\r\n return parkingSearchValidator.validate(searchUnitService.getSelectedDepartureAirport(), searchUnitService.startDate(searchUnitService.parking), searchUnitService.endDate(searchUnitService.parking));\r\n }\r\n function _buildStandaloneParkingRequest() {\r\n var departureAirport = searchUnitService.getSelectedDepartureAirport();\r\n return {\r\n AvailabilitySearchId: guidService.uuid(),\r\n DepartureDate: searchUnitService.startDate(searchUnitService.parking),\r\n ReturnDate: searchUnitService.endDate(searchUnitService.parking),\r\n AirportCode: departureAirport && departureAirport.Code,\r\n PassengerCount: occupancyService.getPassengerCount()\r\n };\r\n }\r\n function _enrichData(parkings, fromDate, toDate) {\r\n var days = dateUtil.getDifferenceInDays(dateUtil.parseDate(fromDate), dateUtil.parseDate(toDate));\r\n angular.forEach(parkings, function (parking) {\r\n parking.PerDayPrice = parking.Price / days;\r\n });\r\n return parkings;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .service('parkingDetailsService', parkingDetailsService);\r\n function parkingDetailsService($http, $cacheFactory, $q, broker) {\r\n var url = '/api2/airportparking/details/';\r\n var timeout;\r\n var promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n var service = {\r\n getParkingDetails: getParkingDetails,\r\n appendDetails: appendDetails,\r\n rehydrate: rehydrate\r\n };\r\n function getParkingDetails(quote) {\r\n if (quote.AirportParkingQuoteId.Details) {\r\n return $q.when(quote.AirportParkingQuoteId.Details);\r\n }\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n var request = {\r\n AvailabilitySearchId: quote.AvailabilitySearchId,\r\n AirportParkingQuoteId: quote.AirportParkingQuoteId,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n };\r\n timeout = $q.defer();\r\n return $http.post(url + \"get\", request, {\r\n customErrCallback: function (args) {\r\n if (args.status) {\r\n broker.publish('parkingRequestFailed');\r\n }\r\n return true;\r\n },\r\n timeout: timeout.promise\r\n }).then(function (res) {\r\n promiseCache.remove(res.data.DetailsSearchId);\r\n timeout = null;\r\n return res.data;\r\n });\r\n }\r\n function appendDetails(quote, t) {\r\n if (!quote.Details) {\r\n quote.parkingBusy = true;\r\n var parkingSearchId = t.ParkingRequest.AvailabilitySearchId;\r\n service.getParkingDetails({ AvailabilitySearchId: parkingSearchId, AirportParkingQuoteId: quote.QuoteId }, true).then(function (d) {\r\n quote.viewDetails = true;\r\n quote.Details = d;\r\n quote.parkingBusy = false;\r\n quote.showDetailsError = false;\r\n }, function () {\r\n quote.parkingBusy = false;\r\n quote.showDetailsError = true;\r\n });\r\n }\r\n else {\r\n quote.viewDetails = true;\r\n }\r\n }\r\n function rehydrate(id) {\r\n if (!promiseCache.get(id)) {\r\n promiseCache.put(id, $http.post(url + \"getfromsession\", { DetailsSearchId: id }).then(function (res) {\r\n return res.data;\r\n }));\r\n }\r\n return promiseCache.get(id);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('parking')\r\n .service('parkingSearchValidator', parkingSearchValidator);\r\n function parkingSearchValidator(resourceService, dateUtil) {\r\n var service = {\r\n validate: validate\r\n };\r\n function validate(departureAirport, startDate, endDate) {\r\n var errors = [];\r\n if (departureAirport == null) {\r\n errors.push(resourceService.get('SELECTDEPARTUREAIRPORT'));\r\n }\r\n if (startDate == null) {\r\n errors.push(resourceService.get('SELECTARRIVALDATE'));\r\n }\r\n else if (!dateUtil.atLeastOneDayInTheFuture(startDate)) {\r\n errors.push(resourceService.get('ARRIVALDATEMUSTBEFUTURE'));\r\n }\r\n if (endDate == null) {\r\n errors.push(resourceService.get('SELECTRETURNDATE'));\r\n }\r\n else if (endDate <= startDate) {\r\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\r\n }\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('quote')\r\n .controller('Quote', Quote);\r\n function Quote(quoteService, tripService, bookingService, hotelRehydrator, $routeParams, $location, $filter, dateUtil, flightDetail, $q) {\r\n var qc = this;\r\n qc.quoteCreationError = false;\r\n qc.quoteNotFound = false;\r\n qc.quoteRefreshEnabled = TRPCONFIG.Domain.QuoteRefreshEnabled;\r\n qc.quoteManager = !($routeParams.quoteRef && $routeParams.quoteNo);\r\n qc.quoteRefreshError = false;\r\n qc.validForDays = 30; //maybe the API should tell us this\r\n if (!qc.quoteManager) {\r\n quoteService.getQuoteByReference($routeParams.quoteRef + \"/\" + $routeParams.quoteNo).then(function (result) {\r\n if (result === null) {\r\n qc.quoteNotFound = true;\r\n }\r\n else {\r\n qc.quote = result;\r\n if (!qc.quote) {\r\n qc.quoteNotFound = true;\r\n }\r\n else {\r\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\r\n enrichProducts();\r\n }\r\n }\r\n });\r\n }\r\n var productNames = {\r\n accommodation: 0,\r\n flight: 1,\r\n transfer: 2,\r\n airportparking: 3,\r\n attractionticket: 4,\r\n carhire: 5,\r\n marhaba: 6,\r\n insurance: 7\r\n };\r\n function getNumFromType(type) {\r\n var typeStr = type.toLowerCase().replace(/\\s/g, '');\r\n return productNames[typeStr] >= 0 ? productNames[typeStr] : Object.keys(productNames).length;\r\n }\r\n function sortProducts(products) {\r\n var sorted = products && products.sort(function (a, b) {\r\n var typeA = getNumFromType(a.Type);\r\n var typeB = getNumFromType(b.Type);\r\n a.TypeId = typeA;\r\n b.TypeId = typeB;\r\n return typeA > typeB ? 1 : -1;\r\n });\r\n return sorted;\r\n }\r\n qc.refreshQuote = function () {\r\n qc.refreshClicked = true;\r\n qc.quoteRefreshError = false;\r\n return quoteService.refreshQuote(qc.quote.Id, qc.quote.ProductIds).then(function (result) {\r\n qc.refreshClicked = false;\r\n if (result.Error) {\r\n qc.quoteRefreshError = true;\r\n }\r\n else {\r\n qc.quote = result;\r\n if (!qc.quote) {\r\n qc.quoteNotFound = true;\r\n qc.quoteCreationError = true;\r\n }\r\n else {\r\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\r\n return enrichProducts();\r\n }\r\n }\r\n });\r\n };\r\n qc.getQuoteByReference = function (quoteRef, quoteNo) {\r\n $location.path(\"quote/manage/\" + quoteRef + \"/\" + quoteNo);\r\n };\r\n qc.replaceProduct = function (quoteId, productId, replacementId) {\r\n quoteService.replaceProduct(quoteId, productId, replacementId).then(function (result) {\r\n qc.quote = result;\r\n if (!qc.quote) {\r\n qc.quoteNotFound = true;\r\n qc.quoteCreationError = true;\r\n }\r\n else {\r\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\r\n enrichProducts();\r\n }\r\n });\r\n };\r\n qc.gotoBasket = function () { return $location.path('dp/basket'); };\r\n qc.bookQuote = function () {\r\n //redirection url\r\n var bookingRedirectPath = 'holidays/book';\r\n if (qc.quote.Products && qc.quote.Products.length === 1) {\r\n if (qc.quote.Products[0].Type === 'Accommodation') {\r\n bookingRedirectPath = 'hotels/book';\r\n }\r\n else if (qc.quote.Products[0].Type === 'Transfer') {\r\n bookingRedirectPath = 'transfers/book';\r\n }\r\n else if (qc.quote.Products[0].Type === 'Marhaba') {\r\n bookingRedirectPath = 'marhaba/book';\r\n }\r\n else if (qc.quote.Products[0].Type === 'Insurance') {\r\n bookingRedirectPath = 'insurance/book';\r\n }\r\n else if (qc.quote.Products[0].Type === 'Airport Parking') {\r\n bookingRedirectPath = 'parking/book';\r\n }\r\n }\r\n //get trip\r\n tripService.getTripFromQuote(qc.quote).then(function (result) {\r\n qc.tripFromQuote = result;\r\n bookingService.prepareBooking(qc.quote.BasketId, qc.tripFromQuote.BookingId, qc.tripFromQuote.TripId)\r\n .then(function () {\r\n if (bookingRedirectPath === 'marhaba/book') {\r\n $location.path(\"marhaba/book/\" + qc.tripFromQuote.TripId + \"/\" + qc.quote.Products[0].Id);\r\n }\r\n else {\r\n $location.path(bookingRedirectPath + \"/\" + qc.tripFromQuote.TripId);\r\n }\r\n });\r\n });\r\n };\r\n qc.searchAgain = function () {\r\n //select tab from search unit\r\n var searchRedirectPath = '/holidays';\r\n if (qc.quote.Products.length === 1) {\r\n searchRedirectPath = qc.quote.Products[0].searchRedirectPath;\r\n }\r\n //get trip id\r\n tripService.getTripFromQuote(qc.quote).then(function (result) {\r\n qc.tripFromQuote = result;\r\n if (qc.tripFromQuote) {\r\n tripService.restoreSearchUnit(qc.tripFromQuote.TripId).then(function () {\r\n $location.path(searchRedirectPath);\r\n });\r\n }\r\n else {\r\n document.location.href = '/';\r\n }\r\n });\r\n };\r\n function getDetailsForAllFlights(products) {\r\n return $q.all(products\r\n .map(function (p) {\r\n return p.Type === 'Flight'\r\n ? flightDetail.mapLegs(p)\r\n : $q.when(p);\r\n }));\r\n }\r\n function enrichProducts() {\r\n return getDetailsForAllFlights(qc.quote.Products)\r\n .then(function (p) {\r\n var products = sortProducts(p);\r\n qc.quote.ProductIds = [];\r\n qc.quote.RestoreFailed = false;\r\n qc.quote.totalQuotedHolidayCost = 0;\r\n qc.quote.totalCurrentHolidayCost = 0;\r\n qc.failedRestore = products && products.filter(function (p) { return p.RestoreFailed; });\r\n angular.forEach(products, function (product) {\r\n qc.quote.ProductIds.push(product.Id);\r\n if (product.RestoreFailed) {\r\n qc.quote.RestoreFailed = true;\r\n }\r\n if (product.Type === 'Flight') {\r\n product.iconClass = 'icon-flights';\r\n getFlightDetails(product);\r\n product.searchRedirectPath = '/flights';\r\n }\r\n else if (product.Type === 'Accommodation') {\r\n product.iconClass = 'icon-hotels';\r\n getHotelDetails(product);\r\n product.searchRedirectPath = '/hotels';\r\n if (Array.isArray(product.SpecialOffers)) {\r\n product.HasSpecialOffers = product.SpecialOffers.some(function (so) { return so; });\r\n }\r\n }\r\n else if (product.Type === 'Transfer') {\r\n product.iconClass = 'icon-transfers';\r\n product.searchRedirectPath = '/transfers';\r\n }\r\n else if (product.Type === 'Car Hire') {\r\n product.searchRedirectPath = '/car-hire';\r\n getCarHireDetails(product);\r\n }\r\n else if (product.Type === 'Marhaba') {\r\n if (product.Options.length > 0) {\r\n getTotalProductCost(product);\r\n }\r\n product.searchRedirectPath = '/marhaba';\r\n }\r\n else if (product.Type === 'Insurance') {\r\n product.searchRedirectPath = '/insurance';\r\n }\r\n qc.quote.totalQuotedHolidayCost += product.TotalQuotedCost ? product.TotalQuotedCost : product.QuotedCost;\r\n qc.quote.totalCurrentHolidayCost += product.TotalCurrentCost ? product.TotalCurrentCost : product.CurrentCost;\r\n });\r\n qc.quote.Products = products;\r\n });\r\n }\r\n function getCarHireDetails(product) {\r\n angular.forEach(product.Options, function (option) {\r\n if (option.OnRequest) {\r\n product.ShowOnRequest = true;\r\n }\r\n option.PayableLocally = (option.CurrentUnitCost === 0 && option.QuotedUnitCost === 0 && option.Quantity >= 1 && option.OnRequest === true);\r\n option.UnitCurrentAmountString = $filter('customCurrency')(option.CurrentUnitCost, option.Currency);\r\n option.TotalCurrentAmountString = $filter('customCurrency')((option.CurrentUnitCost * option.Quantity), option.Currency);\r\n });\r\n }\r\n function getFlightDetails(product) {\r\n getTotalProductCost(product);\r\n product.Options = _.filter(product.Options, function (option) {\r\n var title = \"\" + parseInt(option.Title);\r\n return option.CurrentOptionCost > 0 || option.Title !== title;\r\n });\r\n }\r\n function getHotelDetails(product) {\r\n hotelRehydrator.staticHotel(product.EstablishmentId).then(function (d) {\r\n product.extraDetails = d;\r\n });\r\n }\r\n function getTotalProductCost(product) {\r\n var totalQuotedProductCost = 0;\r\n var totalCurrentProductCost = 0;\r\n angular.forEach(product.Options, function (option) {\r\n option.CurrentOptionCost = option.Quantity * option.CurrentUnitCost;\r\n option.QuotedOptionCost = option.Quantity * option.QuotedUnitCost;\r\n totalQuotedProductCost += option.QuotedOptionCost;\r\n totalCurrentProductCost += option.CurrentOptionCost;\r\n option.UnitCurrentAmountString = $filter('customCurrency')(option.CurrentUnitCost);\r\n option.TotalCurrentAmountString = $filter('customCurrency')((option.CurrentUnitCost * option.Quantity));\r\n });\r\n product.TotalCurrentCost = product.CurrentCost + totalCurrentProductCost;\r\n product.TotalQuotedCost = product.QuotedCost + totalQuotedProductCost;\r\n }\r\n }\r\n})();\r\nvar Quote;\r\n(function (Quote) {\r\n var AdvancedQuoteSearch = /** @class */ (function () {\r\n function AdvancedQuoteSearch(quoteService, $scope, resourceService, agentModeService, dateUtil, $location, broker, $q, localStorageProvider) {\r\n var _this = this;\r\n this.quoteService = quoteService;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.agentModeService = agentModeService;\r\n this.dateUtil = dateUtil;\r\n this.$location = $location;\r\n this.broker = broker;\r\n this.$q = $q;\r\n this.localStorageProvider = localStorageProvider;\r\n this.busy = false;\r\n this.toggleSearchForm = true;\r\n this.page = function (num, e) {\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n _this.search(num);\r\n };\r\n this.initSearch(quoteService.getCachedSearch());\r\n }\r\n AdvancedQuoteSearch.prototype.searchAgain = function () {\r\n this.searching = false;\r\n this.showSearchForm = true;\r\n this.toggleSearchForm = true;\r\n };\r\n AdvancedQuoteSearch.prototype.initSearch = function (cache) {\r\n var _this = this;\r\n this.searching = false;\r\n this.showSearchForm = true;\r\n this.allowToggleAdvancedSearch = 'function' === typeof this.hideAdvancedSearch;\r\n this.today = this.dateUtil.todayPlus(0, 0, true);\r\n this.dateLimits = {\r\n startMaxDate: this.today,\r\n endMaxDate: this.dateUtil.todayPlus(1, 0, true)\r\n };\r\n this.toggleSearchForm = true;\r\n this.quoteSearch = {\r\n searchModel: {\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n page: 1,\r\n limit: 9,\r\n sortDirection: 'DESC'\r\n },\r\n searchResponse: null\r\n };\r\n if (cache != null) {\r\n this.quoteSearch = cache;\r\n this.showSearchForm = false;\r\n this.toggleSearchForm = false;\r\n }\r\n this.agentModeService.getCoworkers().then(function (data) { _this.agents = data; });\r\n };\r\n AdvancedQuoteSearch.prototype.search = function (pgIndex) {\r\n var _this = this;\r\n this.noPermission = false;\r\n this.quoteSearch.searchModel.page = pgIndex;\r\n this.quoteSearch.searchModel.reference = this.quoteSearch.searchModel.quoteNo\r\n ? \"QUO/\" + this.quoteSearch.searchModel.quoteNo\r\n : '';\r\n this.searching = true;\r\n this.showSearchForm = false;\r\n var onRequestFinished = function (searchResponse) {\r\n _this.searching = false;\r\n _this.toggleSearchForm = false;\r\n _this.quoteSearch.searchResponse = searchResponse;\r\n };\r\n return this.quoteService.search(this.quoteSearch.searchModel).then(function (res) {\r\n onRequestFinished(res);\r\n }, function (err) {\r\n if (err.status === 400) {\r\n _this.showError('QUOTEADVANCESEARCH_NOTSPECIFIC');\r\n _this.searching = false;\r\n _this.showSearchForm = true;\r\n return;\r\n }\r\n onRequestFinished(null);\r\n _this.noPermission = 401 === err.status;\r\n });\r\n };\r\n AdvancedQuoteSearch.prototype.showError = function (error) {\r\n this.$scope.$broadcast('flash:error', this.resourceService.get(error));\r\n };\r\n AdvancedQuoteSearch.prototype.manageQuote = function (reference) {\r\n this.broker.publish('quoteSelected', reference);\r\n this.localStorageProvider.setItem('quoteSelected', reference);\r\n this.$location.path('quote/manage/' + reference);\r\n };\r\n AdvancedQuoteSearch.prototype.setStartDate = function (date) {\r\n this.quoteSearch.searchModel.from = date;\r\n this.dateLimits.endMinDate = date;\r\n };\r\n AdvancedQuoteSearch.prototype.setEndDate = function (date) {\r\n this.quoteSearch.searchModel.to = date;\r\n };\r\n AdvancedQuoteSearch.prototype.selectAgent = function (agent) {\r\n if (agent) {\r\n this.quoteSearch.searchModel.quotedById = agent.Id;\r\n this.selectedAgent = agent;\r\n }\r\n };\r\n AdvancedQuoteSearch.prototype.selectCustomer = function (customer) {\r\n if (customer) {\r\n this.selectedCustomer = customer;\r\n this.quoteSearch.searchModel.userId = customer.UserId;\r\n }\r\n };\r\n AdvancedQuoteSearch.prototype.selectTravelAgent = function (agent) {\r\n if (agent) {\r\n this.selectedTravelAgent = agent;\r\n this.quoteSearch.searchModel.externalAgentId = agent.Id;\r\n }\r\n };\r\n AdvancedQuoteSearch.prototype.filterAgent = function (prefix) {\r\n return _.filter(this.agents, function (agent) { return _.includes(_.toLower(agent.FullName), _.toLower(prefix)); });\r\n };\r\n AdvancedQuoteSearch.prototype.autoCompleterDeselect = function (prop) {\r\n this.quoteSearch.searchModel[prop] = null;\r\n if (prop === 'externalAgentId') {\r\n this.selectedTravelAgent = undefined;\r\n }\r\n if (prop === 'userId') {\r\n this.selectedCustomer = undefined;\r\n }\r\n if (prop === 'quotedById') {\r\n this.selectedAgent = undefined;\r\n }\r\n };\r\n AdvancedQuoteSearch.prototype.getTravelAgentNameForQuote = function (quote) {\r\n return this.quoteService.getTravelAgentNameForQuote(quote) || '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getTravelAgentAgencyNameForQuote = function (quote) {\r\n if (this.travelAgentDetails && this.travelAgentDetails[quote.TravelAgentId]) {\r\n return this.travelAgentDetails[quote.TravelAgentId].Name;\r\n }\r\n return '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getCustomerNameForQuote = function (quote) {\r\n return this.quoteService.getCustomerNameForQuote(quote, this.getContactByUserId(quote.UserId)) || '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getCustomerEmailForQuote = function (quote) {\r\n return this.quoteService.getCustomerEmailForQuote(quote, this.getContactByUserId(quote.UserId) ||\r\n this.getTravelAgentContactById(quote.TravelAgentId)) || '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getCustomerPhoneNumberForQuote = function (quote) {\r\n return this.quoteService.getCustomerPhoneNumberForQuote(this.getContactByUserId(quote.UserId) ||\r\n this.getTravelAgentContactById(quote.TravelAgentId) || quote) || '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getCustomerSkywardNumberForQuote = function (quote) {\r\n return this.quoteService.getCustomerSkywardNumberForQuote(this.getContactByUserId(quote.UserId) || quote) || '-';\r\n };\r\n AdvancedQuoteSearch.prototype.getContactByUserId = function (userId) {\r\n if (userId && this.userDetails && this.userDetails[userId]) {\r\n return this.userDetails[userId].Contact;\r\n }\r\n return null;\r\n };\r\n AdvancedQuoteSearch.prototype.getTravelAgentContactById = function (agentId) {\r\n if (agentId && this.travelAgentDetails && this.travelAgentDetails[agentId]) {\r\n return this.travelAgentDetails[agentId].Contact;\r\n }\r\n return null;\r\n };\r\n AdvancedQuoteSearch.prototype.hideSearch = function ($e) {\r\n $e.preventDefault();\r\n if (this.allowToggleAdvancedSearch) {\r\n this.hideAdvancedSearch();\r\n }\r\n };\r\n return AdvancedQuoteSearch;\r\n }());\r\n angular\r\n .module('quote')\r\n .directive('advancedQuoteSearch', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: 'partials/quote/directivetemplate?type=advancedquotesearch',\r\n controller: AdvancedQuoteSearch,\r\n controllerAs: 'aqs',\r\n bindToController: {\r\n hideAdvancedSearch: '&?',\r\n showTravelAgencyDetail: '=?',\r\n showLoyaltyNumber: '=?',\r\n showLinkedBookings: '=?',\r\n }\r\n };\r\n });\r\n})(Quote || (Quote = {}));\r\nvar Quote;\r\n(function (Quote) {\r\n var BasketNotes = /** @class */ (function () {\r\n function BasketNotes(quoteService, basketStore) {\r\n this.quoteService = quoteService;\r\n this.basketStore = basketStore;\r\n }\r\n BasketNotes.prototype.createNote = function () {\r\n this.newNote = { Text: '' };\r\n };\r\n BasketNotes.prototype.addNote = function () {\r\n var _this = this;\r\n if (!this.newNote) {\r\n return;\r\n }\r\n var text = this.newNote.Text;\r\n var promise;\r\n if (this.basketType === 'basket') {\r\n promise = this.basketStore.addNote(this.basketId, text);\r\n }\r\n else if (this.basketType === 'quote') {\r\n promise = this.quoteService.addNote(this.basketId, text);\r\n }\r\n promise.then(function (basket) {\r\n _this.newNote = null;\r\n _this.notes = basket.Notes;\r\n });\r\n };\r\n BasketNotes.prototype.getDate = function (note) {\r\n return new Date(note.Created + '+00:00');\r\n };\r\n return BasketNotes;\r\n }());\r\n angular\r\n .module('quote')\r\n .directive('basketNotes', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n bindToController: {\r\n notes: '=',\r\n basketId: '=',\r\n basketType: '@'\r\n },\r\n templateUrl: 'partials/quote/directivetemplate?type=notes',\r\n controller: BasketNotes,\r\n controllerAs: 'n'\r\n };\r\n });\r\n})(Quote || (Quote = {}));\r\nvar QuoteCreator;\r\n(function (QuoteCreator_1) {\r\n var QuoteCreator = /** @class */ (function () {\r\n function QuoteCreator($scope, analytics, quoteManager, broker, quoteService, $location, resourceService, currentUser, localStorageProvider) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.quoteManager = quoteManager;\r\n this.broker = broker;\r\n this.quoteService = quoteService;\r\n this.$location = $location;\r\n this.resourceService = resourceService;\r\n this.currentUser = currentUser;\r\n this.localStorageProvider = localStorageProvider;\r\n this.contactEmail = '';\r\n this.sendEmail = TRPCONFIG.Domain.EnableAgentSendQuoteEmail;\r\n this.quoteCreated = false;\r\n this.showLink = true;\r\n this.newsletterSignup = false;\r\n this.createClicked = false;\r\n this.quoteCreationError = false;\r\n this.quoteEmailAttempts = 0;\r\n this.quoteEmailAttemptsLimit = 3;\r\n this.emailPattern = /^\\S+@\\S+\\.\\S+[^\\.]$/;\r\n this._initContact();\r\n this.$scope.$on('form:submitted-invalid', function (event, form) {\r\n if (form.$name === 'quoteForm') {\r\n _this.invalidUser = true;\r\n }\r\n });\r\n }\r\n QuoteCreator.prototype._initContact = function () {\r\n var currentUser = this.currentUser.get();\r\n var contact = currentUser && currentUser.Contact || {};\r\n this.contact = {\r\n Title: contact.Title || '',\r\n FirstName: contact.FirstName || '',\r\n LastName: contact.LastName || '',\r\n Email: contact.Email || '',\r\n MobileTel: contact.MobileTel || ''\r\n };\r\n };\r\n QuoteCreator.prototype._newPostCreateQuote = function (response) {\r\n if (response.Error) {\r\n this.quoteCreationError = true;\r\n this.quoteCreated = false;\r\n }\r\n else {\r\n this.quote = response.Payload;\r\n this.quoteCreated = true;\r\n this.quoteEmailAttempts++;\r\n this.localStorageProvider.removeItem('trackingTag');\r\n this.refEmail = this.$scope.qc.contact.Email;\r\n if (this.formName === 'quoteFormNonReg') {\r\n this.$scope.qc.contact.Email = '';\r\n }\r\n }\r\n this.createClicked = false;\r\n };\r\n QuoteCreator.prototype._newCreateQuote = function (contact, noUserCheck, trackingTag, formName) {\r\n if (contact === void 0) { contact = null; }\r\n if (noUserCheck === void 0) { noUserCheck = false; }\r\n var EmailAddress = contact ? contact.Email : null;\r\n var email = EmailAddress ? { Email: EmailAddress } : null;\r\n var request = {\r\n QuoteId: '',\r\n BasketId: this.basketId,\r\n SharedUse: this.sharedUseFlag,\r\n SendEmail: noUserCheck ? false : this.sendEmail,\r\n TrackingTag: trackingTag,\r\n EmailAddress: EmailAddress,\r\n EmailSignUp: this.newsletterSignup,\r\n User: noUserCheck || !this.registerUser ? email : contact\r\n };\r\n this.formName = formName ? formName : '';\r\n return this.quoteManager.create(request);\r\n };\r\n QuoteCreator.prototype.create = function (contact, noUserCheck, mixPanelTag, formName) {\r\n var _this = this;\r\n if (noUserCheck === void 0) { noUserCheck = false; }\r\n this.quoteCreationError = false;\r\n this.createClicked = true;\r\n this.quoteCreated = false;\r\n if (mixPanelTag) {\r\n this.analytics.track('mixpanel', mixPanelTag);\r\n }\r\n return this.localStorageProvider.getItem('trackingTag')\r\n .then(function (trackingTag) { return _this._newCreateQuote(contact, noUserCheck, trackingTag, formName); })\r\n .then(function (result) { return _this._newPostCreateQuote(result); });\r\n };\r\n QuoteCreator.prototype.manageQuote = function (reference) {\r\n this.broker.publish('quoteSelected', reference);\r\n this.localStorageProvider.setItem('quoteSelected', reference);\r\n this.$location.path('quote/manage/' + reference);\r\n };\r\n QuoteCreator.prototype.getName = function (str) {\r\n return this.resourceService.get(str.toUpperCase());\r\n };\r\n QuoteCreator.prototype.isQuoteEmailDisabled = function () {\r\n return this.quoteEmailAttempts >= this.quoteEmailAttemptsLimit;\r\n };\r\n return QuoteCreator;\r\n }());\r\n angular.module('quote').directive('quoteCreator', function () {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: {},\r\n controllerAs: 'qc',\r\n bindToController: {\r\n sharedUse: '=',\r\n basketId: '=',\r\n registerUser: '=',\r\n expanded: '=',\r\n expandable: '='\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=Agent/QuoteCreator&version='\r\n + attr.templateVersion;\r\n }\r\n return 'partials/quote/quotecreator';\r\n },\r\n controller: QuoteCreator,\r\n transclude: true\r\n };\r\n });\r\n})(QuoteCreator || (QuoteCreator = {}));\r\nvar Search;\r\n(function (Search) {\r\n var SearchOccupancy = /** @class */ (function () {\r\n function SearchOccupancy() {\r\n this.Adults = 2;\r\n this.ChildAges = [];\r\n }\r\n return SearchOccupancy;\r\n }());\r\n Search.SearchOccupancy = SearchOccupancy;\r\n var OccupancyConfig = /** @class */ (function () {\r\n function OccupancyConfig() {\r\n }\r\n return OccupancyConfig;\r\n }());\r\n Search.OccupancyConfig = OccupancyConfig;\r\n var DateRange = /** @class */ (function () {\r\n function DateRange() {\r\n }\r\n return DateRange;\r\n }());\r\n Search.DateRange = DateRange;\r\n var Cabin = /** @class */ (function () {\r\n function Cabin(resource, value, queryStringCode, resourceService) {\r\n this.resource = resource;\r\n this.value = value;\r\n this.queryStringCode = queryStringCode;\r\n this.resourceService = resourceService;\r\n this.name = this.resourceService.getDeferred(resource);\r\n }\r\n return Cabin;\r\n }());\r\n Search.Cabin = Cabin;\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var UnifiedSearchType;\r\n (function (UnifiedSearchType) {\r\n UnifiedSearchType[UnifiedSearchType[\"Holidays\"] = 1] = \"Holidays\";\r\n UnifiedSearchType[UnifiedSearchType[\"Hotels\"] = 2] = \"Hotels\";\r\n UnifiedSearchType[UnifiedSearchType[\"Flights\"] = 3] = \"Flights\";\r\n UnifiedSearchType[UnifiedSearchType[\"Transfers\"] = 4] = \"Transfers\";\r\n UnifiedSearchType[UnifiedSearchType[\"Cruises\"] = 5] = \"Cruises\";\r\n UnifiedSearchType[UnifiedSearchType[\"Marhaba\"] = 6] = \"Marhaba\";\r\n UnifiedSearchType[UnifiedSearchType[\"HolidayDeals\"] = 7] = \"HolidayDeals\";\r\n UnifiedSearchType[UnifiedSearchType[\"Insurance\"] = 8] = \"Insurance\";\r\n })(UnifiedSearchType = Search.UnifiedSearchType || (Search.UnifiedSearchType = {}));\r\n var UnifiedSearchModel = /** @class */ (function () {\r\n function UnifiedSearchModel() {\r\n }\r\n return UnifiedSearchModel;\r\n }());\r\n Search.UnifiedSearchModel = UnifiedSearchModel;\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var DateRangePicker = /** @class */ (function () {\r\n function DateRangePicker($scope, $timeout, dateUtil, animationUtil) {\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.dateUtil = dateUtil;\r\n this.animationUtil = animationUtil;\r\n this.enabledDates = {};\r\n this.durations = [];\r\n this.datePicker = null;\r\n this.nextDateToSet = 'start';\r\n this.localStartDate = undefined;\r\n this.localEndDate = undefined;\r\n this.shadowStartDate = undefined;\r\n this.shadowEndDate = undefined;\r\n this.duration = 0;\r\n this.html = $('html');\r\n }\r\n DateRangePicker.prototype.init = function (elements) {\r\n var _this = this;\r\n this.elements = elements;\r\n this.$scope.$watch('drp.show', function (val) {\r\n if (val != null) {\r\n if (val) {\r\n _this.open();\r\n }\r\n else {\r\n _this.close();\r\n }\r\n }\r\n });\r\n // set shadow dates on hover\r\n // (disabled for touch as it requires the user to press twice to select a date)\r\n if (!TRPCONFIG.IsTouchDevice) {\r\n this.elements.datepickerEl.on('mouseover.datetangepicker', 'td.drp-date', function (event) {\r\n var $cell = $(event.currentTarget), date = _this.getDateFromCalendarCell($cell);\r\n if ($cell.hasClass('ui-datepicker-unselectable')) {\r\n _this.resetShadowDates();\r\n _this.$scope.$apply(function () {\r\n _this.setDuration();\r\n });\r\n return;\r\n }\r\n $cell.addClass('hover hover-' + _this.nextDateToSet);\r\n if (_this.nextDateToSet === 'start') {\r\n _this.shadowStartDate = date;\r\n _this.shadowEndDate = undefined;\r\n }\r\n else {\r\n _this.shadowEndDate = date;\r\n _this.shadowStartDate = _this.localStartDate;\r\n }\r\n if (_this.shadowStartDate && _this.shadowEndDate) {\r\n _this.durations.length === 0 && _this.highlightShadowDates();\r\n _this.$scope.$apply(function () {\r\n _this.setDuration();\r\n });\r\n }\r\n });\r\n }\r\n this.elements.datepickerEl.on('mouseleave.datetangepicker', 'td.drp-date', function (event) {\r\n var $cell = $(event.currentTarget);\r\n $cell.removeClass('hover');\r\n });\r\n // reset shadow dates when calendar loses hover focus\r\n this.elements.datepickerEl.on('mouseleave.datetangepicker', 'table.ui-datepicker-calendar', function (event) {\r\n _this.resetShadowDates();\r\n _this.$scope.$apply(function () {\r\n _this.setDuration();\r\n });\r\n });\r\n // close if overlay is clicked\r\n this.elements.overlay.on('click.datetangepicker', function (event) {\r\n _this.$scope.$apply(function () {\r\n _this.closeClicked(null);\r\n });\r\n });\r\n this.elements.stage.on('click.datetangepicker', function (event) {\r\n event.stopPropagation();\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n // unbind event listeners by namespace\r\n _this.elements.datepickerEl.off('.datetangepicker');\r\n _this.elements.overlay.off('.datetangepicker');\r\n _this.elements.stage.off('.datetangepicker');\r\n _this.html.off('.datetangepicker');\r\n $(window).unbind('resize');\r\n });\r\n };\r\n DateRangePicker.prototype.highlightShadowDates = function () {\r\n var _this = this;\r\n this.elements.datepickerEl.find('.drp-date:not(.ui-datepicker-unselectable)').each(function (i, val) {\r\n var $cell = $(val);\r\n var date = _this.getDateFromCalendarCell($cell);\r\n var isInShadow = _this.shadowStartDate !== undefined\r\n && _this.shadowEndDate !== undefined\r\n && (date >= _this.shadowStartDate)\r\n && (date <= _this.shadowEndDate);\r\n $cell.toggleClass('in-shadow-range', isInShadow);\r\n });\r\n };\r\n DateRangePicker.prototype.getDateFromCalendarCell = function ($td) {\r\n // get the date from the css class we set previously\r\n var match = $td.attr('class').match(/drp-date-\\S+/), date = match[0].replace('drp-date-', '');\r\n return this.dateUtil.parseDate(date);\r\n };\r\n DateRangePicker.prototype.setDuration = function () {\r\n var start = this.localStartDate ? this.localStartDate : this.shadowStartDate, end = this.localEndDate ? this.localEndDate : this.shadowEndDate;\r\n this.duration = start && end ? this.dateUtil.numberOfNights(start, end) : 0;\r\n };\r\n DateRangePicker.prototype.isStartDateEnabled = function (date) {\r\n var enabled;\r\n if (this.enabledDates && Object.keys(this.enabledDates).length > 0) {\r\n var dateStr = this.dateUtil.format(date, 'yyyy-MM-dd');\r\n enabled = !_.isUndefined(this.enabledDates[dateStr]);\r\n }\r\n else {\r\n enabled = true;\r\n }\r\n return enabled;\r\n };\r\n DateRangePicker.prototype.applyDatePicker = function (element) {\r\n var _this = this;\r\n var options = {\r\n numberOfMonths: 2,\r\n dateFormat: 'dd-M-yy',\r\n firstDay: 1,\r\n isRTL: TRPCONFIG.Rtl,\r\n prevText: '',\r\n nextText: '',\r\n onSelect: function () {\r\n _this.$scope.$apply(function () {\r\n var selectedDate = _this.datePicker('getDate');\r\n // a date has been selected on the calendar\r\n if (_this.nextDateToSet === 'start') {\r\n _this.localStartDate = selectedDate;\r\n // clear the end date\r\n _this.localEndDate = undefined;\r\n }\r\n else if (_this.nextDateToSet === 'end') {\r\n _this.localEndDate = selectedDate;\r\n }\r\n _this.nextDateToSet = _this.oneWay || _this.nextDateToSet === 'end' ? 'start' : 'end';\r\n if (_this.nextDateToSet === 'start') {\r\n // a range has now been selected\r\n _this.setRange();\r\n // timeout allows model to update\r\n _this.$timeout(function () { return _this.select(); });\r\n }\r\n });\r\n },\r\n beforeShowDay: function (date) {\r\n var selectable;\r\n // tag this cell with a class denoting the serialised date\r\n var classes = [\r\n 'drp-date',\r\n 'drp-date-' + _this.dateUtil.serialiseDate(date)\r\n ];\r\n if (_this.nextDateToSet === 'start') {\r\n // is this a permitted start date?\r\n selectable = _this.isStartDateEnabled(date);\r\n }\r\n else {\r\n // is this a permitted end date?\r\n selectable = _this.localStartDate !== undefined && date > _this.localStartDate;\r\n if (selectable && _this.durations.length > 0) {\r\n var duration = _this.dateUtil.numberOfNights(_this.localStartDate, date);\r\n selectable = _.includes(_this.durations, duration);\r\n selectable && classes.push('valid-duration');\r\n }\r\n }\r\n // set range highlights\r\n var isRangeSet = _this.localStartDate && _this.localEndDate, isDateInRange = isRangeSet\r\n && _this.localStartDate !== undefined\r\n && _this.localEndDate !== undefined\r\n && (date >= _this.localStartDate)\r\n && (date <= _this.localEndDate);\r\n if (isDateInRange) {\r\n classes.push('in-range');\r\n }\r\n if (isDateInRange || (!isRangeSet && _this.localStartDate)) {\r\n if (_this.dateUtil.sameDay(date, _this.localStartDate)) {\r\n classes.push('start-date');\r\n }\r\n }\r\n if (isDateInRange || (!isRangeSet && _this.localEndDate)) {\r\n if (_this.dateUtil.sameDay(date, _this.localEndDate)) {\r\n classes.push('end-date');\r\n }\r\n }\r\n return [selectable, classes.join(' ')];\r\n }\r\n };\r\n element.datepicker(options);\r\n return element.datepicker.bind(element);\r\n };\r\n DateRangePicker.prototype.setRange = function () {\r\n this.startDate = this.dateUtil.serialiseDate(this.localStartDate);\r\n this.endDate = this.dateUtil.serialiseDate(this.localEndDate);\r\n };\r\n DateRangePicker.prototype.open = function () {\r\n var _this = this;\r\n if (this.datePicker == null) {\r\n // create the datepicker if has not been previously opened\r\n this.datePicker = this.applyDatePicker(this.elements.datepickerEl);\r\n }\r\n // ensure the datepicker reflects our model\r\n this.localStartDate = this.dateUtil.parseDate(this.startDate);\r\n this.localEndDate = this.oneWay ? undefined : this.dateUtil.parseDate(this.endDate);\r\n this.nextDateToSet = 'start';\r\n this.datePicker('option', 'minDate', this.dateUtil.parseDate(this.minDate));\r\n this.datePicker('option', 'maxDate', this.dateUtil.parseDate(this.maxDate));\r\n // set the start date to invoke \"beforeShowDay\" and highlight the initial date range\r\n this.datePicker('setDate', this.localStartDate);\r\n this.animationUtil.lockScroll();\r\n this.elements.overlay.addClass('fade-in');\r\n this.html.on('keyup.datetangepicker', function (event) {\r\n // ESCAPE to close\r\n if (event.which === 27 && _this.show) {\r\n _this.$scope.$apply(function () {\r\n _this.closeClicked(null);\r\n });\r\n }\r\n });\r\n };\r\n DateRangePicker.prototype.close = function () {\r\n this.animationUtil.restoreScroll();\r\n this.elements.overlay.removeClass('fade-in');\r\n this.html.off('keyup.datetangepicker');\r\n };\r\n DateRangePicker.prototype.closeClicked = function (event) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n this.show = false;\r\n $(window).unbind('resize');\r\n };\r\n DateRangePicker.prototype.resetShadowDates = function () {\r\n this.shadowStartDate = undefined;\r\n this.shadowEndDate = undefined;\r\n this.highlightShadowDates();\r\n };\r\n DateRangePicker.prototype.resetRange = function (event) {\r\n event.preventDefault();\r\n this.localStartDate = undefined;\r\n this.localEndDate = undefined;\r\n this.setRange();\r\n this.nextDateToSet = 'start';\r\n this.duration = 0;\r\n this.datePicker('setDate', null);\r\n };\r\n return DateRangePicker;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('dateRangePicker', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: DateRangePicker,\r\n controllerAs: 'drp',\r\n bindToController: {\r\n startDate: '=',\r\n endDate: '=',\r\n minDate: '=',\r\n maxDate: '=',\r\n enabledDates: '=',\r\n select: '&',\r\n show: '=',\r\n durations: '=',\r\n oneWay: '=',\r\n },\r\n templateUrl: 'partials/search/daterangepicker',\r\n link: function (scope, el, attr, controller) {\r\n var elements = {\r\n overlay: el,\r\n stage: el.find('.date-range-picker'),\r\n datepickerEl: el.find('.datepicker-parent')\r\n };\r\n controller.init(elements);\r\n }\r\n };\r\n });\r\n})(Search || (Search = {}));\r\n;\r\nvar Search;\r\n(function (Search) {\r\n var DurationPicker = /** @class */ (function () {\r\n function DurationPicker($scope, $timeout, animationUtil) {\r\n this.$scope = $scope;\r\n this.$timeout = $timeout;\r\n this.animationUtil = animationUtil;\r\n this.eventNamespace = 'durationpicker';\r\n this.options = [3, 4, 7, 10, 14, 21];\r\n this.html = $('html');\r\n }\r\n DurationPicker.prototype.init = function (elements) {\r\n var _this = this;\r\n this.elements = elements;\r\n this.$scope.$watch('dp.show', function (val) {\r\n if (val != null) {\r\n if (val) {\r\n _this.open();\r\n }\r\n else {\r\n _this.close();\r\n }\r\n }\r\n });\r\n // close if overlay is clicked\r\n this.elements.overlay.on('click.' + this.eventNamespace, function (event) {\r\n _this.$scope.$apply(function () {\r\n _this.show = false;\r\n });\r\n });\r\n this.elements.durationPicker.on('click.' + this.eventNamespace, function (event) {\r\n event.stopPropagation();\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n // unbind event listeners by namespace\r\n _this.elements.overlay.off('.' + _this.eventNamespace);\r\n _this.elements.durationPicker.off('.' + _this.eventNamespace);\r\n _this.html.off('.' + _this.eventNamespace);\r\n });\r\n };\r\n DurationPicker.prototype.selectDuration = function (duration) {\r\n var _this = this;\r\n // set the model\r\n this.duration = duration;\r\n this.$timeout(function () {\r\n // timeout allows model to update\r\n _this.select();\r\n });\r\n };\r\n DurationPicker.prototype.open = function () {\r\n var _this = this;\r\n this.animationUtil.lockScroll();\r\n this.elements.overlay\r\n .addClass('fade-in')\r\n .removeClass('fade-out');\r\n this.html.on('keyup.' + this.eventNamespace, function (event) {\r\n // ESCAPE to close\r\n if (event.which === 27 && _this.show) {\r\n _this.$scope.$apply(function () {\r\n _this.show = false;\r\n });\r\n }\r\n });\r\n };\r\n DurationPicker.prototype.close = function () {\r\n this.elements.overlay\r\n .addClass('fade-out')\r\n .removeClass('fade-in');\r\n this.html.off('.' + this.eventNamespace);\r\n };\r\n return DurationPicker;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('durationPicker', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: DurationPicker,\r\n controllerAs: 'dp',\r\n bindToController: {\r\n duration: '=',\r\n select: '&',\r\n show: '='\r\n },\r\n templateUrl: 'partials/search/durationpicker',\r\n link: function (scope, el, attr, controller) {\r\n var elements = {\r\n overlay: el,\r\n durationPicker: el.find('.duration-picker')\r\n };\r\n controller.init(elements);\r\n }\r\n };\r\n });\r\n})(Search || (Search = {}));\r\n/*\r\n Handles focus on search unit on small screens\r\n*/\r\nvar TR;\r\n(function (TR) {\r\n var ErrorFocusHandler = /** @class */ (function () {\r\n function ErrorFocusHandler($scope, $element, $window) {\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.$window = $window;\r\n $scope.$on('flash:error', function (ev, msg) {\r\n if (msg) {\r\n var header = $('#navbarcont');\r\n if (header) {\r\n var targetHeight = $element.offset().top - header.outerHeight();\r\n if ($window.scrollY > targetHeight) {\r\n $window.scrollTo(0, targetHeight);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n return ErrorFocusHandler;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('errorFocusHandler', function () {\r\n return {\r\n restrict: 'A',\r\n controller: ErrorFocusHandler,\r\n controllerAs: 'ef',\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar Search;\r\n(function (Search) {\r\n var InputWithIcon = /** @class */ (function () {\r\n function InputWithIcon($scope) {\r\n this.$scope = $scope;\r\n this.eventNamespace = 'inputwithicon';\r\n this.active = false;\r\n }\r\n InputWithIcon.prototype.init = function (el) {\r\n var _this = this;\r\n var input = el.find('input');\r\n //this.iconName && el.addClass('icon-' + this.iconName);\r\n this.addToggle && el.addClass('toggle');\r\n if (this.iconName) {\r\n el.prepend('<span class=\"field-icon icon-' + this.iconName + '\"></span>');\r\n }\r\n input.on('focus.' + this.eventNamespace, function () {\r\n _this.$scope.$apply(function () {\r\n el.addClass('with-focus');\r\n });\r\n }).on('blur.' + this.eventNamespace, function () {\r\n _this.$scope.$apply(function () {\r\n el.removeClass('with-focus');\r\n });\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n // unbind event listeners by namespace\r\n input.off('.' + _this.eventNamespace);\r\n });\r\n };\r\n return InputWithIcon;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('inputWithIcon', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n transclude: true,\r\n template: \"<div class=\\\"input-with-icon\\\" \\n ng-class=\\\"{'no-icon': iwi.iconName === ''}\\\" ng-transclude />\",\r\n controller: InputWithIcon,\r\n controllerAs: 'iwi',\r\n bindToController: {\r\n iconName: '@',\r\n addToggle: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Search || (Search = {}));\r\n/* tslint:disable:max-line-length */\r\n/// <reference path='../../core/services/resource.service.ts'/>\r\nvar Search;\r\n(function (Search) {\r\n var IntegratedSearchTab = /** @class */ (function () {\r\n function IntegratedSearchTab(searchType, tabPanel, titleResource, icons) {\r\n this.searchType = searchType;\r\n this.tabPanel = tabPanel;\r\n this.titleResource = titleResource;\r\n this.icons = icons;\r\n }\r\n return IntegratedSearchTab;\r\n }());\r\n var IntegratedSearch = /** @class */ (function () {\r\n function IntegratedSearch($route, $scope, $q, searchUnitService) {\r\n var _this = this;\r\n this.$route = $route;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.searchUnitService = searchUnitService;\r\n // Private\r\n this.tabs = [];\r\n this.prepareTabs();\r\n // select the initial tab\r\n $q.when(this.preselectTab\r\n ? parseInt(this.preselectTab, 10)\r\n : this.searchUnitService.getLastSearchType()).then(function (result) {\r\n _this.searchType = result || Search.UnifiedSearchType.Holidays; // todo: this should use a \"default search type\" config setting\r\n _this.tabPanel = _this.getTabPanel(_this.searchType);\r\n //select the first supported tab by default;\r\n if (!_this.tabPanel) {\r\n _this.searchType = _this.tabs[0].searchType;\r\n _this.tabPanel = _this.getTabPanel(_this.searchType);\r\n }\r\n });\r\n if (!TRPCONFIG.Domain.NoDatesYetEnabled) {\r\n this.overrideAllowNoDatesYet = 'false';\r\n }\r\n }\r\n ;\r\n IntegratedSearch.prototype.getClearForm = function () {\r\n return !!(TRPCONFIG.Domain.isAgentMode && this.clearFormInAgentMode === 'true');\r\n };\r\n IntegratedSearch.prototype.selectTab = function (tab) {\r\n if (!tab.href) {\r\n this.searchType = tab.searchType;\r\n this.tabPanel = tab.tabPanel;\r\n }\r\n };\r\n ;\r\n IntegratedSearch.prototype.prepareTabs = function () {\r\n var _this = this;\r\n var push = function (tab) {\r\n var isSupported = _.filter(TRPCONFIG.Domain.SupportedProductNames, function (t) { return t === Search.UnifiedSearchType[tab.searchType]; }).length;\r\n if (isSupported) {\r\n tab.isVisible = !_this.includedTabs || _this.includedTabs.indexOf(tab.searchType) > -1;\r\n _this.tabs.push(tab);\r\n }\r\n };\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Holidays, 'unified', 'SEARCHUNITTITLEHOLIDAYS', ['flights', 'hotels']));\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.HolidayDeals, 'holidaydeals', 'MENUDEALS', ['sun']));\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Hotels, 'unified', 'SEARCHUNITTITLEHOTELS', ['hotels']));\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Flights, 'unified', 'SEARCHUNITTITLEFLIGHTS', ['flights']));\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Transfers, 'transfers', 'SEARCHUNITTITLETRANSFERS', ['transfers']));\r\n var cruiseTab = new IntegratedSearchTab(Search.UnifiedSearchType.Cruises, 'cruises', 'SEARCHUNITTITLECRUISES', ['cruise']);\r\n cruiseTab.href = TRPCONFIG.Domain.CruiseRootUrl + \"/?utm_source=Cruise%20Button&utm_medium=TR%20Homepage&utm_campaign=Travel%20Republic%20Cruise%20Button\";\r\n push(cruiseTab);\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Marhaba, 'marhaba', 'MARHABA', ['marhaba-outline']));\r\n push(new IntegratedSearchTab(Search.UnifiedSearchType.Insurance, 'insurance', 'INSURANCE', ['insurance']));\r\n };\r\n IntegratedSearch.prototype.getTabPanel = function (searchType) {\r\n var tab = _.find(this.tabs, { searchType: searchType });\r\n return tab && tab.tabPanel;\r\n };\r\n return IntegratedSearch;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('integratedSearch', function () {\r\n return {\r\n scope: {},\r\n controller: IntegratedSearch,\r\n controllerAs: 'is',\r\n bindToController: {\r\n preselectTab: '@',\r\n includedTabs: '=?',\r\n hiddenQueryString: '@',\r\n fid: '@',\r\n trackDefaultParameters: '@',\r\n clearFormInAgentMode: '@',\r\n overrideAllowNoDatesYet: '@',\r\n isFlexibleTripType: '=?',\r\n disableResetOptions: '@?'\r\n },\r\n templateUrl: 'partials/search/integratedsearch',\r\n replace: true,\r\n restrict: 'E'\r\n };\r\n });\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var OccupancyPicker = /** @class */ (function () {\r\n function OccupancyPicker($scope, $route, $timeout, animationUtil, unifiedSearchService) {\r\n this.$scope = $scope;\r\n this.$route = $route;\r\n this.$timeout = $timeout;\r\n this.animationUtil = animationUtil;\r\n this.unifiedSearchService = unifiedSearchService;\r\n this.invalid = false;\r\n this.ranges = {\r\n rooms: [],\r\n childAges: [],\r\n adults: [],\r\n children: [],\r\n adultsInAdditionalRooms: [],\r\n childrenInAdditionalRooms: []\r\n };\r\n this.eventNamespace = 'occupancypicker';\r\n this.html = $('html');\r\n }\r\n OccupancyPicker.prototype.init = function (elements) {\r\n var _this = this;\r\n this.elements = elements;\r\n this.$scope.$watch('op.show', function (val) {\r\n if (val != null) {\r\n if (val) {\r\n _this.open();\r\n }\r\n else {\r\n _this.close();\r\n }\r\n }\r\n });\r\n this.$scope.$watch('op.localModel', function (val) {\r\n if (val) {\r\n // sanity check each room and sum children\r\n _this.children = 0;\r\n _.each(val, function (room, index) {\r\n room = room || new Search.SearchOccupancy;\r\n room.ChildAges = room.ChildAges || [];\r\n room.Adults = room.Adults || 2;\r\n val[index] = room;\r\n _this.children += room.ChildAges.length;\r\n });\r\n // assume we are no longer invalid\r\n _this.invalid = false;\r\n }\r\n }, true);\r\n this.$scope.$on('$destroy', function () {\r\n // unbind event listeners by namespace\r\n _this.elements.overlay.off('.' + _this.eventNamespace);\r\n _this.elements.occupancyPicker.off('.' + _this.eventNamespace);\r\n _this.html.off('.' + _this.eventNamespace);\r\n });\r\n };\r\n OccupancyPicker.prototype.open = function () {\r\n var _this = this;\r\n // ensure that numerical ranges are consistent with the current parameter attribues\r\n this.setRanges();\r\n // create a local copy of our model\r\n this.localModel = _.cloneDeep(this.model);\r\n this.checkRooms();\r\n this.animationUtil.lockScroll();\r\n this.elements.overlay.addClass('fade-in');\r\n this.html.on('keyup.' + this.eventNamespace, function (event) {\r\n // ESCAPE to close\r\n if (event.which === 27 && _this.show) {\r\n _this.$scope.$apply(function () {\r\n _this.show = false;\r\n });\r\n }\r\n });\r\n // close if overlay is clicked\r\n this.elements.overlay.on('click.' + this.eventNamespace, function (event) {\r\n _this.$scope.$apply(function () { return _this.closeClicked(null); });\r\n });\r\n this.elements.stage.on('click.' + this.eventNamespace, function (event) { return event.stopPropagation(); });\r\n };\r\n OccupancyPicker.prototype.checkRooms = function () {\r\n if (this.maxRooms === 0 && this.localModel.length > 1) {\r\n // we need to reduce the occupancy array to a single room, summing values therein\r\n var mergedRoom = new Search.SearchOccupancy;\r\n mergedRoom.Adults = 0;\r\n mergedRoom = _.reduce(this.localModel, merge, mergedRoom);\r\n this.localModel = [mergedRoom];\r\n }\r\n function merge(memo, next) {\r\n memo.Adults += next.Adults;\r\n memo.ChildAges = memo.ChildAges.concat(next.ChildAges);\r\n return memo;\r\n }\r\n };\r\n OccupancyPicker.prototype.setRanges = function () {\r\n this.ranges.rooms = _.range(1, this.maxRooms + 1);\r\n this.ranges.adults = _.range(1, this.maxAdults + 1);\r\n this.ranges.adultsInAdditionalRooms = _.range(1, this.maxAdultsInAdditionalRooms + 1);\r\n this.ranges.children = _.range(0, this.maxChildren + 1);\r\n this.ranges.childrenInAdditionalRooms = _.range(0, this.maxChildrenInAdditionalRooms + 1);\r\n this.ranges.childAges = _.range(0, this.maxChildAge + 1);\r\n };\r\n OccupancyPicker.prototype.getAdultsPerRoom = function (index) {\r\n return index === 0 ? this.ranges.adults : this.ranges.adultsInAdditionalRooms;\r\n };\r\n OccupancyPicker.prototype.getChidrenPerRoom = function (index) {\r\n return index === 0 ? this.ranges.children : this.ranges.childrenInAdditionalRooms;\r\n };\r\n OccupancyPicker.prototype.close = function () {\r\n this.animationUtil.restoreScroll();\r\n this.elements.overlay.removeClass('fade-in');\r\n this.html.off('.' + this.eventNamespace);\r\n };\r\n OccupancyPicker.prototype.closeClicked = function (event) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n this.show = false;\r\n $(window).unbind('resize');\r\n };\r\n OccupancyPicker.prototype.done = function () {\r\n var _this = this;\r\n // validate\r\n if (!this.unifiedSearchService.validateOccupancy(this.localModel)) {\r\n this.invalid = true;\r\n return;\r\n }\r\n // apply changes from our local model to the true model\r\n this.model = _.cloneDeep(this.localModel);\r\n this.$timeout(function () {\r\n _this.show = false;\r\n });\r\n };\r\n OccupancyPicker.prototype.addRoom = function ($event) {\r\n // required to prevent unexpected scrolling\r\n $event.stopPropagation();\r\n $event.preventDefault();\r\n this.localModel.push(new Search.SearchOccupancy);\r\n };\r\n OccupancyPicker.prototype.removeRoom = function (index, $event) {\r\n $event.stopPropagation();\r\n $event.preventDefault();\r\n this.localModel.splice(index, 1);\r\n };\r\n return OccupancyPicker;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('occupancyPicker', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: OccupancyPicker,\r\n controllerAs: 'op',\r\n bindToController: {\r\n model: '=',\r\n maxRooms: '=',\r\n maxAdults: '=',\r\n maxChildren: '=',\r\n maxChildAge: '=',\r\n maxAdultsInAdditionalRooms: '=',\r\n maxChildrenInAdditionalRooms: '=',\r\n select: '&',\r\n show: '='\r\n },\r\n templateUrl: 'partials/search/occupancypicker',\r\n link: function (scope, el, attr, controller) {\r\n var stage = el.find('.occupancy-picker');\r\n var elements = {\r\n overlay: el,\r\n stage: stage,\r\n occupancyPicker: stage\r\n };\r\n controller.init(elements);\r\n }\r\n };\r\n });\r\n})(Search || (Search = {}));\r\n/* tslint:disable:max-line-length */\r\n/// <reference path='../../core/services/resource.service.ts'/>\r\n/// <reference path='../../core/services/resource.service.ts'/>\r\nvar Search;\r\n(function (Search_1) {\r\n var Tab = /** @class */ (function () {\r\n function Tab(id, type, name, options) {\r\n this.id = id;\r\n this.type = type;\r\n this.name = name;\r\n angular.extend(this, options);\r\n }\r\n return Tab;\r\n }());\r\n var Search = /** @class */ (function () {\r\n function Search($route, $q, broker, searchUnitService, unifiedSearchService, $scope, destinationService, searchQueryString, $timeout, preferences, $locale) {\r\n var _this = this;\r\n this.$route = $route;\r\n this.$q = $q;\r\n this.broker = broker;\r\n this.searchUnitService = searchUnitService;\r\n this.unifiedSearchService = unifiedSearchService;\r\n this.$scope = $scope;\r\n this.destinationService = destinationService;\r\n this.searchQueryString = searchQueryString;\r\n this.$timeout = $timeout;\r\n this.preferences = preferences;\r\n this.$locale = $locale;\r\n this.tabs = {\r\n 1: new Tab(1, Search_1.UnifiedSearchType.Holidays, 'holidays', { maxAge: TRPCONFIG.Domain.MaxChildAgeForHolidays }),\r\n 2: new Tab(2, Search_1.UnifiedSearchType.Hotels, 'hotels'),\r\n 3: new Tab(3, Search_1.UnifiedSearchType.Flights, 'flights', { maxAge: TRPCONFIG.Domain.MaxChildAgeForFlights, multiRoomDisabled: true }),\r\n 4: new Tab(4, null, 'transfers', ''),\r\n 5: new Tab(5, null, 'cruises', ''),\r\n 6: new Tab(6, null, 'marhaba', ''),\r\n 7: new Tab(7, null, 'holidayDeals', ''),\r\n 8: new Tab(8, null, 'insurance', '')\r\n };\r\n this.allowNoDatesYet = true;\r\n this.currencyOptions = TRPCONFIG.Domain.CurrencyOptions.split('|');\r\n this.userSession = sessionStorage.getItem('scope.user');\r\n this.bookingRef = this.bookingInfo(this.userSession);\r\n this.expandedOptions = false;\r\n this.searchOpened = false;\r\n if (TRPCONFIG.Domain.PassThroughSearchToIntegratedSearch) {\r\n return;\r\n }\r\n this.checksigninstatus();\r\n this.model = this.unifiedSearchService.getDefaultModel();\r\n this.cabins = searchUnitService.getCabinOptions();\r\n this.updateNoDatesYet();\r\n this.airlines = searchQueryString.allAirlines;\r\n this.supportedTabIds = _.chain(TRPCONFIG.Domain.SupportedProductNames)\r\n .map(function (name) { return _this.findTabId(name); })\r\n .filter(function (tabId) { return !!tabId; })\r\n .value();\r\n var intersection = this.includedTabIds ? _.intersection(this.supportedTabIds, this.includedTabIds) : this.supportedTabIds;\r\n this.showTabs = intersection.length > 1;\r\n var tabIdToSelect = this.getPreselectTabId();\r\n this.selectTab(tabIdToSelect);\r\n var clearForm = TRPCONFIG.Domain.isAgentMode && this.clearFormInAgentMode === 'true';\r\n if (!clearForm) {\r\n this.unifiedSearchService.getQueryStringValues(this.hiddenQueryString).then(function (queryStringValues) {\r\n _this.unifiedSearchService\r\n .prepopulateModel(_this.model, queryStringValues);\r\n _this.expandedOptions = (function () {\r\n if (!angular.isUndefined(queryStringValues.expandedOptions)) {\r\n return queryStringValues.expandedOptions;\r\n }\r\n if (TRPCONFIG.Domain.PrefilterAirlineEnabled && _this.model.airlines && _this.model.airlines.length) {\r\n return true;\r\n }\r\n if (TRPCONFIG.Domain.PrefilterDirectFlightsEnabled && _this.model.prefilterDirectFlights) {\r\n return true;\r\n }\r\n return false;\r\n })();\r\n if (queryStringValues.autoSearch) {\r\n if (queryStringValues.sortOrder) {\r\n _this.preferences.setHotelSortOrder(parseInt(queryStringValues.sortOrder, 10));\r\n }\r\n _this.$timeout(function () { return _this.search(true); }, 1000);\r\n }\r\n });\r\n }\r\n this.$scope.$watchCollection(function () { return _this.model.destination; }, function (val) {\r\n //Ensure that destination is always an array.\r\n if (val && angular.isUndefined(val.length)) {\r\n val = _this.model.destination = [val];\r\n }\r\n if (val && val[0]) {\r\n //This call mutates the destination:\r\n _this.destinationService.getDetails(val[0]).then(function (dest) {\r\n broker.publish('destinationChanged', dest);\r\n _this.loadOutboundDates(_this.model.airports, dest);\r\n });\r\n }\r\n var searchLookupType = val && val[0] && val[0].searchLookupType;\r\n _this.updateNoDatesYet(searchLookupType);\r\n });\r\n this.$scope.$watchCollection(function () { return _this.model.airports; }, function (val) { return _this.loadOutboundDates(val, _this.model.destination); });\r\n if (!_.isEmpty(TRPCONFIG.Domain.FixedDepartureAirportOptions)) {\r\n this.broker.subscribe('holidaySearch', 'departureAirportsChanged', function (v) {\r\n var currentAirports = _this.model.airports.reduce(function (acc, airport) {\r\n return acc[airport.Code] = airport;\r\n }, {});\r\n var updatedAirports = v.data.Code.split(',').map(function (code) { return currentAirports[code] || ({ Code: code }); });\r\n _this.model.airports = updatedAirports;\r\n });\r\n }\r\n this.broker.subscribe('holidaySearch', 'RegionalContextSelected', function () {\r\n //reset the preferences when switching between POS\r\n _this.model.airports = [];\r\n _this.unifiedSearchService.saveSearchModel(_this.model);\r\n });\r\n }\r\n ;\r\n Search.prototype.checksigninstatus = function () {\r\n var user = sessionStorage.getItem('scope.user');\r\n if (!user) {\r\n document.querySelector('.myb-search-signout').style.display = 'none';\r\n document.querySelector('.myb-search-signin').style.display = 'block';\r\n }\r\n else {\r\n document.querySelector('.myb-search-signout').style.display = 'block';\r\n document.querySelector('.myb-search-signin').style.display = 'none';\r\n }\r\n };\r\n Search.prototype.bookingInfo = function (session) {\r\n session = JSON.parse(session);\r\n if (session) {\r\n return session.BookingSummary.BookingRef;\r\n }\r\n };\r\n Search.prototype.selectTab = function (tabId) {\r\n this.$scope.$broadcast('flash:hide');\r\n this.tab = this.tabs[tabId];\r\n if (this.$route.current && this.$route.current['$$route']) {\r\n this.$route.current['$$route'].area = this.tab.name;\r\n }\r\n this.loadOutboundDates(this.model.airports, this.model.destination);\r\n };\r\n ;\r\n Search.prototype.includeTab = function (tabId) {\r\n var isIncluded = !this.includedTabIds || !this.includedTabIds.length || this.includedTabIds.indexOf(tabId) >= 0, isSupported = !this.supportedTabIds || !this.supportedTabIds.length || this.supportedTabIds.indexOf(tabId) >= 0;\r\n return isIncluded && isSupported;\r\n };\r\n Search.prototype.getPreselectTabId = function () {\r\n var _this = this;\r\n var tabId = this.findTabId(this.preselectTab);\r\n if (tabId && this.includeTab(tabId)) {\r\n return tabId;\r\n }\r\n return _.find(this.tabs, function (t) { return _this.includeTab(t.id); }).id;\r\n };\r\n Search.prototype.findTabId = function (tabNameOrNumber) {\r\n if (!tabNameOrNumber) {\r\n return;\r\n }\r\n var tabId = parseInt(tabNameOrNumber, 10);\r\n if (tabId > 0 && this.tabs[tabId]) {\r\n return tabId;\r\n }\r\n tabNameOrNumber = (tabNameOrNumber + '').toLowerCase();\r\n var tab = _.find(this.tabs, function (t) { return t.name.toLowerCase() === tabNameOrNumber; });\r\n if (tab) {\r\n return tab.id;\r\n }\r\n };\r\n Search.prototype.updateNoDatesYet = function (searchLookupType) {\r\n if (this.overrideAllowNoDatesYet) {\r\n this.allowNoDatesYet = this.overrideAllowNoDatesYet === 'true';\r\n }\r\n else {\r\n this.allowNoDatesYet = !searchLookupType || searchLookupType === 'hotels';\r\n }\r\n if (!this.allowNoDatesYet) {\r\n this.model.noDatesYet = false;\r\n }\r\n };\r\n Search.prototype.checkScreensize = function () {\r\n var searchPanel = document.querySelectorAll('.ekh-search-panel')[0];\r\n if (window.innerWidth <= 880 && this.searchOpened === false) {\r\n searchPanel.classList.add('panel-hide');\r\n }\r\n else {\r\n searchPanel.classList.remove('panel-hide');\r\n }\r\n };\r\n Search.prototype.displaySearch = function () {\r\n var isMobile = TRPCONFIG.IsMobileView;\r\n if (!isMobile) {\r\n var t_1 = this;\r\n window.addEventListener('resize', function () {\r\n t_1.checkScreensize();\r\n });\r\n }\r\n this.checkScreensize();\r\n };\r\n Search.prototype.toggleSearch = function () {\r\n this.searchOpened = this.searchOpened ? false : true;\r\n var searchClasses = document.querySelectorAll('.ekh-search-panel')[0].classList;\r\n searchClasses.toggle('panel-hide');\r\n };\r\n Search.prototype.convertDateToISO = function (date, shortMonth) {\r\n var d = date.split('-');\r\n var month;\r\n shortMonth.map(function (v, i) {\r\n if (d[1] === v) {\r\n var m = i + 1;\r\n if (m < 10) {\r\n month = \"0\" + m;\r\n }\r\n else {\r\n month = m.toString();\r\n }\r\n }\r\n });\r\n var convertedDate = d[2] + \"-\" + month + \"-\" + d[0] + \"T00:00:00.000Z\";\r\n return convertedDate;\r\n };\r\n Search.prototype.search = function (isAutoSearch) {\r\n var _this = this;\r\n sessionStorage.removeItem('FlightMiles');\r\n sessionStorage.removeItem('baseCost');\r\n sessionStorage.removeItem('flightFare');\r\n sessionStorage.removeItem('SkywardsMiles');\r\n sessionStorage.removeItem('SkywardsMilesFlights');\r\n sessionStorage.removeItem('FlightPerPersonMiles');\r\n sessionStorage.removeItem('BrandedFareDetailsSessionId');\r\n sessionStorage.removeItem('chargeDates');\r\n TRPCONFIG.Domain.FlightMiles = '';\r\n TRPCONFIG.Domain.SkywardsInfo = '';\r\n TRPCONFIG.Domain.SkywardsFlightMiles = '';\r\n TRPCONFIG.Domain.BrandedFareCancellations = '';\r\n TRPCONFIG.Domain.CancellationData = '';\r\n TRPCONFIG.Domain.TransferPrice = 0;\r\n var start = document.getElementsByClassName('searchDates')[0].value;\r\n var end = document.getElementsByClassName('searchDates')[1].value;\r\n var searchData = {\r\n ISOstartDate: start ? this.convertDateToISO(start, this.$locale.DATETIME_FORMATS.SHORTMONTH) : '',\r\n ISOendDate: end ? this.convertDateToISO(end, this.$locale.DATETIME_FORMATS.SHORTMONTH) : '',\r\n startDate: start,\r\n endDate: end\r\n };\r\n sessionStorage.setItem('searchDates', JSON.stringify(searchData));\r\n return this.destinationService.getDetails(this.model.destination[0]).then(function (dest) {\r\n return _this.loadOutboundDates(_this.model.airports, dest).then(function () { return dest; });\r\n }).then(function (dest) {\r\n //creating a copy of the model to use to run a search.\r\n var destination = _.assign({}, _this.model.destination[0], dest);\r\n var model = _.assign({}, _this.model, { destination: [destination] });\r\n return _this.unifiedSearchService.launchSearch(model, _this.tab.type || Search_1.UnifiedSearchType.Holidays, _this.fid, !isAutoSearch, false, false);\r\n });\r\n };\r\n ;\r\n Search.prototype.loadOutboundDates = function (airports, destination) {\r\n var _this = this;\r\n var getRequest = function () {\r\n if (_this.tab.id !== 1 && _this.tab.id !== 3) {\r\n return _this.$q.when(null);\r\n }\r\n if (!airports || !airports.length) {\r\n return _this.$q.when(null);\r\n }\r\n var DepartureAirportCodes = _.map(airports, function (a) { return a.Code; });\r\n destination = destination && destination[0] || destination;\r\n var codes = destination && (destination.Code || destination.DestinationAirports);\r\n var DestinationAirportCodes = codes && codes.split(',');\r\n if (DestinationAirportCodes && DestinationAirportCodes.length) {\r\n return _this.$q.when({\r\n DepartureAirportCodes: DepartureAirportCodes,\r\n DestinationAirportCodes: DestinationAirportCodes\r\n });\r\n }\r\n return _this.$q.when(null);\r\n };\r\n return getRequest()\r\n .then(function (r) { return _this.searchUnitService.loadOutboundDates(r); })\r\n .then(function (outboundDates) {\r\n _this.enabledDates = outboundDates;\r\n });\r\n };\r\n return Search;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('search', function () {\r\n return {\r\n scope: {},\r\n controller: Search,\r\n controllerAs: 'search',\r\n bindToController: {\r\n moreOptions: '=',\r\n preselectTab: '@',\r\n overrideAllowNoDatesYet: '@',\r\n includedTabIds: '=?',\r\n fid: '=?',\r\n clearFormInAgentMode: '@',\r\n hiddenQueryString: '@',\r\n trackDefaultParameters: '@',\r\n resetDuration: '=?',\r\n isFlexibleTripType: '=?',\r\n disableResetOptions: '@?'\r\n },\r\n templateUrl: TRPCONFIG.Domain.PassThroughSearchToIntegratedSearch\r\n || new RegExp(/[a-z]{3,4}:[a-z]{3,4}/g).test(TRPCONFIG.Domain.RedirectTemplates)\r\n ? 'partials/search/integrated'\r\n : 'partials/search/search',\r\n replace: true,\r\n restrict: 'E',\r\n };\r\n });\r\n})(Search || (Search = {}));\r\nvar Core;\r\n(function (Core) {\r\n var SelectBoxItem = /** @class */ (function () {\r\n function SelectBoxItem() {\r\n }\r\n return SelectBoxItem;\r\n }());\r\n var selectBoxItemId = 0;\r\n var SelectBox = /** @class */ (function () {\r\n function SelectBox($scope, $document) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$document = $document;\r\n this.eventNamespace = 'selectbox';\r\n this.isOpen = false;\r\n this.isMenuRendered = false;\r\n this.buttonEvents = {\r\n 'click': function (event) {\r\n _this.toggle(event);\r\n },\r\n 'keydown': function (event) {\r\n var preventDefault = true;\r\n switch (event.keyCode) {\r\n // Tab / Escape\r\n case 9:\r\n case 27:\r\n _this.close();\r\n preventDefault = false;\r\n break;\r\n // Enter\r\n case 13:\r\n _this.toggle(event);\r\n break;\r\n // Up\r\n case 38:\r\n if (event.altKey) {\r\n _this.toggle(event);\r\n }\r\n else {\r\n _this.move('prev', event);\r\n }\r\n break;\r\n // Down\r\n case 40:\r\n if (event.altKey) {\r\n _this.toggle(event);\r\n }\r\n else {\r\n _this.move('next', event);\r\n }\r\n break;\r\n // Home / Page Up\r\n case 36:\r\n case 33:\r\n _this.move('first', event);\r\n break;\r\n // End / Page Down\r\n case 35:\r\n case 34:\r\n _this.move('last', event);\r\n break;\r\n default:\r\n var prev = _this.previousFilter || '';\r\n var skip = false;\r\n // Support number pad values\r\n var character = event.keyCode >= 96 && event.keyCode <= 105 ?\r\n (event.keyCode - 96).toString() : String.fromCharCode(event.keyCode);\r\n clearTimeout(_this.filterTimer);\r\n if (character === prev) {\r\n skip = true;\r\n }\r\n else {\r\n character = prev + character;\r\n }\r\n var matching = _this.filterMenuItems(character);\r\n //match = skip && match.index(this.active.next()) !== -1 ?\r\n // this.active.nextAll( \".ui-menu-item\" ) : match;\r\n // If no matches on the current filter, reset to the last character pressed\r\n // to move down the menu to the first item that starts with that character\r\n if (!matching.length) {\r\n character = String.fromCharCode(event.keyCode);\r\n matching = _this.filterMenuItems(character);\r\n }\r\n if (matching.length) {\r\n var match = matching[0];\r\n _this.select(match);\r\n _this.previousFilter = character;\r\n _this.filterTimer = setTimeout(function () {\r\n delete _this.previousFilter;\r\n }, 1000);\r\n }\r\n else {\r\n delete _this.previousFilter;\r\n }\r\n //this.menu.trigger(event);\r\n preventDefault = false;\r\n }\r\n preventDefault && event.preventDefault();\r\n }\r\n };\r\n this.menuEvents = {\r\n 'mousedown': function (event) {\r\n // Prevent the menu from recieving focus. We want to retain focus on the button.\r\n event.preventDefault();\r\n var menuItem = $(event.currentTarget);\r\n _this.select(menuItem.data('SelectBoxItem'));\r\n _this.close();\r\n },\r\n 'mouseover': function (event) {\r\n var menuItem = $(event.currentTarget);\r\n _this.setActiveItem(menuItem);\r\n }\r\n };\r\n }\r\n SelectBox.prototype.init = function (el, attrs) {\r\n var _this = this;\r\n this.element = el;\r\n var id = this.element.attr('id');\r\n this.ids = {\r\n element: id,\r\n button: id + '-button',\r\n menu: id + '-menu'\r\n };\r\n this.drawWrapper();\r\n this.drawButton();\r\n this.drawMenu();\r\n // watch the model\r\n this.$scope.$watch('sb.model', function (val, old) {\r\n _this.setButtonText();\r\n if (_this.isMenuRendered) {\r\n _this.setActiveItem(_this.getSelectedMenuItem());\r\n }\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n // unbind event listeners by namespace\r\n _this.button.off('.' + _this.eventNamespace);\r\n _this.menu.off('.' + _this.eventNamespace);\r\n });\r\n };\r\n SelectBox.prototype.drawWrapper = function () {\r\n var div = $('<div>').addClass('select-box');\r\n this.element.wrap(div);\r\n this.wrapper = this.element.parent();\r\n };\r\n SelectBox.prototype.drawButton = function () {\r\n var _this = this;\r\n // Hide the original select element\r\n this.element.hide();\r\n // Create new button\r\n this.button = $('<span>', {\r\n class: 'select-box-button',\r\n tabindex: 0,\r\n id: this.ids.button,\r\n role: 'combobox',\r\n 'aria-expanded': 'false',\r\n 'aria-autocomplete': 'list',\r\n 'aria-owns': this.ids.menu,\r\n 'aria-haspopup': 'true',\r\n title: this.element.attr('title')\r\n }).insertAfter(this.element);\r\n var label = $('<span>', {\r\n class: 'select-box-button-label'\r\n }).appendTo(this.button);\r\n // pre-text\r\n if (this.labelText) {\r\n $('<span>', {\r\n class: 'select-box-pre-text',\r\n text: this.labelText + ':'\r\n }).appendTo(label);\r\n }\r\n // dynamic text (matches selected option)\r\n this.buttonText = $('<span>', {\r\n class: 'select-box-text'\r\n }).appendTo(label);\r\n // // icon\r\n // if (this.iconName) {\r\n // $('<i>', {\r\n // class: 'select-box-icon icon-' + this.iconName\r\n // }).appendTo(this.button);\r\n // }\r\n // assign button event listeners\r\n _.forEach(this.buttonEvents, function (handler, eventName) {\r\n _this.button.on(eventName + '.' + _this.eventNamespace, handler);\r\n });\r\n this.button.one('focusin', function () {\r\n // Rendering the menu items when the button receives focus\r\n _this.refreshMenu();\r\n });\r\n };\r\n SelectBox.prototype.drawMenu = function () {\r\n var _this = this;\r\n // Create menu\r\n this.menu = $('<ul>', {\r\n 'aria-hidden': 'true',\r\n 'aria-labelledby': this.ids.button,\r\n id: this.ids.menu\r\n });\r\n var menuWrap = $('<div>', {\r\n class: 'select-box-menu'\r\n })\r\n .append(this.menu)\r\n .insertAfter(this.button);\r\n // assign menu event listeners\r\n _.forEach(this.menuEvents, function (handler, eventName) {\r\n _this.menu.on(eventName + '.' + _this.eventNamespace, '.select-box-option', handler);\r\n });\r\n };\r\n SelectBox.prototype.toggle = function (event) {\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n else {\r\n this.open(event);\r\n }\r\n };\r\n SelectBox.prototype.open = function (event) {\r\n var _this = this;\r\n this.isOpen = true;\r\n this.setOpen();\r\n this.setActiveItem(this.getSelectedMenuItem());\r\n // close if document is clicked\r\n this.$document.on('mousedown.' + this.eventNamespace, function (event) {\r\n if (!_this.isOpen) {\r\n return;\r\n }\r\n if (!$(event.target).closest('.select-box-menu, #' + _this.ids.button).length) {\r\n _this.close();\r\n }\r\n });\r\n };\r\n SelectBox.prototype.close = function () {\r\n if (!this.isOpen) {\r\n return;\r\n }\r\n this.isOpen = false;\r\n this.setOpen();\r\n this.$document.off('.' + this.eventNamespace);\r\n };\r\n SelectBox.prototype.refreshMenu = function () {\r\n this.menu.empty();\r\n // get the native select options\r\n var options = this.element.find('option');\r\n this.parseOptions(options);\r\n this.renderMenu(this.menu, this.selectBoxItems);\r\n this.menuItems = this.menu.find('.select-box-option');\r\n // set the active menu item\r\n var menuItem = this.getSelectedMenuItem();\r\n this.isMenuRendered = true;\r\n this.setActiveItem(menuItem);\r\n };\r\n SelectBox.prototype.renderMenu = function (ul, items) {\r\n var _this = this;\r\n _.each(items, function (item, index) {\r\n _this.renderItem(ul, item);\r\n });\r\n };\r\n SelectBox.prototype.renderItem = function (ul, item) {\r\n selectBoxItemId += 1; // unique id across all instances\r\n // create new menu item\r\n var li = $('<li>');\r\n var menuItem = $('<div>', {\r\n id: 'select-box-option-' + selectBoxItemId,\r\n role: 'option',\r\n class: 'select-box-option'\r\n });\r\n // set text\r\n this.setText(menuItem, item.label);\r\n // tag data\r\n menuItem.data('SelectBoxItem', item);\r\n // append to menu\r\n li.append(menuItem).appendTo(ul);\r\n };\r\n SelectBox.prototype.parseOptions = function (options) {\r\n var _this = this;\r\n var data = [];\r\n options.each(function (index, item) {\r\n data.push(_this.parseOption($(item), index));\r\n });\r\n this.selectBoxItems = data;\r\n };\r\n SelectBox.prototype.parseOption = function (option, index) {\r\n var item = new SelectBoxItem;\r\n item.element = option;\r\n item.index = index;\r\n item.value = option.val();\r\n item.label = option.text();\r\n item.disabled = option.prop('disabled');\r\n return item;\r\n };\r\n SelectBox.prototype.getSelectedMenuItem = function () {\r\n // get the menu item corresponding to the native selected option\r\n return this.menuItems.eq(this.element[0].selectedIndex);\r\n };\r\n SelectBox.prototype.setOpen = function () {\r\n this.button.attr('aria-expanded', String(this.isOpen));\r\n this.menu.attr('aria-hidden', String(!this.isOpen));\r\n if (this.isOpen) {\r\n this.wrapper.addClass('select-box-open');\r\n }\r\n else {\r\n this.wrapper.removeClass('select-box-open');\r\n }\r\n };\r\n SelectBox.prototype.setText = function (element, value) {\r\n if (value) {\r\n element.text(value);\r\n }\r\n else {\r\n element.html(' ');\r\n }\r\n };\r\n SelectBox.prototype.move = function (direction, event) {\r\n var index = this.element[0].selectedIndex;\r\n var current = this.menuItems.eq(index);\r\n var filter = '.select-box-option';\r\n var nextIndex = undefined;\r\n switch (direction) {\r\n case 'prev':\r\n nextIndex = index - 1;\r\n break;\r\n case 'next':\r\n nextIndex = index + 1;\r\n break;\r\n case 'first':\r\n nextIndex = 0;\r\n break;\r\n case 'last':\r\n nextIndex = this.menuItems.length - 1;\r\n break;\r\n default:\r\n }\r\n if (nextIndex > -1 && nextIndex < (this.menuItems.length)) {\r\n var menuItem = this.menuItems.eq(nextIndex);\r\n this.select(menuItem.data('SelectBoxItem'));\r\n }\r\n };\r\n SelectBox.prototype.setActiveItem = function (menuItem) {\r\n // highlight this menu item\r\n var className = 'select-box-option-active';\r\n this.menuItems.filter('.' + className).removeClass(className);\r\n menuItem.addClass(className);\r\n // set the focus index\r\n var selectBoxItem = menuItem.data('SelectBoxItem');\r\n this.setAriaActive(selectBoxItem);\r\n };\r\n SelectBox.prototype.select = function (item) {\r\n // Change the native select element\r\n this.element[0].selectedIndex = item.index;\r\n // let angular know that the select box has changed programattically\r\n // this will trigger the model update\r\n this.element.trigger('change');\r\n };\r\n SelectBox.prototype.setAriaActive = function (item) {\r\n var id = this.menuItems.eq(item.index).attr('id');\r\n this.button.attr({\r\n 'aria-labelledby': id,\r\n 'aria-activedescendant': id\r\n });\r\n this.menu.attr('aria-activedescendant', id);\r\n };\r\n SelectBox.prototype.filterMenuItems = function (character) {\r\n var escapedCharacter = character.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&'), regex = new RegExp('^' + escapedCharacter, 'i');\r\n var matching = _.filter(this.selectBoxItems, function (item) {\r\n return regex.test(item.label);\r\n });\r\n return matching;\r\n };\r\n SelectBox.prototype.setButtonText = function () {\r\n // get the selected item from the native control\r\n var selectBoxItem = this.parseOption(this.element.find('option:selected'), this.element[0].selectedIndex);\r\n // set the button text\r\n this.setText(this.buttonText, selectBoxItem.label);\r\n };\r\n return SelectBox;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('selectBox', function () {\r\n return {\r\n restrict: 'A',\r\n scope: {},\r\n replace: true,\r\n controller: SelectBox,\r\n controllerAs: 'sb',\r\n bindToController: {\r\n model: '=ngModel',\r\n labelText: '@labelText',\r\n iconName: '@iconName'\r\n },\r\n link: function (scope, el, attrs, controller) {\r\n controller.init(el, attrs);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Search;\r\n(function (Search) {\r\n var UnifiedSearch = /** @class */ (function () {\r\n function UnifiedSearch($route, $routeParams, $q, $scope, broker, searchUnitService, unifiedSearchService, searchQueryString, destinationService, occupancyService, holidayDeals, dateUtil, animationUtil, $timeout, $location) {\r\n var _this = this;\r\n this.$route = $route;\r\n this.$routeParams = $routeParams;\r\n this.$q = $q;\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.searchUnitService = searchUnitService;\r\n this.unifiedSearchService = unifiedSearchService;\r\n this.searchQueryString = searchQueryString;\r\n this.destinationService = destinationService;\r\n this.occupancyService = occupancyService;\r\n this.holidayDeals = holidayDeals;\r\n this.dateUtil = dateUtil;\r\n this.animationUtil = animationUtil;\r\n this.$timeout = $timeout;\r\n this.$location = $location;\r\n this.showDatePicker = false;\r\n this.showOccupancyPicker = false;\r\n this.clearParams = function () {\r\n //cleardown query params - as otherwise params will override values search unit values when not necessary\r\n _this.$location.replace()\r\n .search('startDate', null)\r\n .search('endDate', null)\r\n .search('depAir', null)\r\n .search('occ', null)\r\n .search('autoSearch', null)\r\n .search('cabin', null);\r\n };\r\n this.cabinOptions = searchUnitService.getCabinOptions();\r\n this.currencyOptions = searchUnitService.getCurrencyOptions();\r\n this.airlineOptions = searchQueryString.allAirlines;\r\n this.IsRebook = !!$routeParams.BookingRef;\r\n }\r\n ;\r\n UnifiedSearch.prototype.init = function (elements) {\r\n var _this = this;\r\n this.elements = elements;\r\n this.model = this.unifiedSearchService.getDefaultModel();\r\n this.setSearchType();\r\n // watch search type\r\n this.$scope.$watch('us.searchType', function (val, old) {\r\n if (val !== old) {\r\n _this.setSearchType();\r\n }\r\n });\r\n this.$scope.$watchCollection('us.model.destination', _.debounce(function (val) {\r\n // Watch is debounced because autocompleter selection is causing two updates.\r\n if (val && val[0]) {\r\n // This call mutates the destination\r\n _this.destinationService.getDetails(val[0]).then(function (dest) {\r\n if (_this.searchType !== Search.UnifiedSearchType.Hotels) {\r\n _this.setEnabledStartDates(_this.model.destination, _this.model.airports);\r\n }\r\n });\r\n }\r\n _this.setEnabledDurations();\r\n }, 200));\r\n this.$scope.$watchCollection('us.model.airports', function (val) {\r\n if (val && val[0]) {\r\n _this.setEnabledStartDates(_this.model.destination, _this.model.airports);\r\n }\r\n });\r\n this.$scope.$watchCollection('us.model.occupancy', function (val) {\r\n if (val && val[0]) {\r\n _this.occupancyCaption = _this.occupancyService.getOccupancyString(val);\r\n }\r\n });\r\n this.$scope.$watchCollection('us.model.airlines', function (val) {\r\n if (val.length > 1) {\r\n // This search unit only supports a single airline\r\n // selection, so just keep the first option.\r\n _this.model.airlines.splice(1, 1);\r\n }\r\n if (val[0] == null) {\r\n // This is result of selecting the \"All airlines\" option from\r\n // the select box control - just remove it.\r\n _this.model.airlines.splice(0, 1);\r\n }\r\n });\r\n this.$scope.$watchGroup(['us.model.startDate', 'us.model.endDate'], function (_a) {\r\n var startDate = _a[0], endDate = _a[1];\r\n if (startDate && !endDate) {\r\n var index = 1;\r\n switch (_this.searchType) {\r\n case Search.UnifiedSearchType.Hotels:\r\n index = 0;\r\n break;\r\n case Search.UnifiedSearchType.Transfers:\r\n index = 2;\r\n break;\r\n case Search.UnifiedSearchType.Marhaba:\r\n index = 3;\r\n break;\r\n }\r\n _this.searchUnitService.endDate(index, null);\r\n _this.searchUnitService.startDate(index, startDate);\r\n _this.model.endDate = _this.searchUnitService.endDate(index);\r\n }\r\n });\r\n if (this.clearForm !== 'true') {\r\n // prepopulate the model\r\n this.unifiedSearchService.getQueryStringValues(this.hiddenQueryString).then(function (result) {\r\n var queryStringValues = result;\r\n _this.unifiedSearchService\r\n .prepopulateModel(_this.model, queryStringValues, _this.disableResetOptions)\r\n .then(function (model) {\r\n if (queryStringValues.autoSearch) {\r\n _this.$timeout(function () {\r\n _this.search(true);\r\n _this.clearParams();\r\n }, 1000);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n UnifiedSearch.prototype.setSearchType = function () {\r\n this.$scope.$broadcast('flash:hide');\r\n // get \"area\" associated with this search type\r\n this.areaName = this.unifiedSearchService.getAreaName(this.searchType);\r\n // get occupancy parameters\r\n this.occupancyConfig = this.searchUnitService.getOccupancyConfig(this.areaName);\r\n // get min start date for date range picker\r\n this.minStartDate = this.searchUnitService.getMinStartDate(this.areaName);\r\n if (this.$route.current && this.$route.current['$$route']) {\r\n this.$route.current['$$route'].area = this.areaName;\r\n }\r\n // set labels\r\n this.setLabels();\r\n this.setEnabledStartDates(this.model.destination, this.model.airports);\r\n };\r\n UnifiedSearch.prototype.setEnabledStartDates = function (destination, departureAirports) {\r\n var _this = this;\r\n if (this.flightIncluded() && departureAirports[0] && destination[0]) {\r\n // get enabled dates\r\n var dest = destination[0];\r\n var DestinationAirportCodes = (dest.Code || dest.DestinationAirports || '').split(',');\r\n if (DestinationAirportCodes && DestinationAirportCodes.length) {\r\n var request = {\r\n DepartureAirportCodes: _.map(departureAirports, 'Code'),\r\n DestinationAirportCodes: DestinationAirportCodes\r\n };\r\n return this.searchUnitService.loadOutboundDates(request)\r\n .then(function (dates) {\r\n _this.enabledStartDates = dates;\r\n return dates;\r\n });\r\n }\r\n }\r\n this.enabledStartDates = undefined;\r\n return this.$q.when(null);\r\n };\r\n UnifiedSearch.prototype.setEnabledDurations = function () {\r\n // if (!this.model.destination[0]) {\r\n // // limit to holiday deal durations\r\n // this.durations = _.clone(this.holidayDeals.DURATIONS);\r\n // } else {\r\n // this.durations.length = 0;\r\n //}\r\n this.durations = [];\r\n };\r\n UnifiedSearch.prototype.setDuration = function () {\r\n var start = this.model.startDate, end = this.model.endDate;\r\n this.model.duration = start && end ? this.dateUtil.numberOfNights(start, end) : 0;\r\n };\r\n UnifiedSearch.prototype.setEndDate = function () {\r\n var d = this.model.duration;\r\n if (this.model.startDate && d && d > 0) {\r\n var start = this.dateUtil.parseDate(this.model.startDate);\r\n this.model.endDate = this.dateUtil.addDays(start, d, true);\r\n }\r\n };\r\n UnifiedSearch.prototype.setLabels = function () {\r\n this.destinationLabel = this.hotelIncluded() ?\r\n 'UNIFIEDSEARCHDESTINATIONLABEL' : 'UNIFIEDSEARCHDESTINATIONAIRPORTLABEL';\r\n this.destinationPlaceholder = this.hotelIncluded() ?\r\n 'UNIFIEDSEARCHDESTINATIONPLACEHOLDER' : 'UNIFIEDSEARCHDESTINATIONAIRPORTPLACEHOLDER';\r\n this.searchTypeName = this.unifiedSearchService.getAreaName(this.searchType);\r\n };\r\n UnifiedSearch.prototype.getHotelSearchButtonLabel = function () {\r\n return this.searchType === Search.UnifiedSearchType.Hotels && this.model.noDatesYet ?\r\n 'FINDHOTELS' : 'SEARCHBUTTONTEXT';\r\n };\r\n UnifiedSearch.prototype.search = function (isAutoSearch, isFlexibleTripType) {\r\n var _this = this;\r\n var dest;\r\n return this.destinationService.getDetails(this.model.destination[0])\r\n .then(function (d) {\r\n dest = d;\r\n if (_this.searchType !== Search.UnifiedSearchType.Hotels) {\r\n return _this.setEnabledStartDates([dest], _this.model.airports);\r\n }\r\n })\r\n .then(function () {\r\n //creating a copy of the model to use to run a search.\r\n var destination = _.assign({}, _this.model.destination[0], dest);\r\n var modelCopy = _.assign({}, _this.model, {\r\n destination: [destination]\r\n });\r\n modelCopy.onewayonly = _this.oneWayFlightIncluded() && _this.model.onewayonly;\r\n _this.unifiedSearchService.launchSearch(modelCopy, _this.searchType, _this.fid, !isAutoSearch, false, isFlexibleTripType);\r\n });\r\n };\r\n UnifiedSearch.prototype.reset = function () {\r\n // reset the search unit\r\n this.model = this.unifiedSearchService.getDefaultModel();\r\n };\r\n UnifiedSearch.prototype.selectDestination = function () {\r\n };\r\n UnifiedSearch.prototype.selectDateRange = function () {\r\n this.setDuration();\r\n this.showDatePicker = false;\r\n };\r\n UnifiedSearch.prototype.openDatePicker = function (event) {\r\n this.showDatePicker = true;\r\n this.openPicker(event, $('.date-range-picker'), 12, 0);\r\n };\r\n UnifiedSearch.prototype.openOccupancyPicker = function (event) {\r\n this.showOccupancyPicker = true;\r\n this.openPicker(event, $('.occupancy-picker'), -47, -(2 * event.target.getBoundingClientRect().height) - 15);\r\n };\r\n // common function for occupancyPicjer and DatePicker\r\n UnifiedSearch.prototype.openPicker = function (event, picker, adjust, pixelsForHeightExpand) {\r\n if (this.hotelOnly()) {\r\n picker.addClass('hotelOnlyCalendar');\r\n }\r\n else {\r\n picker.removeClass('hotelOnlyCalendar');\r\n }\r\n picker.css({\r\n 'opacity': '0'\r\n });\r\n setTimeout(function () {\r\n var winHeight = $(window).height();\r\n var evTop = event.target.getBoundingClientRect().top;\r\n var eventHeight = event.target.getBoundingClientRect().height;\r\n var evTopPlusWin = evTop + picker.outerHeight() + eventHeight +\r\n Math.abs(pixelsForHeightExpand);\r\n if (evTopPlusWin > winHeight) {\r\n var scrollAdjust = 0;\r\n if (window.innerHeight > picker.outerHeight()) {\r\n scrollAdjust = window.innerHeight - picker.outerHeight() -\r\n $('.integrated-search-unit').height();\r\n }\r\n scrollAdjust += pixelsForHeightExpand;\r\n $('html,body').animate({ 'scrollTop': $('.integrated-search-unit').offset().top - scrollAdjust + 'px' }, { 'complete': function () {\r\n picker.css({\r\n 'top': adjust + event.target.getBoundingClientRect().top + 'px',\r\n 'opacity': '1'\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n picker.css({\r\n 'top': adjust + event.target.getBoundingClientRect().top + 'px',\r\n 'opacity': '1'\r\n });\r\n }\r\n }, 50);\r\n $(window).resize(function () {\r\n picker.css({\r\n 'top': adjust + event.target.getBoundingClientRect().top + 'px'\r\n });\r\n });\r\n };\r\n UnifiedSearch.prototype.resetDestination = function () {\r\n this.searchUnitService.setDestination(null, null, null);\r\n this.searchUnitService.setDestinationAirport(null);\r\n this.model.destination = [];\r\n };\r\n UnifiedSearch.prototype.oneWayFlightIncluded = function () {\r\n return TRPCONFIG.Domain.OneWayFlightsEnabled && this.searchType === Search.UnifiedSearchType.Flights;\r\n };\r\n UnifiedSearch.prototype.flightIncluded = function () {\r\n return this.searchType === Search.UnifiedSearchType.Flights || this.searchType === Search.UnifiedSearchType.Holidays;\r\n };\r\n UnifiedSearch.prototype.hotelIncluded = function () {\r\n return this.searchType === Search.UnifiedSearchType.Hotels || this.searchType === Search.UnifiedSearchType.Holidays;\r\n };\r\n UnifiedSearch.prototype.hotelOnly = function () {\r\n return this.searchType === Search.UnifiedSearchType.Hotels;\r\n };\r\n UnifiedSearch.prototype.flexibleDatesDisabled = function () {\r\n return TRPCONFIG.Domain2.FlexibleDatesFlowsDisabled.indexOf(Search.UnifiedSearchType[this.searchType]) !== -1;\r\n };\r\n return UnifiedSearch;\r\n }());\r\n angular\r\n .module('search')\r\n .directive('unifiedSearch', function () {\r\n return {\r\n scope: {},\r\n controller: UnifiedSearch,\r\n controllerAs: 'us',\r\n bindToController: {\r\n searchType: '=',\r\n fid: '=?',\r\n hiddenQueryString: '@',\r\n trackDefaultParameters: '@',\r\n clearForm: '@',\r\n overrideAllowNoDatesYet: '@',\r\n isFlexibleTripType: '=?',\r\n disableResetOptions: '@?'\r\n },\r\n templateUrl: 'partials/search/unifiedSearch',\r\n replace: true,\r\n restrict: 'E',\r\n link: function (scope, el, attr, controller) {\r\n var elements = {\r\n container: el\r\n };\r\n controller.init(elements);\r\n }\r\n };\r\n });\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var SearchQueryString = /** @class */ (function () {\r\n function SearchQueryString($location, $q, dateUtil, occupancyService, searchUnitService, destinationService, autocompleter) {\r\n this.$location = $location;\r\n this.$q = $q;\r\n this.dateUtil = dateUtil;\r\n this.occupancyService = occupancyService;\r\n this.searchUnitService = searchUnitService;\r\n this.destinationService = destinationService;\r\n this.autocompleter = autocompleter;\r\n this.allAirlines = _.map((TRPCONFIG.Domain.PrefilterAirlines || '').split('|').filter(function (val) { return val !== ''; }), function (a) {\r\n var parts = a.split(',');\r\n return {\r\n Title: parts[0],\r\n Code: parts[1],\r\n IsPostfilter: parts[2] === '1'\r\n };\r\n });\r\n }\r\n SearchQueryString.prototype.getQueryStringValues = function (paramsOptional) {\r\n if (paramsOptional === void 0) { paramsOptional = {}; }\r\n var params = this.getCompleteParamsObj(paramsOptional);\r\n var _a = this.applyDatesOffset(params.startdate, params.enddate, params.startoffset, params.duration), startDate = _a.startDate, endDate = _a.endDate;\r\n return this.$q.all({\r\n startDate: this.dateUtil.parseDate(startDate),\r\n endDate: this.dateUtil.parseDate(endDate),\r\n occupancy: this.occupancyService.parseOccupancyString(params.occ),\r\n airports: params.depair && params.depair.indexOf(',') > -1\r\n ? this.getAirportCodes(params.depair) : this.lookupAirports(params.depair),\r\n destination: this.getDestination(params),\r\n cabin: ('cabin' in params) ? this.lookupCabin(params.cabin) : undefined,\r\n prefilterDirectFlights: params.direct === '1' ? true : params.direct === '0' ? false : undefined,\r\n autoSearch: params.autosearch === '1',\r\n expandedOptions: ('expandedoptions' in params) ? params.expandedoptions === '1' : undefined,\r\n airlines: ('airlines' in params) ? this.lookupAirlines(params.airlines) : undefined,\r\n prefilterAirlines: ('airlines' in params) ? this.prefilterAirlines(params.airlines) : undefined,\r\n resetForm: params.resetform === '1' ? true : params.resetform === '0' ? false : undefined,\r\n sortOrder: parseInt(params.sortorder, 10) > 0 ? parseInt(params.sortorder, 10) : 0,\r\n dealsOnly: params.dealsonly,\r\n currency: params.currency && params.currency.toUpperCase(),\r\n });\r\n };\r\n SearchQueryString.prototype.lookupDestination = function (query) {\r\n if (query) {\r\n var destObj = this.parseDestinationParam(query);\r\n return this.destinationService.getDetails(destObj)\r\n .then(function (d) { return d ? [d] : undefined; });\r\n }\r\n };\r\n SearchQueryString.prototype.getAirportCodes = function (query) {\r\n var airports = query.split(',').map(function (prefix) {\r\n return { Code: prefix };\r\n });\r\n return this.$q.when(airports);\r\n };\r\n SearchQueryString.prototype.lookupAirports = function (query) {\r\n if (query) {\r\n return this.autocompleter.lookup('flights', query).then(function (response) {\r\n var firstItem = response.data && response.data[0];\r\n var codes = firstItem && response.data[0].Code && response.data[0].Code.split(',');\r\n if (codes) {\r\n if (codes.length === 1) {\r\n return [firstItem];\r\n }\r\n return _.map(codes, function (c) { return ({ Code: c }); });\r\n }\r\n });\r\n }\r\n };\r\n SearchQueryString.prototype.lookupAirlines = function (query) {\r\n query = query || '';\r\n var airlineQueryArray = _.map(query.split(','), function (q) { return ({ Title: q, Code: q, IsPostfilter: undefined }); });\r\n return this.verifyAirlineModels(airlineQueryArray);\r\n };\r\n SearchQueryString.prototype.prefilterAirlines = function (query) {\r\n query = query || '';\r\n var prefilterAirlinesArray = _.map(query.split(','), function (q) { return (q); });\r\n return prefilterAirlinesArray;\r\n };\r\n SearchQueryString.prototype.lookupCabin = function (query) {\r\n var result = _.find(this.searchUnitService.getCabinOptions(), function (c) { return c.queryStringCode === query; });\r\n return result ? result.value : undefined;\r\n };\r\n SearchQueryString.prototype.verifyAirlineModels = function (airlineQueryArray) {\r\n airlineQueryArray = _.map(airlineQueryArray, function (q) { return ({\r\n Title: (q.Title || '').toUpperCase(),\r\n Code: (q.Code || '').toUpperCase(),\r\n IsPostfilter: q.IsPostfilter\r\n }); });\r\n var isInQuery = function (airline) {\r\n return _.some(airlineQueryArray, function (q) {\r\n return airline.Title.toUpperCase() === q.Title || airline.Code === q.Code;\r\n });\r\n };\r\n return _.filter(this.allAirlines, isInQuery);\r\n };\r\n SearchQueryString.prototype.getCompleteParamsObj = function (params) {\r\n var searchParams = this.$location.search();\r\n if (searchParams.dealsOnly) {\r\n params.dealsOnly = 1;\r\n }\r\n else {\r\n params = angular.merge(params, searchParams);\r\n }\r\n params = _.mapKeys(params, function (value, key) {\r\n return key.toLowerCase();\r\n });\r\n return params;\r\n };\r\n SearchQueryString.prototype.parseDestinationParam = function (dest) {\r\n var parts = dest.split('-');\r\n return {\r\n Type: parts[0],\r\n Id: parts[1],\r\n };\r\n };\r\n SearchQueryString.prototype.getAirportListCodes = function (depair) {\r\n var depAirpts = depair && depair.split(',') || [];\r\n return depAirpts.map(function (depAirpt) {\r\n return depAirpt.toUpperCase().trim();\r\n });\r\n };\r\n SearchQueryString.prototype.getDestination = function (params) {\r\n return this.$q.all({\r\n destAir: this.lookupAirports(params.destair),\r\n dest: this.lookupDestination(params.dest)\r\n })\r\n .then(function (_a) {\r\n var destAir = _a.destAir, dest = _a.dest;\r\n return destAir || dest;\r\n });\r\n };\r\n SearchQueryString.prototype.getValue = function (str, val) {\r\n var ls = JSON.parse(str);\r\n return ls[val];\r\n };\r\n SearchQueryString.prototype.applyDatesOffset = function (startDate, endDate, startOffset, duration) {\r\n if (startOffset !== undefined && startOffset !== undefined) {\r\n var dateData = {\r\n startOffset: startOffset,\r\n duration: duration\r\n };\r\n sessionStorage.setItem('deeplinkData', JSON.stringify(dateData));\r\n }\r\n var deeplinkData = sessionStorage.getItem('deeplinkData');\r\n if (deeplinkData !== null) {\r\n startOffset = this.getValue(deeplinkData, 'startOffset');\r\n duration = this.getValue(deeplinkData, 'duration');\r\n }\r\n if (startOffset && duration) {\r\n var startDate_1 = this.dateUtil.format(this.dateUtil.todayPlus(parseInt(startOffset, 10)), 'yyyy-MM-dd');\r\n var endDate_1 = this.dateUtil.format(this.dateUtil.addDays(startDate_1, parseInt(duration, 10)), 'yyyy-MM-dd');\r\n var dates = {\r\n startDate: startDate_1,\r\n endDate: endDate_1\r\n };\r\n return dates;\r\n }\r\n return { startDate: startDate, endDate: endDate };\r\n };\r\n SearchQueryString.prototype.getDeepLinkQSParams = function () {\r\n var params = this.getCompleteParamsObj({});\r\n var _a = this.applyDatesOffset(params.startdate, params.enddate, params.startoffset, params.duration), startDate = _a.startDate, endDate = _a.endDate;\r\n return {\r\n TenantId: TRPCONFIG.Domain.TenantId,\r\n DepartureAirports: this.getAirportListCodes(params.depair),\r\n Cabin: this.lookupCabin(params.cabin),\r\n CountryCode: TRPCONFIG.Domain.CountryCode.toUpperCase(),\r\n CultureCode: TRPCONFIG.Domain.CultureCode.toUpperCase(),\r\n StartDate: startDate,\r\n EndDate: endDate,\r\n Rooms: this.occupancyService.parseOccupancyString(params.occ),\r\n Destination: this.parseDestinationParam(params.dest)\r\n };\r\n };\r\n return SearchQueryString;\r\n }());\r\n Search.SearchQueryString = SearchQueryString;\r\n angular\r\n .module('search')\r\n .service('searchQueryString', SearchQueryString);\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var SearchUnitService = /** @class */ (function () {\r\n function SearchUnitService(destinationService, occupancyService, dateUtil, arrayUtil, resourceService, loggingService, $http, $q, broker, $timeout, geo, unadjustedDateFilter, currentUser, preferences, $location) {\r\n var _this = this;\r\n this.destinationService = destinationService;\r\n this.occupancyService = occupancyService;\r\n this.dateUtil = dateUtil;\r\n this.arrayUtil = arrayUtil;\r\n this.resourceService = resourceService;\r\n this.loggingService = loggingService;\r\n this.$http = $http;\r\n this.$q = $q;\r\n this.broker = broker;\r\n this.$timeout = $timeout;\r\n this.geo = geo;\r\n this.unadjustedDateFilter = unadjustedDateFilter;\r\n this.currentUser = currentUser;\r\n this.preferences = preferences;\r\n this.$location = $location;\r\n this.dates = [];\r\n this.url = '/api2/flights/static/';\r\n this.webUrl = 'website/flights/';\r\n this.defaultCabin = TRPCONFIG.Domain.DefaultCabin;\r\n this.pointType = {\r\n Unknown: 0,\r\n Airport: 1,\r\n Location: 2,\r\n Point: 3,\r\n Estab: 4,\r\n Resort: 5\r\n };\r\n this.transferTypes = {\r\n AirportTransfer: 0,\r\n ResortToResort: 1\r\n };\r\n this.direction = 1;\r\n this.currencyOptions = (TRPCONFIG.Domain.CurrencyOptions || 'GBP|EUR|USD').split('|');\r\n this.flightRoutes = [];\r\n this.legs = null;\r\n this.isMultiSector = false;\r\n this.isMultiReturning = true;\r\n this.hotel = 0;\r\n this.flight = 1;\r\n this.transfer = 2;\r\n this.marhaba = 3;\r\n this.parking = 4;\r\n this.attractions = 5;\r\n this.insurance = 6;\r\n this.setDefaultCabin = function () {\r\n _this.cabin = _this.defaultCabin;\r\n };\r\n this.setDefaultCurrency = function () {\r\n _this.currency = TRPCONFIG.Domain.CurrencyCode;\r\n };\r\n this.getDurationOptions = function () {\r\n var options = [];\r\n var mp = TRPCONFIG.Domain.SearchUnitDurationMostPopular;\r\n for (var n = 0; n < mp.length; n++) {\r\n options.push({\r\n index: options.length,\r\n value: mp[n],\r\n label: mp[n] + ' ' + _this.resourceService.get('SEARCHNIGHTS'),\r\n group: _this.resourceService.get('SEARCHMOSTPOPULAR')\r\n });\r\n }\r\n var nn = TRPCONFIG.Domain.SearchUnitDurationNoOfNights;\r\n for (var p = 0; p < nn.length; p++) {\r\n options.push({\r\n index: options.length,\r\n value: nn[p],\r\n label: nn[p] + ' ' + _this.resourceService.get('SEARCHNIGHTS'),\r\n group: _this.resourceService.get('SEARCHNOOFNIGHTS')\r\n });\r\n }\r\n return options;\r\n };\r\n this._translateDirection = function (d) {\r\n return _this.getDirectionStrings()[d];\r\n };\r\n this._loadDepartureAirports = function () {\r\n var domain = TRPCONFIG.Domain;\r\n _this.clearDepartureAirports();\r\n _this.availableDepartureAirports = _this.$http.post(_this.url + 'getdepartureairports', {\r\n CultureCode: domain.CultureCode,\r\n DepartureCountryCode: domain.CountryCode,\r\n Destination: _this.destination\r\n }).then(function (result) {\r\n return result.data.Airports;\r\n });\r\n };\r\n this._loadResorts = function (a) {\r\n _this.resort = null;\r\n var domain = TRPCONFIG.Domain;\r\n if (!a) {\r\n return _this.$q.reject(_this.resourceService.get('MUSTSELECTAIRPORTFIRST'));\r\n }\r\n return _this.$http.get('/api3/transfers/resorts/getbyairport?' + jQuery.param({\r\n CultureCode: domain.CultureCode,\r\n AirportCode: a.Code,\r\n DomainId: domain.DomainId,\r\n IncludeHotels: domain.IncludeHotelsInTransfersAutocompleter\r\n }), {\r\n ignoreErrors: true\r\n }).then(function (result) {\r\n return result.data;\r\n }, angular.noop);\r\n };\r\n this.startDate = function (index, val, defaultTime) {\r\n var searchDates = JSON.parse(sessionStorage.getItem('searchDates') || '[]');\r\n index = index || 0;\r\n if (val !== undefined) {\r\n _this.dates[index].setStart(val, defaultTime);\r\n }\r\n var start = _this.dates[index].start;\r\n if (searchDates && searchDates.ISOstartDate && searchDates.ISOstartDate !== start) {\r\n start = searchDates.ISOstartDate;\r\n }\r\n return start;\r\n };\r\n this.endDate = function (index, val) {\r\n index = index || 0;\r\n if (val !== undefined) {\r\n _this.dates[index].setEnd(val);\r\n }\r\n return _this.dates[index].end;\r\n };\r\n this.isStartTimeApprovedByCustomer = function (index, val) {\r\n index = index || 0;\r\n if (val) {\r\n _this.dates[index].isStartTimeApprovedByCustomer = true;\r\n }\r\n return _this.dates[index].isStartTimeApprovedByCustomer;\r\n };\r\n this.isEndTimeApprovedByCustomer = function (index, val) {\r\n index = index || 0;\r\n if (val) {\r\n _this.dates[index].isEndTimeApprovedByCustomer = true;\r\n }\r\n return _this.dates[index].isEndTimeApprovedByCustomer;\r\n };\r\n this.duration = function (index, val) {\r\n index = index || 0;\r\n if (val !== undefined) {\r\n _this.dates[index].duration = val;\r\n }\r\n return _this.dates[index].duration;\r\n };\r\n this.getAirport = function (airportCode) {\r\n var domain = TRPCONFIG.Domain;\r\n return _this.$http.post(_this.url + 'getairport', {\r\n CultureCode: domain.CultureCode,\r\n AirportCode: airportCode\r\n }).then(function (result) {\r\n return result.data.Airport;\r\n });\r\n };\r\n this.getAirports = function () {\r\n if (_this.allAirports) {\r\n _this.$q.when(_this.allAirports);\r\n }\r\n var domain = TRPCONFIG.Domain;\r\n return _this.$http.post('/api3/transfers/airports/get', {\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId\r\n }).then(function (result) {\r\n _this.allAirports = result.data.Airports;\r\n return _this.allAirports;\r\n });\r\n };\r\n this.getTerminals = function () {\r\n if (_this.availableTerminals) {\r\n _this.$q.when(_this.availableTerminals);\r\n }\r\n return _this.$http.get(\"/api2/marhaba/terminals/get?cultureCode=\" + TRPCONFIG.Domain.CultureCode)\r\n .then(function (res) { return res.data.Terminals; });\r\n };\r\n this.setTerminal = function (t) {\r\n _this.terminal = t;\r\n };\r\n this.setCabin = function (c) {\r\n _this.cabin = c;\r\n };\r\n this.setCurrency = function (c) {\r\n _this.currency = c;\r\n };\r\n this.getCabin = function () {\r\n return _this.cabin || _this.defaultCabin;\r\n };\r\n this.getCurrency = function () {\r\n return _this.currency || TRPCONFIG.Domain.CurrencyCode;\r\n };\r\n this.getTerminal = function () {\r\n return _this.terminal || { Id: 0, Name: _this.resourceService.get('SELECTTERMINAL') };\r\n };\r\n this.getFlightTypes = function () {\r\n return [\r\n { Id: 1, Name: _this.resourceService.get('ARRIVAL'), Label: _this.resourceService.get('ORIGIN') },\r\n { Id: 2, Name: _this.resourceService.get('DEPARTURE'), Label: _this.resourceService.get('DESTINATION') }\r\n ];\r\n };\r\n this.getMarhabaFlightType = function (type) {\r\n switch (type) {\r\n case 1:\r\n return 'ARRIVAL';\r\n case 2:\r\n return 'DEPARTURE';\r\n }\r\n };\r\n this.setFlightType = function (f) {\r\n _this.flightType = f;\r\n };\r\n this.setOneWayFlightEnabled = function (v) {\r\n _this.oneWayFlightEnabled = v;\r\n };\r\n this.isOneWayFlightEnabled = function () {\r\n return _this.oneWayFlightEnabled;\r\n };\r\n this.setStaffRates = function (v) {\r\n _this.staffRates = v;\r\n };\r\n this.getStaffRates = function () {\r\n return _this.staffRates;\r\n };\r\n this.setMarhabaAirport = function (v) {\r\n _this.marhabaAirport = v;\r\n };\r\n this.getMarhabaAirport = function () {\r\n return _this.marhabaAirport;\r\n };\r\n this.getFlightType = function () {\r\n return _this.flightType || _this.getFlightTypes()[0];\r\n };\r\n this.setDestinationAirport = function (a, lr) {\r\n if (lr === void 0) { lr = false; }\r\n _this.destinationAirport = a;\r\n _this.availableResorts = _this.resort = null;\r\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n _this.setTransferPickUpPoint(a ? {\r\n Type: _this.pointType.Airport,\r\n Code: a.Code,\r\n Description: a.Title\r\n } : null);\r\n }\r\n if (lr) {\r\n _this.availableResorts = _this._loadResorts(a);\r\n return _this.availableResorts;\r\n }\r\n return _this.$q.when();\r\n };\r\n this.getDestinationAirport = function () {\r\n return _this.destinationAirport;\r\n };\r\n this.getOutboundDates = function (mode) {\r\n return mode === _this.flight ? _this.outboundDates : {};\r\n };\r\n //Only used by searches:\r\n this.loadOutboundDates = function (request) {\r\n if (!request) {\r\n return _this.$q.when();\r\n }\r\n return _this.$http.get(_this.webUrl + \"departuredates?\" + _this.serialiseDatesRequest(request), { cache: true })\r\n .then(function (res) {\r\n return _this.outboundDates = _this.arrayUtil.toDict(res.data.DepartureDates, function (x) { return x; }, function (x) { return true; });\r\n });\r\n };\r\n this.getDestination = function () {\r\n return angular.copy(_this.destination);\r\n };\r\n this.requiresStartDate = function () {\r\n return _this.direction === 1 || _this.direction === 2;\r\n };\r\n this.requiresEndDate = function () {\r\n return _this.direction === 1 || _this.direction === 3;\r\n };\r\n this.getSearchArea = function () {\r\n return _this.searchArea;\r\n };\r\n this.updateSearchArea = function () {\r\n if (_this.searchArea) {\r\n return _this.geo.getSearchArea().then(function (sa) {\r\n return _this.setSearchArea(sa);\r\n });\r\n }\r\n return _this.$q.when();\r\n };\r\n this.setSearchArea = function (sa) {\r\n _this.searchArea = sa;\r\n //can either have searchArea set or destination, not both\r\n if (sa != null) {\r\n _this.destination = null;\r\n }\r\n };\r\n this.setDestination = function (d, departureAirportsRequired, enrich) {\r\n _this.destination = d;\r\n if (d != null) {\r\n _this.searchArea = null;\r\n }\r\n if (departureAirportsRequired) {\r\n _this._loadDepartureAirports();\r\n }\r\n if (enrich) {\r\n return _this.destinationService.getDetails(d).then(function (dest) {\r\n _this.destination = dest;\r\n _this.broker.publish('destinationChanged', dest);\r\n return _this.destination;\r\n });\r\n }\r\n return _this.$q.when(_this.destination);\r\n };\r\n this.getDestinationAirports = function (dest) {\r\n var get = function (d) {\r\n if (d) {\r\n if (d[0]) {\r\n d = d[0];\r\n }\r\n var code = d.DestinationAirports || d.Code;\r\n if (code) {\r\n return code.split(',');\r\n }\r\n }\r\n };\r\n return get(dest) || get(_this.getDestinationAirport());\r\n };\r\n this.getDepartureAirports = function () {\r\n return _this.departureAirports;\r\n };\r\n this.clearDepartureAirports = function () {\r\n _this.outboundDates = {};\r\n _this.departureAirports = [];\r\n _this.selectedDepartureAirport = null;\r\n };\r\n this.getAvailableResorts = function () {\r\n if (_this.destinationAirport\r\n && _this.destinationAirport.Code\r\n && _this.destinationAirport.Code.indexOf(',') > -1) {\r\n return _this.setDestinationAirport(null, false);\r\n }\r\n if (_this.availableResorts == null) {\r\n _this.availableResorts = _this._loadResorts(_this.destinationAirport);\r\n }\r\n return _this.availableResorts;\r\n };\r\n this.getAvailableDepartureAirports = function () {\r\n var d = _this.$q.defer();\r\n if (_this.availableDepartureAirports == null) {\r\n if (_this.destination == null) {\r\n _this.$timeout(function () {\r\n d.reject(_this.resourceService.get('MUSTSELECTDESTINATIONFIRST'));\r\n }, 0);\r\n }\r\n else {\r\n _this._loadDepartureAirports();\r\n return _this.availableDepartureAirports;\r\n }\r\n }\r\n else {\r\n return _this.availableDepartureAirports;\r\n }\r\n return d.promise;\r\n };\r\n this.setMultipleDepartureAirports = function (airports) {\r\n if (airports && airports.length) {\r\n if (_.isString(airports[0])) {\r\n airports = _.map(airports, function (a) { return ({ Code: a, Title: a }); });\r\n }\r\n var strMulti_1 = _this.resourceService.get('MULTIPLEAIRPORTS'); // '{0} + {1} more'\r\n strMulti_1 = String.format(strMulti_1, airports[0].Code, airports.length - 1);\r\n _this.setDepartureAirports(\r\n // Single entry is unchanged (no initial value arg)\r\n airports.reduce(function (prev, curr) { return ({\r\n Code: prev.Code + ',' + curr.Code,\r\n Title: strMulti_1\r\n }); }));\r\n }\r\n };\r\n this.setDepartureAirports = function (airport) {\r\n if (airport.Code) {\r\n _this.departureAirports = airport.Code.split(',');\r\n _this.selectedDepartureAirport = _this._setShortTitle(airport);\r\n _this.broker.publish('departureAirportsChanged', airport);\r\n }\r\n else {\r\n _this.loggingService.logError('airport.Code: ' +\r\n airport.Code + ' | ' + window.location.href);\r\n }\r\n };\r\n this.getSelectedDepartureAirport = function () {\r\n return _this.selectedDepartureAirport;\r\n };\r\n this._setShortTitle = function (o) {\r\n if (o.Title) {\r\n o.ShortTitle = o.Title.split(',')[0];\r\n }\r\n return o;\r\n };\r\n this.getDirection = function () {\r\n return _this.direction;\r\n };\r\n this.getDirectionStrings = function () {\r\n if (!_this.directionStrings) {\r\n _this.directionStrings = {\r\n 1: _this.resourceService.get('RETURN'),\r\n 2: _this.resourceService.get('AIRPORTTORESORT'),\r\n 3: _this.resourceService.get('RESORTTOAIRPORT')\r\n };\r\n }\r\n return _this.directionStrings;\r\n };\r\n this.setDirection = function (d) {\r\n _this.direction = d;\r\n if (_this.direction === 3) {\r\n _this.startDate(_this.transfer, null);\r\n return;\r\n }\r\n if (_this.direction === 2) {\r\n _this.endDate(_this.transfer, null);\r\n }\r\n };\r\n this.setResort = function (r) {\r\n _this.resort = r;\r\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n _this.setTransferDropOffPoint(r);\r\n }\r\n };\r\n this.getResort = function () {\r\n return _this.resort;\r\n };\r\n this.getRoute = function () {\r\n var airport = _this.getDestinationAirport();\r\n var resort = _this.getResort();\r\n if (!airport || !resort) {\r\n return null;\r\n }\r\n return {\r\n PickUpPoint: {\r\n Type: 1,\r\n Code: airport.Code,\r\n Description: airport.Title\r\n },\r\n DropOffPoint: resort\r\n };\r\n };\r\n this.setLocationId = function (l) {\r\n _this.locationId = l;\r\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n _this.setTransferDropOffPoint(l ? {\r\n Type: _this.pointType.Location,\r\n Code: l\r\n } : null);\r\n }\r\n };\r\n this.getLocationId = function () {\r\n return _this.locationId;\r\n };\r\n this.getSummary = function (mode) {\r\n return {\r\n Destination: _this.destination && _this.destination.Searchable ?\r\n _this.destination.Title : null,\r\n DestinationAirport: (mode === _this.marhaba) ?\r\n (_this.marhabaAirport ?\r\n _this.marhabaAirport.Title : null) :\r\n (_this.destinationAirport ?\r\n _this.destinationAirport.Title : null),\r\n Resort: _this.resort ?\r\n _this.resort.Description : null,\r\n Departure: _this.selectedDepartureAirport ?\r\n _this.selectedDepartureAirport.Title : null,\r\n Direction: _this._translateDirection(_this.direction),\r\n StartDate: _this.dates[mode].start ?\r\n _this.unadjustedDateFilter(_this.dates[mode].start, _this.dates[mode].timeSupport ?\r\n 'dd MMM yyyy HH:mm' :\r\n 'dd MMM yyyy') : null,\r\n StartMonth: _this.dates[mode].start ?\r\n _this.unadjustedDateFilter(_this.dates[mode].start, 'MMM yyyy') : null,\r\n EndDate: _this.dates[mode].end ?\r\n _this.unadjustedDateFilter(_this.dates[mode].end, _this.dates[mode].timeSupport ?\r\n 'dd MMM yyyy HH:mm' :\r\n 'dd MMM yyyy') : null,\r\n OccupancyString: _this.occupancyService.getOccupancyString(),\r\n PassengerCount: _this.occupancyService.getPassengerCount(),\r\n OutboundDates: _this.outboundDates || {},\r\n HolidayEnabled: _this.destination ?\r\n _this.destination.HolidayEnabled :\r\n true,\r\n NumericDirection: _this.direction,\r\n Terminal: _this.getTerminal().Name,\r\n FlightType: _this.getFlightType().Name,\r\n Airlines: _.map(_this.airlines, function (a) { return a.Title; }).join(', '),\r\n MarhabaAirport: _this.marhabaAirport ?\r\n _this.marhabaAirport.Title : null,\r\n PolicyType: _this.policyType ? _this.policyType.Name : null,\r\n TravelDestination: _this.travelDestination ? _this.travelDestination.Name : null\r\n };\r\n };\r\n this.getUrl = function () {\r\n return _this.url;\r\n };\r\n this.setLegs = function (l) {\r\n _this.legs = l;\r\n };\r\n this.getLegs = function () {\r\n return _this.legs;\r\n };\r\n this.setFlightRoutes = function (routes) {\r\n _this.flightRoutes = routes.map(function (route) { return ({\r\n DepartureAirport: { Code: route.DepartureAirport, Title: route.DepartureAirport },\r\n DepartureDate: route.DepartureDate,\r\n DestinationAirport: { Code: route.DestinationAirport, Title: route.DestinationAirport }\r\n }); });\r\n };\r\n this.getFlightRoutes = function () {\r\n return _this.flightRoutes;\r\n };\r\n this.setIsMultiSector = function (isMS) {\r\n _this.isMultiSector = isMS;\r\n };\r\n this.getIsMultiSector = function () {\r\n return _this.isMultiSector;\r\n };\r\n this.setIsMultiReturning = function (isMR) {\r\n _this.isMultiReturning = isMR;\r\n };\r\n this.getIsMultiReturning = function () {\r\n return _this.isMultiReturning;\r\n };\r\n this.restoreHotelSearch = function (trip) {\r\n if (trip && trip.HotelsRequest) {\r\n _this.startDate(_this.hotel, trip.HotelsRequest.CheckInDate);\r\n _this.endDate(_this.hotel, trip.HotelsRequest.CheckOutDate);\r\n _this.occupancyService.setOccupancy(trip.HotelsRequest.Rooms);\r\n _this.setCurrency(trip.HotelsRequest.CurrencyCode);\r\n if (trip.HotelsRequest.Destination != null) {\r\n return _this.setDestination(trip.HotelsRequest.Destination, false, true);\r\n }\r\n _this.setSearchArea(trip.HotelsRequest.SearchArea);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreFlightSearch = function (trip) {\r\n if (trip && trip.FlightsRequest) {\r\n _this.startDate(_this.flight, trip.FlightsRequest.DepartureDate);\r\n _this.endDate(_this.flight, trip.FlightsRequest.OneWayOnly ?\r\n null :\r\n trip.FlightsRequest.ReturnDate);\r\n _this.occupancyService.setOccupancy([{\r\n Adults: trip.FlightsRequest.Adults,\r\n ChildAges: trip.FlightsRequest.ChildAges\r\n }]);\r\n _this.setMultipleDepartureAirports([trip.FlightsRequest.SelectedDepartureAirport]);\r\n _this.setDestinationAirport(trip.FlightsRequest.SelectedDestinationAirport);\r\n _this.setOneWayFlightEnabled(trip.FlightsRequest.OneWayOnly);\r\n _this.setCabin(trip.FlightsRequest.Cabin);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreMultiFlightSearch = function (trip) {\r\n if (trip && trip.MultiFlightsRequest) {\r\n _this.occupancyService.setOccupancy([{\r\n Adults: trip.MultiFlightsRequest.Adults,\r\n ChildAges: trip.MultiFlightsRequest.ChildAges\r\n }]);\r\n _this.setCabin(trip.MultiFlightsRequest.Cabin);\r\n _this.setFlightRoutes(trip.MultiFlightsRequest.FlightRoutes);\r\n _this.setIsMultiSector(true);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreTransferSearch = function (trip) {\r\n if (trip && trip.TransfersRequest) {\r\n _this.startDate(_this.transfer, trip.TransfersRequest.ArrivalDate);\r\n _this.endDate(_this.transfer, trip.TransfersRequest.ReturnDate);\r\n _this.occupancyService.setOccupancy([{\r\n Adults: trip.TransfersRequest.Adults,\r\n ChildAges: trip.TransfersRequest.ChildAges\r\n }]);\r\n _this.setDestinationAirport(trip.TransfersRequest.DestinationAirport);\r\n _this.setResort({\r\n ResortId: trip.TransfersRequest.ResortId,\r\n Name: trip.TransfersRequest.ResortTitle\r\n });\r\n _this.setLocationId(trip.TransfersRequest.LocationId);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreMarhabaSearch = function (trip) {\r\n if (trip && trip.MarhabaRequest) {\r\n _this.startDate(_this.marhaba, trip.MarhabaRequest.DateAndTime);\r\n _this.setTerminal(trip.MarhabaRequest.Terminal);\r\n _this.setMarhabaAirport(trip.MarhabaRequest.Airport);\r\n _this.occupancyService.setOccupancy([trip.MarhabaRequest.Occupancy]);\r\n var ft = _this.getFlightTypes()[trip.MarhabaRequest.FlightType - 1];\r\n _this.setFlightType(ft);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreParkingSearch = function (trip) {\r\n if (trip && trip.ParkingRequest) {\r\n _this.setDepartureAirports(trip.ParkingRequest.Airport);\r\n _this.startDate(_this.parking, trip.ParkingRequest.DepartureDate);\r\n _this.endDate(_this.parking, trip.ParkingRequest.ReturnDate);\r\n _this.occupancyService.setPassengerCount(trip.ParkingRequest.PassengerCount);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.restoreInsuranceSearch = function (trip) {\r\n if (trip && trip.InsuranceRequest) {\r\n _this.startDate(_this.insurance, trip.InsuranceRequest.StartDate);\r\n _this.endDate(_this.insurance, trip.InsuranceRequest.EndDate);\r\n _this.setPolicyExtra(trip.InsuranceRequest.PolicyExtras);\r\n _this.setPolicyType(trip.InsuranceRequest.PolicyType);\r\n _this.setTravelDestination(trip.InsuranceRequest.TravelDestination);\r\n }\r\n return _this.$q.when();\r\n };\r\n this.getCabinOptions = function () {\r\n var cabins = [];\r\n var defaultCabinList = ['ECONOMYCLASS', 'PREMIUMECONOMYCLASS', 'BUSINESSCLASS', 'FIRSTCLASS'];\r\n var approvedCabinList = TRPCONFIG.Domain.ValidFlightClasses || defaultCabinList;\r\n return approvedCabinList.map(function (approvedCabin) {\r\n var value = undefined;\r\n var code = undefined;\r\n switch (approvedCabin) {\r\n case 'ECONOMYCLASS':\r\n value = 1;\r\n code = 'e';\r\n break;\r\n case 'PREMIUMECONOMYCLASS':\r\n value = 2;\r\n code = 'p';\r\n break;\r\n case 'BUSINESSCLASS':\r\n value = 8;\r\n code = 'b';\r\n break;\r\n case 'FIRSTCLASS':\r\n value = 4;\r\n code = 'f';\r\n break;\r\n case 'FLIGHTCLASS':\r\n value = -1;\r\n code = 'x';\r\n break;\r\n }\r\n return new Search.Cabin(approvedCabin, value, code, _this.resourceService);\r\n });\r\n };\r\n this.getCurrencyOptions = function () {\r\n return angular.copy(_this.currencyOptions);\r\n };\r\n this.chooseSeachUnitModel = function (target, source, service, queryString) {\r\n return queryString || service || source || target;\r\n };\r\n this.getTransferTypeStrings = function () {\r\n if (!_this.transferTypeStrings) {\r\n _this.transferTypeStrings = {\r\n 0: _this.resourceService.get('TRANSFERTYPE_AIRPORTTORESORT'),\r\n 1: _this.resourceService.get('TRANSFERTYPE_RESORTTORESORT')\r\n };\r\n }\r\n return _this.transferTypeStrings;\r\n };\r\n this.getTransferType = function () {\r\n return _this.transferType;\r\n };\r\n this.setTransferType = function (t) {\r\n _this.transferType = t;\r\n };\r\n this.setTransferPickUpPoint = function (p) {\r\n _this.transferPickUpPoint = p;\r\n };\r\n this.getTransferPickUpPoint = function () {\r\n return _this.transferPickUpPoint;\r\n };\r\n this.setTransferDropOffPoint = function (d) {\r\n _this.transferDropOffPoint = d;\r\n };\r\n this.getTransferDropOffPoint = function () {\r\n return _this.transferDropOffPoint;\r\n };\r\n this.getMinStartDate = function (areaName) {\r\n var startDate;\r\n if (areaName && areaName === 'hotels') {\r\n // HOTELS\r\n // determine offset\r\n var offSetDays = TRPCONFIG.Domain.HotelSearchOffsetDate;\r\n if (offSetDays === 0 &&\r\n (new Date()).getUTCHours() >= TRPCONFIG.Domain.TimeCutoffForSameDayHotelSearch) {\r\n // If we have no offset and the current time exceeds the same day search cutoff,\r\n // set min date to next day.\r\n offSetDays = 1;\r\n }\r\n startDate = _this.dateUtil.todayPlus(offSetDays, 0, true);\r\n }\r\n else if (areaName && (areaName === 'holidays' || areaName === 'flights')) {\r\n // HOLIDAYS or FLIGHTS\r\n startDate = _this.dateUtil.todayPlus(_this.getHolidaysSearchOffsetDate(), 0, true);\r\n var minimumOverride = new Date(TRPCONFIG.Domain.HolidaySearchOverrideMinimum);\r\n if (minimumOverride && minimumOverride > new Date(startDate)) {\r\n startDate = minimumOverride;\r\n }\r\n }\r\n else {\r\n // default to today\r\n startDate = _this.dateUtil.zeroTime(new Date());\r\n }\r\n return startDate;\r\n };\r\n this.getMinEndDate = function (startDate, areaName) {\r\n return _this.dateUtil.addDays(startDate, 1, true);\r\n };\r\n this.getHolidaysSearchOffsetDate = function () {\r\n return _this.currentUser.Agent ? 1 : TRPCONFIG.Domain.HolidaysSearchOffsetDate;\r\n };\r\n this.getTravelDestinations = function () {\r\n if (_this.travelDestinations) {\r\n return _this.travelDestinations;\r\n }\r\n var urlqs = \"cultureCode=\" + TRPCONFIG.Domain.CultureCode + \"&domainId=\" + TRPCONFIG.Domain.DomainId;\r\n _this.travelDestinations = _this.$http.get(\"/api2/insurance/static/gettraveldestination?\" + urlqs)\r\n .then(function (res) { return res.data; });\r\n return _this.travelDestinations;\r\n };\r\n this.setTravelDestination = function (t) {\r\n _this.travelDestination = t;\r\n };\r\n this.getTravelDestination = function () {\r\n return _this.travelDestination;\r\n };\r\n this.getPolicyTypes = function () {\r\n if (_this.policyTypes) {\r\n return _this.policyTypes;\r\n }\r\n var cc = TRPCONFIG.Domain.CultureCode;\r\n var id = TRPCONFIG.Domain.DomainId;\r\n var policyUrl = \"/api2/insurance/static/getpolicytype?cultureCode=\" + cc + \"&domainId=\" + id;\r\n _this.policyTypes = _this.$http.get(policyUrl).then(function (res) { return res.data; });\r\n return _this.policyTypes;\r\n };\r\n this.setPolicyType = function (p) {\r\n _this.policyType = p;\r\n };\r\n this.getPolicyType = function () {\r\n return _this.policyType;\r\n };\r\n this.getPolicyExtras = function () {\r\n if (_this.policyExtras) {\r\n return _this.policyExtras;\r\n }\r\n var urlqs = \"cultureCode=\" + TRPCONFIG.Domain.CultureCode + \"&domainId=\" + TRPCONFIG.Domain.DomainId;\r\n _this.policyExtras = _this.$http.get(\"/api2/insurance/static/getextras?\" + urlqs)\r\n .then(function (res) { return res.data; });\r\n return _this.policyExtras;\r\n };\r\n this.setPolicyExtra = function (e) {\r\n _this.policyExtra = e;\r\n };\r\n this.getPolicyExtra = function () {\r\n return _this.policyExtra;\r\n };\r\n this.capitalize = function (str) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n };\r\n this.hotelDateRange = new dateUtil.DateRange(null, null, false);\r\n this.flightHolidayDateRange = TRPCONFIG.Domain.DeviceType === 'Mobile' ?\r\n new dateUtil.DateRange(null, null, false) :\r\n this.hotelDateRange;\r\n this.dates = [\r\n this.hotelDateRange,\r\n this.flightHolidayDateRange,\r\n new dateUtil.DateRange(null, null, true),\r\n new dateUtil.DateRange(null, null, true),\r\n new dateUtil.DateRange(null, null, true),\r\n new dateUtil.DateRange(null, null, false),\r\n new dateUtil.DateRange(null, null, false) // insurance\r\n ];\r\n this.transferType = this.transferTypes.AirportTransfer;\r\n }\r\n SearchUnitService.prototype.serialiseDatesRequest = function (req) {\r\n var destQs = req.DestinationAirportCodes.reduce(function (qs, c) { return qs + \"dest=\" + c + \"&\"; }, '');\r\n var depAndDestQs = req.DepartureAirportCodes.reduce(function (qs, c) { return qs + \"dep=\" + c + \"&\"; }, destQs);\r\n return depAndDestQs.slice(0, -1);\r\n };\r\n SearchUnitService.prototype.getArrivalAirports = function () {\r\n var airports = this.$location.search()['arrAir'];\r\n if (airports) {\r\n return airports.split(',');\r\n }\r\n return;\r\n };\r\n SearchUnitService.prototype.getOccupancyConfig = function (areaName) {\r\n var config = new Search.OccupancyConfig;\r\n var limits = TRPCONFIG.Domain.OccupancyLimits[areaName];\r\n var includesHotel = (areaName === 'holidays' || areaName === 'hotels');\r\n config.MaxAdults = limits.maxAdults;\r\n config.MaxChildren = limits.maxChildren;\r\n config.MaxRooms = includesHotel ? TRPCONFIG.Domain.MaxRoomsForOccupancy : 0;\r\n config.MaxAdultsInAdditionalRooms = includesHotel ? TRPCONFIG.Domain.MaxAdultsInAdditionalRooms : 0;\r\n config.MaxChildrenInAdditionalRooms = includesHotel ? TRPCONFIG.Domain.MaxChildrenInAdditionalRooms : 0;\r\n switch (areaName) {\r\n case 'holidays':\r\n config.MaxChildAge = TRPCONFIG.Domain.MaxChildAgeForHolidays;\r\n break;\r\n case 'flights':\r\n config.MaxChildAge = TRPCONFIG.Domain.MaxChildAgeForFlights;\r\n break;\r\n default:\r\n config.MaxChildAge = TRPCONFIG.Domain.MaximumChildAge;\r\n }\r\n return config;\r\n };\r\n SearchUnitService.prototype.getLastSearchType = function () {\r\n return this.preferences.get('searchType').then();\r\n };\r\n return SearchUnitService;\r\n }());\r\n Search.SearchUnitService = SearchUnitService;\r\n angular\r\n .module('search')\r\n .service('searchUnitService', SearchUnitService);\r\n})(Search || (Search = {}));\r\nvar Search;\r\n(function (Search) {\r\n var UnifiedSearchService = /** @class */ (function () {\r\n function UnifiedSearchService($http, $location, $route, $q, searchUnitService, occupancyService, resourceService, sharedSearchUnitService, destinationService, currentDestination, holidayDeals, preferences, tripService, searchQueryString, geo, analytics, fidParser) {\r\n this.$http = $http;\r\n this.$location = $location;\r\n this.$route = $route;\r\n this.$q = $q;\r\n this.searchUnitService = searchUnitService;\r\n this.occupancyService = occupancyService;\r\n this.resourceService = resourceService;\r\n this.sharedSearchUnitService = sharedSearchUnitService;\r\n this.destinationService = destinationService;\r\n this.currentDestination = currentDestination;\r\n this.holidayDeals = holidayDeals;\r\n this.preferences = preferences;\r\n this.tripService = tripService;\r\n this.searchQueryString = searchQueryString;\r\n this.geo = geo;\r\n this.analytics = analytics;\r\n this.fidParser = fidParser;\r\n }\r\n UnifiedSearchService.prototype.getSearchMessage = function (type) {\r\n var msg = '';\r\n switch (type) {\r\n case Search.UnifiedSearchType.Holidays:\r\n msg = 'SEARCHINGFLIGHTSANDHOTELS';\r\n break;\r\n case Search.UnifiedSearchType.Hotels:\r\n msg = 'SEARCHINGHOTELS';\r\n break;\r\n case Search.UnifiedSearchType.Flights:\r\n msg = 'SEARCHINGFLIGHTS';\r\n break;\r\n default:\r\n }\r\n return msg;\r\n };\r\n UnifiedSearchService.prototype.getAreaName = function (type) {\r\n var name = '';\r\n switch (type) {\r\n case Search.UnifiedSearchType.Holidays:\r\n name = 'holidays';\r\n break;\r\n case Search.UnifiedSearchType.Hotels:\r\n name = 'hotels';\r\n break;\r\n case Search.UnifiedSearchType.Flights:\r\n name = 'flights';\r\n break;\r\n default:\r\n }\r\n return name;\r\n };\r\n UnifiedSearchService.prototype.populateSearchUnitService = function (model) {\r\n var destination = model.destination;\r\n if (destination && destination[0] && Object.keys(destination[0]).length !== 0) {\r\n this.searchUnitService.setDestination(destination[0]);\r\n this.searchUnitService.setDestinationAirport(destination[0]);\r\n }\r\n model.airports && this.searchUnitService.setMultipleDepartureAirports(model.airports);\r\n model.startDate && this.searchUnitService.startDate(this.searchUnitService.flight, model.startDate);\r\n model.endDate && this.searchUnitService.endDate(this.searchUnitService.flight, model.endDate);\r\n model.occupancy && this.occupancyService.setOccupancy(model.occupancy);\r\n model.currency && this.searchUnitService.setCurrency(model.currency);\r\n model.cabin && this.searchUnitService.setCabin(model.cabin);\r\n };\r\n UnifiedSearchService.prototype.populateModelFromSearchUnitService = function (trip, model) {\r\n if (trip) {\r\n if (trip.HotelsRequest) {\r\n model.destination[0] = this.searchUnitService.getDestination();\r\n }\r\n else if (trip.FlightsRequest) {\r\n model.destination[0] = this.searchUnitService.getDestinationAirport();\r\n }\r\n if (trip.FlightsRequest) {\r\n var filterCriteriaAirline = trip.FlightsRequest.FilterCriteria\r\n && trip.FlightsRequest.FilterCriteria.Airline;\r\n var airlines = _.union(filterCriteriaAirline, trip.FlightsRequest.PreferredCarrierCodes).join(',');\r\n if (TRPCONFIG.Domain2.NoAirlinesResetOnSearchPanelFixEnabled) {\r\n model.airlines = airlines ? this.searchQueryString.lookupAirlines(airlines) : model.airlines;\r\n }\r\n else {\r\n model.airlines = this.searchQueryString.lookupAirlines(airlines);\r\n }\r\n }\r\n }\r\n if (trip.TripType === this.tripService.tripTypes.MultiDestHoliday) {\r\n // API populates multiple FlightRequests with SelectedDepartureAirport by user's IP\r\n var flightRequests = trip.MultiDestinationFlightRequests;\r\n var first = flightRequests && flightRequests[0];\r\n if (first) {\r\n this.searchUnitService.setDepartureAirports(first.SelectedDepartureAirport);\r\n }\r\n }\r\n var airports = this.searchUnitService.getDepartureAirports();\r\n model.airports = (model.domainId === TRPCONFIG.Domain.DomainId)\r\n ? _.map(airports, function (a) { return ({ Code: a }); })\r\n : [];\r\n model.startDate = this.searchUnitService.startDate();\r\n model.endDate = this.searchUnitService.endDate();\r\n model.occupancy = this.occupancyService.getOccupancy();\r\n model.currency = this.searchUnitService.getCurrency();\r\n model.cabin = this.searchUnitService.getCabin();\r\n if (typeof this.searchUnitService.flexibleDates === 'boolean') {\r\n model.flexibleDates = this.searchUnitService.flexibleDates;\r\n }\r\n };\r\n UnifiedSearchService.prototype.launchSearch = function (model, searchType, fid, savePreferences, allowDealsSearch, isFlexibleTripType) {\r\n var _this = this;\r\n model.domainId = TRPCONFIG.Domain.DomainId;\r\n if (savePreferences) {\r\n this.saveSearchModel(model);\r\n this.saveSearchType(searchType);\r\n }\r\n if (allowDealsSearch && (searchType === Search.UnifiedSearchType.Holidays && !model.destination[0])) {\r\n // shortcircuit into holiday deals funnel\r\n this.holidayDealsSearch(model);\r\n return;\r\n }\r\n var areaName = this.getAreaName(searchType);\r\n this.sharedSearchUnitService.lockScreen(this.getSearchMessage(searchType), areaName + '-searchDirective');\r\n this.populateSearchUnitService(model);\r\n var modelCopy = angular.copy(model);\r\n var callSearch = function (options) {\r\n options.areaOverride = areaName;\r\n options.fid = fid || _this.fidParser.parse();\r\n options.fbt = _this.$location.search().boardType;\r\n options.fstr = _this.$location.search().stars;\r\n options.hpr = _this.$location.search().holidayPrice;\r\n _this.sharedSearchUnitService.search(undefined, _this.sharedSearchUnitService.showErrors, options, modelCopy, isFlexibleTripType);\r\n };\r\n var options;\r\n switch (searchType) {\r\n case Search.UnifiedSearchType.Holidays:\r\n if (modelCopy.destination && this.destinationService.destinationIsCountry(modelCopy.destination)) {\r\n delete modelCopy.destination;\r\n }\r\n options = this.prepareFlightSearchOptions(modelCopy);\r\n callSearch(options);\r\n break;\r\n case Search.UnifiedSearchType.Hotels:\r\n if (TRPCONFIG.Domain.NoDatesYetEnabled && modelCopy.noDatesYet) {\r\n if (modelCopy.destination && modelCopy.destination[0]) {\r\n // navigate to destination page\r\n this.$location.path(modelCopy.destination[0].PagePath);\r\n }\r\n else {\r\n this.sharedSearchUnitService.showErrors([this.resourceService.get('SELECTDESTINATION')]);\r\n }\r\n }\r\n else {\r\n callSearch({ defaultFilters: true });\r\n }\r\n break;\r\n case Search.UnifiedSearchType.Flights:\r\n options = this.prepareFlightSearchOptions(modelCopy);\r\n callSearch(options);\r\n break;\r\n default:\r\n }\r\n };\r\n UnifiedSearchService.prototype.holidayDealsSearch = function (model) {\r\n // convert model to deals search format\r\n var params = {\r\n airportsCodes: model.airports,\r\n startDate: model.startDate,\r\n duration: model.duration,\r\n occupancy: model.occupancy\r\n };\r\n // mixpanel tracking\r\n this.analytics.track('mixpanel', 'Search', {\r\n Nights: params.duration,\r\n DepartureAirports: params.airportsCodes,\r\n TypeTitle: 'Holiday Deals',\r\n FromDate: { Date: params.startDate },\r\n Rooms: params.occupancy\r\n });\r\n //if (!_validateParameters(params)) { return; }\r\n var serialised = this.holidayDeals.serialiseParameters(params, false);\r\n this.sharedSearchUnitService.lockScreen('SEARCHINGDEALS');\r\n for (var param in serialised) {\r\n this.$location.search(param, serialised[param]);\r\n }\r\n this.$location.path(\"/holidaydeals\");\r\n };\r\n UnifiedSearchService.prototype.prepareFlightSearchOptions = function (model) {\r\n var options = {};\r\n options.onewayonly = model.onewayonly;\r\n options.flexibleDates = TRPCONFIG.Domain.FlexibleDatesEnabled ? model.flexibleDates : true;\r\n options.prefilterDirectFlights = TRPCONFIG.Domain.PrefilterDirectFlightsEnabled\r\n && model.prefilterDirectFlights;\r\n var isPrefilter = TRPCONFIG.Domain.PrefilterAirlineEnabled && !_.some(model.airlines, function (a) { return a.IsPostfilter; });\r\n options.prefilterAirlines = isPrefilter ? _.map(model.airlines, function (a) { return a.Code; }) : [];\r\n options.postfilterAirlines = !isPrefilter ? _.map(model.airlines, function (a) { return a.Title; }) : [];\r\n return options;\r\n };\r\n UnifiedSearchService.prototype.prepopulateModel = function (model, queryStringValues, disableResetOptions) {\r\n var _this = this;\r\n var tripId = this.$route.current &&\r\n this.$route.current.params &&\r\n this.$route.current.params.tripId;\r\n var currentDestination = this.currentDestination.getCurrentDestination({ useSearchUnitService: false });\r\n var searchableDestination = this.getSearchableDestination(currentDestination);\r\n return this.$q.all({\r\n searchableDestination: searchableDestination,\r\n preferences: queryStringValues.resetForm ? null : this.preferences.get('search'),\r\n trip: this.tripService.restoreSearchUnit(tripId)\r\n }).then(function (_a) {\r\n var searchableDestination = _a.searchableDestination, preferences = _a.preferences, trip = _a.trip;\r\n if (!model.destination || !model.destination[0]) {\r\n model.destination = [];\r\n if (preferences && !angular.isString(preferences)) {\r\n var searchArea = _this.sharedSearchUnitService.getAreaInfo();\r\n if (searchArea && searchArea.mode && !queryStringValues.dealsOnly) {\r\n preferences.startDate = _this.searchUnitService.startDate(searchArea.mode)\r\n || preferences.startDate;\r\n preferences.endDate = _this.searchUnitService.endDate(searchArea.mode)\r\n || preferences.endDate;\r\n }\r\n angular.extend(model, _.omit(preferences, ['domainId'])); //ensure the domainID is preserved\r\n model.noDatesYet = false;\r\n model.airlines = _this.searchQueryString.verifyAirlineModels(model.airlines);\r\n }\r\n if (trip) {\r\n _this.populateModelFromSearchUnitService(trip, model);\r\n }\r\n }\r\n if (!disableResetOptions && TRPCONFIG.Domain2.ClearSearchPanelOptionsEnabled) {\r\n model.airlines = [];\r\n model.prefilterDirectFlights = false;\r\n model.flexibleDates = false;\r\n model.cabin = 1;\r\n model.noDatesYet = false;\r\n if (!searchableDestination) {\r\n model.destination = [];\r\n // workaround to clear destination, because validation should fail with empty destination\r\n _this.searchUnitService.setDestination(null, null, null);\r\n _this.searchUnitService.setDestinationAirport(null);\r\n }\r\n }\r\n if (searchableDestination && _.some(searchableDestination, function (value) { return value; })) {\r\n model.destination[0] = searchableDestination;\r\n }\r\n _(['airports', 'startDate', 'endDate', 'occupancy', 'cabin', 'destination', 'currency'])\r\n .forEach(function (key) {\r\n var value = queryStringValues[key];\r\n if (value) {\r\n model[key] = value;\r\n }\r\n });\r\n if (model.domainId !== TRPCONFIG.Domain.DomainId) {\r\n model.airports = [];\r\n }\r\n _.forEach(['airlines', 'prefilterDirectFlights'], function (key) {\r\n var value = queryStringValues[key];\r\n if (!angular.isUndefined(value)) {\r\n model[key] = value;\r\n }\r\n });\r\n if (TRPCONFIG.Domain.EnableNearestDepartureAirports) {\r\n if (!model.airports || !model.airports.length) {\r\n _this.geo.getNearestAirports().then(function (airports) {\r\n if (airports && (!model.airports || !model.airports.length)) {\r\n model.airports = airports;\r\n }\r\n });\r\n }\r\n }\r\n var currencyOptions = _this.searchUnitService.getCurrencyOptions();\r\n if (model.currency && currencyOptions.indexOf(model.currency) === -1) {\r\n model.currency = TRPCONFIG.Domain.CurrencyCode;\r\n }\r\n return model;\r\n });\r\n };\r\n UnifiedSearchService.prototype.getSearchableDestination = function (destinationPromise) {\r\n var _this = this;\r\n return destinationPromise.then(function (destination) {\r\n if (!destination || destination.Searchable !== false || !destination.Type || !destination.Id) {\r\n return destination;\r\n }\r\n var childDestinationPromise = _this.$http.get('/api2/destination/v2/gettopchildrenV2', {\r\n params: {\r\n Count: 1,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n PageStrand: destination.PageStrand,\r\n Type: destination.Type,\r\n Id: destination.Id,\r\n },\r\n ignoreErrors: true,\r\n })\r\n .then(function (response) { return response.data[0]; })\r\n .then(_this.destinationService.enhanceLegacyDestination)\r\n .then(_this.destinationService.getDetails);\r\n return _this.getSearchableDestination(childDestinationPromise);\r\n });\r\n };\r\n UnifiedSearchService.prototype.getDefaultModel = function () {\r\n var model = new Search.UnifiedSearchModel;\r\n model.occupancy = [new Search.SearchOccupancy()];\r\n model.cabin = TRPCONFIG.Domain.DefaultSelectedFlightCabin || 1;\r\n model.destination = [];\r\n model.airports = [];\r\n model.airlines = [];\r\n model.flexibleDates = !TRPCONFIG.Domain.isAgentMode;\r\n model.prefilterDirectFlights = false;\r\n model.onewayonly = false;\r\n model.duration = 0;\r\n model.domainId = TRPCONFIG.Domain.DomainId;\r\n model.currency = TRPCONFIG.Domain.CurrencyCode;\r\n return model;\r\n };\r\n UnifiedSearchService.prototype.getQueryStringValues = function (hiddenQueryString) {\r\n var params = {};\r\n _.forEach((hiddenQueryString || '').split('&'), function (x) {\r\n var parts = x.split('=');\r\n params[parts[0]] = parts[1];\r\n });\r\n return this.searchQueryString.getQueryStringValues(params);\r\n };\r\n UnifiedSearchService.prototype.saveSearchModel = function (model) {\r\n this.preferences.set('search', model);\r\n };\r\n UnifiedSearchService.prototype.saveSearchType = function (searchType) {\r\n this.preferences.set('searchType', searchType);\r\n };\r\n UnifiedSearchService.prototype.validateOccupancy = function (occupancy) {\r\n // check child ages are set\r\n var childAges = [];\r\n _.each(occupancy, function (o) {\r\n childAges = _.concat(childAges, o.ChildAges);\r\n });\r\n var isValidOccupancy = _.every(childAges, function (ca) { return typeof ca !== 'undefined'; });\r\n return isValidOccupancy;\r\n };\r\n return UnifiedSearchService;\r\n }());\r\n Search.UnifiedSearchService = UnifiedSearchService;\r\n angular\r\n .module('search')\r\n .service('unifiedSearchService', UnifiedSearchService);\r\n})(Search || (Search = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .controller('SharedSearchUnit', SharedSearchUnit);\r\n function SharedSearchUnit(sharedSearchUnitService) {\r\n var su = this;\r\n su.showErrors = function (errors) { return sharedSearchUnitService.showErrors(errors); };\r\n su.lockScreen = function (searchMsg) { return sharedSearchUnitService.lockScreen(searchMsg); };\r\n su.unlockScreen = function () { return sharedSearchUnitService.unlockScreen(); };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('datesSearchUnit', datesSearchUnit);\r\n function datesSearchUnit(searchUnitService, sharedSearchUnitService, dateUtil, $window, $route) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n startDate: '=',\r\n endDate: '=?',\r\n startDateLabel: '@',\r\n endDateLabel: '@',\r\n isStartTimeApprovedByCustomer: '=?',\r\n isEndTimeApprovedByCustomer: '=?',\r\n requiresTimeApproval: '=?',\r\n enabledDates: '=',\r\n oneWay: '=',\r\n outboundOnly: '=',\r\n returnOnly: '=',\r\n showTime: '=',\r\n defaultTime: '=',\r\n templateOverride: '@',\r\n areaOverride: '@',\r\n select: '&',\r\n resetDuration: '=?'\r\n },\r\n templateUrl: function (tElement, tAttrs) { return \"partials/\" + (tAttrs.templateOverride || 'searchunit/dates'); },\r\n controller: 'SharedSearchUnit',\r\n link: _linker\r\n };\r\n function _linker(scope) {\r\n var currentArea;\r\n var dateLimits = {};\r\n var halt = scope.$watch('startDate', function (val) {\r\n if (val === undefined) {\r\n return;\r\n }\r\n updateMinDates();\r\n halt();\r\n });\r\n updateCurrentArea(getAreaOverride());\r\n scope.$watch(getAreaOverride, updateCurrentArea);\r\n scope.setStartDate = setStartDate;\r\n scope.setEndDate = setEndDate;\r\n scope.dateLimits = dateLimits;\r\n scope.$watch('oneWay', function (value, old) {\r\n if (value == null || value === old) {\r\n return;\r\n }\r\n searchUnitService.setOneWayFlightEnabled(value);\r\n });\r\n scope.$watch('isStartTimeApprovedByCustomer', function (value) { return searchUnitService.isStartTimeApprovedByCustomer(currentArea.mode, value); });\r\n scope.$watch('isEndTimeApprovedByCustomer', function (value) { return searchUnitService.isEndTimeApprovedByCustomer(currentArea.mode, value); });\r\n function getAreaOverride() {\r\n return scope.areaOverride || scope.$parent.areaOverride ||\r\n ($route.current && $route.current.$$route && $route.current.$$route.area);\r\n }\r\n function updateCurrentArea(areaOverride) {\r\n // observation: if areaOverride = 'holidayDeals' then currentArea does not change\r\n // 'holidayDeals' is not described as an area in area.factory.ts\r\n currentArea = sharedSearchUnitService.getAreaInfo(areaOverride);\r\n updateMinDates();\r\n }\r\n function updateMinDates() {\r\n var areaName = currentArea && currentArea.name;\r\n dateLimits.startDateMin = searchUnitService.getMinStartDate(areaName);\r\n dateLimits.endDateMin = searchUnitService.getMinEndDate(scope.startDate || dateLimits.startDateMin, areaName);\r\n }\r\n function setStartDate(date) {\r\n if (!date || !currentArea) {\r\n return;\r\n }\r\n searchUnitService.startDate(currentArea.mode, date, scope.defaultTime);\r\n searchUnitService.isStartTimeApprovedByCustomer(currentArea.mode, scope.isStartTimeApprovedByCustomer);\r\n scope.startDate = date;\r\n dateLimits.endDateMin = searchUnitService.getMinEndDate(date, currentArea.name);\r\n if (TRPCONFIG.Domain.DurationEnable || scope.resetDuration === true) {\r\n var duration = searchUnitService.duration(currentArea.mode);\r\n var endDateOffset = duration ? duration.value : null;\r\n scope.endDate = dateUtil.addDays(scope.startDate, endDateOffset || TRPCONFIG.Domain.HolidaysSearchEndOffsetDate, true);\r\n searchUnitService.endDate(currentArea.mode, scope.endDate);\r\n var searchDates = sessionStorage.getItem('searchDates');\r\n if (searchDates) {\r\n var searchDatesInfo = JSON.parse(searchDates);\r\n scope.endDate = searchDatesInfo.ISOendDate;\r\n searchUnitService.endDate(currentArea.mode, scope.endDate);\r\n var startStamp = Date.parse(date);\r\n var endStamp = Date.parse(scope.endDate);\r\n if (startStamp > endStamp) {\r\n scope.endDate = dateUtil.addDays(scope.startDate, endDateOffset || TRPCONFIG.Domain.HolidaysSearchEndOffsetDate, true);\r\n searchUnitService.endDate(currentArea.mode, scope.endDate);\r\n }\r\n }\r\n }\r\n else {\r\n //need to refresh the end date because it is possible it has been adjusted\r\n scope.endDate = searchUnitService.endDate(currentArea.mode);\r\n }\r\n }\r\n function setEndDate(date) {\r\n if (!date) {\r\n return;\r\n }\r\n searchUnitService.endDate(currentArea.mode, date);\r\n searchUnitService.isEndTimeApprovedByCustomer(currentArea.mode, scope.isEndTimeApprovedByCustomer);\r\n scope.endDate = date;\r\n }\r\n function initDurationInput() {\r\n scope.options = searchUnitService.getDurationOptions();\r\n scope.$watch('duration', function () {\r\n if (scope.duration) {\r\n // changed : console.log('$watch CHANGED scope.duration ', scope.duration);\r\n searchUnitService.duration(currentArea.mode, scope.duration);\r\n scope.endDate = dateUtil.addDays(scope.startDate, searchUnitService.duration(currentArea.mode).value, true);\r\n searchUnitService.endDate(currentArea.mode, scope.endDate);\r\n }\r\n else if (searchUnitService.duration(currentArea.mode)) {\r\n // retrieve : console.log('$watch RETRIEVE resourceService.SearchUnitDuration ', searchUnitService.duration(currentArea.mode));\r\n scope.duration = scope.options[searchUnitService.duration(currentArea.mode).index];\r\n }\r\n else {\r\n // init : console.log('$watch INIT scope.duration ', scope.duration);\r\n scope.duration = scope.options[0];\r\n }\r\n });\r\n }\r\n if (TRPCONFIG.Domain.DurationEnable) {\r\n initDurationInput();\r\n }\r\n }\r\n }\r\n})();\r\nangular\r\n .module('searchUnit')\r\n .directive('dealsSearchUnit', dealsSearchUnit);\r\nfunction dealsSearchUnit($location, holidayDeals, searchUnitService, sharedSearchUnitService, broker, resourceService, dateUtil, scrollTo, analytics) {\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'dealsSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n areaOverride: '@',\r\n refresh: '=',\r\n noButton: '=',\r\n hideButton: '=',\r\n tracking: '=',\r\n pickMonths: '=',\r\n ldp: '=',\r\n writeToUrl: '='\r\n },\r\n templateUrl: 'partials/searchunit/deals',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n broker.subscribe('dealsSearchUnit', 'autocompleterReady', function (e) {\r\n if (!$(e.data).isOnScreen()) {\r\n var container = ($('.horizontal-search-wrapper').length !== 0)\r\n ? '.horizontal-search-wrapper'\r\n : '.search-panel';\r\n scrollTo(container);\r\n }\r\n });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('dealsSearchUnit');\r\n });\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'dealsSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope) {\r\n var currentArea = sharedSearchUnitService.getAreaInfo(scope.areaOverride);\r\n scope.area = currentArea.name;\r\n scope.durations = holidayDeals.DURATIONS.map(function (d) { return ({\r\n name: d + \" \" + resourceService.get('NIGHTS'),\r\n value: d\r\n }); });\r\n scope.airportDeselect = function () { return searchUnitService.clearDepartureAirports(); };\r\n scope.search = function () {\r\n var params = {\r\n airportsCodes: scope.airports,\r\n startDate: searchUnitService.startDate(currentArea.mode),\r\n duration: scope.duration,\r\n occupancy: scope.occupancy\r\n };\r\n analytics.track('mixpanel', 'Search', {\r\n Nights: params.duration,\r\n DepartureAirports: params.airportsCodes,\r\n TypeTitle: 'Holiday Deals',\r\n FromDate: { Date: params.startDate },\r\n Rooms: params.occupancy\r\n });\r\n if (!_validateParameters(params)) {\r\n return;\r\n }\r\n scope.refresh\r\n ? _refreshSearch(holidayDeals.serialiseParameters(params, false))\r\n : _startSearch(holidayDeals.serialiseParameters(params, false));\r\n };\r\n _restoreSearchCriteria(false);\r\n scope.$watch(function () { return _.size($location.search()); }, function (value) {\r\n if (value === 0) {\r\n _restoreSearchCriteria(true);\r\n }\r\n });\r\n function _restoreSearchCriteria(noWatch) {\r\n holidayDeals.getFullParameters(!!scope.writeToUrl).then(function (params) {\r\n scope.airports = params.depAir.map(function (a) { return ({ Code: a }); });\r\n searchUnitService.setMultipleDepartureAirports(scope.airports);\r\n scope.startDate = searchUnitService.startDate(currentArea.mode, params.startDate);\r\n scope.duration = params.duration;\r\n scope.occupancy = params.occupancy;\r\n if (scope.refresh && !noWatch) {\r\n scope.$watch(function () { return searchUnitService.startDate(currentArea.mode); }, function (n, o) {\r\n _autoStartSearch(n, o);\r\n if (scope.tracking && !angular.equals(n, o)) {\r\n var date = dateUtil.parseDate(n);\r\n var month = date.getMonth() + 1;\r\n var year = date.getFullYear();\r\n _trackChange('startDate', \"month-\" + month + \"-\" + year);\r\n }\r\n }, true);\r\n scope.$watch('occupancy', function (n, o) {\r\n _autoStartSearch(n, o);\r\n if (scope.tracking && !angular.equals(n, o)) {\r\n n = n[0] || n;\r\n var value = {\r\n Adults: n.Adults,\r\n Children: (n.ChildAges || []).length\r\n };\r\n _trackChange('Occupancy', value);\r\n }\r\n }, true);\r\n scope.$watch('duration', function (n, o) {\r\n _autoStartSearch(n, o);\r\n if (scope.tracking && !angular.equals(n, o)) {\r\n _trackChange('Duration', n);\r\n }\r\n });\r\n scope.$watch('airports', function (n, o) {\r\n if (_.size(n) === 0) {\r\n return;\r\n }\r\n searchUnitService.setMultipleDepartureAirports(n);\r\n if (scope.tracking && !angular.equals(n, o)) {\r\n _trackChange('Airports');\r\n }\r\n return _autoStartSearch(n, o);\r\n }, true);\r\n }\r\n });\r\n }\r\n function _autoStartSearch(newValue, oldValue) {\r\n if (newValue && scope.refresh && !angular.equals(newValue, oldValue)) {\r\n scope.search();\r\n }\r\n }\r\n function _trackChange(type, value) {\r\n return value\r\n ? analytics.track('mixpanel', \"HolidayDealsInsp\" + type, { value: value })\r\n : analytics.track('mixpanel', \"HolidayDealsInsp\" + type);\r\n }\r\n function _refreshSearch(params) {\r\n for (var param in params) {\r\n $location.search(param, params[param]);\r\n $location.replace();\r\n }\r\n var position = $('body').scrollTop();\r\n broker.publish('REFRESHSEARCH', { newSearch: true });\r\n var listener = scope.$on('$locationChangeSuccess', function () {\r\n $('body').scrollTop(position);\r\n listener();\r\n });\r\n }\r\n function _startSearch(params) {\r\n scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGDEALS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-dealsSearchUnit'\r\n });\r\n for (var param in params) {\r\n $location.search(param, params[param]);\r\n }\r\n $location.path(\"/holidaydeals\");\r\n }\r\n function _validateParameters(params) {\r\n if (_getNumberOfNonInfantPassengers(params.occupancy[0]) > 12) {\r\n scope.$emit('flash:error', String.format(decodeURI(resourceService.get('TOOMANYPASSENGERS')), TRPCONFIG.DesktopUrlRoot + \"/Help/Groupbookings.aspx\", resourceService.get('TELEPHONENUMBER')));\r\n return false;\r\n }\r\n var childAges = _.get(params, 'occupancy[0].ChildAges');\r\n var isValidOccupancy = _.every(childAges, function (ca) { return typeof ca !== 'undefined'; });\r\n if (!isValidOccupancy) {\r\n scope.$emit('flash:error', resourceService.get('CHILDAGESERROR'));\r\n }\r\n else {\r\n scope.$emit('flash:hide', resourceService.get('CHILDAGESERROR'));\r\n }\r\n return isValidOccupancy;\r\n }\r\n function _getNumberOfNonInfantPassengers(occ) {\r\n function _isolateNonInfants(value) {\r\n return value >= 2;\r\n }\r\n var childrenNumber = occ.ChildAges.filter(_isolateNonInfants).length;\r\n return occ.Adults + childrenNumber;\r\n }\r\n function _getNextMonth() {\r\n var today = new Date();\r\n var month = today.getMonth();\r\n var year = month === 11 ? today.getFullYear() + 1 : today.getFullYear();\r\n month = month === 11 ? 0 : month + 1;\r\n return new Date(year, month, 15, 0, 0, 0, 0);\r\n }\r\n }\r\n}\r\n//Requires configuration options\r\n//HTMLHelpers - UseStaticDepartureDropdown : true\r\n//WebConfig - EnableStaticDepartureDropdown: true\r\n//WebConfig - FixedDepartureAirportOptions : (string value )\r\nvar SearchUnit;\r\n(function (SearchUnit) {\r\n var FixedDepartureDropdown = /** @class */ (function () {\r\n function FixedDepartureDropdown(searchUnitService, $q) {\r\n var _this = this;\r\n this.searchUnitService = searchUnitService;\r\n this.$q = $q;\r\n this.airports = {\r\n options: [],\r\n selected: null\r\n };\r\n $q.all(this.data.split(',').map(searchUnitService.getAirport)).then(function (results) {\r\n _this.airports.options = results.map(function (r) { return _.assign(r, { titleCode: r.Title + \", \" + r.Code }); });\r\n if (_this.selected && _this.selected.length > 0) {\r\n _.each(_this.airports.options, function (airport) {\r\n if (_this.selected[0].Code === airport.Code) {\r\n _this.airports.selected = airport;\r\n }\r\n });\r\n }\r\n //ensure search criteria is persisted\r\n var preSelectedAirport = searchUnitService.getSelectedDepartureAirport();\r\n if (preSelectedAirport) {\r\n var preSelectedIndex = _this.airports.options.filter(function (airport) {\r\n return airport.Code === preSelectedAirport.Code;\r\n });\r\n if (preSelectedIndex.length) {\r\n _this.airports.selected = preSelectedIndex[0];\r\n }\r\n }\r\n });\r\n }\r\n FixedDepartureDropdown.prototype.onDepartureAirportChange = function () {\r\n this.searchUnitService.setDepartureAirports(this.airports.selected);\r\n };\r\n ;\r\n return FixedDepartureDropdown;\r\n }());\r\n angular\r\n .module('searchUnit')\r\n .directive('fixedDepartureDropdown', fixedDepartureDropdown);\r\n function fixedDepartureDropdown(searchUnitService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {},\r\n controllerAs: 'dd',\r\n bindToController: {\r\n data: '=',\r\n selected: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=FixedDepartureDropdown',\r\n controller: FixedDepartureDropdown\r\n };\r\n }\r\n})(SearchUnit || (SearchUnit = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('flightSearchUnit', flightSearchUnit);\r\n function flightSearchUnit(searchUnitService, sharedSearchUnitService, occupancyService, preferences, dateUtil, $q) {\r\n // Configuration part, mandatory in every searchunit directive with delayed linker\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'flightSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n moreOptions: '@',\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/searchunit/flight',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'flightSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope, $element, attr, ssu) {\r\n scope.destinationAirportSelect = destinationAirportSelect;\r\n scope.destinationAirportDeselect = destinationAirportDeselect;\r\n scope.search = search;\r\n scope.getMultiSectorMinDate = getMultiSectorMinDate;\r\n scope.selectLegDate = selectLegDate;\r\n scope.selectLegAirport = selectLegAirport;\r\n scope.addLeg = addLeg;\r\n scope.rmLeg = rmLeg;\r\n scope.onSearchModeChange = onSearchModeChange;\r\n scope.onReturningToggle = onReturningToggle;\r\n scope.searchMode = searchUnitService.isOneWayFlightEnabled() ? 'oneway' : 'return';\r\n scope.onewayonly = searchUnitService.isOneWayFlightEnabled() || false;\r\n scope.isMultiSector = false;\r\n scope.isMultiReturning = true;\r\n scope.legs = [{\r\n DepartureDate: null,\r\n DepartureAirport: null,\r\n DestinationAirport: null,\r\n Cabin: TRPCONFIG.Domain.DefaultCabin\r\n }];\r\n scope.toggleOptions = function () {\r\n scope.expandedOptions = !scope.expandedOptions;\r\n };\r\n scope.airportSelect = function (items) {\r\n searchUnitService.setMultipleDepartureAirports(items);\r\n loadOutboundDates();\r\n };\r\n scope.airportDeselect = function () {\r\n searchUnitService.clearDepartureAirports();\r\n };\r\n if (scope.moreOptions === 'true') {\r\n scope.updateCabin = updateCabin;\r\n scope.cabins = searchUnitService.getCabinOptions();\r\n }\r\n else {\r\n searchUnitService.setDefaultCabin();\r\n }\r\n _restoreSearchCriteria();\r\n function loadOutboundDates() {\r\n function getRequest() {\r\n var DepartureAirportCodes = searchUnitService.getDepartureAirports();\r\n if (!DepartureAirportCodes || !DepartureAirportCodes.length) {\r\n return null;\r\n }\r\n var destinationAirport = searchUnitService.getDestinationAirport();\r\n if (!destinationAirport || !destinationAirport.Code) {\r\n return null;\r\n }\r\n var DestinationAirportCodes = destinationAirport.Code.split(',');\r\n if (!DestinationAirportCodes.length) {\r\n return null;\r\n }\r\n return {\r\n DepartureAirportCodes: DepartureAirportCodes,\r\n DestinationAirportCodes: DestinationAirportCodes\r\n };\r\n }\r\n var request = getRequest();\r\n searchUnitService.loadOutboundDates(request).then(function (outboundDates) { return scope.enabledDates = outboundDates; });\r\n }\r\n function destinationAirportSelect(item) {\r\n var availableResorts = searchUnitService.setDestinationAirport(item, false);\r\n loadOutboundDates();\r\n return availableResorts;\r\n }\r\n function destinationAirportDeselect() {\r\n var availableResorts = searchUnitService.setDestinationAirport(null, false);\r\n scope.enabledDates = {};\r\n return availableResorts;\r\n }\r\n function search() {\r\n ssu.lockScreen('SEARCHINGFLIGHTS');\r\n var flightSearch = {};\r\n mapSearchTerms(flightSearch);\r\n preferences.set('flightSearch', flightSearch);\r\n sharedSearchUnitService.search(undefined, ssu.showErrors, scope.isMultiSector\r\n ? { multi: true, legs: scope.legs, areaOverride: scope.areaOverride }\r\n : { onewayonly: scope.onewayonly, areaOverride: scope.areaOverride });\r\n }\r\n function updateCabin(cabin) {\r\n searchUnitService.setCabin(cabin);\r\n }\r\n function getMultiSectorMinDate(legIndex) {\r\n return legIndex === 0\r\n ? dateUtil.todayPlus(1, 0, true)\r\n : dateUtil.addDays(scope.legs[legIndex - 1].DepartureDate, 1, true);\r\n }\r\n function selectLegDate(leg, date) {\r\n leg.DepartureDate = date;\r\n }\r\n function selectLegAirport(leg, airport, type) {\r\n leg[type] = airport;\r\n if (!scope.isMultiReturning) {\r\n return;\r\n }\r\n var i = scope.legs.indexOf(leg);\r\n if (i === 0 && scope.legs.length > 1 && type === 'DepartureAirport') {\r\n scope.legs[scope.legs.length - 1].DestinationAirport = airport;\r\n }\r\n else if (i > 0 && i === scope.legs.length - 1 && type === 'DestinationAirport') {\r\n scope.legs[0].DepartureAirport = airport;\r\n }\r\n }\r\n function addLeg() {\r\n var prevLeg = scope.legs[scope.legs.length - 1];\r\n if (scope.isMultiReturning && scope.legs.length > 1) {\r\n prevLeg.DestinationAirport = null;\r\n }\r\n scope.legs.push({\r\n DepartureDate: dateUtil.addDays(prevLeg.DepartureDate, 7, true),\r\n DepartureAirport: null,\r\n DestinationAirport: scope.isMultiReturning ? scope.legs[0].DepartureAirport : null,\r\n Cabin: prevLeg.Cabin\r\n });\r\n }\r\n function rmLeg(leg) {\r\n var legs = scope.legs;\r\n var i = legs.indexOf(leg);\r\n legs.splice(i, 1);\r\n if (legs.length > 1 && scope.isMultiReturning) {\r\n if (i === 0) {\r\n legs[0].DepartureAirport = legs[legs.length - 1].DestinationAirport;\r\n }\r\n else if (i === legs.length) {\r\n legs[legs.length - 1].DestinationAirport = legs[0].DepartureAirport;\r\n }\r\n }\r\n }\r\n function onSearchModeChange() {\r\n scope.onewayonly = scope.searchMode === 'oneway';\r\n scope.isMultiSector = scope.searchMode === 'multisector';\r\n }\r\n function onReturningToggle() {\r\n if (scope.isMultiReturning && scope.legs.length > 1) {\r\n scope.legs[scope.legs.length - 1].DestinationAirport = scope.legs[0].DepartureAirport;\r\n }\r\n searchUnitService.setIsMultiReturning(scope.isMultiReturning);\r\n }\r\n function mapSearchTerms(target, source) {\r\n if (!target) {\r\n return;\r\n }\r\n if (!source) {\r\n source = {};\r\n }\r\n var selectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\r\n if (selectedDepartureAirport) {\r\n selectedDepartureAirport = [selectedDepartureAirport];\r\n }\r\n else {\r\n selectedDepartureAirport = searchUnitService.getDepartureAirports();\r\n }\r\n target.airports = searchUnitService.chooseSeachUnitModel(target.airports, source.airports, selectedDepartureAirport);\r\n target.destinationAirport = searchUnitService.chooseSeachUnitModel(target.destinationAirport, source.destinationAirport, searchUnitService.getDestinationAirport());\r\n target.startDate = searchUnitService.chooseSeachUnitModel(target.startDate, source.startDate, searchUnitService.startDate(searchUnitService.flight));\r\n target.endDate = searchUnitService.chooseSeachUnitModel(target.endDate, source.endDate, searchUnitService.endDate(searchUnitService.flight));\r\n var occupancy = target.occupancy || source.occupancy || occupancyService.getOccupancy();\r\n target.occupancy = [occupancy.reduce(function (a, b) {\r\n return {\r\n Adults: a.Adults + b.Adults,\r\n ChildAges: a.ChildAges.concat(b.ChildAges)\r\n };\r\n })];\r\n target.cabin = target.cabin || source.cabin || searchUnitService.getCabin();\r\n target.onewayonly = _.isBoolean(source.onewayonly) ? source.onewayonly : scope.onewayonly;\r\n target.isMultiSector = searchUnitService.getIsMultiSector() || scope.isMultiSector;\r\n target.searchMode = target.isMultiSector ? 'multisector' : target.onewayonly ? 'oneway' : 'return';\r\n target.isMultiReturning = searchUnitService.getIsMultiReturning();\r\n target.legs = searchUnitService.getLegs() || scope.legs;\r\n target.airports && searchUnitService.setMultipleDepartureAirports(target.airports);\r\n target.destinationAirport && searchUnitService.setDestinationAirport(target.destinationAirport);\r\n target.startDate && searchUnitService.startDate(searchUnitService.flight, target.startDate);\r\n target.endDate && searchUnitService.endDate(searchUnitService.flight, target.endDate);\r\n target.occupancy && occupancyService.setOccupancy(target.occupancy);\r\n target.cabin && searchUnitService.setCabin(target.cabin < 0 ? 1 : target.cabin); /// -1 caused API to return unhandled exception\r\n searchUnitService.setIsMultiSector(scope.isMultiSector);\r\n searchUnitService.setLegs(target.legs);\r\n }\r\n function _restoreSearchCriteria() {\r\n var promise = TRPCONFIG.Domain.isAgentMode ? $q.when() : preferences.get('flightSearch');\r\n promise.then(function (flightSearch) {\r\n mapSearchTerms(scope, flightSearch);\r\n });\r\n // Airports may be changed by other multi search forms\r\n scope.$watch(function () { return searchUnitService.getSelectedDepartureAirport(); }, function (v) {\r\n scope.airports = v;\r\n scope.airportsCount = _getAirportsCount(v);\r\n });\r\n }\r\n function _getAirportsCount(airports) {\r\n if (airports && airports.Code) {\r\n return airports.Code.split(',').length;\r\n }\r\n return 0;\r\n }\r\n }\r\n }\r\n})();\r\nangular.module('searchUnit')\r\n .directive('insuranceSearchUnit', insuranceSearchUnit);\r\nfunction insuranceSearchUnit($location, searchUnitService, sharedSearchUnitService, occupancyService, dateUtil) {\r\n // Configuration part, mandatory in every searchunit directive with delayed linker\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'insuranceSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/searchunit/insurance',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'insuranceSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope, el, attr, ssu) {\r\n var mode = sharedSearchUnitService.getAreaInfo(scope.areaOverride).mode;\r\n scope.model = {};\r\n scope.policyTypeSelect = policyTypeSelect;\r\n scope.travelDestinationSelect = travelDestinationSelect;\r\n scope.search = search;\r\n // Initialise form\r\n _restoreSearchCriteria();\r\n function _restoreSearchCriteria() {\r\n scope.startDate = searchUnitService.startDate(mode);\r\n scope.endDate = searchUnitService.endDate(mode);\r\n scope.travelDestination = searchUnitService.getTravelDestination();\r\n scope.policyType = searchUnitService.getPolicyType();\r\n scope.occupancy = [occupancyService.reduceOccupancy()];\r\n }\r\n searchUnitService.getPolicyTypes().then(function (res) {\r\n scope.policyTypes = res;\r\n });\r\n searchUnitService.getTravelDestinations().then(function (res) {\r\n scope.travelDestinations = res;\r\n });\r\n searchUnitService.getPolicyExtras().then(function (res) {\r\n scope.policyExtras = res;\r\n });\r\n function travelDestinationSelect() {\r\n searchUnitService.setTravelDestination(scope.travelDestination);\r\n }\r\n function policyTypeSelect() {\r\n searchUnitService.setPolicyType(scope.policyType);\r\n }\r\n function search() {\r\n //set selected polict extras\r\n var selectedPolicyExtras = [];\r\n scope.policyExtras.forEach(function (e) {\r\n if (e.Selected) {\r\n selectedPolicyExtras.push({ Id: e.Id, Name: e.Name });\r\n }\r\n });\r\n searchUnitService.setPolicyExtra(selectedPolicyExtras);\r\n //set default end date for annual policy\r\n if (scope.policyType && scope.policyType.Id === 2) {\r\n scope.endDate = dateUtil.addDays(scope.startDate, 365, true);\r\n searchUnitService.endDate(mode, scope.endDate);\r\n }\r\n occupancyService.setOccupancy(scope.occupancy);\r\n ssu.lockScreen('SEARCHINGINSURANCE');\r\n sharedSearchUnitService.search(undefined, ssu.showErrors, {\r\n areaOverride: scope.areaOverride\r\n });\r\n }\r\n }\r\n}\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('marhabaSearchUnit', function () {\r\n return {\r\n templateUrl: 'partials/searchunit/marhaba',\r\n controller: 'MarhabaSearchUnitCtrl',\r\n controllerAs: 'msu',\r\n replace: true,\r\n scope: {\r\n areaOverride: '@'\r\n },\r\n restrict: 'E',\r\n link: function () {\r\n // do nothing\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('parkingSearchUnit', parkingSearchUnit);\r\n function parkingSearchUnit(searchUnitService, sharedSearchUnitService, occupancyService) {\r\n // Configuration part, mandatory in every searchunit directive with delayed linker\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'parkingSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/searchunit/parking',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'parkingSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope, el, attr, ssu) {\r\n var currentArea = sharedSearchUnitService.getAreaInfo(scope.areaOverride);\r\n var mode = currentArea.mode;\r\n var minPassengers = 1;\r\n var maxPassengers = occupancyService.adultRange(currentArea.name).max || 7;\r\n // Props on scope\r\n scope.passengerRange = _.range(minPassengers, maxPassengers + 1);\r\n // Methods on scope\r\n scope.departureAirportSelect = searchUnitService.setDepartureAirports;\r\n scope.departureAirportDeselect = departureAirportDeselect;\r\n scope.passengerSelect = passengerSelect;\r\n scope.search = search;\r\n // Initialise form\r\n _restoreSearchCriteria();\r\n function _restoreSearchCriteria() {\r\n scope.passengerCount = occupancyService.getPassengerCount() || 1;\r\n scope.departureAirport = searchUnitService.getSelectedDepartureAirport();\r\n scope.startDate = searchUnitService.startDate(mode);\r\n scope.endDate = searchUnitService.endDate(mode);\r\n passengerSelect();\r\n }\r\n function departureAirportDeselect() {\r\n return searchUnitService.clearDepartureAirports();\r\n }\r\n function passengerSelect() {\r\n occupancyService.setPassengerCount(scope.passengerCount);\r\n }\r\n function search() {\r\n ssu.lockScreen('SEARCHINGPARKING');\r\n sharedSearchUnitService.search(undefined, ssu.showErrors);\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n /*\r\n Injects an input field for filtering resorts based on `destinationAirport`.\r\n HTML for results is not injected to allow any UI implementation using `scope.resorts`.\r\n */\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('resortField', function (searchUnitService, $filter, $rootScope, $timeout) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n select: '&',\r\n deselect: '&',\r\n loadOnce: '=',\r\n currentValue: '=',\r\n placeholder: '@'\r\n },\r\n transclude: true,\r\n replace: true,\r\n templateUrl: 'partials/searchunit/resortfield',\r\n link: function (scope, el) {\r\n var currDest;\r\n var loadingClass = 'small-spinner';\r\n var inputField = el.find('.resort-input');\r\n // Props on scope\r\n scope.resorts = undefined;\r\n scope.allResorts = undefined;\r\n scope.resortInput = inputField;\r\n // Methods on scope\r\n scope.setResort = function (r) {\r\n scope.resortTerm = r.Description;\r\n scope.select({ item: r });\r\n };\r\n init(scope.loadOnce);\r\n function init(once) {\r\n // Set any existing field value\r\n var unwatchCurrent = scope.$watch('currentValue', function (v) {\r\n if (v) {\r\n if (!scope.resortTerm) {\r\n scope.resortTerm = v.Description;\r\n }\r\n // Remove watch when value is found\r\n unwatchCurrent();\r\n }\r\n });\r\n // Filter resorts\r\n scope.$watch('resortTerm', function (v) {\r\n scope.resorts = filterResorts(v);\r\n // If user cleared field that contained a value\r\n if (!v && inputField.hasClass('ng-touched')) {\r\n scope.deselect();\r\n }\r\n });\r\n if (once) {\r\n // Load resorts once only i.e. Mobile\r\n // Timer ensures view has initialised\r\n $timeout(updateResorts);\r\n }\r\n else {\r\n // Watch destination airport for changes\r\n scope.$watch('$parent.destinationAirport', function (v) {\r\n if (!v) {\r\n scope.allResorts =\r\n scope.resorts =\r\n scope.resortTerm =\r\n currDest = undefined;\r\n }\r\n else if (!currDest || v.Title !== currDest.Title) {\r\n updateResorts();\r\n currDest = v;\r\n }\r\n });\r\n }\r\n }\r\n function updateResorts() {\r\n inputField.addClass(loadingClass);\r\n fetchResorts().then(function () {\r\n inputField.removeClass(loadingClass);\r\n });\r\n }\r\n function fetchResorts() {\r\n scope.allResorts =\r\n scope.resorts = undefined;\r\n return searchUnitService.getAvailableResorts()\r\n .then(function (res) {\r\n var resMatch;\r\n var currTerm = scope.resortTerm;\r\n scope.allResorts = // Keep a copy of all resorts\r\n scope.resorts = res; // This will change to filtered results\r\n // Re-select term if it exists in results\r\n if (currTerm && _.some(res, function (o) {\r\n if (o.Description.toLowerCase() === currTerm.toLowerCase()) {\r\n resMatch = o;\r\n return true; // Quits at first match\r\n }\r\n })) {\r\n scope.setResort(resMatch);\r\n }\r\n else {\r\n scope.resortTerm = undefined;\r\n }\r\n }, function (msg) {\r\n $rootScope.$broadcast('flash:error', msg);\r\n });\r\n }\r\n function filterResorts(str) {\r\n // Equivalent to 'allResorts|filter:str|limitTo:30'\r\n return $filter('limitTo')($filter('filter')(scope.allResorts, str), 30);\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('roomSearchUnit', roomSearchUnit);\r\n function roomSearchUnit($routeParams, broker, searchUnitService, sharedSearchUnitService, occupancyService, scrollService) {\r\n // Configuration part, mandatory in every searchunit directive with delayed linker\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'roomSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n landing: '@'\r\n },\r\n templateUrl: 'partials/searchunit/room',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'roomSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope, $element, attr, ssu) {\r\n var currentArea = sharedSearchUnitService.getAreaInfo();\r\n scope.dateRangeMetadata = {\r\n minStartDate: searchUnitService.getMinStartDate(currentArea.name),\r\n enabledStartDates: {},\r\n durations: {},\r\n showDatePicker: false,\r\n selectDateRange: function () {\r\n searchUnitService.startDate(currentArea.mode, scope.startDate);\r\n searchUnitService.endDate(currentArea.mode, scope.endDate);\r\n scope.dateRangeMetadata.showDatePicker = false;\r\n }\r\n };\r\n scope.occupancyMetadata = searchUnitService.getOccupancyConfig(currentArea.name);\r\n scope.occupancyMetadata.showOccupancyPicker = false;\r\n scope.$watchCollection('occupancy', function (val) {\r\n if (val && val[0]) {\r\n scope.occupancyMetadata.occupancyCaption = occupancyService.getOccupancyString(val);\r\n occupancyService.setOccupancy(val);\r\n }\r\n });\r\n _restoreSearchCriteria();\r\n scope.updateCurrency = updateCurrency;\r\n scope.currencyOptions = searchUnitService.getCurrencyOptions();\r\n scope.toggleOptions = function () { scope.expandedOptions = !scope.expandedOptions; };\r\n scope.searchRooms = searchRooms;\r\n scope.searching = false;\r\n function searchRooms() {\r\n scope.searching = true;\r\n broker.publish('roomSearchStarted');\r\n scope.$emit('flash:error', null);\r\n if (scope.landing) {\r\n ssu.lockScreen('SEARCHINGFORROOMSPROMPT');\r\n }\r\n scrollService.setScrollTarget('#roomsPanel');\r\n sharedSearchUnitService.search(null, _showRoomErrors, {\r\n roomSearch: true,\r\n estabId: $routeParams.estabId\r\n });\r\n }\r\n function _showRoomErrors(errors) {\r\n scope.searching = false;\r\n broker.publish('roomSearchEnded');\r\n scope.$emit('flash:error', errors);\r\n ssu.unlockScreen();\r\n }\r\n function _restoreSearchCriteria() {\r\n scope.startDate = searchUnitService.startDate(currentArea.mode);\r\n scope.endDate = searchUnitService.endDate(currentArea.mode);\r\n scope.occupancy = occupancyService.getOccupancy();\r\n scope.currency = searchUnitService.getCurrency();\r\n }\r\n function updateCurrency() {\r\n searchUnitService.setCurrency(scope.currency);\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .directive('transferSearchUnit', transferSearchUnit);\r\n function transferSearchUnit($location, searchUnitService, sharedSearchUnitService, occupancyService, autocompleter, $rootScope, transferSearch) {\r\n // Configuration part, mandatory in every searchunit directive with delayed linker\r\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'transferSearchUnit');\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/searchunit/transfer',\r\n controller: 'SharedSearchUnit',\r\n link: function (scope, el, attr, controller) {\r\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'transferSearchUnit');\r\n }\r\n };\r\n function _delayedLinker(scope, el, attr, ssu) {\r\n var mode = sharedSearchUnitService.getAreaInfo(scope.areaOverride).mode;\r\n scope.model = {};\r\n scope.$watch(function () { return transferSearch.getTransfersTimeApprovalRequired(TRPCONFIG.Domain.EnableTransfersTimeApproval); }, function (value) {\r\n scope.requiresTimeApproval = value;\r\n });\r\n // ab-test code:\r\n // var $root = angular.element(document.body).scope().$root;\r\n // $root.transferDirectionStyle = 'radio';\r\n // $root.$evalAsync();\r\n scope.transferDirectionStyle = function () { return $rootScope.transferDirectionStyle || TRPCONFIG.Domain.TransferDirectionStyle; };\r\n // Props on scope\r\n scope.directionOps = _.mapValues(\r\n // Numbers are required by `searchUnitService` but numeric keys are always strings\r\n // Swap key/value and coerce to number\r\n _.invert(searchUnitService.getDirectionStrings()), function (v) { return v * 1; });\r\n scope.transferTypes = _.mapValues(_.invert(searchUnitService.getTransferTypeStrings()), function (v) { return v * 1; });\r\n var destinationTypePointTypeMap = {\r\n 0: searchUnitService.pointType.Unknown,\r\n 1: searchUnitService.pointType.Estab,\r\n 2: searchUnitService.pointType.Location,\r\n 3: searchUnitService.pointType.Unknown,\r\n 4: searchUnitService.pointType.Unknown,\r\n 5: searchUnitService.pointType.Unknown,\r\n 10: searchUnitService.pointType.Unknown\r\n };\r\n var pointTypeDestinationTypeMap = (_a = {},\r\n _a[searchUnitService.pointType.Unknown] = 0,\r\n _a[searchUnitService.pointType.Estab] = 1,\r\n _a[searchUnitService.pointType.Location] = 2,\r\n _a);\r\n // Methods on scope\r\n scope.destinationAirportSelect = destinationAirportSelect;\r\n scope.destinationAirportDeselect = destinationAirportDeselect;\r\n scope.resortSelect = searchUnitService.setResort;\r\n scope.resortDeselect = resortDeselect;\r\n scope.directionSelect = directionSelect;\r\n scope.search = search;\r\n scope.transferTypeSelect = transferTypeSelect;\r\n scope.dropOffPointDeselect = dropOffPointDeselect;\r\n scope.pickUpPointDeselect = pickUpPointDeselect;\r\n scope.pickUpPointSelect = pickUpPointSelect;\r\n scope.dropOffPointSelect = dropOffPointSelect;\r\n scope.pointToPointOneWay = pointToPointOneWay;\r\n // Initialise form\r\n _restoreSearchCriteria();\r\n function _restoreSearchCriteria() {\r\n var destination = searchUnitService.getDestinationAirport() || {};\r\n var airportCode = destination.Code || destination.DestinationAirports || $location.search().air || '';\r\n if (airportCode && airportCode.indexOf(',') === -1) {\r\n autocompleter.lookup('transfers', airportCode).then(function (response) {\r\n destinationAirportSelect(_.filter(response.data, { Code: airportCode })[0]);\r\n });\r\n }\r\n scope.resort = searchUnitService.getResort();\r\n scope.model.direction = searchUnitService.getDirection();\r\n scope.startDate = searchUnitService.startDate(mode);\r\n scope.endDate = searchUnitService.endDate(mode);\r\n scope.isStartTimeApprovedByCustomer = searchUnitService.isStartTimeApprovedByCustomer(mode);\r\n scope.isEndTimeApprovedByCustomer = searchUnitService.isEndTimeApprovedByCustomer(mode);\r\n scope.occupancy = [occupancyService.reduceOccupancy()];\r\n directionSelect();\r\n scope.transferType = searchUnitService.getTransferType();\r\n transferTypeSelect();\r\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n var pickUpPoint = searchUnitService.getTransferPickUpPoint();\r\n var dropOffPoint = searchUnitService.getTransferDropOffPoint();\r\n if (pickUpPoint) {\r\n pickUpPoint.Type = pointTypeDestinationTypeMap[pickUpPoint.Type];\r\n }\r\n if (dropOffPoint) {\r\n dropOffPoint.Type = pointTypeDestinationTypeMap[dropOffPoint.Type];\r\n }\r\n pickUpPointSelect(pickUpPoint);\r\n dropOffPointSelect(dropOffPoint);\r\n }\r\n }\r\n function destinationAirportSelect(a) {\r\n scope.destinationAirport = a;\r\n searchUnitService.setDestinationAirport(a, true);\r\n }\r\n function destinationAirportDeselect() {\r\n scope.destinationAirport = null;\r\n return searchUnitService.setDestinationAirport(null);\r\n }\r\n function resortDeselect() {\r\n searchUnitService.setResort(null);\r\n }\r\n function directionSelect() {\r\n var dir = scope.model.direction;\r\n if (dir != null) {\r\n scope.isOneWay = (dir === 2); // Airport to resort only\r\n scope.isReturnOnly = (dir === 3); // Resort to airport only\r\n // Restore any existing search dates\r\n // `setDirection()` below may have set them to `null`\r\n restoreDates();\r\n // Update search\r\n searchUnitService.setDirection(dir);\r\n }\r\n }\r\n function restoreDates() {\r\n if (!scope.isReturnOnly && scope.startDate) {\r\n searchUnitService.startDate(mode, scope.startDate);\r\n }\r\n if (!scope.isOneWay && scope.endDate) {\r\n searchUnitService.endDate(mode, scope.endDate);\r\n }\r\n }\r\n function search() {\r\n occupancyService.setOccupancy(scope.occupancy);\r\n ssu.lockScreen('SEARCHINGTRANSFERS');\r\n sharedSearchUnitService.search(undefined, ssu.showErrors, {\r\n areaOverride: scope.areaOverride,\r\n enableTransfersTimeApproval: TRPCONFIG.Domain.EnableTransfersTimeApproval\r\n });\r\n }\r\n function transferTypeSelect() {\r\n scope.isAirportTransfer = (scope.transferType === searchUnitService.transferTypes.AirportTransfer);\r\n searchUnitService.setTransferType(scope.transferType);\r\n }\r\n function pickUpPointDeselect() {\r\n scope.pickUpPoint = null;\r\n searchUnitService.setTransferPickUpPoint(null);\r\n }\r\n function dropOffPointDeselect() {\r\n scope.dropOffPoint = null;\r\n searchUnitService.setTransferDropOffPoint(null);\r\n }\r\n function pickUpPointSelect(p) {\r\n scope.pickUpPoint = p;\r\n if (p) {\r\n searchUnitService.setTransferPickUpPoint({\r\n Type: destinationTypePointTypeMap[p.Type],\r\n Code: p.Code,\r\n Description: p.Description || p.Title\r\n });\r\n }\r\n }\r\n function dropOffPointSelect(d) {\r\n scope.dropOffPoint = d;\r\n if (d) {\r\n searchUnitService.setTransferDropOffPoint({\r\n Type: destinationTypePointTypeMap[d.Type],\r\n Code: d.Code,\r\n Description: d.Description || d.Title\r\n });\r\n }\r\n }\r\n function pointToPointOneWay() {\r\n if (scope.isPointToPointOneWay) {\r\n scope.model.direction = 2;\r\n scope.isOneWay = true;\r\n }\r\n else {\r\n scope.model.direction = 1;\r\n scope.isOneWay = false;\r\n }\r\n searchUnitService.setDirection(scope.model.direction);\r\n }\r\n var _a;\r\n }\r\n }\r\n})();\r\nvar Area;\r\n(function (Area_1) {\r\n function Area(searchUnitService, basketService) {\r\n return {\r\n 'hotels': {\r\n name: 'hotels',\r\n mode: searchUnitService.hotel,\r\n flow: basketService.hotelBooking,\r\n searchMsg: 'SEARCHINGHOTELS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Hotels,\r\n timeSupport: false,\r\n },\r\n 'transfers': {\r\n name: 'transfers',\r\n mode: searchUnitService.transfer,\r\n flow: basketService.transferBooking,\r\n searchMsg: 'SEARCHINGTRANSFERS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Transfers,\r\n timeSupport: true,\r\n },\r\n 'holidays': {\r\n name: 'holidays',\r\n mode: searchUnitService.flight,\r\n flow: basketService.holidayBooking,\r\n searchMsg: 'SEARCHINGFLIGHTSANDHOTELS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.FlightsAndHolidays,\r\n timeSupport: false,\r\n },\r\n 'flights': {\r\n name: 'flights',\r\n mode: searchUnitService.flight,\r\n flow: basketService.flightBooking,\r\n searchMsg: 'SEARCHINGFLIGHTS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.FlightsAndHolidays,\r\n timeSupport: false,\r\n },\r\n 'marhaba': {\r\n name: 'marhaba',\r\n mode: searchUnitService.marhaba,\r\n flow: basketService.marhabaBooking,\r\n searchMsg: 'SEARCHINGMARHABA',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Marhaba,\r\n timeSupport: true,\r\n },\r\n 'emirates': {\r\n name: 'emirates',\r\n mode: searchUnitService.hotel,\r\n flow: basketService.hotelBooking,\r\n searchMsg: 'SEARCHINGHOTELS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Hotels,\r\n timeSupport: false,\r\n },\r\n 'parking': {\r\n name: 'parking',\r\n mode: searchUnitService.parking,\r\n flow: basketService.parkingBooking,\r\n searchMsg: 'SEARCHINGPARKING',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Parking,\r\n timeSupport: true,\r\n },\r\n 'attractions': {\r\n name: 'attractions',\r\n mode: searchUnitService.attractions,\r\n flow: basketService.attractionsBooking,\r\n searchMsg: 'SEARCHINGATTRACTIONS',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Attractions,\r\n timeSupport: false,\r\n },\r\n 'insurance': {\r\n name: 'insurance',\r\n mode: searchUnitService.insurance,\r\n flow: basketService.insuranceBooking,\r\n searchMsg: 'SEARCHINGINSURANCE',\r\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Insurance,\r\n timeSupport: false,\r\n }\r\n };\r\n }\r\n angular\r\n .module('TR')\r\n .factory('Area', Area);\r\n})(Area || (Area = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('searchUnit')\r\n .factory('sharedSearchUnitService', sharedSearchUnitService);\r\n function sharedSearchUnitService($route, $routeParams, $q, tripService, basketService, Area, broker, $rootScope, resourceService) {\r\n var delayedLinkers = {};\r\n var areasInfo = Area;\r\n var service = {\r\n addDelayedLinker: addDelayedLinker,\r\n getAreaInfo: getAreaInfo,\r\n initializeArea: initializeArea,\r\n search: search,\r\n showErrors: showErrors,\r\n lockScreen: lockScreen,\r\n unlockScreen: unlockScreen\r\n };\r\n function addDelayedLinker(linkerFn, key) {\r\n delayedLinkers[key] = linkerFn;\r\n }\r\n function getAreaInfo(areaOverride) {\r\n return areasInfo[(areaOverride || ($route.current && $route.current.$$route ? $route.current.$$route.area : ''))];\r\n }\r\n function initializeArea(scope, el, attr, controller, key) {\r\n var tripId = $routeParams.tripId;\r\n var areaPromise = tripId ? tripService.getTrip(tripId) : $q.when();\r\n areaPromise.then(function loadCriteriaWrapper() {\r\n _loadCriteria(scope, el, attr, controller, key);\r\n });\r\n }\r\n function search(getSearchResultsFn, showErrorsFn, options, searchModel, isFlexibleTripType) {\r\n if (!options) {\r\n options = {};\r\n }\r\n var params = {\r\n multi: options.multi || false,\r\n legs: options.legs || null,\r\n samePage: options.samePage,\r\n oneWayOnly: options.onewayonly,\r\n estabId: options.estabId,\r\n defaultFilters: options.defaultFilters,\r\n roomSearch: options.roomSearch,\r\n fid: options.fid,\r\n fbt: options.fbt,\r\n fstr: options.fstr,\r\n hpr: options.hpr,\r\n flexibleDates: options.flexibleDates,\r\n prefilterAirlines: options.prefilterAirlines,\r\n prefilterDirectFlights: options.prefilterDirectFlights,\r\n enableTransfersTimeApproval: options.enableTransfersTimeApproval,\r\n postfilterAirlines: options.postfilterAirlines,\r\n searchModel: searchModel,\r\n isFlexibleTripType: isFlexibleTripType\r\n };\r\n basketService.startWorkflow(getAreaInfo(options.areaOverride).flow, params)\r\n .then(getSearchResultsFn, showErrorsFn);\r\n }\r\n function _loadCriteria(scope, el, attr, controller, key) {\r\n function _delayedLinkerWrapper() {\r\n delayedLinkers[key].call(undefined, scope, el, attr, controller);\r\n }\r\n _delayedLinkerWrapper();\r\n }\r\n function showErrors(errors) {\r\n broker.publish('unblock');\r\n $rootScope.$emit('unblock');\r\n $rootScope.$broadcast('flash:error', errors);\r\n }\r\n function lockScreen(searchMsg, loadingScreenStyle) {\r\n $rootScope.$emit('block', {\r\n title: resourceService.get(searchMsg),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: loadingScreenStyle\r\n });\r\n $rootScope.$broadcast('flash:hide');\r\n }\r\n function unlockScreen() {\r\n $rootScope.unlockScreen($rootScope);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .controller('Resorts', Resorts);\r\n function Resorts(searchUnitService, $window) {\r\n this.setResort = function (item) {\r\n searchUnitService.setResort(item);\r\n // Timer avoids infinite digest loops\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .controller('TransferAirports', TransferAirports);\r\n function TransferAirports(searchUnitService, destinationService, $location, $route) {\r\n var cm = this;\r\n cm.setDestinationAirport = setDestinationAirport;\r\n cm.setDestinations = setDestinations;\r\n searchUnitService.getAirports().then(function (airports) {\r\n cm.airports = airports;\r\n });\r\n function setDestinationAirport(airport) {\r\n searchUnitService.setDestinationAirport(airport, $route.current.area === 'transfers');\r\n $location.path($route.current.area);\r\n }\r\n function setDestinations(airport) {\r\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled) {\r\n destinationService.getDetails(airport).then(function (destination) {\r\n searchUnitService.setDestination(destination);\r\n setDestinationAirport(destination);\r\n });\r\n }\r\n else {\r\n setDestinationAirport(airport);\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .controller('TransferDirection', TransferDirection);\r\n function TransferDirection($scope, searchUnitService, $location, $route, resourceService) {\r\n var cm = this;\r\n cm.directions = [\r\n { val: 1, name: resourceService.get('RETURN') },\r\n { val: 2, name: resourceService.get('AIRPORTTORESORT') },\r\n { val: 3, name: resourceService.get('RESORTTOAIRPORT') }\r\n ];\r\n cm.transfer = {\r\n direction: searchUnitService.getDirection()\r\n };\r\n $scope.$on('radio-clicked', function () {\r\n searchUnitService.setDirection(cm.transfer.direction);\r\n $location.path($route.current.area);\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .controller('TransferSearch', TransferSearch);\r\n function TransferSearch($scope, $location, transferSearch, $routeParams, basketService, tripService, resourceService, broker, occupancyService, analytics) {\r\n var cm = this;\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGTRANSFERS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-transferSearchCtrl'\r\n });\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n var transferRq = trip && trip.TransfersRequest;\r\n if (transferRq) {\r\n var searchId_2 = transferRq.AvailabilitySearchId;\r\n transferSearch.getSearchResults(searchId_2, trip.TripId).then(function (data) {\r\n cm.transfers = data;\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n }, function () {\r\n $location.path('transfers');\r\n });\r\n tripService.getTransfersRequestSummary($routeParams.tripId)\r\n .then(function (summary) { return cm.summary = summary; });\r\n cm.getPricePP = function (totalPrice) {\r\n var numPassengers = occupancyService.getNumberOfNonInfantPassengers() || 1;\r\n return totalPrice / numPassengers;\r\n };\r\n analytics.track('mixpanel', 'TransferPage');\r\n cm.selectTransfer = function (transfer) {\r\n var data = {\r\n Title: transfer.Type,\r\n CostPP: transfer.PerPersonPrice,\r\n CostTotal: transfer.TotalPrice,\r\n TotalOptions: cm.transfers.length,\r\n MinOptionCostTotal: _.first(cm.transfers).TotalPrice,\r\n MaxOptionCostTotal: _.last(cm.transfers).TotalPrice,\r\n SupplierName: transfer.SupplierName\r\n };\r\n analytics.track('mixpanel', 'OptionsTransferSelected', data);\r\n basketService.selectTransfer(transfer.TransferId, searchId_2, trip.BasketId, trip.TripId);\r\n cm.selectedTransfer = transfer.TransferId;\r\n };\r\n }\r\n });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .service('transferDetail', transferDetail);\r\n function transferDetail($http, $cacheFactory, $q, broker) {\r\n var url = '/api3/transfers/details/';\r\n var timeout;\r\n var promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n var service = {\r\n getTransferDetails: getTransferDetails,\r\n rehydrate: rehydrate\r\n };\r\n function getTransferDetails(request) {\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n timeout = $q.defer();\r\n return $http.post(url + \"get\", request, {\r\n timeout: timeout.promise,\r\n customErrCallback: function (args) {\r\n if (args.status && args.status !== -1) {\r\n broker.publish('transferRequestFailed');\r\n }\r\n return true;\r\n }\r\n }).then(function (res) {\r\n promiseCache.remove(res.data.DetailsSessionId);\r\n timeout = null;\r\n return res.data;\r\n });\r\n }\r\n function rehydrate(id) {\r\n if (!promiseCache.get(id)) {\r\n promiseCache.put(id, $http.post(url + \"getfromsession\", { DetailsSessionId: id }, { ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n }));\r\n }\r\n return promiseCache.get(id);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .service('transferSearch', transferSearch);\r\n function transferSearch($http, occupancyService, transferSearchValidator, searchUnitService, $q, tripService, analytics) {\r\n var domain = TRPCONFIG.Domain;\r\n var req = {\r\n CultureCode: domain.CultureCode,\r\n CurrencyCode: domain.CurrencyCode,\r\n DomainId: domain.DomainId,\r\n TradingGroupId: domain.TradingGroup\r\n };\r\n var results;\r\n var inProgress;\r\n var url = '/api3/transfers/availability/';\r\n var service = {\r\n validateSearchCriteria: validateSearchCriteria,\r\n clearSearchResults: clearSearchResults,\r\n getSearchResults: getSearchResults,\r\n search: search,\r\n getAvailabilityRequest: getAvailabilityRequest,\r\n getUrl: getUrl,\r\n getTransfersTimeApprovalRequired: getTransfersTimeApprovalRequired\r\n };\r\n function _doRequest(r, newSearch) {\r\n return newSearch ?\r\n $http.post(url + \"get\", r) :\r\n $http.post(url + \"getfromsession\", { AvailabilitySearchId: r.AvailabilitySearchId }, { ignoreErrors: true });\r\n }\r\n function validateSearchCriteria(options) {\r\n options = options || {};\r\n var start = searchUnitService.startDate(searchUnitService.transfer);\r\n var end = searchUnitService.endDate(searchUnitService.transfer);\r\n var transfersTimeApprovalRequired = getTransfersTimeApprovalRequired(options.enableTransfersTimeApproval);\r\n if (transfersTimeApprovalRequired) {\r\n if (!searchUnitService.isStartTimeApprovedByCustomer(searchUnitService.transfer)) {\r\n start = null;\r\n }\r\n if (!searchUnitService.isEndTimeApprovedByCustomer(searchUnitService.transfer)) {\r\n end = null;\r\n }\r\n }\r\n return transferSearchValidator.validate(searchUnitService.getDestinationAirport(), searchUnitService.getResort(), searchUnitService.getDirection(), start, end, occupancyService.reduceOccupancy(), searchUnitService.getLocationId(), searchUnitService.getTransferType(), searchUnitService.getTransferPickUpPoint(), searchUnitService.getTransferDropOffPoint());\r\n }\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n function getSearchResults(searchId, tripId) {\r\n if (results && results !== 'null') {\r\n return $q.when(_.cloneDeep(results));\r\n }\r\n return search({ searchId: searchId, tripId: tripId });\r\n }\r\n function search(args) {\r\n if (inProgress != null && !args.newSearch) {\r\n return inProgress;\r\n }\r\n req.AvailabilitySearchId = args.searchId;\r\n req.TripId = args.tripId;\r\n if (args.newSearch) {\r\n var transferType = searchUnitService.getTransferType();\r\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled && transferType === searchUnitService.transferTypes.AirportTransfer) {\r\n req.DestinationAirport = searchUnitService.getDestinationAirport();\r\n req.AirportCode = req.DestinationAirport.Code;\r\n var route = searchUnitService.getRoute();\r\n if (route) {\r\n req.Route = route;\r\n }\r\n else {\r\n var location_1 = searchUnitService.getLocationId();\r\n req.LocationId = location_1 || 0;\r\n }\r\n }\r\n else {\r\n var pickUpPoint = searchUnitService.getTransferPickUpPoint();\r\n var dropOffPoint = searchUnitService.getTransferDropOffPoint();\r\n req.Route = {\r\n PickUpPoint: pickUpPoint,\r\n DropOffPoint: dropOffPoint\r\n };\r\n }\r\n req.IsFlightPlus = args.isFlightPlus;\r\n //Note we are deliberately cocking up the dates because we have to\r\n req.ArrivalDate = searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.transfer) : null;\r\n req.ReturnDate = searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.transfer) : null;\r\n req.BalanceDueDateOverride = args.BalanceDueDateOverride;\r\n }\r\n else if (args.searchId === '00000000-0000-0000-0000-000000000000') {\r\n //we get an empty guid back from the availability call when there are no results.\r\n //This means that there will be nothing in the session so we can just return an empty array\r\n return $q.when([]);\r\n }\r\n analytics.startTimer('TransfersAvailabilityRequest');\r\n inProgress = tripService.getTripReducedOccupancy(req.TripId).then(function (occ) {\r\n occ = occ || occupancyService.reduceOccupancy();\r\n req.Adults = occ.Adults;\r\n req.ChildAges = occ.ChildAges;\r\n var pax = req.Adults + req.ChildAges.length;\r\n if (args.newSearch) {\r\n tripService.recordTransferSearch(args.tripId, req);\r\n }\r\n return _doRequest(req, args.newSearch)\r\n .then(function (res) {\r\n analytics.endTimer('TransfersAvailabilityRequest');\r\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\r\n results = res.data.Transfers;\r\n inProgress = null;\r\n enrichData(results, pax);\r\n return _.cloneDeep(results);\r\n }, function () {\r\n inProgress = null;\r\n results = null;\r\n });\r\n });\r\n return inProgress;\r\n }\r\n function getAvailabilityRequest() {\r\n return req;\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n function enrichData(transfers, totalPax) {\r\n angular.forEach(transfers, function (transfer) {\r\n transfer.PerPersonPrice = transfer.TotalPrice / totalPax;\r\n });\r\n }\r\n function getTransfersTimeApprovalRequired(enableTransfersTimeApproval) {\r\n return enableTransfersTimeApproval && TRPCONFIG.Domain.DeviceType !== 'Mobile';\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('transfers')\r\n .service('transferSearchValidator', transferSearchValidator);\r\n function transferSearchValidator(resourceService, dateUtil, occupancyService) {\r\n var service = {\r\n validate: validate\r\n };\r\n function validate(destinationAirport, resort, direction, arrivalDate, returnDate, occupancy, locationId, transferType, pickUpPoint, dropOffPoint) {\r\n var errors = [];\r\n var airportToResort = 2;\r\n var resortToAirport = 3;\r\n var airportTransferType = 0;\r\n if (occupancyService.moreInfantsThanAdults()) {\r\n errors.push(resourceService.get('TOOMANYINFANTS'));\r\n }\r\n if (!occupancyService.childAgesPopulated()) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n if (transferType && transferType !== airportTransferType) {\r\n if (pickUpPoint == null) {\r\n errors.push(resourceService.get('SELECTPICKUPPOINT'));\r\n }\r\n if (dropOffPoint == null) {\r\n errors.push(resourceService.get('SELECTDROPOFFPOINT'));\r\n }\r\n }\r\n else {\r\n if (destinationAirport == null) {\r\n errors.push(resourceService.get('SELECTDESTINATIONAIRPORT'));\r\n }\r\n if (resort == null && locationId == null) {\r\n errors.push(resourceService.get('SELECTRESORT'));\r\n }\r\n }\r\n if (direction !== resortToAirport) {\r\n if (arrivalDate == null) {\r\n errors.push(resourceService.get('SELECTARRIVALDATETIME'));\r\n }\r\n else if (!dateUtil.atLeastOneDayInTheFuture(arrivalDate)) {\r\n errors.push(resourceService.get('ARRIVALDATEMUSTBEFUTURE'));\r\n }\r\n }\r\n if (direction !== airportToResort) {\r\n if (returnDate == null) {\r\n errors.push(resourceService.get('SELECTRETURNDATETIME'));\r\n }\r\n else if (direction !== airportToResort && returnDate <= arrivalDate) {\r\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\r\n }\r\n }\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n 'use strict';\r\n var Review = /** @class */ (function () {\r\n function Review() {\r\n }\r\n return Review;\r\n }());\r\n var AppPromo = /** @class */ (function () {\r\n function AppPromo(analytics) {\r\n this.analytics = analytics;\r\n this.analytics.track('mixpanel', 'AppPromoLanding');\r\n this.benefits = _.map(TRPCONFIG.Domain.AppPromoBenefits, function (b) {\r\n var _a = _.split(b, '|'), icon = _a[0], title = _a[1];\r\n return { icon: icon, title: title };\r\n });\r\n this.why = TRPCONFIG.Domain.AppPromoWhy;\r\n this.androidReviews = _.map(TRPCONFIG.Domain.AppPromoAndroidReviews, this._parseReview);\r\n this.IOSReviews = _.map(TRPCONFIG.Domain.AppPromoIOSReviews, this._parseReview);\r\n this.overlay = {\r\n image: \"url(\\\"\" + TRPCONFIG.Domain.AppPromoOverlayImage + \"\\\")\",\r\n text: TRPCONFIG.Domain.AppPromoOverlayText\r\n };\r\n $.each({\r\n 'title': \"<title>\" + TRPCONFIG.Domain.AppPromoMetaTitle + \"\",\r\n 'meta[name=title]': \"\",\r\n 'meta[name=description]': \"\"\r\n }, function (selector, htmlStr) {\r\n $(selector).remove();\r\n $('head').append(htmlStr);\r\n });\r\n }\r\n AppPromo.prototype.trackClick = function (appStore) {\r\n this.analytics.track('mixpanel', 'AppPromoClick', { appStore: appStore });\r\n };\r\n AppPromo.prototype._parseReview = function (review) {\r\n var _a = _.split(review, '|'), author = _a[0], date = _a[1], rating = _a[2], comment = _a[3];\r\n return {\r\n author: author,\r\n date: date,\r\n rating: parseInt(rating, 10),\r\n comment: comment\r\n };\r\n };\r\n return AppPromo;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('AppPromo', AppPromo);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('Home', Home);\r\n function Home($route, broker, occupancyService, publicityService, criteoService) {\r\n var cm = this;\r\n var area = $route.current.area;\r\n publicityService.getStats({\r\n StatisticTypes: 'All'\r\n }).then(function (data) {\r\n cm.stats = {\r\n numberOfAirlines: data.AirlineCount.Value,\r\n numberOfHotels: data.EstabCount.Value\r\n };\r\n });\r\n occupancyService.enforceAreaLimits(area);\r\n // if we arrive at this route we must cancel any outstanding searches\r\n broker.publish('homePageHit');\r\n criteoService.enqueue({}, 'home', area === 'holidays' ? 4 : 2);\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('LandingPage', LandingPage);\r\n function LandingPage($injector, resourceService, imageService, $rootScope, $timeout, pageStrand, loggingService, holidayDeals, filtering, $location, $scope, recentHotels, hotelService, $route, $filter, $routeParams, destinationService, searchUnitService, currentDestination, $q, broker, supportedProducts, analytics, occupancyService, tripService, objectTypeService, fidParser) {\r\n var lp = this;\r\n var seoData = {};\r\n var destination;\r\n $rootScope.lockScreen($scope, {\r\n loadingScreenStyle: 'default-landingPageCtrl'\r\n });\r\n $scope.landingPageV2Loaded = function () {\r\n if ($location.search().autoSearch !== '1') {\r\n broker.publish('landingPageV2Loaded');\r\n loadDeals();\r\n }\r\n };\r\n delete $route.current.$$route.area;\r\n function loadDeals() {\r\n $q.all([\r\n holidayDeals.find({ pageSize: 8, destination: destination, saveToUrl: false, includeCruises: false }),\r\n filtering.getFilters(holidayDeals.getDefaultFilters(), pageStrand.get('Holiday'))\r\n ]).then(function (_a) {\r\n var deals = _a[0], filters = _a[1];\r\n _.forEach(deals.Products, function (deal) { return deal.ImageUrl = deal.CroppedImage; });\r\n $scope.deals = {\r\n Products: deals.Products,\r\n Aggregates: deals.Aggregates,\r\n Filters: filters\r\n };\r\n });\r\n }\r\n $scope.goToDeal = function (deal) {\r\n var selected = deal.HolidayDeals[0];\r\n var estabId = deal.Id;\r\n var occupancy = occupancyService.getOccupancy();\r\n $scope.$emit('block', {\r\n title: resourceService.get('LOADINGHOTELS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-landingPageCtrl-selectRecommendation'\r\n });\r\n tripService\r\n .getTripIdForHolidayDeal(selected, occupancy)\r\n .then(function (tripId) { return $location.path(\"/holidays/\" + tripId + \"/\" + estabId); });\r\n };\r\n currentDestination.getCurrentDestination()\r\n .then(updateDest)\r\n .then(updateNoIndexFollow)\r\n .then(getSeoData)\r\n .then(setDOMContent)\r\n .then(function () {\r\n if ($location.search().autoSearch !== '1') {\r\n broker.publish('unblock');\r\n }\r\n });\r\n function updateDest(dest) {\r\n if (dest == null) {\r\n loggingService.logWarn(\"failed to look up destination for friendly url \" + $routeParams.landingPage);\r\n $rootScope.unlockScreen($scope);\r\n $location.replace();\r\n $location.path('pagenotfound');\r\n return dest;\r\n }\r\n lp.destination = dest;\r\n //if this is a hotel it's always going to have pagestrand 1 so we need to customer for the tm=1 qs param\r\n if (destinationService.destinationIsEstab(dest)) {\r\n analytics.track('mixpanel', dest.PageStrand === 1 ? 'HotelLandingPage' : 'HolidayLandingPage');\r\n analytics.incrementPeopleEvent(dest.PageStrand === 1 ? 'HotelLandingPage visit' : 'HolidayLandingPage visit');\r\n }\r\n function supportedProduct() {\r\n if (dest.PageStrand === 1) {\r\n return supportedProducts.isProductSupported(supportedProducts.products.hotels);\r\n }\r\n return supportedProducts.isProductSupported(supportedProducts.products.holidays);\r\n }\r\n if (!supportedProduct()) {\r\n $location.replace();\r\n $location.path('/');\r\n $rootScope.unlockScreen($scope);\r\n $q.reject();\r\n return;\r\n }\r\n destination = { Type: dest.Type, Id: dest.Id };\r\n $route.current.$$route.area = pageStrand.toRoute(dest.PageStrand);\r\n //we might be coming back here from selecting a new destination from the autocompleter in mobile\r\n //so we need to check whether destination is already and we are just changing it in the search unit\r\n var currentDest = searchUnitService.getDestination();\r\n if (currentDest == null || !currentDest.changed) {\r\n return searchUnitService.setDestination(dest, false, true).then(setTemplate);\r\n }\r\n return setTemplate(dest);\r\n }\r\n function getSeoData(dest) {\r\n // Get available SEO data once `setTemplate` has run\r\n if (dest == null) {\r\n return;\r\n }\r\n var subscriberName = 'landingPageCtrl';\r\n // Get resource strings\r\n seoData.inOrNearStr = resourceService.get(dest.IsPOI ? 'NearDestination' : 'InDestination');\r\n // Hotel\r\n if ($scope.hotel) {\r\n return dest; // No extra data needed\r\n }\r\n else if (destinationService.destinationIsCountry(dest)) {\r\n // Get lowest price when data is ready\r\n analytics.track('mixpanel', 'CountryLandingPage');\r\n analytics.incrementPeopleEvent('CountryLandingPage visit');\r\n return $q(function (resolve) {\r\n broker.subscribeOnce(subscriberName, 'landingPageV2Loaded', function () {\r\n resolve(dest);\r\n });\r\n broker.subscribeOnce(subscriberName, 'destTopChildrenRetrieved', function (results) {\r\n seoData.price = getLowestPrice(results && results.data, 'MinHotelPrice');\r\n resolve(dest);\r\n });\r\n });\r\n }\r\n // Not Hotel or Country\r\n // Get lowest price when data is ready\r\n return $q(function (resolve) {\r\n broker.subscribeOnce(subscriberName, 'landingPageV2Loaded', function () {\r\n resolve(dest);\r\n });\r\n broker.subscribeOnce(subscriberName, 'hotelResultsModified', function (results) {\r\n var data = results && results.data;\r\n seoData.price = getLowestPrice(data && data.Hotels, 'IndicativeMinPrice');\r\n resolve(dest);\r\n });\r\n });\r\n }\r\n function setDOMContent(dest) {\r\n if (dest == null) {\r\n return;\r\n }\r\n var dataPoints = [\r\n // `alt` is resource name to use if transformed string exceeds `max` length\r\n { name: 'MetaTitle', max: 59, alt: 'AltMetaTitle' },\r\n { name: 'MetaDescription', max: 159, alt: 'AltMetaDescription' },\r\n { name: 'PageTitle' },\r\n { name: 'PageHeading' }\r\n ];\r\n var hotel = $scope.hotel;\r\n dest.IsPreview = ($routeParams.ispreview !== undefined && $routeParams.ispreview.toLowerCase() === 'true');\r\n // Create content from string templates\r\n destinationService.getText(dest)\r\n .then(function (templStrings) {\r\n // Get values from available data\r\n var varMap = getVarMap(hotel, dest);\r\n var descStrings = {};\r\n // Replace {vars} in `templStrings`\r\n dataPoints.forEach(function (dataPoint) {\r\n var dataName = dataPoint.name;\r\n var maxChars = dataPoint.max;\r\n var templStr = templStrings[dataName] || '{name}';\r\n var transformedStr = String.supplant(templStr, varMap) || '';\r\n // If `max` chars specified, use `alt` template if it exists\r\n if (maxChars && transformedStr.length > maxChars) {\r\n var altTemplStr = templStrings[dataPoint.alt];\r\n if (altTemplStr) {\r\n transformedStr = String.supplant(altTemplStr, varMap);\r\n }\r\n }\r\n descStrings[dataName] = transformedStr;\r\n });\r\n // Add HotelSummary if available\r\n descStrings.HotelSummary = hotel && hotel.Summary || undefined;\r\n descStrings.MetaRobots = templStrings.MetaRobots || undefined;\r\n // Image url i.e. `og:image`\r\n descStrings.imageURL = imageService.getLandingPageImage(dest);\r\n // Update HTML elements\r\n updateDOM(descStrings);\r\n });\r\n }\r\n function getAbParam() {\r\n var qs = $location.search();\r\n var fid = fidParser.parse();\r\n if (fid || qs.fbt || qs.fstr || qs.hpr) {\r\n return 1;\r\n }\r\n return qs.ab || TRPCONFIG.Domain.LandingPagesV2Control || 1;\r\n }\r\n function getTemplate(dest, ab) {\r\n var strand = pageStrand.toRoute(dest.PageStrand);\r\n var params = objectTypeService.getObjectTypeAndId(dest);\r\n params.ab = ab;\r\n switch (destinationService.getDestinationType(dest)) {\r\n case destinationService.country:\r\n return $q.when(\"partials/\" + strand + \"/country?\" + $.param(params));\r\n case destinationService.estab:\r\n recentHotels.set(dest.EstablishmentId);\r\n return hotelService.getHotel(null, dest.EstablishmentId).then(function (hotel) {\r\n broker.publish('hotelCacheReady', hotel);\r\n delete hotel.Rooms;\r\n $scope.hotel = hotel;\r\n return \"partials/\" + strand + \"/hotellanding?landing=true\";\r\n });\r\n default:\r\n params.landing = true;\r\n return $q.when(\"partials/\" + strand + \"/hotelsearch?\" + $.param(params));\r\n }\r\n }\r\n function setTemplate(dest) {\r\n var ab = getAbParam(dest);\r\n return getTemplate(dest, ab).then(function (template) {\r\n lp.template = template;\r\n return dest;\r\n });\r\n }\r\n function getLowestPrice(hotels, priceProp) {\r\n var prices = [];\r\n if (Array.isArray(hotels)) {\r\n hotels.forEach(function (hotel) {\r\n var price = hotel && hotel[priceProp];\r\n if (price) {\r\n prices.push(price);\r\n }\r\n });\r\n }\r\n return _.min(prices) || undefined;\r\n }\r\n function getVarMap(hotel, dest) {\r\n // Variable mapping in string templates i.e. {name}\r\n // Also supports legacy numeric vars i.e. {0}\r\n var getBcTitle = destinationService.getBreadcrumbTitle;\r\n // If hotel data exists\r\n if (hotel) {\r\n return {\r\n 0: hotel.Title,\r\n 1: seoData.inOrNearStr,\r\n 2: hotel.Province + \", \" + hotel.Country,\r\n name: hotel.Title,\r\n in: seoData.inOrNearStr,\r\n price: $filter('roundedCurrency')(hotel.IndicativeMinPrice),\r\n province: hotel.Province,\r\n country: hotel.Country,\r\n location: hotel.Location\r\n };\r\n }\r\n // Else get destination data\r\n return {\r\n 0: dest.Title,\r\n 1: seoData.inOrNearStr,\r\n name: dest.ShortTitle,\r\n in: seoData.inOrNearStr,\r\n price: $filter('roundedCurrency')(seoData.price),\r\n country: getBcTitle(dest, function (bc) { return bc.ObjectId === dest.CountryId; }),\r\n province: getBcTitle(dest, function (bc) { return bc.ObjectId === dest.ProvinceId; }),\r\n number: \"\" + dest.HotelCount // String for continuity\r\n };\r\n }\r\n function updateDOM(descStrings) {\r\n // Update page title\r\n document.title = descStrings.PageTitle;\r\n // Replace or create DOM elements: {selector: htmlStr, ...}\r\n $.each({\r\n 'meta[name=title]': \"\",\r\n 'meta[name=description]': \"\",\r\n 'meta[property=\"og:title\"]': \"\",\r\n 'meta[property=\"og:description\"]': \"\"\r\n }, function (selector, htmlStr) {\r\n $(selector).remove();\r\n $('head').append(htmlStr);\r\n });\r\n //Update meta robots\r\n if (_.get(descStrings, 'MetaRobots.length') > 0) {\r\n var robots = $('meta[name=\"robots\"]');\r\n if (robots.length > 0) {\r\n robots.attr('content', descStrings.MetaRobots);\r\n }\r\n else {\r\n $('head').append(\"\");\r\n }\r\n }\r\n // Update or create og:image\r\n // If present replace the standard site logo, otherwise add the 'og:image' tag from scratch\r\n var ogImage = $('meta[name=\"og:image\"]');\r\n if (ogImage) {\r\n ogImage.attr('content', descStrings.imageURL);\r\n }\r\n else {\r\n $('head').append(\"\");\r\n }\r\n }\r\n function updateNoIndexFollow(dest) {\r\n if (dest && dest.HotelCount === 1) {\r\n var destinationType = destinationService.getDestinationType(dest);\r\n if (destinationType !== destinationService.estab) {\r\n broker.publish('ISNOINDEXFOLLOW', { isNoIndexFollow: true });\r\n }\r\n }\r\n return dest;\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('LoadingScreen', LoadingScreen);\r\n function LoadingScreen($scope, resourceService, publicityService, searchUnitService, currentDestination, broker, tripService, $route, funcUtil, $timeout, $rootScope, analytics) {\r\n var cm = this;\r\n var properties = { name: resourceService.getDeferred('PROPERTIES'), icon: 'icon-hotels' };\r\n var reviews = { name: resourceService.getDeferred('HOTELREVIEWS'), icon: 'icon-reviews' };\r\n var airlines = { name: resourceService.getDeferred('AIRLINES'), icon: 'icon-flights' };\r\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\r\n publicityService.getStats({\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n StatisticTypes: 'All',\r\n SearchDate: searchUnitService.startDate(searchUnitService.flight) || searchUnitService.startDate(searchUnitService.hotel)\r\n }).then(function (data) {\r\n cm.stats = data;\r\n properties.count = data.EstabCount;\r\n reviews.count = data.ReviewCount;\r\n airlines.count = data.AirlineCount;\r\n });\r\n }\r\n $scope.$watch('searching', function (v) {\r\n if (v) {\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n cm.destination = dest;\r\n TRPCONFIG.searchState = 'searching';\r\n });\r\n }\r\n TRPCONFIG.searchState = 'resultloaded';\r\n });\r\n broker.subscribe('LoadingScreen', 'tripUpdated', function (trip) {\r\n (trip.data.TripId ? tripService.getTripDestination(trip.data.TripId)\r\n : currentDestination.getCurrentDestination())\r\n .then(function (dest) { return cm.destination = dest; });\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('LoadingScreen');\r\n });\r\n cm.chooseStyles = function (loadingScreenStyle) {\r\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\r\n if (window.logLoadingScreenStyle) {\r\n console.log('loadingScreenStyle: ', loadingScreenStyle);\r\n }\r\n var strippedloadingScreenStyle = (loadingScreenStyle || '').split('-')[0];\r\n switch (strippedloadingScreenStyle) {\r\n case 'booking':\r\n cm.showBookMessage = true;\r\n cm.scalemessages = [];\r\n if (!cm.usp) {\r\n cm.usp = ['USPHOLIDAYDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\r\n }\r\n break;\r\n case 'hotels':\r\n cm.showBookMessage = false;\r\n cm.scalemessages = [properties, reviews];\r\n cm.usp = ['USPDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\r\n break;\r\n case 'flights':\r\n cm.showBookMessage = false;\r\n cm.scalemessages = [airlines];\r\n cm.usp = ['USPLOWESTPRICES'];\r\n break;\r\n default:\r\n cm.showBookMessage = false;\r\n cm.scalemessages = [properties, reviews, airlines];\r\n cm.usp = ['USPHOLIDAYDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\r\n break;\r\n }\r\n }\r\n };\r\n $timeout(function () {\r\n var area = $route.current && $route.current.$$route && $route.current.$$route.area;\r\n cm.chooseStyles(area + \"-loadingScreenCtrl\");\r\n });\r\n var windowPrerenderReadyTrue = _.debounce(function () { return window.prerenderReady = true; }, 1000);\r\n var key = 'timer';\r\n var scrollTimeout;\r\n $rootScope.$on('block', function (ev, data) {\r\n window.prerenderReady = false;\r\n analytics.endTimer(key);\r\n scrollTimeout = $timeout(function () {\r\n // This will be cancelled if unblock runs immediately\r\n // Avoids scroll during form validation\r\n scrollTo(0, 0);\r\n });\r\n $scope.title = data.title;\r\n $scope.subtitle = data.subtitle;\r\n $rootScope.searching = true;\r\n $scope.searching = true;\r\n if ($scope.cm && $scope.cm.chooseStyles) {\r\n $scope.cm.chooseStyles(data.loadingScreenStyle);\r\n }\r\n key = $scope.title || 'timer';\r\n analytics.startTimer(key);\r\n });\r\n function unblock() {\r\n windowPrerenderReadyTrue();\r\n $rootScope.searching = false;\r\n $scope.searching = false;\r\n $timeout.cancel(scrollTimeout);\r\n analytics.endTimer(key);\r\n }\r\n $rootScope.$on('unblock', unblock);\r\n broker.subscribe('LoadingScreenDirective', 'unblock', unblock);\r\n $scope.$on('$destroy', function () { return broker.unsubscribe('LoadingScreenDirective'); });\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('NotFound', NotFound);\r\n function NotFound(basketService, analytics, broker, occupancyService, $scope, $location, $route, savedSearchService) {\r\n broker.publish('unblock');\r\n var cm = this;\r\n var type = {\r\n 3: basketService.holidayBooking,\r\n 2: basketService.hotelBooking,\r\n 4: basketService.transferBooking\r\n };\r\n cm.area = $route.current.area;\r\n savedSearchService.getSavedSearches().then(function (searches) {\r\n cm.mostRecent = _.head(searches);\r\n if (cm.mostRecent) {\r\n cm.mostRecent.occupancyStr = occupancyService.getOccupancyString(cm.mostRecent.Rooms);\r\n }\r\n });\r\n cm.restore = function () {\r\n if (cm.mostRecent == null) {\r\n $location.path(\"/\" + cm.area);\r\n }\r\n else {\r\n $scope.$emit('block', {\r\n title: null,\r\n loadingScreenStyle: 'default-notFoundCtrl'\r\n });\r\n savedSearchService.restoreSearch(cm.mostRecent).then(function () {\r\n basketService.startWorkflow(type[cm.mostRecent.SearchType]);\r\n analytics.trackEvent({ label: 'rescued from trip 404' });\r\n });\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('Occupancy', Occupancy);\r\n function Occupancy($window, occupancyService, arrayUtil, $route) {\r\n var cm = this;\r\n var area = $route.current.area;\r\n cm.adultRange = occupancyService.adultRange(area);\r\n cm.ages = occupancyService.ages;\r\n cm.applyOccupancy = occupancyService.applyOccupancy;\r\n cm.childRange = occupancyService.childRange(area);\r\n cm.childrenChanged = childrenChanged;\r\n cm.maxAge = area === 'marhaba' ? 12 : 17;\r\n cm.occupancyAgeConfig = {\r\n Min: 0,\r\n Max: cm.maxAge\r\n };\r\n cm.addRoom = addRoom;\r\n cm.removeRoom = removeRoom;\r\n cm.showRoom = showRoom;\r\n cm.isActive = isActive;\r\n cm.occupancy = occupancyService.getOccupancy();\r\n cm.passengerCount = occupancyService.getPassengerCount();\r\n //if this is transfers / marhaba / insurance occupancy then rooms don't make sense and we need to merge the occupancy into one room\r\n if (area === 'transfers' || area === 'marhaba' || area === 'insurance' || area === 'flights') {\r\n cm.occupancy = [occupancyService.reduceOccupancy()];\r\n }\r\n cm.currentRoom = cm.occupancy[0];\r\n _countChildren();\r\n occupancyService.onApplyOccupancy(function () {\r\n setTimeout(function () {\r\n occupancyService.setOccupancy(cm.occupancy);\r\n occupancyService.setPassengerCount(cm.passengerCount);\r\n $window.history.back();\r\n }, 0);\r\n });\r\n function isActive(room) {\r\n return room === cm.currentRoom ? 'active' : '';\r\n }\r\n function childrenChanged() {\r\n arrayUtil.addOrRemove(cm.currentRoom.ChildAges, cm.currentRoom.numChildren, function () {\r\n // Default child age\r\n return 8;\r\n });\r\n }\r\n function addRoom() {\r\n cm.occupancy = occupancyService.addRoom();\r\n cm.currentRoom = cm.occupancy[cm.occupancy.length - 1];\r\n _countChildren();\r\n }\r\n function removeRoom(index) {\r\n cm.occupancy = occupancyService.removeRoom(index);\r\n cm.currentRoom = cm.occupancy[cm.occupancy.length - 1];\r\n }\r\n function showRoom(index) {\r\n cm.currentRoom = cm.occupancy[index];\r\n }\r\n function _countChildren() {\r\n cm.occupancy.forEach(function (o) {\r\n o.numChildren = (o.ChildAges || []).length;\r\n });\r\n }\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var PromotionTermsPageConfig = /** @class */ (function () {\r\n function PromotionTermsPageConfig() {\r\n }\r\n return PromotionTermsPageConfig;\r\n }());\r\n var PromotionTerm = /** @class */ (function () {\r\n function PromotionTerm() {\r\n }\r\n return PromotionTerm;\r\n }());\r\n var PromotionTerms = /** @class */ (function () {\r\n function PromotionTerms(hotelSearch) {\r\n var _this = this;\r\n this.hotelSearch = hotelSearch;\r\n this.promotionTermsPageConfig = TRPCONFIG.Domain.PromotionTermsPageConfig;\r\n this.hotelSearch.getPromotionTerms().then(function (res) {\r\n _this.promotionsTermsList = res;\r\n })\r\n .catch(function () { return false; });\r\n }\r\n return PromotionTerms;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('PromotionTerms', PromotionTerms);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('RootController', RootController);\r\n function RootController($rootScope, $scope, $location, $route, $interval, bootstrapper, publicityService, locationService, imageService, modalService, currentDestination, agentModeService, broker, globalisationService, analytics) {\r\n var rc = this;\r\n var sidebarMenuOpen = false;\r\n bootstrapper.init();\r\n $scope.$on('$routeChangeStart', function (scope, next) {\r\n rc.hideDistractionLinks = !!next.hideDistractionLinks;\r\n rc.hideTravelAgentLinks = !!next.hideTravelAgentLinks;\r\n rc.hideSiteFooter = !!next.hideSiteFooter;\r\n rc.hideFooterToolbar = !!next.hideFooterToolbar;\r\n rc.inTransactionalFlow = !!next.inTransactionalFlow;\r\n rc.bodyUncontained = !!next.bodyUncontained;\r\n rc.minimalHeader = false;\r\n rc.closeModal();\r\n rc.hideSiteMailingSignUp();\r\n rc.showSfChat = !!next.pathParams.tripId;\r\n });\r\n broker.subscribe('RootController', 'hideFooter', function () { return rc.hideSiteFooter = true; });\r\n broker.subscribe('RootController', 'stripHeader', function () { return rc.minimalHeader = true; });\r\n rc.showPopup = false;\r\n rc.popupUrl = '';\r\n rc.impersonatedUserName = false;\r\n rc.preventPopupClose = true;\r\n rc.hideHeaderBar = false;\r\n rc.modalParams = null;\r\n rc.agentModeEnabled = TRPCONFIG.Domain.isAgentMode;\r\n rc.DomainHostName = TRPCONFIG.Domain.HostName;\r\n rc.hideFooterToolBar = TRPCONFIG.Domain2.FooterToolBarABTest;\r\n $scope.$on('$routeChangeSuccess', function () {\r\n var regEx = /.*\\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[0-9a-fA-F]{0,1}[/]*?/;\r\n var abtesttUrl = ($location.$$path.match(regEx) || $location.$$path.match(/attractions/));\r\n var abtesttUrlMatched = abtesttUrl && abtesttUrl.input;\r\n if (abtesttUrlMatched) {\r\n rc.hideMinimalHeader = window.TRPCONFIG.Domain2.HideMinimalHeader;\r\n }\r\n else {\r\n rc.hideMinimalHeader = false;\r\n }\r\n // this is needed to poll for when the googletag api is ready and then we force a refresh\r\n var googletagPoll;\r\n if ((TRPCONFIG.Domain2.Platform195EnabledPages.includes('home') ||\r\n TRPCONFIG.Domain2.Platform195MobileEnabledPages.includes('home')) &&\r\n window.googletag &&\r\n $location.path() === '/') {\r\n googletagPoll = $interval(function () {\r\n if (window.googletag && window.googletag.apiReady) {\r\n var slots = document.querySelectorAll('.platform-195-slot');\r\n var refreshSlots_1 = 0;\r\n slots.forEach(function (_a) {\r\n var innerHTML = _a.innerHTML;\r\n if (/googletag\\.cmd\\.push/.test(innerHTML) && (!/google_ads_iframe/.test(innerHTML))) {\r\n refreshSlots_1++;\r\n }\r\n });\r\n if (refreshSlots_1 > 0) {\r\n window.googletag.pubads().refresh();\r\n }\r\n $interval.cancel(googletagPoll);\r\n }\r\n }, 10);\r\n }\r\n });\r\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.ShowAgentOfficeSelector) {\r\n agentModeService.getAgentInformation().then(function (data) {\r\n if (data) {\r\n var officeLocations = data.OfficeLocations;\r\n if (officeLocations && officeLocations.length > 0) {\r\n rc.enableOfficeChange = officeLocations.length > 1;\r\n officeLocations.forEach(function (loc) {\r\n if (loc.Id === data.CurrentOfficeLocation) {\r\n rc.selectedOfficeLocation = loc.Name;\r\n }\r\n });\r\n }\r\n var permittedDomains_1 = data.PermittedDomains;\r\n var permittedRegions_1;\r\n if (permittedDomains_1) {\r\n globalisationService.getAllDomains().then(function (allDomains) {\r\n var currentDomain = allDomains.filter(function (d) { return d.Id === TRPCONFIG.Domain.DomainId; })[0];\r\n var parentDomainId = currentDomain.ParentId ? currentDomain.ParentId : TRPCONFIG.Domain.DomainId;\r\n var parentSubDomains = allDomains.filter(function (d) { return d.ParentId === parentDomainId; });\r\n if (permittedDomains_1.length === 0) {\r\n permittedRegions_1 = parentSubDomains;\r\n }\r\n else {\r\n permittedRegions_1 = parentSubDomains.filter(function (d) { return permittedDomains_1.indexOf(d.Id) !== -1; });\r\n }\r\n rc.enableDomainChange = permittedRegions_1.length > 1;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n rc.queryString = function () {\r\n return location.search.replace('?', '');\r\n };\r\n rc.filmCampaignTrack = function (event, channel) {\r\n var Page = $location.path().match('[^/]+$')[0];\r\n var data = { Page: Page };\r\n if (channel) {\r\n data.Channel = channel;\r\n }\r\n analytics.track('mixpanel', event, data);\r\n };\r\n modalService.onLaunch(function (val, preventClose, hideHeaderBar) {\r\n rc.modal(val, preventClose, hideHeaderBar);\r\n });\r\n modalService.onClose(function () {\r\n rc.closeModal();\r\n });\r\n rc.modal = function (path, preventClose, hideHeaderBar, modalParams) {\r\n rc.preventPopupClose = preventClose;\r\n rc.popupUrl = path;\r\n rc.showPopup = true;\r\n rc.hideHeaderBar = hideHeaderBar;\r\n rc.modalParams = modalParams;\r\n };\r\n rc.enableHotelSearchResultsPageDesignChangeABTest = function () {\r\n return window.TRPCONFIG.Domain2.EnableHotelSearchResultsPageDesignChange;\r\n };\r\n rc.closeModal = function () {\r\n rc.popupUrl = '';\r\n rc.showPopup = false;\r\n };\r\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\r\n publicityService.getStats({\r\n StatisticTypes: 'All'\r\n }).then(function (stats) {\r\n rc.stats = stats;\r\n });\r\n }\r\n rc.home = function () {\r\n locationService.home();\r\n };\r\n rc.go = function (path) {\r\n $location.path(path);\r\n };\r\n rc.menuClicked = function (e) {\r\n sidebarMenuOpen = !sidebarMenuOpen;\r\n $scope.$broadcast('menuClicked');\r\n if (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n };\r\n rc.hideOverflow = function () {\r\n return sidebarMenuOpen ? 'hide-overflow' : '';\r\n };\r\n rc.hideSiteMailingSignUp = function () {\r\n var url = $location.path();\r\n if (!url.match(/prefetch/gi)) {\r\n if (TRPCONFIG.IsMobileDevice) {\r\n rc.hideSiteMailingListSignUp = url === '/' || !!url.match(TRPCONFIG.Domain.HideSiteMailingSignUpMobile, 'gi');\r\n }\r\n else {\r\n rc.hideSiteMailingListSignUp = url === '/' || !!url.match(TRPCONFIG.Domain.HideSiteMailingSignUpDesktop, 'gi');\r\n }\r\n }\r\n };\r\n broker.subscribe('RootController', 'hideNavigationDrawer', function () {\r\n sidebarMenuOpen = false;\r\n });\r\n broker.subscribe('RootController', 'userExtended', function (extendedUser) {\r\n if (!extendedUser || !extendedUser.data) {\r\n return;\r\n }\r\n var customer = extendedUser.data;\r\n if (customer.FirstName && customer.LastName) {\r\n rc.impersonatedUserName = customer.FirstName + \" \" + customer.LastName;\r\n }\r\n if (customer.Contact && customer.Contact.FirstName && customer.Contact.LastName) {\r\n return rc.impersonatedUserName = customer.Contact.FirstName + \" \" + customer.Contact.LastName;\r\n }\r\n });\r\n broker.subscribe('RootController', 'userDeimpersonated', function () {\r\n rc.impersonatedUserName = false;\r\n });\r\n rc.brokerPublish = function (key, val) {\r\n broker.publish(key, val);\r\n };\r\n $(window).on('resize', _.debounce(function () {\r\n /*this doesn't do anything but it appears to trigger a digest on\r\n windows resize which is what we want.*/\r\n }, 100));\r\n broker.subscribe('RootController', 'destinationChanged', _updateShowCaseStyle);\r\n function _updateShowCaseStyle() {\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n var url = imageService.getLandingPageImage(dest);\r\n rc.showcaseStyle = url ? { 'background-image': \"url(\" + url + \")\" } : undefined; //prevent bindonce from giving up until we have a value\r\n var hero = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.MobileDestinationOverlay.ImageSrc');\r\n rc.promoOverlayStyle = hero && dest ? { 'background-image': \"url(\" + hero + \")\" } : { display: 'none' };\r\n rc.destination = dest;\r\n var mobileBannerImage = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.MobileBanner.ImageSrc');\r\n rc.sale = mobileBannerImage && !rc.destination;\r\n url = url || mobileBannerImage;\r\n if (url) {\r\n rc.heroStyle = { 'background-image': \"url(\" + url + \")\" };\r\n }\r\n rc.heroStyleSkip = rc.destination == null ? { 'background-image': 'url(build/img/beach-background.png)' } : rc.heroStyle;\r\n });\r\n }\r\n _updateShowCaseStyle();\r\n rc.backgroundStyle = function () {\r\n var loadingScreenBackground = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.ResponsiveInterstitialBackground.ImageSrc');\r\n //if get image from cms enabled then return null\r\n if (TRPCONFIG.Domain.CMSInterstitialImagesEnabled) {\r\n return null;\r\n }\r\n return loadingScreenBackground ? { 'background-image': \"url(\" + loadingScreenBackground + \")\" } : { 'background-image': 'url(build/img/beach-background.png)' };\r\n };\r\n rc.bannerStyle = function () {\r\n var loadingScreenBanner = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.ResponsiveInterstitialBanner.ImageSrc');\r\n return loadingScreenBanner ? { 'background-image': \"url(\" + loadingScreenBanner + \")\" } : '';\r\n };\r\n $rootScope.lockScreen = function (scope, data) {\r\n scope.$emit('block', data || {});\r\n };\r\n $rootScope.unlockScreen = function (sc) {\r\n broker.publish('unblock');\r\n sc.$emit('unblock');\r\n };\r\n $rootScope.$on('$routeChangeStart', function (_, next) {\r\n rc.showStrapLine = _getStrapLine($location.$$path, next.strapLine);\r\n });\r\n /*\r\n * Return logic only for all page except \"/pages/terms\"\r\n * @param path\r\n * @param strapLine\r\n * @returns {boolean}\r\n * @private\r\n */\r\n function _getStrapLine(path, strapLine) {\r\n return path === '/pages/terms' ? null : !!strapLine;\r\n }\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('RootController');\r\n });\r\n rc.signout = function () {\r\n agentModeService.signout().then(function () {\r\n window.location.href = $location.search().Dest || '/';\r\n });\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('SearchUnit', SearchUnit);\r\n function SearchUnit(pageStrand, $timeout, $scope, resourceService, searchUnitService, $route, $location, dateUtil, $window, basketService, broker, geo, analytics, currentDestination, occupancyService, holidayDeals, searchQueryString, destinationService) {\r\n var cm = this;\r\n cm.showTabs = !TRPCONFIG.Domain.CompactMobileTabs || _.includes(['hotels', 'holidays'], $route.current.area);\r\n var searchMsgs = ['SEARCHINGFLIGHTS', 'SEARCHINGHOTELS', 'SEARCHINGTRANSFERS', 'MARHABASEARCHING', 'SEARCHINGFLIGHTS', 'SEARCHINGINSURANCE'];\r\n var minimumDate = dateUtil.todayPlus(1, 0, true);\r\n //none of this needs be done if we're already in the availability path\r\n //because we will not be displaying the search unit\r\n if (cm.hotel && cm.hotel.Rooms != null) {\r\n return;\r\n }\r\n cm.supportsGeo = geo.supported();\r\n cm.autoCompleterSelect = autoCompleterSelect;\r\n cm.getEndDate = getEndDate;\r\n cm.getStartDate = getStartDate;\r\n cm.setStartDate = setStartDate;\r\n cm.setEndDate = setEndDate;\r\n cm.showStartDate = showStartDate;\r\n cm.showEndDate = showEndDate;\r\n cm.flexibleDates = searchUnitService.flexibleDates === undefined ? true : searchUnitService.flexibleDates;\r\n cm.searchType = $route.current.area;\r\n cm.onewayonly = false;\r\n cm.productToggle = productToggle;\r\n cm.nearby = nearby;\r\n cm.search = search;\r\n var mode = searchUnitService.flight;\r\n var flow = basketService.holidayBooking;\r\n switch ($route.current.area) {\r\n case 'hotels':\r\n minimumDate = dateUtil.todayPlus(TRPCONFIG.Domain.HotelSearchOffsetDate, 0, true);\r\n if ((new Date()).getUTCHours() >= TRPCONFIG.Domain.TimeCutoffForSameDayHotelSearch) {\r\n //if current time exceeds same day search cutoff, set min date to next day for hotel searches\r\n minimumDate = dateUtil.todayPlus(1, 0, true);\r\n }\r\n mode = searchUnitService.hotel;\r\n flow = basketService.hotelBooking;\r\n break;\r\n case 'transfers':\r\n if (searchUnitService.getDirection() === 3) {\r\n minimumDate = null;\r\n }\r\n mode = searchUnitService.transfer;\r\n flow = basketService.transferBooking;\r\n break;\r\n case 'marhaba':\r\n minimumDate = dateUtil.todayPlus(2, 0, true);\r\n mode = searchUnitService.marhaba;\r\n flow = basketService.marhabaBooking;\r\n break;\r\n case 'flights':\r\n mode = searchUnitService.flight;\r\n flow = basketService.flightBooking;\r\n break;\r\n case 'insurance':\r\n mode = searchUnitService.insurance;\r\n flow = basketService.insuranceBooking;\r\n break;\r\n }\r\n var minimumDatePlusOne = dateUtil.addDays(minimumDate, 1, true) || dateUtil.todayPlus(1, 0, true);\r\n cm.durations = holidayDeals.DURATIONS.map(function (d) { return ({\r\n name: d + \" \" + resourceService.get('NIGHTS'),\r\n value: d\r\n }); });\r\n cm.duration = searchUnitService.duration(mode);\r\n cm.updateDuration = function () {\r\n searchUnitService.duration(mode, cm.duration);\r\n };\r\n cm.focusOnDuration = function () {\r\n $('.duration select[name=\"duration\"]').focus();\r\n };\r\n // Cabin\r\n cm.cabin = searchUnitService.getCabin();\r\n cm.cabinOptions = searchUnitService.getCabinOptions();\r\n cm.updateCabin = function () {\r\n searchUnitService.setCabin(cm.cabin);\r\n };\r\n broker.subscribe('SearchUnit', 'savedSearchRestored', function () {\r\n cm.summary = searchUnitService.getSummary(mode);\r\n });\r\n cm.deselectAllAirlines = function () {\r\n delete searchUnitService.airlines;\r\n $location.search('airlines', null);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n };\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('SearchUnit');\r\n });\r\n var waiting = false;\r\n cm.startDate = searchUnitService.startDate(mode);\r\n cm.endDate = searchUnitService.endDate(mode);\r\n cm.dealsFlexibility = searchUnitService.dealsFlexibility;\r\n cm.outboundDates = searchUnitService.getOutboundDates(mode);\r\n if (cm.startDate) {\r\n cm.startPlusOne = dateUtil.addDays(cm.startDate, 1, true);\r\n }\r\n cm.minDates = {\r\n minimumDate: minimumDate,\r\n startPlusOne: cm.startPlusOne || minimumDatePlusOne\r\n };\r\n cm.flexibleDatesDisabled = function () {\r\n return TRPCONFIG.Domain2.FlexibleDatesFlowsDisabled.indexOf(searchUnitService.capitalize(cm.searchType)) !== -1;\r\n };\r\n $scope.$watch('cm.startDate', function (val) {\r\n if (val) {\r\n cm.showStartCalendar = false;\r\n cm.setStartDate(val);\r\n }\r\n });\r\n $scope.$watch('cm.dealsFlexibility', function (val) { return searchUnitService.dealsFlexibility = val; });\r\n loadNearestAirports();\r\n var clearParams = function () {\r\n //cleardown query params - as otherwise params will override values search unit values when not necessary\r\n $location.replace()\r\n .search('startDate', null)\r\n .search('endDate', null)\r\n .search('depAir', null)\r\n .search('occ', null)\r\n .search('autoSearch', null)\r\n .search('cabin', null);\r\n };\r\n searchQueryString.getQueryStringValues().then(function (queryString) {\r\n searchUnitService.airlines = queryString.airlines;\r\n if (queryString.startDate != null) {\r\n cm.setStartDate(queryString.startDate, false);\r\n }\r\n if (queryString.endDate != null) {\r\n cm.setEndDate(queryString.endDate, false);\r\n }\r\n if (cm.startDate) {\r\n cm.startPlusOne = dateUtil.addDays(cm.startDate, 1, true);\r\n }\r\n if (queryString.airports) {\r\n if (queryString.airports.length === 1) {\r\n searchUnitService.setDepartureAirports(queryString.airports[0]);\r\n }\r\n else {\r\n searchUnitService.setDepartureAirports(queryString.airports);\r\n }\r\n }\r\n if (queryString.occupancy != null) {\r\n occupancyService.setOccupancy(queryString.occupancy);\r\n }\r\n if (queryString.autoSearch) {\r\n //set the current destination to run the search against\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n if (dest != null) {\r\n cm.autoCompleterSelect(dest, false);\r\n }\r\n else if (queryString.destination) {\r\n destinationService.getDetails(queryString.destination[0]).then(function (destination) {\r\n if (destination != null) {\r\n searchUnitService.setDestination(destination);\r\n searchUnitService.setDestinationAirport(destination);\r\n }\r\n });\r\n searchUnitService.setDestinationAirport(queryString.destination[0]);\r\n }\r\n $timeout(function () {\r\n cm.search();\r\n clearParams();\r\n }, 1000);\r\n });\r\n }\r\n else {\r\n clearParams();\r\n }\r\n cm.summary = searchUnitService.getSummary(mode);\r\n });\r\n $timeout(function () {\r\n if ($route.current.area === 'transfers') {\r\n var destinationAirports = searchUnitService.getDestinationAirports();\r\n if (destinationAirports && destinationAirports.length > 1) {\r\n searchUnitService.setDestinationAirport();\r\n }\r\n }\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n if (dest && !dest.HolidayEnabled && flow === basketService.holidayBooking) {\r\n $scope.$emit('flash:error', String.format(resourceService.get('NOTHOLIDAYENABLED'), dest.Title));\r\n }\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.flightType = searchUnitService.getFlightType().Label;\r\n if (TRPCONFIG.Domain.DurationEnable) {\r\n initDurationInput();\r\n }\r\n });\r\n }, 0);\r\n function autoCompleterSelect(item, back) {\r\n if (back === void 0) { back = true; }\r\n if (!waiting) {\r\n waiting = true;\r\n return searchUnitService.setDestination(item, false, true).then(function (d) {\r\n waiting = false;\r\n d.changed = true;\r\n if (back) {\r\n //this has to go in a setTimeout so that it does not take place in the context of a call to\r\n //$apply. If it does it causes infinite digest loops in some phones\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }); //yuck yak\r\n }\r\n }\r\n function getStartDate() {\r\n return searchUnitService.startDate(mode);\r\n }\r\n function getEndDate() {\r\n return searchUnitService.endDate(mode);\r\n }\r\n function setEndUsingDuration(durationLength) {\r\n var duration = searchUnitService.duration(mode, durationLength);\r\n duration = duration && duration.value || TRPCONFIG.Domain.SearchUnitDurationDefault;\r\n var endDate = dateUtil.addDays(getStartDate(), duration, true);\r\n setEndDate(endDate, null);\r\n }\r\n function setStartDate(date, back) {\r\n if (date) {\r\n cm.minDates.startPlusOne = dateUtil.addDays(date, 1, true);\r\n }\r\n searchUnitService.startDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.showStartCalendar = false;\r\n if (TRPCONFIG.Domain.DurationEnable) {\r\n setEndUsingDuration();\r\n }\r\n if (back) {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n function setEndDate(date, back) {\r\n searchUnitService.endDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.showEndCalendar = false;\r\n if (back) {\r\n setTimeout(function () {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n function initDurationInput() {\r\n cm.options = searchUnitService.getDurationOptions();\r\n $scope.$watch('cm.duration', function () {\r\n if (cm.duration) {\r\n setEndUsingDuration(cm.duration || TRPCONFIG.Domain.SearchUnitDurationDefault);\r\n }\r\n else if (searchUnitService.duration(mode)) {\r\n cm.duration = cm.options[searchUnitService.duration(mode).index];\r\n }\r\n else {\r\n cm.duration = cm.options[0];\r\n }\r\n });\r\n }\r\n function showStartDate() {\r\n return $route.current.area !== 'transfers' || searchUnitService.requiresStartDate();\r\n }\r\n function showEndDate() {\r\n return $route.current.area !== 'transfers' || searchUnitService.requiresEndDate();\r\n }\r\n function productToggle(r) {\r\n if ($route.current.landing) {\r\n var currentStrand = pageStrand.fromRoute();\r\n var strand = pageStrand.opposite(currentStrand);\r\n $location.url(pageStrand.adjustUrl($location.url(), strand));\r\n $route.reload();\r\n }\r\n else {\r\n $location.path(r);\r\n }\r\n }\r\n function nearby(e) {\r\n e.stopPropagation();\r\n cm.gettingLocation = true;\r\n $scope.$emit('flash:error');\r\n geo.getSearchArea().then(function (sa) {\r\n analytics.trackEvent({ label: 'search nearby' });\r\n searchUnitService.setSearchArea(sa);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.gettingLocation = false;\r\n }, function () {\r\n cm.gettingLocation = false;\r\n $scope.$emit('flash:error', resourceService.get('POSITIONUNAVAILABLE'));\r\n });\r\n }\r\n function search() {\r\n $scope.$emit('block', {\r\n title: resourceService.get(searchMsgs[flow]),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-searchUnitCtrl'\r\n });\r\n searchUnitService.flexibleDates = TRPCONFIG.Domain.FlexibleDatesEnabled ? cm.flexibleDates : true;\r\n searchUnitService.onewayonly = TRPCONFIG.Domain.OneWayFlightsEnabled ? cm.onewayonly : false;\r\n var isAirlinesPrefilter = !_.some(searchUnitService.airlines, function (a) { return a.IsPostfilter; });\r\n var params = {\r\n flexibleDates: searchUnitService.flexibleDates,\r\n oneWayOnly: searchUnitService.onewayonly,\r\n prefilterAirlines: isAirlinesPrefilter ? _.map(searchUnitService.airlines, function (a) { return a.Code; }) : [],\r\n postfilterAirlines: !isAirlinesPrefilter ? _.map(searchUnitService.airlines, function (a) { return a.Title; }) : []\r\n };\r\n basketService.startWorkflow(flow, params).then(null, function (errors) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n $scope.$emit('flash:error', errors);\r\n });\r\n }\r\n function loadNearestAirports() {\r\n var departureAirports = searchUnitService.getDepartureAirports();\r\n if (!departureAirports || !departureAirports.length) {\r\n geo.getNearestAirports().then(function (airports) {\r\n // Check a second time to not overwrite a departure airport\r\n // that could have been selected before this promise resolved.\r\n var departureAirports = searchUnitService.getDepartureAirports();\r\n if (!departureAirports || !departureAirports.length) {\r\n searchUnitService.setMultipleDepartureAirports(airports);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var SelectDomain = /** @class */ (function () {\r\n function SelectDomain(cookieService, $location, agentModeService, globalisationService, dateUtil) {\r\n var _this = this;\r\n this.cookieService = cookieService;\r\n this.$location = $location;\r\n this.agentModeService = agentModeService;\r\n this.globalisationService = globalisationService;\r\n this.dateUtil = dateUtil;\r\n this.lightbox = false;\r\n this.lightbox = true;\r\n this.agentModeService.getAgentInformation().then(function (data) {\r\n var permittedDomains = data.PermittedDomains;\r\n _this.officeLocations = data.OfficeLocations;\r\n _this.globalisationService.getAllDomains().then(function (allDomains) {\r\n var currentDomain = allDomains.filter(function (d) { return d.Id === TRPCONFIG.Domain.DomainId; })[0];\r\n var parentDomainId = currentDomain.ParentId ? currentDomain.ParentId : TRPCONFIG.Domain.DomainId;\r\n var parentSubDomains = allDomains.filter(function (d) { return d.ParentId === parentDomainId; });\r\n if (permittedDomains.length === 0) {\r\n _this.permittedRegions = parentSubDomains;\r\n }\r\n else {\r\n _this.permittedRegions = parentSubDomains.filter(function (d) { return permittedDomains.indexOf(d.Id) !== -1; });\r\n if (_this.permittedRegions.length === 1) {\r\n _this.setSelectedDomain(_this.permittedRegions[0].Id);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n SelectDomain.prototype.setSelectedDomain = function (selectedDomain) {\r\n var _this = this;\r\n this.cookieService.set('SubDomainID', selectedDomain, this.dateUtil.addDays(new Date(), 365));\r\n if (this.officeLocations.length === 1) {\r\n this.agentModeService.setOfficeLocation(this.officeLocations[0].Id).then(function () {\r\n window.location.href = _this.$location.absUrl().replace('selectdomain', '');\r\n });\r\n }\r\n else {\r\n this.$location.path('selectoffice');\r\n }\r\n };\r\n return SelectDomain;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('SelectDomain', SelectDomain);\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var SelectOffice = /** @class */ (function () {\r\n function SelectOffice(agentModeService, $location) {\r\n var _this = this;\r\n this.agentModeService = agentModeService;\r\n this.$location = $location;\r\n this.lightbox = false;\r\n this.lightbox = true;\r\n this.agentModeService.getAgentInformation().then(function (data) {\r\n _this.OfficeLocations = data.OfficeLocations;\r\n _this.selectedOffice = data.CurrentOfficeLocation;\r\n if (_this.OfficeLocations.length === 1) {\r\n _this.setSelectedOffice(_this.OfficeLocations[0].Id);\r\n }\r\n });\r\n }\r\n SelectOffice.prototype.setSelectedOffice = function (office) {\r\n var _this = this;\r\n this.agentModeService.setOfficeLocation(office).then(function () {\r\n window.location.href = _this.$location.absUrl().replace('selectoffice', '');\r\n });\r\n };\r\n return SelectOffice;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('SelectOffice', SelectOffice);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('TestDestination', TestDestination);\r\n function TestDestination() {\r\n var cm = this;\r\n cm.LocationName = 'Alcatraz';\r\n //cm.activeTabId = 'cakes';\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('TestHome', TestHome);\r\n function TestHome() {\r\n var cm = this;\r\n cm.activeTabId = 'aaa';\r\n cm.dialogOpen = false;\r\n cm.dialogTwoOpen = false;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('TestPage', TestPage);\r\n function TestPage() {\r\n var cm = this;\r\n cm.fruits = [];\r\n cm.selectedMammals = [];\r\n cm.activeTabId = 'cakes';\r\n cm.mammals = [\r\n {\r\n Value: 1,\r\n Text: 'Bear'\r\n },\r\n {\r\n Value: 2,\r\n Text: 'Marmot'\r\n },\r\n {\r\n Value: 3,\r\n Text: 'Porcupine'\r\n }\r\n ];\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var CountBadge = /** @class */ (function () {\r\n function CountBadge($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$scope.$watch('cb.count', function (val) {\r\n if (val) {\r\n _this.output = val < 10\r\n ? val.toString()\r\n : '9+';\r\n }\r\n });\r\n }\r\n return CountBadge;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('countBadge', function () {\r\n return {\r\n scope: {},\r\n controller: CountBadge,\r\n controllerAs: 'cb',\r\n bindToController: {\r\n count: '='\r\n },\r\n template: \"{{cb.output}}\",\r\n replace: true\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar FilterAllButton = /** @class */ (function () {\r\n function FilterAllButton() {\r\n }\r\n FilterAllButton.prototype.clearFilter = function (filter) {\r\n filter.splice(0, filter.length);\r\n };\r\n return FilterAllButton;\r\n}());\r\nangular\r\n .module('TR')\r\n .directive('filterAllButton', function () {\r\n return {\r\n controller: FilterAllButton,\r\n controllerAs: 'fab',\r\n bindToController: {\r\n model: '='\r\n },\r\n replace: true,\r\n template: \"\\n \\n
        \\n
        {{'FILTERALLBUTTON'|resource}}
        \\n \"\r\n };\r\n});\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .directive('acceptCookiesBanner', function ($timeout, cookieService) { return ({\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=acceptcookiesbanner',\r\n controllerAs: 'ac',\r\n controller: function ($rootScope) {\r\n var cookiesAccepted = cookieService.get('CookiesAccepted') || false;\r\n this.hide = cookiesAccepted;\r\n this.if = !cookiesAccepted;\r\n this.acceptCookies = function () {\r\n var _this = this;\r\n cookieService.set('CookiesAccepted', true, Infinity);\r\n this.if = false;\r\n $timeout(function () { return _this.if = false; }, 1000);\r\n $rootScope.$emit('cookiesAccepted');\r\n };\r\n }\r\n }); });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('accountMenu', function ($rootScope, $location, authService, urlUtils, dateUtil, cookieService, languageService, modalService, dashboardNotificationService, $route, accountMenuService, broker, postBookingLookup, resourceService, $window, $document) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n priority: 200,\r\n templateUrl: function (el, attrs) { return \"partials/home/directivetemplate?type=accountmenu\" + (attrs.forNavigationDrawer === 'true' ? 'sidebar' : ''); },\r\n link: function (scope, el, attrs) {\r\n var menuOpen = false;\r\n scope.forNavigationDrawer = (attrs.forNavigationDrawer === 'true');\r\n scope.IsTouchDevice = $window.TRPCONFIG.IsTouchDevice;\r\n scope.selectedLanguage = cookieService.get('LANG') || 'en-GB';\r\n scope.limitAlerts = 2;\r\n scope.formatNotification = function (noti) { return dashboardNotificationService.formatNotification(noti); };\r\n scope.showDashboardMenu = false;\r\n scope.showNotifications = false;\r\n scope.showDashboardMenuSidebar = true;\r\n scope.setLanguage = setLanguage;\r\n scope.setLanguagePreference = setLanguagePreference;\r\n scope.sidebarClass = function () { return menuOpen ? 'open' : ''; };\r\n scope.signOut = signOut;\r\n scope.user = authService.getUser();\r\n scope.userName = userName;\r\n scope.launchNotification = launchNotification;\r\n scope.launchContactForm = launchContactForm;\r\n scope.notificationClicked = notificationClicked;\r\n scope.toggleDashboardMenuSidebar = function () { return scope.showDashboardMenuSidebar = !scope.showDashboardMenuSidebar; };\r\n scope.toggleNotification = function () {\r\n scope.showNotifications = !scope.showNotifications;\r\n scope.showDashboardMenu = false;\r\n };\r\n scope.toManage = toManage;\r\n scope.getResourceValue = function (resource) { return resourceService.get(resource); };\r\n scope.formatNotification = function (notification) { return dashboardNotificationService.formatNotification(notification); };\r\n //For EKH agent website\r\n scope.launchUserProfileSearch = launchUserProfileSearch;\r\n scope.launchUserProfileView = launchUserProfileView;\r\n scope.launchUserProfileCreate = launchUserProfileCreate;\r\n scope.bookingName = bookingName;\r\n scope.customerName = customerName;\r\n scope.manageBooking = manageBooking;\r\n scope.showSignOutAlert = false;\r\n // Skywards variables\r\n scope.skywardsDropPanel = skywardsDropPanel;\r\n scope.skywardsClosePanel = skywardsClosePanel;\r\n if (authService.getSkywardsUserDetails()) {\r\n scope.skywardsTitle = authService.getSkywardsUserDetails().data.Contact.Title;\r\n scope.skywardsFirstName = authService.getSkywardsUserDetails().data.Contact.FirstName;\r\n scope.skywardsLastName = authService.getSkywardsUserDetails().data.Contact.LastName;\r\n scope.skywardsLoyaltyId = authService.getSkywardsUserDetails().data.Contact.LoyaltyId;\r\n scope.skywardsTier = authService.getSkywardsUserDetails().data.Contact.Tier;\r\n scope.skywardsLoyaltyId = Number(scope.skywardsLoyaltyId).toString();\r\n var regex = /^(\\d{3})(\\d{3})(\\d{3}).*/;\r\n scope.skywardsLoyaltyId = scope.skywardsLoyaltyId.replace(regex, '$1 $2 $3');\r\n }\r\n scope.$on('auth:signin', function () {\r\n resetNotifications();\r\n scope.user = authService.getUser();\r\n sessionStorage.setItem('scope.user', JSON.stringify(scope.user));\r\n });\r\n scope.$on('auth:signout', function () {\r\n menuOpen = false;\r\n $rootScope.alerts = null;\r\n scope.user = authService.getUser();\r\n sessionStorage.removeItem('scope.user');\r\n checksigninstatus();\r\n });\r\n scope.$on('menuClicked', function () {\r\n menuOpen = !menuOpen;\r\n if (menuOpen) {\r\n resetNotifications();\r\n }\r\n });\r\n resetNotifications();\r\n function checksigninstatus() {\r\n var user = sessionStorage.getItem('scope.user');\r\n if (!user) {\r\n document.querySelector('.myb-search-signout').style.display = 'none';\r\n document.querySelector('.myb-search-signin').style.display = 'block';\r\n }\r\n else {\r\n document.querySelector('.myb-search-signout').style.display = 'block';\r\n document.querySelector('.myb-search-signin').style.display = 'none';\r\n }\r\n }\r\n function setLanguagePreference(lang, id) {\r\n var _this = this;\r\n languageService.setLanguage(lang, id)\r\n .then(function () {\r\n if (TRPCONFIG.Domain.RedirectLanguageChangeToHomepage) {\r\n window.location.href = '/?rl=1';\r\n }\r\n else {\r\n //window.location.href = this.$location.absUrl();\r\n _this.$route.reload();\r\n }\r\n });\r\n }\r\n function setLanguage() {\r\n cookieService.set('LANG', scope.selectedLanguage, dateUtil.addDays(new Date(), 365));\r\n window.location.href = $location.absUrl();\r\n }\r\n function launchUserProfileSearch() {\r\n modalService.launch('partials/userprofile/Search', { promptUserSelection: false });\r\n }\r\n function launchUserProfileView() {\r\n modalService.launch('partials/userprofile/UpdateUserProfileModal');\r\n }\r\n function launchUserProfileCreate() {\r\n modalService.launch('partials/userprofile/CreateUserProfileModal');\r\n }\r\n function launchNotification() {\r\n accountMenuService.launchNotification(scope.alerts);\r\n scope.closeMenu();\r\n }\r\n function launchContactForm() {\r\n accountMenuService.launchContactForm(scope.alerts);\r\n scope.closeMenu();\r\n }\r\n function userName() {\r\n if (!scope.user) {\r\n return '';\r\n }\r\n if (scope.user.FirstName && scope.user.LastName) {\r\n return scope.user.FirstName + \" \" + scope.user.LastName;\r\n }\r\n var bookingId = authService.getSignedInBookingId();\r\n if (bookingId && scope.user.Contact && scope.user.Contact.SiteId) {\r\n return scope.user.Contact.SiteId + \"/\" + bookingId;\r\n }\r\n return scope.user.Email;\r\n }\r\n function bookingName() {\r\n var bookingId = authService.getSignedInBookingId();\r\n if (bookingId) {\r\n return this.user.Contact.SiteId + \"/\" + bookingId;\r\n }\r\n }\r\n function customerName() {\r\n if (scope.user.SignedIn && scope.user.LastName) {\r\n return scope.user.FirstName + \" \" + scope.user.LastName;\r\n }\r\n }\r\n function manageBooking() {\r\n if (scope.user.AnonSignedIn) {\r\n return postBookingLookup.redirect();\r\n }\r\n }\r\n function resetNotifications() {\r\n var user = authService.getUser();\r\n if (TRPCONFIG.Domain.DashboardBookingEnabled && TRPCONFIG.Domain.SideBarNotificationEnabled && (user.AnonSignedIn || user.HardSignedIn)) {\r\n dashboardNotificationService.getNotifications()\r\n .then(function (data) { return $rootScope.alerts = data; });\r\n }\r\n }\r\n function notificationClicked(noti) {\r\n scope.closeMenu();\r\n scope.showDashboardMenu = false;\r\n scope.showNotifications = false;\r\n dashboardNotificationService.notificationClicked(noti);\r\n }\r\n function signOut() {\r\n return authService.signOut().then(function () {\r\n broker.publish('hideNavigationDrawer');\r\n scope.showDashboardMenu = false;\r\n });\r\n }\r\n function toManage() {\r\n var user = sessionStorage.getItem('scope.user');\r\n if (!user) {\r\n sessionStorage.setItem('scope.user', JSON.stringify(scope.user));\r\n }\r\n scope.closeMenu();\r\n var cookieName = authService.createCookieName();\r\n authService.doesHttpOnlyCookieExist(cookieName);\r\n scope.showDashboardMenu = false;\r\n scope.showNotifications = false;\r\n if (scope.user.AnonSignedIn && !scope.user.SignedIn) {\r\n return postBookingLookup.redirect();\r\n }\r\n if (!scope.user.AnonSignedIn && scope.user.SignedIn) {\r\n return $location.path('dashboard/bookings/current');\r\n }\r\n return accountMenuService.launchOption('bookingsignin');\r\n }\r\n scope.subMenuTriggerMouseenter = function (e, booleanName) {\r\n // open on mouseenter for non-touch only\r\n if (!scope.forNavigationDrawer && !scope.IsTouchDevice) {\r\n scope[booleanName] = true;\r\n }\r\n };\r\n scope.subMenuTriggerMouseleave = function (e, booleanName) {\r\n // close on mouseleave for non-touch only\r\n if (!scope.forNavigationDrawer && !scope.IsTouchDevice) {\r\n scope[booleanName] = false;\r\n }\r\n };\r\n scope.subMenuTriggerClick = function (e, booleanName) {\r\n // toggle on click for touch devices only\r\n if (!scope.forNavigationDrawer && scope.IsTouchDevice) {\r\n scope[booleanName] = !scope[booleanName];\r\n if (scope[booleanName]) {\r\n e.stopPropagation();\r\n // close sub menu when anything else is clicked\r\n $document.one('click.accountMenu', function () {\r\n scope.$apply(scope[booleanName] = false);\r\n });\r\n }\r\n }\r\n };\r\n scope.dashboardLinkClick = function () {\r\n broker.publish('hideNavigationDrawer');\r\n scope.showDashboardMenu = false;\r\n };\r\n scope.hideSignOutAlert = function () {\r\n scope.showSignOutAlert = false;\r\n };\r\n scope.signOutAlert = function () {\r\n scope.showSignOutAlert = true;\r\n };\r\n scope.closeMenu = function () {\r\n menuOpen = false;\r\n broker.publish('hideNavigationDrawer');\r\n };\r\n function skywardsDropPanel(skywardsFirstName, skywardsLastName, skywardsLoyaltyId, skywardsTier) {\r\n if (skywardsFirstName && skywardsLastName && skywardsLoyaltyId && skywardsTier) {\r\n var element = document.querySelector('.skywards-sub-menu');\r\n element.classList.toggle('open');\r\n }\r\n }\r\n function skywardsClosePanel() {\r\n var element = document.querySelector('.skywards-sub-menu');\r\n if (element.classList.contains('open')) {\r\n element.classList.remove('open');\r\n }\r\n }\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var AccountSignIn = /** @class */ (function () {\r\n function AccountSignIn($location, $route, accountMenuService, authService, urlUtils) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$route = $route;\r\n this.accountMenuService = accountMenuService;\r\n this.authService = authService;\r\n this.urlUtils = urlUtils;\r\n this.noBufferUrls = ['signin', 'signup', 'bookingsignin'];\r\n this.popupSignIn = function (event) {\r\n event.preventDefault();\r\n var parsedUrl = _this.urlUtils.parse(_this.$location.url());\r\n parsedUrl.url = _this.urlUtils.stripLeadingSlash(parsedUrl.url);\r\n parsedUrl.qs.pb = 1;\r\n var cookieName = _this.authService.createCookieName();\r\n _this.authService.doesHttpOnlyCookieExist(cookieName);\r\n var bufferRedirect = _this.noBufferUrls.every(function (bUrl) { return parsedUrl.url.indexOf(bUrl) < 0; })\r\n && _this.noBufferUrls.some(function (bUrl) { return _this.path.indexOf(bUrl) > -1; });\r\n var redirect = _this.urlUtils.format(parsedUrl);\r\n var currentRoute = _this.$route && _this.$route.current && _this.$route.current.$$route;\r\n _this.authService.bufferRoute(redirect);\r\n _this.authService.bufferRoute(bufferRedirect\r\n && currentRoute\r\n && !currentRoute.requiresAnonAuth\r\n && !currentRoute.requiresHardAuth\r\n ? redirect : '/');\r\n //redirect here is only used in the mobile version of accountMenuService\r\n _this.accountMenuService.launchOption(_this.path, _this.options, redirect);\r\n if (_this.postSignIn) {\r\n _this.postSignIn();\r\n }\r\n };\r\n }\r\n return AccountSignIn;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('accountSignIn', function () {\r\n return {\r\n scope: {},\r\n bindToController: {\r\n path: '@',\r\n postSignIn: '&',\r\n options: '='\r\n },\r\n controller: AccountSignIn,\r\n controllerAs: 'as',\r\n restrict: 'E',\r\n replace: true,\r\n template: '',\r\n transclude: true\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('advert', function (advertService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n dest: '=',\r\n onPopulate: '&',\r\n maxToDisplay: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Advert',\r\n link: function (scope, el, attr) {\r\n var pos = parseInt(attr.position) || 1;\r\n scope.$watch('dest', function (v) {\r\n if (v == null) {\r\n return;\r\n }\r\n init(v);\r\n });\r\n function init(dest) {\r\n advertService.getAdvertsForPosition(pos, dest).then(function (adverts) {\r\n var selection = null;\r\n if (scope.maxToDisplay && adverts.length > scope.maxToDisplay) {\r\n //randomly return the number requested\r\n selection = [];\r\n while (selection.length < scope.maxToDisplay) {\r\n selection.push(adverts.splice(Math.floor(Math.random() * adverts.length), 1)[0]);\r\n }\r\n }\r\n scope.adverts = selection || adverts;\r\n scope.serviceUrl = advertService.getUrl();\r\n if (scope.adverts.length) {\r\n scope.onPopulate();\r\n }\r\n });\r\n }\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var AttractionSelection = /** @class */ (function () {\r\n function AttractionSelection($scope) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.productPeopleCountMap = {};\r\n var wait = $scope.$watch('as.bookingLoaded', function (b) {\r\n if (b) {\r\n _this.init();\r\n wait();\r\n }\r\n });\r\n }\r\n AttractionSelection.prototype.init = function () {\r\n var _this = this;\r\n if (this.attractions.length > 0) {\r\n this.show = true;\r\n //set up map of product Id and number of tickets per passenger type\r\n _.each(this.attractions, function (a) { _.assign(_this.productPeopleCountMap, a.Details.AttractionRequests); });\r\n this.dateCaptureRequired = _.some(this.model, { 'CaptureDate': true, 'PreferredDate': !null });\r\n }\r\n };\r\n return AttractionSelection;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('attractionSelection', function () {\r\n return {\r\n bindToController: true,\r\n controller: AttractionSelection,\r\n controllerAs: 'as',\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n bookingLoaded: '=',\r\n attractions: '=',\r\n maxDate: '=',\r\n minDate: '=',\r\n model: '=',\r\n rootForm: '=',\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=AttractionSelection&version='\r\n + attr.templateVersion;\r\n }\r\n else {\r\n return 'partials/home/directivetemplate?type=AttractionSelection';\r\n }\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n;\r\nvar Attractions;\r\n(function (Attractions) {\r\n var Overlay = /** @class */ (function () {\r\n function Overlay(clickFn) {\r\n this.isActive = false;\r\n var className = 'attractions-calendar-overlay';\r\n this.el = $(\".\" + className);\r\n if (!this.el.length) {\r\n this.el = $(\"
        \")\r\n .appendTo('body')\r\n .click(clickFn);\r\n }\r\n this.elParent = this.el.parent();\r\n }\r\n Overlay.prototype.show = function () {\r\n this.isActive = true;\r\n this.el.show();\r\n };\r\n Overlay.prototype.resize = function (winWidth) {\r\n // Sets width to window unless window is smaller than parent\r\n this.el.css({\r\n width: Math.max(this.elParent.width(), winWidth)\r\n });\r\n };\r\n Overlay.prototype.hide = function () {\r\n this.isActive = false;\r\n this.el.hide();\r\n };\r\n return Overlay;\r\n }());\r\n var AttractionsCalendar = /** @class */ (function () {\r\n function AttractionsCalendar($scope, $filter, $window, $q, dateUtil, attractionService, resourceService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$filter = $filter;\r\n this.$window = $window;\r\n this.$q = $q;\r\n this.dateUtil = dateUtil;\r\n this.attractionService = attractionService;\r\n this.resourceService = resourceService;\r\n this.legend = [];\r\n this.eventNs = '.ac';\r\n this.htmlCss = {};\r\n this.enabledDates = {};\r\n this.renderedDates = {};\r\n this.selectedDate = this.dateUtil.parseDate(this.currentDate);\r\n $(function () {\r\n if (!$.datepicker._updateDatepicker_original) {\r\n // Add `afterShow` event to jquery datepicker\r\n // https://bugs.jqueryui.com/ticket/6885\r\n $.datepicker._updateDatepicker_original = $.datepicker._updateDatepicker;\r\n $.datepicker._updateDatepicker = function (inst) {\r\n $.datepicker._updateDatepicker_original(inst);\r\n var afterShow = this._get(inst, 'afterShow');\r\n if (afterShow) {\r\n afterShow.apply((inst.input ? inst.input[0] : null));\r\n }\r\n };\r\n }\r\n _this.win = $($window);\r\n _this.html = $('html');\r\n _this.debouncedOnRender = _.debounce(function () { return _this.onRender(); }, 100);\r\n _this.debouncedSetLayout = _.debounce(function () { return _this.setLayout(); }, 100);\r\n _this.overlay = new Overlay(function () { return _this.datepicker('hide'); });\r\n });\r\n }\r\n AttractionsCalendar.prototype.init = function (inputEl) {\r\n var _this = this;\r\n this.$q.when(this.selectedDate || this.getFirstPopulatedDate(0))\r\n .then(function (date) { return _this.selectedDate = date; })\r\n .then(function () { return _this._init(inputEl); });\r\n };\r\n AttractionsCalendar.prototype._init = function (inputEl) {\r\n var _this = this;\r\n var currDate = new Date();\r\n // Initialise jQuery datepicker http://api.jqueryui.com/datepicker/\r\n inputEl.datepicker({\r\n numberOfMonths: 1,\r\n dateFormat: 'dd-M-yy',\r\n firstDay: 1,\r\n defaultDate: this.selectedDate,\r\n minDate: this.dateUtil.parseDate(this.minDate),\r\n maxDate: this.dateUtil.parseDate(this.maxDate),\r\n beforeShowDay: function (date) { return _this.filterDate(date); },\r\n beforeShow: function () {\r\n _this.enabledDates = {};\r\n _this.datepickerEl.addClass('attractions-calendar');\r\n _this.suppressPositioning();\r\n _this.lockScroll();\r\n _this.getAvailability(_this.selectedDate ||\r\n _this.activeDateFrom ||\r\n new Date(currDate.getFullYear(), currDate.getMonth()));\r\n _this.overlay.show();\r\n return !inputEl.lastDisplay ||\r\n (new Date().getTime() - inputEl.lastDisplay > 100);\r\n },\r\n afterShow: function () {\r\n if (_this.overlay.isActive) {\r\n inputEl.blur(); // IE fix cursor showing through overlay\r\n _this.createHeader();\r\n _this.debouncedOnRender();\r\n _this.win.on('resize' + _this.eventNs, function () { return _this.debouncedSetLayout(); });\r\n }\r\n },\r\n onChangeMonthYear: function (y, m) {\r\n if (_this.overlay.isActive) {\r\n _this.getAvailability(new Date(y, m - 1)); // Month is 0 based\r\n }\r\n },\r\n onSelect: function () {\r\n _this.selectDate();\r\n // http://www.objectpartners.com/2012/06/18/jquery-ui-datepicker-ie-focus-fix/\r\n inputEl.lastDisplay = new Date().getTime();\r\n inputEl.blur();\r\n },\r\n onClose: function () {\r\n _this.win.off(_this.eventNs);\r\n _this.overlay.hide();\r\n _this.renderedDates = {};\r\n _this.datepickerEl.removeClass('active');\r\n _this.restoreScroll();\r\n // This deals with anything typed into the field that changed the value\r\n var dpDate = _this.datepicker('getDate') || '', expected = _this.selectedDate || '';\r\n if (dpDate.toString() !== expected.toString()) {\r\n _this.selectDate();\r\n }\r\n else {\r\n _this.syncField();\r\n }\r\n // Put back positioning for any other datepickers\r\n _this.restorePositioning();\r\n },\r\n isRTL: TRPCONFIG.Rtl\r\n });\r\n if (TRPCONFIG.IsTouchDevice) {\r\n inputEl.attr('readonly', 'true');\r\n }\r\n this.datepicker = inputEl.datepicker.bind(inputEl);\r\n this.datepickerEl = $('#ui-datepicker-div');\r\n this.watchDateAttr('minDate', 'maxDate');\r\n this.$scope.$watch('ac.parentForm.formModel.date', function (value) {\r\n if (value == null) {\r\n _this.clearDate();\r\n }\r\n });\r\n };\r\n AttractionsCalendar.prototype.getFirstPopulatedDate = function (monthsFromToday) {\r\n var _this = this;\r\n if (monthsFromToday > 12) {\r\n return null;\r\n }\r\n var date = this.dateUtil.todayPlus({ months: monthsFromToday });\r\n return this.attractionService.getAvailability(this.parentForm.productId, angular.extend({}, this.parentForm.formModel, { date: date }))\r\n .then(function (res) {\r\n var dateIdx = _this.getFirstAvailableDateWithTicketsIdx(res);\r\n var firstDateWithTickets = _.get(res, \"Dates[\" + dateIdx + \"].Date\");\r\n var firstDate = _.get(res, 'Dates[0].Date');\r\n if (_this.activeDateFrom) {\r\n if (_this.dateUtil.compareDates(_this.activeDateFrom, firstDateWithTickets) === -1) {\r\n firstDate = firstDateWithTickets;\r\n }\r\n else {\r\n firstDate = _this.activeDateFrom;\r\n }\r\n }\r\n if (firstDate) {\r\n return _this.dateUtil.parseDate(firstDate);\r\n }\r\n else {\r\n return _this.getFirstPopulatedDate(monthsFromToday + 1);\r\n }\r\n });\r\n };\r\n AttractionsCalendar.prototype.getFirstAvailableDateWithTicketsIdx = function (res) {\r\n return _.findIndex(res.Dates, function (obj) {\r\n return obj.Tickets && obj.Tickets.length > 0;\r\n });\r\n };\r\n AttractionsCalendar.prototype.getDateKey = function (date) {\r\n return this.dateUtil.format(date, 'yyyy-MM-dd');\r\n };\r\n AttractionsCalendar.prototype.filterDate = function (date) {\r\n var isEnabled = true; // Default to allowing date\r\n if (this.enabledDates) {\r\n if (!this.enabledDates[this.getDateKey(date)]) {\r\n isEnabled = false;\r\n }\r\n if (this.activeDateFrom && this.dateUtil.compareDates(this.activeDateFrom, date) === 1\r\n && this.dateUtil.compareDates(date, this.dateUtil.addDays(this.minDate, -1, null)) === 1) {\r\n return [isEnabled, 'ui-datepicker-inactive', ''];\r\n }\r\n }\r\n return [isEnabled, '', ''];\r\n };\r\n AttractionsCalendar.prototype.watchDateAttr = function () {\r\n var _this = this;\r\n var attr = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n attr[_i] = arguments[_i];\r\n }\r\n this.$scope.$watchGroup(attr.map(function (k) { return 'ac.' + k; }), function (vals) {\r\n vals.forEach(function (v, i) {\r\n if (_this.datepicker && v != null) {\r\n _this.datepicker('option', attr[i], _this.dateUtil.parseDate(v));\r\n }\r\n });\r\n });\r\n };\r\n AttractionsCalendar.prototype.showLoading = function (delay) {\r\n var _this = this;\r\n var spinnerHtml = '
        ', i = 8;\r\n while (i--) {\r\n spinnerHtml += \"
        \";\r\n }\r\n return setTimeout(function () {\r\n $(spinnerHtml + '
        ').hide().fadeIn(1000)\r\n .appendTo(_this.datepickerEl);\r\n }, delay);\r\n };\r\n AttractionsCalendar.prototype.hideLoading = function () {\r\n this.datepickerEl.find('.preloader').hide();\r\n };\r\n AttractionsCalendar.prototype.lockScroll = function () {\r\n this.htmlCss = {\r\n overflowY: this.html.css('overflowY'),\r\n width: 'auto'\r\n };\r\n this.html.css({\r\n overflowY: 'hidden',\r\n width: $('body').outerWidth()\r\n });\r\n };\r\n AttractionsCalendar.prototype.restoreScroll = function () {\r\n this.html.css(this.htmlCss);\r\n };\r\n AttractionsCalendar.prototype.setLayout = function () {\r\n var winWidth = this.win.width(), winHeight = TRPCONFIG.Domain.DeviceType === 'Mobile' ?\r\n screen.height : // ios fix\r\n this.win.height();\r\n // Allow for mobile fixed header\r\n var header = $('.header-main'), headerOffset = header.css('position') === 'fixed' ?\r\n header.outerHeight() : 0;\r\n this.overlay.resize(winWidth);\r\n this.win.scrollLeft(0); // input focus can cause window to scroll away\r\n this.datepickerEl.css({\r\n left: winWidth / 2,\r\n top: $(document).scrollTop() - headerOffset,\r\n 'max-width': winWidth,\r\n 'max-height': winHeight\r\n });\r\n };\r\n AttractionsCalendar.prototype.onRender = function () {\r\n // For new months this may run both before and after `getAvailability()`\r\n this.datepickerEl.addClass('active');\r\n this.populateDates();\r\n this.setLayout();\r\n };\r\n AttractionsCalendar.prototype.getAvailability = function (date) {\r\n var _this = this;\r\n // `renderedDates` suppresses re-rendering a month until calendar is closed\r\n var dateKey = this.getDateKey(date);\r\n if (!this.renderedDates[dateKey]) {\r\n var spinnerTimer_1 = this.showLoading(300);\r\n return this.attractionService.getAvailability(this.parentForm.productId, angular.extend({}, this.parentForm.formModel, { date: date }))\r\n .then(function (res) {\r\n var dates = res.Dates;\r\n clearTimeout(spinnerTimer_1);\r\n if (res.error) {\r\n _this.hideLoading();\r\n }\r\n else {\r\n _this.legend = _.filter(res.Legend, function (o) { return o.Abbreviation; });\r\n dates.forEach(function (o) {\r\n var dateStr = _this.getDateKey(o.Date);\r\n if (dateStr && _.get(o, 'Tickets.length', 0) > 0) {\r\n _this.enabledDates[dateStr] = _this.sortTickets(o.Tickets, _this.legend.reduce(function (o, l, i) { return (o[l.Label] = i + 1) && o; }, {}));\r\n }\r\n });\r\n _this.renderedDates[dateKey] = true;\r\n _this.datepicker('refresh'); // Destroys spinner\r\n }\r\n });\r\n }\r\n };\r\n AttractionsCalendar.prototype.sortTickets = function (tickets, order) {\r\n return tickets.sort(function (a, b) {\r\n return order[a.Label] < order[b.Label] ? -1 :\r\n order[a.Label] > order[b.Label] ? 1 : 0;\r\n });\r\n };\r\n AttractionsCalendar.prototype.syncField = function () {\r\n // Ensure field contains current value\r\n this.datepicker('setDate', this.selectedDate);\r\n };\r\n AttractionsCalendar.prototype.getLegendChar = function (key) {\r\n return (_.find(this.legend, {\r\n Key: key\r\n }) || {}).Abbreviation || '';\r\n };\r\n AttractionsCalendar.prototype.getPriceHtml = function (key) {\r\n var _this = this;\r\n var htmlStr = '', enabledDates = this.enabledDates[key];\r\n if (enabledDates) {\r\n if (enabledDates.length < 3) {\r\n // Placeholder for spacing\r\n htmlStr += '

        ';\r\n }\r\n htmlStr += enabledDates.reduce(function (str, ticket) {\r\n return str + \"
        \" + _this.getLegendChar(ticket.Key) + \"
        \" + _this.$filter('roundedCurrency')(ticket.Price) + \"

        \";\r\n }, '');\r\n }\r\n return htmlStr;\r\n };\r\n AttractionsCalendar.prototype.zeroPad = function (n) {\r\n n += '';\r\n return ('00' + n).substr(n.length);\r\n };\r\n AttractionsCalendar.prototype.populateDates = function () {\r\n var _this = this;\r\n // Populate data on active calendar DOM elements (only)\r\n $('.attractions-calendar [data-month]').each(function (i, el) {\r\n var $el = $(el), key = $el.attr('data-year') + '-' +\r\n _this.zeroPad(Number($el.attr('data-month')) + 1) + '-' + // Month is 1 based\r\n _this.zeroPad($el.text()); // Seems jQuery datepicker is designed this way `_selectDay()`\r\n // NOTE:
        required even if there's no price data\r\n $el.append(\"
        \\n
        \" + _this.getPriceHtml(key) + \"
        \\n
        \");\r\n });\r\n };\r\n AttractionsCalendar.prototype.createHeader = function () {\r\n var _this = this;\r\n var closeBtn = $(\"
        \")\r\n .click(function () { return _this.datepicker('hide'); });\r\n var legendArea = !this.legend.length ? '' :\r\n \"
          \" + this.legend.reduce(function (str, o) { return str + \"\\n
        • \" + o.Abbreviation + \"\" + o.Label + \"
        • \\n \"; }, '') + \"
        \";\r\n var headerArea = $(\"\\n
        \\n
        \" + this.resourceService.get('ATTRACTIONSCALENDARHEADER') + \"
        \\n
        \\n \" + this.resourceService.get('ATTRACTIONBOOKINGNOTE') + \"\\n
        \\n
        \");\r\n var legendAreaConainer = $(\"\\n
        \\n \" + legendArea + \"\\n
        \\n \");\r\n this.datepickerEl.append(legendAreaConainer);\r\n headerArea.append(closeBtn);\r\n this.datepickerEl.prepend(headerArea);\r\n };\r\n AttractionsCalendar.prototype.clearDate = function () {\r\n this.selectedDate = null;\r\n this.syncField();\r\n this.selectDate();\r\n };\r\n AttractionsCalendar.prototype.selectDate = function () {\r\n var _this = this;\r\n var dateOb;\r\n this.selectedDate = this.datepicker('getDate') || this.selectedDate;\r\n if (this.dateUtil.isValid(this.selectedDate)) {\r\n dateOb = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), this.selectedDate.getDate());\r\n }\r\n this.$scope.$evalAsync(function () {\r\n if (_this.selectedDate == null) {\r\n _this.select({ date: null });\r\n }\r\n else {\r\n // Add price data to parent form for displaying total\r\n var dateData = _this.enabledDates[_this.getDateKey(_this.selectedDate)];\r\n if (dateData) {\r\n dateData.forEach(function (d) {\r\n _this.parentForm.setPriceData(d.Key, d.Price);\r\n });\r\n }\r\n _this.select({\r\n date: _this.dateUtil.serialiseDate(dateOb)\r\n });\r\n }\r\n _this.syncField();\r\n });\r\n };\r\n AttractionsCalendar.prototype.suppressPositioning = function () {\r\n // Suppress datepicker absolute positioning\r\n this.dpPosFn = $.datepicker._checkOffset;\r\n $.datepicker._checkOffset = function () { return ({ left: '', top: '' }); };\r\n };\r\n AttractionsCalendar.prototype.restorePositioning = function () {\r\n $.datepicker._checkOffset = this.dpPosFn;\r\n };\r\n AttractionsCalendar.prototype.deregister = function () {\r\n // Clear class for any other datepickers\r\n this.datepickerEl.removeClass('attractions-calendar');\r\n this.win.off(this.eventNs);\r\n $.datepicker._updateDatepicker = $.datepicker._updateDatepicker_original;\r\n delete $.datepicker._updateDatepicker_original;\r\n };\r\n return AttractionsCalendar;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('attractionsCalendar', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: AttractionsCalendar,\r\n controllerAs: 'ac',\r\n bindToController: {\r\n select: '&',\r\n minDate: '=',\r\n maxDate: '=',\r\n currentDate: '=',\r\n activeDateFrom: '=',\r\n placeholder: '@'\r\n },\r\n require: '^attractionsProductForm',\r\n template: \"
        \\n
        \\n \\n \\n
        \\n
        \",\r\n link: function (scope, el, attr, attractionsProductForm) {\r\n scope.ac.parentForm = attractionsProductForm;\r\n scope.ac.init(el.find('input'));\r\n scope.$on('$destroy', function () { return scope.ac.deregister(); });\r\n }\r\n };\r\n });\r\n})(Attractions || (Attractions = {}));\r\n;\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('basketBar', function ($q, tripService, $filter, $routeParams, basketStore, broker, customCurrencyFilter, bookingService, arrayUtil, currencyService) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=BasketBar',\r\n scope: {\r\n hideButton: '=',\r\n buttonHandler: '&',\r\n buttonDisabler: '&',\r\n isDeposit: '=?'\r\n },\r\n link: function (scope) {\r\n if ($routeParams.pb) {\r\n return;\r\n }\r\n scope.isMobileDevice = TRPCONFIG.IsMobileDevice;\r\n scope.costBreakdowns = [];\r\n scope.priceExcludesTax = TRPCONFIG.Domain.PriceExcludesTax || false;\r\n scope.roundedPrice = function (amount, symbol) {\r\n var final = $filter('roundedCurrency')(amount, symbol);\r\n return final.replace(symbol, '');\r\n };\r\n broker.subscribe('basketBarDirective', 'feesUpdated', _setPaymentTotalPlusFees);\r\n function _setPaymentTotalPlusFees(fees) {\r\n var cardFee = (fees && fees.data && fees.data.CardHandlingFee) || 0;\r\n //creating clean data object\r\n scope.fees = fees && fees.data ? { data: angular.copy(fees.data) } : null;\r\n scope.totalDepositWithCardFee = (scope.deposit || 0) + cardFee;\r\n }\r\n function isScrolledIntoView(el) {\r\n var rect = el.getBoundingClientRect();\r\n var elemTop = rect.top;\r\n var elemBottom = rect.bottom;\r\n var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);\r\n return isVisible;\r\n }\r\n scope.openHolidayInfo = function () {\r\n var infoModal = document.getElementById('holidayInfoModal');\r\n var editSearchModal = document.getElementById('editSearchModal');\r\n var priceElement = document.getElementById('price-section');\r\n var editElement = document.getElementById('edit-section');\r\n priceElement.classList.toggle('active');\r\n document.addEventListener('scroll', function () {\r\n var topOfPage = document.getElementById('top-of-page');\r\n var isAtTop = isScrolledIntoView(topOfPage);\r\n if (isAtTop) {\r\n priceElement.classList.remove('active');\r\n editElement.classList.remove('active');\r\n infoModal.style.display = 'none';\r\n editSearchModal.style.display = 'none';\r\n }\r\n }, true);\r\n if (editElement.classList.contains('active')) {\r\n editElement.classList.remove('active');\r\n }\r\n if (infoModal.style.display === 'block') {\r\n infoModal.style.display = 'none';\r\n }\r\n else {\r\n editSearchModal.style.display = 'none';\r\n infoModal.style.display = 'block';\r\n }\r\n };\r\n scope.editSearch = function () {\r\n var infoModal = document.getElementById('holidayInfoModal');\r\n var editSearchModal = document.getElementById('editSearchModal');\r\n var priceElement = document.getElementById('price-section');\r\n var editElement = document.getElementById('edit-section');\r\n var searchPanel = document.querySelectorAll('.ekh-search-panel')[0];\r\n var searchPanel2 = document.querySelectorAll('.ekh-search-panel')[1];\r\n if (searchPanel2 && searchPanel2 !== undefined) {\r\n searchPanel2.classList.add('ekh-top-margin');\r\n }\r\n else if (!searchPanel2 && searchPanel2 === undefined) {\r\n searchPanel.classList.add('ekh-top-margin');\r\n }\r\n document.addEventListener('scroll', function () {\r\n var topOfPage = document.getElementById('top-of-page');\r\n var isAtTop = isScrolledIntoView(topOfPage);\r\n if (isAtTop) {\r\n priceElement.classList.remove('active');\r\n editElement.classList.remove('active');\r\n infoModal.style.display = 'none';\r\n editSearchModal.style.display = 'none';\r\n }\r\n }, true);\r\n if (searchPanel && searchPanel.classList.contains('panel-hide')) {\r\n searchPanel.classList.remove('panel-hide');\r\n }\r\n editElement.classList.toggle('active');\r\n if (priceElement.classList.contains('active')) {\r\n priceElement.classList.remove('active');\r\n }\r\n if (editSearchModal.style.display === 'block') {\r\n editSearchModal.style.display = 'none';\r\n }\r\n else {\r\n infoModal.style.display = 'none';\r\n editSearchModal.style.display = 'block';\r\n }\r\n };\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n function getCostbreakdowns() {\r\n var reqs = [basketStore.totalDeposit(trip.BasketId, $routeParams.productId),\r\n basketStore.costBreakdownGrouped(trip.BasketId),\r\n basketStore.getTaxAdjustmentValue(trip.BasketId),\r\n basketStore._costByProduct(1, trip.BasketId),\r\n basketStore._costByProduct(6, trip.BasketId)];\r\n if (trip.BookingId) {\r\n reqs.push(bookingService.getBooking(trip.BookingId));\r\n }\r\n $q.all(reqs).then(function (_a) {\r\n var totalDeposit = _a[0], costBreakdownGrouped = _a[1], taxAdjustments = _a[2], flightCost = _a[3], marhabaCost = _a[4], booking = _a[5];\r\n var costType = {\r\n Unknown: 0,\r\n Accommodation: 1,\r\n Discount: 20,\r\n AccommodationCancellationProtection: 21,\r\n AccommodationLocalFeesAndTaxes: 22,\r\n AccommodationExtraTransfer: 23,\r\n AccommodationExtraEvent: 24,\r\n AccommodationExtraAttraction: 25,\r\n AccommodationExtra: 26,\r\n };\r\n if (!costBreakdownGrouped.isPackage && (trip.TripType === tripService.tripTypes.Hotel)) {\r\n var _b = (costBreakdownGrouped[0] || {}).costBreakdown, costBreakdown = _b === void 0 ? [] : _b;\r\n var extraCostItems = costBreakdown.filter(function (cost) {\r\n var match = _.get(cost, 'ParentId') && _.get(cost, 'TypeId') ===\r\n (costType.AccommodationExtraTransfer || costType.AccommodationExtraEvent\r\n || costType.AccommodationExtraAttraction || costType.AccommodationExtra || costType.AccommodationExtra || costType.AccommodationLocalFeesAndTaxes || costType.AccommodationCancellationProtection || costType.Discount);\r\n return match;\r\n }).filter(function (extra) { return extra; });\r\n var roomCostItems = costBreakdown.filter(function (cost) { return !_.get(cost, 'ParentId')\r\n && _.get(cost, 'TypeId') === costType.Accommodation; }).map(function (room, LinkId) {\r\n return __assign({}, room, { LinkId: LinkId });\r\n });\r\n if (extraCostItems && extraCostItems.length > 0 && roomCostItems && roomCostItems.length > 0) {\r\n var updatedRoomCostItems_2 = roomCostItems.map(function (room) {\r\n return { RoomId: room.Id, RoomDescription: room.Description };\r\n });\r\n var enhancedExtras = extraCostItems.map(function (extras) {\r\n return __assign({}, extras, updatedRoomCostItems_2.find(function (acc) { return acc.RoomId === extras.ParentId; }));\r\n });\r\n var updatedExtrasCostItems = enhancedExtras.map(function (extra, LinkId) {\r\n var splitDescription = _.get(extra, 'RoomDescription').split('(');\r\n var Description = splitDescription[1] ? extra.Description + \" (\" + splitDescription[1] : extra.Description;\r\n return __assign({}, extra, { Description: Description,\r\n LinkId: LinkId });\r\n });\r\n var updatedCostBreakdown = roomCostItems.concat(updatedExtrasCostItems);\r\n var costsSortedById = updatedCostBreakdown.sort(function (a, b) { return (a.LinkId >= b.LinkId) ? 1 : -1; });\r\n costBreakdownGrouped[0].costBreakdown = costsSortedById;\r\n }\r\n }\r\n scope.costBreakdowns = costBreakdownGrouped;\r\n if (window.location.pathname.includes('book') || window.location.pathname.includes('options')) {\r\n priceUpdate();\r\n }\r\n else {\r\n setTimeout(priceUpdate(), 500);\r\n }\r\n function currencySymbol(total) {\r\n var price = scope.roundedPrice(total, '');\r\n var currencyCode = TRPCONFIG.Domain.CurrencyCode;\r\n var newPrice;\r\n if (currencyCode.match(/GIP|EUR/g)) {\r\n newPrice = scope.roundedPrice(total, '');\r\n }\r\n else if (currencyCode.match(/USD/g)) {\r\n price = price.replace(/£/g, '');\r\n newPrice = \"$\" + price;\r\n }\r\n else {\r\n price = price.replace(/[^0-9,.]/g, '');\r\n newPrice = \"\" + TRPCONFIG.Domain.CurrencyCode + price;\r\n }\r\n return newPrice;\r\n }\r\n function getPriceFromString(str) {\r\n str = str.replace(/[^0-9]/g, '');\r\n var num = Number(str);\r\n return num;\r\n }\r\n function checkSummaryPrice() {\r\n var target = document.querySelector('.sticky-panel-hidden');\r\n var observer = new MutationObserver(function (mutations) {\r\n mutations.forEach(function (mutation) {\r\n if (target || mutation === 'characterData') {\r\n var summaryTotal = document.querySelector('.teaser-price .price-value');\r\n var bannerTotal = document.querySelector('.sticky-panel-hidden .price.total');\r\n if (summaryTotal) {\r\n var bannerText = bannerTotal.innerText;\r\n var summaryText = summaryTotal.innerText;\r\n var bannerNum = getPriceFromString(bannerText);\r\n var summaryNum = getPriceFromString(summaryText);\r\n if (bannerNum !== summaryNum && summaryNum !== 0) {\r\n summaryTotal.innerHTML = bannerText;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n var config = {\r\n subtree: true,\r\n attributes: false,\r\n childList: false,\r\n characterData: true\r\n };\r\n observer.observe(target, config);\r\n }\r\n function priceUpdate() {\r\n scope.hotelCost = 0;\r\n var hotelData = JSON.parse(sessionStorage.getItem('hotelData'));\r\n var hotelSelected = {};\r\n var searchHotelData = JSON.parse(sessionStorage.getItem('hotelSearchResults'));\r\n if (hotelData && searchHotelData) {\r\n hotelSelected = searchHotelData.filter(function (hData) {\r\n return hData.Id === hotelData.Id;\r\n });\r\n }\r\n if (window.location.pathname.includes('book') || window.location.pathname.includes('options') ||\r\n window.location.pathname.includes('flights')) {\r\n scope.total = costBreakdownGrouped.total;\r\n if (costBreakdownGrouped[0].group === 1) {\r\n scope.hotelCost = costBreakdownGrouped[0].total;\r\n }\r\n var deposit = totalDeposit;\r\n var bannerTotal = document.querySelector('.sticky-panel-hidden .price.total');\r\n if (bannerTotal) {\r\n bannerTotal.innerHTML = currencySymbol(scope.total);\r\n }\r\n if (booking) {\r\n deposit += booking.UserData.PaymentDetails.DepositAmount;\r\n var roundedTotal_1 = currencySymbol(costBreakdownGrouped.total);\r\n var roundedDeposit_1 = currencySymbol(deposit);\r\n document.addEventListener('click', function (e) {\r\n var attributes = Array.from(e.target.attributes);\r\n if (attributes[0].value === 'radio') {\r\n var parents = e.target.parentNode.parentNode;\r\n var classes = parents.classList.value;\r\n if (classes.includes('total')) {\r\n document.querySelector('.sticky-panel-hidden .price.deposit').innerHTML = roundedTotal_1;\r\n document.querySelector('.mobile-view .deposit').innerHTML = roundedTotal_1;\r\n }\r\n else if (classes.includes('deposit')) {\r\n document.querySelector('.sticky-panel-hidden .price.deposit').innerHTML = roundedDeposit_1;\r\n document.querySelector('.mobile-view .deposit').innerHTML = roundedDeposit_1;\r\n }\r\n }\r\n });\r\n }\r\n scope.deposit = deposit;\r\n }\r\n else {\r\n scope.total = flightCost + marhabaCost;\r\n if (hotelData && hotelData.MinCost) {\r\n scope.total = flightCost + marhabaCost + hotelData.MinCost;\r\n scope.hotelCost = hotelData.MinCost;\r\n }\r\n scope.deposit = (hotelSelected[0] && hotelSelected[0].HolidayDeposit) ? hotelSelected[0].HolidayDeposit : scope.total;\r\n }\r\n scope.taxAdjustment = taxAdjustments;\r\n scope.isPackage = costBreakdownGrouped.isPackage;\r\n checkSummaryPrice();\r\n }\r\n if (scope.binRangeDiscount != null) {\r\n scope.total -= scope.binRangeDiscount.DiscountValue;\r\n if (!scope.isDeposit) {\r\n scope.deposit -= scope.binRangeDiscount.DiscountValue;\r\n }\r\n }\r\n tripService.getCurrency($routeParams.tripId).then(function (currency) {\r\n scope.currency = currency;\r\n scope.symbol = currencyService.getSymbol(currency);\r\n scope.totalDeposit = customCurrencyFilter(scope.deposit, currency);\r\n _setPaymentTotalPlusFees(scope.fees);\r\n });\r\n });\r\n // persist any open content panel\r\n var i = arrayUtil.indexOf(scope.costBreakdowns, function (cb) {\r\n return cb.open;\r\n });\r\n if (i >= 0) {\r\n scope.costBreakdowns[i].open = true;\r\n }\r\n }\r\n getCostbreakdowns();\r\n broker.subscribe('basketBarDirective', 'basketUpdated', _.debounce(getCostbreakdowns, 100));\r\n broker.subscribe('basketBarDirective', 'paymentDataUpdated', _.debounce(getCostbreakdowns, 100));\r\n broker.subscribe('basketBarDirective', 'discountUpdated', _setBinRangeDiscount);\r\n broker.subscribe('basketBarDirective', 'boardPriceSelectionsUpdate', _setBoardTypePriceUpdates);\r\n function _setBinRangeDiscount(discount) {\r\n if (discount.data != null) {\r\n scope.binRangeDiscount = discount.data[0];\r\n }\r\n else {\r\n scope.binRangeDiscount = null;\r\n }\r\n getCostbreakdowns();\r\n }\r\n function _setBoardTypePriceUpdates(price) {\r\n scope.total = price.data;\r\n var hotelData = JSON.parse(sessionStorage.getItem('hotelData'));\r\n var hotelSelected = {};\r\n var searchHotelData = JSON.parse(sessionStorage.getItem('hotelSearchResults'));\r\n if (hotelData && searchHotelData) {\r\n hotelSelected = searchHotelData.filter(function (hData) {\r\n return hData.Id === hotelData.Id;\r\n });\r\n }\r\n if (hotelSelected && !hotelSelected[0].HolidayDeposit) {\r\n scope.deposit = price.data;\r\n }\r\n }\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('basketBarDirective');\r\n });\r\n });\r\n scope.sectionClass = function (index) {\r\n return scope.costBreakdowns[index].open ? 'expanded' : '';\r\n };\r\n scope.toggleSection = function (index) {\r\n scope.costBreakdowns.forEach(function (cb, i) {\r\n if (i !== index) {\r\n cb.open = false;\r\n }\r\n });\r\n scope.costBreakdowns[index].open = !scope.costBreakdowns[index].open;\r\n };\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n var BasketToolbar = /** @class */ (function () {\r\n function BasketToolbar($scope, attractionService, basketStore, broker) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.attractionService = attractionService;\r\n this.basketStore = basketStore;\r\n this.broker = broker;\r\n this.hide = false;\r\n this.basketTotal = 0;\r\n this.basketCount = 0;\r\n basketStore.getAttractionsBasket()\r\n .then(function (res) { return _this.updateAttractionsBasket(res.LineItems); });\r\n broker.subscribe('basketToolbarDirective', 'attractionsBasketUpdated', function (e) { return _this.updateAttractionsBasket(e.data && e.data.Basket && e.data.Basket.LineItems); });\r\n broker.subscribe('basketToolbarDirective', 'basketCleared', function () { return _this.updateAttractionsBasket(); });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('basketToolbarDirective');\r\n });\r\n }\r\n BasketToolbar.prototype.updateAttractionsBasket = function (lineItems) {\r\n var totals = this.attractionService.getProductTotals(lineItems);\r\n this.basketTotal = totals.price;\r\n this.basketCount = totals.count;\r\n };\r\n return BasketToolbar;\r\n }());\r\n angular.module('TR')\r\n .directive('basketToolbar', function ($rootScope, broker) {\r\n return {\r\n restrict: 'E',\r\n controller: BasketToolbar,\r\n controllerAs: 'bt',\r\n replace: true,\r\n templateUrl: 'partials/home/directivetemplate?type=BasketToolbar',\r\n link: function (scope, el, attr, ctrl) {\r\n $rootScope.$on('$routeChangeSuccess', function (_, next) {\r\n ctrl.hide = !!next.hideDistractionLinks;\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var BookingCompleteTracking = /** @class */ (function () {\r\n function BookingCompleteTracking($scope, $routeParams, $location, analytics, authService, basketService, bookingCompleteTrackingService, trackingPixelsService, tripService) {\r\n this.$scope = $scope;\r\n this.$routeParams = $routeParams;\r\n this.$location = $location;\r\n this.analytics = analytics;\r\n this.authService = authService;\r\n this.basketService = basketService;\r\n this.bookingCompleteTrackingService = bookingCompleteTrackingService;\r\n this.trackingPixelsService = trackingPixelsService;\r\n this.tripService = tripService;\r\n this.pixelsWithTracking = [];\r\n this.initTracking();\r\n }\r\n BookingCompleteTracking.prototype.onPixelLoad = function (name) {\r\n this.trackingPixelsService.report('load', name);\r\n };\r\n BookingCompleteTracking.prototype.onPixelLoadError = function (name) {\r\n this.trackingPixelsService.report('error', name);\r\n };\r\n BookingCompleteTracking.prototype.initTracking = function () {\r\n var _this = this;\r\n var bookingRef = this.$routeParams.ref.split('|')[0]; //for multi bookings 1st id is good enough\r\n var setTrackingUrls = function (bookingRef, basket) {\r\n // some pixels require additional information sourced form basket, we will pass it as options object\r\n var options = {};\r\n if (basket) {\r\n var cancellationPrefix_1 = 'canxp_';\r\n var offer = basket.h || basket.f;\r\n options['cancellationProtectionRef'] = _.chain(offer.Options)\r\n .filter(function (item) { return item.OptionId.indexOf(cancellationPrefix_1) > -1; })\r\n .head()\r\n .get('OptionId')\r\n .replace(cancellationPrefix_1, '')\r\n .value();\r\n }\r\n //we have two sets of pixels doing slightly different things ones where we track\r\n //if they have loaded or errored and others where we do not track this\r\n var pixels = _this.trackingPixelsService.getAllProviderUrls(bookingRef, options);\r\n _this.pixels = _.map(_.filter(pixels, function (p) { return p.trackingLabel.length === 0; }), 'url');\r\n _this.pixelsWithTracking = _.filter(pixels, function (p) { return p.trackingLabel.length > 0; });\r\n };\r\n //if we have come back from PayPal we need to do a little extra work recording conversion values etc...\r\n //ref: the full booking reference string e.g. TRN/1234567%7CEUF/11488101%7CPRK/123456%7CACM/123656\r\n var tripId = this.$routeParams.tripId || this.$location.search().tripId;\r\n if (tripId) {\r\n var bookingRefs_1 = this.$routeParams.ref.split('|');\r\n return this.tripService.getTrip(tripId).then(function (trip) {\r\n var user = _this.authService.getUser();\r\n return _this.bookingCompleteTrackingService.trackConversion(trip, bookingRefs_1, _this.$routeParams.source, user.Email, null).then(function () { return _this.basketService.completeWorkflow(bookingRefs_1, trip.BasketId); })\r\n .then(function (_a) {\r\n var basket = _a[0];\r\n return basket;\r\n });\r\n })\r\n .then(function (basket) {\r\n var basketHasContent = _.reduce(basket.all, function (bool, elem) {\r\n if (elem != null) {\r\n if ((elem instanceof Array && elem.length > 0) || !(elem instanceof Array)) {\r\n return true;\r\n }\r\n }\r\n return bool;\r\n }, false);\r\n if (basketHasContent) {\r\n //by this point setData on tracking pixel service would have been called\r\n //so we can get the urls now.\r\n setTrackingUrls(bookingRef, basket);\r\n }\r\n });\r\n }\r\n else {\r\n if (!TRPCONFIG.Domain2.NewTransactionTracking) {\r\n this.analytics.trackConversion();\r\n }\r\n setTrackingUrls(bookingRef);\r\n }\r\n };\r\n return BookingCompleteTracking;\r\n }());\r\n angular.module('TR')\r\n .directive('bookingCompleteTracking', function () {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: true,\r\n template: \"\\n \",\r\n controller: BookingCompleteTracking,\r\n controllerAs: 'bct'\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var BookingLookup = /** @class */ (function () {\r\n function BookingLookup(accountMenuService, authService, resourceService) {\r\n var _this = this;\r\n this.accountMenuService = accountMenuService;\r\n this.authService = authService;\r\n this.resourceService = resourceService;\r\n this.popupSignIn = function (event) {\r\n event.preventDefault();\r\n _this.authService.bufferRoute(null);\r\n //redirect here is only used in the mobile version of accountMenuService\r\n _this.accountMenuService.launchOption('bookingsignin');\r\n };\r\n this.tooltip = this.resourceService.get('MANAGEMYBOOKINGTOOLTIP');\r\n }\r\n return BookingLookup;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('bookingLookup', function () {\r\n return {\r\n scope: {},\r\n controller: BookingLookup,\r\n controllerAs: 'as',\r\n restrict: 'E',\r\n replace: true,\r\n template: \"\\n \",\r\n transclude: true\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('bookingTracker', function (bookingService) {\r\n //booking may be on an ancester scope\r\n function findBooking(s) {\r\n if (s.cm) {\r\n if (s.cm.booking) {\r\n return s.cm.booking;\r\n }\r\n }\r\n return s.$parent ? findBooking(s.$parent) : null;\r\n }\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link: function (scope, el, attr, c) {\r\n var update = _.debounce(function () {\r\n var b = findBooking(scope);\r\n if (b) {\r\n bookingService.updateBooking(b, attr.bookingDescription + \" changed to: \" + c.$modelValue);\r\n }\r\n }, 1000);\r\n if (c != null) {\r\n c.$viewChangeListeners.push(update);\r\n c.$updateBooking = update;\r\n }\r\n else {\r\n var bw_1 = scope.$watch('cm.booking', function (b, oldB) {\r\n if (b != null && !angular.equals(b, oldB)) {\r\n bw_1();\r\n return;\r\n }\r\n scope.$watch(attr.bookingTracker, _.debounce(function (val, prev) {\r\n if (!angular.equals(val, prev) && !!b) {\r\n bookingService.updateBooking(scope.cm.booking, attr.bookingDescription + \" changed to: \" + val);\r\n }\r\n }, 1000), true);\r\n }, true);\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('breadcrumb', function (broker, $route, $routeParams, basketService, analytics, breadcrumbDetailsService, $timeout) {\r\n var text;\r\n if (breadcrumbDetailsService.getText) {\r\n text = breadcrumbDetailsService.getText();\r\n }\r\n //let's optionally get the breadcrumb from the scope so that we can override the route if necessary\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n useText: '=',\r\n showBreadcrumb: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Breadcrumb',\r\n link: function (scope, element) {\r\n var bc = $route.current.$$route.breadcrumb;\r\n if (bc && bc.crumb === 10 && TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\r\n bc.crumb = 25;\r\n }\r\n var tripId = $routeParams.tripId;\r\n if (tripId) {\r\n basketService.getArea().then(function (a) {\r\n var area = scope.area = a;\r\n scope.baseAreaUrl = \"\" + TRPCONFIG.Domain.SearchUnitHomePath + area;\r\n scope.click = function clickBreadcrumb(c) {\r\n /*\r\n The number 10 is used to select a flight, and the number 25 is used to change the flight,\r\n the names for the crumbs are different, but the functionality is the same,\r\n so if the flight was previously chosen, we must use the name of crumbs 25 and the functionality of crumbs 10.\r\n This expression was added to avoid code duplication\r\n */\r\n bc.crumb = basketService.isFlightPreselected() && bc.crumb === 10 ? 25 : bc.crumb;\r\n if (c < bc.crumb || (c === bc.crumb)) {\r\n analytics.trackEvent({ label: 'breadcrumb nav', value: c });\r\n basketService.changeJourneyUrl(c);\r\n }\r\n };\r\n broker.subscribe('breadcrumb', 'ChangeWorkflowState', function (ev) {\r\n basketService.changeJourneyUrl(ev.data);\r\n });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('breadcrumb');\r\n });\r\n });\r\n }\r\n scope.show = bc != null;\r\n if (bc != null) {\r\n breadcrumbDetailsService.getCrumbs(scope.useText).then(function (crumbs) {\r\n scope.crumbs = crumbs;\r\n scope.width = function () {\r\n return { width: 100 / scope.crumbs.length + \"%\" };\r\n };\r\n });\r\n scope.class = breadcrumbDetailsService.getClasses(bc, scope.useText);\r\n if (text) {\r\n scope.text = function (c) {\r\n return text[c];\r\n };\r\n }\r\n }\r\n scope.shortText = function (crumb) {\r\n return breadcrumbDetailsService.getTextShort()[crumb];\r\n };\r\n $timeout(function () {\r\n var wrapperClass = 'breadcrumb-wrapper';\r\n var wrapper = element.hasClass(wrapperClass) ? element : element.find(\".\" + wrapperClass);\r\n var activeCrumb = element.find('.is-active');\r\n var wrapperOffsetLeft = _.get(wrapper, '[0].offsetLeft');\r\n var crumbsOffsetLeft = _.get(activeCrumb, '[0].offsetLeft');\r\n var offsetPosition = crumbsOffsetLeft - wrapperOffsetLeft;\r\n if (crumbsOffsetLeft && offsetPosition) {\r\n wrapper[0].scrollLeft = offsetPosition;\r\n }\r\n }, 1000);\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('cardCvv', function (paymentsService) {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: {\r\n modal: '=',\r\n cardType: '=',\r\n paymentOptions: '='\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return \"partials/booking/template?name=CardCvv&version=\" + attr.templateVersion;\r\n }\r\n return 'partials/home/directivetemplate?type=CardCvv';\r\n },\r\n link: function (scope) {\r\n var reAmex = /American\\sExpress/i;\r\n scope.$watch('cardType', function (cardTypeId) {\r\n scope.isAmex = null; //Hides all messages\r\n //Amex message shows if card name matches regex\r\n //Otherwise, default message shows whenever `cardTypeId` is truthy\r\n //Message is hidden if `cardTypeId` is falsy\r\n if (cardTypeId) {\r\n var paymentOptions = scope.paymentOptions;\r\n var cardSpec = paymentOptions && paymentsService.getCardFromId(paymentOptions, cardTypeId);\r\n //Title has been renamed to Name in new API.\r\n scope.isAmex = reAmex.test(cardSpec && (cardSpec.Title || cardSpec.Name));\r\n }\r\n });\r\n }\r\n };\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var Dictionary = Core.Collections.Dictionary;\r\n var DriverType = Core.Booking.DriverType;\r\n var CarHireSelection = /** @class */ (function () {\r\n function CarHireSelection($scope, resourceService) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.resourceService = resourceService;\r\n this.drivers = new Dictionary();\r\n var wait = $scope.$watch('chs.bookingLoaded', function (b) {\r\n if (b) {\r\n _this.init();\r\n wait();\r\n }\r\n });\r\n $scope.$watch('chs.userData.Rooms', function (u) {\r\n if (u) {\r\n _this.updateDriverTitles(_this.drivers, u);\r\n }\r\n }, true);\r\n }\r\n CarHireSelection.prototype.updateDriverType = function (value, newDriverId, oldDriverId) {\r\n //find the new and old driver ids and update our user data accordingly\r\n this.findAndUpdateDriverType(this.userData.Rooms, oldDriverId, DriverType.NotADriver);\r\n this.findAndUpdateDriverType(this.userData.Rooms, newDriverId, value);\r\n };\r\n CarHireSelection.prototype.init = function () {\r\n if (this.captureDrivers) {\r\n this.updateDriverTitles(this.drivers, this.userData.Rooms);\r\n if (this.drivers.count() === 0) {\r\n this.captureDrivers = false;\r\n return;\r\n }\r\n var guests = this.getGuestList(this.userData.Rooms);\r\n this.driverTypeModels = [\r\n {\r\n title: this.resourceService.get('MAINDRIVER'),\r\n type: DriverType.MainDriver,\r\n driverId: this.getGuestIdForDriverType(guests, DriverType.MainDriver),\r\n ineligible: false\r\n }\r\n ];\r\n if (this.additionalDrivers > 0 && guests.length >= 1) {\r\n var adults = guests.filter(function (g) { return g.Type === 1; });\r\n this.driverTypeModels.push({\r\n title: this.resourceService.get('ADDITIONALDRIVER'),\r\n type: DriverType.AdditionalDriver,\r\n driverId: this.getGuestIdForDriverType(guests, DriverType.AdditionalDriver),\r\n ineligible: adults.length === 1\r\n });\r\n }\r\n }\r\n };\r\n CarHireSelection.prototype.findAndUpdateDriverType = function (rooms, guestId, driverType) {\r\n _.each(rooms, function (r) {\r\n var keepGoing = true;\r\n _.each(r.Guests, function (g) {\r\n if (g.Id === guestId - 1) {\r\n g.DriverType = driverType;\r\n keepGoing = false;\r\n return keepGoing;\r\n }\r\n });\r\n return keepGoing;\r\n });\r\n //check the same driver is not assigned to another driver type\r\n //clear it if he is\r\n if (driverType !== DriverType.NotADriver) {\r\n var models = _.filter(this.driverTypeModels, { 'driverId': guestId });\r\n if (models.length > 1) {\r\n _.find(models, function (d) { return d.type !== driverType; }).driverId = 0;\r\n }\r\n }\r\n };\r\n CarHireSelection.prototype.getGuestIdForDriverType = function (guests, type) {\r\n //get the guest id for the given type\r\n //NOTE ids start at 0 but this is not what we want as 0 is counted as a blank/unset value so bump the\r\n //guest Id to be something we can work with\r\n var g = _.find(guests, { 'Type': 1, 'Age': 21, 'DriverType': type });\r\n if (g) {\r\n return g.Id + 1;\r\n }\r\n return 0;\r\n };\r\n CarHireSelection.prototype.updateDriverTitles = function (dict, rooms) {\r\n //update the driver titles we have stored\r\n _.each(rooms, function (room) {\r\n _.each(_.filter(room.Guests, { 'Type': 1, 'Age': 21 }), function (guest) {\r\n var name = (guest.Title && guest.FirstName && guest.LastName) ?\r\n guest.Title + \" \" + guest.FirstName + \" \" + guest.LastName :\r\n guest.Label;\r\n var id = guest.Id + 1;\r\n if (dict.containsKey(id.toString())) {\r\n var driver = dict.item(id.toString());\r\n if (driver.name !== name) {\r\n driver.name = name;\r\n }\r\n }\r\n else {\r\n dict.add(id.toString(), { name: name, id: id });\r\n }\r\n });\r\n });\r\n };\r\n CarHireSelection.prototype.getGuestList = function (rooms) {\r\n return _.reduce(rooms, function (result, room) {\r\n return result.concat(room.Guests);\r\n }, []);\r\n };\r\n return CarHireSelection;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('carhireSelection', function () {\r\n return {\r\n bindToController: true,\r\n controller: CarHireSelection,\r\n controllerAs: 'chs',\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n additionalDrivers: '=',\r\n bookingLoaded: '=',\r\n captureDrivers: '=',\r\n carhire: '=',\r\n requestedItemsCosts: '=',\r\n rootForm: '=',\r\n userData: '=',\r\n templateVersion: '@'\r\n },\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return 'partials/booking/template?name=CarHireSelection&version='\r\n + attr.templateVersion;\r\n }\r\n else {\r\n return 'partials/home/directivetemplate?type=CarHireSelection';\r\n }\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n function Carousel(funcUtil, $timeout) {\r\n return {\r\n scope: {\r\n data: '=',\r\n autoplay: '=',\r\n autoplaySpeed: '=',\r\n slidesToShow: '=',\r\n slidesToScroll: '=',\r\n arrows: '=',\r\n dots: '=',\r\n infinite: '=',\r\n asNavFor: '@',\r\n fade: '@',\r\n speed: '@',\r\n responsive: '=',\r\n variableWidth: '=',\r\n centerMode: '='\r\n },\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=CarouselDirective',\r\n transclude: true,\r\n replace: true,\r\n link: link\r\n };\r\n function link($scope, $e) {\r\n $scope.fade = $scope.fade === 'true';\r\n $scope.speed = angular.isUndefined($scope.speed) ? undefined : parseInt($scope.speed, 10);\r\n var carousel = $e.find('.carousel-content');\r\n $scope.show = false;\r\n var DEFAULT_OPTIONS = {\r\n arrows: true,\r\n dots: false,\r\n autoplay: true,\r\n autoplaySpeed: 3000,\r\n pauseOnHover: true,\r\n rtl: TRPCONFIG.Rtl,\r\n slidesToShow: 4,\r\n slidesToScroll: 1,\r\n asNavFor: undefined,\r\n fade: undefined,\r\n speed: undefined,\r\n infinite: true,\r\n variableWidth: false,\r\n centerMode: false\r\n };\r\n // HEADSUP this has been set up to support 4 cards on TR\r\n var DEFAULT_RESPONSIVE = [\r\n {\r\n breakpoint: 1023,\r\n settings: { slidesToShow: 3, slidesToScroll: 3 }\r\n },\r\n {\r\n breakpoint: 769,\r\n settings: { slidesToShow: 2, slidesToScroll: 2 }\r\n }\r\n ];\r\n var options = _.assignWith(_.pick($scope, _.keys(DEFAULT_OPTIONS)), DEFAULT_OPTIONS, function (opt, def) { return _.isUndefined(opt) ? def : opt; });\r\n options.autoplay = false;\r\n options.responsive = !$scope.responsive && parseInt(options.slidesToShow, 10) === 4\r\n ? DEFAULT_RESPONSIVE\r\n : $scope.responsive;\r\n funcUtil.waitForValue(function () { return !_.isEmpty(carousel[0].children) && carousel.is(':visible'); })\r\n .then(function () { return $timeout(function () {\r\n $scope.show = true;\r\n carousel.slick(options);\r\n $scope.$on('$destroy', function () { return carousel.slick('unslick'); });\r\n }); });\r\n }\r\n }\r\n angular\r\n .module('TR')\r\n .directive('carousel', Carousel);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('checkbox', function (arrayUtil, $timeout) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n model: '=',\r\n name: '@?',\r\n val: '=',\r\n disabled: '=',\r\n onToggle: '&',\r\n onClick: '&',\r\n onInit: '&?',\r\n templateVersion: '=',\r\n mandatory: ' -1) {\r\n scope.model.splice(index, 1);\r\n }\r\n else {\r\n scope.model.push(scope.val);\r\n }\r\n }\r\n else {\r\n scope.model = !scope.model;\r\n }\r\n $timeout(scope.onClick); // `model` not updated in parent context without $timeout\r\n };\r\n scope.$watchCollection('model', function (model) {\r\n if (model !== undefined) {\r\n scope.checked = Array.isArray(model) ? indexOfVal(model) > -1 : model;\r\n scope.onToggle();\r\n }\r\n });\r\n if (scope.onInit) {\r\n scope.onInit();\r\n }\r\n function indexOfVal(array) {\r\n return arrayUtil.indexOf(array, function (i) {\r\n // Need angular.equals to compare { OptionId: \"4\":, Quantity: 1 } with { OptionId: \"4\":, Quantity: 1 }\r\n return scope.val === String(i) || angular.equals(scope.val, i);\r\n });\r\n }\r\n }\r\n };\r\n });\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var CheckboxAll = /** @class */ (function () {\r\n function CheckboxAll($scope) {\r\n this.$scope = $scope;\r\n }\r\n CheckboxAll.prototype.init = function (el) {\r\n var _this = this;\r\n var checkbox = el;\r\n // watch checkbox changes\r\n checkbox.change(function () {\r\n // empty the list\r\n _this.$scope.$apply(function () { return _this.list.splice(0, _this.list.length); });\r\n });\r\n // watch the list\r\n this.$scope.$watchCollection('ca.list', function (list) {\r\n if (list) {\r\n // if list has items then check and disable the checkbox\r\n var checked = (_this.list.length === 0);\r\n checkbox.prop('checked', checked);\r\n checkbox.prop('disabled', checked);\r\n }\r\n });\r\n };\r\n return CheckboxAll;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('checkboxAll', function () {\r\n return {\r\n restrict: 'A',\r\n controller: CheckboxAll,\r\n controllerAs: 'ca',\r\n bindToController: {\r\n list: '=checkboxAll'\r\n },\r\n link: function (scope, el, attrs, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var CheckboxArray = /** @class */ (function () {\r\n function CheckboxArray($scope) {\r\n this.$scope = $scope;\r\n }\r\n CheckboxArray.prototype.init = function (el) {\r\n var _this = this;\r\n var checkbox = el;\r\n // watch checkbox changes\r\n checkbox.change(function () {\r\n var index = _this.indexOfVal(_this.list, _this.value);\r\n // modify the list\r\n var action = index > -1\r\n ? function () { return _this.list.splice(index, 1); }\r\n : function () { return _this.list.push(_this.value); };\r\n _this.$scope.$apply(action());\r\n });\r\n // watch the list\r\n this.$scope.$watchCollection('ca.list', function (list) {\r\n // sync checkbox state to the list\r\n if (list) {\r\n var checked = _this.indexOfVal(list, _this.value) > -1;\r\n checkbox.prop('checked', checked);\r\n }\r\n });\r\n };\r\n CheckboxArray.prototype.indexOfVal = function (array, value) {\r\n return _.findIndex(array, function (i) {\r\n return value === String(i) || _.isEqual(value, i);\r\n });\r\n };\r\n return CheckboxArray;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('checkboxArray', function () {\r\n return {\r\n restrict: 'A',\r\n controller: CheckboxArray,\r\n controllerAs: 'ca',\r\n bindToController: {\r\n list: '=checkboxArray',\r\n value: '='\r\n },\r\n link: function (scope, el, attrs, controller) {\r\n controller.init(el);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var ClickPublisher = /** @class */ (function () {\r\n function ClickPublisher($scope, broker) {\r\n this.$scope = $scope;\r\n this.broker = broker;\r\n this.eventNamespace = 'clickpublisher';\r\n }\r\n ClickPublisher.prototype.init = function (element, eventName) {\r\n var _this = this;\r\n element.on(\"click.\" + this.eventNamespace, function (e) {\r\n e.preventDefault();\r\n _this.broker.publish(eventName);\r\n });\r\n this.$scope.$on('$destroy', function () {\r\n element.off(\"click.\" + _this.eventNamespace);\r\n });\r\n };\r\n return ClickPublisher;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('clickPublisher', function () {\r\n return {\r\n scope: {},\r\n restrict: 'A',\r\n controller: ClickPublisher,\r\n controllerAs: 'cp',\r\n bindToController: {\r\n toggleEvent: '='\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.init(el, attr['clickPublisher']);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('combobox', function ($document) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n priority: 1,\r\n scope: {\r\n term: '=',\r\n listData: '=',\r\n textProperty: '@',\r\n click: '&',\r\n placeholder: '@',\r\n triggerLabel: '@',\r\n triggerClick: '&',\r\n inputClass: '@',\r\n enableAutocomplete: '@',\r\n rootForm: '=',\r\n lookupEnabled: '='\r\n },\r\n transclude: true,\r\n controller: _controller,\r\n templateUrl: function (element, attr) {\r\n var base = 'partials';\r\n if (attr.templateVersion) {\r\n return base + \"/booking/template?name=Combobox&version=\" + attr.templateVersion;\r\n }\r\n return base + \"/home/directivetemplate?type=ComboBox\";\r\n },\r\n link: _linker\r\n };\r\n function _controller($scope, $element) {\r\n this.element = $element;\r\n }\r\n function _linker(scope, e) {\r\n scope.autocomplete = !TRPCONFIG.Domain.isAgentMode && scope.enableAutocomplete || 'off';\r\n function toggleMenu(val) {\r\n scope.$evalAsync(function () {\r\n scope.menu = val;\r\n });\r\n }\r\n e.on('focusin', function () {\r\n if (scope.listData && scope.listData.length > 0) {\r\n toggleMenu(true);\r\n }\r\n });\r\n function mousedown(e) {\r\n if ($(e.target).closest('.cmb-menu').length === 0) {\r\n toggleMenu(false);\r\n }\r\n }\r\n // This is needed to hide the menu on a sort of focus-out event\r\n // (basically if the user does not click on the menu-list this will hide it)\r\n $document.on('mousedown', mousedown);\r\n scope.$on('$destroy', function () {\r\n e.off('focusin');\r\n $document.off('mousedown', mousedown);\r\n });\r\n scope.clickHandler = function (d) {\r\n scope.click({ item: d });\r\n scope.loading = true;\r\n };\r\n scope.$watch('term', function () {\r\n scope.listData = [];\r\n });\r\n scope.triggerClickHandler = function () {\r\n scope.submitted = true;\r\n scope.triggerClick({ term: scope.term });\r\n e.find('input').focus();\r\n };\r\n // If the listData has changed (mainly due to a new filter being\r\n // applied) this will make it visible\r\n scope.$watch('listData', function (value) {\r\n scope.loading = false;\r\n if (!value || value.length === 0) {\r\n scope.menu = false;\r\n }\r\n else {\r\n scope.menu = true;\r\n }\r\n });\r\n }\r\n });\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var ContactFormPopUp = /** @class */ (function () {\r\n function ContactFormPopUp(accountMenuService, authService, resourceService) {\r\n var _this = this;\r\n this.accountMenuService = accountMenuService;\r\n this.authService = authService;\r\n this.resourceService = resourceService;\r\n this.popupSignIn = function (event) {\r\n event.preventDefault();\r\n _this.authService.bufferRoute(null);\r\n _this.accountMenuService.launchContactForm('contactformpopup');\r\n };\r\n }\r\n ContactFormPopUp.prototype.isUrl = function () {\r\n var regexp = new RegExp('^http'), test = regexp.test(this.iframeUrl);\r\n return test;\r\n };\r\n return ContactFormPopUp;\r\n }());\r\n TR.ContactFormPopUp = ContactFormPopUp;\r\n angular\r\n .module('TR')\r\n .directive('contactFormpopup', function () {\r\n return {\r\n bindToController: {\r\n iframeUrl: '@',\r\n buttonText: '@'\r\n },\r\n controller: ContactFormPopUp,\r\n controllerAs: 'cfpu',\r\n restrict: 'E',\r\n replace: true,\r\n template: \"\\n {{::cfpu.buttonText}}\",\r\n transclude: false\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n angular\r\n .module('TR')\r\n .component('crossSellAttractions', {\r\n bindings: {\r\n isHotelJourney: '<',\r\n hotel: ' 0) {\r\n _this.insuranceQuotes = insuranceQuotes;\r\n _this.hasPpPrices = !!insuranceQuotes[0].PerPersonPrice;\r\n if (insuranceQuotes && insurance.Options) {\r\n var key_1 = insuranceService\r\n .decomposeOptionId(insurance.Options[0].OptionId);\r\n _this.insurance = angular.copy(arrayUtil.first(_this.insuranceQuotes, function (i) {\r\n return i.SupplierId === key_1.supplierId\r\n && i.QuoteType.TypeId === key_1.typeId\r\n && i.QuoteType.SchemeId === key_1.schemeId\r\n && (i.QuoteType.RelationshipId === key_1.relationshipId\r\n || key_1.relationshipId === 0);\r\n }));\r\n }\r\n if (_this.noSuperQuotes) {\r\n _this._removeSuperQuotes();\r\n }\r\n }\r\n _this.singleVat = insuranceService\r\n .isVatMessageInclusive(_this.insuranceQuotes, false);\r\n _this.multipleVat = insuranceService\r\n .isVatMessageInclusive(_this.insuranceQuotes, true);\r\n _updateSubtitle();\r\n _this.insuranceAvailabilityBusy = false;\r\n }, function (error) {\r\n _this.insuranceAvailabilityBusy = false;\r\n _this.insuranceQuotes = [];\r\n });\r\n };\r\n if (_this.isHotelJourney) {\r\n basketStore.hotel(basketId)\r\n .then(function (hotel) {\r\n _this.dates = {\r\n arrivalDate: _.get(hotel, 'Details.Itinerary.CheckInDate'),\r\n departureDate: _.get(hotel, 'Details.Itinerary.CheckOutDate')\r\n };\r\n getInsurance_1(null, {\r\n airport: _.get(hotel, 'Details.LinkedAirports[0]'),\r\n dates: _this.dates\r\n });\r\n });\r\n }\r\n if (insuranceSearchId || !_this.isHotelJourney) {\r\n getInsurance_1(insuranceSearchId, {});\r\n }\r\n //get the document paths\r\n _this.documentPaths = insuranceService.getDocumentPaths();\r\n $scope.$watch('ins.insurance.QuoteId', function (val, old) {\r\n if (val == null || old === undefined) {\r\n if (val || val === -1) {\r\n _this.onUpdate({ value: true, type: 'insurance' });\r\n }\r\n ;\r\n return;\r\n }\r\n _updateSubtitle();\r\n if (val !== _this.noneInsurance.QuoteId) {\r\n var quote_2 = arrayUtil.first(_this.insuranceQuotes, function (i) {\r\n return i.QuoteId === val;\r\n });\r\n //we need to re-check the trip here in case we have just generated the search id\r\n tripService.getTrip(tripId).then(function (t) {\r\n insuranceSearchId = t.InsuranceRequest.AvailabilitySearchId;\r\n _this.onUpdate({ value: false, type: 'insurance' });\r\n return basketService.selectInsurance(quote_2, insuranceSearchId, basketId)\r\n .then(function () {\r\n basketService.updateBasket();\r\n _this.onUpdate({ value: true, type: 'insurance' });\r\n });\r\n });\r\n }\r\n else {\r\n _this.onUpdate({ value: false, type: 'insurance' });\r\n basketStore.removeInsurance(basketId).then(function () {\r\n basketService.updateBasket();\r\n _this.onUpdate({ value: true, type: 'insurance' });\r\n });\r\n }\r\n });\r\n }\r\n }).then(null, basketService.restartHolidayWorkflow);\r\n _this.viewInfo = function (quoteId, $event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n _this.currentInfoId = quoteId;\r\n };\r\n }, basketService.bookingAlreadyDone(\"insurance: '\" + $routeParams.tripId + \"'\"));\r\n }\r\n CrossSellInsurance.prototype._removeSuperQuotes = function () {\r\n this.insuranceQuotes = [_.find(this.insuranceQuotes, ['QuoteType.SchemeId', 1])];\r\n };\r\n return CrossSellInsurance;\r\n }());\r\n angular\r\n .module('TR')\r\n .component('crossSellInsurance', {\r\n bindings: {\r\n isHotelJourney: '<',\r\n onUpdate: '&'\r\n },\r\n controller: CrossSellInsurance,\r\n controllerAs: 'ins',\r\n templateUrl: 'partials/home/directivetemplate?type=CrossSellInsurance'\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var CrossSellParking = /** @class */ (function () {\r\n function CrossSellParking($q, $routeParams, $scope, basketService, basketStore, flightsTerminalService, resourceService, tripService) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.flightsTerminalService = flightsTerminalService;\r\n this.resourceService = resourceService;\r\n this.tripService = tripService;\r\n this.isBusyAvailability = true;\r\n this.items = [];\r\n this.noneSelectionId = { CarParkCode: '-1', SupplierId: -1 };\r\n this.selectedItemId = this.noneSelectionId;\r\n this.tripId = $routeParams.tripId;\r\n tripService.getTrip(this.tripId)\r\n .then(function (trip) {\r\n _this.basketId = trip.BasketId;\r\n var isOneWay = trip.FlightsRequest && trip.FlightsRequest.OneWayOnly;\r\n if (isOneWay) {\r\n _this.show = false;\r\n return;\r\n }\r\n if (trip.ParkingRequest) {\r\n _this.searchId = trip.ParkingRequest.AvailabilitySearchId;\r\n }\r\n $q.all([\r\n basketStore.parking(_this.basketId),\r\n _this.retrieveQuotes(_this.searchId, _this.basketId, _this.tripId),\r\n basketStore.flight(trip.BasketId)\r\n ]).then(function (results) {\r\n var selected = results[0];\r\n _this.items = results[1];\r\n var leg = results[2].Details.Itinerary.Legs[0];\r\n _this.airportTitle = leg.DepartureAirport.Title;\r\n flightsTerminalService.getTerminalForFlight(leg.DepartureAirport.Code, leg.Segments[0].FlightNumber, leg.DepartureDate).then(function (terminal) {\r\n if (terminal) {\r\n _this.terminalTitle = terminal.Title;\r\n }\r\n });\r\n //find the parking item from our quotes so that we can select it\r\n if (selected) {\r\n var item = _this.findParkingItem(_this.items, selected.Details.Quote.QuoteId);\r\n _this.selectedItemId = item.QuoteId;\r\n }\r\n if (!_this.searchId) {\r\n tripService.getTrip(_this.tripId)\r\n .then(function (trip) {\r\n return _this.searchId = trip && trip.ParkingRequest\r\n && trip.ParkingRequest.AvailabilitySearchId;\r\n });\r\n }\r\n $scope.$watch('$ctrl.selectedItemId', function (n, o) {\r\n if (n && !angular.equals(n, o)) {\r\n _this.selectParking();\r\n }\r\n });\r\n }).finally(function () { return _this.isBusyAvailability = false; });\r\n }, this.basketService.bookingAlreadyDone(\"crossSellParking: '\" + this.tripId + \"'\"));\r\n }\r\n CrossSellParking.prototype.retrieveQuotes = function (searchId, basketId, tripId) {\r\n var _this = this;\r\n return this.basketService.getParkingQuotes(searchId, basketId, tripId)\r\n .then(function (quotes) {\r\n var bestQuotes = [];\r\n bestQuotes = _this.addBestQuote(bestQuotes, quotes, false, false); // off airport\r\n bestQuotes = _this.addBestQuote(bestQuotes, quotes, false, true); // on airport\r\n bestQuotes = _this.addBestQuote(bestQuotes, quotes, true, null); // meet and greet\r\n return bestQuotes;\r\n });\r\n };\r\n CrossSellParking.prototype.findParkingItem = function (list, quoteId) {\r\n return _.find(list, function (i) { return i.QuoteId.CarParkCode === quoteId.CarParkCode; });\r\n };\r\n CrossSellParking.prototype.addBestQuote = function (bestQuotes, quotes, meetAndGreet, onAirport) {\r\n var best = _.maxBy(_.filter(quotes, function (quote) {\r\n return quote.Facilities.MeetAndGreet === meetAndGreet &&\r\n (onAirport == null || quote.Facilities.OnAirport === onAirport);\r\n }), 'Ranking');\r\n if (best) {\r\n return bestQuotes.concat([best]);\r\n }\r\n return bestQuotes.slice();\r\n };\r\n CrossSellParking.prototype.selectParking = function () {\r\n var _this = this;\r\n this.isBusySelection = true;\r\n if (this.selectedItemId === this.noneSelectionId) {\r\n this.removeParking().finally(function () { return _this.isBusySelection = false; }); //remove it\r\n }\r\n else {\r\n this.basketService.selectParking(this.selectedItemId, this.searchId, this.basketId)\r\n .then(angular.noop, function () { return _this.selectedItemId = _this.noneSelectionId; })\r\n .finally(function () { return _this.isBusySelection = false; });\r\n }\r\n };\r\n CrossSellParking.prototype.removeParking = function () {\r\n var _this = this;\r\n return this.basketStore.removeParking(this.basketId)\r\n .then(function () { return _this.basketService.updateBasket(); });\r\n };\r\n CrossSellParking.prototype.getFrequencyText = function (frequencyInfo) {\r\n var description = '';\r\n if (frequencyInfo && (frequencyInfo.Duration || frequencyInfo.Frequency)) {\r\n if (frequencyInfo.Duration === '0') {\r\n description = this.resourceService.get('OPTIONSPARKINGDURATIONONAIRPORT');\r\n }\r\n else {\r\n description = String.format(this.resourceService.get('OPTIONSPARKINGDURATIONTOAIRPORT'), frequencyInfo.Duration);\r\n }\r\n if (frequencyInfo.Frequency) {\r\n var frequencyText = String.format(this.resourceService.get('OPTIONSPARKINGFREQUENCY'), frequencyInfo.Frequency);\r\n if (frequencyInfo.Duration !== '0') {\r\n description = String.format('{0} ({1})', description, frequencyText);\r\n }\r\n else if (!frequencyInfo.Duration) {\r\n description = String.format('{0} {1}', description, frequencyText);\r\n }\r\n }\r\n }\r\n return description;\r\n };\r\n return CrossSellParking;\r\n }());\r\n angular\r\n .module('TR')\r\n .component('crossSellParking', {\r\n bindings: {\r\n show: '='\r\n },\r\n controller: CrossSellParking,\r\n templateUrl: 'partials/home/directivetemplate?type=CrossSellParking'\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var CrossSellTransfers = /** @class */ (function () {\r\n function CrossSellTransfers($q, $routeParams, $scope, analytics, basketService, basketStore, hotelFromSession, broker, customCurrencyFilter, resourceService, tripService, mandatoryTransferService, hotelRoomService, brandedFareTypesService) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$routeParams = $routeParams;\r\n this.$scope = $scope;\r\n this.analytics = analytics;\r\n this.basketService = basketService;\r\n this.basketStore = basketStore;\r\n this.hotelFromSession = hotelFromSession;\r\n this.broker = broker;\r\n this.customCurrencyFilter = customCurrencyFilter;\r\n this.resourceService = resourceService;\r\n this.tripService = tripService;\r\n this.mandatoryTransferService = mandatoryTransferService;\r\n this.hotelRoomService = hotelRoomService;\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.showNoTransferOption = true;\r\n this.showMandatoryExtrasTransfer = false;\r\n this.showInitialMessage = false;\r\n this.transfersAvailabilityBusy = true;\r\n this.transfersSelectionBusy = true;\r\n this.qtys = sessionStorage.getItem('priceQtys');\r\n this.trip = this.tripService.getTrip(this.$routeParams.tripId).then(function (t) {\r\n return t;\r\n });\r\n this.total = 0;\r\n this.mandatoryExtrasEnabled = false;\r\n this.isMandatoryExtra = false;\r\n this.defaultMandatoryTransfer = false;\r\n this.noneTransfer = { Details: { TransferId: '-1' } };\r\n this.emptyTransfer = { Details: { TransferId: null } };\r\n this.mandatoryExtrasEnabled = TRPCONFIG.Domain.MandatoryExtrasEnabled;\r\n this.mandatoryTransfer = [];\r\n if (this.isHotelJourney) {\r\n this.showInitialMessage = true;\r\n this.transfersAvailabilityBusy = false;\r\n }\r\n broker.subscribe('Transfers', 'ProductHotelReceivedFromBasket', function (e) {\r\n _this.basketId = e.data.basketId;\r\n _this.hotelProductId = e.data.productId;\r\n });\r\n $scope.$watch('tran.hotelExtrasSelectedTransfer', function (val) {\r\n if (val && _this.hotelProductId && _this.basketId) {\r\n _this.OptionId = _this.mandatoryTransferService\r\n .generateOptionId(undefined, val.HotelExtraId, val.HotelExtraOptionId);\r\n var type_1 = 2;\r\n basketStore.addOption(type_1, _this.hotelProductId, _this.OptionId, _this.basketId)\r\n .then(function () {\r\n var hemt = _this.hotelExtrasMandatoryTransfers;\r\n var hest = _this.hotelExtrasSelectedTransfer;\r\n var options = _this._getExpiredOptions(hemt, hest);\r\n basketStore.removeOptions(type_1, _this.hotelProductId, options, _this.basketId).then(function () {\r\n basketService.updateBasket();\r\n });\r\n });\r\n }\r\n });\r\n broker.subscribe('Transfers', 'transferRequestFailed', function () {\r\n _this.showDetailsError = true;\r\n if (!_this.isTransferMandatory) {\r\n _this.transfer = angular.copy(_this.noneTransfer);\r\n }\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('Transfers');\r\n });\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n _this.basketId = trip.BasketId;\r\n var tripId = trip.TripId;\r\n var domain = TRPCONFIG.Domain;\r\n var transferSearchId = _.get(trip, 'TransfersRequest.AvailabilitySearchId');\r\n $q.all([\r\n basketStore.transfer(_this.basketId, $routeParams.productId),\r\n basketStore.hotel(_this.basketId, $routeParams.productId),\r\n basketStore.all(_this.basketId, $routeParams.productId)\r\n ]).then(function (results) {\r\n _this.defaultMandatoryTransfer = domain.IncludeMandatoryExtrasBookedItem &&\r\n domain.IncludeMandatoryExtrasInHolidaysPrice;\r\n var includedExtras = JSON.parse(sessionStorage.getItem('IncludedExtras') || '{}');\r\n _this.selectedTransfer = includedExtras;\r\n _this.isMaldives(results);\r\n var transfer;\r\n if (_this.showMandatoryExtrasTransfer && !results[0] && results[2].h.CostBreakdown) {\r\n var extra_1;\r\n results[2].h.CostBreakdown.forEach(function (cb) {\r\n extra_1 = cb.ExtraReference ? cb.ExtraReference : '';\r\n });\r\n var id = extra_1 ? extra_1.split('|')[extra_1.split('|').length - 1] : '-1';\r\n transfer = { Details: { TransferId: id } };\r\n }\r\n else {\r\n transfer = results[0] || _this.noneTransfer;\r\n }\r\n $scope.$emit('sendTransferSelection', transfer);\r\n _this.transfer = angular.copy(transfer);\r\n var hotel = results[1];\r\n if (hotel.Details.AvailableExtrasPerRoom[0] &&\r\n hotel.Details.AvailableExtrasPerRoom[0].length > 0) {\r\n _this.maldivesTransfers = hotel.Details.AvailableExtrasPerRoom[0][0];\r\n }\r\n if (_this.mandatoryExtrasEnabled && hotel) {\r\n _this.hotelFromSession.getHotel(hotel.AvailabilitySearchId, hotel.Details.Id, tripId)\r\n .then(function (res) {\r\n _this.hotelData = angular.copy(res);\r\n if (_this.hotelData) {\r\n _this._initMandatoryTransfers(hotel, trip);\r\n }\r\n });\r\n }\r\n _this.transfersEnabled = _([_this.tripService.tripTypes.Holiday,\r\n _this.tripService.tripTypes.Hotel])\r\n .includes(trip.TripType) && hotel && !hotel.isVilla;\r\n var getTransfers = function (transferSearchId, params) {\r\n basketService.getTransfers(transferSearchId, _this.basketId, tripId, params).then(function (r) {\r\n if (r && r.length > 0 && _this.isTransferMandatory) {\r\n _this.transfer.Details.TransferId = r[0].TransferId;\r\n }\r\n _this.setResults(r, hotel);\r\n });\r\n };\r\n if (_this.isHotelJourney) {\r\n broker.subscribe('Transfers', 'flightDataUpdated', function (e) {\r\n _this.transfersAvailabilityBusy = true;\r\n _this.transfer = angular.copy(_this.noneTransfer);\r\n getTransfers(null, e && e.data);\r\n });\r\n }\r\n if (transferSearchId || !_this.isHotelJourney) {\r\n getTransfers(transferSearchId, {});\r\n }\r\n if (hotel && trip.FlightsRequest && trip.FlightsRequest.Destination) {\r\n _this._checkIstransferMandatory(trip.FlightsRequest);\r\n }\r\n _this._setTransfersWatcher(trip, tripId, transferSearchId);\r\n }).then(angular.noop, basketService.restartHolidayWorkflow);\r\n }, basketService.bookingAlreadyDone);\r\n }\r\n CrossSellTransfers.prototype._getExpiredOptions = function (transfers, currentTransfer) {\r\n var _this = this;\r\n var expiredOptionsIds = Array();\r\n if (currentTransfer && transfers.length && transfers.length > 0) {\r\n var expiredTransfers = transfers.filter(function (t) {\r\n return t.HotelExtraId === currentTransfer.HotelExtraId\r\n && t.HotelExtraOptionId !== currentTransfer.HotelExtraOptionId;\r\n });\r\n expiredTransfers.forEach(function (et) {\r\n var OptionId = _this.mandatoryTransferService\r\n .generateOptionId(undefined, et.HotelExtraId, et.HotelExtraOptionId);\r\n expiredOptionsIds.push({ OptionId: OptionId });\r\n });\r\n }\r\n return expiredOptionsIds;\r\n };\r\n // This function checks for whether a destination requires a transfer.\r\n // e.g. the Maldives is required to select a transfer so the 'no transfer' option is hidden.\r\n CrossSellTransfers.prototype.isMaldives = function (results) {\r\n var _this = this;\r\n var MandatroyTransferAirportCodes = TRPCONFIG.Domain2.MandatoryTransferAirportCodes;\r\n var MandatoryTransferEnabled = TRPCONFIG.Domain2.MandatoryTransferEnabled;\r\n var flight = results[2].f;\r\n var airportCodes = [];\r\n var itinerary = flight.Details.Itinerary;\r\n var legs = itinerary.Legs;\r\n legs.map(function (leg) {\r\n airportCodes.push(leg.ArrivalAirport.Code);\r\n });\r\n var OutboundAirportCode = airportCodes[0];\r\n var showNoTransferOption = this.showNoTransferOption;\r\n MandatroyTransferAirportCodes.map(function (code) {\r\n if (code === OutboundAirportCode) {\r\n showNoTransferOption = false;\r\n }\r\n });\r\n MandatoryTransferEnabled.map(function (code) {\r\n if (code === OutboundAirportCode) {\r\n _this.showMandatoryExtrasTransfer = true;\r\n }\r\n });\r\n this.showNoTransferOption = showNoTransferOption;\r\n };\r\n CrossSellTransfers.prototype.setResults = function (r, hotel) {\r\n if (this.showMandatoryExtrasTransfer && hotel.Details.AvailableExtrasPerRoom[0] &&\r\n hotel.Details.AvailableExtrasPerRoom[0].length > 0) {\r\n var CombinedRoomsCost_1 = {};\r\n var extras = hotel.Details.AvailableExtrasPerRoom;\r\n this.transfers = _.sortBy(hotel.Details.AvailableExtrasPerRoom[0][0].Options, 'GrossCost');\r\n if (extras.length > 1) {\r\n for (var j = 0; j < this.transfers.length; j++) {\r\n for (var i = 0; i < extras.length; i++) {\r\n if (CombinedRoomsCost_1[extras[i][0].Options[j].HotelExtraOptionId]) {\r\n var cost = CombinedRoomsCost_1[extras[i][0].Options[j].HotelExtraOptionId];\r\n CombinedRoomsCost_1[extras[i][0].Options[j].HotelExtraOptionId] =\r\n cost + extras[i][0].Options[j].GrossCost;\r\n }\r\n else {\r\n CombinedRoomsCost_1[extras[i][0].Options[j].HotelExtraOptionId] =\r\n extras[i][0].Options[j].GrossCost;\r\n }\r\n }\r\n }\r\n extras[0][0].Options.forEach(function (option) {\r\n option.GrossCost = CombinedRoomsCost_1[option.HotelExtraOptionId];\r\n });\r\n this.transfers = _.sortBy(extras[0][0].Options, 'GrossCost');\r\n }\r\n }\r\n else {\r\n if (r != null) {\r\n this.transfers = _.sortBy(r, 'TotalPrice');\r\n this._updateSubtitle();\r\n //so that we can test both versions of the page\r\n // we need to create a secondary limited list of transfers to use on the new design\r\n this.rankedResults = _.sortBy(_.take(r, 3), 'TotalPrice');\r\n this.isAvailableTransfer = (this.rankedResults && this.rankedResults.length > 0) ||\r\n this.showInitialMessage;\r\n }\r\n }\r\n if (hotel != null) {\r\n var hotelDetails = _.get(hotel, 'Details');\r\n var bookedItems = _.get(hotelDetails, 'BookedItems');\r\n var mandatoryTransfers = _.get(bookedItems[0], 'mandatoryTransfers');\r\n if (mandatoryTransfers) {\r\n this.isAvailableTransfer = true;\r\n }\r\n }\r\n if (TRPCONFIG.Domain.EnforceTransferOptionSelection && this.isNoneTransfer(this.transfer)) {\r\n this.transfer = angular.copy(this.emptyTransfer);\r\n }\r\n this.transfersAvailabilityBusy = false;\r\n //tracking\r\n if (r != null && r.length > 0) {\r\n this._trackingTransferSelection(this.transfer.Details.TransferId);\r\n }\r\n else {\r\n this.analytics.track('mixpanel', 'OptionsTransferNoAvailability');\r\n }\r\n };\r\n CrossSellTransfers.prototype.isNoneTransfer = function (transfer) {\r\n return angular.equals(transfer, this.noneTransfer);\r\n };\r\n CrossSellTransfers.prototype._setMandatoryTransferWatcher = function (trip, hotel) {\r\n var _this = this;\r\n if (this.tripService.supportsTransfers(trip)) {\r\n this.$scope.$watchCollection('tran.mandatoryTransfer', function () {\r\n var transfersWrapper = { transfers: _this.mandatoryTransfer };\r\n var options = _this.mandatoryTransferService\r\n .generateOptionsForMultiRooms(transfersWrapper, _this.roomsWithMandatoryTransfer);\r\n _this._changeMandatoryTransfer(options, hotel);\r\n });\r\n }\r\n };\r\n CrossSellTransfers.prototype._setTransfersWatcher = function (trip, tripId, transferSearchId) {\r\n var _this = this;\r\n if (this.tripService.supportsTransfers(trip)) {\r\n this.$scope.$watch('tran.transfer.Details.TransferId', function (val) {\r\n var isObject = typeof val === 'object' && val !== null;\r\n if (TRPCONFIG.Domain.EnforceTransferOptionSelection) {\r\n if (_this.transfers && _this.transfers.length > 0) {\r\n _this.$scope.$emit('sendTransferSelection', val);\r\n var transferSelected_1 = val;\r\n var transferType = void 0;\r\n if (transferSelected_1) {\r\n if (isObject) {\r\n transferType = _this.transfers.filter(function (trans) { return trans.TransferId.TransferCode === transferSelected_1.TransferCode; });\r\n }\r\n else {\r\n if (val === -1) {\r\n transferType = _this.transfers.filter(function (trans) { return trans.TransferId.TransferCode === transferSelected_1.TransferCode; });\r\n }\r\n else if (val !== -1) {\r\n transferType = _this.transfers.filter(function (trans) { return trans.HotelExtraOptionId === transferSelected_1; });\r\n }\r\n }\r\n }\r\n else {\r\n transferType = [];\r\n }\r\n _this.selectedTransfer.ExtraOptionId = transferType.length > 0 &&\r\n transferType[0].HotelExtraOptionId ? transferType[0].HotelExtraOptionId : null;\r\n _this.selectedTransfer.ClientPrice = transferType.length > 0 &&\r\n transferType[0].GrossCost ? transferType[0].GrossCost : null;\r\n sessionStorage.setItem('Transfer', JSON.stringify(transferType[0] ? transferType[0] : null));\r\n }\r\n else {\r\n _this.$scope.$emit('sendTransferSelection', _this.noneTransfer);\r\n }\r\n }\r\n if (val == null) {\r\n return;\r\n }\r\n _this.$scope.$emit('flash:hide');\r\n _this.transfersSelectionBusy = true;\r\n if (_this.transfers && _this.transfers.length > 0) {\r\n _this._trackingTransferSelection(val);\r\n }\r\n _this._updateSubtitle();\r\n if (val !== _this.noneTransfer.Details.TransferId) {\r\n //we need to re-check the trip here in case we have just generated the search id\r\n _this.tripService.getTrip(tripId).then(function (t) {\r\n transferSearchId = _.get(t, 'TransfersRequest.AvailabilitySearchId');\r\n if (_this.showMandatoryExtrasTransfer && _this.maldivesTransfers &&\r\n _this.maldivesTransfers.Options) {\r\n //Expected in this format: HotelExtra|||\r\n val = \"HotelExtra|0|\" + _this.maldivesTransfers.HotelExtraId + \"|\" + val;\r\n }\r\n _this.basketService.selectTransfer(val, transferSearchId, _this.basketId, tripId)\r\n .then(function () { return __awaiter(_this, void 0, void 0, function () {\r\n var _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n this.basketService.updateBasket();\r\n this.showDetailsError = false;\r\n this.transfersSelectionBusy = false;\r\n if (!(sessionStorage.getItem('storeSelectedFlight') !== null ||\r\n sessionStorage.getItem('DefaultFlight') !== null && isObject)) return [3 /*break*/, 2];\r\n _a = TRPCONFIG.Domain;\r\n return [4 /*yield*/, this.brandedFareTypesService\r\n .getCancellationCharges(this.basketId)];\r\n case 1:\r\n _a.BrandedFareCancellations =\r\n _b.sent();\r\n sessionStorage.setItem('BrandedFareCancellations', JSON.stringify(TRPCONFIG.Domain.BrandedFareCancellations));\r\n _b.label = 2;\r\n case 2: return [2 /*return*/];\r\n }\r\n });\r\n }); });\r\n });\r\n }\r\n else {\r\n _this.basketStore.removeTransfer(_this.basketId).then(_this.basketService.updateBasket)\r\n .then(function () { return __awaiter(_this, void 0, void 0, function () {\r\n var _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!(sessionStorage.getItem('storeSelectedFlight') !== null ||\r\n sessionStorage.getItem('DefaultFlight') !== null && isObject)) return [3 /*break*/, 2];\r\n _a = TRPCONFIG.Domain;\r\n return [4 /*yield*/, this.brandedFareTypesService\r\n .getCancellationCharges(this.basketId)];\r\n case 1:\r\n _a.BrandedFareCancellations =\r\n _b.sent();\r\n sessionStorage.setItem('BrandedFareCancellations', JSON.stringify(TRPCONFIG.Domain.BrandedFareCancellations));\r\n _b.label = 2;\r\n case 2: return [2 /*return*/];\r\n }\r\n });\r\n }); });\r\n _this.transfersSelectionBusy = false;\r\n }\r\n });\r\n this.nullTransferText = this.resourceService.getDeferred('NOTRANSFERREQUIRED');\r\n }\r\n };\r\n CrossSellTransfers.prototype._trackingTransferSelection = function (transferId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n var min, max, data, index_1, quote, transferPrice, trip, selectedFlight, flightFare, fare, legs, hotel, baseCost, qtys, totalFares, totalTaxes, packageCost, accruedMiles;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (this.showMandatoryExtrasTransfer && this.transfers && this.transfers.length > 0 &&\r\n this.transfers[0].GrossCost) {\r\n min = _.first(this.transfers).GrossCost;\r\n max = _.last(this.transfers).GrossCost;\r\n }\r\n else {\r\n min = _.first(this.transfers).TotalPrice;\r\n max = _.last(this.transfers).TotalPrice;\r\n }\r\n data = {\r\n Title: null,\r\n CostPP: null,\r\n CostTotal: null,\r\n OptionIndex: null,\r\n TotalOptions: this.transfers.length + 1,\r\n MinOptionCostTotal: min,\r\n MaxOptionCostTotal: max,\r\n HotelAndFlightCost: null,\r\n SupplierName: null\r\n };\r\n TRPCONFIG.Domain.TransferPrice = 0;\r\n if (transferId == null) {\r\n data.Title = 'Nothing selected';\r\n TRPCONFIG.Domain.TransferPrice = 0;\r\n }\r\n else if (transferId !== '-1') {\r\n index_1 = 0;\r\n quote = _.find(this.transfers, function (t, i) {\r\n index_1 = i;\r\n return angular.equals(t.TransferId, transferId);\r\n });\r\n if (quote && quote.Type) {\r\n data.Title = quote.Type;\r\n data.CostPP = quote.PerPersonPrice;\r\n data.CostTotal = quote.TotalPrice;\r\n data.OptionIndex = index_1 + 1; //0-based index will confuse end user\r\n data.SupplierName = quote.SupplierName;\r\n transferPrice = data.CostTotal;\r\n TRPCONFIG.Domain.TransferPrice = transferPrice;\r\n }\r\n }\r\n else if (transferId === '-1') {\r\n data.Title = 'No Transfer';\r\n TRPCONFIG.Domain.TransferPrice = 0;\r\n }\r\n this.$q.all([\r\n this.basketStore.hotelCost(this.basketId),\r\n this.basketStore.flightCost(this.basketId)\r\n ]).then(function (res) {\r\n data.HotelAndFlightCost += res[0] + res[1];\r\n _this.analytics.track('mixpanel', 'OptionsTransferSelected', data);\r\n });\r\n return [4 /*yield*/, this.trip];\r\n case 1:\r\n trip = _a.sent();\r\n selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\r\n flightFare = JSON.parse(sessionStorage.getItem('flightFare') || ' {}');\r\n fare = TRPCONFIG.Domain.FlightFare || flightFare;\r\n legs = fare.Legs || selectedFlight.Legs;\r\n hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\r\n baseCost = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\r\n qtys = JSON.parse(this.qtys);\r\n totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\r\n totalTaxes = this.brandedFareTypesService.calculateTotalTaxes(fare, qtys);\r\n packageCost = baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\r\n if (!packageCost) return [3 /*break*/, 3];\r\n return [4 /*yield*/, this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost)];\r\n case 2:\r\n accruedMiles = _a.sent();\r\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n CrossSellTransfers.prototype._updateSubtitle = function () {\r\n var _this = this;\r\n if (this.transfers && this.transfer.Details.TransferId) {\r\n var transferQuote = _.find(this.transfers, function (t) {\r\n return angular.equals(t.TransferId, _this.transfer.Details.TransferId);\r\n });\r\n this.total = transferQuote ? transferQuote.TotalPrice : 0;\r\n this.transferQuoteDescription = transferQuote\r\n ? transferQuote.Quantity + \" x \" + transferQuote.Type\r\n : '';\r\n this.transferQuoteDescriptionWithPrice = transferQuote\r\n ? this.transferQuoteDescription + \" (\" + this.customCurrencyFilter(this.total) + \")\"\r\n : '';\r\n }\r\n };\r\n CrossSellTransfers.prototype._checkIstransferMandatory = function (flight) {\r\n var destinationAiports = flight.DestinationAirports ? flight.DestinationAirports\r\n : flight.Destination.DestinationAirports.split(',');\r\n this.isTransferMandatory = destinationAiports.includes.apply(destinationAiports, TRPCONFIG.Domain.IsTransferMandatory);\r\n };\r\n CrossSellTransfers.prototype._initMandatoryTransfers = function (hotel, trip) {\r\n this.roomsWithMandatoryTransfer = this.mandatoryTransferService\r\n .getHolidayRoomsWithTransfers(hotel.Details) || [];\r\n this.roomsWithMandatoryTransfer.length > 0 ? this.transfersSelectionBusy = false : null;\r\n this.bookedMandatoryOptions = [];\r\n for (var i = 0; i < this.roomsWithMandatoryTransfer.length; i++) {\r\n this.bookedMandatoryOptions = this.mandatoryTransferService\r\n .getSelectedTransfers(hotel, this.roomsWithMandatoryTransfer);\r\n this.mandatoryTransfer[i] = this.bookedMandatoryOptions[i]\r\n || this.roomsWithMandatoryTransfer[i].mandatoryTransfers[0];\r\n }\r\n if (this.mandatoryTransfer.length > 0 || this.roomsWithMandatoryTransfer.length > 0) {\r\n this.isAvailableTransfer = true;\r\n }\r\n if (this.bookedMandatoryOptions && this.bookedMandatoryOptions.length > 0) {\r\n this.bookedMandatoryOptions = this.mandatoryTransferService\r\n .generateOptionsForMultiRooms({ transfers: this.bookedMandatoryOptions }, this.roomsWithMandatoryTransfer);\r\n }\r\n };\r\n CrossSellTransfers.prototype._changeMandatoryTransfer = function (options, hotel) {\r\n var _this = this;\r\n if (options.length > 0 && JSON.stringify(this.bookedMandatoryOptions) !== JSON.stringify(options)) {\r\n var productType_1 = this.basketStore.productType.Transfer;\r\n var productId_1 = hotel.ProductId;\r\n this.basketStore.removeOptions(productType_1, productId_1, this.bookedMandatoryOptions, this.basketId)\r\n .then(function () {\r\n _this.bookedMandatoryOptions = options;\r\n _this.basketStore.addOptions(productType_1, productId_1, options, _this.basketId)\r\n .then(function () { return _this.basketService.updateBasket(); });\r\n });\r\n }\r\n };\r\n return CrossSellTransfers;\r\n }());\r\n angular\r\n .module('TR')\r\n .component('crossSellTransfers', {\r\n bindings: {\r\n isHotelJourney: '<',\r\n isTransferMandatory: '=?',\r\n isAvailableTransfer: '=?',\r\n isMandatoryExtra: '@'\r\n },\r\n controller: CrossSellTransfers,\r\n controllerAs: 'tran',\r\n templateUrl: 'partials/home/directivetemplate?type=CrossSellTransfers'\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('datePicker', datepicker);\r\n function datepicker(resourceService, $timeout, dateUtil) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: function (element, attr) {\r\n var base = 'partials';\r\n if (attr.templateVersion) {\r\n return base + \"/booking/template?name=DatePicker&version=\" + attr.templateVersion;\r\n }\r\n return base + \"/home/directivetemplate?type=DatePicker\";\r\n },\r\n scope: {\r\n select: '&',\r\n minDate: '=',\r\n maxDate: '=',\r\n defaultTime: '=',\r\n currentDate: '=',\r\n dates: '=',\r\n showApplyButton: '=',\r\n showTime: '=',\r\n isTimeApprovedByCustomer: '=?',\r\n requiresTimeApproval: '=',\r\n timeLabelKey: '@',\r\n timeErrorMsg: '@',\r\n placeholder: '@',\r\n noInitialDate: '@',\r\n numberOfMonths: '@',\r\n datepickerClass: '=',\r\n focusTracker: '@',\r\n isDisabled: '=?',\r\n isDisabledPlaceholder: '@',\r\n isRequired: '=?',\r\n isReadonly: '=?'\r\n },\r\n link: _linker,\r\n controller: _controller,\r\n transclude: true\r\n };\r\n function _controller($scope, $element) {\r\n this.dateEl = $element.find('.datepicker-wrapper');\r\n }\r\n function _linker(scope, el, attr) {\r\n var selectedDate = parseCurrentDate();\r\n var dateEl = el.find('.datepicker-wrapper');\r\n if (TRPCONFIG.IsTouchDevice) {\r\n dateEl.attr('readonly', 'true');\r\n }\r\n // Used as `ng-model` primarily to enable `ng-invalid` etc. on field\r\n scope.fieldVals = {\r\n date: {}\r\n };\r\n // Re-wire 'focus-tracker' attr to input field\r\n if (scope.focusTracker && scope.$parent.ft) {\r\n scope.$parent.ft.init(dateEl);\r\n }\r\n // `required` attr has no value\r\n if (attr.hasOwnProperty('required')) {\r\n scope.isRequired = true;\r\n }\r\n scope.timeValue = {};\r\n var dp = dateEl.datepicker({\r\n numberOfMonths: parseInt(scope.numberOfMonths) || 1,\r\n dateFormat: 'dd-M-yy',\r\n firstDay: 1,\r\n minDate: parseMinDate(scope.minDate),\r\n maxDate: dateUtil.parseDate(scope.maxDate),\r\n beforeShowDay: beforeShowDay,\r\n // http://www.objectpartners.com/2012/06/18/jquery-ui-datepicker-ie-focus-fix/\r\n // http://bugs.jqueryui.com/ticket/9125 is not important enough apparently\r\n lastDisplay: null,\r\n onSelect: function () {\r\n selectDate();\r\n this.lastDisplay = new Date().getTime();\r\n this.blur();\r\n },\r\n onClose: function () {\r\n // This deals with anything typed into the field that changed the value\r\n var dpDate = dp.datepicker('getDate') || '';\r\n var expected = selectedDate || '';\r\n if (dpDate.toString() !== expected.toString()) {\r\n selectDate();\r\n }\r\n else {\r\n syncField();\r\n }\r\n },\r\n beforeShow: function () {\r\n return !this.lastDisplay || (new Date().getTime()) - this.lastDisplay > 100;\r\n },\r\n prevText: '',\r\n nextText: '',\r\n isRTL: TRPCONFIG.Rtl\r\n });\r\n function selectDate() {\r\n selectedDate = dp.datepicker('getDate');\r\n // $apply avoiding $digest errors\r\n scope.$evalAsync(function () {\r\n if (selectedDate == null) {\r\n scope.select({ date: null });\r\n }\r\n else if (!scope.showTime) {\r\n scope.select({ date: dateUtil.serialiseDate(selectedDate) });\r\n }\r\n else if (!scope.showApplyButton) {\r\n scope.setDepartureDateAndTime();\r\n }\r\n syncField();\r\n });\r\n }\r\n if (scope.showTime && !scope.showApplyButton) {\r\n scope.$watchGroup(['tp.hours', 'tp.minutes'], function (vals) {\r\n if (vals[0] && vals[1]) {\r\n // Timer ensures field is ready\r\n $timeout(selectDate);\r\n }\r\n });\r\n }\r\n // terrible hack to prevent the default behaviour of jQuery datepicker\r\n // so we can have no selected and highlighted date\r\n $timeout(function () {\r\n var currDate = parseCurrentDate();\r\n if (scope.noInitialDate === 'true') {\r\n scope.$apply(function () {\r\n if (!scope.currentDate || !dateUtil.isValid(currDate)) {\r\n dp.datepicker('setDate', null);\r\n $(el).find('td.ui-datepicker-current-day').removeClass('ui-datepicker-current-day');\r\n }\r\n else {\r\n dp.datepicker('setDate', currDate);\r\n scope.currentDate = dateUtil.serialiseDate(currDate);\r\n }\r\n });\r\n }\r\n else {\r\n var searchDates = JSON.parse(sessionStorage.getItem('searchDates'));\r\n if (searchDates) {\r\n document.getElementsByClassName('searchDates')[0].value = searchDates.startDate;\r\n }\r\n dp.datepicker('setDate', currDate);\r\n }\r\n });\r\n scope.$watch('minDate', function (val) {\r\n if (val != null) {\r\n dateEl.datepicker('option', 'minDate', parseMinDate(val));\r\n // If select date is called on mobile then the datepicker freezes up.\r\n if (TRPCONFIG.Domain.DeviceType === 'Desktop') {\r\n selectDate();\r\n }\r\n }\r\n });\r\n scope.$watch('maxDate', function (val) {\r\n if (val != null) {\r\n dateEl.datepicker('option', 'maxDate', dateUtil.parseDate(val));\r\n }\r\n });\r\n scope.setDepartureDateAndTime = function () {\r\n var dateOb = null;\r\n if (scope.tp && (!scope.tp.hours || !scope.tp.minutes)) {\r\n scope.$emit('flash:error', resourceService.get(scope.timeErrorMsg));\r\n }\r\n if (dateUtil.isValid(selectedDate)) {\r\n var hours = scope.tp && scope.tp.hours ? scope.tp.hours : selectedDate.getHours();\r\n var minutes = scope.tp && scope.tp.minutes ? scope.tp.minutes : selectedDate.getMinutes();\r\n dateOb = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate(), hours, minutes);\r\n }\r\n var serialisedDate = dateUtil.serialiseDate(dateOb);\r\n if (_.isFunction(scope.select)) {\r\n scope.select({ date: serialisedDate, back: true });\r\n }\r\n else {\r\n scope.select = serialisedDate;\r\n }\r\n };\r\n if (scope.showTime) {\r\n //this is sort of a nextTick hack\r\n $timeout(function () {\r\n el.find('button').text(resourceService.get('APPLYDATEANDTIME'));\r\n }, 0);\r\n }\r\n function syncField() {\r\n // Ensure field contains current value\r\n dp.datepicker('setDate', selectedDate);\r\n dateEl.trigger('input');\r\n }\r\n function parseCurrentDate() {\r\n return dateUtil.parseDate(scope.currentDate);\r\n }\r\n function parseMinDate(val) {\r\n return val === true ?\r\n dateUtil.zeroTime(new Date()) :\r\n dateUtil.parseDate(val);\r\n }\r\n function beforeShowDay(date) {\r\n var allowed = true;\r\n if (scope.dates && Object.keys(scope.dates).length > 0) {\r\n var dateStr = dateUtil.format(date, 'yyyy-MM-dd');\r\n allowed = scope.dates[dateStr] !== undefined;\r\n }\r\n return [allowed, '', ''];\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('destination', function (searchUnitService) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, el, attr) {\r\n if (attr.destination != null) {\r\n searchUnitService.setDestination(angular.extend({ landing: true }, JSON.parse(attr.destination)));\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var FILTERLINKCONTENTTYPE = 11;\r\n var TR = angular.module('TR');\r\n TR.directive('destinationContent', function (broker, destinationContent, currentDestination, urlUtils, fidParser) {\r\n return {\r\n restrict: 'E',\r\n replace: false,\r\n scope: {\r\n containerClass: '@',\r\n sitemapLink: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=DestinationContent',\r\n link: function (scope) {\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n if (dest != null) {\r\n init(dest);\r\n }\r\n });\r\n function init(dest) {\r\n destinationContent.get(dest).then(function (contents) {\r\n contents = _.sortBy(contents, contentOrderRank);\r\n contents.forEach(function (content, index) {\r\n if (Array.isArray(content.Items)) {\r\n content.Items.forEach(function (item, name) {\r\n if (!_.isNull(item.Url) && !_.isUndefined(item.Url)) {\r\n contents[index].Items[name].Url = urlUtils.stripLeadingSlash(item.Url);\r\n }\r\n });\r\n }\r\n });\r\n // if the url we are being hit with matches one of the seo\r\n // content urls, The fid is considered canonical. Fire off\r\n //a message to update the canonical tag.\r\n var currentFid = fidParser.parse();\r\n if (currentFid) {\r\n var matchedSeoItem = _.find(contents, function (ci) {\r\n if (ci.ContentType !== FILTERLINKCONTENTTYPE) {\r\n return false;\r\n }\r\n return _.find(ci.Items, function (i) {\r\n var parsedUrl = urlUtils.parse(i.Url);\r\n // no query string object or parameters, exist early.\r\n if (!parsedUrl.qs || parsedUrl.qs.length === 0) {\r\n return false;\r\n }\r\n return currentFid === _.toNumber(parsedUrl.qs.fid);\r\n });\r\n });\r\n if (!_.isUndefined(matchedSeoItem)) {\r\n broker.publish('seoCanonicalDetected', {\r\n fid: currentFid\r\n });\r\n }\r\n }\r\n // Don't render filter link content.\r\n scope.items = _.filter(contents, function (ci) {\r\n return ci.ContentType !== FILTERLINKCONTENTTYPE;\r\n });\r\n broker.publish('seoContentLoaded');\r\n });\r\n }\r\n function contentOrderRank(content) {\r\n // The order should be:\r\n // First: SEO Content Types, in alphabetical order\r\n // Then: The other content types, in id order.\r\n if (content.ContentType > 7) {\r\n return \"0\" + content.Title;\r\n }\r\n return \"1\" + content.ContentType;\r\n }\r\n }\r\n };\r\n });\r\n})();\r\nvar DestinationPromoMessage = /** @class */ (function () {\r\n function DestinationPromoMessage(currentDestination, $interpolate) {\r\n var _this = this;\r\n this.currentDestination = currentDestination;\r\n this.$interpolate = $interpolate;\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n var text = dest.PromoText;\r\n var matches = text && text.match(/\\S*\\d+\\S*/);\r\n _this.price = matches && matches[0];\r\n _this.text = _this.price && text.split(_this.price);\r\n });\r\n }\r\n return DestinationPromoMessage;\r\n}());\r\nangular\r\n .module('TR')\r\n .directive('destinationPromoMessage', function () {\r\n return {\r\n controller: DestinationPromoMessage,\r\n controllerAs: 'dpm',\r\n bindToController: {\r\n className: '='\r\n },\r\n replace: true,\r\n template: \"

        \\n {{dpm.text[0]}} {{dpm.price}}{{dpm.text[1]}}\\n

        \"\r\n };\r\n});\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('destinationTitle', function (resourceService, pageStrand, loggingService, destinationService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n template: '{{ title }}',\r\n scope: {\r\n title: '@?',\r\n dest: '=',\r\n allowEstab: '=' // Required on estab page because search pages display parent dest\r\n },\r\n link: function (scope) {\r\n var strandResources = {\r\n 1: resourceService.getDeferred('HOTELSIN'),\r\n 2: resourceService.getDeferred('HOLIDAYSIN')\r\n };\r\n var reVarStr = /{/;\r\n var strand;\r\n var countryId;\r\n var bc;\r\n // Destination object receives async updates\r\n scope.$watch('dest', init, true);\r\n function _destTitleFallback(dest) {\r\n scope.title = (strandResources[strand] || strandResources[1])() + \" \" + dest.Title;\r\n return true;\r\n }\r\n function init(dest) {\r\n if (!dest || !dest.BreadcrumbTrail) {\r\n return;\r\n }\r\n strand = pageStrand.fromRoute(dest);\r\n // Values may be removed by `getParentDestination()`\r\n bc = dest.BreadcrumbTrail;\r\n countryId = dest.CountryId;\r\n if (!scope.allowEstab) {\r\n // Display estab parent destination by default\r\n // i.e. 'choose a different hotel' results\r\n dest = getParentDestination(dest);\r\n }\r\n dest.PageStrand = strand;\r\n destinationService.getText(dest, {\r\n customErrCallback: {\r\n 404: function () {\r\n _destTitleFallback(dest);\r\n },\r\n 400: function () {\r\n _destTitleFallback(dest);\r\n }\r\n }\r\n }).then(function (result) {\r\n // `PageHeading` template should exist ideally\r\n var titleStr = String.supplant(\r\n // Non-estab: fall back to PageTitle, Estab: fall back to hotel name\r\n result.PageHeading || (!scope.allowEstab && result.PageTitle) || '{name}', getVarMap(dest));\r\n if (reVarStr.test(titleStr)) {\r\n // Error if any vars are not transformed\r\n var logMsg = \"Untransformed template: \" + titleStr + \" | \" + window.location.href + \" | getText: \" + angular.toJson(result);\r\n loggingService.logError(logMsg);\r\n }\r\n else {\r\n scope.title = titleStr;\r\n }\r\n });\r\n }\r\n function getParentDestination(dest) {\r\n //if the destination is an estab, walk back one level up the breadcrumb and the return the parent destination\r\n var pDest = (dest.EstablishmentId && bc && bc.length > 1) ? bc[bc.length - 2] : dest;\r\n // Add properties required by `getVarMap()` (returns a new object)\r\n return angular.extend({\r\n ShortTitle: pDest.Title,\r\n SummaryTitle: pDest.Title\r\n }, pDest);\r\n }\r\n function getVarMap(dest) {\r\n // Variable mapping in string templates i.e. {name}\r\n // Also supports legacy numeric vars i.e. {0}\r\n var inResource = resourceService.get(dest.IsPOI ? 'NearDestination' : 'InDestination');\r\n return {\r\n 0: dest.Title,\r\n 1: inResource,\r\n name: dest.ShortTitle,\r\n in: inResource,\r\n location: dest.SummaryTitle,\r\n country: destinationService.getBreadcrumbTitle(dest, function (bc) { return bc.ObjectId === countryId; })\r\n };\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('dobPicker', function (dateUtil, arrayUtil, $locale, broker) {\r\n var days = arrayUtil.numberArray(1, 31);\r\n var months = arrayUtil.map($locale.DATETIME_FORMATS.SHORTMONTH, function (m, i) {\r\n return { index: i, label: m };\r\n });\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: function (element, attr) {\r\n var base = 'partials';\r\n if (attr.templateVersion) {\r\n return base + \"/booking/template?name=DobPicker&version=\" + attr.templateVersion;\r\n }\r\n return base + \"/home/directivetemplate?type=DobPicker\";\r\n },\r\n link: function (scope, el, attr, c) {\r\n if (!c) {\r\n return;\r\n }\r\n scope.dobField = attr.field;\r\n var thisYear = new Date().getFullYear();\r\n var minAge = parseInt(scope.$eval(attr.minAge));\r\n var age = parseInt(scope.$eval(attr.age));\r\n var maxAge = attr.maxAge ? parseInt(scope.$eval(attr.maxAge)) : 100;\r\n if (attr.ageCheck != null) {\r\n var d = scope.$eval(attr.ageCheck);\r\n d = d.split('-');\r\n d = parseInt(d[0]);\r\n thisYear = d;\r\n }\r\n scope.days = days;\r\n scope.months = months;\r\n scope.years = arrayUtil.numberArray(thisYear - (age >= 0 ? age : minAge), age >= 0 ? thisYear - age - 1 : thisYear - maxAge);\r\n c.$formatters.unshift(function (val) {\r\n if (val == null) {\r\n return val;\r\n }\r\n var d = dateUtil.parseDate(val);\r\n if (dateUtil.isValid(d)) {\r\n scope.dob = scope.dob || {};\r\n scope.dob = {\r\n year: d.getFullYear(),\r\n month: d.getMonth(),\r\n day: d.getDate()\r\n };\r\n }\r\n return val;\r\n });\r\n function parse(val) {\r\n if (val == null || val.day == null || val.month == null || val.year == null) {\r\n return null;\r\n }\r\n var d = dateUtil.zeroTime(val.year + \"-\" + padZero(val.month + 1) + \"-\" + padZero(val.day), false);\r\n return (dateUtil.isValid(d)) ? dateUtil.serialiseDate(d) : null;\r\n }\r\n function padZero(n) {\r\n return (n < 10) ? (\"0\" + n) : n;\r\n }\r\n scope.$watch('dob', function (val) {\r\n if (val == null) {\r\n return;\r\n }\r\n c.$setViewValue(parse(val));\r\n broker.publish('dobUpdated', val);\r\n }, true);\r\n }\r\n };\r\n });\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var DropdownCheckboxList = /** @class */ (function () {\r\n function DropdownCheckboxList($scope, $document, resourceService) {\r\n this.$scope = $scope;\r\n this.$document = $document;\r\n this.resourceService = resourceService;\r\n this.isOpen = false;\r\n this.eventNamespace = 'dropdowncheckboxlist';\r\n }\r\n DropdownCheckboxList.prototype.init = function (el, attrs) {\r\n var _this = this;\r\n this.element = el;\r\n var id = this.element.attr('id');\r\n this.ids = {\r\n button: id + '-button',\r\n menu: id + '-menu'\r\n };\r\n this.$scope.$watchCollection('dcl.model', function (val) {\r\n if (val) {\r\n _this.setButtonText();\r\n }\r\n });\r\n this.$scope.$watchCollection('dcl.options', function (val) {\r\n if (val) {\r\n _this.setButtonText();\r\n }\r\n });\r\n };\r\n DropdownCheckboxList.prototype.toggle = function (event) {\r\n this.isOpen ? this.close() : this.open(event);\r\n };\r\n DropdownCheckboxList.prototype.keydown = function (event) {\r\n switch (event.keyCode) {\r\n // Escape\r\n case 27:\r\n this.close();\r\n break;\r\n // Enter\r\n case 13:\r\n this.toggle(event);\r\n break;\r\n default:\r\n }\r\n };\r\n DropdownCheckboxList.prototype.setButtonText = function () {\r\n var _this = this;\r\n var label;\r\n if (!this.model || !this.options) {\r\n return;\r\n }\r\n if (this.model.length === this.options.length || this.model.length === 0) {\r\n label = this.resourceService.getDeferred('ANY')();\r\n }\r\n else if (this.model.length === 1) {\r\n var match = _.find(this.options, function (o) {\r\n return o[_this.valueProperty] === _this.model[0];\r\n });\r\n label = String(match[this.labelProperty]);\r\n }\r\n else {\r\n label = this.model.length + \" \" + this.pluralLabel;\r\n }\r\n this.selection = label;\r\n };\r\n DropdownCheckboxList.prototype.close = function () {\r\n if (!this.isOpen) {\r\n return;\r\n }\r\n this.isOpen = false;\r\n this.$document.off('.' + this.eventNamespace);\r\n };\r\n DropdownCheckboxList.prototype.open = function (event) {\r\n var _this = this;\r\n this.isOpen = true;\r\n // close if background is clicked\r\n this.$document.on('mousedown.' + this.eventNamespace, function (event) {\r\n if (!_this.isOpen) {\r\n return;\r\n }\r\n // close if click target isn't the menu or the button\r\n if (!$(event.target).closest(\"#\" + _this.ids.menu + \", #\" + _this.ids.button).length) {\r\n _this.$scope.$apply(function () {\r\n _this.close();\r\n });\r\n }\r\n });\r\n };\r\n return DropdownCheckboxList;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('dropdownCheckboxList', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n replace: true,\r\n controller: DropdownCheckboxList,\r\n controllerAs: 'dcl',\r\n bindToController: {\r\n model: '=',\r\n options: '=',\r\n caption: '@',\r\n valueProperty: '@',\r\n labelProperty: '@',\r\n singularLabel: '@',\r\n pluralLabel: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=dropdowncheckboxlist',\r\n link: function (scope, el, attrs, controller) {\r\n controller.init(el, attrs);\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n/*\r\n Check whether the tenants email address is valid in the booking form\r\n */\r\nvar TR;\r\n(function (TR) {\r\n var EmailAllowed = /** @class */ (function () {\r\n function EmailAllowed($q, bookingService) {\r\n this.$q = $q;\r\n this.bookingService = bookingService;\r\n }\r\n EmailAllowed.prototype.init = function (scope, el, attr, ctrl) {\r\n var _this = this;\r\n ctrl.$asyncValidators.emailAllowed = function (modelValue) {\r\n if (ctrl.$isEmpty(modelValue)) {\r\n return _this.$q.resolve();\r\n }\r\n //do fetch from some service here\r\n return _this.bookingService.checkValidEmail(modelValue);\r\n };\r\n };\r\n return EmailAllowed;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('emailAllowed', function () {\r\n return {\r\n restrict: 'A',\r\n controller: EmailAllowed,\r\n controllerAs: 'ea',\r\n require: 'ngModel',\r\n link: function (scope, el, attr, ctrl) {\r\n return scope.ea.init(scope, el, attr, ctrl);\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .directive('eventTracker', eventTracker);\r\n function eventTracker(analytics, $parse) {\r\n return {\r\n restrict: 'A',\r\n link: _linker\r\n };\r\n function _linker(scope, elem, attr) {\r\n var label = null;\r\n var category = attr.eventCategory;\r\n var type = attr.eventType;\r\n function _fireEvent() {\r\n var eventData = {\r\n label: label,\r\n category: category,\r\n value: 1\r\n };\r\n if (attr.eventAction) {\r\n eventData.action = attr.eventAction;\r\n }\r\n analytics.trackEvent(eventData);\r\n }\r\n function _destroyHandlers(events) {\r\n scope.$on('destroy', function () {\r\n elem.off(events);\r\n });\r\n }\r\n if (type !== 'textbox') {\r\n elem.on('click', function (e) {\r\n // only register left clicks\r\n if (e && e.button !== 0) {\r\n return;\r\n }\r\n var attrLabel = $parse(attr.eventLabel)(scope);\r\n var attrTag = attr.eventTag ? attr.eventTag + \": \" : '';\r\n label = attrLabel ? (\"\" + attrTag + attrLabel) : attr.eventTag;\r\n _fireEvent();\r\n });\r\n _destroyHandlers('click');\r\n }\r\n else {\r\n elem.on('keypress keydown', _.debounce(function () {\r\n label = $parse(attr.eventLabel)(scope);\r\n _fireEvent();\r\n }, 1500));\r\n _destroyHandlers('keypress keydown');\r\n }\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var FareRulesLink = /** @class */ (function () {\r\n function FareRulesLink(modalService) {\r\n this.modalService = modalService;\r\n }\r\n FareRulesLink.prototype.showFareRules = function () {\r\n var fareRulesText = this.details || '';\r\n if (fareRulesText) {\r\n this.modalService.launch('partials/popups/farerules', { fareRulesText: fareRulesText });\r\n }\r\n };\r\n ;\r\n return FareRulesLink;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('fareRulesLink', function (modalService) {\r\n return {\r\n restrict: 'E',\r\n bindToController: {\r\n text: '@',\r\n details: '='\r\n },\r\n controllerAs: 'fr',\r\n controller: FareRulesLink,\r\n template: ''\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar TR;\r\n(function (TR) {\r\n var FareRulesText = /** @class */ (function () {\r\n function FareRulesText(modalService) {\r\n this.modalService = modalService;\r\n this.text = this.modalService.get('fareRulesText');\r\n }\r\n return FareRulesText;\r\n }());\r\n angular\r\n .module('TR')\r\n .directive('fareRulesText', function (modalService) {\r\n return {\r\n restrict: 'E',\r\n controllerAs: 'frt',\r\n controller: FareRulesText,\r\n template: '
        '\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('filterCriterion', function () {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n close: '&',\r\n show: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=FilterCriterion'\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('flashMessage', function ($timeout, $filter, resourceService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: function (element, attr) {\r\n if (attr.templateVersion) {\r\n return \"partials/booking/template?name=FlashMessage&version=\" + attr.templateVersion;\r\n }\r\n var templateName = attr.templateName || 'FlashMessage';\r\n return \"partials/home/directivetemplate?type=\" + templateName;\r\n },\r\n link: function (scope) {\r\n var err = null;\r\n var success = null;\r\n var info = null;\r\n var tryStopPropagation = function (ev) {\r\n if (typeof ev.stopPropagation === 'function') {\r\n ev.stopPropagation();\r\n }\r\n };\r\n scope.visible = false;\r\n scope.getClass = function () {\r\n return (err ? 'error-message' : (success ? 'success-message' : (info ? 'info-message' : 'closed')));\r\n };\r\n scope.$on('flash:error', function (ev, msg) {\r\n err = success = info = null;\r\n if (msg == null) {\r\n return;\r\n }\r\n scope.visible = true;\r\n if (!(msg instanceof Array)) {\r\n msg = [msg];\r\n }\r\n err = msg;\r\n scope.message = msg.map(function (m) {\r\n if (_.isObject(m)) {\r\n //Escape the unexpected backend error:\r\n var backendError = $('
        ').text($filter('json')(m)).html();\r\n var errorMessage = resourceService.get('UNEXPECTEDSEARCHERROR');\r\n m = errorMessage + \" \" + backendError + \"\";\r\n }\r\n return \"
      • \" + m + \"
      • \";\r\n }).join('');\r\n tryStopPropagation(ev);\r\n });\r\n scope.$on('flash:success', function (ev, msg) {\r\n scope.message = success = msg;\r\n scope.visible = true;\r\n err = info = null;\r\n $timeout(function () {\r\n scope.message = success = null;\r\n }, 3000);\r\n tryStopPropagation(ev);\r\n });\r\n scope.$on('flash:info', function (ev, msg) {\r\n scope.message = info = msg;\r\n scope.visible = true;\r\n err = success = null;\r\n tryStopPropagation(ev);\r\n });\r\n scope.$on('flash:hide', function () {\r\n scope.visible = false;\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('footerCarousel', function ($timeout, $q) {\r\n return {\r\n restrict: 'A',\r\n transclude: true,\r\n link: function (scope, element, attributes, controller, $transclude) {\r\n var $element = $(element);\r\n var carousel = false;\r\n function processItem(item) {\r\n var deferred = $q.defer();\r\n $transclude(function (clone, scope) {\r\n scope.item = item;\r\n deferred.resolve($element.append(clone));\r\n });\r\n return deferred.promise;\r\n }\r\n scope.$watchCollection(attributes.footerCarousel, function (elem) {\r\n //ensure this only runs when the section is open\r\n if (!elem.open) {\r\n return;\r\n }\r\n if (carousel) {\r\n $element.slick('unslick');\r\n carousel = false;\r\n }\r\n $element.empty();\r\n var filteredThings = elem.things.filter(function (hotel) { return !hotel.deleted; });\r\n if (!filteredThings.length) {\r\n return;\r\n }\r\n $q.all(filteredThings.map(processItem)).then(function () {\r\n $timeout(function () {\r\n $element.slick({\r\n rtl: TRPCONFIG.Rtl,\r\n prevArrow: $element.siblings('.slick-prev'),\r\n nextArrow: $element.siblings('.slick-next'),\r\n infinite: false,\r\n slidesToShow: 5,\r\n slidesToScroll: 1,\r\n swipeToSlide: true,\r\n variableWidth: true,\r\n responsive: [{\r\n breakpoint: 1760,\r\n settings: {\r\n slidesToShow: 4\r\n }\r\n }, {\r\n breakpoint: 1425,\r\n settings: {\r\n slidesToShow: 3\r\n }\r\n }, {\r\n breakpoint: 1000,\r\n settings: {\r\n slidesToShow: 2\r\n }\r\n }]\r\n });\r\n carousel = true;\r\n //turn off all new flags to reveal added element\r\n filteredThings.forEach(function (thing) { return thing.new = false; });\r\n scope.$apply();\r\n }, 200);\r\n });\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('footerToolbar', function (urlUtils, $rootScope, preferences, imageService, $timeout, arrayUtil, hotelRehydrator, broker, $q, recentHotels, shortlistService, resourceService, savedSearchService, basketService, analytics, attractionService, basketStore) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'partials/home/directivetemplate?type=FooterToolbar',\r\n link: function (scope) {\r\n scope.open = false;\r\n scope.$on('auth:signout', fetch);\r\n scope.$on('auth:signin', fetch);\r\n scope.stripLeadingSlash = urlUtils.stripLeadingSlash;\r\n var initialised = false;\r\n var busy = false;\r\n var icons = {\r\n 1: 'icon-flight',\r\n 3: 'icon-holidays',\r\n 2: 'icon-hotel',\r\n 4: 'icon-transfer',\r\n 6: 'icon-parking'\r\n };\r\n var sectionIndex = {\r\n recentHotels: 0,\r\n shortlist: 1,\r\n savedSearches: 2\r\n };\r\n $rootScope.$on('$routeChangeSuccess', function (event, current) {\r\n scope.hide = current.hideDistractionLinks;\r\n if (initialised) {\r\n closeAllSections();\r\n }\r\n else if (!scope.hide) {\r\n init();\r\n }\r\n });\r\n if (!scope.rc.hideDistractionLinks) {\r\n init();\r\n }\r\n function addHotelToSection(section, hotel) {\r\n if (section == null || section.things == null) {\r\n return;\r\n }\r\n //make sure this hotel is not already in the list\r\n if (arrayUtil.any(section.things, function (t) {\r\n return t.Id === hotel.Id && !t.deleted;\r\n }) || arrayUtil.any(section.estabIds, function (estabId) {\r\n return estabId === hotel.Id;\r\n })) {\r\n return;\r\n }\r\n if (hotel.Name == null) {\r\n hotel.Name = hotel.Title;\r\n }\r\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, 80, 80);\r\n hotel.hide = true;\r\n hotel.deleted = false;\r\n hotel.new = true;\r\n section.things.unshift(hotel);\r\n $timeout(function () {\r\n hotel.hide = false;\r\n section.count += 1;\r\n }, 0);\r\n }\r\n function removeHotelFromSection(section, hotel) {\r\n for (var i = 0, l = section.things.length; i < l; i++) {\r\n if (section.things[i].Id === hotel.Id) {\r\n section.count -= 1;\r\n section.things[i].hide = true;\r\n section.things[i].deleted = true;\r\n break;\r\n }\r\n }\r\n }\r\n function setToolbarOpen(isOpen) {\r\n scope.open = isOpen;\r\n preferences.set('footerToolbar', scope.open);\r\n }\r\n function deleteSearch(s, ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n savedSearchService.removeSavedSearch(s.SavedSearchId);\r\n scope.sections[2].count -= 1;\r\n removeSearch(s);\r\n }\r\n function removeSearch(search) {\r\n search.hide = true;\r\n search.deleted = true;\r\n }\r\n function addSearch(section, s) {\r\n //force close of search on add as element has no layout\r\n if (scope.sections[2].open) {\r\n scope.sections[2].open = false;\r\n }\r\n //make sure this search is not already in the list\r\n var isSearchInTheList = arrayUtil.any(section.things, function (t) { return t.SavedSearchId === s.SavedSearchId && !t.deleted; });\r\n if (isSearchInTheList) {\r\n return;\r\n }\r\n s.hide = true;\r\n s.deleted = false;\r\n s.new = true;\r\n extendSearch(s);\r\n section.things.unshift(s);\r\n $timeout(function () {\r\n s.hide = false;\r\n section.count += 1;\r\n }, 0);\r\n }\r\n function restoreSearch(s, ev) {\r\n ev.preventDefault();\r\n if (!busy) {\r\n busy = true;\r\n savedSearchService.restoreSearch(s).then(function () {\r\n basketService.startWorkflow(basketService.workflowType[s.SearchType]).then(function () {\r\n busy = false;\r\n removeSearch(s);\r\n });\r\n analytics.trackEvent({ label: 'restore saved search' });\r\n }, function () {\r\n busy = false;\r\n });\r\n }\r\n }\r\n function rehydrateIfNecessaryAndThen(section, then, hotel) {\r\n if (section.needsHydrating) {\r\n rehydrate(section).then(function () {\r\n then(section, hotel);\r\n });\r\n }\r\n else {\r\n then(section, hotel);\r\n }\r\n }\r\n function setupSubscriptions() {\r\n broker.subscribe('footerToolbarDirective', 'hotelAddedToShortlist', function (ev) {\r\n var hotel = angular.copy(ev.data);\r\n hotel.onDelete = deleteFromShortlist;\r\n rehydrateIfNecessaryAndThen(scope.sections[1], addHotelToSection, hotel);\r\n });\r\n broker.subscribe('footerToolbarDirective', 'hotelRemovedFromShortlist', function (ev) {\r\n var hotel = ev.data;\r\n hotel.inShortlist = false;\r\n scope.$emit('hotelShortlistStatusUpdated', hotel);\r\n rehydrateIfNecessaryAndThen(scope.sections[1], removeHotelFromSection, hotel);\r\n });\r\n broker.subscribe('footerToolbarDirective', 'recentHotelAdded', function (ev) {\r\n rehydrateIfNecessaryAndThen(scope.sections[0], function (section, hotel) {\r\n rehydrateHotel(section, hotel).then(function (hotel) {\r\n addHotelToSection(section, hotel);\r\n });\r\n }, ev.data);\r\n });\r\n broker.subscribe('footerToolbarDirective', 'recentHotelRemoved', function (ev) {\r\n rehydrateIfNecessaryAndThen(scope.sections[0], function (section, hotel) {\r\n removeHotelFromSection(section, hotel);\r\n }, { Id: ev.data });\r\n });\r\n broker.subscribe('footerToolbarDirective', 'savedSearchAdded', function (ev) {\r\n addSearch(scope.sections[2], angular.copy(ev.data));\r\n });\r\n broker.subscribe('footerToolbarDirective', 'footerToolbarChanged', function (ev) {\r\n scope.open = ev.data;\r\n });\r\n broker.subscribe('footerToolbarDirective', 'attractionsBasketUpdated', function (e) {\r\n var basket = e && e.data && e.data.Basket;\r\n updateAttractionsBasket(basket && basket.LineItems);\r\n });\r\n broker.subscribe('footerToolbarDirective', 'basketCleared', function () { return updateAttractionsBasket(); });\r\n }\r\n function closeAllSections() {\r\n if (scope.sections) {\r\n scope.sections.forEach(function (s) { return s.open = false; });\r\n }\r\n }\r\n function section(identifier, title, estabIds, things, emptyPrompt, icon, template, needsRehydrating, index, showCount, onDelete) {\r\n return {\r\n identifier: identifier,\r\n title: title,\r\n things: things || [],\r\n estabIds: estabIds || [],\r\n emptyPrompt: emptyPrompt,\r\n count: estabIds.length || things.length || 0,\r\n needsHydrating: needsRehydrating,\r\n icon: icon,\r\n template: template,\r\n index: index,\r\n showCount: showCount,\r\n onDelete: onDelete\r\n };\r\n }\r\n function deleteFromShortlist(hotel, ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n shortlistService.removeFromShortlist(hotel);\r\n }\r\n function shortlistSection(hotels) {\r\n return section('shortlist', resourceService.get('SHORTLIST'), hotels, [], resourceService.get('NOSHORTLISTEDHOTELS'), 'favourite', 'partials/footertoolbar/toolbarhotel', true, sectionIndex.shortlist, true, deleteFromShortlist);\r\n }\r\n function deleteFromRecent(_a, ev) {\r\n var Id = _a.Id;\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n recentHotels.remove(Id);\r\n }\r\n function recentHotelsSection(hotels) {\r\n return section('recent', resourceService.get('RECENTHOTELS'), hotels, [], resourceService.get('NORECENTHOTELS'), 'timer', 'partials/footertoolbar/toolbarhotel', true, sectionIndex.recentHotels, true, deleteFromRecent);\r\n }\r\n function savedSearchesSection(searches) {\r\n return section('searches', resourceService.get('RECENTSEARCHES'), [], arrayUtil.map(searches, extendSearch), resourceService.get('NORECENTSEARCHES'), 'search', 'partials/footertoolbar/toolbarsearch', false, sectionIndex.savedSearches, false);\r\n }\r\n function extendSearch(s) {\r\n return angular.extend(s, {\r\n icon: icons[s.SearchType],\r\n onClick: restoreSearch,\r\n onDelete: deleteSearch\r\n });\r\n }\r\n function fetch() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _a, recentHotelIds, shortlistEstabIds, savedSearches, footerToolbarPreferences;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n initialised = true;\r\n return [4 /*yield*/, $q.all([\r\n recentHotels.getIds(),\r\n shortlistService.getShortlistEstabIds(),\r\n savedSearchService.getSavedSearches(),\r\n preferences.get('footerToolbar')\r\n ])];\r\n case 1:\r\n _a = _b.sent(), recentHotelIds = _a[0], shortlistEstabIds = _a[1], savedSearches = _a[2], footerToolbarPreferences = _a[3];\r\n scope.sections = [\r\n recentHotelsSection(recentHotelIds),\r\n shortlistSection(shortlistEstabIds),\r\n savedSearchesSection(savedSearches)\r\n ];\r\n return [2 /*return*/, footerToolbarPreferences];\r\n }\r\n });\r\n });\r\n }\r\n function initAttractionsBasket() {\r\n basketStore.getAttractionsBasket()\r\n .then(function (res) { return updateAttractionsBasket(res.LineItems); });\r\n }\r\n function updateAttractionsBasket(lineItems) {\r\n var totals = attractionService.getProductTotals(lineItems);\r\n scope.attractionsBasketTotal = totals.price;\r\n scope.attractionsBasketCount = totals.count;\r\n if (totals.count) {\r\n setToolbarOpen(true);\r\n }\r\n }\r\n function rehydrate(section) {\r\n return hotelRehydrator.hotels(section.estabIds, {\r\n fields: [\r\n 'Id', 'Title', 'Location', 'StarRating', 'CustomerRating', 'CustomerRatingTitle', 'Url'\r\n ]\r\n }).then(function (hotels) {\r\n for (var i = 0, l = hotels.length; i < l; i++) {\r\n section.things[i] = hotels[i];\r\n section.things[i].onDelete = section.onDelete;\r\n }\r\n section.needsHydrating = false;\r\n });\r\n }\r\n function rehydrateHotel(section, id) {\r\n return hotelRehydrator.hotels([id], {\r\n fields: [\r\n 'Id', 'Title', 'Location', 'StarRating', 'CustomerRating', 'CustomerRatingTitle', 'Url'\r\n ]\r\n }).then(function (hotels) {\r\n var hotel = hotels[0];\r\n hotel.onDelete = section.onDelete;\r\n return hotel;\r\n });\r\n }\r\n function init() {\r\n fetch().then(function (open) {\r\n scope.open = open;\r\n setupSubscriptions();\r\n initAttractionsBasket();\r\n });\r\n }\r\n scope.select = function (index) {\r\n scope.sections[index].open = false;\r\n };\r\n scope.sectionClass = function (index) {\r\n return scope.sections[index].open ? 'expanded' : '';\r\n };\r\n scope.toggleBar = function () { return setToolbarOpen(!scope.open); };\r\n scope.toggleSection = function (index) {\r\n scope.sections.forEach(function (s, i) {\r\n if (i !== index) {\r\n s.open = false;\r\n }\r\n });\r\n if (!scope.sections[index].open && scope.sections[index].needsHydrating) {\r\n rehydrate(scope.sections[index]).then(function () {\r\n scope.sections[index].open = true;\r\n });\r\n }\r\n else {\r\n scope.sections[index].open = !scope.sections[index].open;\r\n }\r\n };\r\n scope.$watch('open', function (v, o) {\r\n if (v == null || v === o) {\r\n return;\r\n }\r\n broker.publish('footerToolbarChanged', scope.open);\r\n });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('footerToolbarDirective');\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('globalWaiverText', GlobalWaiverText);\r\n function GlobalWaiverText() {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n waiverText: '=',\r\n },\r\n controllerAs: 'cm',\r\n templateUrl: 'partials/home/directivetemplate?type=GlobalWaiverText',\r\n link: function ($scope, $element) {\r\n if (!$scope.waiverText || $scope.waiverText == null) {\r\n return;\r\n }\r\n $scope.showImportantInfo = false;\r\n function fetchWaiverText() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var response;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, $scope.waiverText];\r\n case 1:\r\n response = _a.sent();\r\n return [2 /*return*/, response];\r\n }\r\n });\r\n });\r\n }\r\n function waiverTextReady() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n function attachLightbox(e) {\r\n e.preventDefault();\r\n $scope.selectedImportantInfo = '';\r\n $scope.showImportantInfo = true;\r\n $scope.$apply();\r\n }\r\n var getWaiverText, el, globalWaiverTerms;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, fetchWaiverText()];\r\n case 1:\r\n getWaiverText = _a.sent();\r\n if (!getWaiverText.length) {\r\n return [2 /*return*/];\r\n }\r\n el = $element[0];\r\n globalWaiverTerms = el.querySelector('.globalWaiverTerms');\r\n globalWaiverTerms.addEventListener('click', attachLightbox);\r\n $scope.$on('$destroy', function () {\r\n globalWaiverTerms.removeEventListener('click', attachLightbox);\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n waiverTextReady();\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('googleMap', function ($window, $timeout, searchUnitService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n key: '@',\r\n model: '='\r\n },\r\n template: '
        ',\r\n link: function (scope, el) {\r\n var headerHeight = 95;\r\n var throttle = 100;\r\n var pos = searchUnitService.getSearchArea();\r\n var map;\r\n var initialised = false;\r\n var centre;\r\n var promise = null;\r\n scope.$on('mapTabSelected', function () {\r\n if (!$window.google || !$window.google.maps) {\r\n $(\"\");\r\n }\r\n }, 1500);\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var USP = /** @class */ (function () {\r\n function USP() {\r\n this.breakpoint = 1025;\r\n this.classFirst = 'slick-first';\r\n this.classLast = 'slick-last';\r\n this.settings = {\r\n mobileFirst: true,\r\n rtl: TRPCONFIG.Rtl,\r\n slidesToShow: 1,\r\n infinite: false,\r\n dots: false,\r\n speed: 250\r\n };\r\n this.breakpointSettings = {\r\n responsive: [\r\n {\r\n breakpoint: this.breakpoint,\r\n settings: 'unslick'\r\n }\r\n ]\r\n };\r\n }\r\n USP.prototype.setup = function (el) {\r\n this.list = el.find('.slick-usps:first');\r\n this.initSlick();\r\n if (this.useBreakpoint) {\r\n this.onResize();\r\n }\r\n };\r\n USP.prototype.initSlick = function () {\r\n var _this = this;\r\n this.destroy();\r\n var count = this.list.find('.usps-item').length;\r\n if (count > 1) {\r\n this.list.addClass(this.classFirst).removeClass(this.classLast);\r\n this.list.slick(this.useBreakpoint\r\n ? _.extend({}, this.settings, this.breakpointSettings) : this.settings);\r\n this.list.on('afterChange', function (e, slick, current) {\r\n if (0 === current) {\r\n _this.list.addClass(_this.classFirst);\r\n }\r\n else if (slick.slideCount - 1 === current) {\r\n _this.list.addClass(_this.classLast);\r\n }\r\n else {\r\n _this.list.removeClass(_this.classFirst + \" \" + _this.classLast);\r\n }\r\n });\r\n }\r\n };\r\n USP.prototype.onResize = function () {\r\n var _this = this;\r\n $(window).resize(_.debounce(function () {\r\n var w = $('body').innerWidth();\r\n if (!_this.list.hasClass('slick-initialized') && w < _this.breakpoint) {\r\n _this.initSlick();\r\n }\r\n }, 300));\r\n };\r\n USP.prototype.destroy = function () {\r\n if (this.list.hasClass('slick-initialized')) {\r\n this.list.slick('unslick');\r\n }\r\n };\r\n return USP;\r\n }());\r\n angular.module('TR')\r\n .directive('uniqueSellingPoints', function () {\r\n return {\r\n restrict: 'E',\r\n controllerAs: 'usp',\r\n controller: USP,\r\n scope: {},\r\n bindToController: {\r\n useBreakpoint: '@'\r\n },\r\n link: function (scope, el, attr, controller) {\r\n controller.setup(el);\r\n scope.$on('$destroy', function () {\r\n controller.destroy();\r\n });\r\n }\r\n };\r\n });\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('urgencyMessages', function (urgencyMessaging, arrayUtil, $interval, $timeout) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n estabId: '='\r\n },\r\n template: '

        ',\r\n link: function (scope, el) {\r\n var fade = 500;\r\n var cycle = 5000;\r\n var p = el.find('p:first');\r\n var msgs;\r\n var i = 0;\r\n var loop;\r\n function showMsg() {\r\n i += 1;\r\n p.addClass('faded');\r\n $timeout(function () {\r\n p.text(msgs[i % msgs.length]);\r\n p.removeClass('faded');\r\n }, fade);\r\n }\r\n urgencyMessaging.get(scope.estabId).then(function (stats) {\r\n if (stats != null) {\r\n msgs = arrayUtil.filter([stats.CurrentViewsText, stats.LastBookedDateText, stats.ShortlistCountText], function (msg) {\r\n return msg != null;\r\n });\r\n if (msgs.length > 0) {\r\n p.text(msgs[i]);\r\n if (msgs.length > 1) {\r\n loop = $interval(showMsg, cycle);\r\n }\r\n }\r\n }\r\n });\r\n scope.$on('$destroy', function () {\r\n $interval.cancel(loop);\r\n });\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('user', function ($rootScope, authService, agentModeService) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, el, attr) {\r\n if (attr.user && attr.user.length > 0) {\r\n $rootScope.user = JSON.parse(attr.user);\r\n authService.setUser($rootScope.user);\r\n ($rootScope.user.AnonSignedIn ? authService.getSignedinBooking() : $.when()).then(function (booking) {\r\n if (booking) {\r\n $rootScope.user.Contact = booking.Contact;\r\n $rootScope.user.BookingSummary = booking.Summary;\r\n }\r\n });\r\n if ($rootScope.user.Agent && !$rootScope.agent) {\r\n agentModeService\r\n .getAgentInformation()\r\n .then(function setAgent(data) {\r\n $rootScope.agent = data;\r\n });\r\n }\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n var lettersOnly = /^[À-ÿa-zA-Z_\\-'. ]*$/;\r\n var alphaNumericTenDigits = /^[A-Za-z0-9]{10}$/;\r\n var numericFiveDigits = /^[0-9]{5}$/;\r\n var numericNineDigits = /^[0-9]{9}$/;\r\n var notEnglishLetter = /[À-ÿĀ-ſƀ-ɏɐ-ʯΑ-ϿЀ-ӿԀ-ԯԱ-ևא-ת؀-ۿႠ-ჿ]/;\r\n var multiLangLetters = /^[A-Za-zẞßÀ-ÿĀ-ſƀ-ɏɐ-ʯΑ-ϿЀ-ӿԀ-ԯԱ-ևא-ת؀-ۿႠ-ჿ-.,' ]*$/;\r\n var numbersOnly = /^(\\d+\\.?\\d{0,2}|\\.\\d{1,2})$/;\r\n var numbersSymbols = /[0-9!#$%&@*+/=?^_`{|}~\\\\[\\]]/;\r\n var phoneNum = /^[()0-9 -]+$/;\r\n var flightNumber = /^(([A-Za-z]{2,3})|([A-Za-z]\\d)|(\\d[A-Za-z]))(\\d{1,})([A-Za-z]?)$/;\r\n var email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\n var postcodes = {\r\n Default: /^[A-Za-z\\d\\s]{1,}$/,\r\n GB: /^[A-Za-z\\d\\s]{5,8}$/,\r\n IE: /^[A-Za-z\\d\\s]{2,}$/\r\n };\r\n var requiredLengthRangeRegExp = /^\\[?(\\d+)(?:,(\\d+))?]?$/;\r\n function nullOrEmpty(val) {\r\n return val == null || val.length === 0;\r\n }\r\n function validator(name, watches, failTest, deep, isPureValidator, isObserved) {\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, el, attr, c) {\r\n if (!c) {\r\n return;\r\n }\r\n if (isPureValidator || attr.pureValidator !== undefined) {\r\n c.$validators[name] = function () {\r\n return !failTest(scope, el, attr, c, c.$viewValue, args);\r\n };\r\n }\r\n else {\r\n angular.forEach(watches, function (watch) {\r\n scope.$watch(attr[watch], function () {\r\n c.$setValidity(name, !failTest(scope, el, attr, c, c.$viewValue, args));\r\n }, deep);\r\n });\r\n }\r\n if (isObserved) {\r\n attr.$observe(name, function () {\r\n c.$setValidity(name, !failTest(scope, el, attr, c, c.$viewValue, args));\r\n });\r\n }\r\n }\r\n };\r\n };\r\n }\r\n function objectValidator(name, failTest) {\r\n return function () {\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, el, attr, c) {\r\n function validate(value) {\r\n return !failTest(scope, el, attr, c, value);\r\n }\r\n //For DOM -> model validation\r\n c.$parsers.unshift(function (value) {\r\n var valid = validate(value);\r\n c.$setValidity(name, valid);\r\n return valid ? value : undefined;\r\n });\r\n //For model -> DOM validation\r\n c.$formatters.unshift(function (value) {\r\n c.$setValidity(name, validate(value));\r\n return value;\r\n });\r\n }\r\n };\r\n };\r\n }\r\n TR.directive('emailAddress', [validator('emailAddress', ['ngModel'], function (scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !email.test(value);\r\n })]);\r\n TR.directive('requiredGuest', [objectValidator('requiredGuest', function (scope, el, attr, c, value) {\r\n return attr.requiredGuest && scope.$eval(attr.requiredGuest) && (nullOrEmpty(value) || nullOrEmpty(value.Title) || nullOrEmpty(value.FirstName) || nullOrEmpty(value.LastName));\r\n })]);\r\n TR.directive('lettersOnly', [validator('lettersOnly', ['ngModel'], function (scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !lettersOnly.test(value);\r\n })]);\r\n TR.directive('requiredDate', ['dateUtil', validator('requiredDate', ['ngModel'], function (scope, el, attr, c, value, dependencies) {\r\n return !dependencies[0].isValid(value);\r\n })]);\r\n TR.directive('oneMainDriver', [validator('oneMainDriver', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (attr.oneMainDriver && !scope.$eval(attr.oneMainDriver)) {\r\n return false;\r\n }\r\n if (value) {\r\n var mainDrivers_1 = 0;\r\n angular.forEach(value, function (room) {\r\n angular.forEach(room.Guests, function (guest) {\r\n if (guest.DriverType === 1) {\r\n mainDrivers_1 += 1;\r\n }\r\n });\r\n });\r\n return mainDrivers_1 !== 1;\r\n }\r\n return true;\r\n }, true)]);\r\n TR.directive('numberOfAdditionalDrivers', [validator('numberOfAdditionalDrivers', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (attr.numberOfAdditionalDrivers && !scope.$eval(attr.numberOfAdditionalDrivers)) {\r\n return false;\r\n }\r\n if (value) {\r\n var additionalDrivers_2 = 0;\r\n angular.forEach(value, function (room) {\r\n angular.forEach(room.Guests, function (guest) {\r\n if (guest.DriverType === 2) {\r\n additionalDrivers_2++;\r\n }\r\n });\r\n });\r\n return additionalDrivers_2 !== value.additionalDrivers;\r\n }\r\n return true;\r\n }, true)]);\r\n TR.directive('dobCheck', ['dateUtil', validator('dobcheck', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (value == null) {\r\n return false;\r\n }\r\n value = value.slice(0, 10);\r\n var today = new Date().getTime();\r\n var checkFutureDate = value.split('-');\r\n checkFutureDate = new Date(checkFutureDate[0], checkFutureDate[1] - 1, checkFutureDate[2]).getTime();\r\n return (today - checkFutureDate) < 0;\r\n })]);\r\n TR.directive('ageCheck', ['dateUtil', validator('ageCheck', ['ngModel'], function (scope, el, attr, c, value, dependencies) {\r\n if (value == null) {\r\n return false;\r\n }\r\n if (scope.$eval(attr.validateAge) || scope.guest.Type !== 1) {\r\n return dependencies[0].getAge(value, dependencies[0].zeroTime(new Date(scope.$eval(attr.ageCheck) + \"Z\"))) !== scope.guest.Age;\r\n }\r\n return false;\r\n })]);\r\n TR.directive('expiryCheck', [validator('expiryCheck', ['ngModel'], function (scope, el, attr, c, value) {\r\n var today = new Date();\r\n if (value.year && value.month) {\r\n if (value.year > today.getFullYear()) {\r\n return false;\r\n }\r\n else if (value.year === today.getFullYear()) {\r\n return value.month < (today.getMonth() + 1);\r\n }\r\n }\r\n return true;\r\n })]);\r\n TR.directive('notDefaultMonthYearIf', [validator('notDefaultMonthYearIf', ['notDefaultMonthYearIf', 'ngModel'], function (scope, el, attr, c, value) {\r\n if (scope.$eval(attr.notDefaultMonthYearIf)) {\r\n return !value.year && !value.year > 0 && !value.month && !value.month > 0;\r\n }\r\n return false;\r\n })]);\r\n TR.directive('notDefault', [validator('notDefault', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$modelValue || parseInt(c.$modelValue) === 0;\r\n })]);\r\n TR.directive('mustCheck', [validator('mustCheck', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$modelValue;\r\n })]);\r\n TR.directive('notDefaultIf', [validator('notDefaultIf', ['notDefaultIf', 'ngModel'], function (scope, el, attr, c) {\r\n return attr.notDefaultIf && scope.$eval(attr.notDefaultIf) && (c.$modelValue == null || c.$modelValue === 0);\r\n })]);\r\n TR.directive('numbersOnly', [function () {\r\n return (validator('numbersOnly', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numbersOnly.test(c.$modelValue);\r\n })());\r\n }]);\r\n TR.directive('alphaNumericTenDigits', [function () {\r\n return (validator('alphaNumericTenDigits', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !alphaNumericTenDigits.test(c.$modelValue);\r\n })());\r\n }]);\r\n TR.directive('numericFiveDigits', [function () {\r\n return (validator('numericFiveDigits', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numericFiveDigits.test(c.$modelValue);\r\n })());\r\n }]);\r\n TR.directive('numericNineDigits', [function () {\r\n return (validator('numericNineDigits', ['ngModel'], function (scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numericNineDigits.test(c.$modelValue);\r\n })());\r\n }]);\r\n TR.directive('phoneNum', [validator('phoneNum', ['ngModel'], function (scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !phoneNum.test(value);\r\n })]);\r\n TR.directive('postcodeIf', [validator('postcodeIf', ['postcodeIf', 'ngModel'], function (scope, el, attr, c, value) {\r\n if (scope.$eval(attr.postcodeIf)) {\r\n var exp = _.get(postcodes, scope.$eval(attr.postcodeCountry), postcodes.Default);\r\n return !exp.test(value);\r\n }\r\n return false;\r\n })]);\r\n TR.directive('flightNumber', [validator('flightNumber', ['ngModel'], function (scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !flightNumber.test(value);\r\n })]);\r\n TR.directive('requiredIf', [validator('requiredIf', ['requiredIf', 'ngModel'], function (scope, el, attr, c, value) {\r\n return attr.requiredIf && scope.$eval(attr.requiredIf) && c.$isEmpty(value);\r\n })]);\r\n TR.directive('mustPassCreditCheck', [validator('mustPassCreditCheck', ['mustPassCreditCheck', 'ngModel'], function (scope, el, attr) {\r\n return scope.$eval(attr.mustPassCreditCheck) !== 'green';\r\n })]);\r\n TR.directive('sameAs', [validator('sameAs', ['sameAs', 'ngModel'], function (scope, el, attr, c, value) {\r\n return attr.sameAs && scope.$eval(attr.sameAs) !== value;\r\n })]);\r\n TR.directive('minValue', [validator('minValue', ['minValue', 'ngModel'], function (scope, el, attr, c) {\r\n return !!attr.minValue && (Number(attr.minValue).toFixed(2)) > Number(c.$modelValue);\r\n })]);\r\n TR.directive('maxValue', [validator('maxValue', ['maxValue', 'ngModel'], function (scope, el, attr, c) {\r\n return !!attr.maxValue && (Number(attr.maxValue)).toFixed(2) < Number(c.$modelValue);\r\n }, false, false, true)]);\r\n //required-length=[minValue, maxValue] or required-length=exactValue\r\n //required-length=[3 ,5] means 3<=length<=5\r\n //required-length=5 means length = 5\r\n TR.directive('requiredLength', [validator('requiredLength', ['ngModel'], function (scope, el, _a, c, value) {\r\n var requiredLength = _a.requiredLength;\r\n if (c.$isEmpty(value)) {\r\n value = '';\r\n }\r\n if (c.$isEmpty(requiredLength)) {\r\n throw new Error('For \"required-length\" directive it is not specifed value for length. Must be either \"=[minValue, maxValue]\" or =\"exactValue\"');\r\n }\r\n requiredLength = requiredLength.toString().replace(/\\s/g, '');\r\n var rangeArray = (new RegExp(requiredLengthRangeRegExp)).exec(requiredLength);\r\n //if no any correctly parsed values - validation failing function returns always false, meaning no impact just as validation is absent\r\n if (!rangeArray || rangeArray.length < 3) {\r\n return false;\r\n }\r\n //for exact value, we have only one parsed value, which is minValue and maxValue at once;\r\n if (rangeArray[2] === undefined) {\r\n rangeArray[2] = rangeArray[1];\r\n }\r\n var minValue = rangeArray[1], maxValue = rangeArray[2];\r\n return value.length < minValue || value.length > maxValue;\r\n }, false, true)]);\r\n TR.directive('nameValidation', [validator('nameValidation', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (c.$isEmpty(value)) {\r\n return true;\r\n }\r\n var regExpPattern = new RegExp(/^[a-zA-Z ',.-]{2,255}$/);\r\n return !regExpPattern.test(value);\r\n }, false, true)]);\r\n /*\r\n TR.directive('customFailIf', [validator('customFailIf', ['customFailIf', 'ngModel'], function(scope, el, attr, c, value) {\r\n let r = attr.customFailIf && scope.$eval(attr.customFailIf);\r\n console.log('customFailIf', attr.customFailIf, scope.$eval(attr.customFailIf), r);\r\n return r;\r\n })]);\r\n */\r\n TR.directive('containsEnglishLetters', [validator('containsEnglishLetters', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n var r = new RegExp(notEnglishLetter);\r\n return r.test(value);\r\n }, false, true)]);\r\n TR.directive('containsNumbersSymbols', [validator('containsNumbersSymbols', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n var r = new RegExp(numbersSymbols);\r\n return r.test(value);\r\n }, false, true)]);\r\n TR.directive('onlyMultilangLetters', [validator('onlyMultilangLetters', ['ngModel'], function (scope, el, attr, c, value) {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n var r = new RegExp(multiLangLetters);\r\n return !r.test(value);\r\n }, false, true)]);\r\n TR.directive('currencyInput', ['numberFilter', '$locale', function (numberFilter, $locale) {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n priority: 1,\r\n link: function (scope, el, attra, c) {\r\n c.$parsers.unshift(parseCurrency);\r\n c.$formatters.unshift(formatCurrency);\r\n el.blur(function () {\r\n var v = formatCurrency(parseCurrency(c.$viewValue));\r\n c.$setViewValue(v);\r\n el.val(v);\r\n });\r\n el.keypress(function (e) {\r\n var code = e.keyCode || e.which;\r\n if ($.inArray(code, [9, 13, 27]) !== -1) {\r\n el.blur();\r\n return;\r\n }\r\n if (code >= 48 && code <= 57 ||\r\n code === $locale.NUMBER_FORMATS.GROUP_SEP.charCodeAt(0) ||\r\n $locale.NUMBER_FORMATS.DECIMAL_SEP.charCodeAt(0) === code && e.key !== 'Del' && c.$viewValue.indexOf($locale.NUMBER_FORMATS.DECIMAL_SEP) === -1 ||\r\n //backspace & delete\r\n code === 8 || code === 46 && e.key === 'Del' ||\r\n //Ctrl+A\r\n code === 65 && e.ctrlKey === true ||\r\n // home, end, left, right\r\n code >= 35 && code <= 39) {\r\n return;\r\n }\r\n e.preventDefault();\r\n });\r\n scope.$on('$destroy', function () {\r\n el.off('keydown');\r\n el.off('blur');\r\n });\r\n function parseCurrency(value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var index = value.lastIndexOf($locale.NUMBER_FORMATS.DECIMAL_SEP);\r\n if (index !== -1) {\r\n var first = value.substr(0, index);\r\n var second = value.substr(index + 1);\r\n return parseFloat(first.replace(/\\D/g, '') + \".\" + second.replace(/\\D/g, '')).toFixed(2);\r\n }\r\n return parseFloat(value.replace(/\\D/g, '')).toFixed(2);\r\n }\r\n function formatCurrency(value) {\r\n if (value) {\r\n return numberFilter(parseFloat(value), 2);\r\n }\r\n }\r\n }\r\n };\r\n }]);\r\n // Allow only 9 numeric characters as input for Skywards ID and restrict other characters\r\n TR.directive('skywardsId', function () {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link: function (scope, element, attrs, ngModel) {\r\n if (!ngModel) {\r\n return;\r\n }\r\n ngModel.$parsers.unshift(function (inputValue) {\r\n var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s !== ' '); }).join('');\r\n if (digits.length > 9) {\r\n digits = digits.substr(0, 9);\r\n }\r\n ngModel.$viewValue = digits;\r\n ngModel.$render();\r\n return digits;\r\n });\r\n }\r\n };\r\n });\r\n TR.directive('skywardsNumericNineDigits', ['$http', function ($http) {\r\n return (validator('skywardsNumericNineDigits', ['ngModel'], function (scope, el, attr, c) {\r\n var rawSkywardsValue = scope.$eval(attr.skywardsNumericNineDigits);\r\n var invalidDigits = !c.$isEmpty(rawSkywardsValue) && !numericNineDigits.test(rawSkywardsValue);\r\n if (invalidDigits) {\r\n return true;\r\n }\r\n else if (!c.$isEmpty(rawSkywardsValue)) {\r\n var skywardsUrl = '/api/skywards/Validation/';\r\n return $http.get(\"\" + skywardsUrl + rawSkywardsValue).then(function (res) {\r\n if (res.data) {\r\n c.$setValidity('skywardsNumericNineDigits', true);\r\n }\r\n return !res.data;\r\n });\r\n }\r\n if (c.$isEmpty(rawSkywardsValue)) {\r\n return false;\r\n }\r\n return true;\r\n })());\r\n }]);\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.directive('validPassword', function () {\r\n var total = 0;\r\n var upperCase = new RegExp('[A-Z]');\r\n var lowerCase = new RegExp('[a-z]');\r\n var numbers = new RegExp('[0-9]');\r\n var specialchars = new RegExp('([!,%,&,@,#,$,^,*,?,_,-,~,+])');\r\n var twoOrMoreUpperCase = new RegExp('[A-Z]', 'g');\r\n var twoOrMoreNumbers = new RegExp('[0-9]', 'g');\r\n var twoOrMoreNumbersSpecialchars = new RegExp('([!,%,&,@,#,$,^,*,?,_,-,~,+])', 'g');\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function (scope, el, a, c) {\r\n c.$parsers.unshift(function (value) {\r\n checkStrength(value);\r\n return value;\r\n });\r\n scope.strength = function () {\r\n if (total <= 0) {\r\n return 'EMPTY';\r\n }\r\n else if (total === 1) {\r\n return 'POOR';\r\n }\r\n else if (total === 2) {\r\n return 'VERYWEAK';\r\n }\r\n else if (total === 3) {\r\n return 'WEAK';\r\n }\r\n else if (total === 4) {\r\n return 'MEDIUM';\r\n }\r\n else if (total === 5) {\r\n return 'GOOD';\r\n }\r\n else if (total > 5) {\r\n return 'STRONG';\r\n }\r\n };\r\n function boolToInt(b) {\r\n return b ? 1 : 0;\r\n }\r\n function checkStrength(val) {\r\n total = 0;\r\n if (val !== null && val !== undefined) {\r\n total = boolToInt(val.length >= 8) +\r\n boolToInt(val.match(upperCase)) +\r\n boolToInt(val.match(lowerCase)) +\r\n boolToInt(val.match(numbers)) +\r\n boolToInt(val.match(specialchars)) +\r\n boolToInt((val.match(twoOrMoreUpperCase) || []).length > 1) +\r\n boolToInt((val.match(twoOrMoreNumbers) || []).length > 1) +\r\n boolToInt((val.match(twoOrMoreNumbersSpecialchars) || []).length > 1);\r\n }\r\n scope.$emit('passwordStrength', { strength: total, label: scope.strength() });\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n var TR = angular.module('TR');\r\n TR.filter('relativeCurrency', function ($filter) {\r\n return function (amount, relativeTo) {\r\n var diff = amount - relativeTo;\r\n return $filter('roundedCurrency')(diff);\r\n };\r\n });\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('actionTemplateService', actionTemplateService);\r\n function actionTemplateService(dateUtil, $http, $rootScope, resourceService) {\r\n var validEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n var actionUtils = {\r\n PAYBALANCE: {\r\n format: String.format,\r\n addDays: (function () {\r\n var today = new Date();\r\n return function (days) {\r\n return dateUtil\r\n .addDays(today, days)\r\n .toDateString();\r\n };\r\n })()\r\n },\r\n VOUCHERACTIONS: {\r\n sendConfirmationEmail: (function () {\r\n var cultureCode = TRPCONFIG.Domain.CultureCode;\r\n return function (emails, bookingId) {\r\n var emailsArray = emails.split(',');\r\n for (var i = emailsArray.length - 1; i >= 0; i--) {\r\n var email = emailsArray[i].trim();\r\n if (!validEmail.test(email)) {\r\n $rootScope.$broadcast('flash:error', String.format(resourceService.get('VOUCHERINVALID'), email));\r\n return;\r\n }\r\n }\r\n $http.post('/api2/managebooking/sendconfirmationemail', { BookingId: bookingId, Culture: cultureCode, Emails: emailsArray });\r\n $rootScope.$broadcast('flash:success', resourceService.get('VOUCHERSENT'));\r\n };\r\n })()\r\n }\r\n };\r\n var service = {\r\n getUtils: function (name) { return actionUtils[name]; }\r\n };\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('advertService', advertService);\r\n function advertService($http, pageStrand) {\r\n var service = {\r\n getAdvertsForPosition: getAdvertsForPosition,\r\n getUrl: getUrl\r\n };\r\n function getUrl() {\r\n return TRPCONFIG.AdvertImagesClientDomain + \"/api2/squibs/\";\r\n }\r\n function getAdvertsForPosition(positionId, destination) {\r\n return $http.get(TRPCONFIG.AdvertServiceClientDomain + \"/api2/squibs/getsquibsforposition?\" + $.param({\r\n CountryId: destination.CountryId,\r\n ProvinceId: destination.ProvinceId,\r\n LocationId: destination.LocationId,\r\n PlaceId: destination.PlaceId,\r\n EstablishmentId: destination.EstablishmentId,\r\n PolygonId: destination.PolygonId,\r\n PageStrand: pageStrand.fromRoute(destination),\r\n PositionId: positionId,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n v: TRPCONFIG.CurrentVersion,\r\n Domain: location.host\r\n }), { cache: true, ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('analytics', analytics);\r\n function analytics(broker, $http, $timeout, $document, $location, $q, $rootScope, $route, abTest, loggingService, searchUnitService, currentUser, tripService, cookieService, unadjustedDateFilter) {\r\n var lastUrl;\r\n var lastAbs;\r\n var timer;\r\n var timers = [];\r\n var url = '/api2/analytics/';\r\n var _defer = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.setTimeout;\r\n var skipAnalytics = (/prerender/i.test(navigator.userAgent) || !TRPCONFIG.Domain.GoogleTagManagerEnabled) && !TRPCONFIG.IsUnitTestForAnalytics;\r\n var searchTypes = {\r\n 1: 'FlightSearch',\r\n 2: 'HotelSearch',\r\n 3: 'HolidaySearch',\r\n 4: 'TransferSearch',\r\n 6: 'ParkingSearch'\r\n };\r\n var service = {\r\n trackEvent: trackEvent,\r\n trackTiming: trackTiming,\r\n trackConversion: trackConversion,\r\n trackSearchOrigin: trackSearchOrigin,\r\n pageLoad: pageLoad,\r\n routeChange: routeChange,\r\n startTimer: startTimer,\r\n endTimer: endTimer,\r\n track: track,\r\n incrementPeopleEvent: incrementPeopleEvent,\r\n trackRequestedHotelNotAvailable: trackRequestedHotelNotAvailable,\r\n setMixpanelEmail: setMixpanelEmail\r\n };\r\n var noop = function () { return $q.when(); };\r\n if (skipAnalytics) {\r\n for (var func in service) {\r\n service[func] = noop;\r\n }\r\n }\r\n var utmId;\r\n var _mixPanelReady = subscribeOnceAsPromise('userSet')\r\n .then(function () {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ config: TRPCONFIG });\r\n utmId = currentUser.get() ? currentUser.get().UtmId : null;\r\n if (utmId === '') {\r\n return $q.reject();\r\n }\r\n })\r\n .then(function () {\r\n window.dataLayer.push({ utmId: utmId });\r\n return TRPCONFIG.MixPanelLoaded || subscribeOnceAsPromise('MixPanelLoaded');\r\n })\r\n .then(function () {\r\n window.mixpanel.register({ 'Device Category': TRPCONFIG.DeviceCategory, 'Platform': TRPCONFIG.Domain.DeviceType + \"Web\" });\r\n window.mixpanel.register({ Domain: extractDomain() });\r\n window.mixpanel.register({ BookingLanguage: TRPCONFIG.Domain.CultureCode });\r\n var distinctId = window.mixpanel.get_distinct_id();\r\n window.mixpanel.identify(distinctId.indexOf('-') > -1 ? utmId : distinctId);\r\n TRPCONFIG.MixPanelReady = true;\r\n });\r\n function extractDomain() {\r\n var match = window.location.href.match(/([a-z]+.(com|co.uk|ru|ae)\\/*[a-z]+_[a-z0-9]+\\/)/g);\r\n if (match) {\r\n return match[0];\r\n }\r\n match = window.location.hostname.match(/\\..+\\..+/g);\r\n if (match) {\r\n return match[0].slice(1);\r\n }\r\n return window.location.hostname;\r\n }\r\n function startTimer(key) {\r\n var opts = {\r\n action: key,\r\n category: 'performance',\r\n label: 'loading screen timeout'\r\n };\r\n if (timers[key] != null) {\r\n $timeout.cancel(timers[key][0]);\r\n }\r\n timers[key] = [\r\n $timeout(function () {\r\n trackEvent(opts);\r\n var utm = currentUser.get().UtmId;\r\n loggingService.logWarn(\"customer with utm \" + utm + \" and userAgent \" + navigator.userAgent + \" experienced a loading screen timeout with key \\\"\" + opts.action + \"\\\"\");\r\n }, 30000), new Date().getTime()\r\n ];\r\n }\r\n function endTimer(key) {\r\n timer = timers[key];\r\n if (timer != null) {\r\n $timeout.cancel(timer[0]);\r\n var opts = {\r\n timingCategory: 'performance',\r\n timingVar: key,\r\n timingValue: new Date().getTime() - timer[1],\r\n timingLabel: 'LoadingScreen'\r\n };\r\n trackTiming(opts);\r\n delete timers[key];\r\n }\r\n }\r\n function trackTiming(opts) {\r\n opts = angular.extend({ timingCategory: 'performance', timingVar: 'timer', timingLabel: null, timingValue: null }, opts || {});\r\n _defer(function () {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({\r\n event: 'timingEvent',\r\n category: opts.timingCategory,\r\n variable: opts.timingVar || '',\r\n time: opts.timingValue,\r\n label: opts.timingLabel\r\n });\r\n });\r\n }\r\n function trackEvent(opts) {\r\n opts = angular.extend({ category: 'button', action: 'click', label: null, value: null }, opts || {});\r\n _defer(function () {\r\n window.dataLayer = window.dataLayer || [];\r\n var obj = {\r\n event: 'clickEvent',\r\n category: opts.category,\r\n action: opts.action,\r\n value: opts.value,\r\n label: opts.label\r\n };\r\n if (TRPCONFIG.Domain.TenantId === 3) {\r\n obj = angular.extend(obj, _.pick(opts, 'dimension3', 'dimension4', 'dimension5', 'dimension6', 'dimension7', 'dimension8'));\r\n }\r\n window.dataLayer.push(obj);\r\n });\r\n }\r\n function trackConversion(value) {\r\n if (TRPCONFIG.Domain.GoogleConversionId !== 0) {\r\n /* eslint-disable camelcase */\r\n var conversionObject = {\r\n google_conversion_id: TRPCONFIG.Domain.GoogleConversionId,\r\n google_conversion_language: 'en',\r\n google_conversion_color: 'ffffff',\r\n google_remarketing_only: false,\r\n google_conversion_value: value || 1,\r\n google_conversion_format: 1\r\n };\r\n if (TRPCONFIG.Domain.GoogleConversionLabel) {\r\n conversionObject.google_conversion_label = TRPCONFIG.Domain.GoogleConversionLabel;\r\n }\r\n if (TRPCONFIG.Domain.GoogleConversionFormat) {\r\n conversionObject.google_conversion_format = TRPCONFIG.Domain.GoogleConversionFormat;\r\n }\r\n if (window.google_trackConversion) {\r\n window.google_trackConversion(conversionObject);\r\n }\r\n /* eslint-enable camelcase */\r\n }\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ event: 'bookingcomplete' });\r\n }\r\n function trackSearchOrigin(tripId, requestedUrl) {\r\n if (TRPCONFIG.Domain.TrackSearchOriginEnabled) {\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n var request = {\r\n RequestedUrl: requestedUrl,\r\n AcomSearchId: trip && trip.HotelsRequest && trip.HotelsRequest.AvailabilitySearchId,\r\n FlightSearchId: trip && trip.FlightsRequest && trip.FlightsRequest.AvailabilitySearchId\r\n };\r\n if (request.AcomSearchId || request.FlightSearchId) {\r\n return $http.post(url + \"tracksearchorigin\", request, { ignoreErrors: true });\r\n }\r\n });\r\n }\r\n }\r\n function pageLoad(pageUrl) {\r\n _defer(function () {\r\n $http.post(url + \"trackpageloadtimings\", {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Url: pageUrl,\r\n Timings: window.performance ? window.performance.timing : null\r\n }, { ignoreErrors: true });\r\n updateCriteoId();\r\n });\r\n var query = $location.search();\r\n updateSalesForceParameters(query);\r\n if (query.source != null && query.dlid != null) {\r\n _defer(function () {\r\n $http.post(url + \"trackdeeplink\", {\r\n DeepLinkId: query.dlid\r\n }, { ignoreErrors: true });\r\n });\r\n }\r\n }\r\n function updateSalesForceParameters(queryParams) {\r\n var hostName = window.location.hostname;\r\n var cookieDomain = hostName.slice(hostName.indexOf('.'));\r\n var params = _.pick(queryParams, ['j', 'sfmc_sub', 'l', 'u', 'jb', 'mid', 'e']);\r\n if (params.j && params.sfmc_sub && params.l && params.jb && params.mid && params.u) {\r\n var salesForceParams = _.entries(params).map(function (_a) {\r\n var key = _a[0], value = _a[1];\r\n delete queryParams[key];\r\n return key + \"=\" + value;\r\n }).join('&');\r\n cookieService.set('salesforce', salesForceParams, null, cookieDomain);\r\n $location.search(queryParams);\r\n }\r\n }\r\n function updateCriteoId() {\r\n var ctoOptOut = cookieService.get('cto_optout');\r\n var optOut = ctoOptOut === '1';\r\n var criteoId = optOut ? '' : cookieService.get('cto_axid');\r\n if (optOut || criteoId) {\r\n $http.post(url + \"updatecriteoid\", {\r\n CriteoId: criteoId,\r\n OptOut: optOut\r\n }, {\r\n ignoreErrors: true\r\n });\r\n }\r\n }\r\n function routeChange(absUrl, relUrl) {\r\n //double check that the route has actually changed because we suspect that this may\r\n //get called repeatedly when we go into an infinite digest loop which we have not yet resolved.\r\n if (relUrl === lastUrl) {\r\n return;\r\n }\r\n lastUrl = relUrl;\r\n if (relUrl && relUrl === '/' || relUrl === '/v2/') {\r\n track('mixpanel', 'HomePage');\r\n _mixPanelReady.then(function () { return window.mixpanel.people.increment('Home Page Visit'); });\r\n }\r\n _defer(function () {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ event: 'virtualPageView', virtualPageURL: relUrl });\r\n // abTest.executeTrackingCode('body');\r\n $http.post('website/monkey/tennis', {\r\n Url: absUrl,\r\n ReferrerUrl: lastAbs == null ? $document[0].referrer : lastAbs\r\n }, { ignoreErrors: true }).then(function checkVersionMismatch(res) {\r\n if (res.data !== TRPCONFIG.CurrentVersion) {\r\n _inactivityTime();\r\n }\r\n });\r\n lastAbs = absUrl;\r\n });\r\n }\r\n function track(type, event, props) {\r\n switch (type) {\r\n case 'mixpanel':\r\n _mixPanelTrack(event, props);\r\n break;\r\n case 'Search':\r\n _searchCompleted(event, props);\r\n break;\r\n case 'Event':\r\n _pushTripTypeToDataLayer().then(function () { return window.dataLayer.push(_.assignIn({ event: event }, props)); });\r\n break;\r\n case 'mixpanelPeople':\r\n _trackPeople(event, props);\r\n break;\r\n case 'eCommerce':\r\n _ecommerce(event, props);\r\n break;\r\n case 'eCommercePaypal':\r\n _ecommercePaypal(event, props);\r\n break;\r\n }\r\n }\r\n function _ecommerce(event, data) {\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommerceLogEnabled) {\r\n console.log('ecommerce data', _collectEcommerceData(event, data));\r\n }\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommercePushEnabled) {\r\n var ecommerceData = _collectEcommerceData(event, data);\r\n sessionStorage.setItem('eCommercePurchaseData', JSON.stringify(ecommerceData));\r\n }\r\n }\r\n function _ecommercePaypal(event, paypalData) {\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommerceLogEnabled) {\r\n console.log('ecommerce paypal data', _collectEcommercePaypalData(event, paypalData));\r\n }\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommercePushEnabled) {\r\n var ecommercePaypalData = _collectEcommercePaypalData(event, paypalData);\r\n window.dataLayer.push(ecommercePaypalData);\r\n }\r\n }\r\n function _collectEcommerceData(event, data) {\r\n return {\r\n event: event,\r\n ecommerce: {\r\n purchase: {\r\n actionField: _collectActionData(data, function (_a) {\r\n var BookingReferences = _a.BookingReferences, Trip = _a.Trip;\r\n return ({\r\n id: BookingReferences.sort()[0],\r\n revenue: Math.round(Trip.Bookings.reduce(function (acc, _a) {\r\n var Balance = _a.Balance;\r\n return acc + Balance.ClientTotalCost;\r\n }, 0) * 100) / 100\r\n });\r\n }),\r\n products: _collectProductData(data, function (_a) {\r\n var Trip = _a.Trip;\r\n return Trip.Bookings.map(function (_a) {\r\n var Balance = _a.Balance, BookingCore = _a.BookingCore, Itinerary = _a.Itinerary;\r\n var BookingRef = BookingCore.BookingRef;\r\n var category = _getCategoryFromBookingRef(BookingRef);\r\n var name = {\r\n Accommodation: function (_a) {\r\n var FirstStay = _a.Stays[0];\r\n return FirstStay.Hotel.Title;\r\n },\r\n Flight: function (_a) {\r\n var OutboundFlight = _a.Flights[0];\r\n return OutboundFlight.Segments[OutboundFlight.Segments.length - 1].ArrivalAirport.Title;\r\n },\r\n Transfer: function (_a) {\r\n var Transfers = _a.Transfers;\r\n return _getTransferName(Transfers);\r\n },\r\n Insurance: function (_a) {\r\n var Description = _a.Description;\r\n return Description;\r\n },\r\n Car: function (_a) {\r\n var PickUpPointName = _a.PickUpPointName, DropOffPointName = _a.DropOffPointName;\r\n return PickUpPointName + \" \" + DropOffPointName;\r\n },\r\n Attractions: function (_a) {\r\n var FirstTicket = _a.Tickets[0];\r\n return FirstTicket.Description;\r\n },\r\n Parking: function (_a) {\r\n var ParkingSiteName = _a.ParkingSiteName;\r\n return ParkingSiteName;\r\n }\r\n }[category](Itinerary);\r\n return {\r\n id: BookingRef,\r\n category: category,\r\n name: name,\r\n price: Balance.ClientTotalCost\r\n };\r\n });\r\n })\r\n }\r\n }\r\n };\r\n }\r\n function _collectEcommercePaypalData(event, data) {\r\n return {\r\n event: event,\r\n ecommerce: {\r\n purchase: {\r\n actionField: _collectActionData(data, function (data) {\r\n var reducedData = data.reduce(function (acc, _a) {\r\n var Ref = _a.Ref, Cost = _a.Cost;\r\n acc.id.push(Ref);\r\n acc.revenue += Cost;\r\n return acc;\r\n }, {\r\n id: [],\r\n revenue: 0\r\n });\r\n return {\r\n id: reducedData.id.sort()[0],\r\n revenue: Math.round(reducedData.revenue * 100) / 100,\r\n };\r\n }),\r\n products: _collectProductData(data, function (data) { return data.map(function (_a) {\r\n var Cost = _a.Cost, Desc = _a.Desc, Ref = _a.Ref;\r\n var category = _getCategoryFromBookingRef(Ref);\r\n return {\r\n id: Ref,\r\n category: category,\r\n name: Desc,\r\n price: Cost\r\n };\r\n }); })\r\n }\r\n }\r\n };\r\n }\r\n function _collectActionData(data, _collectActionVariations) {\r\n var variations = _collectActionVariations(data);\r\n return __assign({}, variations, { affiliation: TRPCONFIG.Domain.DomainId, tax: '0', shipping: '', coupon: '' });\r\n }\r\n function _collectProductData(data, _collectProductVariations) {\r\n var variations = _collectProductVariations(data);\r\n var products = variations.map(function (variation) { return (__assign({}, variation, { quantity: 1 })); });\r\n var holidayCategories = [{ category: 'Accommodation' }, { category: 'Flight' }];\r\n var holidayComparator = function (a, b) { return a.category === b.category; };\r\n var holidayCollection = _.intersectionWith(products, holidayCategories, holidayComparator);\r\n if (holidayCollection.length === holidayCategories.length) {\r\n var category = 'Holiday';\r\n var holidayData = holidayCollection.reduce(function (acc, _a) {\r\n var id = _a.id, name = _a.name, price = _a.price;\r\n acc.id.push(id);\r\n acc.name.push(name);\r\n acc.price += price;\r\n return acc;\r\n }, {\r\n id: [],\r\n name: [],\r\n price: 0,\r\n });\r\n return _.concat({\r\n id: holidayData.id.join('|'),\r\n category: category,\r\n name: holidayData.name.join('|'),\r\n price: Math.round(holidayData.price * 100) / 100,\r\n quantity: 1\r\n }, _.differenceWith(products, holidayCategories, holidayComparator));\r\n }\r\n return products;\r\n }\r\n function _getCategoryFromBookingRef(bookingRef) {\r\n return {\r\n ACM: 'Accommodation',\r\n SCH: 'Flight',\r\n EUF: 'Flight',\r\n TRN: 'Transfer',\r\n INS: 'Insurance',\r\n AUT: 'Car',\r\n OLF: 'Attractions',\r\n PRK: 'Parking'\r\n }[_getBookingPrefixFromBookingRef(bookingRef)];\r\n }\r\n function _getBookingPrefixFromBookingRef(bookingRef) {\r\n return bookingRef.match(/[a-zA-Z]+/g)[0];\r\n }\r\n function _getTransferName(_a) {\r\n var itinerary = _a[0];\r\n if (itinerary.DropOffPoint && itinerary.PickUpPoint) {\r\n return itinerary.DropOffPoint.ResortName + \" | Return\";\r\n }\r\n if (itinerary.DropOffPoint) {\r\n return itinerary.DropOffPoint.ResortName + \" | One way (Resort to Airport)\";\r\n }\r\n if (itinerary.PickUpPoint) {\r\n return itinerary.PickUpPoint.AirportName + \" | One way (Airport to Resort)\";\r\n }\r\n }\r\n function _pushTripTypeToDataLayer() {\r\n var tripId = $route && $route.current && $route.current.params && $route.current.params.tripId;\r\n if (tripId) {\r\n return tripService.getTrip(tripId).then(function (t) {\r\n if (t && t.TripType) {\r\n window.dataLayer.push({ tripType: t.TripType });\r\n }\r\n });\r\n }\r\n return $q.when();\r\n }\r\n function _searchCompleted(event, props) {\r\n var config = {\r\n event: searchTypes[event],\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n CountryCode: 'UK'\r\n };\r\n window.dataLayer.push(_.assignIn(config, props));\r\n }\r\n var mixPanelBookingInfoPropsCache = {};\r\n function _mixPanelTrack(event, props) {\r\n _mixPanelReady.then(function () {\r\n if (props == null) {\r\n window.mixpanel.track(event);\r\n }\r\n else {\r\n var formattedProps = void 0;\r\n switch (event) {\r\n case 'Search':\r\n formattedProps = _formatMixpanelSearch(props);\r\n break;\r\n case 'BookingComplete':\r\n case 'BookingForm':\r\n mixPanelBookingInfoPropsCache = formattedProps = _formatMixpanelBookingInfo(props);\r\n break;\r\n case 'FormValidation':\r\n formattedProps = _formatMixpanelFormValidation(props, mixPanelBookingInfoPropsCache);\r\n break;\r\n default:\r\n formattedProps = _flattenObject(props);\r\n }\r\n window.mixpanel.track(event, formattedProps);\r\n }\r\n });\r\n }\r\n function _flattenObject(obj) {\r\n var newObj = {};\r\n if (typeof obj !== 'object') {\r\n return obj;\r\n }\r\n for (var i in obj) {\r\n if (!obj.hasOwnProperty(i)) {\r\n continue;\r\n }\r\n if (Array.isArray(obj[i])) {\r\n newObj[i] = [];\r\n for (var j = 0; j < obj[i].length; j++) {\r\n newObj[i].push(_flattenObject(obj[i][j]));\r\n }\r\n }\r\n else if ((typeof obj[i]) === 'object') {\r\n var flatObject = _flattenObject(obj[i]);\r\n for (var x in flatObject) {\r\n if (!flatObject.hasOwnProperty(x)) {\r\n continue;\r\n }\r\n newObj[i + \".\" + x] = flatObject[x];\r\n }\r\n }\r\n else {\r\n newObj[i] = obj[i];\r\n }\r\n }\r\n return newObj;\r\n }\r\n function _formatMixpanelSearch(search) {\r\n var counts = { Adults: 0, Children: 0, Rooms: 0 };\r\n var Nights = search.Nights;\r\n var DepartureAirports = search.DepartureAirports;\r\n var TypeTitle = search.TypeTitle;\r\n var Destination = _.pick(search.Destination, 'CountryId', 'LocationId', 'PlaceId', 'PolygonId', 'ProvinceId', 'EstablishmentId', 'ShortTitle');\r\n var dateTimeFormat = 'dd MMM yyyy HH:mm';\r\n var FromDate = search.FromDate ? unadjustedDateFilter(search.FromDate.Date, dateTimeFormat) : undefined;\r\n var ToDate = search.ToDate ? unadjustedDateFilter(search.ToDate.Date, dateTimeFormat) : undefined;\r\n if (search.Rooms) {\r\n search.Rooms.reduce(function (c, r) {\r\n c.Adults += r.Adults;\r\n c.Children += (r.ChildAges || []).length;\r\n c.Rooms += 1;\r\n return c;\r\n }, counts);\r\n }\r\n var result = _.assignIn({\r\n Nights: Nights,\r\n TypeTitle: TypeTitle,\r\n DepartureAirports: DepartureAirports,\r\n FromDate: FromDate,\r\n ToDate: ToDate,\r\n }, counts, Destination);\r\n if (search.SearchType === 3 || search.SearchType === 1) {\r\n var cabinId = search.Cabin || _.get(search, 'searchModel.cabin');\r\n result.Cabin = ({ 1: 'Economy', 2: 'PremiumEconomy', 8: 'Business', 4: 'First' })[cabinId];\r\n result.FlexibleDates = _.get(search, 'searchModel.flexibleDates');\r\n if (angular.isUndefined(result.FlexibleDates)) {\r\n result.FlexibleDates = searchUnitService.flexibleDates;\r\n }\r\n if (search.searchModel) {\r\n result.CarrierAirlines = _.map(search.searchModel.airlines, function (a) { return a.Title; });\r\n result.DirectFlightsOnly = search.searchModel.prefilterDirectFlights;\r\n }\r\n }\r\n return result;\r\n }\r\n function _formatMixpanelBookingInfo(data) {\r\n var result = {\r\n TotalCost: data.TotalCost,\r\n HasHotel: !!(data.Hotel && data.Hotel.ProductId),\r\n HasFlight: !!(data.Flight && data.Flight.ProductId),\r\n HasBags: !!_.get(data, 'Flight.ProductSpecificFields.OptionCounts.HoldBags'),\r\n HasSeats: !!_.get(data, 'Flight.ProductSpecificFields.OptionCounts.Seats'),\r\n HasAttraction: !!(data.Attractions && data.Attractions.length > 0),\r\n HasCarHire: !!(data.CarHire && data.CarHire.ProductId),\r\n HasInsurance: !!(data.Insurance && data.Insurance.ProductId),\r\n HasParking: !!(data.Parking && data.Parking.ProductId),\r\n HasTransfer: !!(data.Transfer && data.Transfer.ProductId),\r\n HasMarhaba: !!(data.Marhaba && data.Marhaba.ProductId),\r\n PageVersion: data.PageVersion || null,\r\n Source: data.Source || 'default'\r\n };\r\n if (result.HasTransfer === true) {\r\n result.TransferCostTotal = _.reduce(data.Transfer.CostBreakdown, function (result, v) { return result + (v.UnitAmount * v.Quantity); }, 0);\r\n }\r\n return result;\r\n }\r\n function _formatMixpanelFormValidation(props, mixPanelBookingInfoPropsCache) {\r\n var result = _.merge({}, mixPanelBookingInfoPropsCache);\r\n var uniqueErrors = {};\r\n iterate(props.form, 0);\r\n result.ValidationFail = Object.keys(uniqueErrors);\r\n _.forEach(props.validationMessages, function (m) { return result.ValidationFail.push(m); });\r\n return result;\r\n function iterate(element, stackDepth) {\r\n if (element && stackDepth < 5) {\r\n _.forEach(element.$error, function (error, key) {\r\n if (error === true) {\r\n key = key.replace('If', '');\r\n key = key + \" - \" + element.$name;\r\n uniqueErrors[key] = true;\r\n }\r\n else {\r\n _.forEach(error, iterate, stackDepth + 1);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n var _inactivityTimeToken;\r\n function _inactivityTime() {\r\n if (!_inactivityTimeToken) {\r\n $(document)\r\n .on('mousemove', _resetTimer)\r\n .on('keypress', _resetTimer);\r\n $(document.body)\r\n .on('touchstart', _resetTimer)\r\n .on('touchmove', _resetTimer)\r\n .on('touchend', _resetTimer);\r\n _resetTimer();\r\n }\r\n function _reload() {\r\n document.location.reload();\r\n }\r\n function _resetTimer() {\r\n clearTimeout(_inactivityTimeToken);\r\n _inactivityTimeToken = setTimeout(_reload, 10 * 1000);\r\n }\r\n }\r\n function _trackPeople(event, props) {\r\n _mixPanelReady.then(function () {\r\n switch (event) {\r\n case 'Search':\r\n _trackPeopleSearch(props);\r\n break;\r\n case 'BookingComplete':\r\n _trackPeopleBookingCompleter(props);\r\n break;\r\n }\r\n });\r\n }\r\n function _trackPeopleSearch(props) {\r\n window.mixpanel.people.increment('Total Searches');\r\n window.mixpanel.people.set({ 'Last Search Date': new Date() });\r\n if (props.Destination) {\r\n window.mixpanel.people.append('Search terms', props.Destination.ShortTitle ? props.Destination.ShortTitle : props.Destination.Title);\r\n }\r\n }\r\n function _trackPeopleBookingCompleter(props) {\r\n window.mixpanel.people.increment('Bookings Completed');\r\n window.mixpanel.people.append('Total value per booking', props.TotalCost);\r\n window.mixpanel.people.increment('Lifetime value', props.TotalCost);\r\n }\r\n function incrementPeopleEvent(event, value) {\r\n if (value === void 0) { value = 1; }\r\n _mixPanelReady.then(function () { return window.mixpanel.people.increment(event, value); });\r\n }\r\n function setMixpanelEmail(email) {\r\n _mixPanelReady.then(function () { return window.mixpanel.people.set({\r\n $email: email\r\n }); });\r\n }\r\n trackRequestedHotelNotAvailable.idCache = {};\r\n function trackRequestedHotelNotAvailable(destinationEstabId) {\r\n if (!trackRequestedHotelNotAvailable.idCache[destinationEstabId]) {\r\n trackRequestedHotelNotAvailable.idCache[destinationEstabId] = true;\r\n track('mixpanel', 'RequestedHotelNotAvailable', { destinationEstabId: destinationEstabId });\r\n }\r\n }\r\n function subscribeOnceAsPromise(topic) {\r\n return $q(function (resolve) { return broker.subscribeOnce('analytics', topic, function () { return resolve(); }); });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n // Not at all happy about hard-coding these, but the api is still outstanding: API-827\r\n var localAirports = (function () {\r\n if (TRPCONFIG.Domain.EnableStaticDepartureAirports) {\r\n return [\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,STN' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' }\r\n ];\r\n }\r\n if (TRPCONFIG.Domain.DomainId === 2) {\r\n return [\r\n { Title: 'Belfast and Dublin - All Airports', Code: 'BFS,BHD,DUB' },\r\n { Title: 'Ireland - All Airports', Code: 'BHD,BFS,ORK,LDY,KIR,NOC,DUB,CFN,SNN' },\r\n { Title: 'Belfast City', Code: 'BHD' },\r\n { Title: 'Belfast International', Code: 'BFS' },\r\n { Title: 'Dublin', Code: 'DUB' },\r\n { Title: 'Cork', Code: 'ORK' },\r\n { Title: 'Derry', Code: 'LDY' },\r\n { Title: 'Donegal', Code: 'CFN' },\r\n { Title: 'Kerry', Code: 'KIR' },\r\n { Title: 'Knock', Code: 'NOC' },\r\n { Title: 'Shannon', Code: 'SNN' },\r\n //{ Title: 'Waterford', Code: 'WAT' },\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,LTN,SEN,STN,LCY' },\r\n { Title: 'Midlands - All Airports', Code: 'BHX,EMA' },\r\n { Title: 'North West - All Airports', Code: 'LPL,MAN' },\r\n { Title: 'North East - All Airports', Code: 'DSA,HUY,LBA,MME,NCL' },\r\n { Title: 'South East - All Airports', Code: 'LGW,LHR,SOU' },\r\n { Title: 'South West - All Airports', Code: 'BOH,BRS,CWL,EXT,NQY,SOU' },\r\n { Title: 'Scotland - All Airports', Code: 'ABZ,EDI,GLA,INV,PIK' },\r\n { Title: 'Aberdeen (ABZ)', Code: 'ABZ' },\r\n { Title: 'Belfast City George Best (BHD)', Code: 'BHD' },\r\n { Title: 'Belfast International (BFS)', Code: 'BFS' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Bournemouth (BOH)', Code: 'BOH' },\r\n { Title: 'Bristol (BRS)', Code: 'BRS' },\r\n { Title: 'Cardiff (CWL)', Code: 'CWL' },\r\n { Title: 'Derry (LDY)', Code: 'LDY' },\r\n { Title: 'Dublin (DUB)', Code: 'DUB' },\r\n { Title: 'Durham Tees Valley (MME)', Code: 'MME' },\r\n { Title: 'East Midlands (EMA)', Code: 'EMA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' },\r\n { Title: 'Exeter (EXT)', Code: 'EXT' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Glasgow Prestwick (PIK)', Code: 'PIK' },\r\n { Title: 'Guernsey (GCI)', Code: 'GCI' },\r\n { Title: 'Humberside (HUY)', Code: 'HUY' },\r\n { Title: 'Inverness (INV)', Code: 'INV' },\r\n { Title: 'Isle of Man (IOM)', Code: 'IOM' },\r\n { Title: 'Jersey (JER)', Code: 'JER' },\r\n { Title: 'Leeds (LBA)', Code: 'LBA' },\r\n { Title: 'Liverpool John Lennon (LPL)', Code: 'LPL' },\r\n { Title: 'London City (LCY)', Code: 'LCY' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Luton (LTN)', Code: 'LTN' },\r\n { Title: 'London Southend (SEN)', Code: 'SEN' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Newquay (NQY)', Code: 'NQY' },\r\n { Title: 'Norwich (NWI)', Code: 'NWI' },\r\n { Title: 'Robin Hood Airport Doncaster (DSA)', Code: 'DSA' },\r\n { Title: 'Southampton (SOU)', Code: 'SOU' }\r\n ];\r\n }\r\n return [\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,LTN,SEN,STN,LCY' },\r\n { Title: 'Midlands - All Airports', Code: 'BHX,EMA' },\r\n { Title: 'North West - All Airports', Code: 'LPL,MAN' },\r\n { Title: 'North East - All Airports', Code: 'DSA,HUY,LBA,MME,NCL' },\r\n { Title: 'South East - All Airports', Code: 'LGW,LHR,SOU' },\r\n { Title: 'South West - All Airports', Code: 'BOH,BRS,CWL,EXT,NQY,SOU' },\r\n { Title: 'Scotland - All Airports', Code: 'ABZ,EDI,GLA,INV,PIK' },\r\n { Title: 'Belfast and Dublin - All Airports', Code: 'BFS,BHD,DUB' },\r\n { Title: 'Aberdeen (ABZ)', Code: 'ABZ' },\r\n { Title: 'Belfast City George Best (BHD)', Code: 'BHD' },\r\n { Title: 'Belfast International (BFS)', Code: 'BFS' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Bournemouth (BOH)', Code: 'BOH' },\r\n { Title: 'Bristol (BRS)', Code: 'BRS' },\r\n { Title: 'Cardiff (CWL)', Code: 'CWL' },\r\n { Title: 'Derry (LDY)', Code: 'LDY' },\r\n { Title: 'Dublin (DUB)', Code: 'DUB' },\r\n { Title: 'Durham Tees Valley (MME)', Code: 'MME' },\r\n { Title: 'East Midlands (EMA)', Code: 'EMA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' },\r\n { Title: 'Exeter (EXT)', Code: 'EXT' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Glasgow Prestwick (PIK)', Code: 'PIK' },\r\n { Title: 'Guernsey (GCI)', Code: 'GCI' },\r\n { Title: 'Humberside (HUY)', Code: 'HUY' },\r\n { Title: 'Inverness (INV)', Code: 'INV' },\r\n { Title: 'Isle of Man (IOM)', Code: 'IOM' },\r\n { Title: 'Jersey (JER)', Code: 'JER' },\r\n { Title: 'Leeds (LBA)', Code: 'LBA' },\r\n { Title: 'Liverpool John Lennon (LPL)', Code: 'LPL' },\r\n { Title: 'London City (LCY)', Code: 'LCY' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Luton (LTN)', Code: 'LTN' },\r\n { Title: 'London Southend (SEN)', Code: 'SEN' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Newquay (NQY)', Code: 'NQY' },\r\n { Title: 'Norwich (NWI)', Code: 'NWI' },\r\n { Title: 'Robin Hood Airport Doncaster (DSA)', Code: 'DSA' },\r\n { Title: 'Southampton (SOU)', Code: 'SOU' }\r\n ];\r\n })();\r\n angular\r\n .module('TR')\r\n .service('autocompleter', autocompleter);\r\n function autocompleter($http, $q, $filter, $route, globalisationService) {\r\n var domain = TRPCONFIG.Domain;\r\n var httpStatus = { BadRequest: 400 };\r\n var airports = null;\r\n var service = {\r\n lookup: lookup,\r\n initialDepartureAirports: initialDepartureAirports\r\n };\r\n function _filteredAirports(prefix) {\r\n if (airports) {\r\n var d = $q.defer();\r\n d.resolve({\r\n data: $filter('filter')(airports, prefix),\r\n prefix: prefix\r\n });\r\n return d.promise;\r\n }\r\n return $http.post('/api3/transfers/airports/get', {\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId\r\n }).then(function (result) {\r\n airports = result.data.Airports;\r\n return {\r\n data: $filter('filter')(airports, prefix),\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n function lookup(type, prefix, filterFunction) {\r\n //Use filterFunction returned data as promise incase if it presents and ignore everything else.\r\n if (filterFunction) {\r\n return $q.when({\r\n data: filterFunction({ prefix: prefix }),\r\n prefix: prefix\r\n });\r\n }\r\n if (!type) {\r\n throw new Error('type have not been supplied');\r\n }\r\n return _lookup(type, prefix).then(function (result) {\r\n if (result && _.isArray(result.data)) {\r\n _.forEach(result.data, function (d) { return d.searchLookupType = type; });\r\n }\r\n return result;\r\n });\r\n }\r\n function _autoCompleterApiCall(url, prefix) {\r\n return globalisationService.getSelectedRegionalContext()\r\n .then(function (regionalContext) { return $http.get(url + $.param({\r\n TenantId: TRPCONFIG.Domain.TenantId,\r\n PointOfSaleId: regionalContext.PointOfSale.Id,\r\n CultureCode: regionalContext.Language.Code,\r\n MaxResults: 15,\r\n Term: prefix\r\n }), { ignoreErrors: true }); });\r\n }\r\n function _getDepartureAirportsByPointOfSale(prefix) {\r\n return _autoCompleterApiCall('/api/flights/autocompleter/departureairports?', prefix);\r\n }\r\n function _lookup(type, prefix) {\r\n if (type === 'transfers') {\r\n return _filteredAirports(prefix);\r\n }\r\n else if (type === 'marhaba') {\r\n return $http.post('/api2/marhaba/airports/getairports', {\r\n CultureCode: domain.CultureCode,\r\n SearchTerm: prefix\r\n }).then(function (result) {\r\n return {\r\n data: result.data.Airports,\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n else if (type === 'parking') {\r\n return $http\r\n .post('/api2/airportparking/airports/get')\r\n .then(function (result) {\r\n var filteredResult = $filter('filter')(result.data.Airports, prefix);\r\n return {\r\n data: _.map(filteredResult, function (a) {\r\n // Have to map `AirportCode` to `Code`\r\n if (a.AirportCode) {\r\n a.Code = a.AirportCode;\r\n delete a.AirportCode;\r\n }\r\n return a;\r\n }),\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n else if (type === 'flights-departure' && TRPCONFIG.Domain.LimitDepartureAirportsToLocalOnly) {\r\n var airports_1 = prefix ? $filter('filter')(localAirports, { Title: prefix }) : localAirports;\r\n airports_1 = buildUpChildAirports(airports_1);\r\n return $q.when(mapDepartureAirports(airports_1, prefix));\r\n }\r\n else if (['flights-departure', 'flights-destination', 'flights'].indexOf(type) > -1) {\r\n if (TRPCONFIG.Domain.PointOfSaleAutocompleterEnabled) {\r\n return _getDepartureAirportsByPointOfSale(prefix).then(function (r) {\r\n return mapDepartureAirports(r.data.d.map(function (a) {\r\n return { Title: a.t, Code: a.v };\r\n }), prefix);\r\n });\r\n }\r\n var postData = {\r\n SearchTerm: prefix,\r\n MaxResults: 15,\r\n CultureCode: domain.CultureCode,\r\n RestrictToFlightDestinations: false\r\n };\r\n return $http\r\n .post('/api2/flights/static/getdestinationairports', postData)\r\n .then(function (result) { return mapDepartureAirports(result.data.Airports, prefix); });\r\n }\r\n else if (type === 'non-grouped-airports') {\r\n return _lookup('flights', prefix).then(function (res) {\r\n res.data = res.data.filter(function (airport) { return airport.Code.indexOf(',') === -1; });\r\n return res;\r\n });\r\n }\r\n else if (type === 'businesscustomers') {\r\n return $http\r\n .get(TRPCONFIG.AutocompleterClientDomain + \"/api2/businesscustomers/get?\" + $.param({\r\n DomainId: domain.DomainId,\r\n MaxResults: 400,\r\n MaxStringDistance: 4,\r\n CultureCode: domain.CultureCode,\r\n SearchTerm: prefix\r\n }))\r\n .then(function (result) {\r\n return {\r\n data: result.data,\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n else if (type === 'travelAgents') {\r\n return $http\r\n .get(TRPCONFIG.AutocompleterClientDomain + \"/api2/travelagents/search?\" + $.param({\r\n tenantId: TRPCONFIG.Domain.TenantId,\r\n pageSize: 10,\r\n searchQuery: prefix\r\n }), { ignoreErrors: true })\r\n .then(function (result) {\r\n return {\r\n data: result.data.map(function (t) { t.Title = t.Name; return t; }),\r\n prefix: prefix\r\n };\r\n }, function (error) {\r\n if (error.status === httpStatus.BadRequest) {\r\n return { data: [], prefix: prefix };\r\n }\r\n });\r\n }\r\n else if ('attractions' === type) {\r\n return $http.post(TRPCONFIG.AutocompleterClientDomain + \"/api2/attractions/bookingfunnel/find\", {\r\n DestinationId: TRPCONFIG.Domain.DomainId,\r\n Fragment: prefix,\r\n TenantId: TRPCONFIG.Domain.TenantId\r\n }).then(function (result) {\r\n return {\r\n data: result.data,\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n else if (type === 'resorts') {\r\n return _autoCompleterApiCall('/api/hotels/autocompleter/transferdestinations?', prefix)\r\n .then(function (result) {\r\n if (result && result.data && result.data.d) {\r\n return {\r\n data: result.data.d.map(function (d) {\r\n d.Title = d.t;\r\n d.Code = d.v.i;\r\n d.Type = d.v.t;\r\n return d;\r\n }),\r\n prefix: prefix\r\n };\r\n }\r\n });\r\n }\r\n else if (type === 'userAccounts') {\r\n var nameParts = prefix.split(' ');\r\n var params = {\r\n tenantId: TRPCONFIG.Domain.TenantId,\r\n pageSize: 10,\r\n firstName: nameParts[0] || '',\r\n lastName: nameParts[1] || ''\r\n };\r\n return $http\r\n .get(TRPCONFIG.AutocompleterClientDomain + \"/api2/useraccounts/search?\" + $.param(params))\r\n .then(function (result) {\r\n if (result && result.data && result.data.Results) {\r\n return {\r\n data: result.data.Results.map(function (t) {\r\n t.Title = t.FirstName + \" \" + t.LastName;\r\n return t;\r\n }),\r\n prefix: prefix\r\n };\r\n }\r\n });\r\n }\r\n return $http\r\n .get(TRPCONFIG.AutocompleterClientDomain + \"/api/destinationsautocompleter/search?\" + $.param({\r\n SearchTerm: prefix,\r\n MaxResults: 15,\r\n CultureCode: domain.CultureCode,\r\n HolidaySearch: type === 'holidays',\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n v: TRPCONFIG.CurrentVersion\r\n }), { ignoreErrors: true })\r\n .then(function (result) {\r\n return {\r\n data: result.data.Destinations,\r\n prefix: prefix\r\n };\r\n });\r\n }\r\n function mapDepartureAirports(airports, prefix) {\r\n if ($route.current.noGroup) {\r\n airports =\r\n airports.filter(function removeGroups(cv) {\r\n return cv.Code.indexOf(',') === -1;\r\n });\r\n }\r\n return {\r\n data: _.map(airports, function (a) {\r\n if (a.Title) {\r\n a.ShortTitle = a.Title.indexOf(',') >= 0 ? a.Title.split(',')[0] : a.Title;\r\n }\r\n a.icon = 'flights';\r\n return a;\r\n }),\r\n prefix: prefix\r\n };\r\n }\r\n function initialDepartureAirports() {\r\n var airports = buildUpChildAirports(localAirports);\r\n return $q.when(mapDepartureAirports(airports, ''));\r\n }\r\n function buildUpChildAirports(airports) {\r\n var result = [];\r\n _.forEach(airports, function (a) {\r\n result.push(a);\r\n var codes = a.Code.split(',');\r\n if (codes.length > 1) {\r\n a.isGroup = true;\r\n _.forEach(codes, function (c) {\r\n var match = _.find(localAirports, function (a) { return a.Code === c; });\r\n if (match) {\r\n match = angular.copy(match);\r\n match.isChild = true;\r\n result.push(match);\r\n }\r\n else {\r\n console.log('match could not be found for ', a.Code);\r\n }\r\n });\r\n }\r\n });\r\n result = result.filter(function (a) {\r\n if (a.isChild || a.isGroup) {\r\n return true;\r\n }\r\n return !_.some(result, function (aa) { return aa.isChild && aa.Code === a.Code; });\r\n });\r\n return result;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('baggageService', baggageService);\r\n function baggageService(occupancyService, tripService, basketStore) {\r\n var service = {\r\n getBaggageInfo: getBaggageInfo\r\n };\r\n function getBaggageInfo(tripId) {\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n if (trip == null) {\r\n return [];\r\n }\r\n return basketStore.flightSpecificInfo(trip.BasketId).then(function (flightDetail) {\r\n if (flightDetail) {\r\n return _.map(flightDetail.Sectors, function (sector) { return mapBaggageInfo(trip, sector); });\r\n }\r\n return [];\r\n });\r\n });\r\n }\r\n function mapBaggageInfo(trip, sector) {\r\n var bagInfo = {\r\n holdBagsIncluded: false,\r\n holdBagCount: 0,\r\n passengerHoldBags: []\r\n };\r\n var flight = trip.FlightsRequest && trip.FlightsRequest.SelectedFlight || {};\r\n bagInfo.holdBagsIncluded = flight.LeadBaggagePrice === 0;\r\n if (bagInfo.holdBagsIncluded) {\r\n bagInfo.holdBagCount = occupancyService.getNumberOfNonInfantPassengers() || 1;\r\n }\r\n else {\r\n if (sector && sector.PassengerBagCounts) {\r\n bagInfo.holdBagCount = _.reduce(sector.PassengerBagCounts, function (total, bags) { return total + bags.Quantity; }, 0);\r\n bagInfo.passengerHoldBags = sector.PassengerBagCounts || [];\r\n }\r\n if (flight.AllBagsOrNone && bagInfo.holdBagCount > 0) {\r\n bagInfo.holdBagCount = occupancyService.getNumberOfNonInfantPassengers() || 1;\r\n }\r\n }\r\n return bagInfo;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n /*\r\n For the moment the basket service is going to fulfill the workflow role\r\n i.e. it will act like a state machine to control the transitions that we require\r\n This might turn out to be wrong but we have no better way to track that state\r\n at the moment.\r\n */\r\n angular\r\n .module('TR')\r\n .service('basketService', basketService);\r\n function basketService($location, $q, $routeParams, $timeout, $rootScope, $filter, analytics, attractionService, basketStore, bookingService, broker, carHireService, changeDurationPopupService, cookieService, criteoService, currentDestination, dateUtil, enumService, flightSearch, flightsTerminalService, guidService, holidaySearch, hotelSearch, hotelService, insuranceService, loggingService, marhabaSearch, multiSectorSearch, parkingService, resourceService, savedSearchService, searchUnitService, transferSearch, tripService, urlUtils, windowUtil, $window, urlStoreService, mandatoryTransferService) {\r\n var holidayBooking = 0;\r\n var hotelBooking = 1;\r\n var transferBooking = 2;\r\n var marhabaBooking = 3;\r\n var flightBooking = 4;\r\n var parkingBooking = 6;\r\n var attractionsBooking = 7;\r\n var insuranceBooking = 9;\r\n var autoSearch = 10;\r\n var workflowType = {\r\n 1: flightBooking,\r\n 2: hotelBooking,\r\n 3: holidayBooking,\r\n 4: transferBooking,\r\n 6: parkingBooking\r\n };\r\n var flightUnavailable = false;\r\n var flightIncompleteDates = false;\r\n var holidaySearchProgress;\r\n var flightChanged = true;\r\n var oldAndNewFlightDatesMatch = false;\r\n broker.subscribe('basketService', 'flightNotAvailable', function (e) {\r\n flightUnavailable = true;\r\n tripService.getTrip(e.data)\r\n .then(function (trip) {\r\n var holiday = trip.TripType === tripService.tripTypes.Holiday;\r\n var flightsRoute = holiday ? 'holidays/flights/' : 'flights/';\r\n trip.FlightsRequest.SelectedFlight.Unavailable = true;\r\n tripService.persist(trip.TripId, trip).then(function () { return $location.url(flightsRoute + trip.TripId); });\r\n });\r\n });\r\n broker.subscribe('basketService', 'HotelOptionsAllowed', function () { return TRPCONFIG.DeviceSettings.HotelOptionsEnabled = true; });\r\n var service = {\r\n createTrip: createTrip,\r\n hotelBooking: hotelBooking,\r\n holidayBooking: holidayBooking,\r\n transferBooking: transferBooking,\r\n marhabaBooking: marhabaBooking,\r\n flightBooking: flightBooking,\r\n parkingBooking: parkingBooking,\r\n attractionsBooking: attractionsBooking,\r\n insuranceBooking: insuranceBooking,\r\n autoSearch: autoSearch,\r\n workflowType: workflowType,\r\n startWorkflow: startWorkflow,\r\n startMultiDestHolidayWorkflow: startMultiDestHolidayWorkflow,\r\n completeWorkflow: completeWorkflow,\r\n redirectToComplete: redirectToComplete,\r\n selectTransfer: selectTransfer,\r\n selectInsurance: selectInsurance,\r\n selectCar: selectCar,\r\n selectParking: selectParking,\r\n selectMarhaba: selectMarhaba,\r\n prepareMarhabaBooking: prepareMarhabaBooking,\r\n getHotelUrl: getHotelUrl,\r\n selectHotel: selectHotel,\r\n restartCurrentWorkflow: restartCurrentWorkflow,\r\n restartHolidayWorkflow: restartHolidayWorkflow,\r\n getFlight: getFlight,\r\n getHotel: getHotel,\r\n getInsuranceQuotes: getInsuranceQuotes,\r\n updateInsuranceQuote: updateInsuranceQuote,\r\n changeFlight: changeFlight,\r\n getTransfers: getTransfers,\r\n getCarQuotes: getCarQuotes,\r\n getCarQuotesFromSession: getCarQuotesFromSession,\r\n getParkingQuotes: getParkingQuotes,\r\n getAttractionQuotes: getAttractionQuotes,\r\n getMarhaba: getMarhaba,\r\n bookBasket: bookBasket,\r\n bookAttractionsBasket: bookAttractionsBasket,\r\n selectHotelRooms: selectHotelRooms,\r\n selectFlight: selectFlight,\r\n changeToFlightWorkflow: changeToFlightWorkflow,\r\n changeToHolidayTripType: changeToHolidayTripType,\r\n selectMultiFlight: selectMultiFlight,\r\n updateBasket: updateBasket,\r\n updateFlight: updateFlight,\r\n bookingAlreadyDone: bookingAlreadyDone,\r\n waitForFlight: waitForFlight,\r\n changeJourneyUrl: changeJourneyUrl,\r\n getHolidaySearchProgress: getHolidaySearchProgress,\r\n bookHotelBasket: bookHotelBasket,\r\n getArea: getArea,\r\n isFlightPreselected: isFlightPreselected,\r\n getHotelDatesFromFlight: getHotelDatesFromFlight,\r\n getNumberOfNightsFromFlights: getNumberOfNightsFromFlights,\r\n updateBrandedFare: updateBrandedFare\r\n };\r\n function changeJourneyUrl(breadcrumb, tripId) {\r\n var breadcrumbTrail = {\r\n 0: _changeToHome,\r\n 5: _changeToDeal,\r\n 10: _changeToFlight,\r\n 20: _changeToHotel,\r\n 21: _changeToRoom,\r\n 25: _changeToFlight,\r\n 30: _changeToTransfer,\r\n 35: _changeToParking,\r\n 40: _changeToOptions,\r\n 45: _changeToMarhaba,\r\n 50: _changeToInsurance\r\n };\r\n if (breadcrumbTrail[breadcrumb] != null) {\r\n return service.getArea(tripId)\r\n .then(function (area) { return breadcrumbTrail[breadcrumb](tripId || $routeParams.tripId || null, area); })\r\n .then(function () { return handleMultiDestHolidayExit(tripId); });\r\n }\r\n loggingService.logError(\"changeJourneyUrl: breadcrumb: \\\"\" + breadcrumb + \"\\\" doesnt exist for tripId: \\\"\" + $routeParams.tripId + \"\\\"\");\r\n return null;\r\n }\r\n function getArea(tripId) {\r\n return tripService.getTrip(tripId || $routeParams.tripId)\r\n .then(function (trip) {\r\n switch (trip.TripType) {\r\n case 1://flight\r\n return 'flights';\r\n case 2://hotel\r\n return 'hotels';\r\n case 3://transfer\r\n return 'transfers';\r\n case 4://holiday\r\n return 'holidays';\r\n case 5:// marhaba\r\n return 'marhaba'; // ?\r\n case 6:// parking\r\n return 'parking';\r\n case 9:// insurance\r\n return 'insurance';\r\n default:\r\n return '';\r\n }\r\n });\r\n }\r\n function _startHotelWorkflow(tripId, parameters) {\r\n sessionStorage.removeItem('preselectedHotelData');\r\n sessionStorage.removeItem('hasbookingpagevisited');\r\n sessionStorage.removeItem('PreselectFlight');\r\n hotelSearch.clearSearchResults(parameters.defaultFilters);\r\n broker.publish('recommender.startSearch', { searchModel: parameters.searchModel, isHotel: true });\r\n var errors = hotelSearch.validateSearchCriteria();\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n var createSearchPromise;\r\n var hotelAvailabilityId;\r\n var dest;\r\n var estabId;\r\n return service.createTrip(tripId, tripService.tripTypes.Hotel)\r\n .then(function () { return searchUnitService.updateSearchArea(); })\r\n .then(function () {\r\n broker.publish('newSearchTriggered');\r\n return parameters.roomSearch ? currentDestination.getCurrentDestination() : searchUnitService.getDestination();\r\n })\r\n .then(function (d) {\r\n dest = d;\r\n var customRequest = { TripId: tripId, Destination: dest };\r\n hotelSearch.buildHotelsRequest(customRequest, searchUnitService.hotel);\r\n createSearchPromise = hotelSearch.createSearch().then(function (x) { return hotelAvailabilityId = x; });\r\n return TRPCONFIG.Domain.ImmediateSearch ? undefined : createSearchPromise;\r\n })\r\n .then(function () {\r\n estabId = parameters.estabId || (dest && dest.EstablishmentId);\r\n if (parameters.nextUrl !== false) {\r\n var url = getHotelUrl({\r\n tripId: tripId,\r\n estabId: estabId,\r\n isRoomSearch: parameters.roomSearch\r\n });\r\n $location.url(optionallyAppendParam(url, 'fid', parameters.fid));\r\n }\r\n return createSearchPromise;\r\n })\r\n .then(function () {\r\n if (estabId) {\r\n hotelService.trackHotelClick(estabId, 0, undefined, undefined, hotelAvailabilityId);\r\n }\r\n return savedSearchService.saveHotelSearch(tripId);\r\n })\r\n .then(function () { return ({ hotelAvailabilityId: hotelAvailabilityId, tripId: tripId }); });\r\n }\r\n function _startAutoSearchWorkflow(tripId, parameters) {\r\n var isEstabSearch = _.get(parameters, 'destination[0].Type', 0) === 1;\r\n return isEstabSearch ? _startHotelWorkflow(tripId, parameters) : _startHolidayWorkflow(tripId, parameters);\r\n }\r\n function _startHolidayWorkflow(tripId, parameters) {\r\n return _startFlightPlusWorkflow(tripId, parameters, tripService.tripTypes.Holiday, false)\r\n .then(function () { return savedSearchService.saveHolidaySearch(tripId, parameters.searchModel); });\r\n }\r\n function _startChangeableFlightWorkflowWithProgress(tripId, parameters, progress) {\r\n return _startFlightPlusWorkflow(tripId, parameters, tripService.tripTypes.Flight, true)\r\n .then(function () { return savedSearchService.saveFlightSearch(tripId, parameters.searchModel); })\r\n .then(function () { return progress && progress.resolve(); })\r\n .finally(function () { return progress = null; });\r\n }\r\n function _startFlightPlusWorkflow(tripId, parameters, tripType, isFlexibleTripType) {\r\n broker.publish('recommender.startSearch', { searchModel: parameters.searchModel, isHotel: false });\r\n sessionStorage.removeItem('PreselectFlight');\r\n sessionStorage.removeItem('preselectedHotelData');\r\n sessionStorage.removeItem('hasbookingpagevisited');\r\n sessionStorage.removeItem('storeSelectedFlight');\r\n sessionStorage.removeItem('DefaultFlight');\r\n sessionStorage.removeItem('BrandedFareCancellations');\r\n var errors = flightSearch.validateSearchCriteria(true);\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n if (window.location.pathname.includes('flights')) {\r\n $location.url('');\r\n }\r\n return holidaySearch.createSearch(parameters)\r\n .then(function (_a) {\r\n var data = _a.data;\r\n var preselectFlight = (data.PreselectFlight !== undefined && data.PreselectFlight\r\n && data.PackageId === undefined\r\n && TRPCONFIG.Domain.PreselectFlight\r\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\r\n && !TRPCONFIG.Domain.isAgentMode) ||\r\n (data.PreselectFlight !== undefined\r\n && data.PreselectFlight\r\n && data.PackageId === undefined\r\n && TRPCONFIG.Domain.PreselectFlight\r\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\r\n && TRPCONFIG.Domain.isAgentMode\r\n && TRPCONFIG.Domain.isAgentModePreselectFlightEnabled) ||\r\n TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled;\r\n sessionStorage.setItem('PreselectFlight', !!preselectFlight);\r\n parameters.FlightSearchId = data && data.FlightSearchId;\r\n return _startFlightWorkflow(tripId, tripType, function () {\r\n hotelSearch.buildHotelsRequest({\r\n AvailabilitySearchId: data.HotelSearchId,\r\n TripId: tripId,\r\n IsFlightPlus: true\r\n }, searchUnitService.flight);\r\n hotelSearch.setAirportCodeFilter(null);\r\n return tripService.recordHotelSearch(tripId, hotelSearch.getAvailabilityRequest())\r\n .then(function () { return tripService.setKidsFree(tripId, data.KidsGoFree); });\r\n }, _.defaults(parameters, { packageId: data.PackageId }), isFlexibleTripType);\r\n });\r\n }\r\n function optionallyAppendParam(path, param, value) {\r\n var querySymbol = path.indexOf('?') >= 0 ? '&' : '?';\r\n return value ? \"\" + path + querySymbol + param + \"=\" + value : path;\r\n }\r\n function _startFlightWorkflow(tripId, flow, hotelSearchFunc, params, isFlexibleTripType) {\r\n var isFlightType = flow === tripService.tripTypes.Flight;\r\n var isHolidayType = flow === tripService.tripTypes.Holiday;\r\n if (!isHolidayType) {\r\n sessionStorage.setItem('PreselectFlight', false);\r\n }\r\n var oneWayOnly = !!searchUnitService.isOneWayFlightEnabled() && isFlightType;\r\n if (params != null && params.oneWayOnly != null) {\r\n oneWayOnly = params.oneWayOnly;\r\n }\r\n var errors = flightSearch.validateSearchCriteria(!isFlightType, oneWayOnly);\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n flightSearch.clearSearchResults();\r\n hotelSearch.clearSearchResults(true);\r\n var isBestFit = (TRPCONFIG.Domain.BestFitFlightSelection || params.packageId && TRPCONFIG.Domain.DestinationBasedPackageRates) &&\r\n isHolidayType;\r\n return service.createTrip(tripId, flow, null, params.packageId, isFlexibleTripType).then(function () {\r\n broker.publish('newSearchTriggered');\r\n if (isBestFit) {\r\n $location.search('bestfitdeal170', '1');\r\n }\r\n // Features that are permanently enabled to all users\r\n var parasolEnabledFeatures = _.get(TRPCONFIG, 'Domain.ParasolEnabledFeatures');\r\n var includesEnabledFeature = parasolEnabledFeatures && parasolEnabledFeatures.includes('holidays');\r\n // Features that are part of a test and can only be access by authenticated users\r\n var parasolTestingFeatures = _.get(TRPCONFIG, 'Domain2.ParasolTestingFeatures');\r\n var includesTestingFeature = parasolTestingFeatures && parasolTestingFeatures.includes('holidays');\r\n var testUserAuthenticated = cookieService.get('x-v3') === 'true' || cookieService.get('x-v3') === _.get(TRPCONFIG, 'Domain.ParasolVWOTestId');\r\n var isV3HolidayRoute = TRPCONFIG.IsMobileView && (params.packageId === undefined) && (includesEnabledFeature || (testUserAuthenticated && includesTestingFeature));\r\n var promises = $q.all({\r\n hotelSearch: hotelSearchFunc ? hotelSearchFunc(tripId) : null,\r\n flightSearch: flightSearch.search({\r\n searchId: params.FlightSearchId || guidService.uuid(),\r\n tripId: tripId,\r\n newSearch: isFlightType,\r\n oneWayOnly: oneWayOnly,\r\n flightOnly: isFlightType,\r\n flexibleDates: isFlightPreselected() ? false : params.flexibleDates,\r\n isV3HolidayRoute: isV3HolidayRoute,\r\n prefilterAirlines: params.prefilterAirlines,\r\n postfilterAirlines: params.postfilterAirlines,\r\n prefilterDirectFlights: params.prefilterDirectFlights,\r\n sortOrder: _getSortOrder(isBestFit, isFlightPreselected()),\r\n useSearchUnit: true\r\n })\r\n });\r\n return promises.then(function (data) {\r\n if (isBestFit || isFlightPreselected()) {\r\n if (data.flightSearch.CombinedDates.AvailableFlights.length) {\r\n service.selectFlight(validateNextDayFlight(data.flightSearch.CombinedDates.AvailableFlights), tripId, null, params);\r\n }\r\n else {\r\n $location.url(optionallyAppendParam(\"holidays/flights/\" + tripId, 'fid', params.fid));\r\n }\r\n }\r\n else if (isHolidayType) {\r\n $location.url(optionallyAppendParam(\"holidays/flights/\" + tripId, 'fid', params.fid));\r\n }\r\n else {\r\n $location.url(optionallyAppendParam(\"flights/\" + tripId, 'fid', params.fid));\r\n }\r\n criteoService.enqueue([], 'flightlist', flow);\r\n });\r\n });\r\n }\r\n function _getSortOrder(isBestFit, isHotelFirst) {\r\n var recommendedSortId = 10;\r\n var lowestFirstSortId = 1;\r\n var sortId;\r\n if (isBestFit) {\r\n sortId = recommendedSortId;\r\n }\r\n else if (isHotelFirst) {\r\n sortId = lowestFirstSortId;\r\n }\r\n return sortId;\r\n }\r\n function getCheckInDateForFlight(flightArrival) {\r\n var landsAfterCutOff = flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff;\r\n var zeroTime = dateUtil.zeroTime(flightArrival, true);\r\n return landsAfterCutOff ? zeroTime : dateUtil.addDays(zeroTime, -1, true);\r\n }\r\n function getCheckOutDateForFlight(flightReturn) {\r\n if (TRPCONFIG.Domain.ReturnFlightCutOff < 0) {\r\n return dateUtil.zeroTime(flightReturn, true);\r\n }\r\n var departsBeforeCutOff = flightReturn.getHours() < TRPCONFIG.Domain.ReturnFlightCutOff;\r\n var zeroTime = dateUtil.zeroTime(flightReturn, true);\r\n return departsBeforeCutOff ? dateUtil.addDays(zeroTime, -1, true) : zeroTime;\r\n }\r\n function validateNextDayFlight(flights) {\r\n // To avoid the problem of next day flight causing hotel checkin/checkout dates to be the same\r\n if (dateUtil.atLeastTwoDaysInTheFuture(flights[0].DepartureDate)) {\r\n return flights[0];\r\n }\r\n var validFlight = _.find(flights, function (f) {\r\n var legs = f.Legs;\r\n var flightArrival = dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate);\r\n var flightReturn = legs.length > 1 ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\r\n return dateUtil.getDifferenceInDays(new Date(getCheckInDateForFlight(flightArrival)), new Date(getCheckOutDateForFlight(flightReturn))) > 0;\r\n });\r\n return validFlight;\r\n }\r\n function _startMultiFlightWorkflow(tripId, params) {\r\n var errors = multiSectorSearch.validateSearchCriteria(params);\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n return createTrip(tripId, tripService.tripTypes.Flight)\r\n .then(function () {\r\n $location.path(\"multiflights/\" + tripId);\r\n return multiSectorSearch.search(tripId, params);\r\n });\r\n }\r\n function _startTransferWorkflow(tripId, parameters) {\r\n transferSearch.clearSearchResults();\r\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n searchUnitService.setLocationId(null);\r\n }\r\n var errors = transferSearch.validateSearchCriteria({ enableTransfersTimeApproval: parameters.enableTransfersTimeApproval });\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n return service.createTrip(tripId, tripService.tripTypes.Transfer).then(function () {\r\n $location.path(\"transfers/\" + tripId);\r\n return transferSearch.search({ searchId: guidService.uuid(), tripId: tripId, newSearch: true, isFlightPlus: false }).then(savedSearchService.saveTransferSearch);\r\n });\r\n }\r\n function _startMarhabaWorkflow(tripId) {\r\n marhabaSearch.clearSearchResults();\r\n var errors = marhabaSearch.validateSearchCriteria();\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n return service.createTrip(tripId, tripService.tripTypes.Marhaba).then(function () {\r\n $location.path(\"marhaba/\" + tripId);\r\n return marhabaSearch.search({ searchId: guidService.uuid(), tripId: tripId, newSearch: true });\r\n });\r\n }\r\n function _startParkingWorkflow(tripId) {\r\n parkingService.clearSearchResults();\r\n var errors = parkingService.validateSearchCriteria();\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n return service.createTrip(tripId, tripService.tripTypes.Parking)\r\n .then(function () { return parkingService.getParkingQuotes(tripId); })\r\n .then(function () { return $location.path(\"parking/\" + tripId); })\r\n .then(function () { return savedSearchService.saveParkingSearch(tripId); });\r\n }\r\n function _startAttractionsWorkflow(params) {\r\n return basketStore.getAttractionsBasketId()\r\n .then(function (basketId) { return basketStore.addAttraction(params.productId, params.productTags, basketId); })\r\n .then(function (basketData) {\r\n if (basketData.error) {\r\n return;\r\n }\r\n var changeData = basketData.Change;\r\n var lineItems = changeData && changeData.New || [];\r\n if (!lineItems.length) {\r\n // No new items, check if a product already in the basket was modified\r\n lineItems = attractionService.getLineItemChanges(basketData);\r\n }\r\n return lineItems;\r\n });\r\n }\r\n function _startInsuranceWorkflow(tripId) {\r\n insuranceService.clearSearchResults();\r\n var errors = insuranceService.validateSearchCriteria();\r\n if (errors.length > 0) {\r\n return $q.reject(errors);\r\n }\r\n return service.createTrip(tripId, tripService.tripTypes.Insurance).then(function () {\r\n $location.path(\"insurance/results/\" + tripId);\r\n return insuranceService.search({ searchId: guidService.uuid(), tripId: tripId, newSearch: true })\r\n .then(savedSearchService.saveInsuranceSearch);\r\n });\r\n }\r\n function _prepareBooking(tripId, path, v3) {\r\n if (v3 === void 0) { v3 = false; }\r\n return tripService.setBookingId(tripId, guidService.uuid())\r\n .then(function (trip) {\r\n return bookingService.prepareBooking(trip.BasketId, trip.BookingId, tripId)\r\n .then(function (preparedBooking) {\r\n if (v3) {\r\n $window.location.href = \"booking/summary/\" + tripId + \"?gov=3\";\r\n }\r\n else {\r\n $location.path(path + \"/\" + tripId);\r\n }\r\n return preparedBooking;\r\n });\r\n });\r\n }\r\n function startWorkflow(type, parameters) {\r\n var tripId = guidService.uuid();\r\n var requestedUrl = $location.url();\r\n var source = $routeParams.source;\r\n var result = startWorkflowInternal(type, parameters, tripId);\r\n if (result && type !== attractionsBooking) {\r\n result.then(function () {\r\n analytics.trackSearchOrigin(tripId, requestedUrl);\r\n if (source) {\r\n $location.search('source', source);\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n function startMultiDestHolidayWorkflow() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var query, variantKey, variant, basket, basketId, tripId, trip, err_3;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 6, , 7]);\r\n query = $location.search();\r\n variantKey = 'variant';\r\n variant = query && variantKey in query && Number(query[variantKey]) || undefined;\r\n return [4 /*yield*/, basketStore.createBasket(true /* ForHoliday */)];\r\n case 1:\r\n basket = _a.sent();\r\n basketId = basket.BasketId;\r\n return [4 /*yield*/, hotelSearch.createMultiDestHolidaySearch(basketId, variant)];\r\n case 2:\r\n tripId = _a.sent();\r\n if (!(basketId && tripId)) return [3 /*break*/, 5];\r\n searchUnitService.setDestination(null);\r\n return [4 /*yield*/, tripService.getTrip(tripId)];\r\n case 3:\r\n trip = _a.sent();\r\n return [4 /*yield*/, tripService.persist(tripId, Object.assign({}, trip, { BasketId: basketId }))];\r\n case 4:\r\n _a.sent();\r\n analytics.trackSearchOrigin(tripId, $location.url());\r\n $location.path(\"/holidays/january-sale/\" + tripId).search(_.omit(query, variantKey));\r\n _a.label = 5;\r\n case 5: return [3 /*break*/, 7];\r\n case 6:\r\n err_3 = _a.sent();\r\n loggingService.logError('Multi destination holiday search failed', JSON.stringify(err_3));\r\n $location.path('/error');\r\n return [3 /*break*/, 7];\r\n case 7: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function handleMultiDestHolidayExit(tripId) {\r\n if (tripId === void 0) { tripId = $routeParams.tripId; }\r\n return __awaiter(this, void 0, void 0, function () {\r\n var trip;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, tripService.getTrip(tripId)];\r\n case 1:\r\n trip = _a.sent();\r\n if (trip.TripType === tripService.tripTypes.MultiDestHoliday) {\r\n return [2 /*return*/, tripService.changeTripType(tripId, tripService.tripTypes.Holiday)];\r\n }\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function getHolidaySearchProgress() {\r\n return holidaySearchProgress && holidaySearchProgress.promise || $q.when();\r\n }\r\n function startWorkflowInternal(type, parameters, tripId) {\r\n if (!parameters) {\r\n parameters = {};\r\n }\r\n if (type === flightBooking) {\r\n var flightDestinationKeys = _.keys(searchUnitService.getDestination());\r\n var isntFlexibleFlightDestination = flightDestinationKeys[0] === 'Title' && flightDestinationKeys.length === 1;\r\n if (parameters.multi) {\r\n return _startMultiFlightWorkflow(tripId, parameters);\r\n }\r\n if (isntFlexibleFlightDestination) {\r\n return _startFlightWorkflow(tripId, tripService.tripTypes.Flight, null, parameters, false)\r\n .then(function () { return savedSearchService.saveFlightSearch(tripId, parameters.searchModel); });\r\n }\r\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled) {\r\n holidaySearchProgress = $q.defer();\r\n return _startChangeableFlightWorkflowWithProgress(tripId, parameters, holidaySearchProgress);\r\n }\r\n return _startFlightWorkflow(tripId, tripService.tripTypes.Flight, null, parameters, false)\r\n .then(function () { return savedSearchService.saveFlightSearch(tripId, parameters.searchModel); });\r\n }\r\n if (type === hotelBooking) {\r\n hotelSearch.setAirportCodeFilter(null);\r\n return _startHotelWorkflow(tripId, parameters);\r\n }\r\n searchUnitService.setDefaultCurrency();\r\n if (type === holidayBooking) {\r\n holidaySearchProgress = $q.defer();\r\n if (parameters.isFlexibleTripType) {\r\n return _startChangeableFlightWorkflowWithProgress(tripId, parameters, holidaySearchProgress);\r\n }\r\n return _startHolidayWorkflow(tripId, parameters)\r\n .then(function () { return holidaySearchProgress && holidaySearchProgress.resolve(); })\r\n .finally(function () { return holidaySearchProgress = null; });\r\n }\r\n if (type === transferBooking) {\r\n return _startTransferWorkflow(tripId, parameters);\r\n }\r\n if (type === marhabaBooking) {\r\n return _startMarhabaWorkflow(tripId, parameters);\r\n }\r\n if (type === parkingBooking) {\r\n return _startParkingWorkflow(tripId, parameters);\r\n }\r\n if (type === attractionsBooking) {\r\n return _startAttractionsWorkflow(parameters);\r\n }\r\n if (type === insuranceBooking) {\r\n return _startInsuranceWorkflow(tripId, parameters);\r\n }\r\n if (type === autoSearch) {\r\n return _startAutoSearchWorkflow(tripId, parameters);\r\n }\r\n }\r\n function createTrip(TripId, TripType, basketId, PackageId, FlexibleTripType) {\r\n return $q.when(basketId ||\r\n basketStore.createBasket(TripType === tripService.tripTypes.Holiday)\r\n .then(function (_a) {\r\n var BasketId = _a.BasketId;\r\n return BasketId;\r\n }))\r\n .then(function (BasketId) { return tripService.persist(TripId, {\r\n BasketId: BasketId,\r\n FlexibleTripType: FlexibleTripType,\r\n PackageId: PackageId,\r\n TripId: TripId,\r\n TripType: TripType\r\n }); });\r\n }\r\n function completeWorkflow(refs, basketId) {\r\n return $q.all([\r\n basketStore.all(basketId),\r\n basketStore.totalCost(basketId),\r\n basketStore.getBasketCurrency(basketId)\r\n ]).then(function (_a) {\r\n var basket = _a[0], total = _a[1], currency = _a[2];\r\n broker.publish('bookingComplete', { refs: refs, basket: basket, total: total, currency: currency });\r\n return basketStore.clearBasket(basketId).then(function () {\r\n return [basket, total, currency];\r\n });\r\n });\r\n }\r\n function redirectToComplete(refs, basketId, totalCost, tripId) {\r\n var refRoute = refs.join('|');\r\n var url = \"/booking/complete/\" + refRoute + \"?tripId=\" + tripId;\r\n if (TRPCONFIG.Domain.BuyNowPayLaterEnabled && totalCost > TRPCONFIG.Domain.BuyNowPayLaterCost) {\r\n url = url + \"&pl=1\";\r\n }\r\n if (TRPCONFIG.Domain.ParasolBookingComplete) {\r\n //Leave some time for tracking to complete:\r\n setTimeout(function () { return window.location = url; }, 333);\r\n }\r\n else {\r\n $location.url(url);\r\n }\r\n }\r\n function _changeToHome(tripId, area) {\r\n $location.url(TRPCONFIG.Domain.SearchUnitHomePath + area);\r\n }\r\n function _changeToDeal(tripId) {\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n if (trip && trip.Deal) {\r\n $location.url(urlUtils.stripLeadingSlash(trip.Deal.OriginPath));\r\n }\r\n });\r\n }\r\n function _changeToFlight(tripId) {\r\n return tripService.getTrip(tripId)\r\n .then(function (_a) {\r\n var FlexibleTripType = _a.FlexibleTripType, TripType = _a.TripType, HotelsRequest = _a.HotelsRequest;\r\n if (TripType === tripService.tripTypes.MultiDestHoliday ||\r\n // On the booking form, TripType changes to Holiday so test for Destinations prop\r\n (HotelsRequest && HotelsRequest.Destinations)) {\r\n return searchUnitService.setDestination(HotelsRequest.Destination)\r\n .then(function () { return startWorkflow(holidayBooking); });\r\n }\r\n return $location.path((TripType === tripService.tripTypes.Holiday && !FlexibleTripType ? 'holidays/' : '') + \"flights/\" + tripId);\r\n });\r\n }\r\n function _changeToHotel(tripId, area) {\r\n return tripService.setDirectToHotel(tripId, false).then(function () {\r\n $location.path(area + \"/\" + (area === 'holidays' ? 'hotels/' : '') + tripId);\r\n });\r\n }\r\n function _changeToRoom(tripId, area) {\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n basketStore.hotel(trip.BasketId).then(function (hotel) {\r\n $location.path(area + \"/\" + tripId + \"/\" + hotel.Details.Id);\r\n });\r\n });\r\n }\r\n function _changeToTransfer(tripId) {\r\n $location.path(\"transfers/\" + tripId);\r\n }\r\n function _changeToParking(tripId) {\r\n $location.path(\"parking/\" + tripId);\r\n }\r\n function _changeToMarhaba(tripId) {\r\n $location.path(\"marhaba/\" + tripId);\r\n }\r\n function _changeToInsurance(tripId) {\r\n $location.path(\"insurance/results/\" + tripId);\r\n }\r\n function _changeToOptions(tripId, area) {\r\n $location.path(area + \"/options/\" + tripId);\r\n }\r\n function getBookingPath(trip) {\r\n var isMeta = _.get($location.search(), 'source') === 'TV';\r\n var isHolidayDeal = _.get(trip, 'FromHolidayDeal');\r\n var isHoliday = _.get(trip, 'TripType') === 4;\r\n if (isHolidayDeal) {\r\n return isHoliday ? 4 : 3;\r\n }\r\n if (isMeta) {\r\n return isHoliday ? 6 : 5;\r\n }\r\n return isHoliday ? 2 : 1;\r\n }\r\n function selectTransfer(id, searchId, basketId, tripId) {\r\n var isObject = typeof id === 'object' && id !== null;\r\n var prodType;\r\n var preselectedHotelData;\r\n var options;\r\n if (isObject) {\r\n prodType = basketStore.productType.Transfer;\r\n }\r\n else {\r\n prodType = basketStore.productType.Accommodation;\r\n preselectedHotelData = JSON.parse(sessionStorage.getItem('preselectedHotelData'));\r\n options = [{ OptionId: id }];\r\n /* If more than One Room */\r\n if (options && preselectedHotelData && preselectedHotelData.d.BookedItems &&\r\n preselectedHotelData.d.BookedItems.length > 1) {\r\n var perRoomExtra_1 = [];\r\n preselectedHotelData.d.BookedItems.forEach(function (room) {\r\n var roomNum = \"HotelExtra|\" + room.RoomNumber + \"|\";\r\n var roomExtra = { OptionId: id.replace('HotelExtra|0|', roomNum) };\r\n perRoomExtra_1.push(roomExtra);\r\n });\r\n options = perRoomExtra_1;\r\n }\r\n }\r\n return basketStore.transfer(basketId).then(function (t) {\r\n if (!isObject && basketId) {\r\n service.updateBasket();\r\n return basketStore.hotel(basketId).then(function (h) {\r\n var extra;\r\n if (h && h.CostBreakdown) {\r\n h.CostBreakdown.forEach(function (cb) {\r\n extra = cb.ExtraReference ? cb.ExtraReference : '';\r\n });\r\n }\r\n if (extra.split('|')[2] !== options[options.length - 1].OptionId.split('|')[3]) {\r\n return basketStore.addTransfer(prodType, searchId, options, basketId).then(function (transfer) {\r\n return transfer;\r\n });\r\n }\r\n return h;\r\n });\r\n }\r\n else if (t == null || t.Details.TransferId !== id) {\r\n return basketStore.addTransfer(prodType, searchId, id, basketId).then(function (transfer) {\r\n service.updateBasket();\r\n return basketStore.all(basketId).then(function (products) {\r\n if (products.t && !products.h && !products.f) {\r\n _prepareBooking(tripId, 'transfers/book');\r\n }\r\n return transfer;\r\n });\r\n });\r\n }\r\n return t;\r\n });\r\n }\r\n function selectInsurance(quote, searchId, basketId, tripId) {\r\n return basketStore.insurance(basketId)\r\n .then(function () {\r\n return basketStore.addInsurance(searchId, quote, basketId).then(function (insurance) {\r\n service.updateBasket();\r\n return basketStore.all(basketId).then(function (products) {\r\n if (products.i && !products.h && !products.f) {\r\n _prepareBooking(tripId, 'insurance/book');\r\n }\r\n return insurance;\r\n });\r\n });\r\n });\r\n }\r\n function selectCar(quote, searchId, basketId) {\r\n return basketStore.addCar(searchId, quote, basketId).then(function (carhire) {\r\n service.updateBasket();\r\n return carhire;\r\n });\r\n }\r\n function selectParking(id, searchId, basketId, tripId) {\r\n var parking;\r\n return basketStore.addParking(searchId, id, basketId)\r\n .then(function (p) {\r\n parking = p;\r\n service.updateBasket();\r\n return basketStore.all(basketId);\r\n })\r\n .then(function (_a) {\r\n var p = _a.p, h = _a.h, f = _a.f;\r\n // Assume standalone parking if no hotel or flight\r\n if (p && !h && !f) {\r\n _prepareBooking(tripId, 'parking/book');\r\n }\r\n return parking;\r\n });\r\n }\r\n function selectMarhaba(tripId, parameters) {\r\n return _startMarhabaWorkflow(tripId, parameters);\r\n }\r\n function prepareMarhabaBooking(tripId, productId) {\r\n return tripService.setBookingId(tripId, guidService.uuid())\r\n .then(function (trip) {\r\n return bookingService.prepareBooking(trip.BasketId, trip.BookingId, tripId)\r\n .then(function (preparedBooking) {\r\n $location.path(\"marhaba/book/\" + tripId + \"/\" + productId);\r\n return preparedBooking;\r\n });\r\n });\r\n }\r\n function getHotelUrl(_a) {\r\n var tripId = _a.tripId, hotel = _a.hotel, flight = _a.flight, estabId = _a.estabId, _b = _a.isRoomSearch, isRoomSearch = _b === void 0 ? true : _b, TripType = _a.TripType;\r\n estabId = estabId || _.get(hotel, 'Id');\r\n var isAmmendBooking = !!$routeParams.BookingRef;\r\n var isHolidays = flight || TripType === tripService.tripTypes.Holiday;\r\n var url = isAmmendBooking ? \"dashboard/amend-booking/\" + $routeParams.BookingRef + \"/\" + $routeParams.BookingId :\r\n isHolidays ? 'holidays' :\r\n 'hotels';\r\n url += \"/\" + tripId;\r\n if (estabId && (TRPCONFIG.Domain.HotelSearchNoResultsPage !== 'availability' || isRoomSearch)) {\r\n url += \"/\" + estabId;\r\n }\r\n var search = _.omit($location.search(), '__bd4sort');\r\n var querystring = $.param(search);\r\n if (querystring) {\r\n url += \"?\" + querystring;\r\n }\r\n return url;\r\n }\r\n // Listen for visibility change events. This helps with detecting a new tab opening.\r\n document.addEventListener('visibilitychange', function () {\r\n // The idea here, is that we combine ALL 'lost' session storages into one local storage. This example is only for session searchDates.\r\n if (document.visibilityState === 'hidden') {\r\n // To set local storage from session storage\r\n var sessionItems_1 = [\r\n 'PreselectFlight',\r\n 'storeSelectedFlight',\r\n 'searchDates',\r\n 'URLstorage',\r\n 'FlightDetailsId',\r\n 'priceQtys',\r\n 'hotelSearchResults',\r\n 'DefaultFlight',\r\n 'SkywardsMilesFlights'\r\n ];\r\n var excludedGAItems_1 = ['config', 'utmId', 'tripType'];\r\n var gaEvents_1 = ['gtm.js', 'gtm.dom', 'gtm.load'];\r\n var theSearchDates = sessionStorage.getItem('searchDates');\r\n var dataLayerItems_1 = [];\r\n window.dataLayer.forEach(function (dl) {\r\n var dlKeys = Object.keys(dl);\r\n var commonItems = dlKeys.filter(function (item) { return excludedGAItems_1.includes(item); });\r\n if (!commonItems[0]) {\r\n if (!gaEvents_1.includes(dl.event)) {\r\n dataLayerItems_1.push(dl);\r\n }\r\n }\r\n });\r\n var obj = Object.keys(sessionStorage).reduce(function (obj, key) {\r\n if (sessionItems_1.includes(key)) {\r\n obj[key] = sessionStorage.getItem(key);\r\n }\r\n return obj;\r\n }, {});\r\n if (theSearchDates && !localStorage.getItem('sessionStorageData')) {\r\n if (obj !== null) {\r\n localStorage.setItem('sessionStorageData', JSON.stringify(obj));\r\n localStorage.setItem('gaSession', JSON.stringify(dataLayerItems_1));\r\n }\r\n }\r\n }\r\n else {\r\n // To fetch local storage and set session storage in new tab\r\n var theSearchDates = sessionStorage.getItem('searchDates');\r\n if (!theSearchDates && localStorage.getItem('sessionStorageData')) {\r\n copyLocalToSessionStorage();\r\n }\r\n else {\r\n // when local storage not present then fetch on the storage event\r\n window.addEventListener('storage', function (e) {\r\n if (e.key === 'sessionStorageData') {\r\n copyLocalToSessionStorage();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n function copyLocalToSessionStorage() {\r\n var gaSessionData = localStorage.getItem('gaSession');\r\n gaSessionData = JSON.parse(gaSessionData);\r\n if (gaSessionData) {\r\n var uniqueResult = gaSessionData.filter(function (dlNew) {\r\n return !window.dataLayer.some(function (dlOriginal) {\r\n return _.isEqual(dlOriginal, dlNew);\r\n });\r\n });\r\n window.dataLayer = uniqueResult ? uniqueResult.concat(window.dataLayer) : window.dataLayer;\r\n }\r\n var sessionStorageData = localStorage.getItem('sessionStorageData');\r\n sessionStorageData = JSON.parse(sessionStorageData);\r\n for (var key in sessionStorageData) {\r\n if (sessionStorageData.hasOwnProperty(key)) {\r\n sessionStorage.setItem(key, sessionStorageData[key]);\r\n }\r\n }\r\n if (sessionStorage.getItem('searchDates')) {\r\n localStorage.removeItem('sessionStorageData');\r\n localStorage.removeItem('gaSession');\r\n }\r\n }\r\n function selectHotel(tripId, hotel, basketId, area, sameWindow, newTab) {\r\n tripService.setDirectToHotel(tripId, false);\r\n basketStore.flight(basketId)\r\n .then(function (flight) {\r\n if (flightUnavailable) {\r\n return;\r\n }\r\n var url = getHotelUrl({ tripId: tripId, hotel: hotel, flight: flight });\r\n if (newTab) {\r\n windowUtil.open(url);\r\n }\r\n else if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow && !sameWindow) {\r\n windowUtil.open(url);\r\n }\r\n else {\r\n $location.url(url);\r\n }\r\n });\r\n }\r\n function restartCurrentWorkflow(tripId) {\r\n tripService.getTrip(tripId)\r\n .then(function (trip) {\r\n basketStore.all(trip.BasketId)\r\n .then(function (products) {\r\n if (products.t != null) {\r\n $location.path('transfers');\r\n }\r\n else if (products.f != null) {\r\n $location.path('holidays');\r\n }\r\n else {\r\n $location.path('hotels');\r\n }\r\n });\r\n });\r\n }\r\n function restartHolidayWorkflow() {\r\n $location.path('holidays');\r\n }\r\n function getFlight(basketId) {\r\n return basketStore.flight(basketId);\r\n }\r\n function getHotel(basketId) {\r\n return basketStore.hotel(basketId);\r\n }\r\n function changeFlight(tripId) {\r\n $location.path(\"holidays/flights/\" + tripId);\r\n }\r\n function getTransfers(searchId, basketId, tripId, params) {\r\n if (params === void 0) { params = {}; }\r\n if (searchId) {\r\n return transferSearch.getSearchResults(searchId, tripId);\r\n }\r\n return basketStore.all(basketId).then(function (products) {\r\n if (params.airport && params.dates) {\r\n searchUnitService.startDate(searchUnitService.transfer, _(params).get('dates.arrivalDate'));\r\n searchUnitService.endDate(searchUnitService.transfer, _(params).get('dates.departureDate'));\r\n searchUnitService.setDestinationAirport(params.airport);\r\n }\r\n else {\r\n var legs = _.get(products, 'f.Details.Itinerary.Legs', []);\r\n searchUnitService.startDate(searchUnitService.transfer, legs[0].ArrivalDate);\r\n if (legs.length > 1) {\r\n searchUnitService.endDate(searchUnitService.transfer, legs[legs.length - 1].DepartureDate);\r\n }\r\n searchUnitService.setDestinationAirport(legs[0].ArrivalAirport);\r\n }\r\n if (products.h != null) {\r\n searchUnitService.setLocationId(products.h.Details.LocationId);\r\n }\r\n var errors = transferSearch.validateSearchCriteria();\r\n if (errors.length > 0) {\r\n return $q.when([]);\r\n }\r\n var args = { searchId: guidService.uuid(), newSearch: true, tripId: tripId, isFlightPlus: true };\r\n if (products.h && products.h.FuturePayments.length) {\r\n args.BalanceDueDateOverride = products.h.FuturePayments[products.h.FuturePayments.length - 1].Due;\r\n }\r\n return transferSearch.search(args);\r\n });\r\n }\r\n function getInsuranceQuotes(searchId, basketId, tripId, params) {\r\n if (params === void 0) { params = {}; }\r\n if (searchId) {\r\n return insuranceService.getInsuranceQuotesFromSession(searchId);\r\n }\r\n return $q.all({\r\n flight: basketStore.flight(basketId),\r\n hotel: basketStore.hotel(basketId)\r\n }).then(function (_a) {\r\n var flight = _a.flight, hotel = _a.hotel;\r\n if (flight == null && hotel == null) {\r\n return $q.when([]);\r\n }\r\n var legs = _.get(flight, 'Details.Itinerary.Legs');\r\n var search = function (ageList) {\r\n var request = {\r\n AvailabilitySearchId: guidService.uuid(),\r\n DestinationAirportCode: _.get(params, 'airport.Code') || legs[0].ArrivalAirport.Code,\r\n StartDate: _.get(params, 'dates.arrivalDate') || legs[0].DepartureDate,\r\n Ages: ageList\r\n };\r\n request.EndDate = _.get(params, 'dates.departureDate') || (params.oneWayOnly ? legs[0].ArrivalDate\r\n : legs[legs.length - 1].ArrivalDate);\r\n return insuranceService.getInsuranceQuotes(tripId, request);\r\n };\r\n if (params.ages) {\r\n return search(params.ages);\r\n }\r\n return tripService.getTripReducedOccupancy(tripId).then(function (o) {\r\n var ages = _.concat(_.times(o.Adults, function () { return 21; }), o.ChildAges);\r\n return search(ages);\r\n });\r\n });\r\n }\r\n function updateInsuranceQuote(basketId, tripId, selectedOptionId, params) {\r\n // tackle a scenario when quote is updated by navigating to booking form rather than user action\r\n // in that case do not remove it\r\n if (!selectedOptionId) {\r\n return $q.when([]);\r\n }\r\n if (!params.ages || params.ages.length === 0) {\r\n return basketStore.removeInsurance(basketId);\r\n }\r\n //need to update the quote we have\r\n // get existing quote, make a new request, find the selected option and add it to the basket\r\n var key = insuranceService.decomposeOptionId(selectedOptionId);\r\n //remove existing\r\n return basketStore.removeInsurance(basketId).then(function () {\r\n //get new quotes\r\n return getInsuranceQuotes(null, basketId, tripId, params);\r\n }).then(function (insuranceQuotes) {\r\n //find the same type\r\n return _.filter(insuranceQuotes, function (q) {\r\n return q.SupplierId === key.supplierId && q.QuoteType.SchemeId === key.schemeId && q.QuoteType.TypeId === key.typeId;\r\n });\r\n }).then(function (quotes) {\r\n //add it to our basket\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n return selectInsurance(quotes[0], trip.InsuranceRequest.AvailabilitySearchId, basketId, tripId);\r\n });\r\n });\r\n }\r\n function getMarhaba(searchId, basketId, tripId, parameters) {\r\n if (!searchId) {\r\n searchId = guidService.uuid();\r\n }\r\n $location.url(\"marhaba/\" + tripId);\r\n return marhabaSearch.search({ searchId: searchId, tripId: tripId, newSearch: true, parameters: parameters });\r\n }\r\n function bookBasket(tripId, basketId) {\r\n return basketStore.flight(basketId)\r\n .then(function (f) {\r\n if (f) {\r\n return _prepareBooking(tripId, 'holidays/book');\r\n }\r\n });\r\n }\r\n function bookAttractionsBasket(tripId) {\r\n if (tripId === void 0) { tripId = guidService.uuid(); }\r\n basketStore.getAttractionsBasketId()\r\n .then(function (basketId) { return createTrip(tripId, tripService.tripTypes.Attractions, basketId); })\r\n .then(function () { return _prepareBooking(tripId, 'attractions/book'); });\r\n }\r\n function selectHotelRooms(hotel, roomIds, tripId) {\r\n if (flightUnavailable) {\r\n return;\r\n }\r\n var selectRoomFirstTime = sessionStorage.getItem('preselectedHotelData') === null;\r\n $q.all({\r\n trip: tripService.clearOptionalExtras(tripId),\r\n numberOfNights: tripService.getHotelsRequestNumberOfNights(tripId),\r\n currency: tripService.getCurrency(tripId)\r\n })\r\n .then(function (_a) {\r\n var trip = _a.trip, numberOfNights = _a.numberOfNights, currency = _a.currency;\r\n if (trip && trip.HotelsRequest) {\r\n var bookingPath = getBookingPath(trip);\r\n var rebookId = $routeParams.BookingId;\r\n basketStore.addHotel(trip.HotelsRequest.AvailabilitySearchId, hotel.Id, roomIds, trip.BasketId, bookingPath, trip.PackageId, rebookId)\r\n .then(function (res) {\r\n basketStore.flight(trip.BasketId)\r\n .then(function (f) {\r\n var options = mandatoryTransferService.getOptions();\r\n if (TRPCONFIG.Domain.MandatoryExtrasEnabled && options) {\r\n basketStore.addOptions(basketStore.productType.Transfer, res.ProductId, options, trip.BasketId);\r\n }\r\n broker.publish('roomsAddedToBasket', hotel);\r\n service.updateBasket();\r\n if (f) {\r\n if (isFlightPreselected() && (!flightChanged || selectRoomFirstTime)) {\r\n $location.path(\"holidays/flights/\" + tripId);\r\n }\r\n else {\r\n //Added below if else to handle case while coming from emirates.com/deeplink if we have more then 1 flight then show Choose you flight screen\r\n // eslint-disable-next-line no-lonely-if\r\n if (sessionStorage.getItem('IsDeepLinkURL')) {\r\n sessionStorage.removeItem('IsDeepLinkURL');\r\n $location.path(\"holidays/flights/\" + tripId);\r\n }\r\n else {\r\n $location.path(\"holidays/options/\" + tripId);\r\n }\r\n }\r\n }\r\n else if (TRPCONFIG.DeviceSettings.HotelOptionsEnabled\r\n && TRPCONFIG.Domain.CurrencyCode === currency\r\n && TRPCONFIG.Domain.HotelOptionsMinDuration\r\n && numberOfNights >= TRPCONFIG.Domain.HotelOptionsMinDuration\r\n && hotel.LinkedAirports\r\n && hotel.LinkedAirports.length\r\n && !_.intersection(hotel.LinkedAirports.map(function (a) { return a.Code; }), TRPCONFIG.Domain.HotelOptionsFilterOutAirportCodes).length) {\r\n $location.path(\"hotels/options/\" + tripId);\r\n }\r\n else {\r\n var totalRooms = trip.HotelsRequest.Rooms && trip.HotelsRequest.Rooms.length || 0;\r\n var singleRoomOnly = TRPCONFIG.Domain.ParasolHotelBookingSingleRoomOnly\r\n && totalRooms === 1;\r\n var isMobile = TRPCONFIG.IsMobileView;\r\n var goV3 = isMobile && (TRPCONFIG.Domain.ParasolHotelBooking && singleRoomOnly)\r\n || (TRPCONFIG.Domain.ParasolHotelBooking && !TRPCONFIG.Domain.ParasolHotelBookingSingleRoomOnly);\r\n _prepareBooking(tripId, 'hotels/book', goV3);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n function bookHotelBasket(tripId) {\r\n _prepareBooking(tripId, 'hotels/book');\r\n }\r\n function updateBrandedFare(params) {\r\n return basketStore.updateBrandedFare(params)\r\n .then(function (f) {\r\n broker.publish('flightAddedToBasket', f);\r\n service.updateBasket();\r\n });\r\n }\r\n function showChangeHotelsDurationConfirmationPopup(flight) {\r\n var legs = flight.Legs;\r\n var flightArrival = (legs && legs[0].Segments) ? dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate) : null;\r\n var flightReturn = (legs && legs.length > 1) ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\r\n var zeroTime = dateUtil.zeroTime(flightArrival, true);\r\n var checkInDate = dateUtil.format(flightArrival, 'dd MMMM yyyy');\r\n var checkInTime = dateUtil.format(flightArrival, 'HH:mm');\r\n var newCheckInDate = dateUtil.format(dateUtil.addDays(zeroTime, -1, true), 'dd MMMM yyyy');\r\n var nights = dateUtil.numberOfNights(flightArrival, flightReturn);\r\n var newNights = dateUtil.numberOfNights(dateUtil.addDays(zeroTime, -1, true), flightReturn);\r\n var headerText = resourceService.get('CHANGENIGHTSPOPUPHEADER');\r\n var messageText = String.format(resourceService.get('CHANGE_HOTEL_CHECKIN_POPUP_MSG'), checkInDate, checkInTime, checkInDate, nights, newCheckInDate, newNights);\r\n var nightsText = resourceService.get('NIGHTS');\r\n var nightsButtonLabel = nights + \" \" + nightsText;\r\n var newNightsButtonLabel = newNights + \" \" + nightsText;\r\n var dateTemplate = messageText;\r\n var messageHtml = dateTemplate;\r\n return changeDurationPopupService.showPopup({\r\n popupHeader: headerText,\r\n popupMessage: messageHtml,\r\n nightsButtonLabel: nightsButtonLabel,\r\n newNightsButtonLabel: newNightsButtonLabel\r\n });\r\n }\r\n function _block() {\r\n $rootScope.$emit('block', {\r\n title: resourceService.get('SEARCHINGHOTELS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'holidays-hotelSearchCtrl-isHolidayTrue'\r\n });\r\n }\r\n function selectFlight(flight, tripId, opts, params, mobileParams, forceRedirectToOptions) {\r\n //if the flight does not contain full date information (AVRO), then we\r\n //have to wait until after the detail call has completed before moving on to\r\n //the hotel route\r\n if (mobileParams === void 0) { mobileParams = {}; }\r\n if (forceRedirectToOptions === void 0) { forceRedirectToOptions = false; }\r\n var defaultFlight = sessionStorage.getItem('DefaultFlight') ? JSON.parse(sessionStorage.getItem('DefaultFlight')) : null;\r\n var HasFullDates = flight.HasFullDates, Legs = flight.Legs;\r\n var airportCodeFilter = TRPCONFIG.Domain.AutoFilterByAirport ? Legs[0].ArrivalAirport.Code : null;\r\n var storeSelectedFlight = sessionStorage.getItem('storeSelectedFlight');\r\n storeSelectedFlight = JSON.parse(storeSelectedFlight !== null ? storeSelectedFlight : '{}');\r\n var isNewFlight = false;\r\n isNewFlight = (storeSelectedFlight && storeSelectedFlight.FlightId) || (defaultFlight && defaultFlight.FlightId) ? isNewFlight : !isNewFlight;\r\n var flightComparisonResult = (storeSelectedFlight && storeSelectedFlight.FlightId) ? _compareFlights(storeSelectedFlight, flight) :\r\n (defaultFlight && defaultFlight.Details.Itinerary) ? _compareFlights(defaultFlight.Details.Itinerary, flight) : _compareFlights({}, flight);\r\n flightChanged = flightComparisonResult.isDifferentFlights;\r\n oldAndNewFlightDatesMatch = flightComparisonResult.isDatesMatch;\r\n var preselectedHotelData = sessionStorage.getItem('preselectedHotelData');\r\n flightUnavailable = false;\r\n flightIncompleteDates = !HasFullDates;\r\n TRPCONFIG.Domain.ChangeHotelNightsDuration = false;\r\n hotelSearch.setAirportCodeFilter(airportCodeFilter);\r\n sessionStorage.setItem('storeSelectedFlight', JSON.stringify(flight));\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n if (trip) {\r\n var BasketId_1 = trip.BasketId, FlexibleTripType = trip.FlexibleTripType, FlightsRequest_1 = trip.FlightsRequest, HotelsRequest = trip.HotelsRequest, PackageId_1 = trip.PackageId, TripType = trip.TripType;\r\n var hotelsRequest = trip.HotelsRequest;\r\n var legs = flight.Legs;\r\n var flightArrival = (legs && legs[0].Segments) ? dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate) : null;\r\n var isFlightType = TripType === tripService.tripTypes.Flight;\r\n var isHolidayType_1 = TripType === tripService.tripTypes.Holiday;\r\n var isMultiDestHolidayType_1 = TripType === tripService.tripTypes.MultiDestHoliday;\r\n var isDirectFlight = _.reduce(Legs, function (result, value) { return result.NumberOfStops + value.NumberOfStops; }) === 0;\r\n var isOneRoomOccupency = HotelsRequest && HotelsRequest.Rooms && HotelsRequest.Rooms.length === 1;\r\n var isHotelsOnFlights_1 = TRPCONFIG.Domain.HotelsOnFlightsEnabled && isFlightType && FlexibleTripType && !PackageId_1 && isDirectFlight && isOneRoomOccupency;\r\n var selectedCheckIn_1 = dateUtil.parseDate(hotelsRequest.CheckInDate);\r\n var flightCheckIn_1 = flightArrival ? dateUtil.parseDate(getCheckInDateForFlight(flightArrival)) : flightArrival;\r\n var ekReferrer = cookieService.get('CampaignReferrer');\r\n var nextRoute_1 = getRedirectUrlAfterSelectFlight(isHolidayType_1, isHotelsOnFlights_1, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, preselectedHotelData);\r\n var timeRangeChangeDurationPoppup_1 = flightArrival ? (flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff && flightArrival.getHours() <= TRPCONFIG.Domain.HotelCheckInCutOffTime) : null;\r\n if (timeRangeChangeDurationPoppup_1 && !ekReferrer) {\r\n _block();\r\n return showChangeHotelsDurationConfirmationPopup(flight).then(function () {\r\n searchFlowAfterFlightSelection(trip, tripId, FlightsRequest_1, flight, BasketId_1, opts, PackageId_1, isMultiDestHolidayType_1, isHolidayType_1, isHotelsOnFlights_1, nextRoute_1, params, forceRedirectToOptions, preselectedHotelData, selectedCheckIn_1, flightCheckIn_1, isNewFlight, timeRangeChangeDurationPoppup_1, mobileParams);\r\n });\r\n }\r\n if (!timeRangeChangeDurationPoppup_1 || (ekReferrer && ekReferrer.length > 0)) {\r\n searchFlowAfterFlightSelection(trip, tripId, FlightsRequest_1, flight, BasketId_1, opts, PackageId_1, isMultiDestHolidayType_1, isHolidayType_1, isHotelsOnFlights_1, nextRoute_1, params, forceRedirectToOptions, preselectedHotelData, selectedCheckIn_1, flightCheckIn_1, isNewFlight, timeRangeChangeDurationPoppup_1, mobileParams);\r\n }\r\n }\r\n });\r\n }\r\n function searchFlowAfterFlightSelection(trip, tripId, FlightsRequest, flight, BasketId, opts, PackageId, isMultiDestHolidayType, isHolidayType, isHotelsOnFlights, nextRoute, params, forceRedirectToOptions, preselectedHotelData, selectedCheckIn, flightCheckIn, isNewFlight, timeRangeChangeDurationPoppup, mobileParams) {\r\n return tripService.clearOptionalExtras(tripId).then(function () {\r\n if (!isNewFlight) {\r\n var newCheckIn = flightCheckIn;\r\n if (timeRangeChangeDurationPoppup && TRPCONFIG.Domain.ChangeHotelNightsDuration) {\r\n var zeroTime = dateUtil.zeroTime(flightCheckIn, true);\r\n flightCheckIn = dateUtil.addDays(zeroTime, -1, true);\r\n newCheckIn = new Date(flightCheckIn);\r\n }\r\n oldAndNewFlightDatesMatch = false;\r\n oldAndNewFlightDatesMatch = (newCheckIn && selectedCheckIn && newCheckIn.getDate() !== selectedCheckIn.getDate()) ? oldAndNewFlightDatesMatch : !oldAndNewFlightDatesMatch;\r\n nextRoute = getRedirectUrlAfterSelectFlight(isHolidayType, isHotelsOnFlights, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, preselectedHotelData);\r\n }\r\n if (isHolidayType || isHotelsOnFlights) {\r\n var paramsCopy = __assign({}, params, mobileParams);\r\n nextRoute = optionallyAppendParam(nextRoute, 'fid', paramsCopy && paramsCopy.fid);\r\n }\r\n if (FlightsRequest) {\r\n tripService.setSelectedFlight(tripId, flight, opts);\r\n var addFlightPromise = (flight.isMultiDestHolidayLinked\r\n ? basketStore.addMultiDestHolidayFlight\r\n : basketStore.addFlight)(FlightsRequest.AvailabilitySearchId, flight, BasketId, tripId, true, opts, PackageId);\r\n if (!isMultiDestHolidayType && isFlightPreselected() && trip.TripType === 4) {\r\n if (isHolidayType || isHotelsOnFlights) {\r\n if (!nextRoute.includes('fbt=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'fbt', params && params.fbt);\r\n }\r\n if (!nextRoute.includes('fstr=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'fstr', params && params.fstr);\r\n }\r\n if (!nextRoute.includes('hpr=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'hpr', params && params.hpr);\r\n }\r\n }\r\n $location.url(nextRoute);\r\n }\r\n //if we are in flight only mode here, we need to make sure that this cannot trigger a hotel search\r\n //due to dates being adjusted.\r\n return addFlightPromise.then(function (addFlightResponse) {\r\n if (addFlightResponse) {\r\n broker.publish('flightAddedToBasket', addFlightResponse);\r\n service.updateBasket();\r\n if (opts && opts.skipRedirection) {\r\n return;\r\n }\r\n if (!isMultiDestHolidayType) {\r\n if (isHolidayType || isHotelsOnFlights) {\r\n if (!nextRoute.includes('fbt=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'fbt', params && params.fbt);\r\n }\r\n if (!nextRoute.includes('fstr=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'fstr', params && params.fstr);\r\n }\r\n if (!nextRoute.includes('hpr=')) {\r\n nextRoute = optionallyAppendParam(nextRoute, 'hpr', params && params.hpr);\r\n }\r\n }\r\n $location.url(nextRoute);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n function getRedirectUrl(tripId, oldAndNewFlightDatesMatch, estabId) {\r\n if (urlStoreService.isPreviousUrlHotelDetails(tripId)) {\r\n return urlStoreService.getPreviousURL();\r\n }\r\n if (urlStoreService.isPreviousUrlHotelOptions(tripId) || urlStoreService.isPreviousUrlHotelBook(tripId)) {\r\n if (oldAndNewFlightDatesMatch) {\r\n return urlStoreService.getPreviousURL();\r\n }\r\n return estabId ? \"holidays/\" + tripId + \"/\" + estabId : '';\r\n }\r\n return '';\r\n }\r\n function getRedirectUrlHotelFirstJourney(tripId, oldAndNewFlightDatesMatch, estabId) {\r\n if (oldAndNewFlightDatesMatch) {\r\n return \"holidays/options/\" + tripId;\r\n }\r\n return estabId ? \"holidays/\" + tripId + \"/\" + estabId : '';\r\n }\r\n function getRedirectUrlAfterSelectFlight(isHolidayType, isHotelsOnFlights, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, hotelData) {\r\n var hotelDataJson = hotelData && JSON.parse(hotelData);\r\n var estabId = _.get(hotelDataJson, 'd.Itinerary.EstabId');\r\n var nextPath = (isHolidayType || isHotelsOnFlights) && !forceRedirectToOptions && sessionStorage.getItem('preselectedHotelData') === null ? 'hotels' : 'options';\r\n var backwardCompatibilityUrl = \"holidays/\" + nextPath + \"/\" + tripId;\r\n switch (true) {\r\n case TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled:\r\n return getRedirectUrlHotelFirstJourney(tripId, oldAndNewFlightDatesMatch, estabId) || backwardCompatibilityUrl;\r\n case TRPCONFIG.Domain2.EnableChangeFlightRedirectionToPrevious:\r\n return getRedirectUrl(tripId, oldAndNewFlightDatesMatch, estabId) || backwardCompatibilityUrl;\r\n default:\r\n return backwardCompatibilityUrl;\r\n }\r\n }\r\n function _compareFlights(selectedFlight, newFlight) {\r\n var isDifferentFlights = true;\r\n var isDatesMatch = false;\r\n if (selectedFlight && selectedFlight.FlightId !== undefined && newFlight.FlightId !== undefined) {\r\n isDifferentFlights = selectedFlight.FlightId !== newFlight.FlightId;\r\n }\r\n if (selectedFlight && selectedFlight.Legs !== undefined && selectedFlight.Legs[0] !== undefined && selectedFlight.Legs[1] !== undefined) {\r\n isDatesMatch = isCheckOutDatesMatched(selectedFlight.Legs[1].DepartureDate, newFlight.Legs[1].DepartureDate)\r\n && isCheckInDatesMatched(selectedFlight.Legs[0].ArrivalDate, newFlight.Legs[0].ArrivalDate);\r\n }\r\n return { isDifferentFlights: isDifferentFlights, isDatesMatch: isDatesMatch };\r\n }\r\n function isCheckInDatesMatched(date1, date2) {\r\n date1 = getCheckInDateForFlight(getIOSDateFormat(date1));\r\n date2 = getCheckInDateForFlight(getIOSDateFormat(date2));\r\n return $filter('date')(date1, 'dd MM yy') === $filter('date')(date2, 'dd MM yy');\r\n }\r\n function isCheckOutDatesMatched(date1, date2) {\r\n date1 = getCheckOutDateForFlight(getIOSDateFormat(date1));\r\n date2 = getCheckOutDateForFlight(getIOSDateFormat(date2));\r\n return $filter('date')(date1, 'dd MM yy') === $filter('date')(date2, 'dd MM yy');\r\n }\r\n function getHotelDatesFromFlight(flight) {\r\n var checkInDate = _.get(flight, 'Legs[0].ArrivalDate');\r\n var checkOutDate = _.get(flight, 'Legs[1].DepartureDate');\r\n if (checkInDate && checkOutDate) {\r\n checkInDate = getCheckInDateForFlight(getIOSDateFormat(checkInDate));\r\n checkOutDate = getCheckOutDateForFlight(getIOSDateFormat(checkOutDate));\r\n }\r\n return [checkInDate, checkOutDate];\r\n }\r\n function getIOSDateFormat(paramDate) {\r\n var year = paramDate.split(/[- : T]/)[0];\r\n var month = paramDate.split(/[- : T]/)[1];\r\n month = Number(month) - 1;\r\n var day = paramDate.split(/[- : T]/)[2];\r\n var hour = paramDate.split(/[- : T]/)[3];\r\n var min = paramDate.split(/[- : T]/)[4];\r\n var second = paramDate.split(/[- : T]/)[5];\r\n if (month < 10) {\r\n month = \"0\" + month;\r\n }\r\n var date = new Date(year, month, day, hour, min, second);\r\n return date;\r\n }\r\n function getNumberOfNightsFromFlights() {\r\n var flights = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n flights[_i] = arguments[_i];\r\n }\r\n return flights.map(function (flight) {\r\n var checkInDate = _.get(flight, 'Legs[0].ArrivalDate');\r\n var checkOutDate = _.get(flight, 'Legs[1].DepartureDate');\r\n if (checkInDate && checkOutDate) {\r\n checkInDate = getCheckInDateForFlight(getIOSDateFormat(checkInDate));\r\n checkOutDate = getCheckOutDateForFlight(getIOSDateFormat(checkOutDate));\r\n return dateUtil.numberOfNights(checkInDate, checkOutDate);\r\n }\r\n return undefined;\r\n });\r\n }\r\n function changeToFlightWorkflow(tripId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var TripType, isHolidayType, BasketId, basketStoreFlightResponse;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, tripService.getTrip(tripId)];\r\n case 1:\r\n TripType = (_a.sent()).TripType;\r\n isHolidayType = TripType === tripService.tripTypes.Holiday;\r\n if (!(TRPCONFIG.Domain.HotelsOnFlightsEnabled && isHolidayType)) return [3 /*break*/, 5];\r\n return [4 /*yield*/, tripService.changeTripType(tripId, tripService.tripTypes.Flight)];\r\n case 2:\r\n BasketId = (_a.sent()).BasketId;\r\n return [4 /*yield*/, basketStore.removeAccomodation(BasketId)];\r\n case 3:\r\n _a.sent();\r\n return [4 /*yield*/, basketStore.flight(BasketId)];\r\n case 4:\r\n basketStoreFlightResponse = _a.sent();\r\n broker.publish('flightAddedToBasket', basketStoreFlightResponse);\r\n service.updateBasket();\r\n _a.label = 5;\r\n case 5:\r\n $timeout(function () { return $location.url(optionallyAppendParam(\"/holidays/options/\" + tripId, 'fid', $routeParams && $routeParams.fid)); });\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function changeToHolidayTripType(tripId) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var packagePrice, TripType, isFlightType;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!TRPCONFIG.Domain.HotelsOnFlightsEnabled) return [3 /*break*/, 3];\r\n return [4 /*yield*/, tripService.usePackageRates(tripId)];\r\n case 1:\r\n packagePrice = _a.sent();\r\n if (!!packagePrice) return [3 /*break*/, 3];\r\n return [4 /*yield*/, tripService.getTrip(tripId)];\r\n case 2:\r\n TripType = (_a.sent()).TripType;\r\n isFlightType = TripType === tripService.tripTypes.Flight;\r\n if (isFlightType) {\r\n return [2 /*return*/, tripService.changeTripType(tripId, tripService.tripTypes.Holiday)];\r\n }\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n }\r\n function updateFlight(flight, tripId, opts, numBags) {\r\n tripService.getTrip(tripId).then(function (trip) {\r\n var holiday = trip.TripType === tripService.tripTypes.Holiday;\r\n if (trip) {\r\n tripService.clearOptionalExtras(tripId).then(function () {\r\n if (trip.FlightsRequest) {\r\n tripService.setSelectedFlight(tripId, flight, opts);\r\n basketStore.addFlight(trip.FlightsRequest.AvailabilitySearchId, flight, trip.BasketId, tripId, holiday, opts, trip.PackageId)\r\n .then(function (f) {\r\n f.Details.Itinerary = _.assign({}, flight, f.Details.Itinerary);\r\n broker.publish('flightAddedToBasket', f);\r\n flightSearch.modifyBags(numBags);\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n function selectMultiFlight(option, tripId) {\r\n var nextRoute = 'dp/basket/';\r\n tripService.getTrip(tripId).then(function (trip) {\r\n if (!trip || !trip.MultiFlightsRequest) {\r\n return;\r\n }\r\n basketStore.addMultiFlight(trip.MultiFlightsRequest.AvailabilitySearchId, option, trip.BasketId, tripId).then(function () {\r\n $location.path(nextRoute + tripId);\r\n });\r\n });\r\n }\r\n function getCarQuotes(basketId, tripId, driverAge) {\r\n return basketStore.flight(basketId).then(function (flight) {\r\n if (flight == null) {\r\n return $q.when([]);\r\n }\r\n return tripService.getTripReducedOccupancy(tripId).then(function (occ) {\r\n var legs = flight.Details.Itinerary.Legs;\r\n var request = _addCommonCarHireRequestCriteria({\r\n AvailabilitySearchId: guidService.uuid(),\r\n PickUpLocation: {\r\n Type: 2,\r\n Code: legs[0].ArrivalAirport.Code\r\n },\r\n DropOffLocation: {\r\n Type: 2,\r\n Code: legs[0].ArrivalAirport.Code\r\n },\r\n PickUpDate: dateUtil.roundedToStartOfHour(dateUtil.addHours(legs[0].ArrivalDate, TRPCONFIG.CarHireFlightDepartureOffset), true),\r\n DropOffDate: dateUtil.roundedToStartOfHour(dateUtil.addHours(legs[legs.length - 1].DepartureDate, TRPCONFIG.CarHireFlightReturnOffset), true),\r\n DriverAge: driverAge,\r\n PassengerCount: occ.Adults + occ.ChildAges.length\r\n }, 0);\r\n return carHireService.getCarQuotes(tripId, request);\r\n });\r\n });\r\n }\r\n function getCarQuotesFromSession(searchId, pageIndex) {\r\n var request = _addCommonCarHireRequestCriteria({ AvailabilitySearchId: searchId }, pageIndex);\r\n return carHireService.getCarQuotesFromSession(request);\r\n }\r\n function _addCommonCarHireRequestCriteria(request, pageIndex) {\r\n return _.assign(request, {\r\n SortCriterion: enumService.CarHireSortOrder.Recommended,\r\n Paging: {\r\n PageIndex: pageIndex,\r\n PageSize: 5\r\n }\r\n });\r\n }\r\n function getParkingQuotes(searchId, basketId, tripId) {\r\n var _tidyAirportParkingTitles = function (quotes) {\r\n if (!quotes || quotes.length === 0) {\r\n return;\r\n }\r\n _.forEach(quotes, function (q) {\r\n q.CarPark = q.CarPark.replace(/\\s+\\(.*?\\)\\s*/g, '');\r\n q.CarPark = q.CarPark.replace(/(\\s*-\\s?(on|off)\\sairport\\s*)/gi, '');\r\n });\r\n return quotes;\r\n };\r\n if (!searchId) {\r\n return basketStore.flight(basketId).then(function (flight) {\r\n if (flight == null) {\r\n return $q.when([]);\r\n }\r\n var legs = flight.Details.Itinerary.Legs;\r\n var request = {\r\n AvailabilitySearchId: guidService.uuid(),\r\n DepartureDate: legs[0].DepartureDate,\r\n ReturnDate: legs.length > 1 ? legs[legs.length - 1].ArrivalDate : null,\r\n AirportCode: legs[0].DepartureAirport.Code,\r\n DepartureFlightNumber: legs[0].Segments[0].FlightNumber,\r\n ReturnFlightNumber: legs.length > 1 ? legs[legs.length - 1].Segments[0].FlightNumber : null,\r\n PassengerCount: flight.CostBreakdown[0].Quantity + 1,\r\n DepartureTerminalCode: null\r\n };\r\n if (TRPCONFIG.Domain.AirportParkingUseTerminal === true) {\r\n return flightsTerminalService.getTerminalsForAirport(request.AirportCode)\r\n .then(function (airport) {\r\n //if we know about the airport and it has more than one terminal use the terminal code\r\n //to filter down our parking otherwise assume only one terminal\r\n if (airport && airport.Terminals.length > 1) {\r\n return flightsTerminalService.getTerminalForFlight(request.AirportCode, request.DepartureFlightNumber, request.DepartureDate)\r\n .then(function (terminal) {\r\n if (terminal) {\r\n request.DepartureTerminalCode = terminal.Code;\r\n return parkingService.getParkingQuotes(tripId, request)\r\n .then(function (quotes) { return _tidyAirportParkingTitles(quotes); });\r\n }\r\n //record it if we don't have info on the terminal a flight is going from\r\n loggingService.logInfo(\"No terminal information found for \" + request.AirportCode + \" : \" + request.DepartureFlightNumber + \" on \" + request.DepartureDate);\r\n return $q.when(null);\r\n });\r\n }\r\n return parkingService.getParkingQuotes(tripId, request)\r\n .then(function (quotes) { return _tidyAirportParkingTitles(quotes); });\r\n });\r\n }\r\n return parkingService.getParkingQuotes(tripId, request);\r\n });\r\n }\r\n return tripService.getTrip(tripId)\r\n .then(function (trip) {\r\n return parkingService.getParkingQuotesFromSession(searchId, trip.ParkingRequest)\r\n .then(function (quotes) {\r\n if (TRPCONFIG.Domain.AirportParkingUseTerminal === true) {\r\n return _tidyAirportParkingTitles(quotes);\r\n }\r\n return quotes;\r\n });\r\n });\r\n }\r\n function getAttractionQuotes(searchId, basketId, tripId) {\r\n if (searchId) {\r\n return attractionService.getAttractionQuotesFromSession(searchId);\r\n }\r\n return $q.all([\r\n currentDestination.getCurrentDestination(),\r\n basketStore.hotel(basketId),\r\n attractionService.getOccupancy(tripId),\r\n tripService.getHotelsRequestCheckInDate(tripId, true),\r\n tripService.getHotelsRequestCheckOutDate(tripId, true),\r\n tripService.getFlightsRequestDepartureDate(tripId, true),\r\n tripService.getFlightsRequestReturnDate(tripId, true)\r\n ]).then(function (_a) {\r\n var dest = _a[0], hotel = _a[1], occ = _a[2], checkInDate = _a[3], checkOutDate = _a[4], departureDate = _a[5], returnDate = _a[6];\r\n //Exactly one of ProvinceId and LocationId must be non-zero\r\n //we might be dealing with a polygon therefore try to fill in the details from the hotel\r\n if (!dest) {\r\n return;\r\n }\r\n var locationId = dest.LocationId;\r\n var locationType = dest.Type;\r\n if (!locationId) {\r\n if (hotel) {\r\n locationId = hotel.Details.LocationId;\r\n locationType = 2;\r\n }\r\n else {\r\n locationId = dest.Id;\r\n }\r\n }\r\n return getQuotes();\r\n function getQuotes() {\r\n return attractionService.getAttractionQuotes(tripId, {\r\n AvailabilitySearchId: guidService.uuid(),\r\n Visitors: occ,\r\n LocationId: locationId,\r\n LocationType: locationType,\r\n ProvinceId: 0,\r\n StartDate: checkInDate || departureDate,\r\n EndDate: checkOutDate || returnDate,\r\n // to be removed\r\n ProductItemId: 1\r\n });\r\n }\r\n });\r\n }\r\n function waitForFlight() {\r\n return flightIncompleteDates;\r\n }\r\n function updateBasket() {\r\n broker.publish('basketUpdated');\r\n }\r\n function bookingAlreadyDone(path) {\r\n return function (reason) {\r\n if (path != null && (\"\" + $location.url()).search(/[\\\\/]options[\\\\/]/) >= 0) {\r\n var reasonString = 'unknown';\r\n try {\r\n reasonString = JSON.stringify(reason || 'nothing');\r\n }\r\n catch (e) { }\r\n loggingService.logError(\"Booking Already Done: \" + path + \", DomainId: \" + TRPCONFIG.Domain.DomainId + \", href: \" + $location.absUrl() + \"}, reason: \" + reasonString);\r\n }\r\n $location.path('bookingalreadydone');\r\n };\r\n }\r\n function isFlightPreselected() {\r\n return JSON.parse(sessionStorage.getItem('PreselectFlight'));\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('basketStore', basketStore);\r\n function basketStore($filter, $routeParams, flightDetail, searchUnitService, $http, $location, commonErrors, arrayUtil, $q, $rootScope, hotelService, transferDetail, dateUtil, broker, hotelSearch, marhabaService, resourceService, carHireDetailsService, parkingDetailsService, attractionDetailsService, adHocService, tripService, insuranceService, cookieService) {\r\n var productType = {\r\n Accommodation: 0,\r\n Flight: 1,\r\n Transfer: 2,\r\n Parking: 3,\r\n Attractions: 4,\r\n CarHire: 5,\r\n Marhaba: 6,\r\n Insurance: 7,\r\n ProductBundle: 8,\r\n AdHoc: 9\r\n };\r\n var productGroup = {\r\n Hotel: 1,\r\n Flight: 2,\r\n Extra: 3,\r\n Transfer: 4,\r\n Parking: 6,\r\n Attractions: 7\r\n };\r\n var productResultMap = {\r\n h: 'Hotel',\r\n f: 'Flight',\r\n t: 'Transfer',\r\n p: 'Parking',\r\n a: 'Attractions'\r\n };\r\n var bookingExtraOptionsMap = {\r\n 0: 'flights',\r\n 1: 'hotels',\r\n 2: 'transfers',\r\n 3: 'insurance',\r\n 4: 'carHire',\r\n 5: 'parking',\r\n 6: 'attractions',\r\n 7: 'marhaba'\r\n };\r\n var basket;\r\n var attractionsBasket;\r\n var url = '/api2/basket/';\r\n var productNames = {\r\n 0: 'ACCOMODATION',\r\n 1: 'FLIGHT',\r\n 2: 'TRANSFER',\r\n 3: 'AIRPORTPARKING',\r\n 4: 'ATTRACTIONS',\r\n 5: 'CARHIRE',\r\n 6: 'MARHABA',\r\n 7: 'TRAVELINSURANCE',\r\n 9: 'ADHOC'\r\n };\r\n var productIcons = {\r\n 0: 'icon-hotels',\r\n 1: 'icon-flights',\r\n 2: 'icon-transfers',\r\n 3: 'icon-parking',\r\n 5: 'icon-car-hire',\r\n 6: 'icon-marhaba',\r\n 7: 'icon-insurance',\r\n 9: 'icon-stack'\r\n };\r\n var costBreakdownResult;\r\n var addingFlightResult;\r\n var titles = {\r\n 1: resourceService.getDeferred('HOTEL'),\r\n 2: resourceService.getDeferred('FLIGHTS'),\r\n 3: resourceService.getDeferred('EXTRAS'),\r\n 4: resourceService.getDeferred('TRANSFER'),\r\n 6: resourceService.getDeferred('PARKING'),\r\n 7: resourceService.getDeferred('ATTRACTIONS'),\r\n 9: resourceService.getDeferred('ADHOC')\r\n };\r\n var baseCost;\r\n var service = {\r\n getBasket: getBasket,\r\n addHotel: addHotel,\r\n addVoucher: addVoucher,\r\n addingFlight: addingFlight,\r\n addFlight: addFlight,\r\n updateBrandedFare: updateBrandedFare,\r\n addMultiDestHolidayFlight: addMultiDestHolidayFlight,\r\n addMultiFlight: addMultiFlight,\r\n addTransfer: addTransfer,\r\n addMarhaba: addMarhaba,\r\n addCar: addCar,\r\n addParking: addParking,\r\n updateProduct: updateProduct,\r\n putAttractionExtras: putAttractionExtras,\r\n addAttraction: addAttraction,\r\n updateAttraction: updateAttraction,\r\n getAttractionsBasket: getAttractionsBasket,\r\n getAttractionsBasketId: getAttractionsBasketId,\r\n addInsurance: addInsurance,\r\n addCancellationProtection: addCancellationProtection,\r\n removeCancellationProtection: removeCancellationProtection,\r\n balancesDue: balancesDue,\r\n removeInsurance: removeInsurance,\r\n removeParking: removeParking,\r\n removeAttraction: removeAttraction,\r\n removeAttractionsLineItem: removeAttractionsLineItem,\r\n insurance: insurance,\r\n removeMarhaba: removeMarhaba,\r\n addMarhabaOption: addMarhabaOption,\r\n marhaba: marhaba,\r\n marhabaHolidayPath: marhabaHolidayPath,\r\n hotel: hotel,\r\n flight: flight,\r\n transfer: transfer,\r\n flightSpecificInfo: flightSpecificInfo,\r\n flightOptions: flightOptions,\r\n optionConditions: optionConditions,\r\n carHireOptions: carHireOptions,\r\n carHire: carHire,\r\n parking: parking,\r\n attraction: attraction,\r\n adHoc: adHoc,\r\n clearBasket: clearBasket,\r\n destroyBasket: destroyBasket,\r\n setPaymentMethod: setPaymentMethod,\r\n createBasket: createBasket,\r\n removeProductById: removeProductById,\r\n removeAccomodation: removeAccomodation,\r\n removeFlight: removeFlight,\r\n removeTransfer: removeTransfer,\r\n all: all,\r\n removeCar: removeCar,\r\n removeOption: removeOption,\r\n addOption: addOption,\r\n addOptions: addOptions,\r\n removeOptions: removeOptions,\r\n getNotes: getNotes,\r\n addNote: addNote,\r\n addAdHoc: addAdHoc,\r\n addAdjustment: addAdjustment,\r\n getPriceAdjustments: getPriceAdjustments,\r\n getAddedPriceAdjustments: getAddedPriceAdjustments,\r\n getBaseCost: getBaseCost,\r\n baseCostTotal: baseCostTotal,\r\n removePriceAdjustment: removePriceAdjustment,\r\n costBreakdown: costBreakdown,\r\n costBreakdownGrouped: costBreakdownGrouped,\r\n applyCancelations: applyCancelations,\r\n payments: payments,\r\n payDirectTotal: payDirectTotal,\r\n totalDeposit: totalDeposit,\r\n payDepositAggregates: payDepositAggregates,\r\n totalCost: totalCost,\r\n totalDiscount: totalDiscount,\r\n totalCostFromBasket: totalCostFromBasket,\r\n sumCosts: sumCosts,\r\n attractionCost: attractionCost,\r\n carHireCost: carHireCost,\r\n carHireRequestedItemsCosts: carHireRequestedItemsCosts,\r\n flightCost: flightCost,\r\n flightBaggageCostings: flightBaggageCostings,\r\n hotelCost: hotelCost,\r\n hotelDeposit: hotelDeposit,\r\n insuranceCost: insuranceCost,\r\n isAtolProtected: isAtolProtected,\r\n parkingCost: parkingCost,\r\n transferCost: transferCost,\r\n rules: rules,\r\n productType: productType,\r\n productGroup: productGroup,\r\n marhabaCost: marhabaCost,\r\n getBasketId: getBasketId,\r\n getProductCount: getProductCount,\r\n getDynamicPackage: getDynamicPackage,\r\n simplifiedBaggageCount: simplifiedBaggageCount,\r\n updateBaggageOptions: updateBaggageOptions,\r\n updatePriorityBoarding: updatePriorityBoarding,\r\n setProductVisibility: setProductVisibility,\r\n setAdjustmentVisibility: setAdjustmentVisibility,\r\n checkBasketBookingAllowed: checkBasketBookingAllowed,\r\n setBasketIdentity: setBasketIdentity,\r\n getBasketIdentity: getBasketIdentity,\r\n productNames: productNames,\r\n getTitle: getTitle,\r\n getTitleForProduct: getTitleForProduct,\r\n getBasketCurrency: getBasketCurrency,\r\n getIconForProduct: getIconForProduct,\r\n getCancellationProtectionQuote: getCancellationProtectionQuote,\r\n getTaxAdjustmentValue: getTaxAdjustmentValue,\r\n extrasBreakdown: extrasBreakdown,\r\n rehydrateBasketForPUP: rehydrateBasketForPUP,\r\n _costByProduct: _costByProduct\r\n };\r\n function getTitle(type) {\r\n return titles[type]();\r\n }\r\n function getTitleForProduct(p) {\r\n return (p.group ? titles[p.group]() : productNames[p.ProductType]) || titles[productGroup.Extra]();\r\n }\r\n function getIconForProduct(p) {\r\n return productIcons[p.ProductType];\r\n }\r\n function _enrichPayments(b) {\r\n var data = {\r\n totalBalances: 0,\r\n minimumDeposit: 0,\r\n totalCosts: 0,\r\n products: []\r\n };\r\n var currency = searchUnitService.getCurrency();\r\n angular.forEach(b.Products, function (prod) {\r\n data.minimumDeposit += prod.ImmediatePayment.Amount;\r\n var balance = 0;\r\n var p = {\r\n cost: _aggregateCosts(prod.CostBreakdown),\r\n productType: prod.ProductType,\r\n productTitle: resourceService.get(productNames[prod.ProductType]),\r\n initialDeposit: prod.ImmediatePayment.Amount,\r\n currentDeposit: prod.ImmediatePayment.Amount,\r\n schedule: arrayUtil.map(prod.FuturePayments, function (pay) {\r\n data.totalBalances += pay.Amount;\r\n balance += pay.Amount;\r\n return {\r\n amount: pay.Amount,\r\n balance: pay.Amount,\r\n due: pay.Due\r\n };\r\n }),\r\n directPayments: arrayUtil.map(prod.DirectPayments, function (pay) {\r\n return {\r\n localAmount: pay.LocalAmount,\r\n localCurrency: pay.LocalCurrency,\r\n amount: pay.Amount,\r\n currency: currency\r\n };\r\n }),\r\n payableLocally: prod.RequestedItems || null\r\n };\r\n data.totalCosts += p.cost;\r\n //for flights we need to include any direct payments in the pay now figure because the payment will always be taken immediately.\r\n if (prod.ProductType === 1 && prod.DirectPayments.length > 0) {\r\n p.initialDeposit = p.currentDeposit = prod.ImmediatePayment.Amount + arrayUtil.reduce(arrayUtil.sum, arrayUtil.map(prod.DirectPayments, function (pay) {\r\n return pay.Amount;\r\n }));\r\n }\r\n else if (prod.ProductType === 7) {\r\n p.productTitle += \" \" + resourceService.get('IPTINCLUDED');\r\n }\r\n p.balance = balance;\r\n data.products.push(p);\r\n });\r\n var attractions = data.products.filter(function (item) { return 4 === item.productType; });\r\n if (attractions.length) {\r\n var squashedAttractions = attractions.reduce(function (prev, curr) { return ({\r\n balance: prev.balance + curr.balance,\r\n currentDeposit: prev.currentDeposit + curr.currentDeposit,\r\n initialDeposit: prev.initialDeposit + curr.initialDeposit,\r\n directPayments: prev.directPayments.concat(curr.directPayments),\r\n payableLocally: prev.directPayments.concat(curr.directPayments),\r\n schedule: prev.schedule.concat(curr.schedule),\r\n productTitle: curr.productTitle,\r\n productType: curr.productType\r\n }); });\r\n data.products = data.products.filter(function (item) { return productType.Attractions !== item.productType; });\r\n data.products.push(squashedAttractions);\r\n }\r\n return data;\r\n }\r\n function _productsByType(t, basketId, firstOnly) {\r\n return _getBasket(basketId)\r\n .then(function (b) { return b == null ? null : _[firstOnly ? 'find' : 'filter'](b.Products, { ProductType: t }); });\r\n }\r\n function _optionsByType(type, basketId) {\r\n return _productsByType(type, basketId, true).then(function (p) {\r\n if (p && p.Options) {\r\n return arrayUtil.map(p.Options, function (o) {\r\n return { OptionId: o.OptionId, Quantity: o.ChosenQuantity || 1 };\r\n });\r\n }\r\n return [];\r\n });\r\n }\r\n function _getBasket(id) {\r\n if (basket != null) {\r\n return basket.then(function (r) {\r\n if (r.BasketId !== id) {\r\n basket = _getBasketById(id);\r\n }\r\n return basket;\r\n });\r\n }\r\n basket = _getBasketById(id);\r\n return basket;\r\n }\r\n function getBasket(id) {\r\n return _getBasket(id);\r\n }\r\n function _getBasketById(id) {\r\n costBreakdownResult = null;\r\n return $http.get(url + \"get?basketId=\" + id)\r\n .then(function (result) {\r\n return result.data === 'null' ? null : result.data;\r\n })\r\n .then(function (data) {\r\n if (data && data.Products && data.Products.length && data.Products.length > 0) {\r\n var hotelProduct = data.Products.find(function (p) {\r\n return p.ProductType !== undefined && p.ProductType !== null\r\n ? p.ProductType === productType.Accommodation\r\n : false;\r\n });\r\n if (hotelProduct) {\r\n broker.publish('ProductHotelReceivedFromBasket', { productId: hotelProduct.ProductId, basketId: id });\r\n }\r\n }\r\n return data;\r\n });\r\n }\r\n function _addProduct(type, searchId, detailsId, basketId, options, packageId, rebookId, replaceBrandedFareType) {\r\n var params = {\r\n BasketId: basketId,\r\n AvailabilitySearchId: searchId,\r\n ProductType: type,\r\n ProductId: detailsId,\r\n Options: options,\r\n PackageId: packageId,\r\n RebookId: rebookId,\r\n };\r\n if (replaceBrandedFareType) {\r\n params.IsBrandedFareUpdate = true;\r\n }\r\n return $http.post(url + \"addproduct\", params, {\r\n customErrCallback: TRPCONFIG.Domain.HandleDatesMismatchError ? function (err) {\r\n if (err.status === 400 && err.data.Message === 'Mismatch between flight and hotel dates') {\r\n $location.url('errordatesmismatch');\r\n }\r\n else {\r\n commonErrors.fourHundred(err);\r\n }\r\n } : undefined\r\n }).then(function (result) {\r\n basket = $q.when(result.data);\r\n costBreakdownResult = null;\r\n broker.publish('productAddedToBasket');\r\n });\r\n }\r\n function updateProduct(detailsId, basketId) {\r\n return $http.post(url + \"updateproduct\", {\r\n BasketId: basketId,\r\n ProductId: detailsId\r\n })\r\n .then(function (result) {\r\n basket = $q.when(result.data);\r\n costBreakdownResult = null;\r\n });\r\n }\r\n function addAdHoc(detailsRequest) {\r\n return adHocService.getDetails(detailsRequest)\r\n .then(function (response) {\r\n var d = response.data;\r\n if (d && d.AvailabilityId && d.DetailsId) {\r\n return getBasketId().then(function (basketId) {\r\n if (basketId) {\r\n return _addProduct(productType.AdHoc, d.AvailabilityId, d.DetailsId, basketId, []);\r\n }\r\n return $q.when(null);\r\n });\r\n }\r\n });\r\n }\r\n function getPriceAdjustments(basketId) {\r\n return _getBasket(basketId).then(function (basket) { return basket && basket.AvailableAdjustments || []; });\r\n }\r\n function baseCostTotal() {\r\n return baseCost;\r\n }\r\n function getBaseCost(res) {\r\n var products = res[5].products;\r\n var baseCostNum = Number(res[2]);\r\n var totalCost = Math.ceil(baseCostNum);\r\n var flightCost;\r\n for (var i = 0; i < products.length; i++) {\r\n if (products[i].productTitle === 'FLIGHT') {\r\n flightCost = Math.ceil(products[i].cost);\r\n }\r\n }\r\n baseCost = totalCost - flightCost;\r\n return baseCost;\r\n }\r\n function getAddedPriceAdjustments(bId) {\r\n return _getBasket(bId).then(function (basket) {\r\n return (basket && Array.isArray(basket.Adjustments) ? basket.Adjustments : [])\r\n .map(function (item) {\r\n return {\r\n Id: item.Id,\r\n Title: item.Title,\r\n CostBreakdown: [{\r\n Description: item.Title,\r\n Quantity: item.Quantity,\r\n NetUnitAmount: item.NetUnitAmount,\r\n UnitAmount: item.UnitAmount,\r\n ManualCommission: item.ManualCommission || 0,\r\n TravelAgentCommissionRate: item.TravelAgentCommissionRate || 0,\r\n IsHiddenFromDocumentation: item.IsHidden,\r\n IsPriceHidden: item.IsPriceHidden\r\n }]\r\n };\r\n });\r\n });\r\n }\r\n function getCancellationProtectionQuote(basketId) {\r\n var protectionDisabled = {\r\n IsApplicable: false\r\n };\r\n if (!TRPCONFIG.Domain.CancellationProtectionEnabled) {\r\n return protectionDisabled;\r\n }\r\n return $http.get(\"api/hotels/cancellationprotection/quote?basketId=\" + basketId)\r\n .then(function (res) { return res.data; })\r\n .catch(function () { return protectionDisabled; });\r\n }\r\n function getTaxAdjustmentValue(basketId) {\r\n return getAddedPriceAdjustments(basketId).then(function (result) {\r\n var value = 0;\r\n if (result) {\r\n var adjustments = result.filter(function (item) {\r\n return item.CostBreakdown && item.CostBreakdown.length;\r\n });\r\n if (adjustments && adjustments.length) {\r\n _.forEach(adjustments, function (adjustment) {\r\n value += _.get(adjustment, 'CostBreakdown[0].UnitAmount', 0);\r\n });\r\n }\r\n }\r\n return value;\r\n });\r\n }\r\n function addAdjustment(adjustmentRequest) {\r\n return $http.post(url + \"addadjustment\", adjustmentRequest)\r\n .then(function (res) { return _updateBasketPromise(res.data); });\r\n }\r\n function removePriceAdjustment(basketId, adjustmentId) {\r\n var req = {\r\n BasketId: basketId,\r\n AdjustmentId: adjustmentId,\r\n ExpectedVersion: 0\r\n };\r\n return $http.post(url + \"removeadjustment\", req)\r\n .then(function (res) { return _updateBasketPromise(res.data); });\r\n }\r\n function _updateBasketPromise(newBasket) {\r\n basket = $q.when(newBasket);\r\n costBreakdownResult = null;\r\n broker.publish('productRemovedFromBasket');\r\n return newBasket;\r\n }\r\n function _aggregateCosts(cs) {\r\n var cost = 0;\r\n angular.forEach(cs, function (c) {\r\n cost += (c.Quantity * c.UnitAmount);\r\n });\r\n return cost;\r\n }\r\n function _costByProduct(type, basketId) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (p) {\r\n return p ? _aggregateCosts(p.CostBreakdown) : 0;\r\n });\r\n }\r\n //[ { CurrencyCode: String, Total: Number } ]\r\n function _requestedItemsCostsByProduct(type, basketId) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (product) {\r\n var costs = {};\r\n var costList = [];\r\n if (product) {\r\n _.each(product.RequestedItems, function (i) {\r\n var val = costs[i.LocalCurrency] || 0;\r\n costs[i.LocalCurrency] = val + (i.UnitAmount * i.Quantity);\r\n });\r\n _.forOwn(costs, function (value, key) {\r\n costList.push({ CurrencyCode: key, Total: value });\r\n });\r\n }\r\n return costList;\r\n });\r\n }\r\n function _optionIndex(options, id) {\r\n return arrayUtil.indexOf(options, function (o) {\r\n return o.OptionId === id;\r\n });\r\n }\r\n function _removeProduct(type, basketId) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (p) {\r\n if (p != null) {\r\n return removeProductById(p.ProductId, basketId);\r\n }\r\n });\r\n }\r\n function removeProductById(productId, basketId) {\r\n return $http.post(url + \"removeproduct\", {\r\n BasketId: basketId,\r\n ProductId: productId\r\n })\r\n .then(function (result) {\r\n basket = $q.when(result.data);\r\n costBreakdownResult = null;\r\n broker.publish('productRemovedFromBasket');\r\n });\r\n }\r\n function _addProductDetails(p, rehydrator) {\r\n if (p && !p.Details) {\r\n return rehydrator(p.ProductId).then(function (p2) {\r\n p.Details = p2;\r\n return p;\r\n });\r\n }\r\n return p;\r\n }\r\n function _rehydrateProducts(type, rehydrator, basketId, firstOnly) {\r\n return _productsByType(type, basketId)\r\n .then(function (products) {\r\n if (firstOnly) {\r\n return _addProductDetails(products[0], rehydrator);\r\n }\r\n return $q.all(products.reduce(function (promises, p) {\r\n promises.push(_addProductDetails(p, rehydrator));\r\n return promises;\r\n }, []));\r\n });\r\n }\r\n function _concatCostBreakdowns(products) {\r\n var result = [];\r\n _.keys(_.omit(products, 'all')).forEach(function (p) {\r\n arrayUtil.wrapNonArray(products[p])\r\n .forEach(function (product) {\r\n var cb = product && product.CostBreakdown;\r\n if (cb) {\r\n result = result.concat(cb);\r\n }\r\n });\r\n });\r\n return result;\r\n }\r\n function _changeOption(type, productId, optionId, operation, basketId, quantity) {\r\n return $http.post(url + operation, {\r\n BasketId: basketId,\r\n ProductId: productId,\r\n OptionId: optionId,\r\n ChosenQuantity: quantity\r\n }).then(function (result) {\r\n basket = $q.when(result.data);\r\n costBreakdownResult = null;\r\n return _optionsByType(type, basketId);\r\n });\r\n }\r\n function _changeOptions(type, productId, options, operation, basketId) {\r\n return $http.post(url + operation, {\r\n BasketId: basketId,\r\n ProductId: productId,\r\n Options: options\r\n }).then(function (result) {\r\n basket = $q.when(result.data);\r\n costBreakdownResult = null;\r\n return _optionsByType(type, basketId);\r\n });\r\n }\r\n function _checkChauffeur(marhaba) {\r\n if (!marhaba) {\r\n return false;\r\n }\r\n function isChauffeur(availableOption, selectedOption) {\r\n if (availableOption.Type === 4 && availableOption.Id === selectedOption.OptionId) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n var selectedOptions = marhaba.Options;\r\n var availableOptions = marhaba.Details.AvailableOptions;\r\n for (var x = availableOptions.length - 1; x >= 0; x--) {\r\n for (var i = selectedOptions.length - 1; i >= 0; i--) {\r\n if (isChauffeur(availableOptions[x], selectedOptions[i])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n function _calculateProductTotals(products) {\r\n products.total = 0;\r\n products.totalNet = 0;\r\n products.totalTravelAgentCommission = 0;\r\n var currency = searchUnitService.getCurrency();\r\n angular.forEach(products, function (product) {\r\n product.total = 0;\r\n product.totalNet = 0;\r\n product.totalTravelAgentCommission = 0;\r\n product.costBreakdown = (product.costBreakdown ? product.costBreakdown : product.CostBreakdown);\r\n angular.forEach(product.costBreakdown, function (item) {\r\n product.total += (item.UnitAmount * item.Quantity);\r\n product.totalNet += (item.NetUnitAmount * item.Quantity);\r\n item.TravelAgentCommission = (item.ManualCommission ? item.ManualCommission : item.TravelAgentCommission);\r\n product.totalTravelAgentCommission += (item.TravelAgentCommission * item.Quantity);\r\n item.Margin = item.UnitAmount - item.NetUnitAmount;\r\n });\r\n product.totalStr = $filter('customCurrency')(product.total, currency);\r\n product.totalNetStr = $filter('customCurrency')(product.totalNet, currency);\r\n product.totalTravelAgentCommissionStr = $filter('customCurrency')(product.totalTravelAgentCommission, currency);\r\n product.totalMargin = product.total - product.totalNet;\r\n product.totalMarginStr = $filter('customCurrency')(product.totalMargin, currency);\r\n product.title = (product.group ? titles[product.group]() : productNames[product.ProductType])\r\n || titles[productGroup.Extra](); // Default title to 'Extras' when missing\r\n product.icon = productIcons[product.ProductType];\r\n products.total += product.total;\r\n products.totalNet += product.totalNet;\r\n products.totalTravelAgentCommission += product.totalTravelAgentCommission;\r\n });\r\n products.totalStr = $filter('customCurrency')(products.total, currency);\r\n products.totalNetStr = $filter('customCurrency')(products.totalNet, currency);\r\n products.totalTravelAgentCommissionStr = $filter('customCurrency')(products.totalTravelAgentCommission, currency);\r\n products.totalMargin = products.total - products.totalNet;\r\n products.totalMarginStr = $filter('customCurrency')(products.totalMargin, currency);\r\n return products;\r\n }\r\n function getCheckInDateForFlight(flightArrival) {\r\n var landsAfterCutOff = flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff;\r\n var zeroTime = dateUtil.zeroTime(flightArrival, true);\r\n var cutOff = landsAfterCutOff ? zeroTime : dateUtil.addDays(zeroTime, -1, true);\r\n if (TRPCONFIG.Domain.ChangeHotelNightsDuration) {\r\n cutOff = dateUtil.addDays(zeroTime, -1, true);\r\n }\r\n return cutOff;\r\n }\r\n function getCheckOutDateForFlight(flightReturn) {\r\n if (TRPCONFIG.Domain.ReturnFlightCutOff < 0) {\r\n return dateUtil.zeroTime(flightReturn, true);\r\n }\r\n var departsBeforeCutOff = flightReturn.getHours() < TRPCONFIG.Domain.ReturnFlightCutOff;\r\n var zeroTime = dateUtil.zeroTime(flightReturn, true);\r\n return departsBeforeCutOff ? dateUtil.addDays(zeroTime, -1, true) : zeroTime;\r\n }\r\n //the problem with this is that if the user refreshes the flights list, we will hit this before the\r\n //hotel search request has been restored. Proglem.\r\n function _adjustSearchDatesIfNecessary(f, tripId) {\r\n return $q.all([\r\n tripService.getHotelsRequestCheckInDate(tripId),\r\n tripService.getHotelsRequestCheckOutDate(tripId)\r\n ])\r\n .then(function (dates) {\r\n var _a = dates.map(function (d) { return dateUtil.serialiseDate(d); }), checkIn = _a[0], checkOut = _a[1];\r\n var newHotelsRequestDates = {};\r\n var legs = f.Legs;\r\n var flightArrival = dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate);\r\n var flightReturn = legs.length > 1 ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\r\n var requiredCheckIn = getCheckInDateForFlight(flightArrival);\r\n var requiredCheckOut = getCheckOutDateForFlight(flightReturn);\r\n if (checkIn == null && checkOut == null && TRPCONFIG.Domain2.ResetAdjustingDatesFixEnabled) {\r\n return newHotelsRequestDates;\r\n }\r\n if (requiredCheckIn !== checkIn) {\r\n newHotelsRequestDates.CheckInDate = requiredCheckIn;\r\n }\r\n if (requiredCheckOut !== checkOut) {\r\n newHotelsRequestDates.CheckOutDate = requiredCheckOut;\r\n }\r\n return newHotelsRequestDates;\r\n });\r\n }\r\n function addVoucher(basketId, voucherCode) {\r\n var req = {\r\n VoucherCode: voucherCode || '',\r\n BasketId: basketId,\r\n };\r\n return $http.post('/api2/basket/addvoucher', req)\r\n .then(function (res) {\r\n var data = res.data;\r\n var discountMsg = data.DiscountMessages && data.DiscountMessages.length > 0 && data.DiscountMessages[0] || '';\r\n cookieService.set('VoucherWarnMessage', JSON.stringify(discountMsg));\r\n return data;\r\n });\r\n }\r\n function addHotel(searchId, estabId, roomIds, basketId, bookingPath, packageId, rebookId, discountCode, voucherCode) {\r\n //reclaim price difference only for single - room hotel bookings\r\n var reclaimPriceDifference = TRPCONFIG.Domain.ReclaimPriceDifferenceEnabledFE && roomIds.length === 1;\r\n var request = {\r\n AvailabilitySearchId: searchId,\r\n EstabId: estabId,\r\n RoomAndBoardIds: roomIds,\r\n DiscountCode: discountCode || TRPCONFIG.DiscountCode || '',\r\n VoucherCode: voucherCode || '',\r\n BookingPath: bookingPath,\r\n BasketId: basketId,\r\n ReclaimPriceDifference: reclaimPriceDifference\r\n };\r\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\r\n var SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser'));\r\n var Tier = (SkywardsLoginUser && SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\r\n SkywardsLoginUser.data.Contact.Tier : null;\r\n request.LoyaltyInfo = {\r\n SkywardsTier: Tier\r\n };\r\n }\r\n return hotelService.getHotelDetails(request)\r\n .then(function (d) {\r\n sessionStorage.setItem('preselectedHotelData', JSON.stringify({\r\n Accommodation: productType.Accommodation,\r\n searchId: searchId,\r\n DetailsId: d.DetailsId,\r\n basketId: basketId,\r\n options: undefined,\r\n packageId: packageId,\r\n rebookId: rebookId,\r\n d: d\r\n }));\r\n return _addProduct(productType.Accommodation, searchId, d.DetailsId, basketId, undefined, packageId, rebookId);\r\n })\r\n .then(function () { return service.hotel(basketId); });\r\n }\r\n function addingFlight() {\r\n return addingFlightResult != null;\r\n }\r\n function buildBaggageArray(opExtras, bagOpts, type, baggageOptions) {\r\n //for best fit flight selection this will come through as null\r\n if (bagOpts == null) {\r\n return;\r\n }\r\n switch (type) {\r\n case 'multi':\r\n for (var i = 0; i < bagOpts.bags; i++) {\r\n if (opExtras[i].Options.length > 1) {\r\n var option = null;\r\n //this is just needed for our initial release so we can go out without being coupled to flights\r\n //once they have their data updated we should pick the default bag rather that just the 1st one\r\n // in the list (only applies to multi options\r\n if (TRPCONFIG.BaggageUseDefaultOption === true) {\r\n var defaultOption = _.find(opExtras[i].Options, { IsDefault: true });\r\n option = {\r\n OptionId: defaultOption.OptionId,\r\n ChosenQuantity: defaultOption.Quantity\r\n };\r\n }\r\n else {\r\n option = {\r\n OptionId: opExtras[i].Options[1].OptionId,\r\n ChosenQuantity: opExtras[i].Options[1].Quantity\r\n };\r\n }\r\n baggageOptions.push(option);\r\n }\r\n }\r\n break;\r\n case 'single':\r\n for (var j = 0; j < bagOpts.bags; j++) {\r\n if (opExtras[j] != null) {\r\n baggageOptions.push({\r\n OptionId: opExtras[j].OptionId,\r\n ChosenQuantity: opExtras[j].Quantity\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n function getCheckInOptions(sector) {\r\n return arrayUtil.first(sector.OptionalExtras, function (o) {\r\n return o.Type === 4;\r\n });\r\n }\r\n function getSpecificCheckInOption(options, typeName) {\r\n return arrayUtil.first(options.MultiOptionalExtras[0].Options, function (o) {\r\n return o.Type === typeName;\r\n });\r\n }\r\n function addCheckInOptionsIfNecessary(sector, opts, baggageOptions) {\r\n //if the flight has CheckInOptions we need to add default online checkin options as well\r\n var checkInOptions = getCheckInOptions(sector);\r\n if (checkInOptions && opts) {\r\n var nobags = getSpecificCheckInOption(checkInOptions, 'OnlineCheckinNoBaggage');\r\n var withbags = getSpecificCheckInOption(checkInOptions, 'OnlineCheckinWithBaggage');\r\n if (opts.bags > 0 && withbags != null) {\r\n baggageOptions.push({\r\n OptionId: withbags.OptionId,\r\n ChosenQuantity: opts.bags\r\n });\r\n }\r\n if (opts.bags < opts.maxbags) {\r\n baggageOptions.push({\r\n OptionId: nobags.OptionId,\r\n ChosenQuantity: opts.maxbags - opts.bags\r\n });\r\n }\r\n }\r\n }\r\n function updateBrandedFare(params) {\r\n var searchId = params.searchId, basketId = params.basketId, packageId = params.packageId, details = params.details;\r\n var baggageOptions = [];\r\n _.forEach(details.FlightSectorOptionalExtras, function (sector) {\r\n addBaggageOptions(sector, params, baggageOptions);\r\n });\r\n return _addProduct(productType.Flight, searchId, details.DetailsId, basketId, baggageOptions, packageId, undefined, true)\r\n .then(function () {\r\n return service.flight(basketId);\r\n });\r\n }\r\n function addFlight(searchId, flight, basketId, tripId, verifyDates, opts, packageId) {\r\n var checkDates = !flight.HasFullDates;\r\n var adjustingDates = $q.when();\r\n if (verifyDates && flight.HasFullDates && flight.Legs.length > 1) {\r\n adjustingDates = _adjustSearchDatesIfNecessary(flight, tripId).then(function (newHotelsRequestDates) {\r\n if (!_.isEmpty(newHotelsRequestDates)) {\r\n checkDates = false;\r\n hotelSearch.adjustHotelCheckInCheckOutDates(tripId, newHotelsRequestDates);\r\n }\r\n });\r\n }\r\n addingFlightResult = adjustingDates.then(function () {\r\n return flightDetail.getFlightDetails(tripId, {\r\n AvailabilitySearchId: searchId,\r\n FlightId: flight.FlightId,\r\n IncludeSeatPlan: TRPCONFIG.DeviceSettings.SeatPlanEnabled\r\n }).then(function (d) {\r\n if (d != null) {\r\n sessionStorage.setItem('FlightDetailsId', d.DetailsId);\r\n var baggageOptions_1 = [];\r\n _.forEach(d.FlightSectorOptionalExtras, function (sector) {\r\n addBaggageOptions(sector, opts, baggageOptions_1);\r\n });\r\n return _addProduct(productType.Flight, searchId, d.DetailsId, basketId, baggageOptions_1, packageId)\r\n .then(function (res) {\r\n var preselectedHotelData = sessionStorage.getItem('preselectedHotelData');\r\n return preselectedHotelData !== null ? _addProduct.apply(void 0, Object.values(JSON.parse(preselectedHotelData))) : res;\r\n })\r\n .then(function () {\r\n addingFlightResult = null;\r\n return service.flight(basketId).then(function (f) {\r\n //in the case where the flight did not have full dates we need to defer checking that the hotel search\r\n //dates match until we have the full info i.e. after the details call\r\n if (verifyDates && checkDates && flight.Legs.length > 1) {\r\n return _adjustSearchDatesIfNecessary(f.Details.Itinerary, tripId).then(function (newHotelsRequestDates) {\r\n if (!_.isEmpty(newHotelsRequestDates)) {\r\n broker.publish('searchDatesAdjusted', {\r\n tripId: tripId,\r\n dates: newHotelsRequestDates\r\n });\r\n }\r\n return f;\r\n });\r\n }\r\n return f;\r\n });\r\n });\r\n }\r\n return null;\r\n });\r\n });\r\n return addingFlightResult;\r\n }\r\n function addMultiDestHolidayFlight(searchId, flight, basketId, tripId, verifyDates, opts, packageId) {\r\n // Duplicate of addFlight() with no getFlightDetails() because it already ran immediately prior\r\n var checkDates = !flight.HasFullDates;\r\n var adjustingDates = $q.when();\r\n if (verifyDates && flight.HasFullDates && flight.Legs.length > 1) {\r\n adjustingDates = _adjustSearchDatesIfNecessary(flight, tripId).then(function (newHotelsRequestDates) {\r\n if (!_.isEmpty(newHotelsRequestDates)) {\r\n checkDates = false;\r\n broker.publish('searchDatesAdjusted', { tripId: tripId, dates: newHotelsRequestDates });\r\n }\r\n });\r\n }\r\n addingFlightResult = adjustingDates.then(function () {\r\n var baggageOptions = [];\r\n _.forEach(flight.FlightSectorOptionalExtras, function (sector) {\r\n addBaggageOptions(sector, opts, baggageOptions);\r\n });\r\n return _addProduct(productType.Flight, searchId, flight.DetailsId, basketId, baggageOptions, packageId)\r\n .then(function () {\r\n addingFlightResult = null;\r\n return service.flight(basketId).then(function (f) {\r\n if (verifyDates && checkDates && flight.Legs.length > 1) {\r\n return _adjustSearchDatesIfNecessary(f.Details.Itinerary, tripId).then(function (newHotelsRequestDates) {\r\n if (!_.isEmpty(newHotelsRequestDates)) {\r\n broker.publish('searchDatesAdjusted', { tripId: tripId, dates: newHotelsRequestDates });\r\n }\r\n return f;\r\n });\r\n }\r\n return f;\r\n });\r\n });\r\n });\r\n return addingFlightResult;\r\n }\r\n function addMultiFlight(searchId, option, basketId, tripId) {\r\n return flightDetail.getFlightDetails(tripId, {\r\n AvailabilitySearchId: searchId,\r\n FlightId: option.FlightId,\r\n IncludeSeatPlan: false,\r\n MultiSector: true\r\n }).then(function (d) {\r\n if (!d) {\r\n return null;\r\n }\r\n return _addProduct(productType.Flight, searchId, d.DetailsId, basketId);\r\n });\r\n }\r\n function addBaggageOptions(sector, opts, baggageOptions) {\r\n var optionalExtras = arrayUtil.first(sector.OptionalExtras, function (o) { return o.Type === 0; });\r\n if (optionalExtras != null) {\r\n if (optionalExtras.MultiOptionalExtras.length > 0) {\r\n buildBaggageArray(optionalExtras.MultiOptionalExtras, opts, 'multi', baggageOptions);\r\n }\r\n else {\r\n buildBaggageArray(optionalExtras.SingleOptionalExtras, opts, 'single', baggageOptions);\r\n }\r\n addCheckInOptionsIfNecessary(sector, opts, baggageOptions);\r\n }\r\n }\r\n function addTransfer(type, searchId, transferId, basketId) {\r\n if (type === productType.Transfer) {\r\n return transferDetail.getTransferDetails({\r\n AvailabilitySearchId: searchId,\r\n TransferId: transferId\r\n }).then(function (d) {\r\n return _addProduct(productType.Transfer, searchId, d.DetailsId, basketId)\r\n .then(function () {\r\n return service.transfer(basketId);\r\n });\r\n });\r\n }\r\n if (type === productType.Accommodation) {\r\n var preselectedHotelData = JSON.parse(sessionStorage.getItem('preselectedHotelData'));\r\n return _addProduct(productType.Accommodation, preselectedHotelData.searchId, preselectedHotelData.DetailsId, basketId, transferId)\r\n .then(function () {\r\n return service.hotel(basketId);\r\n });\r\n }\r\n }\r\n function addMarhaba(searchId, productId, basketId, options) {\r\n return marhabaService.getProductDetails(searchId, productId)\r\n .then(function (details) {\r\n return _addProduct(productType.Marhaba, searchId, details.DetailsSearchId, basketId, options)\r\n .then(function () {\r\n return service.marhaba(basketId, productId);\r\n });\r\n });\r\n }\r\n function removeMarhaba(basketId) {\r\n return _removeProduct(productType.Marhaba, basketId);\r\n }\r\n function addMarhabaOption(productId, optionId, quantity, basketId) {\r\n return _productsByType(productType.Marhaba, basketId, true)\r\n .then(function (p) {\r\n if (p && p.Options) {\r\n var i = _optionIndex(p.Options, optionId);\r\n if (i < 0) {\r\n p.Options.push({ OptionId: optionId });\r\n }\r\n }\r\n return _changeOption(productType.Marhaba, productId, optionId, 'addoption', basketId, quantity);\r\n });\r\n }\r\n function marhaba(basketId, productId) {\r\n return _productsByType(productType.Marhaba, basketId, true).then(function (p) {\r\n if (p && !p.Details) {\r\n return marhabaService.rehydrate(productId, p.AvailabilitySearchId)\r\n .then(function (res) {\r\n p.Details = res;\r\n return p;\r\n });\r\n }\r\n return p;\r\n });\r\n }\r\n function marhabaHolidayPath(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (b) {\r\n return b.Products.length > 1;\r\n });\r\n }\r\n function hotel(basketId) {\r\n return _rehydrateProducts(productType.Accommodation, hotelService.rehydrate.bind(hotelService), basketId, true); // `firstOnly` when not dynamic packaging\r\n }\r\n function flight(basketId) {\r\n if (addingFlightResult) {\r\n return addingFlightResult\r\n .then(function (f) {\r\n return f;\r\n });\r\n }\r\n return _rehydrateProducts(productType.Flight, flightDetail.rehydrate.bind(flightDetail), basketId, true); // `firstOnly` when not dynamic packaging\r\n }\r\n function transfer(basketId) {\r\n return _rehydrateProducts(productType.Transfer, transferDetail.rehydrate.bind(transferDetail), basketId, true); // `firstOnly` when not dynamic packaging\r\n }\r\n function carHire(basketId) {\r\n return _rehydrateProducts(productType.CarHire, carHireDetailsService.rehydrate.bind(carHireDetailsService), basketId, true);\r\n }\r\n function optionConditions(basketId) {\r\n return service.flight(basketId).then(function (f) {\r\n if (f) {\r\n return f.Details.OptionConditions;\r\n }\r\n return {};\r\n });\r\n }\r\n function flightOptions(basketId) {\r\n if (addingFlightResult != null) {\r\n return addingFlightResult.then(function () {\r\n return _optionsByType(productType.Flight, basketId);\r\n });\r\n }\r\n return _optionsByType(productType.Flight, basketId);\r\n }\r\n function carHireOptions(basketId) {\r\n return _optionsByType(productType.CarHire, basketId).then(function (options) {\r\n return arrayUtil.map(options, function (o) {\r\n return o.OptionId;\r\n });\r\n });\r\n }\r\n function _flushBasket() {\r\n basket = null;\r\n attractionsBasket = null;\r\n }\r\n function _refreshBasket(basketId) {\r\n return $q.when(basketId || getBasketId())\r\n .then(function (bId) {\r\n _flushBasket();\r\n return _getBasket(bId);\r\n })\r\n .then(function () { return broker.publish('basketRefreshed'); });\r\n }\r\n function destroyBasket() {\r\n _flushBasket();\r\n TRPCONFIG.BasketId = null;\r\n }\r\n function clearBasket(basketId) {\r\n destroyBasket();\r\n return $http.post(url + \"clearbasket\", JSON.stringify(basketId))\r\n .then(function (res) {\r\n broker.publish('basketCleared');\r\n return res;\r\n });\r\n }\r\n function setPaymentMethod(cardTypeId, basketId) {\r\n TRPCONFIG.Domain.CardTypeId = cardTypeId;\r\n return _getBasket(basketId)\r\n .then(function (b) {\r\n if (b.CardTypeId !== cardTypeId) {\r\n return $http.post(url + \"setpaymentmethod\", {\r\n BasketId: basketId,\r\n CardTypeId: cardTypeId\r\n }).then(function (result) {\r\n result.data.CardTypeId = cardTypeId;\r\n basket = $q.when(result.data);\r\n return {\r\n CardHandlingFee: result.data.CardHandlingFee,\r\n AirlineSurcharge: result.data.AirlineSurcharge\r\n };\r\n });\r\n }\r\n return {\r\n CardHandlingFee: b.CardHandlingFee,\r\n AirlineSurcharge: b.AirlineSurcharge\r\n };\r\n });\r\n }\r\n function createBasket(forHoliday) {\r\n var domain = TRPCONFIG.Domain;\r\n var reqParams = {\r\n AccountingCurrencyCode: domain.AccountingCurrencyCode,\r\n CurrencyCode: searchUnitService.getCurrency(),\r\n DomainId: domain.DomainId,\r\n ForHoliday: forHoliday,\r\n CultureCode: domain.CultureCode\r\n };\r\n basket = $http.post(url + \"create\", reqParams)\r\n .then(function (result) {\r\n TRPCONFIG.BasketId = result.data.BasketId;\r\n broker.publish('attractionsBasketUpdated');\r\n broker.publish('basketCreated');\r\n return result.data;\r\n });\r\n return basket;\r\n }\r\n function removeAccomodation(basketId) {\r\n return _removeProduct(productType.Accommodation, basketId);\r\n }\r\n function removeFlight(basketId) {\r\n return _removeProduct(productType.Flight, basketId);\r\n }\r\n function removeTransfer(basketId) {\r\n return _removeProduct(productType.Transfer, basketId);\r\n }\r\n function all(basketId, productId) {\r\n var p = [\r\n service.flight(basketId),\r\n service.hotel(basketId),\r\n service.transfer(basketId),\r\n service.insurance(basketId),\r\n service.carHire(basketId),\r\n service.parking(basketId),\r\n service.attraction(basketId)\r\n ];\r\n if (TRPCONFIG.Domain.MarhabaEnabled) {\r\n p.push(service.marhaba(basketId, productId));\r\n }\r\n return $q.all(p)\r\n .then(function (results) {\r\n _storeAdaptiveBookingFlags(results);\r\n return {\r\n f: results[0],\r\n h: results[1],\r\n t: results[2],\r\n i: results[3],\r\n c: results[4],\r\n p: results[5],\r\n a: results[6],\r\n m: TRPCONFIG.Domain.MarhabaEnabled ? results[7] : null,\r\n all: results\r\n };\r\n });\r\n }\r\n function _storeAdaptiveBookingFlags(results) {\r\n var marhaba = 5;\r\n var bookingFlags = results.reduce(function (acc, current, i) {\r\n if ((!Array.isArray(current) && (current !== undefined)) ||\r\n (Array.isArray(current) && (current.length > 0)) ||\r\n (!Array.isArray(current) && (current !== undefined) && (i === marhaba) && TRPCONFIG.Domain.MarhabaEnabled)) {\r\n acc.push(bookingExtraOptionsMap[i]);\r\n }\r\n return acc;\r\n }, []);\r\n sessionStorage.setItem('adaptiveBookingFlags', JSON.stringify(bookingFlags));\r\n }\r\n function _rehydrateDynamicPackage() {\r\n // Rehydrate `Details` data on `basket.Products` entries\r\n return getBasketId().then(function (bId) {\r\n var services = [\r\n service.flight(bId),\r\n service.hotel(bId),\r\n service.transfer(bId),\r\n service.adHoc(bId)\r\n ];\r\n if (TRPCONFIG.Domain.MarhabaEnabled) {\r\n services.push(service.marhaba(bId));\r\n }\r\n return $q.all(services);\r\n });\r\n }\r\n function getDynamicPackage(flatList) {\r\n // Rehydrates and returns `basket.Products` grouped by type (or `flatList`)\r\n return _rehydrateDynamicPackage()\r\n .then(function (res) {\r\n // Normalise entries to [{}, {}, ...]\r\n res = res.map(function (p) { return arrayUtil.wrapNonArray(p); });\r\n return flatList ? _.flatten(res) : {\r\n f: res[0],\r\n h: res[1],\r\n t: res[2],\r\n ah: res[3],\r\n m: TRPCONFIG.Domain.MarhabaEnabled ? res[4] : null\r\n };\r\n });\r\n }\r\n function removeOption(type, productId, optionId, basketId) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (p) {\r\n if (p && p.Options) {\r\n var i = _optionIndex(p.Options, optionId);\r\n if (i >= 0) {\r\n p.Options.splice(i, 1);\r\n }\r\n }\r\n return _changeOption(type, productId, optionId, 'removeoption', basketId);\r\n });\r\n }\r\n function addOption(type, productId, optionId, basketId, quantity) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (p) {\r\n if (p && p.Options) {\r\n var i = _optionIndex(p.Options, optionId);\r\n if (i < 0) {\r\n p.Options.push({\r\n OptionId: optionId,\r\n ChosenQuantity: quantity\r\n });\r\n }\r\n }\r\n return _changeOption(type, productId, optionId, 'addoption', basketId, quantity);\r\n });\r\n }\r\n function addOptions(type, productId, options, basketId) {\r\n return options.length === 0 ?\r\n _optionsByType(type, basketId) :\r\n _changeOptions(type, productId, options, 'addoptions', basketId);\r\n }\r\n function removeOptions(type, productId, options, basketId) {\r\n return options.length === 0 ?\r\n _optionsByType(type, basketId) :\r\n _changeOptions(type, productId, options, 'removeoptions', basketId);\r\n }\r\n function getNotes(basketId) {\r\n return _getBasket(basketId).then(function (b) { return b.Notes; });\r\n }\r\n function addNote(basketId, text) {\r\n var payload = JSON.stringify({\r\n BasketId: basketId,\r\n NoteText: text\r\n });\r\n var conf = {\r\n ignoreErrors: true\r\n };\r\n return $http.post(url + \"addnote\", payload, conf)\r\n .then(function (res) {\r\n basket = $q.when(res.data);\r\n return res.data;\r\n })\r\n .catch(function () { return ({}); });\r\n }\r\n function _hidePricesIfNecessary(products) {\r\n return tripService.usePackageRates().then(function (packagePrice) {\r\n if (packagePrice) {\r\n //check whether flight cost breakdown needs to be shown\r\n var productsToHidePrice = TRPCONFIG.Domain.PackageFlightPrice ? [products.h, products.f] : products.h;\r\n angular.forEach([productsToHidePrice], function (product) {\r\n arrayUtil.wrapNonArray(product).forEach(function (p) {\r\n if (p) {\r\n angular.forEach(p.CostBreakdown, function (el) {\r\n el.HidePrice = true;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n return products;\r\n });\r\n }\r\n function groupProducts(products, excluded) {\r\n if (excluded === void 0) { excluded = {}; }\r\n var results = [];\r\n _.forEach(productResultMap, function (groupName, k) {\r\n if (!excluded[k]) {\r\n arrayUtil.wrapNonArray(products[k]).forEach(function (p) {\r\n if (p && p.CostBreakdown) {\r\n var groupEntry = _.find(results, {\r\n group: productGroup[groupName]\r\n });\r\n if (groupEntry) {\r\n groupEntry.costBreakdown = (groupEntry.costBreakdown || []).concat(p.CostBreakdown);\r\n groupEntry.futurePaymentAdminFees = (groupEntry.futurePaymentAdminFees || []).concat(p.FuturePaymentAdminFees);\r\n }\r\n else {\r\n results.push({\r\n costBreakdown: p.CostBreakdown,\r\n futurePaymentAdminFees: p.FuturePaymentAdminFees,\r\n group: productGroup[groupName]\r\n });\r\n }\r\n }\r\n });\r\n }\r\n });\r\n return results;\r\n }\r\n function costBreakdownGrouped(basketId) {\r\n return service.all(basketId)\r\n .then(function (products) {\r\n var extras = {};\r\n var exclusions;\r\n // Extras\r\n return _hidePricesIfNecessary(products).then(function (es) {\r\n if (products.h || products.f) {\r\n extras = _enhanceCostBreakdownsWithProductTypes(angular.copy(es));\r\n delete extras.h;\r\n delete extras.f;\r\n exclusions = { t: true, p: true, a: true };\r\n }\r\n }).then(function () {\r\n var results = groupProducts(_enhanceCostBreakdownsWithProductTypes(products), exclusions);\r\n if (!_.isEmpty(extras)) {\r\n results.push({\r\n costBreakdown: _concatCostBreakdowns(extras),\r\n group: productGroup.Extra\r\n });\r\n }\r\n return tripService.usePackageRates().then(function (packagePrice) {\r\n results.isPackage = packagePrice;\r\n return _calculateProductTotals(results);\r\n });\r\n });\r\n });\r\n }\r\n function _enhanceCostBreakdownsWithProductTypes(products) {\r\n _.forEach(products, function (value) {\r\n if (value && value.ProductType) {\r\n var x_1 = value.ProductType;\r\n _.forEach(value.CostBreakdown, function (value) {\r\n value.ProductType = x_1;\r\n });\r\n }\r\n });\r\n return products;\r\n }\r\n function costBreakdown(basketId, productId) {\r\n if (costBreakdownResult) {\r\n return costBreakdownResult;\r\n }\r\n costBreakdownResult = service.all(basketId, productId)\r\n .then(_getAllCostBreakdowns);\r\n return costBreakdownResult;\r\n }\r\n function payments(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (b) {\r\n return _enrichPayments(b);\r\n });\r\n }\r\n function payDirectTotal(basketId) {\r\n return service.payments(basketId).then(function (payment) {\r\n var directAmount = 0;\r\n _.forEach(payment.products, function (p) {\r\n directAmount = _.reduce(p.directPayments, function (result, value) {\r\n return result + value.amount;\r\n }, directAmount);\r\n });\r\n return directAmount;\r\n });\r\n }\r\n function balancesDue(basketId, productId) {\r\n var s = function (b1, b2) { return b1.Due > b2.Due ? 1 : -1; };\r\n return service.all(basketId, productId)\r\n .then(function (products) {\r\n var balances = {};\r\n if (products.all) {\r\n products.all.forEach(function (product) {\r\n arrayUtil.wrapNonArray(product).forEach(function (p) {\r\n if (p && p.FuturePayments && p.FuturePayments.length > 0) {\r\n p.FuturePayments.forEach(function (fp) {\r\n if (balances[fp.Due] == null) {\r\n balances[fp.Due] = {\r\n Due: fp.Due,\r\n Amount: 0\r\n };\r\n }\r\n balances[fp.Due].Amount += fp.Amount;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n var balancesArray = Object.keys(balances).map(function (d) { return balances[d]; });\r\n balancesArray.sort(s);\r\n return balancesArray;\r\n });\r\n }\r\n function totalDeposit(basketId) {\r\n return payDepositAggregates(basketId)\r\n .then(function (pda) { return pda.TotalImmediatePayment; });\r\n }\r\n function payDepositAggregates(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (b) { return b.PayDepositAggregates; });\r\n }\r\n function totalDiscount(basketId) {\r\n return service.costBreakdown(basketId)\r\n .then(sumDiscounts);\r\n }\r\n function sumDiscounts(cb) {\r\n return cb.reduce(function (sum, c) {\r\n /* select only discounts. id 20 is discounts */\r\n return c.UnitAmount < 0 && c.TypeId === 20\r\n ? sum + (c.Quantity * c.UnitAmount) :\r\n sum;\r\n }, 0);\r\n }\r\n function totalCost(basketId) {\r\n return TRPCONFIG.Domain.EnableAmendBookingV2\r\n ? totalAmount(basketId)\r\n : service.costBreakdown(basketId).then(sumCosts);\r\n }\r\n function totalAmount(basketId) {\r\n return service.all(basketId)\r\n .then(function (_a) {\r\n var all = _a.all;\r\n return _(all).map(function (a) { return a ? a.TotalAmount : 0; }).sum();\r\n });\r\n }\r\n function _getAllCostBreakdowns(products) {\r\n return _hidePricesIfNecessary(products).then(_concatCostBreakdowns);\r\n }\r\n function sumCosts(cb) {\r\n return cb.reduce(function (sum, c) { return sum + (c.Quantity * c.UnitAmount); }, 0).toFixed(2);\r\n }\r\n function totalCostFromBasket(products) {\r\n return $q.when(products).then(_getAllCostBreakdowns).then(sumCosts);\r\n }\r\n function attractionCost(basketId) {\r\n return _costByProduct(productType.Attractions, basketId);\r\n }\r\n function carHireCost(basketId) {\r\n return _costByProduct(productType.CarHire, basketId);\r\n }\r\n function carHireRequestedItemsCosts(basketId) {\r\n return _requestedItemsCostsByProduct(productType.CarHire, basketId);\r\n }\r\n function marhabaCost(basketId) {\r\n return _costByProduct(productType.Marhaba, basketId);\r\n }\r\n function _productSpecificFields(type, basketId) {\r\n return _productsByType(type, basketId, true)\r\n .then(function (p) {\r\n return (p && p.ProductSpecificFields) || null;\r\n });\r\n }\r\n function flightSpecificInfo(basketId) {\r\n return _productSpecificFields(productType.Flight, basketId);\r\n }\r\n function flightCost(basketId) {\r\n return _costByProduct(productType.Flight, basketId);\r\n }\r\n function flightBaggageCostings(basketId) {\r\n return flightSpecificInfo(basketId)\r\n .then(function (i) {\r\n var costings = {\r\n total: 0,\r\n discount: 0\r\n };\r\n var baggageCosts = i.BaggageCostings;\r\n if (baggageCosts) {\r\n costings.total = baggageCosts.Total;\r\n costings.discount = baggageCosts.Discount;\r\n }\r\n else {\r\n costings.total = i.TotalBaggageCost;\r\n //this is to be removed, here so that we don't have to tie the flights release\r\n // to the website release HJ-64 HJ-57\r\n }\r\n return costings;\r\n });\r\n }\r\n function hotelCost(basketId) {\r\n return _costByProduct(productType.Accommodation, basketId);\r\n }\r\n function hotelDeposit(basketId) {\r\n return service.hotel(basketId)\r\n .then(function (hotel) { return (hotel && hotel.ImmediatePayment) ? hotel.ImmediatePayment.Amount : 0; });\r\n }\r\n function insuranceCost(basketId) {\r\n return _costByProduct(productType.Insurance, basketId);\r\n }\r\n function isAtolProtected(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (basket) { return basket.IsAtolProtected; });\r\n }\r\n function parkingCost(basketId) {\r\n return _costByProduct(productType.Parking, basketId);\r\n }\r\n function transferCost(basketId) {\r\n return _costByProduct(productType.Transfer, basketId);\r\n }\r\n function rules(basketId, productId) {\r\n return service.all(basketId, productId)\r\n .then(function (products) {\r\n var hotelOnly = products.h != null && products.f == null && products.t == null && products.m == null && products.i == null && !arrayUtil.count(products.a);\r\n var hasTransfer = products.t != null;\r\n var hasOutboundTransfer = products.t != null && products.t.Details.Itinerary.OutboundLeg != null;\r\n var hasInboundTransfer = products.t != null && products.t.Details.Itinerary.InboundLeg != null;\r\n var hasParking = products.p != null;\r\n var hasCarHire = products.c != null;\r\n var hasCarHirePayableLocally = products.c && products.c.RequestedItems && products.c.RequestedItems.length;\r\n var hasInsurance = products.i != null;\r\n var productList = [products.f, products.h, products.i, products.t, products.m, products.p].concat(products.a);\r\n var isOriginOpenJaw = products.f && products.f.Details && products.f.Details.Itinerary && products.f.Details.Itinerary.IsOriginOpenJaw;\r\n var hasConnectingFlight = products.m != null && products.m.Details.MarhabaQuote.Type === 2;\r\n var isAttractionsStandalone = !products.h && !products.f && products.a && !!products.a.length;\r\n return {\r\n captureMainDriver: hasCarHire,\r\n hasChauffeur: _checkChauffeur(products.m),\r\n hasAttraction: products.a != null,\r\n hotelOnly: hotelOnly,\r\n hasMarhaba: products.m != null,\r\n captureConnectingFlight: hasConnectingFlight,\r\n captureFlight: (products.f == null && hasTransfer),\r\n hasTransfer: hasTransfer,\r\n hasOutboundTransfer: hasOutboundTransfer,\r\n hasInboundTransfer: hasInboundTransfer,\r\n captureOutboundFlight: hasOutboundTransfer,\r\n captureInboundFlight: hasInboundTransfer,\r\n captureSpecialRequests: (products.h != null || products.m != null),\r\n captureHotel: (products.h == null && products.t != null),\r\n captureInsurance: hasInsurance,\r\n captureVehicle: hasParking,\r\n showPayableNow: arrayUtil.count(productList, function (p) { return p && p.ImmediatePayment && p.ImmediatePayment.Amount > 0; }) > 0,\r\n showPayableLocally: hasCarHirePayableLocally,\r\n depositAllowed: arrayUtil.count(productList, function (p) { return p && p.FuturePayments && p.FuturePayments.length > 0; }) > 0,\r\n showDirectPayments: arrayUtil.count(productList, function (p) { return p && p.DirectPayments && p.DirectPayments.length > 0; }) > 0,\r\n showOptionalExtras: products.f != null && _.some(products.f.Details.FlightSectorOptionalExtras, function (sector) { return sector.OptionalExtras.length > 0; }),\r\n empty: products.f === null && products.h === null && products.i == null && products.t === null,\r\n showParkingQuotes: _.get(products, 'f.Details.Itinerary.Legs.length') > 1 && !isOriginOpenJaw,\r\n isAttractionsStandalone: isAttractionsStandalone\r\n };\r\n });\r\n }\r\n function insurance(basketId) {\r\n return _rehydrateProducts(productType.Insurance, insuranceService.rehydrate.bind(insuranceService), basketId, true);\r\n //return _productsByType(productType.Insurance, basketId, true);\r\n }\r\n function parking(basketId) {\r\n return _rehydrateProducts(productType.Parking, parkingDetailsService.rehydrate.bind(parkingDetailsService), basketId, true);\r\n //return _productsByType(productType.Parking, basketId, true);\r\n }\r\n function attraction(basketId) {\r\n return _rehydrateProducts(productType.Attractions, attractionDetailsService.rehydrate.bind(attractionDetailsService), basketId);\r\n }\r\n function adHoc(basketId) {\r\n return _rehydrateProducts(productType.AdHoc, adHocService.rehydrate.bind(adHocService), basketId);\r\n }\r\n function removeInsurance(basketId) {\r\n return _removeProduct(productType.Insurance, basketId);\r\n }\r\n function removeParking(basketId) {\r\n return _removeProduct(productType.Parking, basketId);\r\n }\r\n function removeAttraction(basketId) {\r\n return _removeProduct(productType.Attractions, basketId);\r\n }\r\n function addInsurance(searchId, quote, basketId) {\r\n return insuranceService.getInsuranceDetails({\r\n AvailabilityId: searchId,\r\n SchemeId: quote.QuoteType.SchemeId,\r\n TripTypeId: quote.QuoteType.TypeId,\r\n SupplierId: quote.SupplierId,\r\n DestinationId: quote.QuoteType.DestinationId,\r\n RelationshipId: quote.QuoteType.RelationshipId\r\n }).then(function (d) {\r\n var opt = [{ OptionId: quote.QuoteType.SchemeId + \"|\" + quote.QuoteType.TypeId + \"|\" + quote.SupplierId + \"|\" + quote.QuoteType.RelationshipId }];\r\n return _addProduct(productType.Insurance, searchId, d.DetailSearchId, basketId, opt).then(function () {\r\n return service.insurance(basketId);\r\n });\r\n });\r\n }\r\n function addCancellationProtection(productId, quote, basketId, quantity) {\r\n return addOption(productType.Accommodation, productId, quote.QuoteId, basketId, quantity)\r\n .then(function () {\r\n broker.publish('basketUpdated');\r\n });\r\n }\r\n function removeCancellationProtection(productId, quote, basketId) {\r\n return removeOption(productType.Accommodation, productId, quote.QuoteId, basketId)\r\n .then(function () {\r\n broker.publish('basketUpdated');\r\n });\r\n }\r\n function rehydrateBasketForPUP(basketId) {\r\n _flushBasket();\r\n basket = _getBasketById(basketId);\r\n return basket;\r\n }\r\n function addCar(searchId, quote, basketId) {\r\n return carHireDetailsService.getCarDetails({\r\n AvailabilitySearchId: searchId,\r\n CarHireQuote: quote\r\n }).then(function (d) {\r\n return _addProduct(productType.CarHire, searchId, d.DetailsSearchId, basketId)\r\n .then(function () {\r\n return service.carHire(basketId);\r\n });\r\n });\r\n }\r\n function addParking(searchId, parking, basketId) {\r\n return parkingDetailsService.getParkingDetails({\r\n AvailabilitySearchId: searchId,\r\n AirportParkingQuoteId: parking\r\n }).then(function (d) {\r\n return _addProduct(productType.Parking, searchId, d.DetailsSearchId, basketId).then(function () {\r\n return service.parking(basketId);\r\n });\r\n });\r\n }\r\n function putAttractionExtras(searchId, attractions, basketId) {\r\n // Create or replace attraction extras entry in basket\r\n var atts = [];\r\n angular.forEach(attractions.selected, function (a) {\r\n atts.push({\r\n AttractionId: a,\r\n TicketTypesCount: attractions.occupancy[a]\r\n });\r\n });\r\n return removeAttraction(basketId)\r\n .then(function () {\r\n return attractionDetailsService.getAttractionDetails({\r\n AvailabilitySearchId: searchId,\r\n AttractionRequests: atts\r\n });\r\n })\r\n .then(function (details) { return _addProduct(productType.Attractions, searchId, details.DetailsSearchId, basketId); })\r\n .then(function () { return service.attraction(basketId); });\r\n }\r\n function addAttraction(productId, productTags, basketId) {\r\n // Add standalone attractions product to basket\r\n var domain = TRPCONFIG.Domain;\r\n return $http.post('/api2/attractions/bookingfunnel/addtobasket', {\r\n BasketId: basketId,\r\n AvailabilityRequest: {\r\n Id: productId,\r\n DomainId: domain.DomainId,\r\n Tags: productTags,\r\n Currency: domain.CurrencyCode\r\n }\r\n }, { ignoreErrors: true }).then(function (res) { return _refreshAttractionsBasket(res.data, basketId); }, function (err) { return ({ error: err }); });\r\n }\r\n function updateAttraction(lineItemId, updates, basketId) {\r\n // Modify standalone attractions product in basket\r\n return $http.post('/api2/attractions/bookingfunnel/updatebasket', {\r\n BasketId: basketId,\r\n LineItemId: lineItemId,\r\n Updates: updates,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }, { ignoreErrors: true }).then(function (res) { return _refreshAttractionsBasket(res.data, basketId); }, function (err) { return ({ error: err }); });\r\n }\r\n function removeAttractionsLineItem(lineItemId, basketId) {\r\n // Remove standalone attractions product from basket\r\n return $http.post('/api2/attractions/bookingfunnel/removefrombasket', {\r\n BasketId: basketId,\r\n LineItemId: lineItemId\r\n }, { ignoreErrors: true }).then(function (res) { return _refreshAttractionsBasket(res.data, basketId); }, function (err) { return ({ error: err }); });\r\n }\r\n function getAttractionsBasket() {\r\n // Get all standalone attractions products in basket\r\n return attractionsBasket || (attractionsBasket = getAttractionsBasketId()\r\n .then(function (id) { return $http.post(\"/api2/attractions/bookingfunnel/getbasket?basketId=\" + id); })\r\n .then(function (res) { return res.data; }));\r\n }\r\n function getAttractionsBasketId() {\r\n return $q.when(TRPCONFIG.BasketId ||\r\n service.createBasket()\r\n .then(function (b) { return TRPCONFIG.BasketId = b.BasketId; }));\r\n }\r\n function _refreshAttractionsBasket(basketData, basketId) {\r\n // `attractions/bookingfunnel/...` API makes back-end changes to the basket\r\n var responseBasketId = basketData.Basket.BasketId;\r\n basket = null;\r\n attractionsBasket = null;\r\n attractionDetailsService.purge();\r\n // Back-end creates a new basket if existing contains non-attractions products\r\n if (responseBasketId !== basketId) {\r\n TRPCONFIG.BasketId = responseBasketId;\r\n }\r\n return _getBasket(responseBasketId)\r\n .then(function () { return service.attraction(responseBasketId); }) // Rehydrate `basket` products\r\n .then(function () {\r\n // Can't use `basketService.updateBasket()` due to circular dependency error\r\n broker.publish('basketUpdated');\r\n // Publish/return 'attractions/bookingfunnel' data format\r\n broker.publish('attractionsBasketUpdated', basketData);\r\n return basketData;\r\n });\r\n }\r\n function removeCar(basketId) {\r\n return _removeProduct(productType.CarHire, basketId);\r\n }\r\n function getBasketId(tripId) {\r\n if (tripId) {\r\n return tripService.getTrip(tripId).then(function (trip) {\r\n if (trip) {\r\n return trip.BasketId;\r\n }\r\n return $q.when();\r\n });\r\n }\r\n else if (TRPCONFIG.BasketId) {\r\n return $q.when(TRPCONFIG.BasketId);\r\n }\r\n return createBasket().then(function (basket) {\r\n TRPCONFIG.BasketId = basket.BasketId;\r\n return basket.BasketId;\r\n });\r\n }\r\n function getProductCount() {\r\n return getBasketId()\r\n .then(function (basketId) { return _getBasket(basketId); })\r\n .then(function (basket) { return _.filter(basket.Products, function (p) { return p.CostBreakdown.length > 0; }).length; });\r\n }\r\n function _simplifiedBaggageOptions(basketId) {\r\n return flight(basketId).then(function (f) {\r\n var baggageOptionsSimplified = [];\r\n var addToArray = function (arr, index, bagOption, price, weight) {\r\n if (arr.length <= index) {\r\n arr.push({ TotalPrice: 0, Bags: [], UnitWeightKg: [] });\r\n }\r\n arr[index].Bags.push(bagOption);\r\n arr[index].TotalPrice += price;\r\n arr[index].UnitWeightKg.push(weight);\r\n };\r\n //for multiple sectors adding 1 bag will mean multiple options being added under the hood\r\n //so 1 bag option may contain an array of options\r\n // e.g if you add a bag to your out leg your are more than likely going to need it on the way back\r\n _.forEach(f.Details.FlightSectorOptionalExtras, function (extras) {\r\n var baggageOptions = _.find(extras.NonCheckInOptions, ['Type', 0]);\r\n if (baggageOptions) {\r\n _.forEach(baggageOptions.MultiOptionalExtras, function (multi, index) {\r\n var opt = _.find(multi.Options, { IsDefault: true });\r\n addToArray(baggageOptionsSimplified, index, opt.Key, opt.UnitAmount, opt.UnitWeightKg);\r\n });\r\n var options = _.filter(baggageOptions.SingleOptionalExtras, { IsDefault: true });\r\n _.forEach(options, function (opt, index) {\r\n addToArray(baggageOptionsSimplified, index, opt.Key, opt.UnitAmount, opt.UnitWeightKg);\r\n });\r\n }\r\n });\r\n return baggageOptionsSimplified;\r\n });\r\n }\r\n function _baggageOptionComparer(o1, o2) {\r\n var o1qty = o1.Quantity || o1.ChoosenQuantity;\r\n var o2qty = o2.Quantity || o2.ChoosenQuantity;\r\n return o1.OptionId === o2.OptionId && o1qty === o2qty;\r\n }\r\n function simplifiedBaggageCount(basketId) {\r\n //figure out how many bags from our possible list\r\n //are actually selected\r\n return $q.all([\r\n flightOptions(basketId),\r\n _simplifiedBaggageOptions(basketId)\r\n ]).then(function (results) {\r\n var bagsSelected = 0;\r\n var basketOptions = results[0];\r\n var bagOptions = results[1];\r\n //check the whole option is in our basket\r\n _.forEach(bagOptions, function (option) {\r\n var selected = _.every(option.Bags, function (opt) {\r\n return _.some(basketOptions, function (bo) {\r\n return _baggageOptionComparer(opt, bo);\r\n });\r\n });\r\n if (selected) {\r\n bagsSelected++;\r\n }\r\n });\r\n var minWeight = (bagOptions.length > 0) ? _.min(_.flatMap(bagOptions, function (o) { return o.UnitWeightKg; })) : 0;\r\n return {\r\n selected: bagsSelected,\r\n maxAllowed: bagOptions.length,\r\n price: (bagOptions.length > 0) ? bagOptions[0].TotalPrice : 0,\r\n unitWeightKg: minWeight\r\n };\r\n });\r\n }\r\n function updateBaggageOptions(basketId, count, model) {\r\n return $q.all([\r\n flight(basketId),\r\n flightOptions(basketId),\r\n _simplifiedBaggageOptions(basketId)\r\n ]).then(function (results) {\r\n var flight = results[0];\r\n var bagOptions = results[2];\r\n var allBagOptions = flight.Details.FlightSectorOptionalExtras.reduce(function (res, cur) {\r\n var baggageNonCheckInOptions = _.find(cur.NonCheckInOptions, ['Type', 0]);\r\n return res.concat(baggageNonCheckInOptions.MultiOptionalExtras.reduce(function (res, cur) {\r\n return res.concat(cur.Options.map(function (op) { return op.Key; }));\r\n }, []).concat(baggageNonCheckInOptions.SingleOptionalExtras.map(function (option) { return option.Key; })));\r\n }, []);\r\n var basketOptions = _.intersectionBy(results[1], allBagOptions, 'OptionId');\r\n var selectedOptions = [];\r\n var createBasketOption = function (option) {\r\n return {\r\n OptionId: option.OptionId,\r\n ChosenQuantity: option.Quantity\r\n };\r\n };\r\n //use the count to figure out which bags we need to select\r\n _.times(count, function (i) {\r\n selectedOptions = selectedOptions.concat(bagOptions[i].Bags);\r\n });\r\n //compare what we want with what we have and add/remove accordingly\r\n var optionsToRemove = _.map(arrayUtil.difference(basketOptions, selectedOptions, _baggageOptionComparer), function (o) { return createBasketOption(o); });\r\n var optionsToAdd = _.map(arrayUtil.difference(selectedOptions, basketOptions, _baggageOptionComparer), function (o) { return createBasketOption(o); });\r\n return removeOptions(productType.Flight, flight.ProductId, optionsToRemove, basketId)\r\n .then(function () { return addOptions(productType.Flight, flight.ProductId, optionsToAdd, basketId); })\r\n .then(function (options) {\r\n _.pullAllBy(model[0], optionsToRemove, 'OptionId');\r\n //not great, a bit of a band aid while we still use the 'old' options page and have all flight\r\n //options handled together (seats, meals) using the code in optionsCtrl\r\n var optionsOldFormat = _.map(optionsToAdd, function (o) {\r\n return {\r\n OptionId: o.OptionId,\r\n Quantity: o.ChosenQuantity\r\n };\r\n });\r\n (_a = model[0]).push.apply(_a, optionsOldFormat);\r\n return options;\r\n var _a;\r\n });\r\n });\r\n }\r\n function updatePriorityBoarding(basketId, pbDetails, pbSelectedStatus) {\r\n return flight(basketId).then(function (flight) {\r\n var pbBasketOptions = [{\r\n OptionId: pbDetails.OptionId,\r\n ChosenQuantity: pbDetails.Quantity\r\n }];\r\n return pbSelectedStatus\r\n ? addOptions(productType.Flight, flight.ProductId, pbBasketOptions, basketId)\r\n : removeOptions(productType.Flight, flight.ProductId, pbBasketOptions, basketId);\r\n });\r\n }\r\n function setProductVisibility(userRequest) {\r\n return $http.post(url + \"setproductvisibility\", userRequest);\r\n }\r\n function setAdjustmentVisibility(adjustmentRequest) {\r\n return $http.post(url + \"setadjustmentvisibility\", adjustmentRequest);\r\n }\r\n function checkBasketBookingAllowed(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (basket) {\r\n return basket.Products.every(function (p) {\r\n return (p.ProductSpecificFields == null) || (p.ProductSpecificFields.IsBookable == null) || (p.ProductSpecificFields.IsBookable);\r\n });\r\n });\r\n }\r\n function setBasketIdentity(basketId, userRequest) {\r\n var validateTravelAgent = function (req) { return !_.isEmpty(req)\r\n && !_.isEmpty(req.TravelAgent)\r\n && !_.isEmpty(_.trim(req.TravelAgent.FirstName))\r\n && !_.isEmpty(_.trim(req.TravelAgent.LastName)); };\r\n return !validateTravelAgent(userRequest)\r\n ? $q.reject('bad request')\r\n : $http.post(url + \"setidentities\", {\r\n BasketId: basketId,\r\n TravelAgent: userRequest ? userRequest.TravelAgent : null,\r\n TravelAgentCustomer: userRequest ? userRequest.TravelAgentCustomer : {}\r\n }).then(function (result) {\r\n basket = $q.when(result.data);\r\n return getBasketIdentity(result.data.BasketId);\r\n });\r\n }\r\n function getBasketIdentity(basketId) {\r\n return _getBasket(basketId)\r\n .then(function (basket) {\r\n return {\r\n TravelAgent: basket.TravelAgent,\r\n TravelAgentCustomer: basket.TravelAgentCustomer\r\n };\r\n });\r\n }\r\n function getBasketCurrency(basketId) {\r\n return _getBasket(basketId).then(function (basket) { return basket && basket.Currency || ''; });\r\n }\r\n function applyCancelations(basketId, legacyBasketId) {\r\n if (!$routeParams.BookingRef) {\r\n return $q.when();\r\n }\r\n return $http.post(url + \"applycancellations\", {\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n BasketId: basketId,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n LegacyBasketId: legacyBasketId,\r\n })\r\n .then(function (_a) {\r\n var data = _a.data;\r\n basket = $q.when(data);\r\n });\r\n }\r\n function extrasBreakdown(arr) {\r\n var extras = {\r\n transfersCost: 0,\r\n insuranceCost: 0,\r\n parkingCost: 0,\r\n carHireCost: 0,\r\n marhabaCost: 0\r\n };\r\n _.each(arr, function (cb) {\r\n if (cb.ProductType === productType.Transfer) {\r\n extras.transfersCost += cb.Quantity * cb.UnitAmount;\r\n }\r\n if (cb.ProductType === productType.Insurance) {\r\n extras.insuranceCost += cb.Quantity * cb.UnitAmount;\r\n }\r\n if (cb.ProductType === productType.Parking) {\r\n extras.parkingCost += cb.Quantity * cb.UnitAmount;\r\n }\r\n if (cb.ProductType === productType.CarHire) {\r\n extras.carHireCost += cb.Quantity * cb.UnitAmount;\r\n }\r\n if (cb.ProductType === productType.Marhaba) {\r\n extras.marhabaCost += cb.Quantity * cb.UnitAmount;\r\n }\r\n });\r\n return extras;\r\n }\r\n /*\r\n Subscriptions\r\n */\r\n broker.subscribe('basketStore', 'travelAgentSignIn', function () { return _refreshBasket(); });\r\n broker.subscribe('basketStore', 'agentSignedInToBooking', function (_a) {\r\n var data = _a.data;\r\n return setBasketIdentity(TRPCONFIG.BasketId, {\r\n TravelAgent: data.TravelAgent,\r\n TravelAgentCustomer: _.omit(data.Contact, ['Email', 'BookingId', 'SiteId'])\r\n });\r\n });\r\n return service;\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n //service to hold common bits required for tracking data when completing a booking.\r\n //two routes for us to handle booking complete from the booking form and complete after\r\n //coming from payment via PayPal\r\n var BookingCompleteTrackingService = /** @class */ (function () {\r\n function BookingCompleteTrackingService($q, abTest, analytics, basketStore, criteoService, ecommerceService, quoteService, trackingPixelsService) {\r\n this.$q = $q;\r\n this.abTest = abTest;\r\n this.analytics = analytics;\r\n this.basketStore = basketStore;\r\n this.criteoService = criteoService;\r\n this.ecommerceService = ecommerceService;\r\n this.quoteService = quoteService;\r\n this.trackingPixelsService = trackingPixelsService;\r\n }\r\n BookingCompleteTrackingService.prototype.trackConversion = function (trip, refs, source, userEmail, rooms) {\r\n var _this = this;\r\n return this.basketStore.all(trip.BasketId).then(function (basket) {\r\n //dont bother running analytics code as we dont have a basket anymore!\r\n if (basket.f == null && basket.h == null && basket.t == null && basket.c == null &&\r\n basket.a == null && basket.p == null) {\r\n return;\r\n }\r\n return _this.trackTotalCost(trip.BasketId, basket, refs, source, userEmail, trip.TripId, trip.TripType, trip.QuoteId, rooms);\r\n });\r\n };\r\n BookingCompleteTrackingService.prototype.trackTotalCost = function (basketId, basket, refs, source, userEmail, tripId, tripType, quoteId, rooms) {\r\n var _this = this;\r\n return this.$q.all([\r\n this.basketStore.totalCostFromBasket(basket),\r\n this.basketStore.getBasketCurrency(basketId)\r\n ]).then(function (results) {\r\n var totalCost = results[0];\r\n var currency = results[1];\r\n var criteoData = {\r\n ref: refs.join('|'),\r\n items: {\r\n hotel: basket.h,\r\n flight: basket.f\r\n },\r\n price: totalCost\r\n };\r\n _this.criteoService.enqueue(criteoData, 'bookingcomplete', tripType);\r\n var trackingData = {\r\n TotalCost: totalCost,\r\n Hotel: basket.h,\r\n Flight: basket.f,\r\n CarHire: basket.c,\r\n Transfer: basket.t,\r\n Attractions: basket.a,\r\n Insurance: basket.i,\r\n Parking: basket.p,\r\n Marhaba: basket.m,\r\n FirstBookingId: refs[0].split('/')[1],\r\n Source: source\r\n };\r\n _this.analytics.track('mixpanel', 'BookingComplete', trackingData);\r\n _this.analytics.track('mixpanelPeople', 'BookingComplete', trackingData);\r\n _this.analytics.setMixpanelEmail(userEmail);\r\n return _this.ecommerceService.pushBasket(tripId, basket, totalCost, refs)\r\n .then(function () {\r\n _this.trackingPixelsService.setData(refs, currency, totalCost, basket.h, rooms, tripType);\r\n _this.abTest.recordRevenue(totalCost);\r\n var run = $.when();\r\n if (TRPCONFIG.Domain.QuoteEnabled && quoteId) {\r\n run.then(function () { return _this.quoteService.linkQuote(refs, quoteId); });\r\n }\r\n return run;\r\n });\r\n });\r\n };\r\n return BookingCompleteTrackingService;\r\n }());\r\n Core.BookingCompleteTrackingService = BookingCompleteTrackingService;\r\n angular\r\n .module('TR')\r\n .service('bookingCompleteTrackingService', BookingCompleteTrackingService);\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n /*\r\n this is a horrible hack to make sure that all the services\r\n that we need to be constructed and listening for events are\r\n alive and ready\r\n */\r\n angular\r\n .module('TR')\r\n .service('bootstrapper', bootstrapper);\r\n function bootstrapper($injector) {\r\n var service = {\r\n init: init\r\n };\r\n function init() {\r\n $injector.get('hotelService');\r\n $injector.get('flightSearch');\r\n $injector.get('hotelSearch');\r\n $injector.get('transferSearch');\r\n $injector.get('authService');\r\n $injector.get('searchUnitService');\r\n $injector.get('basketService');\r\n $injector.get('urgencyMessaging');\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .service('cancellerService', cancellerService);\r\n function cancellerService($q, broker) {\r\n var supervisors = [];\r\n var service = {\r\n add: add,\r\n process: processFunc\r\n };\r\n function add() {\r\n var validRoutes = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n validRoutes[_i] = arguments[_i];\r\n }\r\n var supervisor = { validRoutes: validRoutes, canceller: $q.defer() };\r\n supervisors.push(supervisor);\r\n return supervisor.canceller;\r\n }\r\n function processFunc(nextRoute) {\r\n var remainingSupervisors = [];\r\n supervisors.forEach(function (s) {\r\n var valid = s.validRoutes.some(function (r) {\r\n if (r instanceof RegExp) {\r\n return r.test(nextRoute);\r\n }\r\n return r === nextRoute;\r\n });\r\n if (!valid) {\r\n broker.publish('unblock');\r\n s.canceller.resolve('CANCELLED');\r\n }\r\n else {\r\n remainingSupervisors.push(s);\r\n }\r\n });\r\n supervisors = remainingSupervisors;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var KeyCode;\r\n (function (KeyCode) {\r\n KeyCode[KeyCode[\"TAB\"] = 9] = \"TAB\";\r\n KeyCode[KeyCode[\"RETURN\"] = 13] = \"RETURN\";\r\n KeyCode[KeyCode[\"ESC\"] = 27] = \"ESC\";\r\n KeyCode[KeyCode[\"SPACE\"] = 32] = \"SPACE\";\r\n KeyCode[KeyCode[\"PAGEUP\"] = 33] = \"PAGEUP\";\r\n KeyCode[KeyCode[\"PAGEDOWN\"] = 34] = \"PAGEDOWN\";\r\n KeyCode[KeyCode[\"END\"] = 35] = \"END\";\r\n KeyCode[KeyCode[\"HOME\"] = 36] = \"HOME\";\r\n KeyCode[KeyCode[\"LEFT\"] = 37] = \"LEFT\";\r\n KeyCode[KeyCode[\"UP\"] = 38] = \"UP\";\r\n KeyCode[KeyCode[\"RIGHT\"] = 39] = \"RIGHT\";\r\n KeyCode[KeyCode[\"DOWN\"] = 40] = \"DOWN\";\r\n })(KeyCode = TR.KeyCode || (TR.KeyCode = {}));\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .service('countryService', countryService);\r\n function countryService(hotelSearch, $filter, $http, destinationService, imageService, $q, arrayUtil, broker, fieldGroupService, objectTypeService) {\r\n var service = {\r\n getTopDeals: getTopDeals\r\n };\r\n var fieldTypes = fieldGroupService.getFieldTypes();\r\n var fieldFlags = fieldGroupService.getFieldGroup([\r\n fieldTypes.Global,\r\n fieldTypes.Titles,\r\n fieldTypes.IndicativePrice,\r\n fieldTypes.ReviewSnippets,\r\n fieldTypes.Url,\r\n fieldTypes.Summary,\r\n fieldTypes.Recommendations\r\n ]);\r\n //yes this looks a lot like what the hotelSearch service does, but in this case we need to run n searches\r\n //concurrently which the hotelSearch service is specifically designed to prevent.\r\n function _getHotelsForDestination(dest) {\r\n var domain = TRPCONFIG.Domain;\r\n dest.loading = true;\r\n var objectTypeAndId = objectTypeService.getObjectTypeAndId(dest);\r\n return $http.post('/api/hotels/static/gethotelsbydestination', {\r\n DestinationType: objectTypeAndId.Type,\r\n DestinationId: objectTypeAndId.Id,\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId,\r\n CurrencyCode: domain.CurrencyCode,\r\n Paging: {\r\n Index: 0,\r\n Size: 2\r\n },\r\n SortCriterion: 1,\r\n FilterCriteria: hotelSearch.getFilter(),\r\n FieldFlags: fieldFlags\r\n }).then(function (result) {\r\n return arrayUtil.map(result.data.Hotels, function (hotel) {\r\n var dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, dim, dim);\r\n hotel.MinCostStr = $filter('roundedCurrency')(hotel.MinCost);\r\n hotel.OriginalCostStr = $filter('roundedCurrency')(hotel.OriginalCost);\r\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice);\r\n return hotel;\r\n });\r\n });\r\n }\r\n function getTopDeals(topn, destination, children) {\r\n function getHotels(children) {\r\n return hotelSearch.updateFilterFromFid().then(function () {\r\n return $q.all(arrayUtil.map(children, _getHotelsForDestination)).then(function (results) {\r\n var all = [];\r\n results.forEach(function (hotels, i) {\r\n children[i].hotels = hotels;\r\n all = all.concat(hotels);\r\n });\r\n broker.publish('hotelsReturnedFromSearch', all); //make sure we publish the results so that\r\n return children; //urgency messaging works efficiently\r\n });\r\n });\r\n }\r\n if (children == null) {\r\n return destinationService.getTopChildren(topn, destination).then(getHotels);\r\n }\r\n return getHotels(children);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n /* eslint-disable camelcase */\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .factory('criteoService', criteoService);\r\n function criteoService($q, dateUtil, funcUtil, currentUser, searchUnitService, destinationAirport, currentDestination, broker) {\r\n var productTypes = {\r\n hotel: 1,\r\n tailorMade: 2,\r\n flight: 3\r\n };\r\n var userLanguages = {\r\n en: 'english',\r\n ar: 'arabic'\r\n };\r\n var language = TRPCONFIG.Domain.CultureCode != null\r\n ? userLanguages[TRPCONFIG.Domain.CultureCode.substring(0, 2)]\r\n : 'en';\r\n var service = {\r\n enqueue: enqueue\r\n };\r\n var getCustomerIdComplete;\r\n broker.subscribe('criteoService', 'userExtended', function (ev) {\r\n if (getCustomerIdComplete) {\r\n getCustomerIdComplete.resolve(ev.data.UserIdHash);\r\n }\r\n });\r\n function _getCustomerId() {\r\n var user = currentUser.get();\r\n var isUserComplete = user && (user.Email !== undefined || !user.SignedIn);\r\n if (isUserComplete) {\r\n return $q.when(user.UserIdHash);\r\n }\r\n getCustomerIdComplete = $q.defer();\r\n return getCustomerIdComplete.promise;\r\n }\r\n function _getSearchDates(type) {\r\n var product = (type === 'hotel' ? searchUnitService.hotel : searchUnitService.flight);\r\n return {\r\n checkInDate: dateUtil.format(searchUnitService.startDate(product), 'yyyy-MM-dd'),\r\n checkOutDate: dateUtil.format(searchUnitService.endDate(product), 'yyyy-MM-dd')\r\n };\r\n }\r\n function _buildConfirmationId(items) {\r\n var id = '';\r\n if (items.hotel) {\r\n id += items.hotel.Details.Id;\r\n }\r\n if (items.flight && !items.hotel) {\r\n id += '::';\r\n id += searchUnitService.getDepartureAirports();\r\n }\r\n return id;\r\n }\r\n function _getIds(items, type) {\r\n var ids = [];\r\n switch (type) {\r\n case 'hotels':\r\n items = items.Hotels;\r\n angular.forEach(items, function (hotel) {\r\n ids.push(hotel.Id);\r\n });\r\n break;\r\n case 'flights':\r\n angular.forEach(items, function (flight) {\r\n ids.push(flight.FlightId);\r\n });\r\n }\r\n return ids;\r\n }\r\n var _config = function (type, tripType) {\r\n var promises = {\r\n customerId: _getCustomerId(),\r\n emailHash: (function () {\r\n var getEmailHash = function () { return currentUser.get() && currentUser.get().EmailHash; };\r\n return type === 'bookingcomplete' ? funcUtil.waitForValue(getEmailHash) : getEmailHash();\r\n })()\r\n };\r\n return $q.all(promises).then(function (results) {\r\n results.customerId = results.customerId || '';\r\n var config = [\r\n { event: 'setCustomerId', id: results.customerId },\r\n { event: 'setAccount', account: TRPCONFIG.Domain.CriteoPartnerId },\r\n { event: 'setSiteType', type: (TRPCONFIG.IsMobileView) ? 'm' : 'd' }\r\n ];\r\n if (results.emailHash) {\r\n config.push({ event: 'setHashedEmail', m: results.emailHash, hash_method: 's2m' });\r\n }\r\n if (tripType != null) {\r\n switch (tripType) {\r\n case 4:\r\n config.push({ event: 'setData', append_to_landing_url: 'tm=1' });\r\n break;\r\n default:\r\n config.push({ event: 'setData', append_to_landing_url: 'tm=' });\r\n break;\r\n }\r\n }\r\n return config;\r\n });\r\n };\r\n function enqueue(data, type, tripType) {\r\n if (TRPCONFIG.Domain.isAgentMode) {\r\n return;\r\n }\r\n $('#criteo-tags-div').empty();\r\n if (TRPCONFIG.Domain.CriteoEnabled) {\r\n window.criteo_q = window.criteo_q || [];\r\n _config(type, tripType).then(function (conf) {\r\n var airports;\r\n var product;\r\n var title = null;\r\n switch (type) {\r\n case 'home':\r\n _homeTag(conf);\r\n break;\r\n case 'hotel':\r\n product = {\r\n dates: _getSearchDates('hotel'),\r\n type: productTypes.hotel,\r\n id: data.Id\r\n };\r\n _productTag(product, conf);\r\n break;\r\n case 'hotellist':\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n if (dest) {\r\n title = dest.Title;\r\n }\r\n else if (searchUnitService.getSearchArea() && data.Hotels) {\r\n title = data.Hotels[0].Location;\r\n }\r\n product = {\r\n dates: _getSearchDates('hotel'),\r\n items: _getIds(data, 'hotels'),\r\n type: productTypes.hotel\r\n };\r\n _productListTag(product, title, conf);\r\n });\r\n break;\r\n case 'flightlist':\r\n airports = searchUnitService.getDepartureAirports() || [];\r\n destinationAirport.getTopEstabsForAirport(airports[0]).then(function (data) {\r\n var ids = [];\r\n angular.forEach(data.Hotels, function (estab) {\r\n ids.push(estab.Id);\r\n });\r\n product = {\r\n dates: _getSearchDates('flight'),\r\n items: ids,\r\n type: productTypes.flight\r\n };\r\n _productListTag(product, null, conf);\r\n });\r\n break;\r\n case 'basket':\r\n product = {\r\n id: _buildConfirmationId(data.items),\r\n price: data.price\r\n };\r\n _basketTag(product, conf);\r\n break;\r\n case 'bookingcomplete': {\r\n var id = _buildConfirmationId(data.items);\r\n if (id != null) {\r\n product = {\r\n id: id,\r\n price: data.price\r\n };\r\n _confirmationTag(data.ref || data.ref[0], product, conf);\r\n }\r\n break;\r\n }\r\n case 'signin':\r\n _signinTag(data, conf);\r\n }\r\n });\r\n }\r\n }\r\n function _confirmationTag(transaction, product, conf) {\r\n window.criteo_q.push(conf, {\r\n event: 'trackTransaction',\r\n id: transaction || transaction.id,\r\n item: [{\r\n id: product.id,\r\n price: product.price,\r\n quantity: 1\r\n }],\r\n section: language\r\n });\r\n }\r\n function _homeTag(conf) {\r\n window.criteo_q.push(conf, {\r\n event: 'viewHome',\r\n section: language\r\n });\r\n }\r\n function _signinTag(data, conf) {\r\n window.criteo_q.push(conf, {\r\n event: 'setHashedEmail',\r\n m: data && data.EmailHash,\r\n hash_method: 's2m'\r\n });\r\n }\r\n function _productTag(product, conf) {\r\n window.criteo_q.push(conf, { event: 'setData', user_segment: product.type }, { event: 'viewItem', item: product.id, section: language });\r\n if (product.dates.checkInDate || product.dates.checkOutDate) {\r\n window.criteo_q.push({\r\n event: 'viewSearch',\r\n checkin_date: product.dates.checkInDate,\r\n checkout_date: product.dates.checkOutDate\r\n });\r\n }\r\n }\r\n function _productListTag(product, keywords, conf) {\r\n window.criteo_q.push(conf, { event: 'setData', user_segment: product.type }, {\r\n event: 'viewList',\r\n item: product.items,\r\n section: language,\r\n keywords: keywords\r\n }, {\r\n event: 'viewSearch',\r\n checkin_date: product.dates.checkInDate,\r\n checkout_date: product.dates.checkOutDate\r\n });\r\n }\r\n function _basketTag(product, conf) {\r\n window.criteo_q.push(conf, {\r\n event: 'viewBasket',\r\n section: language,\r\n retarget: 0,\r\n item: [{\r\n id: product.id,\r\n price: product.price,\r\n quantity: 1\r\n }]\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .service('currentDestination', currentDestination);\r\n function currentDestination($routeParams, tripService, searchUnitService, destinationService, $q) {\r\n var service = {\r\n getCurrentDestination: getCurrentDestination\r\n };\r\n function getCurrentDestination(options) {\r\n return destinationFn(options).then(function (destination) {\r\n if (destination == null) {\r\n return null;\r\n }\r\n return destinationService.enhanceDestinationFromPreferences(destination).then(function () { return destination; });\r\n });\r\n }\r\n var defaults = {\r\n useTrip: true,\r\n useLandingPage: true,\r\n useSearchUnitService: true\r\n };\r\n function destinationFn(options) {\r\n options = angular.extend({}, defaults, options);\r\n if (options.useTrip && $routeParams.tripId) {\r\n return tripService.getTripDestination($routeParams.tripId);\r\n }\r\n if (options.useLandingPage && $routeParams.landingPageV4) {\r\n return destinationService.fromUrl(\"/\" + $routeParams.urlText + \"/\" + $routeParams.landingPageV4, $routeParams.tm)\r\n .then(destinationService.enhanceLegacyDestination)\r\n .then(destinationService.getDetails);\r\n }\r\n if (options.useLandingPage && ($routeParams.landingPageV2 || $routeParams.landingPageV3)) {\r\n var tmParam = $routeParams.tm || '2';\r\n var route = '';\r\n if ($routeParams.landingPageV3) {\r\n var possibleParam = $routeParams.landingPageV3 && $routeParams.landingPageV3.match(/(?:\\d+-\\d+-)(\\d+)(?:-\\d+)/) || [];\r\n tmParam = possibleParam && possibleParam[1] !== '1' ? '1' : tmParam;\r\n route = $routeParams.landingPageV3;\r\n }\r\n else if ($routeParams.landingPageV2) {\r\n var possibleParam = $routeParams.landingPageV2 && $routeParams.landingPageV2.match(/(?:\\d+-\\d+-)(\\d+)?/) || [];\r\n tmParam = possibleParam && possibleParam[1] !== '1' ? '1' : tmParam;\r\n route = $routeParams.landingPageV2;\r\n }\r\n return destinationService.fromUrl(\"/\" + route + \"/\" + $routeParams.urlText, tmParam)\r\n .then(destinationService.setFidFromDestinationFilter)\r\n .then(destinationService.enhanceLegacyDestination)\r\n .then(destinationService.getDetails);\r\n }\r\n if (options.useLandingPage && $routeParams.landingPage) {\r\n return destinationService.fromUrl(\"/\" + $routeParams.landingPage + \".html\", $routeParams.tm)\r\n .then(destinationService.enhanceLegacyDestination)\r\n .then(destinationService.getDetails);\r\n }\r\n if (options.useSearchUnitService) {\r\n return $q.when(searchUnitService.getDestination());\r\n }\r\n return $q.when();\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('dateUtil', dateUtil);\r\n function dateUtil($injector, $filter, $route, resourceService) {\r\n var oneDay = 24 * 60 * 60 * 1000;\r\n var service = {\r\n addDays: addDays,\r\n addMinutes: addMinutes,\r\n addHours: addHours,\r\n atLeastOneDayInTheFuture: atLeastOneDayInTheFuture,\r\n atLeastTwoDaysInTheFuture: atLeastTwoDaysInTheFuture,\r\n DateRange: DateRange,\r\n format: format,\r\n getAge: getAge,\r\n getDurationSummary: getDurationSummary,\r\n isValid: isValid,\r\n minutesToHoursAndMinutes: minutesToHoursAndMinutes,\r\n numberOfNights: numberOfNights,\r\n parseDate: parseDate,\r\n serialiseDate: serialiseDate,\r\n alignDates: alignDates,\r\n sameDay: sameDay,\r\n sameMonth: sameMonth,\r\n todayPlus: todayPlus,\r\n defaultTime: defaultTime,\r\n zeroTime: zeroTime,\r\n roundedToStartOfHour: roundedToStartOfHour,\r\n dayDiff: dayDiff,\r\n thisWeek: thisWeek,\r\n nextWeek: nextWeek,\r\n thisMonth: thisMonth,\r\n specificMonth: specificMonth,\r\n oneDay: function () { return oneDay; },\r\n compareDates: compareDates,\r\n totalMinutes: totalMinutes,\r\n getWeeksString: getWeeksString,\r\n getDifferenceInDays: getDifferenceInDays,\r\n getDateInterval: getDateInterval,\r\n checkZonedDateFromat: checkZonedDateFromat,\r\n getNextSaturday: getNextSaturday\r\n };\r\n function getWeeksString(date1, date2) {\r\n var oneweek = 604800000; //ms in one week\r\n var weeks = Math.ceil((new Date(date2).setHours(0, 0, 0, 0).valueOf() - new Date(date1).setHours(0, 0, 0, 0).valueOf()) / oneweek);\r\n return weeks.toString() + \" \" + ((weeks > 1) ? resourceService.get('WEEKS') : resourceService.get('WEEK'));\r\n }\r\n function DateRange(start, end, timeSupport) {\r\n if (timeSupport === void 0) { timeSupport = false; }\r\n this.start = serialiseDate(start);\r\n this.end = serialiseDate(end);\r\n this.timeSupport = timeSupport;\r\n this.isStartTimeApprovedByCustomer = timeSupport ? false : undefined;\r\n this.isEndTimeApprovedByCustomer = timeSupport ? false : undefined;\r\n }\r\n DateRange.prototype.setStart = function (val, defaultTimeObj) {\r\n this.start = serialiseDate(val);\r\n if ((this.end == null && this.start != null) ||\r\n (this.end != null && this.start != null && numberOfNights(this.start, this.end) < 1)) {\r\n var areaInfo = getAreaInfo();\r\n var endDateOffset = areaInfo && areaInfo.endDateOffset || 1;\r\n var endDate = addDays(this.start, endDateOffset, true);\r\n if (this.timeSupport) {\r\n this.end = defaultTime(endDate, true, defaultTimeObj);\r\n }\r\n else {\r\n this.end = endDate;\r\n }\r\n }\r\n this.durationSummary = null;\r\n this.nights = null;\r\n };\r\n DateRange.prototype.setEnd = function (val) {\r\n this.end = serialiseDate(val);\r\n this.durationSummary = null;\r\n this.nights = null;\r\n };\r\n DateRange.prototype.getDurationSummary = function () {\r\n if (this.durationSummary) {\r\n return this.durationSummary;\r\n }\r\n this.durationSummary = getDurationSummary(this.start, this.end);\r\n return this.durationSummary;\r\n };\r\n DateRange.prototype.numberOfNights = function () {\r\n if (this.nights) {\r\n return this.nights;\r\n }\r\n this.nights = numberOfNights(this.start, this.end);\r\n return this.nights;\r\n };\r\n function today() {\r\n return zeroTime(new Date());\r\n }\r\n function zeroTime(date, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n d.setMilliseconds(0);\r\n return _serialiseIfNecessary(d, serialised);\r\n }\r\n function defaultTime(date, serialised, defaultTimeObj) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n if (defaultTimeObj) {\r\n d.setHours(defaultTimeObj.hours, defaultTimeObj.minutes);\r\n }\r\n else {\r\n d.setHours(11, 30);\r\n }\r\n return _serialiseIfNecessary(d, serialised);\r\n }\r\n function _toUtc(date, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n return _serialiseIfNecessary(new Date(date.getTime() - (date.getTimezoneOffset() * 60000)), serialised);\r\n }\r\n function todayPlus(options) {\r\n var rest = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n rest[_i - 1] = arguments[_i];\r\n }\r\n if (!_.isObject(options)) {\r\n options = {\r\n days: options,\r\n hours: rest[0],\r\n serialised: rest[1]\r\n };\r\n }\r\n var d = zeroTime(new Date());\r\n if (options.months) {\r\n d.setMonth(d.getMonth() + options.months);\r\n }\r\n if (options.days) {\r\n d.setDate(d.getDate() + options.days);\r\n }\r\n if (options.hours) {\r\n d.setHours(options.hours);\r\n }\r\n return _serialiseIfNecessary(d, options.serialised);\r\n }\r\n function numberOfNights(earliest, latest) {\r\n if (earliest && latest) {\r\n var _a = alignDates([earliest, latest], true), e = _a[0], l = _a[1];\r\n return Math.ceil((l.getTime() - e.getTime()) / oneDay);\r\n }\r\n return -1;\r\n }\r\n function format(date, fmt) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n return $filter('unadjustedDate')(date, fmt || 'd MMM yyyy');\r\n }\r\n function atLeastOneDayInTheFuture(date) {\r\n return _xDaysInTheFuture(date, 1);\r\n }\r\n function atLeastTwoDaysInTheFuture(date) {\r\n return _xDaysInTheFuture(date, 2);\r\n }\r\n function addDays(date, days, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var d = new Date(date);\r\n d.setDate(date.getDate() + days);\r\n return _serialiseIfNecessary(d, serialised);\r\n }\r\n function addMinutes(date, minutes, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var d = new Date(date);\r\n d.setMinutes(d.getMinutes() + minutes);\r\n return _serialiseIfNecessary(d, serialised);\r\n }\r\n function addHours(date, hours, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var d = new Date(date);\r\n d.setHours(d.getHours() + hours);\r\n return _serialiseIfNecessary(d, serialised);\r\n }\r\n function getAge(birthDate, returnDate) {\r\n if (!birthDate || !returnDate) {\r\n return null;\r\n }\r\n birthDate = parseDate(birthDate);\r\n returnDate = parseDate(returnDate);\r\n var age = returnDate.getFullYear() - birthDate.getFullYear();\r\n var m = returnDate.getMonth() - birthDate.getMonth();\r\n if (m < 0 || (m === 0 && returnDate.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return age;\r\n }\r\n function getDurationSummary(from, to) {\r\n from = parseDate(from);\r\n to = parseDate(to);\r\n if (!from || !isValid(from)) {\r\n return '';\r\n }\r\n if (to == null) {\r\n return format(from);\r\n }\r\n if (to.getTime() === 0) {\r\n return format(from);\r\n }\r\n if (!isValid(to)) {\r\n return '';\r\n }\r\n var days = numberOfNights(from, to);\r\n return days + \" \" + (days > 1 ? resourceService.get('NIGHTS') : resourceService.get('NIGHT')) + \", (\" + format(from) + \") - (\" + format(to) + \")\";\r\n }\r\n function minutesToHoursAndMinutes(m, leadingZero) {\r\n if (leadingZero === void 0) { leadingZero = true; }\r\n var hours = leadingZero ? $filter('frontPad')(Math.floor(m / 60)) : Math.floor(m / 60);\r\n var minutes = $filter('frontPad')(m % 60);\r\n return hours + resourceService.get('HOURABBR') + \" \" + minutes + resourceService.get('MINUTEABBR');\r\n }\r\n function isValid(d) {\r\n d = parseDate(d);\r\n return d instanceof Date && isFinite(d);\r\n }\r\n //this function will treat all datetime strings as if they are GMT\r\n //if there is no timezone we add 'Z', if there is any other timezone\r\n //we replace with 'Z'. This allows us to then parse the date and\r\n //then undo the browser's adjustment meaning that we end up with whatever\r\n //we started with, regardless of timezone.\r\n function parseDate(str) {\r\n if (!str) {\r\n return null;\r\n }\r\n if (str instanceof Date) {\r\n return str;\r\n }\r\n if (typeof str === 'string' && /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(str)) {\r\n str += 'T00:00:00Z';\r\n }\r\n //we are expecting an ISO string but we need to check if it ends with a timezone\r\n //if it doesn't we must add Z for GMT because firefox does not assume Z as it should\r\n //according to http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\r\n if (typeof str === 'string' && !/^.+((\\+|-)[0-9]{2}:[0-9]{2}|Z)$/.test(str)) {\r\n str += 'Z';\r\n }\r\n //if the date string contains a timezone string other than 'Z' we need to replace it with 'Z'\r\n if (typeof str === 'string') {\r\n str = str.replace(/^(.+)((\\+|-)[0-9]{2}:[0-9]{2})$/, function (m, p1) {\r\n return p1 + \"Z\";\r\n });\r\n }\r\n //parse the date into a new local timezone date object\r\n var d = new Date(str);\r\n //undo the offset that the browser *may* have applied so that we end up with\r\n //a date time that looks like the original string - yucky\r\n return new Date(d.getTime() + (d.getTimezoneOffset() * 60000));\r\n }\r\n function sameDay(d1, d2) {\r\n if (!d1 || !d2) {\r\n return null;\r\n }\r\n return zeroTime(d1, false).getTime() === zeroTime(d2, false).getTime();\r\n }\r\n function sameMonth(d1, d2) {\r\n if (!d1 || !d2) {\r\n return null;\r\n }\r\n return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();\r\n }\r\n function roundedToStartOfHour(date, serialised) {\r\n if (!date) {\r\n return null;\r\n }\r\n date = parseDate(date);\r\n var newDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), 0, 0);\r\n var minutes = date.getMinutes();\r\n if (minutes < 15) {\r\n return _serialiseIfNecessary(newDate, serialised);\r\n }\r\n if (minutes < 45) {\r\n return service.addMinutes(newDate, 30, serialised);\r\n }\r\n return service.addHours(newDate, 1, serialised);\r\n }\r\n function dayDiff(date1, date2) {\r\n if (!date1 || !date2) {\r\n return null;\r\n }\r\n date1 = parseDate(date1);\r\n date2 = parseDate(date2);\r\n var _a = alignDates([date1, date2], true), a = _a[0], b = _a[1];\r\n return Math.abs(Math.floor((a - b) / oneDay));\r\n }\r\n function thisWeek() {\r\n var t = today();\r\n var y = t.getFullYear();\r\n var m = t.getMonth();\r\n var d = t.getDate();\r\n var dow = t.getDay();\r\n var startDay = 1; // monday\r\n var startDate = (d - dow) + startDay;\r\n var start = zeroTime(new Date(y, m, startDate));\r\n var end = addDays(start, 6);\r\n return new DateRange(start, end);\r\n }\r\n function nextWeek() {\r\n var dateRange = thisWeek();\r\n return new DateRange(addDays(dateRange.start, 7), addDays(dateRange.end, 7));\r\n }\r\n function thisMonth() {\r\n var d = today();\r\n var y = d.getFullYear();\r\n var m = d.getMonth();\r\n var start = zeroTime(new Date(y, m, 1));\r\n var end = zeroTime(new Date(y, m + 1, 0));\r\n return new DateRange(start, end);\r\n }\r\n function specificMonth(month, year) {\r\n var start = zeroTime(new Date(year, month, 1));\r\n var end = zeroTime(new Date(year, month + 1, 0));\r\n return new DateRange(start, end);\r\n }\r\n function serialiseDate(date) {\r\n date = parseDate(date);\r\n if (isValid(date)) {\r\n return _toUtc(date).toISOString();\r\n }\r\n return null;\r\n }\r\n function _serialiseIfNecessary(d, serialised) {\r\n return (serialised ? serialiseDate : parseDate)(d);\r\n }\r\n function _xDaysInTheFuture(date, days) {\r\n if (!date) {\r\n return null;\r\n }\r\n var t = today();\r\n _a = alignDates([date, t], true), date = _a[0], t = _a[1];\r\n return date.getTime() - t.getTime() >= (oneDay * days);\r\n var _a;\r\n }\r\n // to be used exclusively for dates comparisons && calculations\r\n function alignDates(dates, zeroTime) {\r\n if (zeroTime === void 0) { zeroTime = false; }\r\n return dates.map(_.flowRight(_toUtc, zeroTime ? service.zeroTime : function (d) { return d; }));\r\n }\r\n /*\r\n returns -1 when d1d2,\r\n return 0 when d1=d2\r\n */\r\n function compareDates(d1, d2) {\r\n var _a = alignDates([d1, d2]), a1 = _a[0], a2 = _a[1];\r\n if (a1 < a2) {\r\n return -1;\r\n }\r\n if (a1 > a2) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n function totalMinutes(d1, d2) {\r\n var start = parseDate(d1);\r\n var end = parseDate(d2);\r\n var diffMs = end - start; // milliseconds between start & end\r\n return Math.floor(diffMs / 60000);\r\n }\r\n function getDifferenceInDays(d1, d2) {\r\n if (!d1 || !d2) {\r\n return 0;\r\n }\r\n var startTime = angular.copy(d1).setHours(0, 0, 0, 0);\r\n var endTime = angular.copy(d2).setHours(0, 0, 0, 0);\r\n return Math.floor((endTime - startTime) / (1000 * 60 * 60 * 24));\r\n }\r\n function getDateInterval(date, rangeLength, skipPivot) {\r\n var minimumDate = todayPlus(1, 0, false);\r\n var halfRange = Math.floor(rangeLength / 2);\r\n var initialDate = skipPivot ? date : addDays(date, -halfRange);\r\n var comparison = compareDates(initialDate, minimumDate);\r\n var startingDate = zeroTime(comparison === -1 ? minimumDate : initialDate);\r\n var dates = [];\r\n for (var i = 0, ii = rangeLength; i < ii; i++) {\r\n var d = addDays(startingDate, i).setHours(0, 0, 0, 0);\r\n dates.push(d);\r\n }\r\n return dates;\r\n }\r\n function getNextSaturday(weeks) {\r\n // This function finds your weekend in the future.\r\n var theFuture = todayPlus(weeks * 7);\r\n var howMaynDaysYet = 6 - theFuture.getDay();\r\n return addDays(theFuture, howMaynDaysYet, true);\r\n }\r\n var _Area;\r\n function getAreaInfo() {\r\n if (!_Area) {\r\n //I know $injector is not awesome but I'm trying to limit how much I refactor.\r\n _Area = $injector.get('Area');\r\n }\r\n var area = $route.current && $route.current.$$route && $route.current.$$route.area;\r\n return _Area[area];\r\n }\r\n function checkZonedDateFromat(str) {\r\n // Time-zoned date strings must have a four digit time zone in order to be parsed successfully by new Date()\r\n // valid formats: 'YYYY-MM-DDThh:mm:ss+hhmm' or 'YYYY-MM-DDThh:mm:ss+hh:mm'\r\n // eg: '2016-08-07T15:05:00+0100' or '2016-08-07T15:05:00+01:00'\r\n if (str === null) {\r\n return;\r\n }\r\n var time = str.substring(str.indexOf('T') + 1);\r\n var pos = time.indexOf('+');\r\n if (pos === -1) {\r\n pos = time.indexOf('-');\r\n }\r\n if (time.substring(pos + 1).length === 2) {\r\n // the time zone only specifies hours so we need to add minutes\r\n str += ':00';\r\n }\r\n return (new Date(str)).toISOString();\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var DealsBoxService = /** @class */ (function () {\r\n function DealsBoxService($filter, holidayDeals, dateUtil, hotelFromSession, occupancyService, analytics) {\r\n this.$filter = $filter;\r\n this.holidayDeals = holidayDeals;\r\n this.dateUtil = dateUtil;\r\n this.hotelFromSession = hotelFromSession;\r\n this.occupancyService = occupancyService;\r\n this.analytics = analytics;\r\n this.hotelInfoBackTracked = false;\r\n this.singleEditTrack = {};\r\n }\r\n DealsBoxService.prototype.enrichSelected = function (selected) {\r\n var _this = this;\r\n return this.holidayDeals\r\n .getCurrentFilters()\r\n .then(function (f) {\r\n var boardTypeFilter = f.BoardTypes.map(function (bt) { return parseInt(bt, 10); });\r\n return _.first(_this.holidayDeals.enrichDeals([selected], boardTypeFilter));\r\n });\r\n };\r\n DealsBoxService.prototype.getDealsForCalendar = function (estabId, duration, dates, selectedDate) {\r\n var _this = this;\r\n var boardTypeFilter;\r\n return this.holidayDeals\r\n .getCurrentFilters()\r\n .then(function (f) {\r\n boardTypeFilter = f.BoardTypes.map(function (bt) { return parseInt(bt, 10); });\r\n return _this.holidayDeals.getDealsForHotel(estabId, [duration], dates);\r\n })\r\n .then(function (h) {\r\n return h && h.HolidayDeals\r\n ? _this.holidayDeals.enrichDeals(h.HolidayDeals, boardTypeFilter)\r\n : [];\r\n });\r\n };\r\n DealsBoxService.prototype.getTransfersMap = function (transferTimes) {\r\n if (!transferTimes) {\r\n return;\r\n }\r\n return transferTimes.reduce(function (p, c) {\r\n p[c.Airport] = c.Minutes;\r\n return p;\r\n }, {});\r\n };\r\n DealsBoxService.prototype.getRoomsForDeal = function (estabId, searchId, oldRoom, oldBoardType, persist) {\r\n var _this = this;\r\n var boardTypeFilter;\r\n return this.holidayDeals\r\n .getCurrentFilters()\r\n .then(function (f) {\r\n boardTypeFilter = f.BoardTypes.map(function (bt) { return parseInt(bt, 10); });\r\n return _this.hotelFromSession.getRoomTypes(estabId, searchId, boardTypeFilter);\r\n })\r\n .then(function (r) {\r\n var dealsRooms = {};\r\n dealsRooms.rooms = (r || r.length) ? _this._sortRoomsByPrice(r) : [];\r\n if (r.length) {\r\n dealsRooms.best = _this._pickBestRoom(dealsRooms.rooms, boardTypeFilter, oldRoom, oldBoardType, persist);\r\n }\r\n return dealsRooms;\r\n });\r\n };\r\n DealsBoxService.prototype.updatePriceLabels = function (rooms, selectedRoomId, currentBoardTypes, selectedBt, priceMode) {\r\n var _this = this;\r\n var updatedBoardTypes = currentBoardTypes.map(function (bt) {\r\n var _a = _this._calcDifference(bt.Cost, selectedBt.Cost, priceMode), diff = _a.diff, label = _a.label;\r\n bt.NamePrice = diff === 0\r\n ? bt.BoardDescription\r\n : bt.BoardDescription + \" (\" + (diff < 0 ? '-' : '+') + label + \")\";\r\n return bt;\r\n });\r\n var updatedRooms = rooms.map(function (r) {\r\n var current = _.find(r.BoardOptions, function (bt) { return bt.BoardType === selectedBt.BoardType; });\r\n var boardCost = current ? current.Cost : r.BoardOptions[0].Cost;\r\n var _a = _this._calcDifference(boardCost, selectedBt.Cost, priceMode), diff = _a.diff, label = _a.label;\r\n r.PriceDiffLabel = \"\" + (diff < 0 ? '-' : '+') + label;\r\n r.NamePrice = diff === 0 || r.MasterId === selectedRoomId\r\n ? r.RoomDescription\r\n : r.RoomDescription + \" (\" + r.PriceDiffLabel + \")\";\r\n return r;\r\n });\r\n return { updatedBoardTypes: updatedBoardTypes, updatedRooms: updatedRooms };\r\n };\r\n DealsBoxService.prototype.findTemperature = function (selectedDate, temperatures) {\r\n if (!selectedDate || !temperatures) {\r\n return 0;\r\n }\r\n var weather = _.find(temperatures, function (t) { return t.Month === (selectedDate.getMonth() + 1); });\r\n return weather ? Math.round(weather.Temperature) : 0;\r\n };\r\n DealsBoxService.prototype.getTabCounter = function (entryPoint) {\r\n var tracking = { entryPoint: entryPoint };\r\n return function (tab) {\r\n if (!tab) {\r\n return tracking;\r\n }\r\n tracking[tab] = _.has(tracking, tab) ? tracking[tab] + 1 : 1;\r\n return tracking;\r\n };\r\n };\r\n DealsBoxService.prototype.sendTabTracking = function (tabsStat) {\r\n if (!tabsStat || !_.has(tabsStat, 'entryPoint')) {\r\n return;\r\n }\r\n this.analytics.track('mixpanel', 'HolidayDealsHotelDetails', tabsStat);\r\n };\r\n DealsBoxService.prototype.trackHotelInfoBack = function () {\r\n if (!this.hotelInfoBackTracked) {\r\n this.analytics.track('mixpanel', 'HolidayDealsHotelDetailsBack');\r\n this.hotelInfoBackTracked = true;\r\n }\r\n };\r\n DealsBoxService.prototype.trackOpenBox = function (hotel, dealsNumber, dealsMiss) {\r\n this.hotelInfoBackTracked = false;\r\n this.singleEditTrack = {};\r\n this.analytics.track('mixpanel', 'HolidayDealsDetails', {\r\n EstabId: hotel.Id,\r\n EstabName: hotel.Title,\r\n ProvinceId: hotel.ProvinceId,\r\n Province: hotel.Province,\r\n CountryId: hotel.CountryId,\r\n Country: hotel.Country,\r\n StarRating: hotel.StarRating,\r\n DealsOnCalendar: dealsNumber,\r\n DealsMiss: dealsMiss\r\n });\r\n };\r\n DealsBoxService.prototype.trackDateChange = function (newDeal, oldDeal) {\r\n if (!oldDeal || !oldDeal.Price) {\r\n return;\r\n }\r\n var dow = this.$filter('date')(newDeal.HotelDeal.CheckInDate, 'EEE');\r\n var delta = newDeal.Price - oldDeal.Price;\r\n this.analytics.track('mixpanel', 'HolidayDealsChangedDate', {\r\n DayOfWeek: dow,\r\n Delta: delta\r\n });\r\n };\r\n DealsBoxService.prototype.trackDealEdit = function (type) {\r\n if (!this.singleEditTrack[type]) {\r\n this.analytics.track('mixpanel', \"HolidayDealsChanged\" + type);\r\n this.singleEditTrack[type] = true;\r\n }\r\n };\r\n DealsBoxService.prototype._findSelected = function (deals, preselected) {\r\n var cheapest;\r\n for (var i = 0, ii = deals.length; i < ii; i++) {\r\n // pick perfect selection\r\n if (preselected && deals[i].DepartureEpoch === preselected.DepartureEpoch) {\r\n return deals[i];\r\n }\r\n // pick absolute cheapest in the grid\r\n if (!cheapest || deals[i].Price < cheapest.Price) {\r\n cheapest = deals[i];\r\n }\r\n }\r\n return cheapest;\r\n };\r\n DealsBoxService.prototype._sortRoomsByPrice = function (rooms) {\r\n for (var i = 0, ii = rooms.length; i < ii; i++) {\r\n var r = rooms[i];\r\n r.BoardOptions = _.sortBy(r.BoardOptions, function (b) { return b.Cost; });\r\n r.MinCost = r.BoardOptions[0].Cost;\r\n }\r\n return _.sortBy(rooms, function (r) { return r.MinCost; });\r\n };\r\n DealsBoxService.prototype._pickBestRoom = function (rooms, boardTypes, oldRoom, oldBt, persist) {\r\n var pRoom;\r\n var pBoardType;\r\n if (persist) {\r\n var persisted = this._persistSelection(rooms, oldRoom, oldBt);\r\n pRoom = persisted.pRoom;\r\n pBoardType = persisted.pBoardType;\r\n }\r\n if ((!boardTypes || !boardTypes.length) || (pRoom && pBoardType)) {\r\n return { room: pRoom || rooms[0], bt: pBoardType || rooms[0].BoardOptions[0] };\r\n }\r\n var bestSelection;\r\n for (var i = 0, ii = rooms.length; i < ii; i++) {\r\n var room = rooms[i];\r\n for (var j = 0, jj = room.BoardOptions.length; j < jj; j++) {\r\n var bt = room.BoardOptions[j];\r\n if (boardTypes.indexOf(bt.BoardType) > -1) {\r\n if (!bestSelection || bestSelection.bt.Cost > bt.Cost) {\r\n bestSelection = { room: pRoom || room, bt: bt };\r\n }\r\n }\r\n }\r\n }\r\n return bestSelection;\r\n };\r\n DealsBoxService.prototype._persistSelection = function (rooms, oldRoom, oldBt) {\r\n var pRoom = oldRoom\r\n ? _.find(rooms, function (r) { return r.MasterId === oldRoom; })\r\n : undefined;\r\n var pBoardType;\r\n if (pRoom) {\r\n pBoardType = _.find(pRoom.BoardOptions, function (bt) { return bt.BoardType === oldBt; });\r\n }\r\n return { pRoom: pRoom, pBoardType: pBoardType };\r\n };\r\n DealsBoxService.prototype._calcDifference = function (priceToCompare, currentPrice, priceMode) {\r\n var diff = priceToCompare - currentPrice;\r\n if (priceMode === 0) {\r\n diff = diff / this.occupancyService.getNumberOfNonInfantPassengers();\r\n }\r\n var label = this.$filter('roundedCurrency')(Math.abs(diff));\r\n return { diff: diff, label: label };\r\n };\r\n return DealsBoxService;\r\n }());\r\n TR.DealsBoxService = DealsBoxService;\r\n angular\r\n .module('TR')\r\n .service('dealsBoxService', DealsBoxService);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular.module('TR')\r\n .service('destinationService', destinationService);\r\n function destinationService(loggingService, objectTypeService, pageStrand, fieldFilterParser, $http, $location, $q, broker, imageService, supportedProducts, currentUser, preferences, resourceService, $cacheFactory, rootPath, fidParser) {\r\n var url = TRPCONFIG.DestinationServiceClientDomain + \"/api2/destination/v2/\";\r\n var cultureCode = TRPCONFIG.Domain.CultureCode;\r\n var strands = {\r\n hotel: 1,\r\n holiday: 2\r\n };\r\n var tiles = [];\r\n var textUrl = \"\" + TRPCONFIG.DestinationServiceClientDomain + rootPath.getRootPath() + \"website/destinations/text?\";\r\n var tileUrl = TRPCONFIG.DestinationServiceClientDomain + \"/api2/destination/tiles/\";\r\n var tileImageUrl = TRPCONFIG.DestinationImagesClientDomain + \"/api2/destination/images/\";\r\n var websiteUrl = 'website/destinations/';\r\n var airportCache = $cacheFactory.get('airports') || $cacheFactory('airports');\r\n var service = {\r\n country: 0,\r\n estab: 1,\r\n region: 2,\r\n getDetails: getDetails,\r\n getTopChildren: getTopChildren,\r\n getAllChildren: getAllChildren,\r\n fromUrl: fromUrl,\r\n destinationIsEstab: destinationIsEstab,\r\n destinationIsCountry: destinationIsCountry,\r\n destinationThumb: destinationThumb,\r\n getDestinationType: getDestinationType,\r\n getBreadcrumbTitle: getBreadcrumbTitle,\r\n isHoliday: isHoliday,\r\n getText: getText,\r\n getAirport: getAirport,\r\n getAirportDestination: getAirportDestination,\r\n getHeroImage: getHeroImage,\r\n getTiles: getTiles,\r\n //getTileImageUrl : getTileImageUrl,\r\n sortByTitle: sortByTitle,\r\n getCountries: getCountries,\r\n enhanceDestinationFromPreferences: enhanceDestinationFromPreferences,\r\n // isLongHaul,\r\n enhanceLegacyDestination: enhanceLegacyDestination,\r\n setFidFromDestinationFilter: setFidFromDestinationFilter,\r\n getAllCountries: getAllCountries,\r\n getDestinationInfo: getDestinationInfo,\r\n rootPath: rootPath\r\n };\r\n var detailsSearch = {};\r\n function setFidFromDestinationFilter(destination) {\r\n var fid = fidParser.parse();\r\n if (destination.FilterId !== fid) {\r\n $location.replace();\r\n $location.search('fid', null);\r\n if (destination.FilterId > 0) {\r\n if (destination.LegacyType !== 1 && !TRPCONFIG.Domain.UseIdBasedUrls) {\r\n $location.search('fid', destination.FilterId);\r\n }\r\n else if (destination.LegacyType === 1) {\r\n $location.search('fid', destination.FilterId);\r\n }\r\n }\r\n }\r\n return destination;\r\n }\r\n function enhanceLegacyDestination(destination) {\r\n var type = parseInt(destination.LegacyType) || parseInt(destination.Type);\r\n var id = destination.LegacyId || destination.Id;\r\n return $q.when({\r\n PageStrand: destination.PageStrand,\r\n Type: type,\r\n Id: id,\r\n EstablishmentId: type === 1 ? id : 0,\r\n LocationId: type === 2 ? id : 0,\r\n ProvinceId: type === 3 ? id : 0,\r\n CountryId: type === 4 ? id : 0,\r\n PlaceId: type === 5 ? id : 0,\r\n PolygonId: type === 10 ? id : 0,\r\n DestinationId: destination.DestinationId\r\n });\r\n }\r\n function sortByTitle(dests) {\r\n return _.sortBy(dests, 'Title');\r\n }\r\n function getText(dest, errorHandler) {\r\n var fid = fidParser.parse();\r\n errorHandler = errorHandler || { ignoreErrors: true };\r\n errorHandler.cache = true;\r\n return $http.get(textUrl + $.param({\r\n ObjectTypeId: objectTypeService.get(dest),\r\n FilterId: fid || 0,\r\n PageStrandId: dest.PageStrand,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Path: dest.PagePath,\r\n IsPreview: (dest.IsPreview !== undefined && dest.IsPreview === true),\r\n v: TRPCONFIG.CurrentVersion\r\n }), errorHandler).then(function (result) {\r\n result.data.PageTitle = resourceService.getDeferred(result.data.PageTitle)();\r\n return result.data;\r\n });\r\n }\r\n function getTiles(req) {\r\n if (tiles[req.ControlId]) {\r\n return tiles[req.ControlId];\r\n }\r\n tiles[req.ControlId] = $http.get(tileUrl + \"get?\" + $.param({\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n ControlId: req.ControlId\r\n }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n var tiles = result.data;\r\n var baseImageReq = _.constant({\r\n Height: 600,\r\n Width: 600\r\n });\r\n return tiles.map(function (tile) {\r\n var infoTile = _.flowRight(JSON.parse, JSON.parse, JSON.stringify)(tile.TitlePattern);\r\n infoTile.ImageUrl = getTileImageUrl(_.assignIn(baseImageReq(), {\r\n ObjectId: tile.ObjectId,\r\n ObjectTypeId: tile.ObjectTypeId\r\n }));\r\n infoTile.mainUrl = infoTile.ImageUrl;\r\n infoTile.thumbUrl = infoTile.ImageUrl;\r\n return infoTile;\r\n });\r\n });\r\n function getTileImageUrl(req) {\r\n return tileImageUrl + \"gettileimage?\" + $.param(req);\r\n }\r\n return tiles[req.ControlId];\r\n }\r\n function isHoliday(dest) {\r\n return dest && dest.PageStrand != null && dest.PageStrand === strands.holiday;\r\n }\r\n function getDestinationType(dest) {\r\n if (dest == null) {\r\n return service.region;\r\n }\r\n if (destinationIsCountry(dest)) {\r\n return service.country;\r\n }\r\n if (destinationIsEstab(dest)) {\r\n return service.estab;\r\n }\r\n return service.region;\r\n }\r\n function logWarning(apiName, err, params) {\r\n var utm = currentUser.get().UtmId;\r\n loggingService.logWarn(\"Got back err: \" + err.status + \" for utm \" + utm + \" and userAgent \" + navigator.userAgent + \" for api \" + apiName + \" with params \" + params);\r\n }\r\n function fromUrl(from, tm) {\r\n return $http.get(url + \"fromurlv2?\" + $.param({\r\n PagePath: from,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n v: TRPCONFIG.CurrentVersion\r\n }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n if (result.data && tm === '1') {\r\n result.data.PageStrand = 2;\r\n }\r\n if (result.data && result.data.PageStrand > 1 && !supportedProducts.isProductSupported(supportedProducts.products.holidays)) {\r\n result.data.PageStrand = 1;\r\n }\r\n return result.data;\r\n }, function (err) {\r\n logWarning('fromUrl', err, from);\r\n return null;\r\n });\r\n }\r\n function getDestinationInfo(id, type, pagestrand) {\r\n return $http.get(url + \"getdetailsv2?\" + $.param({\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n PageStrand: pagestrand,\r\n Id: id,\r\n Type: type\r\n })).then((function (result) { return result.data; }), (function (err) {\r\n logWarning('getdetailsv2', err);\r\n return null;\r\n }));\r\n }\r\n function destinationIsEstab(dest) {\r\n if (dest == null) {\r\n return false;\r\n }\r\n return dest.EstablishmentId > 0;\r\n }\r\n function destinationIsCountry(dest) {\r\n if (dest == null) {\r\n return false;\r\n }\r\n if (dest.Searchable) {\r\n return false;\r\n }\r\n if (dest.PolygonId > 0 &&\r\n dest.TagIds &&\r\n dest.TagIds.indexOf(1) >= 0) {\r\n return true;\r\n }\r\n return dest.CountryId > 0 &&\r\n dest.ProvinceId === 0 &&\r\n dest.LocationId === 0 &&\r\n dest.PlaceId === 0 &&\r\n dest.PolygonId === 0;\r\n }\r\n function destinationThumb(dest) {\r\n var objectTypeAndId = objectTypeService.getObjectTypeAndId(dest);\r\n return tileImageUrl + \"getfromobject?\" + $.param(_.assignIn({\r\n height: 190\r\n }, objectTypeAndId), { cache: true, ignoreErrors: true });\r\n }\r\n function getTopChildren(n, d) {\r\n var fid = fidParser.parse();\r\n return $http.get(url + \"gettopchildren?\" + $.param({\r\n CountryId: d.CountryId,\r\n ProvinceId: d.ProvinceId,\r\n LocationId: d.LocationId,\r\n PlaceId: d.PlaceId,\r\n EstablishmentId: d.EstablishmentId,\r\n PolygonId: d.PolygonId,\r\n Count: n,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FilterId: fid || 0,\r\n PageStrand: d.PageStrand,\r\n v: TRPCONFIG.CurrentVersion\r\n }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n // Publish topic with data\r\n broker.publish('destTopChildrenRetrieved', result.data);\r\n return result.data;\r\n });\r\n }\r\n function getAllChildren(d) {\r\n return $http.get(url + \"getallchildren?\" + $.param(childRequest(d)), { cache: true, ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function childRequest(d) {\r\n var fid = fidParser.parse();\r\n return _.assignIn(objectTypeService.getObjectTypeAndId(d), {\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FilterId: fid || 0,\r\n PageStrand: d.PageStrand,\r\n v: TRPCONFIG.CurrentVersion\r\n });\r\n }\r\n function getAllCountries() {\r\n return $http.get(url + \"getallchildren?\" + $.param({ CultureCode: TRPCONFIG.Domain.CultureCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n PageStrand: 2,\r\n Type: 12 }), { cache: true, ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getBreadcrumbTitle(dest, comparatorFn) {\r\n // `comparatorFn` example: `(bc) => bc.ObjectTypeId === 1`\r\n var bcTrail = dest && dest.BreadcrumbTrail;\r\n var i = bcTrail && bcTrail.length;\r\n while (i--) {\r\n var bc = dest.BreadcrumbTrail[i];\r\n if (comparatorFn(bc)) {\r\n return bc.Title;\r\n }\r\n }\r\n }\r\n function getCountryOwnId(dest) {\r\n var bcTrail = dest && dest.BreadcrumbTrail;\r\n var i = bcTrail && bcTrail.length;\r\n if (i > 0) {\r\n return dest.BreadcrumbTrail[0].ObjectId;\r\n }\r\n }\r\n function getDetails(dest, fieldsFilter, options) {\r\n if (_.isEmpty(dest)) {\r\n return $q.when();\r\n }\r\n var _isAirport = isAirport(dest);\r\n var get = function (isAirport) { return isAirport ? getDetailsForAirport(dest) : getDetailsForDestination(dest, fieldsFilter, options); };\r\n return $q.when()\r\n .then(function () { return get(_isAirport); })\r\n .then(function (result) { return result || get(!_isAirport); });\r\n }\r\n function getDetailsForDestination(dest, fieldsFilter, options) {\r\n var d = _.assign({}, dest);\r\n options = options || {};\r\n if (!d.Type) {\r\n angular.extend(d, objectTypeService.getObjectTypeAndId(d));\r\n }\r\n // eslint-disable-next-line\r\n if (d.Type == 1 && d.Id && !d.EstablishmentId) {\r\n d.EstablishmentId = d.Id;\r\n }\r\n var ps = options.pageStrandOverride || pageStrand.fromRoute(d);\r\n var fid = fidParser.parse();\r\n var params = $.param({\r\n Type: d.Type,\r\n Id: d.Id,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n IncludeBreadcrumb: true,\r\n PageStrand: ps,\r\n v: TRPCONFIG.CurrentVersion,\r\n domainId: TRPCONFIG.Domain.DomainId,\r\n auth: currentUser.get().HardSignedIn,\r\n filterId: fid || 0\r\n });\r\n var filter = fieldFilterParser.parse(fieldsFilter);\r\n if (filter != null) {\r\n params += \"&\" + filter;\r\n }\r\n var key = websiteUrl + \"getdetails?\" + params;\r\n if (!_.isUndefined(detailsSearch[key])) {\r\n return detailsSearch[key];\r\n }\r\n detailsSearch[key] = $http.get(key, { cache: true, ignoreErrors: true }).then(function (result) {\r\n if (result.data == null) {\r\n return null;\r\n }\r\n d.HolidayEnabled = result.data.HolidayEnabled;\r\n d.Searchable = result.data.Searchable;\r\n d.BreadcrumbTrail = result.data.BreadcrumbTrail;\r\n d.Title = result.data.Title;\r\n // Last non-hotel breadcrumb text\r\n d.SummaryTitle = getBreadcrumbTitle(d, function (bc) { return bc.ObjectTypeId !== strands.hotel; }) || d.Title;\r\n // Hotel name, or `SummaryTitle`\r\n d.ShortTitle = getBreadcrumbTitle(d, function (bc) { return bc.ObjectTypeId === strands.hotel; }) || d.SummaryTitle;\r\n d.CountryOwnId = getCountryOwnId(d) || 0;\r\n d.DestinationAirports = result.data.DestinationAirports;\r\n d.AirportCount = result.data.AirportCount;\r\n d.HotelCount = result.data.HotelCount;\r\n d.Longitude = result.data.Longitude;\r\n d.Latitude = result.data.Latitude;\r\n d.ZoomLevel = result.data.ZoomLevel;\r\n d.IsPOI = result.data.IsPOI;\r\n d.PagePath = result.data.PagePath;\r\n d.TagIds = result.data.TagIds;\r\n d.Price = result.data.Price;\r\n d.PromoText = result.data.PromoText;\r\n d.Airports = result.data.Airports;\r\n d.PageStrand = ps;\r\n return d;\r\n }, function (err) {\r\n logWarning('getDetails', err, key);\r\n return null;\r\n });\r\n return detailsSearch[key];\r\n }\r\n function getDetailsForAirport(dest) {\r\n var d = _.assign({}, dest);\r\n var airportKey = $.param(d);\r\n if (!_.isUndefined(detailsSearch[airportKey])) {\r\n return detailsSearch[airportKey];\r\n }\r\n function getAirportCode() {\r\n var airportCode = d.Code && d.Code.split(',')[0];\r\n if (airportCode) {\r\n return $q.when(airportCode);\r\n }\r\n var params = d.PolygonId ? { id: d.PolygonId, type: 10 } : { id: d.Id, type: d.Type };\r\n var url = TRPCONFIG.DestinationServiceClientDomain + \"/api/landingpages/destinations/airports?\" + $.param(params);\r\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function (result) {\r\n var airports = result.data;\r\n if (airports && airports[0]) {\r\n d.Code = _(airports).map(function (a) { return a.Code; }).reduce(function (memo, a) { return memo + \",\" + a; });\r\n return airports[0].Code;\r\n }\r\n }, function (err) {\r\n logWarning('airports', err, url);\r\n return $q.when(airportCode);\r\n });\r\n }\r\n function getDestinationIds(airportCode) {\r\n if (angular.isNumber(d.PolygonId) || !/^[a-zA-Z]{3}$/.test(airportCode)) {\r\n return $q.when();\r\n }\r\n var params = $.param({\r\n airportCode: airportCode\r\n });\r\n var url = TRPCONFIG.DestinationServiceClientDomain + \"/api2/destination/airports/getdestinationservedbyairport?\" + params;\r\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function (result) {\r\n if (result.data == null) {\r\n return null;\r\n }\r\n d.CountryId = result.data.CountryId;\r\n d.ProvinceId = result.data.ProvinceId;\r\n d.LocationId = result.data.LocationId;\r\n d.PlaceId = result.data.PlaceId;\r\n d.EstablishmentId = result.data.EstablishmentId;\r\n d.PolygonId = result.data.PolygonId;\r\n }, function (err) {\r\n logWarning('getdestinationservedbyairport', err, url);\r\n return $q.when();\r\n });\r\n }\r\n return getAirportCode()\r\n .then(function (airportCode) { return getDestinationIds(airportCode); })\r\n .then(function () { return service.enhanceDestinationFromPreferences(d); })\r\n .then(function () {\r\n var code = shorten(d.Code, ',');\r\n if (!d.Title && code) {\r\n return getAirport(code).then(function (airport) {\r\n if (airport) {\r\n d.Title = shorten(airport.Title, '(');\r\n d.ShortTitle = shorten(airport.ShortTitle, '(');\r\n }\r\n });\r\n }\r\n })\r\n .then(function () {\r\n d.Title = d.Title || d.ShortTitle || d.SummaryTitle || d.Code || '';\r\n d.ShortTitle = d.ShortTitle || d.SummaryTitle || shorten(d.Title, ',');\r\n d.SummaryTitle = d.SummaryTitle || d.ShortTitle;\r\n d.HolidayEnabled = true; //Because this is a flight search, all destinations will be near an airport.\r\n d.Searchable = true;\r\n d.AirportCount = d.Code && d.Code.split(',').length;\r\n d.BreadcrumbTrail = [{\r\n Title: d.Title,\r\n //PagePath: '/holidays/gatwick-airport-lgw-west-sussex-united-kingdom.html',\r\n ObjectId: d.PolygonId,\r\n ObjectTypeId: 10\r\n }];\r\n angular.extend(d, objectTypeService.getObjectTypeAndId(d));\r\n return d;\r\n });\r\n }\r\n function isAirport(d) {\r\n var isAirport;\r\n if (d.searchLookupType) {\r\n isAirport = d.searchLookupType === 'flights';\r\n }\r\n else if (d.PageStrand) {\r\n isAirport = false;\r\n }\r\n else if (d.Code) {\r\n isAirport = !angular.isNumber(d.PolygonId) || d.PolygonId > 0;\r\n }\r\n else {\r\n isAirport = false;\r\n }\r\n return isAirport;\r\n }\r\n function shorten(title, separator) {\r\n return (title || '').split(separator)[0];\r\n }\r\n function enhanceDestinationFromPreferences(destination) {\r\n objectTypeService.populateObjectTypeAndId(destination);\r\n return preferences.get('search').then(function (preferences) {\r\n var preferencesDest = preferences && preferences.destination && preferences.destination[0];\r\n if (preferencesDest && preferencesDest.Id && preferencesDest.Id === destination.Id) {\r\n _.forEach(['Title', 'Code', 'ShortTitle', 'SummaryTitle', 'icon', 'searchLookupType', 'AirportCount'], function (key) {\r\n if (typeof preferencesDest[key] !== undefined) {\r\n destination[key] = preferencesDest[key];\r\n }\r\n });\r\n }\r\n return destination;\r\n });\r\n }\r\n function getAirport(airportCode) {\r\n var k = airportCode + \"_\" + TRPCONFIG.Domain.CultureCode;\r\n if (!airportCache.get(k)) {\r\n airportCache.put(k, $http.post('/api2/flights/static/getairport', {\r\n AirportCode: airportCode,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n }, {\r\n ignoreErrors: true\r\n })\r\n .then(function (result) { return result.data.Airport; }, angular.noop));\r\n }\r\n return airportCache.get(k);\r\n }\r\n function getAirportDestination(airportCode) {\r\n var params = {\r\n airportCode: airportCode,\r\n cultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n return $http.get(\"/api2/destination/airports/getairportlocation?\" + $.param(params), { ignoreErrors: true }).then(function (result) {\r\n return result.data;\r\n });\r\n }\r\n function getHeroImage(destination) {\r\n return imageService.getLandingPageImage(destination);\r\n }\r\n function getCountries() {\r\n return $http.get(\"/api2/destination/countries/get?CultureCode=\" + cultureCode, { cache: true, ignoreErrors: true }).then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n // function isLongHaul(destination) {\r\n // return _.includes(destination && destination.TagIds, 12)\r\n // ? $q.when(true)\r\n // : $http.get(`/api/destinations/${destination.Id}/ancestors?${$.param({\r\n // tenantId: TRPCONFIG.Domain.TenantId,\r\n // pointOfSaleId: TRPCONFIG.Domain.PointOfSaleId,\r\n // culture: TRPCONFIG.Domain.CultureCode,\r\n // fields: 'Tags'\r\n // })}`, { cache: true }).then(result =>\r\n // _.chain(result.data)\r\n // .flatMap(ancestor => ancestor.Tags)\r\n // .includes(12)\r\n // .value());\r\n // }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('destinationContent', destinationContent);\r\n function destinationContent($http, pageStrand, objectTypeService, fidParser) {\r\n var url = '/api2/destination/content?';\r\n var service = {\r\n get: get\r\n };\r\n function get(destination) {\r\n var _a = objectTypeService.getObjectTypeAndId(destination), Type = _a.Type, Id = _a.Id;\r\n return $http.get(url + $.param({\r\n Id: Id,\r\n Type: Type,\r\n FilterId: fidParser.parse() || 0,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n ApplicationType: TRPCONFIG.ApplicationType,\r\n TenantId: TRPCONFIG.Domain.TenantId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n PageStrand: pageStrand.fromRoute(destination)\r\n }), { cache: true, ignoreErrors: true }).then(function (res) {\r\n return res.data.Contents;\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var Friend = /** @class */ (function () {\r\n function Friend() {\r\n this.Name = '';\r\n this.Email = '';\r\n }\r\n return Friend;\r\n }());\r\n TR.Friend = Friend;\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .factory('ecommerceService', ecommerceService);\r\n function ecommerceService(tripService, basketStore, attractionService, carHireService, $q, loaderService, $window, cookieService, $http) {\r\n var productType = {\r\n 0: function getHotelInfo(transactionId, hotel) {\r\n if (hotel && hotel.Details) {\r\n var hotelDetails = hotel.Details;\r\n var hotelInfo = {\r\n id: transactionId,\r\n category: 'Accommodation',\r\n name: hotelDetails.EstablishmentId,\r\n price: basketStore.sumCosts(hotel.CostBreakdown),\r\n quantity: 1,\r\n sku: hotelDetails.ProvinceTitle\r\n };\r\n return $q.when([hotelInfo]);\r\n }\r\n return $q.when(null);\r\n },\r\n 1: function getFlightInfo(transactionId, flight) {\r\n if (flight && flight.Details) {\r\n var flightLeg = flight.Details.Itinerary.Legs[0];\r\n var segmentInfo = flightLeg.Segments[0];\r\n var flightInfo = {\r\n id: transactionId,\r\n category: 'Flight',\r\n name: segmentInfo.CarrierName,\r\n price: basketStore.sumCosts(flight.CostBreakdown),\r\n quantity: 1,\r\n sku: segmentInfo.DestinationAirportTitle\r\n };\r\n return $q.when([flightInfo]);\r\n }\r\n return $q.when(null);\r\n },\r\n 2: function getTransferInfo(transactionId, transfer) {\r\n if (transfer && transfer.Details) {\r\n var transferDetails = transfer.Details;\r\n var transferInfo = {\r\n id: transactionId,\r\n category: 'Transfer',\r\n name: transferDetails.TransferId.SupplierId,\r\n price: basketStore.sumCosts(transfer.CostBreakdown),\r\n quantity: 1,\r\n sku: (transferDetails.Itinerary.OutboundLeg || transferDetails.Itinerary.InboundLeg).DeparturePoint\r\n };\r\n return $q.when([transferInfo]);\r\n }\r\n return $q.when(null);\r\n },\r\n 3: function getParkingInfo(transactionId, parking) {\r\n if (parking && parking.Details) {\r\n var parkingDetails = parking.Details;\r\n var parkingInfo = {\r\n id: transactionId,\r\n category: 'Parking',\r\n name: parkingDetails.AirportParkingQuoteId.SupplierId,\r\n price: basketStore.sumCosts(parking.CostBreakdown),\r\n quantity: 1,\r\n sku: parkingDetails.AirportParkingQuoteId.CarParkCode\r\n };\r\n return $q.when([parkingInfo]);\r\n }\r\n return $q.when(null);\r\n },\r\n 4: function getAttractionInfo(transactionId, attraction, flight) {\r\n if (attraction && attraction.Details && flight && flight.Details) {\r\n var flightLeg = flight.Details.Itinerary.Legs[0];\r\n var segmentInfo = flightLeg.Segments[0];\r\n var sku_1 = segmentInfo.DestinationAirportTitle;\r\n var attractionDetails_1 = attraction.Details;\r\n var attractionInfo_1 = {\r\n id: transactionId,\r\n category: 'Attractions',\r\n price: basketStore.sumCosts(attraction.CostBreakdown),\r\n quantity: 1\r\n };\r\n return attractionService.getAttractionQuotesFromSession(attraction.AvailabilitySearchId).then(function (attractions) {\r\n var attractionBreakdown = _.map(attractionDetails_1.AttractionIds, function (element, index) {\r\n var cost = attraction.CostBreakdown[index];\r\n var price = basketStore.sumCosts([cost]);\r\n var res = _.findIndex(attractions, function (a) { return a.AttractionId === element; });\r\n if (res >= 0) {\r\n var attr = attractions[res];\r\n return _.assignIn({}, attractionInfo_1, { name: attr.ShortTitle, sku: sku_1, price: price });\r\n }\r\n return $q.when(null);\r\n });\r\n return $q.when(attractionBreakdown);\r\n });\r\n }\r\n return $q.when(null);\r\n },\r\n 5: function getCarHireInfo(transactionId, carHire) {\r\n if (carHire && carHire.Details) {\r\n var carHireDetails_1 = carHire.Details;\r\n var carHireInfo_1 = {\r\n id: transactionId,\r\n category: 'Car Hire',\r\n price: basketStore.sumCosts(carHire.CostBreakdown),\r\n quantity: 1,\r\n sku: carHireDetails_1.HireDetails.PickUpPoint\r\n };\r\n return carHireService.getCarQuotesFromSession(carHire.AvailabilitySearchId).then(function (carhire) {\r\n var hireProvider = _.filter(carhire, function (elem) { return elem.CarHireId.CarHireCode === carHireDetails_1.CarHireId.CarHireCode; });\r\n carHireInfo_1 = _.assignIn({}, carHireInfo_1, {\r\n name: hireProvider[0].SupplierName\r\n });\r\n return $q.when(carHireInfo_1);\r\n });\r\n }\r\n return $q.when(null);\r\n },\r\n 6: function getMarhabaInfo(transactionId, marhaba) {\r\n if (marhaba && marhaba.CostBreakdown) {\r\n var marhabaInfo = {\r\n id: transactionId,\r\n category: 'Marhaba',\r\n price: basketStore.sumCosts(marhaba.CostBreakdown),\r\n quantity: 1,\r\n name: 'Marhaba',\r\n sku: 'Marhaba'\r\n };\r\n return $q.when(marhabaInfo);\r\n }\r\n return $q.when(null);\r\n },\r\n 7: function getInsuranceInfo(transactionId, insurance) {\r\n if (insurance && insurance.CostBreakdown) {\r\n var insuranceInfo = {\r\n id: transactionId,\r\n category: 'Insurance',\r\n price: basketStore.sumCosts(insurance.CostBreakdown),\r\n quantity: 1,\r\n name: 'Insurance',\r\n sku: 'Insurance'\r\n };\r\n return $q.when(insuranceInfo);\r\n }\r\n return $q.when(null);\r\n }\r\n };\r\n function pushBasket(tripId, baskets, totalCost) {\r\n if (_tagManagerEnabled()) {\r\n return _pushGABasket(tripId, baskets, totalCost);\r\n }\r\n return $q.when();\r\n }\r\n function _pushGABasket(tripId, baskets, totalCost) {\r\n return addTransaction(tripId, \"\" + totalCost, \"\" + 0).then(function (transaction) {\r\n var basketInfo = _.map(_.omit(baskets, 'all'), function (b) {\r\n var entries = _.flatten([b]); // Normalise single entries and arrays\r\n for (var i = 0, len = entries.length; i < len; i++) {\r\n var basket = entries[i];\r\n if (basket == null) {\r\n return $q.when(null);\r\n }\r\n var product = productType[basket.ProductType];\r\n var info = product != null ? product(transaction.transactionId, basket, baskets.f) : null;\r\n if (info == null) {\r\n return $q.when(null);\r\n }\r\n return info\r\n .then(function (result) { return result; })\r\n .catch(function () { return null; });\r\n }\r\n });\r\n return $q.all(basketInfo).then(function (basketResult) {\r\n var output = _.reduce(basketResult, function (memo, elem) {\r\n if (elem) {\r\n return memo.concat(elem);\r\n }\r\n return memo;\r\n }, []);\r\n return tripService.getCurrency(tripId).then(function (currency) {\r\n _.forEach(output, function (item) {\r\n var _a = TRPCONFIG.SelectedRegionalContext ? TRPCONFIG.SelectedRegionalContext : { CountryCode: null, Language: null }, CountryCode = _a.CountryCode, Language = _a.Language;\r\n var newItem = addItem(item.id, \"\" + item.name, \"\" + item.sku, \"\" + item.category, \"\" + item.price, \"\" + item.quantity, \"\" + currency, CountryCode, Language);\r\n transaction.transactionProducts.push(newItem);\r\n });\r\n if (!TRPCONFIG.Domain2.NewTransactionTracking) {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push(transaction);\r\n }\r\n // Create rollup transaction\r\n var transactionRollup = JSON.parse(JSON.stringify(transaction));\r\n transactionRollup.event = 'pushTransactionRollup';\r\n if (transaction.transactionCurrency !== 'AED' && TRPCONFIG.Domain.EnableAnalyticsCurrencyConversion === true) {\r\n updateTransactionAed(transactionRollup);\r\n }\r\n else if (!TRPCONFIG.Domain2.NewTransactionTracking) {\r\n window.dataLayer.push(transactionRollup);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n function updateTransactionAed(t) {\r\n getExchangeRate(t.transactionCurrency, 'AED').then(function (rate) {\r\n t.transactionTotal = calCurrency(t.transactionTotal, rate);\r\n t.transactionCurrency = 'AED';\r\n for (var i = 0; i < t.transactionProducts.length; i++) {\r\n t.transactionProducts[i].currency = 'AED';\r\n t.transactionProducts[i].price = calCurrency(t.transactionProducts[i].price, rate);\r\n }\r\n window.dataLayer.push(t);\r\n });\r\n }\r\n function calCurrency(val, rate) {\r\n var x = parseInt(val);\r\n var convertedTotal = x * rate.data;\r\n return convertedTotal.toFixed(2);\r\n }\r\n function getExchangeRate(from, to) {\r\n return $http.get(\"/api2/fxrates/get?request.currencyFrom=\" + from + \"&request.currencyTo=\" + to + \"&request.futureMonth=0\");\r\n }\r\n function addTransaction(transactionId, transactionTotal, transactionTax, transactionAffiliation) {\r\n transactionAffiliation = transactionAffiliation || TRPCONFIG.Domain.DomainId;\r\n return tripService.getCurrency(transactionId).then(function (transactionCurrency) {\r\n var transaction = {\r\n event: 'pushTransaction',\r\n transactionId: transactionId,\r\n transactionAffiliation: transactionAffiliation,\r\n transactionTotal: transactionTotal,\r\n transactionTax: transactionTax,\r\n transactionCurrency: transactionCurrency,\r\n transactionProducts: []\r\n };\r\n return transaction;\r\n });\r\n }\r\n function addItem(id, name, sku, category, price, quantity, currency, dimension1, dimension2) {\r\n var item = {\r\n id: id,\r\n name: name,\r\n sku: sku,\r\n category: category,\r\n price: price,\r\n quantity: quantity,\r\n currency: currency,\r\n dimension1: dimension1,\r\n dimension2: dimension2\r\n };\r\n return item;\r\n }\r\n var service = {\r\n addTransaction: addTransaction,\r\n addItem: addItem,\r\n pushBasket: pushBasket\r\n };\r\n function _tagManagerEnabled() {\r\n return !!TRPCONFIG.Domain.GoogleTagManagerEnabled;\r\n }\r\n var noop = function () { return $q.when(); };\r\n if (!_tagManagerEnabled()) {\r\n for (var func in service) {\r\n service[func] = noop;\r\n }\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .config(config);\r\n function config($provide, $httpProvider) {\r\n $provide.factory('errInterceptor', errInterceptor);\r\n errInterceptor.$inject = ['$location', '$q', 'commonErrors'];\r\n function errInterceptor($location, $q, commonErrors) {\r\n var _errCallbacksCollection = {};\r\n var googlebot = /googlebot/i.test(navigator.userAgent);\r\n var prerender = /prerender/i.test(navigator.userAgent);\r\n var _counter = 0;\r\n var service = {\r\n addErrCallback: addErrCallback,\r\n responseError: responseError\r\n };\r\n function logError(data) {\r\n if (googlebot || prerender) {\r\n return;\r\n }\r\n var utm = JSON.parse($('body').attr('user')).UtmId;\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/log',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Message: \"Customer ended up on the error page with error: \" + JSON.stringify({\r\n utmId: utm,\r\n userAgent: navigator.userAgent,\r\n status: data.status,\r\n url: data.config.url,\r\n data: data.config.data\r\n }),\r\n LogLevel: 1 // Warning\r\n })\r\n });\r\n }\r\n // Basic error handling\r\n function _defaultError(data) {\r\n if (data.status === -1) {\r\n return;\r\n }\r\n $location.replace();\r\n // $location.path('error');\r\n logError(data);\r\n }\r\n // Retrieves submitted custom callback\r\n function _getCustomCallback(headers) {\r\n var _callbackName = headers['x-callback'] || '';\r\n return _errCallbacksCollection[_callbackName];\r\n }\r\n // Tries to invoke custom callback\r\n function _invokeCustomCallback(data) {\r\n if (!data.config) {\r\n return false;\r\n }\r\n var _errCallback = _getCustomCallback(data.config.headers);\r\n // no custom callback available\r\n if (!_errCallback || data.status === 401) {\r\n return false;\r\n }\r\n // dealing with partial callbacks\r\n if (typeof _errCallback === 'object') {\r\n if (!_errCallback[data.status]) {\r\n return false;\r\n }\r\n _errCallback[data.status](data);\r\n }\r\n else if (typeof _errCallback === 'function') {\r\n // dealing with full callbacks\r\n _errCallback(data);\r\n }\r\n else {\r\n // dealing with weird things\r\n return false;\r\n }\r\n return true;\r\n }\r\n function addErrCallback(cb) {\r\n _errCallbacksCollection[++_counter] = cb;\r\n return _counter;\r\n }\r\n var callbacksHandled = {};\r\n function responseError(data) {\r\n //a hack to make sure that we don't handle the same error twice which can happen with the retry interceptor\r\n if (callbacksHandled[data.config.headers['x-callback']]) {\r\n return $q.reject(data);\r\n }\r\n callbacksHandled[data.config.headers['x-callback']] = true;\r\n if (!_invokeCustomCallback(data)) {\r\n // common error handling\r\n (commonErrors[data.status] || _defaultError)(data);\r\n }\r\n return $q.reject(data);\r\n }\r\n return service;\r\n }\r\n if ($httpProvider.interceptors.indexOf('errInterceptor') < 0) {\r\n $httpProvider.interceptors.unshift('errInterceptor');\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .factory('$exceptionHandler', $exceptionHandler);\r\n function $exceptionHandler(broker, $log, $window, currentUser) {\r\n var ie9 = /msie 9.0/i.test(navigator.userAgent);\r\n var success = function () {\r\n // do nothing\r\n };\r\n var skipErrorsLogging = false;\r\n var digestErrors = 0;\r\n var errorQueue = [];\r\n $window.addEventListener('beforeunload', function () {\r\n skipErrorsLogging = true;\r\n });\r\n function error(err, type, msg) {\r\n errorQueue = []; //clear the queue if there is a problem - we don't want to kill the client\r\n $log.warn('Error logging failed');\r\n $log.log(msg || err);\r\n }\r\n (function tick() {\r\n if (errorQueue.length !== 0) {\r\n //de-dupe into a dictionary\r\n var errorDict_1 = {};\r\n var deduped_1 = [];\r\n errorQueue.forEach(function (err) {\r\n if (errorDict_1[err.errorMessage] == null) {\r\n err.count = 0;\r\n errorDict_1[err.errorMessage] = err;\r\n }\r\n errorDict_1[err.errorMessage].count += 1;\r\n });\r\n //convert back to an array\r\n Object.keys(errorDict_1).forEach(function (msg) {\r\n deduped_1.push(errorDict_1[msg]);\r\n });\r\n try {\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/logbatch',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Messages: deduped_1.map(function (err) { return JSON.stringify(err); }),\r\n LogLevel: ie9 ? 2 : 1 //warn for ie9, otherwise error\r\n }),\r\n success: success,\r\n error: error\r\n });\r\n errorQueue = [];\r\n }\r\n catch (loggingError) {\r\n error(loggingError);\r\n }\r\n }\r\n setTimeout(tick, 2000);\r\n })();\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var exception = args[0];\r\n var cause = args[1];\r\n $log.error.apply($log, args);\r\n broker.publish('unblock');\r\n if (TRPCONFIG.IsBot) {\r\n return;\r\n }\r\n try {\r\n var stackTrace = printStackTrace({ e: exception });\r\n var errorMessage = exception.toString();\r\n var user = currentUser.get();\r\n user = user == null ? 'user is unexpectedly null' : (user.SignedIn ? { Email: user.Email, UtmId: user.UtmId } : user);\r\n if (skipErrorsLogging) {\r\n return;\r\n }\r\n //note that we can't use $http or $location here because it causes a circular dependency which is a bit annoying\r\n if (errorMessage.indexOf('$rootScope:infdig') >= 0 ||\r\n errorMessage.indexOf('$rootScope:inprog') >= 0) {\r\n digestErrors += 1;\r\n }\r\n if (digestErrors > 5) {\r\n errorMessage = 'Digest loop panic detected';\r\n skipErrorsLogging = true;\r\n success = function () {\r\n $window.location.href = '/';\r\n };\r\n }\r\n errorQueue.push({\r\n Message: {\r\n userAgent: navigator.userAgent,\r\n errorUrl: $window.location.href,\r\n errorMessage: errorMessage,\r\n stackTrace: stackTrace,\r\n cause: (cause || ''),\r\n user: user\r\n },\r\n LogLevel: ie9 ? 2 : 1 //warn for ie9, otherwise error\r\n });\r\n }\r\n catch (loggingError) {\r\n $log.warn('Error logging failed');\r\n $log.log(loggingError);\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('FilterIdUtils', FilterIdUtils);\r\n function FilterIdUtils($http, $location, currentDestination, pageStrand) {\r\n var url = '/api2/destination/filters/';\r\n var service = {\r\n estabGroupFilterAvailable: estabGroupFilterAvailable,\r\n createEstabGroupOptions: createEstabGroupOptions,\r\n lookupFid: lookupFid,\r\n sanitiseFidFilters: sanitiseFidFilters,\r\n updateEstabGroupProperties: updateEstabGroupProperties,\r\n getFilters: getFilters\r\n };\r\n var _filterData;\r\n var fidSettings = {\r\n ignorable: ['EstabGroupIds', 'EstabGroupIds', 'EstabGroupName', 'EstablishmentName', 'FilterByEstabGroup'],\r\n propertyMap: {\r\n BoardTypes: 'HotelsByBoardType',\r\n FacilityCodes: 'MergedHotelsByFacility',\r\n PriceRange: 'PriceRange',\r\n HolidayPriceRange: 'HolidayPriceRange',\r\n RatingRange: 'RatingRange',\r\n PropertyTypes: 'HotelsByPropertyType',\r\n Stars: 'HotelsByStar'\r\n }\r\n };\r\n function _groupFilterAvailable(filter) {\r\n return filter != null && filter.EstabGroupName != null && filter.EstabGroupName !== '';\r\n }\r\n function lookupFid(fid) {\r\n return currentDestination\r\n .getCurrentDestination()\r\n .then(function (dest) { return getFilters(fid, pageStrand.fromRoute(dest)); });\r\n }\r\n function getFilters(fid, pageStrandId) {\r\n var params = {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FilterId: parseInt(fid),\r\n PageStrandId: pageStrandId\r\n };\r\n var opt = {\r\n cache: true,\r\n customErrCallback: {\r\n 404: function () { return true; }\r\n }\r\n };\r\n return $http.get(url + \"get?\" + jQuery.param(params), opt)\r\n .then(function (res) {\r\n var filters = _.pickBy(res.data, function (v) { return v !== null; });\r\n // renaming keys\r\n if (filters.BoardTypeCode) {\r\n filters.BoardTypes = filters.BoardTypeCode;\r\n }\r\n if (filters.PropertyType) {\r\n filters.PropertyTypes = filters.PropertyType;\r\n }\r\n // filter by estab group\r\n filters.FilterByEstabGroup = filters.EstabGroupIds &&\r\n filters.EstabGroupIds.length > 0 &&\r\n filters.EstabGroupName != null;\r\n _filterData = filters;\r\n return filters;\r\n }, function () { return null; });\r\n }\r\n //this needs to work off the original definition of the fidFilter, *not* the current\r\n //filter as it is at the moment because the current filter can have the estabgroupIds\r\n //removed by unchecking the checkbox whereupon it all goes wrong.\r\n function createEstabGroupOptions(groupAggregates) {\r\n if (_groupFilterAvailable(_filterData) && groupAggregates) {\r\n var hotelCount = 0;\r\n for (var i = 0; i < _filterData.EstabGroupIds.length; i++) {\r\n var group = groupAggregates[_filterData.EstabGroupIds[i]];\r\n if (_.isObject(group)) {\r\n hotelCount = group.Count || 0;\r\n }\r\n else {\r\n hotelCount += group || 0;\r\n }\r\n }\r\n return [{\r\n title: _filterData.EstabGroupName,\r\n count: hotelCount\r\n }];\r\n }\r\n return null;\r\n }\r\n function estabGroupFilterAvailable(filter) {\r\n return _groupFilterAvailable(filter);\r\n }\r\n function updateEstabGroupProperties(filter) {\r\n //we need to correctly set the estab group ids property based on the bool FilterByEstabGroup\r\n //and ensure the groupname is always set\r\n if (!filter.EstabGroupName && _filterData && _filterData.EstabGroupName) {\r\n filter.EstabGroupName = _filterData.EstabGroupName;\r\n }\r\n //1. if it is true don't remove the groupIds (might have to add ids in)\r\n //2. otherwise clear it\r\n if (filter.FilterByEstabGroup === true) {\r\n if (filter.EstabGroupIds.length === 0 && _filterData) {\r\n filter.EstabGroupIds = angular.copy(_filterData.EstabGroupIds);\r\n }\r\n }\r\n else {\r\n filter.EstabGroupIds = [];\r\n }\r\n }\r\n function sanitiseFidFilters(f, agg, defaultFilterCriteria) {\r\n var propertyMap = fidSettings.propertyMap;\r\n function relevantFilters(f) {\r\n f = _.omit(f, fidSettings.ignorable);\r\n return _.omitBy(f, function (p, key) { return !p || _.isArray(p) && !p.length || _.isEmpty(agg[propertyMap[key]]); });\r\n }\r\n function arrayTypeFilter(key) {\r\n return function (x) { return _.isObject(agg[propertyMap[key]][x]) ? !_.isEmpty(agg[propertyMap[key]][x])\r\n : agg[propertyMap[key]][x] != null; };\r\n }\r\n function objectFilter(filterValue, key) {\r\n if (agg[propertyMap[key]].Min > filterValue.Min) {\r\n filterValue.Min = agg[propertyMap[key]].Min;\r\n }\r\n if (agg[propertyMap[key]].Max < filterValue.Max) {\r\n filterValue.Max = agg[propertyMap[key]].Max;\r\n }\r\n return filterValue;\r\n }\r\n function compareFiltersWithAggregates(filterValue, key) {\r\n return _.isArray(filterValue) ? filterValue.filter(arrayTypeFilter(key))\r\n : _.isObject(filterValue) && filterValue.Min != null && filterValue.Max ? objectFilter(filterValue, key)\r\n : filterValue;\r\n }\r\n function filteredCriteria() {\r\n return _.mapValues(relevantFilters(f), compareFiltersWithAggregates);\r\n }\r\n var filteredFilter = angular.extend(defaultFilterCriteria, filteredCriteria());\r\n return angular.equals(filteredFilter, f) ? false : filteredFilter;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var Filtering = /** @class */ (function () {\r\n function Filtering($location, $q, FilterIdUtils, fidParser) {\r\n this.$location = $location;\r\n this.$q = $q;\r\n this.FilterIdUtils = FilterIdUtils;\r\n this.fidParser = fidParser;\r\n this.transform = {\r\n Stars: { s: this._serializeArray, d: this._deserializeArray },\r\n BoardTypes: { s: this._serializeArray, d: this._deserializeArray },\r\n ChildDestinations: { s: this._serializeArray, d: this._deserializeArray },\r\n FacilityCodes: { s: this._serializeArray, d: this._deserializeArray },\r\n PropertyTypes: { s: this._serializeArray, d: this._deserializeArray },\r\n RatingRange: { s: this._serialiseRange, d: this._deserialiseRange },\r\n PriceRange: { s: this._serialiseRange, d: this._deserialiseRange },\r\n HolidayPriceRange: { s: this._serialiseRange, d: this._deserialiseRange }\r\n };\r\n this.boardTypes = {\r\n 1: 'ROOMONLY',\r\n 2: 'BEDANDBREAKFAST',\r\n 3: 'HALFBOARD',\r\n 4: 'FULLBOARD',\r\n 5: 'ALLINCLUSIVE',\r\n 6: 'SELFCATERING'\r\n };\r\n }\r\n Filtering.prototype.getFilters = function (defaultFilters, pageStrand) {\r\n var _this = this;\r\n if (defaultFilters === void 0) { defaultFilters = {}; }\r\n var params = this.$location.search();\r\n var fid = this.fidParser.parse();\r\n return fid ?\r\n this.FilterIdUtils.getFilters(fid, pageStrand)\r\n .then(function (f) { return _this._mergeFromFid(defaultFilters, f); }) :\r\n this.$q.when(this._mergeFromParams(defaultFilters, params));\r\n };\r\n Filtering.prototype.deserialiseFilters = function (rawFilters) {\r\n var filters = {};\r\n for (var filter in rawFilters) {\r\n filters[filter] = this.transform[filter].d(rawFilters[filter]);\r\n }\r\n return filters;\r\n };\r\n Filtering.prototype.serialiseFilters = function (filterObj) {\r\n var updated = false;\r\n var paramValues = this.$location.search();\r\n for (var filter in filterObj) {\r\n // have to convert to null as non existant parameters are deleted by null value in\r\n // $location.search\r\n var paramValue = paramValues[filter] || null;\r\n var newParamValue = this.transform[filter].s(filterObj[filter]);\r\n if (paramValue !== newParamValue) {\r\n updated = true;\r\n this.$location.search(filter, newParamValue);\r\n }\r\n }\r\n return updated;\r\n };\r\n Filtering.prototype.getBoardTypeName = function (bt) {\r\n if (!bt) {\r\n return '';\r\n }\r\n return this.boardTypes[bt];\r\n };\r\n Filtering.prototype._mergeFromParams = function (defaultFilters, params) {\r\n var filters = {};\r\n for (var filter in defaultFilters) {\r\n var f = params[filter]\r\n ? this.transform[filter].d(params[filter])\r\n : defaultFilters[filter];\r\n filters[filter] = f;\r\n }\r\n return filters;\r\n };\r\n Filtering.prototype._mergeFromFid = function (defaultFilters, fidFilters) {\r\n var filters = {};\r\n for (var filter in defaultFilters) {\r\n var f = fidFilters && fidFilters[filter]\r\n ? fidFilters[filter]\r\n : defaultFilters[filter];\r\n filters[filter] = f;\r\n }\r\n return filters;\r\n };\r\n Filtering.prototype._deserializeArray = function (str) {\r\n return str.split(',');\r\n };\r\n Filtering.prototype._serializeArray = function (arr) {\r\n if (!arr.length) {\r\n return null;\r\n }\r\n return arr.join(',');\r\n };\r\n Filtering.prototype._deserialiseRange = function (str) {\r\n var rating = str.split(',');\r\n return { Min: parseFloat(rating[0] || '0'), Max: parseFloat(rating[1] || '0') };\r\n };\r\n Filtering.prototype._serialiseRange = function (range) {\r\n if (!range) {\r\n return null;\r\n }\r\n return range.Min + \",\" + range.Max;\r\n };\r\n return Filtering;\r\n }());\r\n TR.Filtering = Filtering;\r\n angular\r\n .module('TR')\r\n .service('filtering', Filtering);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('flightSearch', flightSearch);\r\n function flightSearch(preferences, unadjustedDateFilter, sortCriteria, $http, dateUtil, analytics, occupancyService, flightSearchValidator, baggageService, flightDetail, searchUnitService, FilterUtils, arrayUtil, $q, broker, cancellerService, tripService, currentDestination, $routeParams, $window, $rootScope) {\r\n var url = '/api2/flights/availability/';\r\n var webUrl = 'website/flights/';\r\n var staticUrl = '/api2/flights/static';\r\n var results;\r\n var inProgress;\r\n var filterCanceller;\r\n var filterDefer = $q.defer();\r\n var sortCriteriaDef = sortCriteria.getFlightCriteria();\r\n var filterUtil = new FilterUtils(_defaultFilterCriteria());\r\n var req = {\r\n Paging: {\r\n PageIndex: 0,\r\n PageSize: 10\r\n },\r\n OneWayOnly: false,\r\n NumberOfLeadBags: 0,\r\n WaitForResults: true\r\n };\r\n // Stop when clicking the back/forward buttons, the filters need to be cleared\r\n // because the next page might have completely different search results.\r\n $($window).on('popstate', function () {\r\n if (req.AvailabilitySearchId) {\r\n resetFilters();\r\n }\r\n });\r\n preferences.getFlightSortOrder(true).then(function (so) {\r\n req.SortCriterion = so;\r\n });\r\n var service = {\r\n clearSearchResults: clearSearchResults,\r\n filter: filter,\r\n filterSet: filterSet,\r\n getAirportTitles: getAirportTitles,\r\n getAvailabilityRequest: getAvailabilityRequest,\r\n getFilter: getFilter,\r\n getFilterLazy: getFilterLazy,\r\n getFlightsForDeals: getFlightsForDeals,\r\n getFlightInfo: getFlightInfo,\r\n getBaggageAllowanceTotalKg: getBaggageAllowanceTotalKg,\r\n getBaggagePieces: getBaggagePieces,\r\n getBaggageAllowanceKgPerBag: getBaggageAllowanceKgPerBag,\r\n getOccupancySummary: getOccupancySummary,\r\n getRouteSummary: getRouteSummary,\r\n getSearchResults: getSearchResults,\r\n getSearchSummary: getSearchSummary,\r\n getSortCriteria: getSortCriteria,\r\n getSortCriterionDescription: getSortCriterionDescription,\r\n getUrl: getUrl,\r\n rehydrateMultiDestHolidayFlight: rehydrateMultiDestHolidayFlight,\r\n setBags: setBags,\r\n modifyBags: modifyBags,\r\n nextPage: nextPage,\r\n pageSize: pageSize,\r\n rangeFilterSet: rangeFilterSet,\r\n removeArrayFilter: removeArrayFilter,\r\n resetArrayFilter: resetArrayFilter,\r\n resetBooleanFilter: resetBooleanFilter,\r\n resetFilters: resetFilters,\r\n resetPageIndex: resetPageIndex,\r\n resetRangeFilter: resetRangeFilter,\r\n search: search,\r\n setCabin: setCabin,\r\n showFlightDetailsModal: showFlightDetailsModal,\r\n showCancellationsDetailsModal: showCancellationsDetailsModal,\r\n sort: sort,\r\n validateSearchCriteria: validateSearchCriteria,\r\n trackFlightClick: trackFlightClick\r\n };\r\n function resetPageIndex() {\r\n req.Paging.PageIndex = 0;\r\n if (results) {\r\n results.CombinedDates.AvailableFlights = results.CombinedDates.AvailableFlights.slice(0, req.Paging.PageSize);\r\n }\r\n }\r\n function _emptyFilterCriteria() {\r\n return {\r\n DepartureDates: [],\r\n DepartureAirport: [],\r\n Airline: [],\r\n Stop: [],\r\n PriceRange: null,\r\n OutboundTakeOffRange: null,\r\n ReturnTakeOffRange: null,\r\n HideOpenJaw: false\r\n };\r\n }\r\n function _defaultFilterCriteria() {\r\n var newFilter = _emptyFilterCriteria();\r\n if (_.get(req, 'FilterCriteria.DepartureDates.length') > 0) {\r\n newFilter.DepartureDates = req.FilterCriteria.DepartureDates.slice(); //copy values over\r\n }\r\n return newFilter;\r\n }\r\n function _getFilterCriteriaSet() {\r\n //when filtering we should only pass the items a user has set, but we also want to\r\n //take care to not modify the actual filter object, so return a modified\r\n //copy of the filter\r\n var filterCopy = angular.copy(getFilter());\r\n if (results != null) {\r\n filterUtil.setToNullIfMatches(filterCopy, 'PriceRange', results.CombinedDates.UnfilteredAggregates);\r\n filterUtil.setToNullIfMatches(filterCopy, 'OutboundTakeOffRange', results.CombinedDates.UnfilteredAggregates);\r\n filterUtil.setToNullIfMatches(filterCopy, 'ReturnTakeOffRange', results.CombinedDates.UnfilteredAggregates);\r\n }\r\n return filterCopy;\r\n }\r\n function _getUrl(newSearch) {\r\n return newSearch ?\r\n webUrl + \"search\" :\r\n webUrl + \"searchfromsession\";\r\n }\r\n function _resetFlexibleDates(req) {\r\n // If DepartureDates are emty we will get the responce +-3 days using this reqest.\r\n // Here we use only one date from search by default so dates wil not be flexible.\r\n // But if user will change the date using checkbox in departure date fliter we will use dates which was choosen.\r\n if (req.FilterCriteria.DepartureDates === undefined || req.FilterCriteria.DepartureDates.length === 0) {\r\n req.FilterCriteria.DepartureDates = [unadjustedDateFilter(searchUnitService.startDate(), 'yyyy-MM-dd')];\r\n }\r\n else if (req.FilterCriteria.DepartureDates.length === 1) {\r\n req.FilterCriteria.DepartureDates = getFilter().DepartureDates;\r\n }\r\n return req;\r\n }\r\n function showCancellationsDetailsModal() {\r\n broker.publish('showModalCancellationsBasketDetails');\r\n }\r\n function getFlightInfo(flightData) {\r\n var flight = flightData || JSON.parse(sessionStorage.getItem('storeSelectedFlight'));\r\n if (flight) {\r\n var legs = flight.Legs;\r\n var airportCodes = [];\r\n var journeyType = 'Direct';\r\n var stopText = 'Stop';\r\n if (legs && legs.length === 2) {\r\n for (var i = 0; i < legs.length; i++) {\r\n var segments = legs[i].Segments;\r\n var segmentCount = segments.length - 1;\r\n if (segments.length > 1) {\r\n if (segmentCount > 1) {\r\n stopText = 'Stops';\r\n }\r\n journeyType = segmentCount + \" \" + stopText;\r\n }\r\n airportCodes.push(legs[i].DepartureAirport.Code);\r\n if (airportCodes.length > 1) {\r\n var text = airportCodes[0] + \" - \" + airportCodes[1] + \" (\" + journeyType + \")\";\r\n return text;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n function getBaggageAllowanceTotalKg(flightData) {\r\n return flightData.Legs[0].BaggageAllowanceKgPerBag;\r\n }\r\n function getBaggagePieces(flightData) {\r\n return flightData.Legs[0].Segments[0].BaggagePieces;\r\n }\r\n function getBaggageAllowanceKgPerBag(flightData) {\r\n return flightData.Legs[0].Segments[0].BaggageAllowanceKgPerBag;\r\n }\r\n function showFlightDetailsModal(isHotelFirstJourney) {\r\n var passengers = occupancyService.getTotalPeopleCounts();\r\n var config = {\r\n flight: JSON.parse(sessionStorage.getItem('storeSelectedFlight')),\r\n passengers: passengers,\r\n customiseMessage: isHotelFirstJourney,\r\n };\r\n broker.publish('showModalFlightDetails', config);\r\n }\r\n function getFlightsForDeals(id, checkIn, checkOut, destAirports, depAirports) {\r\n var api = url + \"getflightsfordeal\";\r\n var req = {\r\n AvailabilitySearchId: id,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CheckInDate: dateUtil.serialiseDate(checkIn),\r\n CheckOutDate: dateUtil.serialiseDate(checkOut),\r\n DepartureAirports: depAirports,\r\n DestinationAirports: destAirports,\r\n FlightsCount: 3\r\n };\r\n return $http.post(api, req)\r\n .then(function (res) {\r\n if (!res.data || !res.data.Flights) {\r\n return [];\r\n }\r\n return res.data.Flights;\r\n });\r\n }\r\n function getAirportTitles(codes) {\r\n var params = {\r\n AirportCodes: codes,\r\n CultureCode: TRPCONFIG.Domain.CultureCode\r\n };\r\n var url = staticUrl + \"/gettitles?\" + jQuery.param(params);\r\n return $http.get(url, { cache: true });\r\n }\r\n function getSortCriteria(oneWay) {\r\n return sortCriteria.getFlightCriteria(oneWay);\r\n }\r\n function getSortCriterionDescription() {\r\n return preferences.getFlightSortOrder().then(function (so) {\r\n var i = arrayUtil.indexOf(sortCriteriaDef, function (c) {\r\n return c.val === so || (angular.isArray(c.val) && c.val.indexOf(so) !== -1);\r\n });\r\n return i >= 0 ? sortCriteriaDef[i].name() : '';\r\n });\r\n }\r\n function getFilter() {\r\n return filterUtil.getFilter();\r\n }\r\n function getFilterLazy() {\r\n return filterDefer.promise;\r\n }\r\n function filterSet(filterName) {\r\n return filterUtil.filterSet(filterName);\r\n }\r\n function _resetPriceRange(results) {\r\n filterUtil.resetRangeFilter(results, results.CombinedDates.UnfilteredAggregates, 'PriceRange', ['Min', 'Max']);\r\n }\r\n function resetFilters(dontApply) {\r\n filterUtil = new FilterUtils(_emptyFilterCriteria());\r\n filterDefer = $q.defer();\r\n if (!dontApply) {\r\n return service.filter();\r\n }\r\n return $q.when();\r\n }\r\n function rangeFilterSet(filterName, range) {\r\n return filterUtil.rangeFilterSet(results, results.CombinedDates.UnfilteredAggregates, filterName, range);\r\n }\r\n function resetRangeFilter(filterName, range) {\r\n filterUtil.resetRangeFilter(results, results.CombinedDates.UnfilteredAggregates, filterName, range);\r\n return service.filter();\r\n }\r\n function removeArrayFilter(filterName, item) {\r\n filterUtil.removeArrayFilter(filterName, item);\r\n return service.filter();\r\n }\r\n function resetBooleanFilter(filterName) {\r\n filterUtil.resetBooleanFilter(filterName);\r\n return service.filter();\r\n }\r\n function resetArrayFilter(filterName) {\r\n filterUtil.resetArrayFilter(filterName);\r\n return service.filter();\r\n }\r\n function getRouteSummary(tripType, tripId) {\r\n return $q.all([\r\n currentDestination.getCurrentDestination(),\r\n tripService.getSelectedDestinationAirport(tripId)\r\n ]).then(function (res) {\r\n var dest = res[0], destAirport = res[1];\r\n var to;\r\n if ((dest == null || tripType === 1) && destAirport) {\r\n to = destAirport.ShortTitle || destAirport.Title;\r\n }\r\n else if (dest) {\r\n to = dest.SummaryTitle;\r\n }\r\n return to;\r\n //return to ? 'Flights to ' + to : 'Flights';\r\n });\r\n }\r\n function getOccupancySummary() {\r\n return occupancyService.getRoomOccupancyString();\r\n }\r\n function getSearchSummary(tripType, tripId) {\r\n // TODO: use formatted resource string\r\n //return getRouteSummary() + ' on ' + getDurationSummary() + ', ' + getOccupancySummary();\r\n return $q.all([\r\n getRouteSummary(tripType, tripId),\r\n tripService.getDurationSummary(searchUnitService.flight, $routeParams.tripId)\r\n ]).then(function (result) { return result[0] + \" on \" + result[1]; });\r\n }\r\n function validateSearchCriteria(isHoliday, oneWayOnly) {\r\n return flightSearchValidator.validate(isHoliday, searchUnitService.getDestination(), searchUnitService.getDestinationAirport(), searchUnitService.getDepartureAirports(), searchUnitService.startDate(searchUnitService.flight), searchUnitService.endDate(searchUnitService.flight), searchUnitService.getOutboundDates(searchUnitService.flight), searchUnitService.getCabin(), occupancyService.getOccupancy(), oneWayOnly);\r\n }\r\n function clearSearchResults() {\r\n filterUtil = new FilterUtils(_defaultFilterCriteria());\r\n filterDefer = $q.defer();\r\n req.Paging.PageIndex = 0;\r\n results = null;\r\n }\r\n function getSearchResults(searchId, tripId, selectedFlightId) {\r\n if (results && searchId === results.AvailabilitySearchId) {\r\n if (selectedFlightId) {\r\n var r = _.cloneDeep(results);\r\n var flights = _.get(r, 'CombinedDates.AvailableFlights');\r\n _.set(r, 'CombinedDates.AvailableFlights', _.filter(flights, function (f) { return f.FlightId !== selectedFlightId; }));\r\n return $q.when(r);\r\n }\r\n return $q.when(results);\r\n }\r\n clearSearchResults();\r\n return service.search({ searchId: searchId, tripId: tripId });\r\n }\r\n function calculatePrice(adults, children) {\r\n var childTaxArr = [];\r\n var infantTaxArr = [];\r\n var adultFareArr = [];\r\n var childFareArr = [];\r\n var infantFareArr = [];\r\n for (var i = 0; i < children.length; i++) {\r\n if (children[i] <= 1) {\r\n infantTaxArr.push(children[i]);\r\n infantFareArr.push(children[i]);\r\n }\r\n else {\r\n childTaxArr.push(children[i]);\r\n if (children[i] >= 12) {\r\n adultFareArr.push(children[i]);\r\n }\r\n else {\r\n childFareArr.push(children[i]);\r\n }\r\n }\r\n }\r\n var adultCount = adults + adultFareArr.length;\r\n var priceQtys = {\r\n AdultFareQuantity: adultCount,\r\n AdultTaxQuantity: adults,\r\n ChildFareQuantity: childFareArr.length,\r\n ChildTaxQuantity: childTaxArr.length,\r\n InfantFareQuantity: infantFareArr.length,\r\n InfantTaxQuantity: infantTaxArr.length,\r\n };\r\n sessionStorage.setItem('priceQtys', JSON.stringify(priceQtys));\r\n }\r\n function search(args) {\r\n if (inProgress != null && !args.newSearch) {\r\n return inProgress;\r\n }\r\n req.AvailabilitySearchId = args.searchId;\r\n req.TripId = args.tripId;\r\n req.CombineDates = true;\r\n if (args.newSearch || args.useSearchUnit || args.isV3HolidayRoute) {\r\n delete req.SelectedFlight;\r\n req.Destination = searchUnitService.getDestination();\r\n req.DestinationAirports = args.newSearch ? searchUnitService.getDestinationAirports() : searchUnitService.getDestinationAirports(req.Destination);\r\n req.SelectedDestinationAirport = searchUnitService.getDestinationAirport();\r\n req.DepartureAirports = searchUnitService.getDepartureAirports();\r\n req.SelectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\r\n req.DepartureDate = searchUnitService.startDate(searchUnitService.flight);\r\n req.ReturnDate = searchUnitService.endDate(searchUnitService.flight);\r\n var occ = occupancyService.reduceOccupancy();\r\n req.Adults = occ.Adults;\r\n req.ChildAges = occ.ChildAges;\r\n req.Paging.PageIndex = 0;\r\n req.OneWayOnly = args.oneWayOnly;\r\n req.FlightOnlySearch = args.flightOnly;\r\n searchUnitService.setOneWayFlightEnabled(args.oneWayOnly);\r\n req.Cabin = searchUnitService.getCabin();\r\n req.PreferredCarrierCodes = args.prefilterAirlines;\r\n req.IsDirectFlight = args.prefilterDirectFlights;\r\n calculatePrice(req.Adults, req.ChildAges);\r\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.ShowAgentOfficeSelector) {\r\n req.OfficeLocationId = $rootScope.agent.CurrentOfficeLocation;\r\n }\r\n if (args && args.postfilterAirlines && args.postfilterAirlines.length) {\r\n getFilter().Airline = args.postfilterAirlines;\r\n }\r\n if (!TRPCONFIG.Domain.FlexibleDatesEnabled || !args.flexibleDates) {\r\n getFilter().DepartureDates = [unadjustedDateFilter(req.DepartureDate, 'yyyy-MM-dd')];\r\n }\r\n else {\r\n getFilter().DepartureDates = [];\r\n }\r\n req.FilterCriteria = _getFilterCriteriaSet();\r\n tripService.recordFlightSearch(args.tripId, req);\r\n }\r\n function get() {\r\n if (!args.newSearch && args.isV3HolidayRoute) {\r\n return;\r\n }\r\n var whitelist = [\r\n /^\\/holidays\\/flights\\/\\w+/,\r\n '/holidays/flightunavailable',\r\n /^\\/flights\\/\\w+/,\r\n /^\\/holidays\\/hotels\\/\\w+/\r\n ];\r\n filterCanceller = cancellerService.add.apply(null, whitelist);\r\n filterCanceller.promise.then(function () {\r\n inProgress = null;\r\n });\r\n var isHotelFirst = JSON.parse(sessionStorage.getItem('PreselectFlight'));\r\n if (isHotelFirst && !TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\r\n _resetFlexibleDates(req);\r\n }\r\n var prunedReq = pruneRequest(req);\r\n return $http.post(_getUrl(args.newSearch), prunedReq, { timeout: filterCanceller.promise })\r\n .then(function (res) {\r\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\r\n getFilter().DepartureDates = res.data.FilterCriteria.DepartureDates;\r\n filterUtil.copyFilterFrom('PriceRange', res.data.CombinedDates.UnfilteredAggregates);\r\n filterUtil.copyFilterFrom('OutboundTakeOffRange', res.data.CombinedDates.UnfilteredAggregates);\r\n filterUtil.copyFilterFrom('ReturnTakeOffRange', res.data.CombinedDates.UnfilteredAggregates);\r\n if (results) {\r\n results.CombinedDates.AvailableFlights = results.CombinedDates.AvailableFlights.concat(res.data.CombinedDates.AvailableFlights);\r\n }\r\n else {\r\n results = res.data;\r\n }\r\n inProgress = null;\r\n filterDefer.resolve(service.getFilter());\r\n if (args.resetPriceRange === true) {\r\n _resetPriceRange(results);\r\n }\r\n broker.publish('flightResultsModified', results);\r\n return results;\r\n });\r\n }\r\n inProgress = $q.all([\r\n args.sortOrder || preferences.getFlightSortOrder(args.newSearch),\r\n tripService.getFlightsRequest(args.tripId)\r\n ])\r\n .then(function (_a) {\r\n var so = _a[0], fr = _a[1];\r\n req.SortCriterion = so;\r\n var selectedFlightId = _.get(fr, 'SelectedFlight.FlightId');\r\n _.set(req, 'FilterCriteria.SelectedFlightId', selectedFlightId);\r\n })\r\n .then(get)\r\n .catch(function () { return inProgress = null; });\r\n return inProgress;\r\n }\r\n function rehydrateMultiDestHolidayFlight(selectedFlight) {\r\n var _a = selectedFlight || {}, DetailsId = _a.DetailsId, FlightId = _a.FlightId;\r\n if (DetailsId && FlightId) {\r\n return flightDetail.rehydrate(DetailsId)\r\n .then(function (details) {\r\n if (details.Itinerary) {\r\n // See holidaySearchCtrl.js\r\n details.Itinerary.FlightId = FlightId;\r\n }\r\n return details;\r\n });\r\n }\r\n return $q.when();\r\n }\r\n function setBags(trip, flight) {\r\n if (flight) {\r\n return baggageService.getBaggageInfo(trip.TripId).then(function (bagInfo) {\r\n flight.Legs.forEach(function (l, i) {\r\n if (l.BagsIncludedCount > 0) {\r\n //this means that the leg already comes with bags (though we may not have known this at the time we selected the flight\r\n l.passengerBagCount = l.BagsIncludedCount;\r\n }\r\n else {\r\n //if the leg does not include baggage, we use the number of bags that the user has currently selected\r\n l.passengerBagCount = bagInfo[i]\r\n ? bagInfo[i].holdBagCount\r\n : bagInfo[0] && bagInfo[0].holdBagCount || 0;\r\n }\r\n });\r\n flight.bags = _.max(flight.Legs.map(function (leg) { return leg.passengerBagCount; }));\r\n });\r\n }\r\n return $q.when();\r\n }\r\n function modifyBags(numberOfBags) {\r\n broker.publish('searchCriteriaModified');\r\n if (results != null) {\r\n _resetPriceRange(results);\r\n }\r\n req.FilterCriteria = _getFilterCriteriaSet();\r\n req.Paging.PageIndex = 0;\r\n req.NumberOfLeadBags = numberOfBags;\r\n results = null;\r\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId, resetPriceRange: true });\r\n }\r\n function sort(criterion) {\r\n broker.publish('searchCriteriaModified');\r\n req.FilterCriteria = _getFilterCriteriaSet();\r\n req.Paging.PageIndex = 0;\r\n results = null;\r\n return preferences.setFlightSortOrder(criterion).then(function () {\r\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId, sortOrder: criterion });\r\n });\r\n }\r\n function filter() {\r\n var filterDeferred = (filterCanceller || $q.defer());\r\n filterDeferred.resolve();\r\n broker.publish('searchCriteriaModified');\r\n req.FilterCriteria = _getFilterCriteriaSet();\r\n req.Paging.PageIndex = 0;\r\n results = null;\r\n return filterDeferred.promise.then(function () {\r\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId });\r\n });\r\n }\r\n function getAvailabilityRequest() {\r\n return req;\r\n }\r\n function pageSize() {\r\n return req.Paging.PageSize;\r\n }\r\n function nextPage() {\r\n req.Paging.PageIndex += 1;\r\n req.FilterCriteria = _getFilterCriteriaSet();\r\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId });\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n function setCabin(cabin) {\r\n req.Cabin = cabin;\r\n }\r\n function trackFlightClick(flight, tripId, boostReason) {\r\n if (boostReason === void 0) { boostReason = null; }\r\n var _flight = _.partial(_.get, flight);\r\n analytics.track('mixpanel', 'FlightListingClick', {\r\n RepeatFlightClicked: _flight('RecentlyViewedIndex') === 1,\r\n InboundCareer: _flight('Legs[0].Segments[0].CarrierName'),\r\n OutboundCareer: _flight('Legs[1].Segments[0].CarrierName')\r\n });\r\n return tripService.getFlightsRequest(tripId).then(function (fRequest) {\r\n var FreeBaggage = _(_flight('Legs')).map(function (leg) { return leg.BagsIncludedCount; }).min() > 0;\r\n var selectionsReq = {\r\n Type: 1,\r\n SearchId: _.get(fRequest, 'AvailabilitySearchId'),\r\n DomainId: _.get(TRPCONFIG, 'Domain.DomainId'),\r\n AdultFare: _flight('LeadAdultPrice'),\r\n AdultTax: _flight('LeadAdultTax'),\r\n CurrencyCode: _flight('CurrencyCode'),\r\n FreeBaggage: FreeBaggage,\r\n SearchResultsIndex: _flight('SearchResultsIndex'),\r\n BoostReason: boostReason,\r\n OutboundDepartureAirport: _flight('Legs[0].DepartureAirport.Code'),\r\n OutboundDepartureDate: _flight('Legs[0].DepartureDate'),\r\n OutboundArrivalAirport: _flight('Legs[0].ArrivalAirport.Code'),\r\n OutboundArrivalDate: _flight('Legs[0].ArrivalDate'),\r\n OutboundSegmentDetails: _.map(_flight('Legs[0].Segments'), mapSegmentForTracking),\r\n InboundDepartureAirport: _flight('Legs[1].DepartureAirport.Code'),\r\n InboundDepartureDate: _flight('Legs[1].DepartureDate'),\r\n InboundArrivalAirport: _flight('Legs[1].ArrivalAirport.Code'),\r\n InboundArrivalDate: _flight('Legs[1].ArrivalDate'),\r\n InboundSegmentDetails: _.map(_flight('Legs[1].Segments'), mapSegmentForTracking)\r\n };\r\n localStorage.setItem('flightsSelections', JSON.stringify(selectionsReq));\r\n return $http.post('/api/useractions/selections', selectionsReq, { ignoreErrors: true });\r\n });\r\n }\r\n function mapSegmentForTracking(s) {\r\n var _s = _.partial(_.get, s);\r\n return {\r\n DepartureAirport: _s('DepartureAirportCode'),\r\n DepartureDate: _s('DepartureDate'),\r\n ArrivalAirport: _s('DestinationAirportCode'),\r\n ArrivalDate: _s('ArrivalDate'),\r\n FlightNumber: _s('FlightNumber'),\r\n CarrierName: _s('CarrierName'),\r\n Cabin: _s('Cabin'),\r\n AdditionalStops: _s('AdditionalStops')\r\n };\r\n }\r\n function pruneRequest(req) {\r\n req = _.pick(req, 'Adults', 'AvailabilitySearchId', 'ChildAges', 'CombineDates', 'CultureCode', 'CurrencyCode', 'DepartureAirports', 'DepartureDate', 'Destination', 'DestinationAirports', 'DomainId', 'ExcludeOpenJaw', 'FilterCriteria', 'FlightOnlySearch', 'IsAnyToAny', 'NumberOfLeadBags', 'OneWayOnly', 'Paging', 'Cabin', 'ReturnDate', 'ReturnFullResults', 'SortCriterion', 'IsSingleDaySearch', 'PreferredCarrierCodes', 'IsDirectFlight', 'OfficeLocationId', 'WaitForResults');\r\n req.Destination = _.pick(req.Destination, 'CountryId', 'ProvinceId', 'LocationId', 'EstablishmentId', 'PolygonId');\r\n req.Paging = _.pick(req.Paging, 'PageIndex', 'PageSize');\r\n req.FilterCriteria = _.pick(req.FilterCriteria, 'DepartureAirport', 'Airline', 'SelectedFlightId', 'Stop', 'OutboundTakeOffRange', 'OutboundLandingRange', 'ReturnTakeOffRange', 'ReturnLandingRange', 'PriceRange', 'HideAlternativeDates', 'HideOpenJaw', 'DepartureDates');\r\n return req;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('flightSearchValidator', flightSearchValidator);\r\n function flightSearchValidator(resourceService, dateUtil, occupancyService) {\r\n var service = {\r\n validate: validate\r\n };\r\n function validate(isHoliday, destination, destinationAirport, departureAirports, departureDate, returnDate, outboundDates, cabin, occupancy, oneWayOnly) {\r\n var errors = [];\r\n if (isHoliday) {\r\n if (_.isEmpty(destination)) {\r\n errors.push(resourceService.get('SELECTDESTINATION'));\r\n }\r\n else {\r\n if (!destination.HolidayEnabled) {\r\n errors.push(String.format(resourceService.get('NOTHOLIDAYENABLED'), destination.Title));\r\n }\r\n if (!destination.Searchable) {\r\n errors.push(String.format(resourceService.get('NONSEARCHABLE'), destination.Title));\r\n }\r\n }\r\n if (cabin < 1) {\r\n errors.push(resourceService.get('SELECTFLIGHTCLASS'));\r\n }\r\n }\r\n else if (_.isEmpty(destinationAirport)) {\r\n errors.push(resourceService.get('SELECTDESTINATIONAIRPORT'));\r\n }\r\n if (departureAirports == null ||\r\n departureAirports.length === 0) {\r\n errors.push(resourceService.get('SELECTDEPARTUREAIRPORT'));\r\n }\r\n var destinationCodes = isHoliday ? destination && destination.DestinationAirports : destinationAirport && destinationAirport.Code;\r\n if (destinationCodes && departureAirports) {\r\n destinationCodes = destinationCodes.split(',');\r\n var destinationAndDepartureAreSame = _.some(destinationCodes, function (dest) { return _.includes(departureAirports, dest); });\r\n if (destinationAndDepartureAreSame) {\r\n errors.push(resourceService.get('DEPARTUREANDDESTINATIONAIRPORTSTHESAME'));\r\n }\r\n }\r\n if (departureDate == null) {\r\n errors.push(resourceService.get('SELECTDEPARTUREDATE'));\r\n }\r\n else {\r\n if (TRPCONFIG.Domain.HolidaysSearchOffsetDate !== 0 && !dateUtil.atLeastOneDayInTheFuture(departureDate)) {\r\n errors.push(resourceService.get('DEPARTUREDATEMUSTBEFUTURE'));\r\n }\r\n if (outboundDates &&\r\n Object.keys(outboundDates).length > 0 &&\r\n outboundDates[dateUtil.format(departureDate, 'yyyy-MM-dd')] === undefined) {\r\n errors.push(resourceService.get('DEPARTUREDATENOTAVAILABLE'));\r\n }\r\n }\r\n if (returnDate == null && !oneWayOnly) {\r\n errors.push(resourceService.get('SELECTRETURNDATE'));\r\n }\r\n else if (returnDate <= departureDate && !oneWayOnly) {\r\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\r\n }\r\n if (occupancyService.moreInfantsThanAdults()) {\r\n errors.push(resourceService.get('TOOMANYINFANTS'));\r\n }\r\n if (occupancyService.getNumberOfNonInfantPassengers() > TRPCONFIG.Domain.MaxPassengers) {\r\n errors.push(String.format(decodeURI(resourceService.get('TOOMANYPASSENGERS')), TRPCONFIG.DesktopUrlRoot + \"/Help/Groupbookings.aspx\", resourceService.get('TELEPHONENUMBER')));\r\n }\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var FlightsFilterService = /** @class */ (function () {\r\n function FlightsFilterService($filter) {\r\n var _this = this;\r\n this.$filter = $filter;\r\n this.sortArray = function (arr, prop) {\r\n var sortBy = '-count';\r\n if (prop === 'FlightsByAirline' && TRPCONFIG.Domain.FlightsByAirlineFilterOrder) {\r\n sortBy = TRPCONFIG.Domain.FlightsByAirlineFilterOrder;\r\n }\r\n if (prop === 'DepartureDates') {\r\n sortBy = 'name';\r\n }\r\n return _this.$filter('orderBy')(arr, sortBy);\r\n };\r\n this.arrayifyAggregates = function (dict, props) {\r\n for (var i = 0; i < props.length; i++) {\r\n var prop = props[i];\r\n if (dict[prop + 'Array']) {\r\n continue;\r\n }\r\n var arr = [];\r\n for (var p in dict[prop]) {\r\n if (dict[prop].hasOwnProperty(p)) {\r\n arr.push({\r\n name: p,\r\n count: dict[prop][p].Count != null ? dict[prop][p].Count : dict[prop][p],\r\n logo: dict[prop][p].Logo,\r\n minimumPrice: dict[prop][p].MinimumPrice\r\n });\r\n }\r\n }\r\n dict[prop + 'Array'] = _this.sortArray(arr, prop);\r\n }\r\n };\r\n this.populateMinimumPrice = function (dict) {\r\n var values = _.values(dict.FlightsByAirline);\r\n dict.minimumPrice = (_.minBy(values, function (x) { return x.MinimumPrice; }) || {}).MinimumPrice;\r\n };\r\n }\r\n return FlightsFilterService;\r\n }());\r\n TR.FlightsFilterService = FlightsFilterService;\r\n angular.module('TR').service('flightsFilterService', FlightsFilterService);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('geo', geo);\r\n function geo($http, $q, autocompleter) {\r\n var service = {\r\n getSearchArea: getSearchArea,\r\n supported: supported,\r\n getNearestAirportTitles: getNearestAirportTitles,\r\n getNearestAirports: getNearestAirports\r\n };\r\n function getSearchArea() {\r\n var d = $q.defer();\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (pos) {\r\n d.resolve({\r\n Latitude: pos.coords.latitude,\r\n Longitude: pos.coords.longitude,\r\n Radius: 10\r\n });\r\n }, function (err) {\r\n //this happens quite a lot but it is almost always because the user does not give permission\r\n //analytics.trackEvent({category : 'failure', action : 'geo', label:'getCurrentPositionFailed'});\r\n //loggingService.logWarn('geo.getCurrentPositionFailed with err: ' + JSON.stringify(err));\r\n d.reject(err);\r\n });\r\n }\r\n else {\r\n //having tracked this for a while, it pretty much never happens.\r\n //analytics.trackEvent({category : 'failure', action : 'geo', label:'geolocationNotSupported'});\r\n d.reject('geo not supported');\r\n }\r\n return d.promise;\r\n }\r\n function supported() {\r\n return navigator.geolocation;\r\n }\r\n function defaultClientLocation() {\r\n return angular.fromJson(TRPCONFIG.Domain.ClientDefaultLocation\r\n || '{ \"CountryCode\": \"GB\", \"Latitude\": 51.4167, \"Longitude\": -0.2833 }');\r\n }\r\n function getLocationFromIpAddress() {\r\n var isPrerender = /prerender/i.test(navigator.userAgent);\r\n if (isPrerender) {\r\n return $q.when([]);\r\n }\r\n var ipAddress = TRPCONFIG.ClientIpAddress;\r\n var url = \"/api2/globalisation/location?\" + $.param({\r\n ipAddress: ipAddress\r\n });\r\n return $http\r\n .get(url, { cache: true, ignoreErrors: true })\r\n .then(function (response) {\r\n var location = response.data;\r\n if (angular.equals(location, { CountryCode: null, Latitude: 0, Longitude: 0 })) {\r\n location = defaultClientLocation();\r\n }\r\n return location;\r\n });\r\n }\r\n function getNearestAirports() {\r\n if (TRPCONFIG.Domain.NearestAirportsStaticList) {\r\n return $q.when(TRPCONFIG.Domain.NearestAirportsStaticList);\r\n }\r\n return getLocationFromIpAddress()\r\n .then(function (location) { return $q.all({\r\n airportValidator: getAirportValidator(),\r\n nearbyAirports: getAirportsNear(location)\r\n }); })\r\n .then(function (_a) {\r\n var airportValidator = _a.airportValidator, nearbyAirports = _a.nearbyAirports;\r\n var filter = function (airports) { return _(airports)\r\n .filter(airportValidator)\r\n .take(6)\r\n .map(function (a) { return ({ Code: a }); })\r\n .value(); };\r\n nearbyAirports = filter(nearbyAirports);\r\n if (nearbyAirports && nearbyAirports.length) {\r\n return nearbyAirports;\r\n }\r\n return getAirportsNear(defaultClientLocation())\r\n .then(function (nearbyAirports) { return filter(nearbyAirports); });\r\n })\r\n .catch(function () { return []; });\r\n }\r\n function getNearestAirportTitles() {\r\n return getLocationFromIpAddress()\r\n .then(function (location) {\r\n var url = \"website/flights/nearestairporttitles?\" + $.param({\r\n cultureCode: TRPCONFIG.Domain.CultureCode,\r\n latitude: location.Latitude,\r\n longitude: location.Longitude\r\n });\r\n return $http\r\n .get(url, { cache: true, ignoreErrors: true })\r\n .then(function (response) { return _.take(response.data, 6); });\r\n });\r\n }\r\n function getAirportsNear(location) {\r\n var params = {\r\n latitude: location.Latitude,\r\n longitude: location.Longitude\r\n };\r\n if (TRPCONFIG.Domain.NearestAirportsMaxDistance) {\r\n params.maxDistance = TRPCONFIG.Domain.NearestAirportsMaxDistance;\r\n }\r\n var url = \"/api2/flights/static/getnearestairports?\" + $.param(params);\r\n return $http\r\n .get(url, { cache: true, ignoreErrors: true })\r\n .then(function (response) { return response.data; });\r\n }\r\n function getAirportValidator() {\r\n if (TRPCONFIG.Domain.UseStaticDepartureDropdown) {\r\n return autocompleter.initialDepartureAirports().then(function (validAirports) {\r\n var validAirportCodes = _.map(validAirports.data, function (va) { return va.Code; });\r\n return function (a) { return _.some(validAirportCodes, function (va) { return va === a; }); };\r\n });\r\n }\r\n return $q.when(function () { return true; });\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var DealsFindParameters = /** @class */ (function () {\r\n function DealsFindParameters() {\r\n }\r\n return DealsFindParameters;\r\n }());\r\n var HolidayDeals = /** @class */ (function () {\r\n function HolidayDeals($http, $location, $filter, $q, dateUtil, resourceService, getPropertyTypeFromResKey, imageService, occupancyService, fieldGroupService, filtering, pageStrand, tripService, hotelService, analytics, flightSearch, geo, preferences) {\r\n this.$http = $http;\r\n this.$location = $location;\r\n this.$filter = $filter;\r\n this.$q = $q;\r\n this.dateUtil = dateUtil;\r\n this.resourceService = resourceService;\r\n this.getPropertyTypeFromResKey = getPropertyTypeFromResKey;\r\n this.imageService = imageService;\r\n this.occupancyService = occupancyService;\r\n this.fieldGroupService = fieldGroupService;\r\n this.filtering = filtering;\r\n this.pageStrand = pageStrand;\r\n this.tripService = tripService;\r\n this.hotelService = hotelService;\r\n this.analytics = analytics;\r\n this.flightSearch = flightSearch;\r\n this.geo = geo;\r\n this.preferences = preferences;\r\n this.API = '/api/holidays/deals';\r\n this.DURATIONS = TRPCONFIG.Domain.HolidayDealsDurations.map(function (d) { return parseInt(d, 10); });\r\n this.runningRequest = this.$q.defer();\r\n }\r\n HolidayDeals.prototype.find = function (_a) {\r\n var _this = this;\r\n var _b = _a.page, page = _b === void 0 ? 0 : _b, _c = _a.sort, sort = _c === void 0 ? 1 : _c, _d = _a.pageSize, pageSize = _d === void 0 ? TRPCONFIG.Domain.HolidayDealsPageSize : _d, destination = _a.destination, saveToUrl = _a.saveToUrl, _e = _a.includeAggregates, includeAggregates = _e === void 0 ? true : _e, _f = _a.discountedPricesOnly, discountedPricesOnly = _f === void 0 ? false : _f, flexibility = _a.flexibility, _g = _a.includeCruises, includeCruises = _g === void 0 ? TRPCONFIG.Domain.HolidayDealsCruisesEnabled : _g;\r\n var findParams = new DealsFindParameters();\r\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(Core.FieldType.Global, Core.FieldType.Titles, Core.FieldType.Url, Core.FieldType.Description, Core.FieldType.Summary, Core.FieldType.HolidayDeals, Core.FieldType.LegacyFacilities, Core.FieldType.Weather, Core.FieldType.Distances, Core.FieldType.Recommendations, Core.FieldType.Airports, Core.FieldType.TransferTimes);\r\n findParams.paging = { Size: pageSize, Index: page };\r\n findParams.sort = sort;\r\n findParams.url = this.API + \"/search\";\r\n findParams.includeCruises = includeCruises;\r\n findParams.destination = destination;\r\n findParams.discountedPricesOnly = discountedPricesOnly;\r\n findParams.flexibility = flexibility;\r\n return this.$q.all({\r\n params: this.getFullParameters(saveToUrl),\r\n filters: this.filtering.getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\r\n })\r\n .then(function (res) { return _this.$q.all({\r\n deals: _this._findDeals(findParams, res.filters, includeAggregates, res.params),\r\n summary: _this.getSearchSummary(res.params),\r\n }); })\r\n .then(function (res) { return ({\r\n Products: _this._enrichProducts(res.deals.data.Hotels, res.deals.req),\r\n Aggregates: res.deals.data.Aggregates,\r\n Paging: {\r\n Size: res.deals.req.Paging.Size,\r\n Index: res.deals.req.Paging.Index,\r\n Total: res.deals.data.Aggregates\r\n ? res.deals.data.Aggregates.FilteredHotelCount\r\n : 0,\r\n UnfilteredTotal: res.deals.data.Aggregates\r\n ? res.deals.data.Aggregates.HotelCount\r\n : 0\r\n },\r\n Info: {\r\n duration: res.deals.req.Duration,\r\n searchSummary: res.summary,\r\n filters: res.deals.filters,\r\n airportsTitles: res.deals.data.AirportTitles\r\n }\r\n }); });\r\n };\r\n HolidayDeals.prototype.getMapCoordinates = function () {\r\n var _this = this;\r\n var findParams = new DealsFindParameters();\r\n var fields = 'Hotels.Id,Hotels.Latitude,Hotels.Longitude,Hotels.DealMinPrice';\r\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(Core.FieldType.Global);\r\n findParams.paging = null;\r\n findParams.sort = 0;\r\n findParams.url = this.API + \"/search?fields=\" + fields;\r\n return this.filtering\r\n .getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\r\n .then(function (filters) { return _this._findDeals(findParams, filters, false); })\r\n .then(function (res) { return res.data.Hotels.filter(function (h) { return (h.Latitude || h.Longitude); }); });\r\n };\r\n HolidayDeals.prototype.getDealsForHotel = function (estabId, durations, dates) {\r\n var _this = this;\r\n var params = this.deserialiseParameters();\r\n var fieldFlags = this.fieldGroupService.getFieldGroup(Core.FieldType.HolidayDeals, Core.FieldType.Airports, Core.FieldType.TransferTimes);\r\n var datesAndDurations = _(dates || [params.startDate])\r\n .map(function (date) { return _this.dateUtil.serialiseDate(date); })\r\n .flatMap(function (date) {\r\n return _.map(durations || [params.duration], function (duration) { return ({ Date: date, Duration: duration }); });\r\n })\r\n .value();\r\n var request = {\r\n Id: estabId,\r\n DatesAndDurations: datesAndDurations,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n Adults: params.occupancy[0].Adults,\r\n ChildAges: params.occupancy[0].ChildAges,\r\n OriginAirports: params.depAir,\r\n FieldFlags: fieldFlags,\r\n BoardTypes: []\r\n };\r\n return this.$http.post(this.API + \"/getdealsforhotel\", request)\r\n .then(function (res) { return res.data; });\r\n };\r\n HolidayDeals.prototype.getDealsFromMap = function (estabId) {\r\n var startDate = this.deserialiseParameters().startDate;\r\n var dates = this.dateUtil.getDateInterval(startDate, 7);\r\n return this.getDealsForHotel(estabId, undefined, dates);\r\n };\r\n HolidayDeals.prototype.getAggregates = function (saveToUrl, presetParams) {\r\n var _this = this;\r\n if (saveToUrl === void 0) { saveToUrl = true; }\r\n if (presetParams === void 0) { presetParams = {}; }\r\n var findParams = new DealsFindParameters();\r\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(Core.FieldType.HolidayDeals);\r\n findParams.paging = { Size: 0, Index: 0 };\r\n findParams.sort = 5;\r\n findParams.url = this.API + \"/search\";\r\n findParams.includeCruises = false;\r\n return this.$q.all([\r\n this.getFullParameters(saveToUrl, presetParams),\r\n this.filtering.getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\r\n ])\r\n .then(function (res) { return ({ params: res[0], filters: _.omit(res[1], 'ChildDestinations') }); })\r\n .then(function (res) { return _this._findDeals(findParams, res.filters, true, res.params); })\r\n .then(function (res) { return res && res.data; });\r\n };\r\n HolidayDeals.prototype.enrichDeals = function (deals, boardTypeFilters) {\r\n var _this = this;\r\n return deals.map(function (d) {\r\n d.HotelDeal.CheckInDate =\r\n _this.dateUtil.parseDate(d.HotelDeal.CheckInDate);\r\n d.HotelDeal.CheckOutDate =\r\n _this.dateUtil.parseDate(d.HotelDeal.CheckOutDate);\r\n d.DepartureEpoch = angular\r\n .copy(d.HotelDeal.CheckInDate)\r\n .setHours(0, 0, 0, 0);\r\n d.Duration = _this.dateUtil.getDifferenceInDays(d.HotelDeal.CheckInDate, d.HotelDeal.CheckOutDate);\r\n var bt;\r\n if (boardTypeFilters && boardTypeFilters.length) {\r\n bt = _.chain(d.HotelDeal.BoardTypeMinPrices)\r\n .filter(function (v) { return boardTypeFilters.indexOf(v.BoardType) > -1; })\r\n .sortBy(function (v) { return v.MinPrice; })\r\n .value()[0];\r\n }\r\n var hotelPrice = bt ? bt.MinPrice : d.HotelDeal.Price;\r\n d.Price = d.FlightsDeal.Price + hotelPrice;\r\n var num = _this.occupancyService.getNumberOfNonInfantPassengers();\r\n d.PricePerPerson = d.Price / num;\r\n return d;\r\n });\r\n };\r\n HolidayDeals.prototype.selectDeal = function (deal, estabId, original, originalTimes) {\r\n var _this = this;\r\n var params = this.deserialiseParameters();\r\n var request = {\r\n AvailabilitySearchId: deal.HotelDeal.AvailabilitySearchId,\r\n EstabId: estabId,\r\n RoomAndBoardIds: [deal.selectedBoardType.Id],\r\n DiscountCode: TRPCONFIG.DiscountCode,\r\n BookingPath: 4\r\n };\r\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\r\n var SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\r\n var Tier = (SkywardsLoginUser && SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\r\n SkywardsLoginUser.data.Contact.Tier : null;\r\n request.LoyaltyInfo = {\r\n SkywardsTier: Tier\r\n };\r\n }\r\n return this.hotelService.getHotelDetails(request)\r\n .then(function (details) {\r\n deal.EstabId = estabId;\r\n deal.HotelDeal.ProductId = details.DetailsId;\r\n return deal;\r\n })\r\n .then(function (deal) { return _this.tripService.getTripIdForHolidayDeal(deal, params.occupancy); })\r\n .then(function (tripId) {\r\n _this._trackDealChanges(original, deal, originalTimes);\r\n return _this.$location.url(\"holidays/options/\" + tripId + \"/\");\r\n });\r\n };\r\n HolidayDeals.prototype.serialiseParameters = function (params, toUrl) {\r\n var getParams = {\r\n depAir: params.airportsCodes ? params.airportsCodes.map(function (a) { return a.Code; }).join('-') : undefined,\r\n startDate: params.startDate ? this.dateUtil.format(params.startDate, 'yyyy-MM-dd') : undefined,\r\n duration: params.duration,\r\n occ: params.occupancy ? this.occupancyService.serialise(params.occupancy) : undefined,\r\n flex: params.flexibility\r\n };\r\n return toUrl ? jQuery.param(getParams) : getParams;\r\n };\r\n HolidayDeals.prototype.deserialiseParameters = function () {\r\n var params = this.$location.search();\r\n return {\r\n depAir: params.depAir ? params.depAir.split('-') : undefined,\r\n startDate: params.startDate\r\n ? this.dateUtil.parseDate(params.startDate)\r\n : undefined,\r\n duration: parseInt(params.duration, 10),\r\n occupancy: params.occ\r\n ? this.occupancyService.parseOccupancyString(params.occ)\r\n : undefined,\r\n flexibility: parseInt(params.flex || '3', 10)\r\n };\r\n };\r\n HolidayDeals.prototype.getFullParameters = function (saveToUrl, presetParams) {\r\n var _this = this;\r\n if (saveToUrl === void 0) { saveToUrl = true; }\r\n if (presetParams === void 0) { presetParams = {}; }\r\n var params = _.merge(this.deserialiseParameters(), presetParams);\r\n var queryString = this.serialiseParameters(presetParams, false);\r\n if (params.startDate && params.depAir && params.occupancy && params.duration) {\r\n return this.$q.when(params);\r\n }\r\n if (!params.startDate) {\r\n params.startDate =\r\n this.dateUtil.getNextSaturday(TRPCONFIG.Domain.HolidayDealsDefaultWeeks);\r\n queryString.startDate = this.dateUtil.format(params.startDate, 'yyyy-MM-dd');\r\n }\r\n if (!params.occupancy) {\r\n params.occupancy = this.occupancyService.parseOccupancyString('A2');\r\n queryString.occ = TRPCONFIG.Domain.HolidayDealsDefaultOccupancy;\r\n }\r\n if (!params.duration) {\r\n params.duration = TRPCONFIG.Domain.HolidayDealsDefaultDuration;\r\n queryString.duration = TRPCONFIG.Domain.HolidayDealsDefaultDuration;\r\n }\r\n var promise = !params.depAir || !params.depAir.length\r\n ? this.preferences\r\n .get('holidayaSsearch')\r\n .then(function (holiday) { return holiday && holiday.airports\r\n ? holiday.airports\r\n : _this.geo\r\n .getNearestAirports()\r\n .then(function (airports) { return airports.map(function (a) { return a.Code; }); }); })\r\n .then(function (airports) {\r\n params.depAir = airports && airports.length > 0\r\n ? airports\r\n : TRPCONFIG.Domain.HolidayDealsDefaultAirports;\r\n queryString.depAir = params.depAir.join('-');\r\n return params;\r\n })\r\n : this.$q.when(params);\r\n return promise.then(function (params) {\r\n if (saveToUrl) {\r\n var search = _this.$location.search();\r\n _.merge(search, queryString, { dealsOnly: 1 });\r\n _this.$location.search(search).replace();\r\n }\r\n return params;\r\n });\r\n };\r\n HolidayDeals.prototype.getDefaultFilters = function () {\r\n return {\r\n Stars: [],\r\n BoardTypes: [],\r\n ChildDestinations: [],\r\n FacilityCodes: [],\r\n PropertyTypes: [],\r\n RatingRange: null,\r\n PriceRange: null\r\n };\r\n };\r\n HolidayDeals.prototype.getCurrentFilters = function () {\r\n return this.filtering\r\n .getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'));\r\n };\r\n HolidayDeals.prototype.getSearchSummary = function (params) {\r\n var _this = this;\r\n params.occupancy = _.first(params.occupancy);\r\n var appDate = this.$filter('date')(params.startDate, 'd MMM yyyy');\r\n var _a = this._getSummaryElements(params), nights = _a.nights, adults = _a.adults, children = _a.children;\r\n var summary = '';\r\n summary += this.resourceService.get('HOLIDAYDEALSHEADER') + \" \";\r\n summary += params.duration + \" \" + nights;\r\n summary += \", \" + appDate + \", \";\r\n summary += params.occupancy.Adults > 0\r\n ? params.occupancy.Adults + \" \" + adults + \" \"\r\n : '';\r\n summary += params.occupancy.ChildAges.length > 0\r\n ? params.occupancy.ChildAges.length + \" \" + children + \" \"\r\n : '';\r\n return this.flightSearch\r\n .getAirportTitles(params.depAir)\r\n .then(function (res) {\r\n var different = _this.resourceService\r\n .get('DIFFERENTAIRPORTS')\r\n .replace('{0}', res.data.length);\r\n var fromString = _this.resourceService.get('FROM');\r\n return res.data.length === 1\r\n ? summary + \" \" + fromString + \" \" + res.data\r\n : summary + \" \" + different;\r\n });\r\n };\r\n HolidayDeals.prototype.enrichHotel = function (hotel, request) {\r\n var imageW = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n var imageH = imageW;\r\n var propertyType = this.getPropertyTypeFromResKey(hotel.AcomTypeId, hotel.IsVilla);\r\n var numberOfNonInfantPassengers = this.occupancyService.getNumberOfNonInfantPassengers();\r\n hotel.PropertyTypeFrom = this.resourceService.get(propertyType);\r\n hotel.ImageUrl = this.imageService.getMainImageUrl(hotel.Id, imageW, imageH);\r\n hotel.CroppedImage = this.imageService.getMainImageUrl(hotel.Id, 270, 150, true);\r\n hotel.MinPricePerson = hotel.DealMinPrice / numberOfNonInfantPassengers;\r\n if (hotel.HolidayDeals) {\r\n hotel.DealWasPrice = hotel.HolidayDeals[0].HotelDeal.WasPrice + hotel.HolidayDeals[0].FlightsDeal.Price;\r\n hotel.WasPricePerPerson = hotel.DealWasPrice / numberOfNonInfantPassengers;\r\n hotel.BoardType = this.resourceService.get(this.filtering.getBoardTypeName(hotel.HolidayDeals[0].HotelDeal.BoardType));\r\n }\r\n hotel.Duration = request.Duration;\r\n hotel.OccupancyString = this.occupancyService.getOccupancyString([_.pick(request, 'Adults', 'ChildAges')]);\r\n return hotel;\r\n };\r\n HolidayDeals.prototype.getMinHolidayPrice = function () {\r\n var _this = this;\r\n return this._getTeaserPriceRequest()\r\n .then(function (r) { return _this.$http.post(_this.API + \"/getminholidayprice\", r, { ignoreErrors: true }); })\r\n .then(function (response) { return response && response.data; });\r\n };\r\n HolidayDeals.prototype.getMinCruisePrice = function () {\r\n var _this = this;\r\n return this._getTeaserPriceRequest()\r\n .then(function (r) { return _this.$http.post(_this.API + \"/getmincruiseprice\", r, { ignoreErrors: true }); })\r\n .then(function (response) { return response && response.data; });\r\n };\r\n HolidayDeals.prototype._getTeaserPriceRequest = function () {\r\n var _this = this;\r\n return this.getFullParameters(false).then(function (params) { return ({\r\n DatesAndDurations: _this._getDatesAndDurations(_this.dateUtil.getNextSaturday(2), params.duration, 3),\r\n Adults: 2,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n OriginAirports: params.depAir\r\n }); });\r\n };\r\n HolidayDeals.prototype._trackDealChanges = function (orig, sel, originalTimes) {\r\n if (!orig || !orig.HotelDeal || !orig.FlightsDeal ||\r\n !sel || !sel.HotelDeal || !sel.FlightsDeal) {\r\n return;\r\n }\r\n var dow = this.$filter('date')(sel.HotelDeal.CheckInDate, 'EEE');\r\n var priceVariation = (sel.HotelDeal.Price + sel.FlightsDeal.Price) -\r\n (orig.HotelDeal.Price + orig.FlightsDeal.Price);\r\n this.analytics.track('mixpanel', 'HolidayDealsSelected', {\r\n DurationChanged: originalTimes.Duration !== sel.Duration,\r\n DateChanged: originalTimes.DepartureEpoch !== sel.DepartureEpoch,\r\n FlightChanged: orig.FlightsDeal.FlightId !== sel.FlightsDeal.FlightId,\r\n RoomChanged: orig.selectedRoom.MasterId !== sel.selectedRoom.MasterId,\r\n BoardTypeChanged: orig.selectedBoardType.BoardType !== sel.selectedBoardType.BoardType,\r\n PriceVariation: priceVariation,\r\n DayOfWeek: dow\r\n });\r\n };\r\n HolidayDeals.prototype._getSummaryElements = function (params) {\r\n var nights = this.resourceService\r\n .get(params.duration === 1 ? 'NIGHT' : 'NIGHTS').toLowerCase();\r\n var adults = this.resourceService\r\n .get(params.occupancy.Adults === 1 ? 'ADULT' : 'ADULTS');\r\n var children = this.resourceService\r\n .get(params.occupancy.ChildAges.length === 1 ? 'CHILDREN' : 'CHILDREN');\r\n return { nights: nights, adults: adults, children: children };\r\n };\r\n HolidayDeals.prototype._findDeals = function (findParams, filters, includeAggregates, params) {\r\n if (params === void 0) { params = undefined; }\r\n if (this.runningRequest && includeAggregates) {\r\n this.runningRequest.resolve('CANCELLED');\r\n this.runningRequest = this.$q.defer();\r\n }\r\n if (!params) {\r\n params = this.deserialiseParameters();\r\n }\r\n var flexibility = angular.isUndefined(findParams.flexibility)\r\n ? params.flexibility : findParams.flexibility;\r\n var request = {\r\n DatesAndDurations: this._getDatesAndDurations(params.startDate, params.duration, flexibility),\r\n Adults: params.occupancy[0].Adults,\r\n ChildAges: params.occupancy[0].ChildAges,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n OriginAirports: params.depAir,\r\n FieldFlags: findParams.fieldFlags,\r\n FilterCriteria: filters,\r\n SortCriterion: findParams.sort,\r\n Paging: findParams.paging,\r\n IncludeAggregates: includeAggregates,\r\n IncludeCruises: findParams.includeCruises,\r\n DiscountedPricesOnly: findParams.discountedPricesOnly,\r\n Destination: findParams.destination\r\n };\r\n return this.$http.post(findParams.url, request, { timeout: this.runningRequest.promise })\r\n .then(function (res) {\r\n res.req = request;\r\n res.params = params;\r\n res.filters = filters;\r\n return res;\r\n });\r\n };\r\n HolidayDeals.prototype._enrichProducts = function (products, request) {\r\n var _this = this;\r\n return products\r\n .filter(function (p) { return p.IsCruise || p.HolidayDeals; })\r\n .map(function (p) { return p.IsCruise ? _this._enrichCruise(p) : _this.enrichHotel(p, request); });\r\n };\r\n HolidayDeals.prototype._enrichCruise = function (cruise) {\r\n cruise.PricePerPerson =\r\n cruise.DealMinPrice / this.occupancyService.getNumberOfNonInfantPassengers();\r\n cruise.BoardType = this.resourceService.get(this.filtering.getBoardTypeName(cruise.CheapestBoardType));\r\n return cruise;\r\n };\r\n HolidayDeals.prototype._getDatesAndDurations = function (date, duration, flexibility) {\r\n var _this = this;\r\n var cutoffDate = this.dateUtil.todayPlus(2);\r\n return _(_.range(-(flexibility), flexibility + 1))\r\n .map(function (x) { return _this.dateUtil.addDays(date, x); })\r\n .filter(function (date) { return date > cutoffDate; })\r\n .map(function (date) { return ({\r\n Date: _this.dateUtil.serialiseDate(date),\r\n Duration: duration\r\n }); })\r\n .value();\r\n };\r\n return HolidayDeals;\r\n }());\r\n TR.HolidayDeals = HolidayDeals;\r\n angular\r\n .module('TR')\r\n .service('holidayDeals', HolidayDeals);\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var HolidayDealsGrouped = /** @class */ (function () {\r\n function HolidayDealsGrouped($http, $location, $filter, $q, dateUtil, resourceService, imageService, occupancyService, fieldGroupService, filtering, pageStrand, tripService, hotelService, analytics, flightSearch, geo, holidayDeals, preferences) {\r\n var _this = this;\r\n this.$http = $http;\r\n this.$location = $location;\r\n this.$filter = $filter;\r\n this.$q = $q;\r\n this.dateUtil = dateUtil;\r\n this.resourceService = resourceService;\r\n this.imageService = imageService;\r\n this.occupancyService = occupancyService;\r\n this.fieldGroupService = fieldGroupService;\r\n this.filtering = filtering;\r\n this.pageStrand = pageStrand;\r\n this.tripService = tripService;\r\n this.hotelService = hotelService;\r\n this.analytics = analytics;\r\n this.flightSearch = flightSearch;\r\n this.geo = geo;\r\n this.holidayDeals = holidayDeals;\r\n this.preferences = preferences;\r\n this.find = _.memoize(function (options) { return _this._find(options); }, function (options) { return angular.toJson(options).replace(/\\W/g, ''); });\r\n }\r\n HolidayDealsGrouped.prototype._find = function (_a) {\r\n var _this = this;\r\n var destinations = _a.destinations, dealsPerDestination = _a.dealsPerDestination, startDate = _a.startDate, duration = _a.duration, occupancy = _a.occupancy, depAir = _a.depAir, flexibility = _a.flexibility;\r\n if (!destinations || !dealsPerDestination || !startDate\r\n || !duration || !occupancy || !depAir) {\r\n return this.$q.reject();\r\n }\r\n var getByDestinationsRequest = {\r\n Destinations: destinations,\r\n DealsPerDestination: dealsPerDestination,\r\n DatesAndDurations: this.getDates(startDate, duration, flexibility),\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n Adults: occupancy[0].Adults,\r\n ChildAges: occupancy[0].ChildAges || [],\r\n OriginAirports: depAir,\r\n DirectFlightsOnly: false,\r\n DiscountedPricesOnly: true,\r\n FieldFlags: this.getFieldGroup(),\r\n SortCriterion: 1,\r\n };\r\n return this.$http.post('/api/holidays/deals/getbydestinations', getByDestinationsRequest)\r\n .then(function (res) {\r\n return res.data;\r\n })\r\n .then(function (dealsForManyDestinations) {\r\n _.each(dealsForManyDestinations, function (dealsForADestination) {\r\n _.each(dealsForADestination, function (deal) {\r\n _this.holidayDeals.enrichHotel(deal, { Duration: duration });\r\n });\r\n });\r\n return dealsForManyDestinations;\r\n });\r\n };\r\n HolidayDealsGrouped.prototype.getDates = function (StartDate, Duration, Flexibility) {\r\n var _this = this;\r\n var pad = function (x) {\r\n x = x + '';\r\n if (x.length === 1) {\r\n x = '0' + x;\r\n }\r\n return x;\r\n };\r\n var cutOffDate = this.dateUtil.todayPlus(2);\r\n var dates;\r\n if (angular.isNumber(Flexibility)) {\r\n var offsets = _.range(-Flexibility, Flexibility + 1);\r\n dates = _(offsets).map(function (offset) { return _this.dateUtil.addDays(StartDate, offset); });\r\n }\r\n else {\r\n var year_1 = StartDate.getFullYear();\r\n var month_1 = pad(StartDate.getMonth() + 1);\r\n var endOfMonth = month_1 === '02' ? 29 : 31;\r\n var days = _.range(1, endOfMonth);\r\n dates = _(days).map(function (day) { return _this.dateUtil.parseDate(year_1 + \"-\" + month_1 + \"-\" + pad(day)); });\r\n }\r\n return dates\r\n .filter(function (date) { return date > cutOffDate; })\r\n .map(function (date) { return _this.dateUtil.serialiseDate(date); })\r\n .map(function (date) { return ({\r\n Date: date,\r\n Duration: Duration\r\n }); })\r\n .value();\r\n };\r\n HolidayDealsGrouped.prototype.getFieldGroup = function () {\r\n return this.fieldGroupService.getFieldGroup(Core.FieldType.Global, Core.FieldType.Titles, Core.FieldType.Url, Core.FieldType.Description, Core.FieldType.Summary, Core.FieldType.HolidayDeals, Core.FieldType.LegacyFacilities, Core.FieldType.Weather, Core.FieldType.Distances, Core.FieldType.Recommendations, Core.FieldType.Airports, Core.FieldType.TransferTimes);\r\n };\r\n return HolidayDealsGrouped;\r\n }());\r\n TR.HolidayDealsGrouped = HolidayDealsGrouped;\r\n angular\r\n .module('TR')\r\n .service('holidayDealsGrouped', HolidayDealsGrouped);\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var HolidayDealsPromoService = /** @class */ (function () {\r\n function HolidayDealsPromoService($q, $filter, $location, holidayDeals, destinationService, analytics, filtering, occupancyService, resourceService, dateUtil, currencyService) {\r\n this.$q = $q;\r\n this.$filter = $filter;\r\n this.$location = $location;\r\n this.holidayDeals = holidayDeals;\r\n this.destinationService = destinationService;\r\n this.analytics = analytics;\r\n this.filtering = filtering;\r\n this.occupancyService = occupancyService;\r\n this.resourceService = resourceService;\r\n this.dateUtil = dateUtil;\r\n this.currencyService = currencyService;\r\n this.DEST_IMGS =\r\n \"https://d2f0rb8pddf3ug.cloudfront.net/api2/destination/images/getfromobject\";\r\n this.ALL_IMGS =\r\n \"https://s3-eu-west-1.amazonaws.com/trp-content/.co.uk/web\";\r\n }\r\n HolidayDealsPromoService.prototype.getInfoPromo = function () {\r\n var _this = this;\r\n var params;\r\n return this.holidayDeals.getFullParameters(true, { startDate: this._getNextMonth() })\r\n .then(function (p) {\r\n params = p;\r\n return _.head(p.depAir);\r\n })\r\n .then(this.destinationService.getAirport)\r\n .then(function (airport) {\r\n var plus = _.size(params.depAir) > 1 ? \" (+\" + _.size(params.depAir) + \")\" : '';\r\n return {\r\n summary: {\r\n occupancy: _this._buildOccupancyString(params.occupancy),\r\n month: _this.$filter('date')(params.startDate, 'MMMM yyyy'),\r\n duration: params.duration,\r\n airport: \"\" + airport.Title + plus,\r\n },\r\n blocks: _this._getBlocks(params.duration)\r\n };\r\n });\r\n };\r\n HolidayDealsPromoService.prototype._getBlocks = function (duration) {\r\n var num = this.occupancyService.getNumberOfNonInfantPassengers() * duration;\r\n var _a = _.map(TRPCONFIG.Domain.HolidayDealsPromoPrices || [',50', '50,95', '95,'], function (p) { return _(p)\r\n .split(',')\r\n .map(function (x) { return (x ? parseInt(x, 10) : 0) * num; })\r\n .value(); }), min = _a[0], mid = _a[1], high = _a[2];\r\n var cSymbol = this.currencyService.getSymbol(TRPCONFIG.Domain.CurrencyCode);\r\n this._adjustPriceRange(min, mid, high);\r\n return {\r\n budget: [\r\n {\r\n label: 'HOLIDAYDEALSPROMOSHOW',\r\n img: this.ALL_IMGS + \"/promo_everything.png\",\r\n name: 'PriceRange',\r\n value: null,\r\n group: 'budget'\r\n },\r\n {\r\n label: String.format(this.resourceService.get('UPTOX'), \"\" + cSymbol + min[1]),\r\n img: this.ALL_IMGS + \"/promo_low_budget.png\",\r\n name: 'PriceRange',\r\n value: (min[0] || '') + \",\" + (min[1] || ''),\r\n group: 'budget',\r\n type: 'low'\r\n },\r\n {\r\n label: \"\" + cSymbol + mid[0] + \" - \" + cSymbol + mid[1],\r\n img: this.ALL_IMGS + \"/promo_mid_budget.png\",\r\n name: 'PriceRange',\r\n value: (mid[0] || '') + \",\" + (mid[1] || ''),\r\n group: 'budget',\r\n type: 'mid'\r\n },\r\n {\r\n label: \" \" + cSymbol + high[0] + \"+\",\r\n img: this.ALL_IMGS + \"/promo_high_budget.png\",\r\n name: 'PriceRange',\r\n value: (high[0] || '') + \",\" + (high[1] || ''),\r\n group: 'budget',\r\n type: 'high'\r\n }\r\n ],\r\n type: [\r\n {\r\n label: 'SEO_BEACH',\r\n img: this.ALL_IMGS + \"/promo_beach.png\",\r\n name: 'FacilityCodes',\r\n value: 'HB',\r\n group: 'type'\r\n },\r\n {\r\n label: 'DEALSCITYROUTENAME',\r\n img: this.ALL_IMGS + \"/promo_city.png\",\r\n name: 'FacilityCodes',\r\n value: 'HT',\r\n group: 'type'\r\n },\r\n TRPCONFIG.Domain.HolidayDealsCruisesEnabled\r\n ? {\r\n label: 'MENUCRUISE',\r\n img: this.ALL_IMGS + \"/promo_cruise.png\",\r\n name: 'PropertyTypes',\r\n value: '5',\r\n group: 'type'\r\n }\r\n : {\r\n label: 'FAMILY',\r\n img: this.ALL_IMGS + \"/promo_family.png\",\r\n name: 'FacilityCodes',\r\n value: 'HF',\r\n group: 'type'\r\n },\r\n {\r\n label: 'LANDINGPAGEATTRACTIONSACTIVITIES_NIGHTLIFE',\r\n img: this.ALL_IMGS + \"/promo_nightlife.png\",\r\n name: 'FacilityCodes',\r\n value: 'HN',\r\n group: 'type'\r\n },\r\n {\r\n label: 'SPARELAXATION',\r\n img: this.ALL_IMGS + \"/promo_spa.png\",\r\n name: 'FacilityCodes',\r\n value: 'SP',\r\n group: 'type'\r\n },\r\n {\r\n label: 'ROMANTIC',\r\n img: this.ALL_IMGS + \"/promo_romantic.png\",\r\n name: 'FacilityCodes',\r\n value: 'HC',\r\n group: 'type'\r\n },\r\n {\r\n label: 'ACTIVITY',\r\n img: this.ALL_IMGS + \"/promo_activity.png\",\r\n name: 'FacilityCodes',\r\n value: 'HA',\r\n group: 'type'\r\n },\r\n {\r\n label: 'FARAWAY',\r\n img: this.ALL_IMGS + \"/promo_far_away.png\",\r\n name: 'ChildDestinations',\r\n value: TRPCONFIG.Domain.HolidayDealsPromoDestinations,\r\n group: 'type'\r\n },\r\n ]\r\n };\r\n };\r\n HolidayDealsPromoService.prototype._buildOccupancyString = function (occ) {\r\n var o = _.first(occ);\r\n var childNum = _.size(occ.ChildAges);\r\n var adults = o.Adults + \" \" + this.resourceService.get(o.Adults === 1 ? 'ADULT' : 'ADULTS');\r\n var children = childNum + \" \" + this.resourceService.get(childNum === 1 ? 'CHILD' : 'CHILDREN');\r\n return childNum === 0 ? adults : adults + \" \" + children;\r\n };\r\n HolidayDealsPromoService.prototype._adjustPriceRange = function (min, mid, high) {\r\n var priceRange = _.get(this.$location.search(), 'PriceRange');\r\n if (!priceRange) {\r\n return;\r\n }\r\n var newPriceRange = _.startsWith(priceRange, ',') ? min : _.endsWith(priceRange, ',') ? high : mid;\r\n this.$location.search('PriceRange', (newPriceRange[0] || '') + \",\" + (newPriceRange[1] || ''));\r\n };\r\n HolidayDealsPromoService.prototype._getNextMonth = function () {\r\n var today = new Date();\r\n var month = today.getMonth();\r\n var year = month === 11 ? today.getFullYear() + 1 : today.getFullYear();\r\n month = month === 11 ? 0 : month + 1;\r\n return new Date(year, month, 15, 0, 0, 0, 0);\r\n };\r\n return HolidayDealsPromoService;\r\n }());\r\n angular\r\n .module('TR')\r\n .service('holidayDealsPromoService', HolidayDealsPromoService);\r\n})(TR || (TR = {}));\r\nvar Core;\r\n(function (Core) {\r\n var HolidaySearch = /** @class */ (function () {\r\n function HolidaySearch(searchUnitService, occupancyService, $http) {\r\n this.searchUnitService = searchUnitService;\r\n this.occupancyService = occupancyService;\r\n this.$http = $http;\r\n this.searchUrl = '/api/holidays/createsearch';\r\n this.adjustUrl = '/api/holidays/adjusthoteldates';\r\n }\r\n HolidaySearch.prototype.getRequest = function (parameters) {\r\n return {\r\n DepartureAirports: this.searchUnitService.getDepartureAirports(),\r\n DepartureDate: this.searchUnitService.startDate(this.searchUnitService.flight),\r\n ReturnDate: this.searchUnitService.endDate(this.searchUnitService.flight),\r\n Destination: this.searchUnitService.getDestination(),\r\n Rooms: this.occupancyService.getOccupancy(),\r\n Cabin: this.searchUnitService.getCabin(),\r\n PreferredCarrierCodes: _.get(parameters, 'prefilterAirlines', []),\r\n IsDirectFlight: !!_.get(parameters, 'prefilterDirectFlights'),\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n ArrivalAirports: this.searchUnitService.getArrivalAirports()\r\n };\r\n };\r\n HolidaySearch.prototype.createSearch = function (parameters) {\r\n return this.$http.post(this.searchUrl, this.getRequest(parameters));\r\n };\r\n HolidaySearch.prototype.adjustHotelDates = function (HotelSearchId, dates) {\r\n return this.$http.post(this.adjustUrl, _.defaults({ HotelSearchId: HotelSearchId }, dates))\r\n .then(function (_a) {\r\n var data = _a.data;\r\n return data;\r\n });\r\n };\r\n return HolidaySearch;\r\n }());\r\n angular\r\n .module('TR')\r\n .service('holidaySearch', HolidaySearch);\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('hotelRehydrator', hotelRehydrator);\r\n function hotelRehydrator(fieldFilterParser, $routeParams, $http, arrayUtil, imageService, $q, $filter, tripService, hotelFromSession, fieldGroupService) {\r\n var service = {\r\n hotels: hotels,\r\n hotel: hotel,\r\n staticHotel: staticHotel\r\n };\r\n var fieldTypes = fieldGroupService.getFieldTypes();\r\n var fieldFlags = fieldGroupService.getFieldGroup([\r\n fieldTypes.Global,\r\n fieldTypes.Titles,\r\n fieldTypes.IndicativePrice,\r\n fieldTypes.ReviewSnippets,\r\n fieldTypes.Url,\r\n fieldTypes.Summary,\r\n fieldTypes.Recommendations\r\n ]);\r\n function hotel(id) {\r\n if ($routeParams.tripId) {\r\n return tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n return hotelFromSession.getHotel(trip.HotelsRequest.AvailabilitySearchId, id, $routeParams.tripId);\r\n });\r\n }\r\n return staticHotel(id);\r\n }\r\n function staticHotel(id, ignoreErrors) {\r\n var dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n return hotels([id], { imageWidth: dim, imageHeight: dim }, ignoreErrors).then(function (data) {\r\n return data[0];\r\n });\r\n }\r\n function hotels(ids, options, ignoreErrors) {\r\n options = angular.extend({ imageWidth: 80, imageHeight: 80, cropImage: false }, options);\r\n if (ids == null || ids.length === 0) {\r\n return $q.when([]);\r\n }\r\n return $http.post(\"/api/hotels/static/gethotelsbyid?\" + fieldFilterParser.parse(options), {\r\n Ids: ids,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FieldFlags: fieldFlags\r\n }, { ignoreErrors: !!ignoreErrors }).then(function (result) {\r\n return arrayUtil.map(result.data, function (hotel) {\r\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, options.imageWidth, options.imageHeight, options.cropImage);\r\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice);\r\n return hotel;\r\n });\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('hotelResolver', hotelResolver);\r\n function hotelResolver(recentHotels, hotelService, $route, tripService, basketStore) {\r\n var service = {\r\n resolve: resolve\r\n };\r\n function resolve(includeRooms) {\r\n var tripId = $route.current.params.tripId;\r\n var estabId = parseInt($route.current.params.estabId);\r\n recentHotels.set(estabId);\r\n return tripService.restoreSearchUnit(tripId).then(function (trip) {\r\n if (trip && trip.HotelsRequest) {\r\n var promise = hotelService.getHotel(includeRooms ? trip.HotelsRequest.AvailabilitySearchId : null, estabId, tripId);\r\n var calculateTotalCost_1 = function (hotelInfo, costAggregator) {\r\n hotelInfo.Rooms.forEach(function (rr) {\r\n rr.Availability.forEach(costAggregator);\r\n rr.selected = rr.Availability[0].Id;\r\n });\r\n return hotelInfo;\r\n };\r\n if (TRPCONFIG.Domain.PackagePrice && trip.FlightsRequest && trip.FlightsRequest.SelectedFlight) {\r\n return promise.then(function (hotelInfo) {\r\n return basketStore.flightCost(trip.BasketId).then(function (flightCost) {\r\n return calculateTotalCost_1(hotelInfo, function (a) { return a.TotalCost = a.Cost + flightCost / hotelInfo.Rooms.length; });\r\n });\r\n });\r\n }\r\n return promise.then(function (hotelInfo) {\r\n return calculateTotalCost_1(hotelInfo, function (a) { return a.TotalCost = a.Cost; });\r\n });\r\n }\r\n });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('hotelSearch', hotelSearch);\r\n function hotelSearch(loggingService, hotelFilterQueryStringParser, preferences, $routeParams, $http, roundedCurrencyFilter, arrayUtil, guidService, localStorageProvider, $q, cookieService, fieldGroupService, occupancyService, searchUnitService, destinationService, hotelSearchValidator, FilterUtils, imageService, broker, $location, cancellerService, tripService, $timeout, sortCriteria, criteoService, FilterIdUtils, $rootScope, currentDestination, objectTypeService, resourceService, holidaySearch, analytics, abTest, fidParser, flightDetail) {\r\n var service = {\r\n adjustHotelCheckInCheckOutDates: adjustHotelCheckInCheckOutDates,\r\n pruneRequest: pruneRequest,\r\n clearSearchResults: clearSearchResults,\r\n bitFilterSet: bitFilterSet,\r\n buildHotelsRequest: buildHotelsRequest,\r\n createSearch: createSearch,\r\n filter: filter,\r\n filterSet: filterSet,\r\n getAvailabilityRequest: getAvailabilityRequest,\r\n getDestinationEstabId: getDestinationEstabId,\r\n getDestinationTitle: getDestinationTitle,\r\n getFacilitiesIcon: getFacilitiesIcon,\r\n getOccupancySummary: getOccupancySummary,\r\n getFilter: getFilter,\r\n getFilterLazy: getFilterLazy,\r\n getUserSelectedFilterCriteria: getUserSelectedFilterCriteria,\r\n getSearchResults: getSearchResults,\r\n getStaticSearchResults: getStaticSearchResults,\r\n getSortCriteria: getSortCriteria,\r\n getSortCriterionDescription: getSortCriterionDescription,\r\n createMultiDestHolidaySearch: createMultiDestHolidaySearch,\r\n getTripForSelectedMultiDestHoliday: getTripForSelectedMultiDestHoliday,\r\n getPromotionTerms: getPromotionTerms,\r\n getFlightDetailsForSelectedMultiDestHoliday: getFlightDetailsForSelectedMultiDestHoliday,\r\n getUrl: getUrl,\r\n getBoardTypesUrl: getBoardTypesUrl,\r\n initialise: initialise,\r\n page: page,\r\n pageSize: pageSize,\r\n pageIndex: pageIndex,\r\n rangeFilterSet: rangeFilterSet,\r\n removeArrayFilter: removeArrayFilter,\r\n removeFiltersIn: removeFiltersIn,\r\n removeFilter: removeFilter,\r\n resetArrayFilter: resetArrayFilter,\r\n resetBitFilter: resetBitFilter,\r\n resetFilters: resetFilters,\r\n resetRangeFilter: resetRangeFilter,\r\n setAirportCodeFilter: setAirportCodeFilter,\r\n showAtol: showAtol,\r\n sort: sort,\r\n validateSearchCriteria: validateSearchCriteria,\r\n updateFilterFromFid: updateFilterFromFid,\r\n estabGroupFilterAvailable: estabGroupFilterAvailable,\r\n getMandatoryExtra: getMandatoryExtra,\r\n getMaldivesIsMandatory: getMaldivesIsMandatory,\r\n fetchAllBoardTypes: fetchAllBoardTypes,\r\n addTitleToBoardTypes: addTitleToBoardTypes,\r\n addDynamicTitleToBoardTypes: addDynamicTitleToBoardTypes,\r\n toggleSearch: toggleSearch,\r\n getFlightMiles: getFlightMiles\r\n };\r\n var domain = TRPCONFIG.Domain;\r\n var url = '/api/hotels/availability/';\r\n var staticUrl = '/api/hotels/static/';\r\n var boardTypesUrl = '/api/hotels/boardtypes/';\r\n var results = null;\r\n var aggregatesCache;\r\n var inProgress;\r\n var inProgressStatic;\r\n var adjustingInProgress = $q.when();\r\n var canceller;\r\n var filterCanceller;\r\n var creatingSearch;\r\n var sortCriteriaDef = sortCriteria.getHotelCriteria();\r\n var filterUtil = new FilterUtils(_initialFilterCriteria());\r\n var filterDefer = $q.defer();\r\n var qs = $location.search();\r\n var allBoardTypes;\r\n var applyDeepLinkFilter = true;\r\n var usedIds = {};\r\n var req = {\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId,\r\n CurrencyCode: searchUnitService.getCurrency(),\r\n Paging: {\r\n Index: qs.pi || 0,\r\n Size: 8\r\n },\r\n IncludeAggregates: true\r\n };\r\n var fieldType = fieldGroupService.getFieldTypes();\r\n var availabilitySearchFlags = [\r\n fieldType.Global,\r\n fieldType.Titles,\r\n fieldType.ReviewSnippets,\r\n fieldType.Url,\r\n fieldType.Summary,\r\n fieldType.Pricing,\r\n fieldType.Recommendations,\r\n fieldType.RoomAvailability,\r\n fieldType.EstabGroupIds,\r\n fieldType.HotelAwards,\r\n fieldType.Facilities\r\n ];\r\n var staticSearchFlags = [\r\n fieldType.Global,\r\n fieldType.Titles,\r\n fieldType.IndicativePrice,\r\n fieldType.ReviewSnippets,\r\n fieldType.Url,\r\n fieldType.Summary,\r\n fieldType.Recommendations,\r\n fieldType.EstabGroupIds,\r\n fieldType.HotelAwards\r\n ];\r\n broker.subscribe('hotelSearch', 'searchDatesAdjusted', function (ev) {\r\n if (canceller != null) {\r\n canceller.resolve('searchDatesAdjusted');\r\n inProgress = null;\r\n canceller = null;\r\n }\r\n adjustHotelCheckInCheckOutDates(ev.data.tripId, ev.data.dates);\r\n });\r\n function adjustHotelCheckInCheckOutDates(tripId, dates) {\r\n service.clearSearchResults(true);\r\n if (filterCanceller) {\r\n filterCanceller.resolve();\r\n }\r\n adjustingInProgress = tripService.getHotelsRequest(tripId).then(function (request) {\r\n TRPCONFIG.Domain.DefaultHotelDates = false;\r\n holidaySearch.adjustHotelDates(request.AvailabilitySearchId, dates).then(function (AvailabilitySearchId) {\r\n service.buildHotelsRequest(_.defaults({ AvailabilitySearchId: AvailabilitySearchId }, dates, _.pick(request, ['CheckInDate', 'CheckOutDate'])), searchUnitService.flight);\r\n tripService.recordHotelSearch(tripId, getAvailabilityRequest());\r\n });\r\n });\r\n }\r\n function toggleSearch(clickPanel) {\r\n var searchClasses = document.querySelectorAll('.ekh-search-panel')[0].classList;\r\n searchClasses.toggle('panel-hide');\r\n var close = document.querySelector('.ekh-search-panel .close');\r\n close.addEventListener('click', function () {\r\n document.querySelector(clickPanel).click();\r\n }, { once: true });\r\n }\r\n function _initialFilterCriteria() {\r\n return angular.extend(_defaultFilterCriteria(), hotelFilterQueryStringParser.parse());\r\n }\r\n function _setInProgress(val, stat) {\r\n if (stat) {\r\n inProgressStatic = val;\r\n }\r\n else {\r\n inProgress = val;\r\n }\r\n }\r\n function _setResults(val, stat) {\r\n if (!stat) {\r\n results = val;\r\n }\r\n }\r\n function estabGroupFilterAvailable() {\r\n return FilterIdUtils.estabGroupFilterAvailable(service.getFilter());\r\n }\r\n function updateFilterFromFid() {\r\n var fid = fidParser.parse();\r\n if (fid != null) {\r\n return FilterIdUtils.lookupFid(fid).then(function (f) {\r\n $rootScope.canonicalSuffix = f && f.Canonical ? \"?fid=\" + fid : '';\r\n filterUtil = new FilterUtils(angular.extend(filterUtil.getFilter(), f));\r\n });\r\n }\r\n //no fid so nothing to do\r\n return $q.when();\r\n }\r\n function _defaultFilterCriteria() {\r\n var existing = filterUtil ? getFilter() : null;\r\n var newFilter = {\r\n AirportCode: null,\r\n Stars: [],\r\n PropertyTypes: [],\r\n BoardTypes: [],\r\n FacilityCodes: [],\r\n HotelName: '',\r\n PriceRange: null,\r\n HolidayPriceRange: null,\r\n RatingRange: null,\r\n EstabGroupIds: [],\r\n EstabGroupName: null,\r\n FilterByEstabGroup: false,\r\n ChildDestinations: [],\r\n OnlyShowAvailable: true\r\n };\r\n if (existing && existing.AirportCode) {\r\n newFilter.AirportCode = existing.AirportCode;\r\n }\r\n return newFilter;\r\n }\r\n function getUserSelectedFilterCriteria() {\r\n //when filtering we should only pass the items a user has set, but we also want to\r\n //take care to not modify the actual filter object, so return a modified\r\n //copy of the filter\r\n var filterCopy = angular.copy(getFilter());\r\n if (aggregatesCache != null) {\r\n filterUtil.setToNullIfMatches(filterCopy, 'PriceRange', aggregatesCache);\r\n filterUtil.setToNullIfMatches(filterCopy, 'HolidayPriceRange', aggregatesCache);\r\n filterUtil.setToNullIfMatches(filterCopy, 'RatingRange', aggregatesCache);\r\n results && results.SearchCompletePercentage < 100 && _.assignIn(filterCopy, {\r\n PriceRange: null,\r\n RatingRange: null,\r\n HolidayPriceRange: null\r\n });\r\n }\r\n //correctly set the estab group property of the copied filter also\r\n FilterIdUtils.updateEstabGroupProperties(filterCopy);\r\n return filterCopy;\r\n }\r\n function setAirportCodeFilter(code) {\r\n var f = getFilter();\r\n if (f.AirportCode !== code) {\r\n results = null; //we will need to re-run the results to filter by the new airport code\r\n }\r\n f.AirportCode = code;\r\n }\r\n function mergeFacilitiesFilters(aggregates) {\r\n aggregates.MergedHotelsByFacility = {};\r\n for (var group in aggregates.HotelsByFacility) {\r\n angular.extend(aggregates.MergedHotelsByFacility, aggregates.HotelsByFacility[group]);\r\n }\r\n return aggregates;\r\n }\r\n function enrichData(hotels, currency, isKidsFree) {\r\n var kidsFreeEnabled = isKidsFree &&\r\n (parseInt(cookieService.get('KidsPromoAB')) === 1 || TRPCONFIG.Domain.isAgentMode);\r\n var numPeoplePaying = kidsFreeEnabled\r\n ? occupancyService.getOnlyPayingIndividuals()\r\n : occupancyService.getNumberOfNonInfantPassengers();\r\n angular.forEach(hotels, function (hotel) {\r\n var dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, dim, dim, true);\r\n hotel.MinCostStr = roundedCurrencyFilter(hotel.MinCost, currency);\r\n hotel.MinCostPerPerson = hotel.MinCost / (numPeoplePaying || 1);\r\n hotel.MinCostPerPersonStr = roundedCurrencyFilter(hotel.MinCostPerPerson, currency);\r\n hotel.OriginalCostStr = roundedCurrencyFilter(hotel.OriginalCost, currency);\r\n hotel.OriginalCostPerPerson = hotel.OriginalCost / (numPeoplePaying || 1);\r\n hotel.OriginalCostPerPersonStr = roundedCurrencyFilter(hotel.OriginalCostPerPerson, currency);\r\n hotel.HasReviewSnippets = !_.isEmpty(hotel.ReviewSnippets);\r\n hotel.TeaserStr = roundedCurrencyFilter(hotel.IndicativeMinPrice);\r\n });\r\n broker.publish('hotelsReturnedFromSearch', hotels);\r\n }\r\n function setSortCriterion(d, k, newSearch, so) {\r\n if (so != null) {\r\n return $q.when(so);\r\n }\r\n if (k != null && d.EstablishmentId <= 0) {\r\n switch (k.toLowerCase()) {\r\n case 'tr':\r\n return $q.when(2);\r\n case 'bh':\r\n return $q.when(5);\r\n case 'lh':\r\n return $q.when(8);\r\n }\r\n }\r\n return preferences.getHotelSortOrder(newSearch);\r\n }\r\n function resetFilters(dontApply) {\r\n applyDeepLinkFilter = true;\r\n var f = _defaultFilterCriteria();\r\n filterUtil = new FilterUtils(f);\r\n filterDefer = $q.defer();\r\n //make sure that when we resetAll filters we don't splat any estab group filter completely, just remove the ids\r\n FilterIdUtils.updateEstabGroupProperties(f);\r\n if (!dontApply) {\r\n return service.filter();\r\n }\r\n else if (dontApply === 'doReset') {\r\n applyDeepLinkFilter = false;\r\n return service.filter();\r\n }\r\n return $q.when();\r\n }\r\n function removeArrayFilter(filterName, item) {\r\n filterUtil.removeArrayFilter(filterName, item);\r\n return service.filter();\r\n }\r\n function resetArrayFilter(filterName) {\r\n filterUtil.resetArrayFilter(filterName);\r\n if (filterName === 'BoardTypes' || filterName === 'Stars') {\r\n applyDeepLinkFilter = false;\r\n return service.filter();\r\n }\r\n applyDeepLinkFilter = true;\r\n return service.filter();\r\n }\r\n function resetBitFilter(filterName) {\r\n filterUtil.resetBitFilter(filterName);\r\n return service.filter();\r\n }\r\n function removeFiltersIn(filterName, vals) {\r\n filterUtil.removeFiltersIn(filterName, vals);\r\n return service.filter();\r\n }\r\n function resetRangeFilter(filterName, range) {\r\n if (results != null) {\r\n var resetFrom = abTest.progressiveHotelSearchEnabled() ? null : results.Aggregates;\r\n filterUtil.resetRangeFilter(results, resetFrom, filterName, range);\r\n }\r\n if (filterName === 'HolidayPriceRange') {\r\n applyDeepLinkFilter = false;\r\n return service.filter();\r\n }\r\n applyDeepLinkFilter = true;\r\n return service.filter();\r\n }\r\n function removeFilter(filterName) {\r\n filterUtil.removeFilter(filterName);\r\n return service.filter();\r\n }\r\n function filterSet(filterName) {\r\n return filterUtil.filterSet(filterName);\r\n }\r\n function bitFilterSet(filterName) {\r\n return filterUtil.bitFilterSet(filterName);\r\n }\r\n function rangeFilterSet(filterName, range) {\r\n if (!results) {\r\n return false;\r\n }\r\n return filterUtil.rangeFilterSet(results, results.Aggregates, filterName, range);\r\n }\r\n function pageSize() {\r\n return req.Paging.Size;\r\n }\r\n // getter/setter\r\n function pageIndex(pi) {\r\n var key = 'hotelSearch-pageIndex';\r\n if (arguments.length === 0) {\r\n return localStorageProvider.getItem(key)\r\n .then(function (item) {\r\n if (item && item.path === $location.path() && $location.search().disablePaging !== '1') {\r\n return item.pi;\r\n }\r\n return parseInt(req.Paging.Index);\r\n });\r\n }\r\n req.Paging.Index = pi;\r\n return localStorageProvider.setItem(key, {\r\n path: $location.path(),\r\n pi: pi,\r\n });\r\n }\r\n function validateSearchCriteria() {\r\n return hotelSearchValidator.validate(searchUnitService.getDestination(), searchUnitService.startDate(searchUnitService.hotel), searchUnitService.endDate(searchUnitService.hotel), searchUnitService.getSearchArea(searchUnitService.hotel), occupancyService.getOccupancy());\r\n }\r\n function getDestinationEstabId() {\r\n return currentDestination.getCurrentDestination().then(function (dest) {\r\n return dest &&\r\n dest.EstablishmentId\r\n ? dest.EstablishmentId\r\n : dest.Type === 1\r\n ? dest.Id\r\n : 0;\r\n });\r\n }\r\n function getDestinationTitle() {\r\n return currentDestination.getCurrentDestination().then(function (dest) {\r\n return dest ? dest.SummaryTitle : '';\r\n });\r\n }\r\n function getFacilitiesIcon() {\r\n var facilitiesIcons = {\r\n AC: 'air_conditioning.svg',\r\n BA: 'bar.svg',\r\n BC: 'do_not_show',\r\n CC: 'kids_club.svg',\r\n DF: 'accessibility.svg',\r\n GF: 'golf.svg',\r\n GM: 'gym.svg',\r\n HA: 'no_icon',\r\n HB: 'close_to_beach.svg',\r\n HC: 'couples.svg',\r\n HF: 'family.svg',\r\n HK: 'no_icon',\r\n HN: 'no_icon',\r\n HQ: 'boutique_label.svg',\r\n HS: 'no_icon',\r\n HT: 'no_icon',\r\n HU: 'no_icon',\r\n HV: 'no_icon',\r\n IN: 'wifi.svg',\r\n PA: 'no_icon',\r\n PK: 'parking.svg',\r\n RS: 'restaurant.svg',\r\n SP: 'spa.svg',\r\n SW: 'pool.svg',\r\n TV: 'do_not_show',\r\n WN: 'no_icon',\r\n WP: 'no_icon'\r\n };\r\n return facilitiesIcons;\r\n }\r\n function getOccupancySummary() {\r\n return occupancyService.getRoomOccupancyString();\r\n }\r\n function showAtol() {\r\n var show = true;\r\n var code = TRPCONFIG.SelectedRegionalContext.CountryCode;\r\n return code === 'gb' || code === 'ie' || code === 'dk' || code === 'se' ? show : !show;\r\n }\r\n function _checkSearchId(r) {\r\n if (usedIds[r.AvailabilitySearchId]) {\r\n loggingService.logWarn(\"DUPLICATESEARCHID: \" + r.AvailabilitySearchId + \" has been used before\");\r\n }\r\n else {\r\n usedIds[r.AvailabilitySearchId] = true;\r\n }\r\n }\r\n function pruneRequest(r) {\r\n return _.assignIn(_.omit(r, 'Destination'), {\r\n Destination: _.pick(r.Destination, 'Id', 'Type'),\r\n StreamPrices: abTest.progressiveHotelSearchEnabled(true)\r\n });\r\n }\r\n function createSearch() {\r\n if (req.SearchArea) {\r\n req.SortCriterion = 4;\r\n creatingSearch = doSearch();\r\n return creatingSearch;\r\n }\r\n creatingSearch = setSortCriterion(req.Destination, $location.search().k, true, $location.search().sortOrder)\r\n .then(function (s) { req.SortCriterion = s; })\r\n .then(doSearch);\r\n return creatingSearch;\r\n function doSearch() {\r\n if (!TRPCONFIG.Domain.HotelAvailabilitySearchIdHashing) {\r\n _checkSearchId(req);\r\n }\r\n canceller = cancellerService.add(/^\\/holidays\\/flights\\/\\w+/, /^\\/hotels\\/\\w+/, /^\\/holidays\\/hotels\\/\\w+/);\r\n var prunedReq = pruneRequest(req);\r\n return $http.post(url + \"createsearch\", prunedReq, { timeout: canceller.promise })\r\n .then(function (result) {\r\n creatingSearch = null;\r\n canceller = null;\r\n broker.publish('hotelSearchCreated', req.AvailabilitySearchId);\r\n req.AvailabilitySearchId = result && result.data;\r\n tripService.recordHotelSearch(req.TripId, req);\r\n return req.AvailabilitySearchId;\r\n }, function (res) {\r\n inProgress = null;\r\n canceller = null;\r\n if (res.status === 400) {\r\n $location.path('error');\r\n }\r\n if (res.status === 404) {\r\n $location.path('hotels/notfound');\r\n }\r\n });\r\n }\r\n }\r\n function buildHotelsRequest(request, mode) {\r\n req.AvailabilitySearchId = request && request.AvailabilitySearchId\r\n || !TRPCONFIG.Domain.HotelAvailabilitySearchIdHashing && guidService.uuid();\r\n req.Destination = _getDestination(request);\r\n req.TripId = request && request.TripId || guidService.uuid();\r\n req.Rooms = request && request.Rooms || occupancyService.getOccupancy();\r\n req.CurrencyCode = request && request.CurrencyCode || searchUnitService.getCurrency();\r\n req.CheckInDate = request && request.CheckInDate || searchUnitService.startDate(mode);\r\n req.CheckOutDate = request && request.CheckOutDate || searchUnitService.endDate(mode);\r\n req.Paging.Index = 0;\r\n req.SearchArea = searchUnitService.getSearchArea();\r\n req.IsFlightPlus = (request && request.IsFlightPlus);\r\n }\r\n function _getDestination(request) {\r\n var dest = request && request.Destination || searchUnitService.getDestination();\r\n return dest ? angular.extend(dest, objectTypeService.getObjectTypeAndId(dest)) : null;\r\n }\r\n function updateSortCriterion() {\r\n return preferences.getHotelSortOrder().then(function (s) { return req.SortCriterion = s; });\r\n }\r\n function search(options) {\r\n options = angular.merge({\r\n fidCheck: false,\r\n stat: false,\r\n refreshRankingScores: false\r\n }, options);\r\n var currentInProgress = options.stat ? inProgressStatic : inProgress;\r\n if (currentInProgress != null) {\r\n return currentInProgress;\r\n }\r\n //TODO - now that we are paging the data we should add a cache of pages by availability Id so\r\n //that if we revisit a page we have already asked for we don't have to go to the server.\r\n //Must remember to clear the cache if the filter or sort criteria are changed.\r\n var start = new Date().getTime();\r\n var interval = 1000;\r\n var timeout = 60000;\r\n var d = $q.defer();\r\n var notfound = {\r\n 410: errorPath,\r\n 404: function () {\r\n var now = new Date().getTime();\r\n if (now - start < timeout) {\r\n $timeout(get, interval); //recurse\r\n return true; //to indicate that the error condition has been handled (for now)\r\n }\r\n errorPath();\r\n }\r\n };\r\n function errorPath() {\r\n var supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(function (p) { return p.toLowerCase(); });\r\n var hotelsPathSupported = supportedProducts.indexOf('hotels') > -1;\r\n _setInProgress(null, options.stat);\r\n hotelsPathSupported\r\n ? $location.path('hotels/notfound')\r\n : $location.path('holidays/notfound');\r\n d.reject();\r\n }\r\n _setInProgress(d.promise, options.stat);\r\n hotelFilterQueryStringParser.format(getUserSelectedFilterCriteria());\r\n if (!options.stat && creatingSearch != null) {\r\n return creatingSearch.then(get);\r\n }\r\n return updateSortCriterion().then(function () { return fetchAllBoardTypes().then(function (res) {\r\n allBoardTypes = res.data;\r\n return get(options.fidCheck);\r\n }); });\r\n function get(fidCheck) {\r\n return $q.all([\r\n tripService.getCurrency($routeParams.tripId),\r\n currentDestination.getCurrentDestination(),\r\n tripService.isKidsFree($routeParams.tripId),\r\n tripService.getTrip($routeParams.tripId)\r\n ]).then(function (result) {\r\n var trip = result[3];\r\n var isMultiDestHoliday = Boolean(trip && trip.TripType === tripService.tripTypes.MultiDestHoliday);\r\n filterCanceller = cancellerService.add(/^\\/holidays\\/flights\\/\\w+/, /^\\/hotels\\/\\w+/, /^\\/holidays\\/hotels\\/\\w+/);\r\n filterCanceller.promise.then(function () {\r\n _setInProgress(null, options.stat);\r\n });\r\n if (result[1]) {\r\n var objectTypeAndId = objectTypeService.getObjectTypeAndId(result[1]);\r\n req.DestinationType = objectTypeAndId.Type;\r\n req.DestinationId = objectTypeAndId.Id;\r\n if ($location.search().bfd) {\r\n req.DestinationType = 1;\r\n req.DestinationId = $location.search().bfd;\r\n }\r\n if (applyDeepLinkFilter) {\r\n if (qs.boardType && $location.search().boardType !== qs.boardType && !req.FilterCriteria.BoardTypes.includes(qs.boardType)) {\r\n req.FilterCriteria.BoardTypes.push(qs.boardType);\r\n }\r\n if (qs.stars && $location.search().stars !== qs.stars && !req.FilterCriteria.Stars.includes(qs.stars)) {\r\n req.FilterCriteria.Stars.push(qs.stars);\r\n }\r\n if (qs.holidayPrice && !$location.search().hpr) {\r\n req.FilterCriteria.HolidayPriceRange = { Min: qs.holidayPrice.split(',')[0], Max: qs.holidayPrice.split(',')[1] };\r\n }\r\n }\r\n if (result[1].PageStrand) {\r\n req.PageStrand = result[1].PageStrand;\r\n }\r\n }\r\n req.AllowIncompleteResults = abTest.progressiveHotelSearchEnabled();\r\n req.CurrencyCode = result[0] || TRPCONFIG.Domain.CurrencyCode;\r\n req.FieldFlags = fieldGroupService.getFieldGroup(req.AvailabilitySearchId && !options.stat ? availabilitySearchFlags : staticSearchFlags);\r\n req.DiscountCode = TRPCONFIG.DiscountCode;\r\n var tripLocal = JSON.parse(localStorage.getItem('trip'));\r\n req.TripId = $routeParams.tripId ? $routeParams.tripId : (tripLocal && tripLocal.TripId) ? tripLocal.TripId : null;\r\n req.RefreshRankingScores = options.refreshRankingScores;\r\n req.AddMeetAndGreet = TRPCONFIG.Domain2.AddMeetAndGreet;\r\n req.BookingChannelId = 2;\r\n var intermediateRes;\r\n pageIndex()\r\n .then(function (pi) {\r\n req.Paging.Index = pi;\r\n var notStaticSearch = req.AvailabilitySearchId && !options.stat;\r\n var _url;\r\n if (isMultiDestHoliday) {\r\n _url = '/api/holidays/getmultidestinationsearchresults';\r\n req.PlacementId = 'jan-sale';\r\n }\r\n else if (notStaticSearch) {\r\n _url = url + \"gethotels\";\r\n }\r\n else {\r\n _url = staticUrl + \"gethotelsbydestination?fieldsX=Hotels.MinCost,Hotels.OriginalCost\";\r\n }\r\n var reqCopy = angular.copy(req);\r\n if (notStaticSearch && qs.selectedEstabId) {\r\n var selId = parseInt(qs.selectedEstabId);\r\n if (!isNaN(selId)) {\r\n reqCopy.SelectedEstabId = selId;\r\n }\r\n }\r\n delete reqCopy.Destination;\r\n _(reqCopy.FilterCriteria).forEach(function (value, key) {\r\n if (value == null || value === false || value.length === 0) {\r\n delete reqCopy.FilterCriteria[key];\r\n }\r\n });\r\n if (isMultiDestHoliday) {\r\n // Airport Code filter from prev search causes no results\r\n reqCopy.FilterCriteria = _.omit(reqCopy.FilterCriteria, 'AirportCode');\r\n }\r\n if ($rootScope.user && $rootScope.user.Tier && TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\r\n TRPCONFIG.Domain.SkywardsTier = $rootScope.user.Tier;\r\n reqCopy.LoyaltyInfo = {\r\n SkywardsTier: $rootScope.user.Tier\r\n };\r\n }\r\n return $http.post(_url, reqCopy, {\r\n timeout: filterCanceller.promise,\r\n customErrCallback: notfound\r\n });\r\n }).then(function (response) {\r\n intermediateRes = response;\r\n intermediateRes.data.Hotels = _.map(intermediateRes.data.Hotels, function (hotel, i) {\r\n if (intermediateRes.data.Hotels && intermediateRes.data.Hotels[i].RequestedRooms && intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices) {\r\n var taxObj = {\r\n TotalAmount: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTax,\r\n CityTaxLocalAmount: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTaxLocalAmount,\r\n CurrencyCode: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTaxLocalCurrency\r\n };\r\n _.merge(hotel, { Taxation: taxObj });\r\n }\r\n return hotel;\r\n });\r\n return intermediateRes;\r\n }, function () { return intermediateRes; }).then(function (res) {\r\n if (res && res.data) {\r\n enrichData(res.data.Hotels, req.CurrencyCode, !!result[2]);\r\n if (!options.stat && res.data.Aggregates) {\r\n res.data.Aggregates = mergeFacilitiesFilters(res.data.Aggregates);\r\n //PriceRange.Min will be having only multiples of 10.\r\n res.data.Aggregates.LowestPricedHotel = res.data.Aggregates.PriceRange.Min;\r\n res.data.Aggregates.PriceRange.Max = Math.ceil(res.data.Aggregates.PriceRange.Max / 10) * 10;\r\n res.data.Aggregates.PriceRange.Min = Math.floor(res.data.Aggregates.PriceRange.Min / 10) * 10;\r\n if (res.data.Aggregates.HolidayPriceRange && res.data.Aggregates.HolidayPriceRange.Min && res.data.Aggregates.HolidayPriceRange.Max) {\r\n res.data.Aggregates.HolidayPriceRange.Min = Math.ceil(res.data.Aggregates.HolidayPriceRange.Min);\r\n res.data.Aggregates.HolidayPriceRange.Max = Math.ceil(res.data.Aggregates.HolidayPriceRange.Max);\r\n }\r\n if (!abTest.progressiveHotelSearchEnabled() && !isMultiDestHoliday) {\r\n filterUtil.copyFilterFrom('RatingRange', res.data.Aggregates);\r\n filterUtil.copyFilterFrom('PriceRange', res.data.Aggregates);\r\n filterUtil.copyFilterFrom('HolidayPriceRange', res.data.Aggregates);\r\n }\r\n //we don't currently allow filtering on each individual estab group, so squash the data\r\n res.data.Aggregates.HotelsByGroup = FilterIdUtils.createEstabGroupOptions(res.data.Aggregates.HotelsByGroup);\r\n //Add board type title to aggregates\r\n if (allBoardTypes && allBoardTypes.length > 0) {\r\n addDynamicTitleToBoardTypes(res.data.Aggregates.HotelsByBoardType, allBoardTypes);\r\n }\r\n else {\r\n addTitleToBoardTypes(res.data.Aggregates.HotelsByBoardType);\r\n }\r\n }\r\n var currentResults_1 = res.data;\r\n _setResults(currentResults_1, options.stat);\r\n //Save the aggregates in their own variable, so that they arn't lost when results is nulled out.\r\n aggregatesCache = currentResults_1.Aggregates;\r\n d.resolve(currentResults_1);\r\n if (!currentResults_1.Hotels.length && fidCheck && !options.stat) {\r\n var filteredFilter = FilterIdUtils.sanitiseFidFilters(angular.copy(filterUtil.getFilter()), angular.copy(currentResults_1.Aggregates), _defaultFilterCriteria());\r\n if (filteredFilter) {\r\n loggingService.logWarn(\"Wrong filters in fid \" + $location.search().fid);\r\n filterUtil = new FilterUtils(filteredFilter);\r\n req.FilterCriteria = getUserSelectedFilterCriteria();\r\n return get();\r\n }\r\n }\r\n var filterData = service.getFilter();\r\n if (applyDeepLinkFilter) {\r\n if (qs.boardType && !filterData.BoardTypes.includes(qs.boardType)) {\r\n filterData.BoardTypes.push(qs.boardType);\r\n }\r\n if (qs.stars && !filterData.Stars.includes(qs.stars)) {\r\n filterData.Stars.push(qs.stars);\r\n }\r\n if (qs.holidayPrice && !$location.search().hpr) {\r\n filterData.HolidayPriceRange = { Min: qs.holidayPrice.split(',')[0], Max: qs.holidayPrice.split(',')[1] };\r\n }\r\n }\r\n filterDefer.resolve(filterData);\r\n currentResults_1.Filters = filterData;\r\n currentResults_1.SortCriterion = sortCriteria.getHotelSortValueById(req.SortCriterion);\r\n _setInProgress(null, options.stat);\r\n broker.publish('hotelResultsModified', _.assign({}, currentResults_1, {\r\n searchTriggeredBy: options.searchTriggeredBy\r\n }));\r\n if (!options.ignoreTracking) {\r\n analytics.track('Event', 'HotelList', currentResults_1);\r\n tripService.getTrip($routeParams.tripId)\r\n .then(function (trip) {\r\n var tripType = trip && trip.TripType ||\r\n (_.get(searchUnitService.getDestination(), 'PageStrand') === 2 ? 4 : 2);\r\n criteoService.enqueue(currentResults_1, 'hotellist', tripType);\r\n });\r\n }\r\n var noUserClicksRank_1 = _.size(_.filter(_.get(currentResults_1, 'Hotels'), function (h) { return _.get(h, 'UserClicksRank'); }));\r\n var noRecommended_1 = _.size(_.filter(_.get(currentResults_1, 'Hotels'), function (h) { return _.get(h, 'Recommended'); }));\r\n var familyFriendlyOffered_1 = _.some(_.get(currentResults_1, 'Hotels'), function (h) { return _.includes(h.EstabGroupIds, TRPCONFIG.Domain.FamilyFriendlyEstabGroup); });\r\n var winnerOffered_1 = _.some(_.get(currentResults_1, 'Hotels'), function (h) { return _.has(h, 'HotelAward'); });\r\n setTimeout(function () {\r\n analytics.track('mixpanel', 'HotelListing', {\r\n RepeatHotelOffered: noUserClicksRank_1 > 0,\r\n TopDealsOffered: noRecommended_1 > 0,\r\n WinnerOffered: winnerOffered_1,\r\n NoRepeatHotelsOffered: noUserClicksRank_1,\r\n NoTopDealsOffered: noRecommended_1,\r\n FamilyFavouriteOffered: familyFriendlyOffered_1,\r\n IsKidsPromoEligible: !!result[2],\r\n IsJanSale: isMultiDestHoliday,\r\n estabIDArray: _.map(currentResults_1.Hotels, function (h) { return h.Id; }),\r\n ppPriceArray: _.map(currentResults_1.Hotels, function (h) { return h.MinCostPerPerson; }),\r\n TotalPriceArray: _.map(currentResults_1.Hotels, function (h) { return h.MinCost; }),\r\n SearchID: $routeParams.tripId,\r\n });\r\n });\r\n }\r\n }, function () {\r\n _setInProgress(null, options.stat);\r\n return $q.reject();\r\n });\r\n return options.stat ? inProgressStatic : inProgress;\r\n });\r\n }\r\n }\r\n function page(index) {\r\n return this.pageIndex(index)\r\n .then(function () {\r\n req.FilterCriteria = getUserSelectedFilterCriteria();\r\n return search();\r\n });\r\n }\r\n function sort(criterion) {\r\n broker.publish('searchCriteriaModified');\r\n req.FilterCriteria = getUserSelectedFilterCriteria();\r\n results = null;\r\n return preferences.setHotelSortOrder(criterion)\r\n .then(function (fidCheck) { return search({\r\n fidCheck: fidCheck,\r\n refreshRankingScores: true,\r\n searchTriggeredBy: 'sort'\r\n }); });\r\n }\r\n function filter() {\r\n filterCanceller && filterCanceller.resolve();\r\n broker.publish('searchCriteriaModified');\r\n req.FilterCriteria = getUserSelectedFilterCriteria();\r\n _trackHotelName(_.get(req.FilterCriteria, 'HotelName'));\r\n results = null;\r\n return pageIndex(0)\r\n .then(function () { return search({\r\n refreshRankingScores: true,\r\n searchTriggeredBy: 'filter'\r\n }); });\r\n }\r\n function initialise(baseUrl) {\r\n url = baseUrl;\r\n }\r\n function getAvailabilityRequest() {\r\n return req;\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n function getBoardTypesUrl() {\r\n return boardTypesUrl;\r\n }\r\n function clearSearchResults(setDefaultCriteria, setPostsCountByCountryId) {\r\n var qs = $location.search();\r\n filterUtil = new FilterUtils(setDefaultCriteria ? _defaultFilterCriteria() : _initialFilterCriteria());\r\n filterDefer = $q.defer();\r\n req.Paging.Index = qs.pi || 0;\r\n req.Paging.Size = setPostsCountByCountryId ? 12 : 8;\r\n results = null;\r\n return this;\r\n }\r\n function getSearchResults(searchId, options) {\r\n var qs = $location.search();\r\n if (results && searchId === results.AvailabilitySearchId) {\r\n broker.publish('hotelResultsRetrieved', results);\r\n return $q.when(results);\r\n }\r\n //we don't want to clear filters at this point, but need to clear the page index and results\r\n req.Paging.Index = qs.pi || 0;\r\n results = null;\r\n if (creatingSearch == null) {\r\n req.AvailabilitySearchId = searchId;\r\n }\r\n req.FilterCriteria = getUserSelectedFilterCriteria();\r\n return adjustingInProgress.then(function () { return search({\r\n ignoreTracking: !!_.get(options, 'ignoreTracking'),\r\n refreshRankingScores: true\r\n }); });\r\n }\r\n function getStaticSearchResults() {\r\n var qs = $location.search();\r\n //we don't want to clear filters at this point, but need to clear the page index and results\r\n req.Paging.Index = qs.pi || 0;\r\n return search({\r\n stat: true\r\n });\r\n }\r\n function createMultiDestHolidaySearch(basketId, variant) {\r\n var Domain = (TRPCONFIG || {}).Domain;\r\n return $http.post('/api/holidays/createjansalesearch', {\r\n BasketId: basketId,\r\n DomainId: Domain.DomainId,\r\n CultureCode: Domain.CultureCode,\r\n CurrencyCode: Domain.CurrencyCode,\r\n Variant: variant\r\n })\r\n .then(function (res) { return res && res.data; });\r\n }\r\n function getTripForSelectedMultiDestHoliday(tripId, hotel) {\r\n return tripService.getTrip(tripId)\r\n .then(function (trip) {\r\n var linkedFlight = hotel.LinkedFlight;\r\n var flightsRequest = _.find(trip.MultiDestinationFlightRequests, function (r) { return r.AvailabilitySearchId === hotel.LinkedFlight.FlightSearchId; });\r\n var newTripId = guidService.uuid();\r\n // Update trip with linked flight details\r\n flightsRequest.SelectedDepartureAirport = {\r\n Code: linkedFlight.OutboundLeg.DepartureAirport\r\n };\r\n flightsRequest.SelectedDestinationAirport = {\r\n Code: linkedFlight.InboundLeg.DepartureAirport\r\n };\r\n var newTrip = Object.assign(trip, {\r\n TripId: newTripId,\r\n FlightsRequest: flightsRequest\r\n });\r\n return destinationService.getDetails({ Id: hotel.Id, Type: 1 })\r\n .then(function (dest) { return newTrip.HotelsRequest.Destination = dest; })\r\n .then(function () { return tripService.persist(newTripId, newTrip); })\r\n .then(function () { return newTripId; });\r\n });\r\n }\r\n function getFlightMiles(origin, destination, cabinCode, journeyType) {\r\n return flightDetail.flightmiles(origin, destination, cabinCode, journeyType).then(function (details) {\r\n return JSON.parse(details);\r\n });\r\n }\r\n function getFlightDetailsForSelectedMultiDestHoliday(tripId, hotel) {\r\n var linkedFlight = hotel.LinkedFlight;\r\n return flightDetail.getFlightDetails(tripId, {\r\n AvailabilitySearchId: linkedFlight.FlightSearchId,\r\n FlightId: linkedFlight.FlightId,\r\n IncludeSeatPlan: TRPCONFIG.DeviceSettings.SeatPlanEnabled,\r\n MultiSector: false\r\n }).then(function (details) {\r\n var flight = details.Itinerary;\r\n if (flight) {\r\n flight.FlightId = linkedFlight.FlightId; // See holidaySearchCtrl.js\r\n flight.DetailsId = details.DetailsId;\r\n flight.isMultiDestHolidayLinked = true;\r\n }\r\n return flight;\r\n });\r\n }\r\n function getFilter() {\r\n return filterUtil.getFilter();\r\n }\r\n function getFilterLazy() {\r\n return filterDefer.promise;\r\n }\r\n function getSortCriteria() {\r\n return sortCriteriaDef;\r\n }\r\n function getSortCriterionDescription() {\r\n return preferences.getHotelSortOrder().then(function (so) {\r\n var i = arrayUtil.indexOf(sortCriteriaDef, function (c) {\r\n return c.val === so || (angular.isArray(c.val) && c.val.indexOf(so) !== -1);\r\n });\r\n return sortCriteriaDef[i].name();\r\n });\r\n }\r\n function fetchAllBoardTypes() {\r\n return $http.get(boardTypesUrl + \"get\");\r\n }\r\n function addDynamicTitleToBoardTypes(boardTypes, allBoardTypes) {\r\n var newBoardTypeStrings = [];\r\n newBoardTypeStrings = allBoardTypes;\r\n var _loop_4 = function (p) {\r\n var boardDetails = newBoardTypeStrings.find(function (board) { return board.Id.toString() === p; });\r\n boardTypes[p].Title = boardDetails.Title ? boardDetails.Title : '';\r\n };\r\n for (var p in boardTypes) {\r\n _loop_4(p);\r\n }\r\n }\r\n function addTitleToBoardTypes(boardTypes) {\r\n var boardTypeStrings = {\r\n 1: 'ROOMONLY',\r\n 2: 'BEDANDBREAKFAST',\r\n 3: 'HALFBOARD',\r\n 4: 'FULLBOARD',\r\n 5: 'ALLINCLUSIVE',\r\n 6: 'SELFCATERING',\r\n };\r\n for (var p in boardTypes) {\r\n boardTypes[p].Title = resourceService.getDeferred(boardTypeStrings[p])();\r\n }\r\n }\r\n function getPromotionTerms() {\r\n return $http.get(\"/api/hotels/pricing/promotionterms?domainId=\" + TRPCONFIG.Domain.DomainId)\r\n .then(function (res) { return res.data; });\r\n }\r\n function _trackHotelName(name) {\r\n if (name) {\r\n analytics.track('mixpanel', 'HotelNameFilter');\r\n }\r\n }\r\n function getMandatoryExtra(hotel) {\r\n var hasMandatoryExtras = false;\r\n if (domain.MandatoryExtrasEnabled) {\r\n if (hotel && hotel.RequestedRooms && hotel.RequestedRooms.length > 0) {\r\n hotel.RequestedRooms[0].BoardTypeMinPrices.map(function (room) {\r\n var roomWithMandatoryExtras = room.IncludedExtras && room.IncludedExtras.find(function (el) { return el.ExtraTypeId === '2'; });\r\n return roomWithMandatoryExtras ? hasMandatoryExtras = true : null;\r\n });\r\n }\r\n }\r\n return hasMandatoryExtras;\r\n }\r\n function getMaldivesIsMandatory(hotel) {\r\n var h = hotel;\r\n if (h.RequestedRooms && h.RequestedRooms[0].BoardTypeMinPrices && h.RequestedRooms[0].BoardTypeMinPrices[0].IncludedExtras\r\n && h.RequestedRooms[0].BoardTypeMinPrices[0].IncludedExtras.length > 0) {\r\n if (h.RequestedRooms[0].Availability[0] && h.RequestedRooms[0].Availability[0].BoardOptions &&\r\n h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras && h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras.length > 0) {\r\n return h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras[0].IsMandatory &&\r\n domain.IncludeMandatoryExtrasBookedItem &&\r\n domain.IncludeMandatoryExtrasInHolidaysPrice;\r\n }\r\n }\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('hotelSearchValidator', hotelSearchValidator);\r\n function hotelSearchValidator(resourceService, dateUtil, occupancyService) {\r\n var domain = TRPCONFIG.Domain;\r\n var service = {\r\n validateTimeOfDay: validateTimeOfDay,\r\n validate: validate\r\n };\r\n function dateFromRegexMatch(match) {\r\n var now = new Date();\r\n return match ? new Date(now.getFullYear(), now.getMonth(), now.getDate(), match[1], match[2]) : null;\r\n }\r\n function matchFromConfigString(cfg) {\r\n return /^([0-9]{2}):([0-9]{2})$/.exec(cfg);\r\n }\r\n var dateFromConfig = _.flowRight(dateFromRegexMatch, matchFromConfigString);\r\n function validateTimeOfDay(departureDate) {\r\n var now = new Date();\r\n var msg = null;\r\n if (dateUtil.sameDay(now, departureDate)) {\r\n var start = dateFromConfig(domain.SameDaySearchStart);\r\n var end = dateFromConfig(domain.SameDaySearchEnd);\r\n if (start && end) {\r\n if (now > end || now < start) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGOUTOFRANGE'), domain.SameDaySearchStart, domain.SameDaySearchEnd);\r\n }\r\n }\r\n else if (start) {\r\n if (now < start) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGTOEARLY'), domain.SameDaySearchStart);\r\n }\r\n }\r\n else if (end) {\r\n if (now > end) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGTOLATE'), domain.SameDaySearchEnd);\r\n }\r\n }\r\n }\r\n return msg;\r\n }\r\n function validate(destination, departureDate, returnDate, searchArea, occupancy) {\r\n var errors = [];\r\n if (_.isEmpty(destination) && searchArea == null) {\r\n errors.push(resourceService.get('SELECTDESTINATION'));\r\n }\r\n if (destination && destination.Searchable === false) {\r\n errors.push(String.format(resourceService.get('NONSEARCHABLE'), destination.Title));\r\n }\r\n if (departureDate == null) {\r\n errors.push(resourceService.get('SELECTCHECKIN'));\r\n }\r\n else {\r\n var timeValidation = service.validateTimeOfDay(departureDate);\r\n if (timeValidation) {\r\n errors.push(timeValidation);\r\n }\r\n var now = new Date();\r\n var zNow = dateUtil.zeroTime(now).getTime();\r\n var zDep = dateUtil.zeroTime(departureDate).getTime();\r\n if (zDep < zNow) {\r\n errors.push(resourceService.get('CHECKINCANNOTBEPAST'));\r\n }\r\n }\r\n if (returnDate == null) {\r\n errors.push(resourceService.get('SELECTCHECKOUT'));\r\n }\r\n if (returnDate != null && departureDate != null && returnDate <= departureDate) {\r\n errors.push(resourceService.get('CHECKOUTAFTERCHECKIN'));\r\n }\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('hotelsSitemap', hotelsSitemap);\r\n function hotelsSitemap($location, searchUnitService, fieldGroupService, destinationService, $http) {\r\n var service = {\r\n getHotels: getHotels,\r\n getSize: getSize\r\n };\r\n var domain = TRPCONFIG.Domain;\r\n var req = {\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId,\r\n CurrencyCode: searchUnitService.getCurrency(),\r\n Paging: {\r\n Index: 0,\r\n Size: 100\r\n },\r\n IncludeAggregates: true\r\n };\r\n var fieldType = fieldGroupService.getFieldTypes();\r\n var staticSearchFlags = [\r\n fieldType.Global,\r\n fieldType.Titles,\r\n fieldType.IndicativePrice,\r\n fieldType.ReviewSnippets,\r\n fieldType.Url,\r\n fieldType.Summary,\r\n fieldType.Recommendations,\r\n fieldType.EstabGroupIds,\r\n fieldType.HotelAwards\r\n ];\r\n function getHotels(path, pageNum) {\r\n var _url = '/api/hotels/static/gethotelsbydestination';\r\n return destinationService.fromUrl(path)\r\n .then(function (data) {\r\n req.Paging.Index = pageNum !== undefined ? pageNum : 0;\r\n req.DestinationId = data.LegacyId;\r\n req.DestinationType = data.LegacyType;\r\n req.PageStrand = data.PageStrand;\r\n req.FieldFlags = fieldGroupService.getFieldGroup(staticSearchFlags);\r\n return req;\r\n })\r\n .then(function (req) {\r\n return $http.post(_url, req)\r\n .then(function (res) {\r\n return res.data;\r\n });\r\n });\r\n }\r\n function getSize() {\r\n return req.Paging.Size;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var InsuranceSearchValidator = /** @class */ (function () {\r\n function InsuranceSearchValidator(resourceService, dateUtil) {\r\n this.resourceService = resourceService;\r\n this.dateUtil = dateUtil;\r\n }\r\n InsuranceSearchValidator.prototype.validate = function (policyType, travelDestination, startDate, endDate, occupancy) {\r\n var errors = [];\r\n if (policyType == null) {\r\n errors.push(this.resourceService.get('SELECTPOLICYTYPE'));\r\n }\r\n if (travelDestination == null) {\r\n errors.push(this.resourceService.get('SELECTTRAVELDESTINATION'));\r\n }\r\n if (startDate == null) {\r\n errors.push(this.resourceService.get('SELECTSTARTDATE'));\r\n }\r\n if (endDate == null) {\r\n errors.push(this.resourceService.get('SELECTENDDATE'));\r\n }\r\n else if (endDate <= startDate) {\r\n errors.push(this.resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\r\n }\r\n if (startDate && endDate &&\r\n this.dateUtil.compareDates(endDate, this.dateUtil.addDays(startDate, 365, true)) === 1) {\r\n errors.push(this.resourceService.get('RETURNDATEWITHINONEYEAR'));\r\n }\r\n /* It has been said that breaking nested loops with labels is the worst way to break loops\r\n except all the others that have been tried. ~MV */\r\n /* eslint-disable no-labels */\r\n childOccupancyLoop: for (var ca = occupancy.ChildAges.length - 1; ca >= 0; ca--) {\r\n if (occupancy.ChildAges[ca] == null) {\r\n errors.push(this.resourceService.get('CHILDAGESERROR'));\r\n break childOccupancyLoop;\r\n }\r\n }\r\n adultOccupancyLoop: for (var i = occupancy.AdultAges.length - 1; i >= 0; i--) {\r\n if (occupancy.AdultAges[i] == null) {\r\n errors.push(this.resourceService.get('ADULTAGESERROR'));\r\n break adultOccupancyLoop;\r\n }\r\n }\r\n /* eslint-enable no-labels */\r\n return errors;\r\n };\r\n return InsuranceSearchValidator;\r\n }());\r\n TR.InsuranceSearchValidator = InsuranceSearchValidator;\r\n angular\r\n .module('TR')\r\n .service('insuranceSearchValidator', InsuranceSearchValidator);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('mandatoryTransferService', mandatoryTransferService);\r\n function mandatoryTransferService($filter) {\r\n var service = {\r\n generateMandatoryOptions: generateMandatoryOptions,\r\n addFlightDetails: addFlightDetails,\r\n getTransfers: getTransfers,\r\n findSelectedTransfer: findSelectedTransfer,\r\n generateOptionId: generateOptionId,\r\n getRoomsWithTransfers: getRoomsWithTransfers,\r\n generateOptionsForMultiRooms: generateOptionsForMultiRooms,\r\n getOptions: getOptions,\r\n addDeltas: addDeltas,\r\n getSelectedPrices: getSelectedPrices,\r\n getSelectedTransfers: getSelectedTransfers,\r\n getHolidayRoomsWithTransfers: getHolidayRoomsWithTransfers,\r\n getBookedTransfersPrice: getBookedTransfersPrice\r\n };\r\n var FlightDetails;\r\n var Options;\r\n var mandatoryTransferTypeId = 23;\r\n function generateMandatoryOptions(roomId, flightDetails) {\r\n FlightDetails = flightDetails;\r\n Options = flightDetails.options || [{ OptionId: generateOptionId(roomId, flightDetails.transfer.HotelExtraId, flightDetails.transfer.HotelExtraOptionId) }];\r\n }\r\n function addFlightDetails(connectingFlight) {\r\n var fd = FlightDetails;\r\n var cf = connectingFlight;\r\n if (fd && cf && cf.InboundDate && cf.OutboundDate) {\r\n cf.InboundDate = _setTime(cf.InboundDate, fd.departureTime.hours, fd.departureTime.minutes);\r\n cf.OutboundDate = _setTime(cf.OutboundDate, fd.arrivalTime.hours, fd.arrivalTime.minutes);\r\n cf.InboundFlightNumber = fd.inboundFlightNum;\r\n cf.OutboundFlightNumber = fd.outboundFlightNum;\r\n }\r\n return cf;\r\n }\r\n function getTransfers(extras) {\r\n if (extras === void 0) { extras = []; }\r\n var transfers = [];\r\n extras && extras.forEach(function (item) {\r\n if (item && item.IsMandatory && item.HotelExtraTypeId === '2') {\r\n var HotelExtraId_1 = item.HotelExtraId;\r\n var options = item.Options || [];\r\n if (options.length > 0) {\r\n options.forEach(function (value) {\r\n value.HotelExtraId = HotelExtraId_1;\r\n transfers.push(value);\r\n });\r\n }\r\n }\r\n });\r\n return transfers;\r\n }\r\n function findSelectedTransfer(transfers, includedExtras) {\r\n if (transfers === void 0) { transfers = []; }\r\n if (includedExtras === void 0) { includedExtras = []; }\r\n var transfer;\r\n var includedTransfer;\r\n includedExtras.forEach(function (inclExt) {\r\n if (inclExt && inclExt.ExtraTypeId === '2') {\r\n includedTransfer = inclExt;\r\n }\r\n });\r\n transfers.forEach(function (item) {\r\n if (includedTransfer && item && Math.round(includedTransfer.ClientPrice) === Math.round(item.GrossCost)\r\n && includedTransfer.Title === item.Title) {\r\n transfer = item;\r\n }\r\n });\r\n return transfer;\r\n }\r\n function getRoomsWithTransfers(hotel, roomGridData, selectedPrices) {\r\n var selectedRooms = [];\r\n var _loop_5 = function (i) {\r\n var selectedRoom = (hotel.Rooms[i].FilteredAvailability || hotel.Rooms[i].Availability)\r\n .find(function (item) { return item.Id === selectedPrices[\"id\" + i]; });\r\n selectedRoom = selectedRoom.BoardOptions.find(function (item) { return item.Id === selectedPrices[\"id\" + i]; });\r\n selectedRoom.roomId = roomGridData[i].Id;\r\n selectedRoom.roomNumber = roomGridData[i].Id.match(/\\d+/)[0];\r\n selectedRoom.roomTitle = \"Room \" + (parseInt(selectedRoom.roomNumber) + 1);\r\n selectedRoom.nonInfants = roomGridData[i].nonInfants;\r\n selectedRoom.mandatoryTransfers = getTransfers(selectedRoom.Extras) || [];\r\n if (selectedRoom.mandatoryTransfers.length > 0) {\r\n selectedRooms.push(selectedRoom);\r\n }\r\n };\r\n for (var i = 0; i < hotel.Rooms.length; i++) {\r\n _loop_5(i);\r\n }\r\n return selectedRooms;\r\n }\r\n function getHolidayRoomsWithTransfers(hotel) {\r\n var selectedRooms = [];\r\n if (hotel.BookedItems) {\r\n for (var i = 0; i < hotel.BookedItems.length; i++) {\r\n var includedTransfer = getTransfers(hotel.AvailableExtrasPerRoom[i]);\r\n if (hotel.BookedItems[i] && Object.keys(includedTransfer).length !== 0) {\r\n var roomWithTransfer = Object.assign(hotel.BookedItems[i]);\r\n roomWithTransfer.roomNumber = \"id\" + i;\r\n roomWithTransfer.roomTitle = \"Room \" + (i + 1);\r\n roomWithTransfer.nonInfants = roomWithTransfer.Adults;\r\n roomWithTransfer.mandatoryTransfers = includedTransfer;\r\n selectedRooms.push(roomWithTransfer);\r\n }\r\n }\r\n }\r\n return selectedRooms;\r\n }\r\n function generateOptionId(roomNumberId, HotelExtraId, HotelExtraOptionId) {\r\n if (roomNumberId === void 0) { roomNumberId = '0id'; }\r\n var hotelExtra = 'HotelExtra';\r\n var roomNumberIdPrefix = 'id';\r\n var roomNumber = +roomNumberId.split(roomNumberIdPrefix).pop();\r\n return hotelExtra + \"|\" + roomNumber + \"|\" + HotelExtraId + \"|\" + HotelExtraOptionId;\r\n }\r\n function generateOptionsForMultiRooms(flightDetails, rooms) {\r\n if (rooms === void 0) { rooms = []; }\r\n var options = [];\r\n for (var i = 0; i < rooms.length; i++) {\r\n var option = {};\r\n var hotelExtraId = flightDetails && flightDetails.transfers && flightDetails.transfers[i] && flightDetails.transfers[i].HotelExtraId;\r\n var hotelExtraOptionId = flightDetails && flightDetails.transfers && flightDetails.transfers[i] && flightDetails.transfers[i].HotelExtraOptionId;\r\n option.OptionId = generateOptionId(rooms[i].roomNumber, hotelExtraId, hotelExtraOptionId);\r\n options.push(option);\r\n }\r\n return options;\r\n }\r\n function getOptions() {\r\n return Options;\r\n }\r\n function addDeltas(transfers, cheapestTransfer) {\r\n return transfers.map(function (t) {\r\n t.deltaPrice = t.GrossCost - cheapestTransfer.GrossCost;\r\n return t;\r\n });\r\n }\r\n function _setTime(date, hours, minutes) {\r\n date = new Date(date);\r\n date.setMinutes(minutes);\r\n date.setHours(hours);\r\n return $filter('date')(date, 'yyyy-MM-ddTHH:mm:ss');\r\n }\r\n function getSelectedPrices(hotelData, bookedHotelData) {\r\n var selectedPrices = {};\r\n if (hotelData.Rooms) {\r\n var _loop_6 = function (i) {\r\n var roomDescription = bookedHotelData.Details.BookedItems[i].RoomDescription;\r\n if (hotelData.Rooms && hotelData.Rooms.length > 0) {\r\n hotelData.Rooms[i].Availability.map(function (room) {\r\n if (room.RoomDescription === roomDescription) {\r\n selectedPrices[\"id\" + i] = room.Id;\r\n }\r\n return selectedPrices;\r\n });\r\n }\r\n };\r\n for (var i = 0; i < hotelData.Rooms.length; i++) {\r\n _loop_6(i);\r\n }\r\n }\r\n return selectedPrices;\r\n }\r\n function getSelectedTransfers(hotel, rooms) {\r\n var bookedTransfers = [];\r\n hotel.CostBreakdown.map(function (item) {\r\n if (item.TypeId === mandatoryTransferTypeId) {\r\n bookedTransfers.push(item);\r\n }\r\n return bookedTransfers;\r\n });\r\n var _loop_7 = function (i) {\r\n bookedTransfers[i] = rooms[i].mandatoryTransfers.find(function (item) { return item.GrossCost === bookedTransfers[i].UnitAmount; });\r\n };\r\n for (var i = 0; i < bookedTransfers.length; i++) {\r\n _loop_7(i);\r\n }\r\n return bookedTransfers;\r\n }\r\n function getBookedTransfersPrice(costBreakdown) {\r\n var transfersCost = 0;\r\n costBreakdown && costBreakdown.map(function (item) {\r\n if (item.TypeId === mandatoryTransferTypeId) {\r\n transfersCost += item.UnitAmount;\r\n }\r\n return transfersCost;\r\n });\r\n return transfersCost;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('marhabaService', marhabaService);\r\n function marhabaService(searchUnitService, occupancyService, $http) {\r\n var url = '/api2/marhaba/';\r\n var promiseCache = {};\r\n var service = {\r\n getProductDetails: getProductDetails,\r\n rehydrate: rehydrate,\r\n getMarhabaEnabledTerminals: getMarhabaEnabledTerminals,\r\n sort: sortMarhabaResults,\r\n filter: filterMarhabaResults,\r\n adjustMarhabaOptions: adjustMarhabaOptions\r\n };\r\n function getProductDetails(searchId, productId) {\r\n return $http.post(url + \"details/get\", { AvailabilitySearchId: searchId, MarhabaQuoteId: productId }).then(function (res) {\r\n return res.data;\r\n });\r\n }\r\n function rehydrate(productId, searchId) {\r\n if (promiseCache[productId + searchId]) {\r\n return promiseCache[productId + searchId];\r\n }\r\n promiseCache[productId + searchId] = $http.post(url + \"details/getfromsession\", { DetailsSearchId: searchId }).then(function (res) {\r\n var details = res.data || {};\r\n var occupancy = occupancyService.reduceOccupancy();\r\n var validChildren = occupancy.ChildAges.filter(function (el) { return el >= 2; }).length;\r\n details.Date = searchUnitService.startDate(searchUnitService.marhaba);\r\n details.Terminal = searchUnitService.getTerminal();\r\n details.maxElements = occupancy.Adults + validChildren;\r\n return details;\r\n });\r\n return promiseCache[productId + searchId];\r\n }\r\n function getMarhabaEnabledTerminals(airports) {\r\n return $http.post(url + \"terminals/getforairports\", { CultureCode: TRPCONFIG.Domain.CultureCode, Airports: airports });\r\n }\r\n function sortMarhabaResults(a, b) {\r\n var type = a.Type > b.Type ? 1 : a.Type < b.Type ? -1 : 0;\r\n var price = a.AdultPrice > b.AdultPrice ? 1 : a.AdultPrice < b.AdultPrice ? -1 : 0;\r\n var name = sortMarhabaResultsName(a, b);\r\n return type || price || name;\r\n }\r\n function sortMarhabaResultsName(a, b) {\r\n var name = a.Name > b.Name ? 1 : a.Name < b.Name ? -1 : 0;\r\n return name;\r\n }\r\n function filterMarhabaResults(item) {\r\n var isLounge = item.Type === 5;\r\n var isFree = item.AdultPrice === 0;\r\n if (!isLounge || (isLounge && !isFree)) {\r\n return item;\r\n }\r\n }\r\n function adjustMarhabaOptions(productInfo, defaultChauffeurName) {\r\n var result = {};\r\n if (productInfo.Details.AvailableOptions.length === 0) {\r\n result.noOptions = true;\r\n }\r\n else {\r\n productInfo.Details.AvailableOptions\r\n .sort(sortMarhabaResults)\r\n .filter(filterMarhabaResults)\r\n .forEach(function (p) {\r\n switch (p.Type) {\r\n case 3:\r\n result.auxillaryProducts = result.auxillaryProducts || [];\r\n result.auxillaryProducts.push(p);\r\n break;\r\n case 4:\r\n p.Num = 0;\r\n result.chauffeurs = result.chauffeurs || [];\r\n result.chauffeurs.push(p);\r\n break;\r\n case 5:\r\n result.lounges = result.lounges || [];\r\n result.lounges.push(p);\r\n }\r\n });\r\n if (result.chauffeurs && result.chauffeurs.length > 0) {\r\n result.chauffeurs.sort(sortMarhabaResultsName);\r\n result.chauffeurs.unshift({ Id: 0, Name: defaultChauffeurName });\r\n result.selectedChauffeur = result.chauffeurs[0];\r\n }\r\n }\r\n return result;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('marhabaSearch', marhabaSearch);\r\n function marhabaSearch(marhabaSearchValidator, searchUnitService, occupancyService, $http, $q, tripService, analytics) {\r\n var url = '/api2/marhaba/';\r\n var domain = TRPCONFIG.Domain;\r\n var req = {\r\n CultureCode: domain.CultureCode,\r\n CurrencyCode: domain.CurrencyCode,\r\n DomainId: domain.DomainId\r\n };\r\n var inProgress;\r\n var results;\r\n var service = {\r\n clearSearchResults: clearSearchResults,\r\n getSearchResults: getSearchResults,\r\n search: search,\r\n validateSearchCriteria: validateSearchCriteria\r\n };\r\n function _doRequest(request, newSearch) {\r\n var simpleRequest = {\r\n AvailabilitySearchId: request.AvailabilitySearchId,\r\n CultureCode: request.CultureCode,\r\n CurrencyCode: request.CurrencyCode,\r\n DomainId: request.DomainId,\r\n TerminalId: request.Terminal.Id,\r\n FlightType: searchUnitService.getMarhabaFlightType(request.FlightType.Id),\r\n AirportCode: request.Airport.Code,\r\n DateAndTime: request.DateAndTime,\r\n Occupancy: request.Occupancy,\r\n StaffRates: request.StaffRates\r\n };\r\n return newSearch ?\r\n $http.post(url + \"availability/get\", simpleRequest) :\r\n $http.post(url + \"availability/getfromsession\", { AvailabilitySearchId: request.AvailabilitySearchId });\r\n }\r\n function _childrenAndInfants(childAges) {\r\n var numberOf = {};\r\n numberOf.children = 0;\r\n numberOf.infants = 0;\r\n for (var i = childAges.length - 1; i >= 0; i--) {\r\n if (childAges[i] <= 2) {\r\n numberOf.infants++;\r\n }\r\n else {\r\n numberOf.children++;\r\n }\r\n }\r\n return numberOf;\r\n }\r\n function _obtainSearchParameters() {\r\n req.Terminal = searchUnitService.getTerminal();\r\n req.FlightType = searchUnitService.getFlightType();\r\n req.Airport = searchUnitService.getMarhabaAirport();\r\n req.DateAndTime = searchUnitService.startDate(searchUnitService.marhaba);\r\n var occupancy = occupancyService.reduceOccupancy();\r\n var kiddos = _childrenAndInfants(occupancy.ChildAges);\r\n req.Occupancy = { Adults: occupancy.Adults, Children: kiddos.children, Infants: kiddos.infants, ChildAges: occupancy.ChildAges }; //occupancyService.getOccupancy();\r\n req.StaffRates = searchUnitService.getStaffRates();\r\n }\r\n function _search(newSearch) {\r\n if (inProgress) {\r\n return inProgress;\r\n }\r\n inProgress = _doRequest(req, newSearch)\r\n .then(function (res) {\r\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\r\n results = res.data;\r\n inProgress = null;\r\n return results;\r\n }, function () {\r\n inProgress = null;\r\n results = null;\r\n });\r\n return inProgress;\r\n }\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n function getSearchResults(searchId, trip) {\r\n return (results && results !== 'null') ? $q.when(results) : service.search({ searchId: searchId, trip: trip });\r\n }\r\n function search(args) {\r\n req.AvailabilitySearchId = args.searchId;\r\n // programmatically defined parameter\r\n if (args.parameters) {\r\n angular.extend(req, args.parameters);\r\n }\r\n else if (!args.parameters) {\r\n if (args.trip) {\r\n searchUnitService.restoreMarhabaSearch(args.trip);\r\n }\r\n _obtainSearchParameters();\r\n }\r\n if (args.newSearch) {\r\n analytics.track('mixpanel', 'Search', _.extend({}, req, { TypeTitle: 'Marhaba' }));\r\n tripService.recordMarhabaSearch(args.tripId, _.mapValues(req, function (v, k) { return k === 'FlightType' ? v.Id : v; }));\r\n }\r\n return _search(args.newSearch);\r\n }\r\n function validateSearchCriteria(parameters) {\r\n if (parameters) {\r\n return marhabaSearchValidator.validate(parameters.Terminal, parameters.AirportCode, parameters.DateAndTime, parameters.Occupancy);\r\n }\r\n return marhabaSearchValidator.validate(searchUnitService.getTerminal(), searchUnitService.getMarhabaAirport(), searchUnitService.startDate(searchUnitService.marhaba), occupancyService.getOccupancy()[0]);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('marhabaSearchValidator', marhabaSearchValidator);\r\n function marhabaSearchValidator(resourceService, dateUtil, occupancyService) {\r\n var service = {\r\n validate: validate\r\n };\r\n function validate(terminal, airport, date, occupancy) {\r\n var errors = [];\r\n var maxPassengers = 9;\r\n if (!terminal || terminal.Id === 0) {\r\n errors.push(resourceService.get('VALIDATESELECTTERMINAL'));\r\n }\r\n if (!airport) {\r\n errors.push(resourceService.get('VALIDATESELECTAIRPORT'));\r\n }\r\n if (occupancy.Adults + occupancy.ChildAges.length > maxPassengers) {\r\n errors.push(String.format(resourceService.get('TOOMANYTRANSFERPASSENGERS'), maxPassengers));\r\n }\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n if (!dateUtil.atLeastTwoDaysInTheFuture(date)) {\r\n errors.push(resourceService.get('VALIDATETWODAYSINTHEFUTURE'));\r\n }\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('multiSectorSearch', multiSectorSearch);\r\n function multiSectorSearch($http, occupancyService, tripService, multiSectorSearchValidator) {\r\n var url = 'website/flights/';\r\n var cache = {};\r\n var service = { search: search, validateSearchCriteria: validateSearchCriteria, getSearchResults: getSearchResults, filter: filter };\r\n function search(tripId, params) {\r\n var legs = params.legs;\r\n var occupancy = occupancyService.getOccupancy()[0];\r\n var req = {\r\n Adults: occupancy.Adults,\r\n AvailabilitySearchId: tripId,\r\n ChildAges: occupancy.ChildAges,\r\n Destination: {},\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FlightRoutes: legs.map(function (leg) { return ({\r\n DepartureDate: leg.DepartureDate,\r\n DepartureAirport: leg.DepartureAirport.Code,\r\n DestinationAirport: leg.DestinationAirport.Code,\r\n Cabin: leg.Cabin\r\n }); })\r\n };\r\n tripService.recordMultiFlightSearch(tripId, req);\r\n var prom = $http.post(url + \"multisectorsearch\", req)\r\n .then(function (res) { return res.data; });\r\n cache[tripId] = prom;\r\n return prom;\r\n }\r\n function validateSearchCriteria(params) {\r\n return multiSectorSearchValidator.validate(params.legs);\r\n }\r\n function getSearchResults(tripId, AvailabilitySearchId) {\r\n if (tripId in cache) {\r\n return cache[tripId];\r\n }\r\n var prom = filter(AvailabilitySearchId);\r\n cache[tripId] = prom;\r\n return prom;\r\n }\r\n function filter(availabilitySearchId, filters) {\r\n var req = {\r\n AvailabilitySearchId: availabilitySearchId,\r\n MultiSectorFilterCriteria: {\r\n SectorIdentifiers: filters\r\n }\r\n };\r\n return $http.post(url + \"multisectorsearchfromsession\", req)\r\n .then(function (res) { return res.data; });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('multiSectorSearchValidator', multiSectorSearchValidator);\r\n function multiSectorSearchValidator(dateUtil) {\r\n var service = {\r\n validate: validate\r\n };\r\n function validate(legs) {\r\n var errors = [];\r\n var minLegs = 2;\r\n var maxLegs = 8;\r\n var minDiffDate = 1;\r\n if (legs.length < minLegs) {\r\n errors.push('Not enough legs');\r\n }\r\n else if (legs.length > maxLegs) {\r\n errors.push('Too many legs');\r\n }\r\n legs.forEach(function (leg, i) {\r\n [leg.DepartureAirport, leg.DestinationAirport].forEach(function (airport, j) {\r\n if (airport == null || typeof airport !== 'object' || !airport.Code) {\r\n errors.push(\"Leg \" + (i + 1) + \": Please select a \" + (j ? 'destination' : 'departure') + \" airport\");\r\n }\r\n else if (airport.Code.indexOf(',') !== -1) {\r\n errors.push(\"Leg \" + (i + 1) + \": Group airports are not supported\");\r\n }\r\n });\r\n if (i !== 0) {\r\n var date1 = dateUtil.parseDate(legs[i - 1].DepartureDate);\r\n var date2 = dateUtil.parseDate(leg.DepartureDate);\r\n var diff = dateUtil.getDifferenceInDays(date1, date2);\r\n if (diff < minDiffDate) {\r\n errors.push('Flights must happen at least 1 day apart.');\r\n }\r\n }\r\n });\r\n return errors;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('pageStrand', pageStrand);\r\n function pageStrand(urlUtils, $route) {\r\n var ps = {\r\n Hotel: 1,\r\n Holiday: 2,\r\n Any: 3,\r\n Flight: 5\r\n };\r\n var strandToRoute = {\r\n 1: 'hotels',\r\n 2: 'holidays'\r\n };\r\n function adjustUrlV2(url, strand) {\r\n var parsed = urlUtils.parseIdBasedUrls(url);\r\n var matches = parsed.idPart.match(/(\\d+-\\d+)-?(\\d+)?/) || [];\r\n //if the strand param is 1, remove it\r\n if (strand === ps.Holiday) {\r\n return matches[1] + \"/\" + parsed.urlText;\r\n }\r\n //if the strand param is absent or something other than 1, add 1 or replace it with 1\r\n return matches[1] + \"-1/\" + parsed.urlText;\r\n }\r\n return {\r\n get: function (name) {\r\n return ps[name];\r\n },\r\n opposite: function (strand) {\r\n return strand === ps.Hotel ? ps.Holiday : ps.Hotel;\r\n },\r\n adjustUrl: function (url, strand) {\r\n if (TRPCONFIG.Domain.UseIdBasedHotelUrls) {\r\n return adjustUrlV2(url, strand);\r\n }\r\n var parsed = urlUtils.parse(url);\r\n if (strand === ps.Holiday) {\r\n parsed.qs.tm = 1;\r\n }\r\n else {\r\n delete parsed.qs.tm;\r\n }\r\n return urlUtils.format(parsed);\r\n },\r\n toRoute: function (strand) {\r\n return strandToRoute[strand] || 'hotels';\r\n },\r\n fromRoute: function (dest) {\r\n switch ($route.current && $route.current.area) {\r\n case 'hotels':\r\n return ps.Hotel;\r\n case 'holidays':\r\n return ps.Holiday;\r\n case 'flights':\r\n return ps.Flight;\r\n default:\r\n return dest && dest.PageStrand || ps.Hotel;\r\n }\r\n }\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('preferences', preferences);\r\n function preferences($q, $rootScope, localStorageProvider, preferencesHttpProvider, funcUtil) {\r\n var service = {\r\n get: decorate(get),\r\n set: decorate(set),\r\n getAllPreferences: decorate(getAllPreferences),\r\n setAllPreferences: decorate(setAllPreferences),\r\n clear: clear,\r\n getFlightSortOrder: getFlightSortOrder,\r\n setFlightSortOrder: setFlightSortOrder,\r\n getHotelSortOrder: getHotelSortOrder,\r\n setHotelSortOrder: setHotelSortOrder\r\n };\r\n var defaultPrefs = {\r\n priceMode: TRPCONFIG.Domain.DefaultPriceMode,\r\n hotelSortOrder: getDefaultHotelSortOrder(),\r\n flightSortOrder: getDefaultFlightSortOrder(),\r\n flightClass: 0,\r\n smokingRoom: false,\r\n footerToolbar: true\r\n };\r\n var prefsPromise = getAllPreferences();\r\n var localPrefs = {};\r\n function get(key) {\r\n return getAllPreferences().then(function (prefs) { return prefs[key]; });\r\n }\r\n function getDefaultHotelSortOrder() {\r\n return TRPCONFIG.Domain.HotelSearchOrder;\r\n }\r\n function getDefaultFlightSortOrder() {\r\n return TRPCONFIG.Domain.BestFitFlightSelection ? 10 : TRPCONFIG.Domain.FlightsSearchOrder;\r\n }\r\n function getFlightSortOrder(initial) {\r\n if (TRPCONFIG.Domain.SaveSortPreferences) {\r\n return decorate(get)('flightSortOrder');\r\n }\r\n if (initial) {\r\n localPrefs.flightSortOrder = getDefaultFlightSortOrder();\r\n }\r\n return $q.when(localPrefs.flightSortOrder || getDefaultFlightSortOrder());\r\n }\r\n function setFlightSortOrder(value) {\r\n if (TRPCONFIG.Domain.SaveSortPreferences) {\r\n return decorate(set)('flightSortOrder', value);\r\n }\r\n return $q.when(value);\r\n }\r\n function getHotelSortOrder(initial) {\r\n if (TRPCONFIG.Domain.SaveSortPreferences) {\r\n return decorate(get)('hotelSortOrder');\r\n }\r\n if (initial) {\r\n localPrefs.hotelSortOrder = getDefaultHotelSortOrder();\r\n }\r\n return $q.when(localPrefs.hotelSortOrder || getDefaultHotelSortOrder());\r\n }\r\n function setHotelSortOrder(value) {\r\n if (TRPCONFIG.Domain.SaveSortPreferences) {\r\n return decorate(set)('hotelSortOrder', value);\r\n }\r\n localPrefs.hotelSortOrder = value;\r\n return $q.when(value);\r\n }\r\n function set(key, val) {\r\n return getUser().then(function (user) {\r\n var defered = [$q.defer(), $q.defer()];\r\n if (val === null || val === undefined) {\r\n preferencesHttpProvider.remove(user, function () { return defered[0].resolve(); }, key);\r\n localStorageProvider.remove(function () { return defered[1].resolve(); }, key);\r\n }\r\n else {\r\n var prefs = {};\r\n prefs[key] = val;\r\n preferencesHttpProvider.set(user, function () { return defered[0].resolve(); }, prefs);\r\n localStorageProvider.set(function () { return defered[1].resolve(); }, prefs);\r\n }\r\n return all(defered).then(clear);\r\n });\r\n }\r\n function getAllPreferences() {\r\n return getUser().then(function (user) {\r\n var cacheKey = user.UserIdHash || 'no-hash';\r\n if (prefsPromise && prefsPromise.cacheKey === cacheKey) {\r\n return prefsPromise;\r\n }\r\n var defered = $q.defer();\r\n preferencesHttpProvider.get(user, function (prefs) {\r\n if (prefs) {\r\n defered.resolve(prefs);\r\n }\r\n else {\r\n localStorageProvider.get(function (prefs) { return defered.resolve(prefs); });\r\n }\r\n });\r\n prefsPromise = defered.promise.then(function (prefs) { return angular.extend({}, defaultPrefs, prefs); });\r\n prefsPromise.cacheKey = cacheKey;\r\n return prefsPromise;\r\n });\r\n }\r\n function setAllPreferences(prefs) {\r\n return getUser().then(function (user) {\r\n var defered = [$q.defer(), $q.defer()];\r\n preferencesHttpProvider.set(user, function () { return defered[0].resolve(); }, prefs);\r\n localStorageProvider.set(function () { return defered[1].resolve(); }, prefs);\r\n return all(defered).then(clear);\r\n });\r\n }\r\n function all(defered) {\r\n var promises = _.map(defered, function (d) { return d.promise; });\r\n return $q.all(promises);\r\n }\r\n function clear() {\r\n prefsPromise = null;\r\n }\r\n function getUser() {\r\n return funcUtil.waitForValue(function () { return $rootScope.user; });\r\n }\r\n // Copies all input/output to ensure that the preferences are not accidently mutated.\r\n function decorate(func) {\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var argumentsCopy = _.map(args, function (a) { return angular.copy(a); });\r\n var result = func.apply(service, argumentsCopy);\r\n return $q.when(result).then(function (r) { return angular.copy(r); });\r\n };\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var PricingService = /** @class */ (function () {\r\n function PricingService($http, cookieService) {\r\n this.$http = $http;\r\n this.cookieService = cookieService;\r\n this.domain = TRPCONFIG.Domain;\r\n this.apiUrl = 'api/hotels/pricing';\r\n }\r\n PricingService.prototype.hasActiveVouchers = function () {\r\n return this.$http.get(this.apiUrl + \"/hasActiveVouchers\", {\r\n params: { domainId: this.domain.DomainId }\r\n }).then(function (response) { return response.data; });\r\n };\r\n return PricingService;\r\n }());\r\n TR.PricingService = PricingService;\r\n angular.module('TR').service('pricingService', PricingService);\r\n})(TR || (TR = {}));\r\nvar TR;\r\n(function (TR) {\r\n var PriorityBoardingService = /** @class */ (function () {\r\n function PriorityBoardingService() {\r\n }\r\n PriorityBoardingService.prototype.getPriorityBoardingInfo = function (flight, flightOptions) {\r\n var oneWayFlight = flight.Details.Itinerary.Legs.length === 1;\r\n var bothWaysFlight = flight.Details.Itinerary.Legs.length === 2;\r\n var extras = flight.Details.FlightSectorOptionalExtras;\r\n var pbInfo = {\r\n isSelected: false,\r\n outboundOnly: false,\r\n inboundOnly: false,\r\n both: false,\r\n oneWayFlightPB: false\r\n };\r\n if (oneWayFlight) {\r\n pbInfo.optionDetails = this._getPBOption(extras[0]);\r\n pbInfo.oneWayFlightPB = Boolean(pbInfo.optionDetails);\r\n }\r\n if (bothWaysFlight) {\r\n pbInfo.outboundOnly = extras.length === 2 && Boolean(this._getPBOption(extras[0]));\r\n pbInfo.inboundOnly = extras.length === 2 && Boolean(this._getPBOption(extras[1]));\r\n pbInfo.both = extras.length === 1 && Boolean(this._getPBOption(extras[0]));\r\n if (pbInfo.outboundOnly || pbInfo.inboundOnly || pbInfo.both) {\r\n pbInfo.optionDetails = this._getPBOption(extras[0]) || this._getPBOption(extras[1]);\r\n }\r\n }\r\n if (pbInfo.optionDetails && pbInfo.optionDetails.OptionId) {\r\n pbInfo.isSelected = Boolean(_.find(flightOptions, ['OptionId', pbInfo.optionDetails.OptionId]));\r\n }\r\n return pbInfo;\r\n };\r\n ;\r\n PriorityBoardingService.prototype._getPBOption = function (flightExtra) {\r\n if (!flightExtra && !flightExtra.OptionalExtras) {\r\n return;\r\n }\r\n var otherOptions = _.find(flightExtra.OptionalExtras, ['Type', 2]);\r\n if (otherOptions && otherOptions.SingleOptionalExtras && otherOptions.SingleOptionalExtras.length) {\r\n return _.find(otherOptions.SingleOptionalExtras, ['Type', 'PriorityBoarding']);\r\n }\r\n };\r\n return PriorityBoardingService;\r\n }());\r\n TR.PriorityBoardingService = PriorityBoardingService;\r\n angular\r\n .module('TR')\r\n .service('priorityBoardingService', PriorityBoardingService);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('recentHotels', recentHotels);\r\n function recentHotels($http, hotelRehydrator, $window, $timeout, $rootScope, broker) {\r\n var url = '/api2/recentlyviewedhotels/';\r\n var defer = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame || $timeout;\r\n var promise;\r\n $rootScope.$on('auth:signout', _clearPromise);\r\n $rootScope.$on('auth:signin', _clearPromise);\r\n var service = {\r\n set: set,\r\n remove: remove,\r\n clear: clear,\r\n get: get,\r\n getIds: getIds\r\n };\r\n function _clearPromise() {\r\n promise = null;\r\n broker.publish('recentHotelsModified');\r\n }\r\n function set(estabId) {\r\n if (estabId > 0) {\r\n defer(function () {\r\n $http\r\n .post(url + \"set\", { EstabId: estabId }, { ignoreErrors: true })\r\n .then(_clearPromise)\r\n .then(function () { return broker.publish('recentHotelAdded', estabId); });\r\n });\r\n }\r\n }\r\n function remove(estabId) {\r\n if (estabId > 0) {\r\n return $http\r\n .post(url + \"remove\", { EstabId: estabId })\r\n .then(_clearPromise)\r\n .then(function () { return broker.publish('recentHotelRemoved', estabId); });\r\n }\r\n }\r\n function clear() {\r\n return $http.post(url + \"removeall\")\r\n .then(_clearPromise);\r\n }\r\n function get() {\r\n return promise = promise || $http\r\n .get(url + \"get\", { ignoreErrors: true })\r\n .then(function (results) { return hotelRehydrator.hotels(results.data); });\r\n }\r\n function getIds() {\r\n return $http\r\n .get(url + \"get\", { ignoreErrors: true })\r\n .then(function (results) { return results.data; });\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('commonErrors', commonErrors);\r\n function commonErrors($q, $location, currentUser) {\r\n var service = {\r\n 0: zero,\r\n 400: fourHundred,\r\n 404: fourOFour,\r\n 401: fourOOne,\r\n 410: fourTen\r\n };\r\n function _notFound(data) {\r\n var area = $location.path().split('/')[1];\r\n var supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(function (p) { return p.toLowerCase(); });\r\n if (data && data.config && data.config.url) {\r\n logError(data.config.url);\r\n }\r\n var areaSupported = supportedProducts.indexOf(area.toLowerCase()) > -1;\r\n switch (area) {\r\n case area:\r\n areaSupported\r\n ? $location.path(area + \"/notfound\")\r\n : $location.path('holidays/notfound');\r\n break;\r\n default:\r\n $location.path('holidays/notfound');\r\n }\r\n }\r\n function zero() {\r\n return $q.reject('CANCELLED');\r\n }\r\n function logError(url) {\r\n var utm = currentUser.get().UtmId;\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/log',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Message: \"Customer with utmId \" + utm + \" received a 404 from \" + url,\r\n LogLevel: 2 // Warning\r\n })\r\n });\r\n }\r\n function fourHundred(data) {\r\n $location.path('error');\r\n return $q.reject(data);\r\n }\r\n function fourOOne(data) {\r\n var path = $location.path();\r\n var absUrl = $location.absUrl();\r\n var redirectUrl = String.format(TRPCONFIG.Domain.AgentLogonUrl, absUrl);\r\n if (data && data.headers && data.headers()['www-authenticate']) {\r\n if (data.headers()['www-authenticate'].indexOf('realm=\"Agent\"') > -1 && (path !== '/agents/signin')) {\r\n window.location.href = redirectUrl;\r\n }\r\n }\r\n return $q.reject(data);\r\n }\r\n function fourOFour(data) {\r\n _notFound(data);\r\n return $q.reject(data);\r\n }\r\n function fourTen(data) {\r\n _notFound(data);\r\n return $q.reject(data);\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('reviewService', reviewService);\r\n function reviewService($rootScope, $http, $q, arrayUtil, authService, $location) {\r\n var domain = TRPCONFIG.Domain;\r\n var url = '/api2/users/reviews/';\r\n var limit = 1750; //borrowed this limit from the jquery plugin\r\n var suggestedPageSize = 10; // PageSize should probably be passed as an argument to getReviews()\r\n var likeTypes = {\r\n organic: 1,\r\n postSubmission: 2\r\n };\r\n var apiKey;\r\n var reviewsCache = {};\r\n var service = {\r\n getUrl: getUrl,\r\n getRatingCategories: getRatingCategories,\r\n getStatements: getStatements,\r\n getOriginalText: getOriginalText,\r\n getReviews: getReviews,\r\n getReviewSnippets: getReviewSnippets,\r\n setTranslation: setTranslation,\r\n setSnippetTranslation: setSnippetTranslation,\r\n setTranslationKey: setTranslationKey,\r\n getReviewDetails: getReviewDetails,\r\n getReviewDetailsUsingToken: getReviewDetailsUsingToken,\r\n likeReview: {\r\n organic: organicLike,\r\n postSubmission: postSubmissionLike\r\n },\r\n reviewStatus: {\r\n CannotLeaveReview: 0,\r\n CanLeaveReview: 1,\r\n HasLeftReview: 2\r\n }\r\n };\r\n $rootScope.$on('auth:signout', function () {\r\n _clearCache();\r\n //remove liked review index from url so refresh won't cause redirection to sign in page\r\n if ($location.$$search.lr) {\r\n delete $location.$$search.lr;\r\n $location.$$compose();\r\n }\r\n });\r\n $rootScope.$on('auth:signin', _clearCache);\r\n function getUrl() {\r\n return url;\r\n }\r\n function getRatingCategories(cultureCode) {\r\n return $http.post(url + \"getratingcategories\", {\r\n CultureCode: cultureCode\r\n });\r\n }\r\n function getStatements(cultureCode) {\r\n return $http.post(url + \"getstatements\", {\r\n CultureCode: cultureCode\r\n });\r\n }\r\n function getOriginalText(reviewId) {\r\n return $http.post(url + \"getoriginaltext\", {\r\n ReviewId: reviewId\r\n }, { ignoreErrors: true }).then(function (res) {\r\n res.data.Comments = htmlifyLineBreaks(res.data.Comments);\r\n res.data.TopTip = htmlifyLineBreaks(res.data.TopTip);\r\n return res.data;\r\n });\r\n }\r\n function setTranslationKey(key) {\r\n apiKey = key;\r\n }\r\n function _truncate(val) {\r\n if (val != null && val.length > limit) {\r\n return val.substring(0, limit);\r\n }\r\n return val;\r\n }\r\n function _translate(text, source, target) {\r\n var googleUrl = 'https://www.googleapis.com/language/translate/v2?';\r\n text = $.trim(text);\r\n if (text === '') {\r\n return $q.when(null);\r\n }\r\n return $http.jsonp(googleUrl, {\r\n params: {\r\n key: apiKey,\r\n source: source,\r\n target: target,\r\n q: text,\r\n callback: 'JSON_CALLBACK'\r\n }\r\n });\r\n }\r\n function getTranslatedText(resp) {\r\n if (resp != null && resp.data != null && resp.data.data != null && resp.data.data.translations && resp.data.data.translations.length > 0) {\r\n return resp.data.data.translations[0].translatedText;\r\n }\r\n return '';\r\n }\r\n function setTranslation(review) {\r\n // truncation is somewhat lame. Can we split the string up into a number of batches possibly, but it would\r\n // be hard to do that without messing with the meaning of the text. Perhaps breaking it into sentences?\r\n var promises = [];\r\n var source = review.CultureCode;\r\n var target = domain.CultureCode.substring(0, 2);\r\n promises.push(_translate(_truncate(review.Comments), source, target));\r\n promises.push(_translate(_truncate(review.TopTip), source, target));\r\n return $q\r\n .all(promises)\r\n .then(function (responses) {\r\n var result = {\r\n Comments: getTranslatedText(responses[0]),\r\n TopTip: getTranslatedText(responses[1])\r\n };\r\n return $http.post(url + \"settranslation\", {\r\n ReviewId: review.ReviewId,\r\n Comments: result.Comments,\r\n TopTip: result.TopTip,\r\n CultureCode: target\r\n }, { ignoreErrors: true })\r\n .then(function () {\r\n return result;\r\n });\r\n });\r\n }\r\n function setSnippetTranslation(snippet) {\r\n // Same truncation comment as above, but probably has no impact on a snippet.\r\n var promises = [];\r\n var source = snippet.CultureCode;\r\n var target = domain.CultureCode.substring(0, 2);\r\n promises.push(_translate(_truncate(snippet.Comments), source, target));\r\n return $q\r\n .all(promises)\r\n .then(function (responses) {\r\n var result = {\r\n Comments: responses[0] != null ? responses[0].data.data.translations[0].translatedText : ''\r\n };\r\n return $http.post(url + \"setsnippettranslation\", {\r\n ReviewId: snippet.ReviewId,\r\n Comments: result.Comments,\r\n CultureCode: target\r\n }, { ignoreErrors: true })\r\n .then(function () {\r\n return result;\r\n });\r\n });\r\n }\r\n function htmlifyLineBreaks(text) {\r\n return text ? text.replace(/\\\\n/g, '
        ').replace(/\\n/g, '
        ') : text;\r\n }\r\n function getReviews(hotel, page) {\r\n var pageSize = suggestedPageSize;\r\n if (reviewsCache[hotel.Id] == null) {\r\n reviewsCache[hotel.Id] = {\r\n total: hotel.CustomerReviewCount,\r\n page: 1,\r\n reviews: {}\r\n };\r\n }\r\n var cache = reviewsCache[hotel.Id];\r\n var d = $q.defer();\r\n cache.page = page;\r\n //is this a page that exists?\r\n if (((page) * pageSize) > cache.total) {\r\n throw new Error(\"there is no page \" + page);\r\n }\r\n function resolve() {\r\n var remaining = (cache.total - (page + 1) * pageSize);\r\n d.resolve({\r\n reviews: cache.reviews[page],\r\n moreReviews: (remaining > pageSize) ? pageSize : Math.max(remaining, 0),\r\n page: page\r\n });\r\n }\r\n //have we got the data for this page\r\n if (cache.reviews[page] != null) {\r\n resolve();\r\n }\r\n else {\r\n $http.post(url + \"getpage\", {\r\n EstabId: hotel.Id,\r\n CultureCode: domain.CultureCode,\r\n CountryCode: domain.CountryCode,\r\n Paging: {\r\n PageIndex: page,\r\n PageSize: pageSize\r\n },\r\n SortCriterion: 0,\r\n FilterCriteria: {\r\n ExcludeEmptyComments: true\r\n }\r\n }, { ignoreErrors: true }).then(function (res) {\r\n cache.reviews[page] = arrayUtil.map(res.data.Reviews, function (review) {\r\n review.Comments = htmlifyLineBreaks(review.Comments);\r\n review.TopTip = htmlifyLineBreaks(review.TopTip);\r\n return review;\r\n });\r\n resolve();\r\n }, function () {\r\n d.reject();\r\n });\r\n }\r\n return d.promise;\r\n }\r\n function getReviewSnippets(hotel, pageIndex, pageSize) {\r\n return $http.post(url + \"getsnippetpage\", {\r\n EstabId: hotel.Id,\r\n CultureCode: domain.CultureCode,\r\n Paging: {\r\n PageIndex: pageIndex,\r\n PageSize: pageSize\r\n }\r\n });\r\n }\r\n function organicLike(reviewId, like) {\r\n return _likeReview(reviewId, like, likeTypes.organic);\r\n }\r\n function postSubmissionLike(reviewId, like) {\r\n return _likeReview(reviewId, like, likeTypes.postSubmission);\r\n }\r\n function _likeReview(reviewId, like, reviewLikeType) {\r\n return $http.post(url + \"like\", {\r\n ReviewId: reviewId,\r\n Like: like,\r\n ReviewLikeType: reviewLikeType,\r\n ApplicationType: TRPCONFIG.ApplicationType\r\n }, {\r\n customErrCallback: function () {\r\n return true; //make sure that the default error handling does not occur\r\n } //Note that we will stay in the error branch\r\n }).then(null, _errorLike);\r\n function _errorLike(resp) {\r\n if (resp.status === 401) {\r\n _signIn();\r\n }\r\n }\r\n function _signIn() {\r\n var url = $location.path() + \"?pd=rv&lr=\" + reviewId;\r\n authService.bufferRoute(url);\r\n $location.url(\"signin?cb=\" + encodeURIComponent(url));\r\n }\r\n }\r\n function _clearCache() {\r\n reviewsCache = {};\r\n }\r\n function getReviewDetailsUsingToken(bookingId, token, userId) {\r\n return $http.post(url + \"user/reviewdetailstoken\", { BookingId: bookingId, VerificationToken: token, UserId: userId, CultureCode: domain.CultureCode }).then(function (res) { return res.data; }, function (err) { return _processGetReviewError(err.status); });\r\n }\r\n function getReviewDetails(bookingId) {\r\n return $http.post(url + \"user/reviewdetails\", { BookingId: bookingId, CultureCode: domain.CultureCode }).then(function (res) { return res.data; }, function (err) { return _processGetReviewError(err.status); });\r\n }\r\n function _processGetReviewError(errCode) {\r\n //we can have a number of different states but just return the correct enum value\r\n var detail = {\r\n BookingRef: null,\r\n CheckInDate: null,\r\n EstabId: null,\r\n LeadContact: null,\r\n ReviewStatus: service.reviewStatus.CannotLeaveReview\r\n };\r\n if (errCode === 401) {\r\n detail.Status = service.reviewStatus.CannotLeaveReview;\r\n }\r\n return detail;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('savedSearchService', savedSearchService);\r\n function savedSearchService(hotelSearchValidator, $http, searchUnitService, dateUtil, occupancyService, resourceService, arrayUtil, $q, $routeParams, broker, $rootScope, analytics, searchTypesService, tripService, unadjustedDateFilter) {\r\n var url = '/api2/savedsearches/';\r\n var isPrerender = /prerender/i.test(navigator.userAgent);\r\n // cached results\r\n var cachedSearches;\r\n var cachedSearchTypes = [];\r\n var searchType = searchTypesService.searchType;\r\n var supportedSearchTypes = searchTypesService.supportedTypes();\r\n var title = {\r\n 1: resourceService.getDeferred('FLIGHTS'),\r\n 3: resourceService.getDeferred('HOLIDAYS'),\r\n 2: resourceService.getDeferred('HOTELS'),\r\n 4: resourceService.getDeferred('TRANSFERS'),\r\n 6: resourceService.getDeferred('AIRPORTPARKING'),\r\n 8: resourceService.getDeferred('INSURANCE')\r\n };\r\n var fromDateTitle = {\r\n 1: resourceService.getDeferred('DEPART'),\r\n 2: resourceService.getDeferred('CHECKIN'),\r\n 3: resourceService.getDeferred('DEPART'),\r\n 4: resourceService.getDeferred('ARRIVAL'),\r\n 6: resourceService.getDeferred('DROPOFFDATE'),\r\n 8: resourceService.getDeferred('DEPART')\r\n };\r\n var toDateTitle = {\r\n 1: resourceService.getDeferred('RETURN'),\r\n 2: resourceService.getDeferred('CHECKOUT'),\r\n 3: resourceService.getDeferred('RETURN'),\r\n 4: resourceService.getDeferred('RETURN'),\r\n 6: resourceService.getDeferred('PICKUPDATE'),\r\n 8: resourceService.getDeferred('RETURN')\r\n };\r\n var fromDateField = {\r\n 1: 'DepartureDate',\r\n 2: 'CheckInDate',\r\n 3: 'DepartureDate',\r\n 4: 'ArrivalDate',\r\n 6: 'DepartureDate',\r\n 8: 'DepartureDate'\r\n };\r\n var toDateField = {\r\n 1: 'ReturnDate',\r\n 2: 'CheckOutDate',\r\n 3: 'ReturnDate',\r\n 4: 'ReturnDate',\r\n 6: 'ReturnDate',\r\n 8: 'ReturnDate'\r\n };\r\n var cabin = {\r\n 1: 'Economy',\r\n 2: 'PremiumEconomy',\r\n 4: 'First',\r\n 8: 'Business'\r\n };\r\n $rootScope.$on('auth:signin', function () {\r\n cachedSearches = null;\r\n });\r\n $rootScope.$on('auth:signout', function () {\r\n cachedSearches = null;\r\n });\r\n var service = {\r\n saveFlightSearch: saveFlightSearch,\r\n saveHolidaySearch: saveHolidaySearch,\r\n saveHotelSearch: saveHotelSearch,\r\n saveTransferSearch: saveTransferSearch,\r\n saveParkingSearch: saveParkingSearch,\r\n saveInsuranceSearch: saveInsuranceSearch,\r\n restoreSearch: restoreSearch,\r\n getSavedSearches: getSavedSearches,\r\n removeSavedSearch: removeSavedSearch,\r\n getCabinType: getCabinType\r\n };\r\n function _getFlightSearch(tripId, SearchModel) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getSelectedDepartureAirport(tripId),\r\n tripService.getSelectedDestinationAirport(tripId),\r\n tripService.isOneWayFlightEnabled(tripId),\r\n tripService.getFlightsRequestDepartureDate(tripId, true),\r\n tripService.getFlightsRequestReturnDate(tripId, true),\r\n tripService.getTripReducedOccupancy(tripId)\r\n ]).then(function (_a) {\r\n var Destination = _a[0], DepartureAirport = _a[1], DestinationAirport = _a[2], isOneWayFlightEnabled = _a[3], DepartureDate = _a[4], ReturnDate = _a[5], ReducedOccupancy = _a[6];\r\n var flightSearchRequest = {\r\n DepartureAirportTitle: DepartureAirport.Title,\r\n Destination: Destination,\r\n DestinationAirportTitle: DestinationAirport.Title,\r\n DepartureDate: DepartureDate,\r\n SearchModel: SearchModel\r\n };\r\n if (DepartureAirport.Code) {\r\n flightSearchRequest.DepartureAirports = DepartureAirport.Code.split(',');\r\n }\r\n // This is a a hacky fix. DestinationAirport can be in two different shapes\r\n // due to undetermined circumstances (probably search unit configuration)\r\n var destinationCodes = DestinationAirport.Code ? DestinationAirport.Code : DestinationAirport.DestinationAirports;\r\n if (destinationCodes) {\r\n flightSearchRequest.DestinationAirports = destinationCodes.split(',');\r\n }\r\n if (isOneWayFlightEnabled) {\r\n flightSearchRequest.OneWayOnly = true;\r\n }\r\n else {\r\n flightSearchRequest.ReturnDate = ReturnDate;\r\n }\r\n angular.extend(flightSearchRequest, ReducedOccupancy);\r\n flightSearchRequest.Children = flightSearchRequest.ChildAges.length;\r\n return flightSearchRequest;\r\n });\r\n }\r\n function _getHolidaySearch(tripId, searchModel) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getSelectedDepartureAirport(tripId),\r\n tripService.getFlightsRequestDepartureDate(tripId, true),\r\n tripService.getFlightsRequestReturnDate(tripId, true),\r\n tripService.getTripOccupancy(tripId),\r\n tripService.getFlightCabin(tripId)\r\n ]).then(function (results) {\r\n var values = results.every(function (result) {\r\n return result !== null;\r\n });\r\n return values ?\r\n $q.resolve({\r\n Destination: results[0],\r\n DepartureAirports: results[1].Code.split(','),\r\n DepartureAirportsTitle: results[1].Title,\r\n DepartureDate: results[2],\r\n ReturnDate: results[3],\r\n Rooms: results[4],\r\n Cabin: results[5],\r\n SearchModel: searchModel\r\n }) : $q.reject();\r\n });\r\n }\r\n function _getHotelSearch(tripId) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getHotelsRequestCheckInDate(tripId, true),\r\n tripService.getHotelsRequestCheckOutDate(tripId, true),\r\n tripService.getTripOccupancy(tripId)\r\n ]).then(function (results) { return ({\r\n Destination: results[0],\r\n CheckInDate: results[1],\r\n CheckOutDate: results[2],\r\n Rooms: results[3]\r\n }); });\r\n }\r\n function _getTransferSearch() {\r\n var airport = searchUnitService.getDestinationAirport();\r\n var route = searchUnitService.getRoute();\r\n var occ = occupancyService.reduceOccupancy();\r\n return {\r\n Airport: airport.Code,\r\n AirportTitle: airport.Title,\r\n Route: route,\r\n Direction: searchUnitService.getDirection(),\r\n ArrivalDate: searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.transfer) : null,\r\n ReturnDate: searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.transfer) : null,\r\n Passengers: {\r\n Adults: occ.Adults,\r\n ChildAges: occ.ChildAges\r\n }\r\n };\r\n }\r\n function _getInsuranceSearch() {\r\n var occ = occupancyService.reduceOccupancy();\r\n var policyType = searchUnitService.getPolicyType();\r\n var destination = searchUnitService.getTravelDestination();\r\n return {\r\n StartDate: searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.insurance) : null,\r\n EndDate: searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.insurance) : null,\r\n AdultAges: occ.AdultAges,\r\n ChildAges: occ.ChildAges,\r\n PolicyExtras: searchUnitService.getPolicyExtra(),\r\n PolicyType: policyType.Id,\r\n PolicyTypeTitle: policyType.Name,\r\n Destination: destination.Id,\r\n DestinationTitle: destination.Name\r\n };\r\n }\r\n function _getParkingSearch(tripId) {\r\n return $q.all([\r\n tripService.getParkingAirport(tripId),\r\n tripService.getParkingDropOffDate(tripId),\r\n tripService.getParkingPickUpDate(tripId),\r\n tripService.getTripOccupancy(tripId)\r\n ]).then(function (results) { return ({\r\n AirportCode: results[0].Code,\r\n AirportTitle: results[0].Title,\r\n DropOffDate: results[1],\r\n PickUpDate: results[2],\r\n Passengers: results[3]\r\n }); });\r\n }\r\n function _normaliseSearch(s) {\r\n var dateTimeFormat = 'dd MMM yyyy HH:mm';\r\n s.TypeTitle = title[s.SearchType]();\r\n window.dataLayer = window.dataLayer || [];\r\n switch (s.SearchType) {\r\n case searchType.Flight:\r\n s.Duration = s.OneWayOnly ? null : dateUtil.getDurationSummary(s.DepartureDate, s.ReturnDate);\r\n // If Destination is not there then we fill in what we can and then basket service will take them\r\n // to the non-flexible flight workflow. If it has something then basket service will take them to a flexible\r\n // flight workflow\r\n if (!s.Destination) {\r\n s.Destination = { Title: s.DestinationAirportTitle };\r\n }\r\n window.dataLayer.push({ CabinTitle: cabin[s.Cabin] });\r\n break;\r\n case searchType.Hotels:\r\n s.Duration = dateUtil.getDurationSummary(s.CheckInDate, s.CheckOutDate);\r\n break;\r\n case searchType.Holidays:\r\n s.Duration = dateUtil.getDurationSummary(s.DepartureDate, s.ReturnDate);\r\n window.dataLayer.push({ CabinTitle: cabin[s.Cabin] });\r\n break;\r\n case searchType.Transfers: {\r\n var str = s.ArrivalDate != null ? dateUtil.format(s.ArrivalDate, dateTimeFormat) : '';\r\n str += s.ArrivalDate != null && s.ReturnDate != null ? ' - ' : '';\r\n str += s.ReturnDate != null ? dateUtil.format(s.ReturnDate, dateTimeFormat) : '';\r\n s.Duration = str;\r\n s.Destination = { Title: _.get(s, 'ResortTitle') || _.get(s, 'Route.DropOffPoint.Description') };\r\n break;\r\n }\r\n case searchType.Parking:\r\n s.Destination = { Title: s.AirportTitle };\r\n s.Duration = unadjustedDateFilter(s.DropOffDate, dateTimeFormat) + \" - \" + unadjustedDateFilter(s.PickUpDate, dateTimeFormat);\r\n break;\r\n case searchType.Insurance:\r\n s.Duration = dateUtil.getDurationSummary(s.StartDate, s.EndDate);\r\n }\r\n // provide generic \"from\" and \"to\" dates that can be rendered by a single template\r\n s.FromDate = { Date: s[fromDateField[s.SearchType]], Title: fromDateTitle[s.SearchType] };\r\n s.ToDate = s.OneWayOnly ? null : { Date: s[toDateField[s.SearchType]], Title: toDateTitle[s.SearchType] };\r\n s.Nights = s.OneWayOnly ? null : dateUtil.numberOfNights(s.FromDate.Date, s.ToDate.Date);\r\n // sum occupancy\r\n if (s.Rooms) {\r\n var occ = _.reduce(s.Rooms, function (sum, value) {\r\n return {\r\n Adults: sum.Adults + value.Adults,\r\n ChildAges: (sum.ChildAges || []).concat(value.ChildAges || [])\r\n };\r\n });\r\n s.Adults = occ.Adults;\r\n s.Children = (occ.ChildAges || []).length;\r\n }\r\n delete s.SearchModel;\r\n return s;\r\n }\r\n function _saveSearch(type, op, getter) {\r\n var s = getter();\r\n s.SearchType = type;\r\n var searchModel = s.SearchModel;\r\n s = _normaliseSearch(s);\r\n if (TRPCONFIG.EnableSavedSearches) {\r\n cachedSearches = null;\r\n $http.post(url + op, s, { ignoreErrors: true }).then(function (res) {\r\n s.SavedSearchId = res.data;\r\n broker.publish('savedSearchAdded', s);\r\n });\r\n }\r\n var trackSearchEvent = { category: 'searches', action: 'run', label: op.replace('save', '') };\r\n if (TRPCONFIG.Domain.TenantId === 3) {\r\n trackSearchEvent.dimension3 = searchModel.airports.map(function (elem) { return elem.Code; }).join(',');\r\n trackSearchEvent.dimension4 = searchModel.destination[0].DestinationAirports;\r\n trackSearchEvent.dimension5 = searchModel.startDate;\r\n trackSearchEvent.dimension6 = searchModel.endDate;\r\n trackSearchEvent.dimension7 = occupancyService.getOccupancyString(searchModel.occupancy);\r\n trackSearchEvent.dimension8 = searchModel.cabin;\r\n }\r\n var IsAmend = $routeParams.bookingId ? true : undefined;\r\n analytics.track('mixpanel', 'Search', _.extend({}, s, { searchModel: searchModel, IsAmend: IsAmend }));\r\n analytics.track('Search', type, s);\r\n analytics.trackEvent(trackSearchEvent);\r\n analytics.track('mixpanelPeople', 'Search', s);\r\n }\r\n function _searchRestored() {\r\n broker.publish('savedSearchRestored');\r\n }\r\n function _restoreFlightSearch(search) {\r\n searchUnitService.setOneWayFlightEnabled(TRPCONFIG.Domain.OneWayFlightsEnabled && search.OneWayOnly);\r\n searchUnitService.startDate(searchUnitService.flight, search.DepartureDate);\r\n searchUnitService.endDate(searchUnitService.flight, search.ReturnDate);\r\n searchUnitService.setDepartureAirports({\r\n Code: search.DepartureAirports.join(','),\r\n Title: search.DepartureAirportTitle\r\n });\r\n searchUnitService.setDestination(search.Destination);\r\n searchUnitService.setDestinationAirport({\r\n Code: search.DestinationAirports.join(','),\r\n Title: search.DestinationAirportTitle\r\n });\r\n return $q.when();\r\n }\r\n function _restoreHotelSearch(search) {\r\n searchUnitService.startDate(searchUnitService.hotel, search.CheckInDate);\r\n searchUnitService.endDate(searchUnitService.hotel, search.CheckOutDate);\r\n occupancyService.setOccupancy(search.Rooms);\r\n return searchUnitService.setDestination(search.Destination, false, true);\r\n }\r\n function _restoreHolidaySearch(search) {\r\n searchUnitService.startDate(searchUnitService.flight, search.DepartureDate);\r\n searchUnitService.endDate(searchUnitService.flight, search.ReturnDate);\r\n occupancyService.setOccupancy(search.Rooms);\r\n searchUnitService.setDepartureAirports({\r\n Code: search.DepartureAirports.join(','),\r\n Title: search.DepartureAirportsTitle\r\n });\r\n return searchUnitService.setDestination(search.Destination, false, true);\r\n }\r\n function _restoreTransferSearch(search) {\r\n searchUnitService.setDirection(search.Direction);\r\n searchUnitService.endDate(searchUnitService.transfer, search.ReturnDate || null);\r\n searchUnitService.startDate(searchUnitService.transfer, search.ArrivalDate || null);\r\n occupancyService.setOccupancy([search.Passengers]);\r\n searchUnitService.setDestinationAirport({\r\n Code: search.Airport,\r\n Title: search.AirportTitle\r\n });\r\n if (search.Route) {\r\n searchUnitService.setResort(search.Route.DropOffPoint);\r\n }\r\n return $q.when();\r\n }\r\n function _restoreParkingSearch(search) {\r\n searchUnitService.setDepartureAirports({ Code: search.AirportCode, Title: search.AirportTitle });\r\n occupancyService.setPassengerCount(search.Passengers);\r\n searchUnitService.startDate(searchUnitService.parking, search.DropOffDate);\r\n searchUnitService.endDate(searchUnitService.parking, search.PickUpDate);\r\n return $q.when();\r\n }\r\n function _restoreInsuranceSearch(search) {\r\n searchUnitService.startDate(searchUnitService.insurance, search.StartDate);\r\n searchUnitService.endDate(searchUnitService.insurance, search.EndDate);\r\n searchUnitService.setPolicyExtra(search.PolicyExtra);\r\n searchUnitService.setPolicyType(search.PolicyType);\r\n searchUnitService.setOccupancy(search.Passengers);\r\n searchUnitService.setTravelDestination(search.TravelDestination);\r\n return $q.when();\r\n }\r\n function saveFlightSearch(tripId, searchModel) {\r\n return _getFlightSearch(tripId, searchModel).then(function (flightSearch) { return _saveSearch(searchType.Flight, 'saveFlightSearch', function () { return flightSearch; }); });\r\n }\r\n function saveHolidaySearch(tripId, searchModel) {\r\n return _getHolidaySearch(tripId, searchModel)\r\n .then(function (holidaySearch) { return _saveSearch(searchType.Holidays, 'saveholidaysearch', function () { return holidaySearch; }); });\r\n }\r\n function saveHotelSearch(tripId) {\r\n //we don't want to record geo searches\r\n if (searchUnitService.getSearchArea()) {\r\n analytics.trackEvent({ category: 'searches', action: 'run', label: 'hotelgeosearch' });\r\n return;\r\n }\r\n return _getHotelSearch(tripId).then(function (hotelSearch) {\r\n var dest = _.get(hotelSearch, 'Destination', null);\r\n var checkInDate = new Date(_.get(hotelSearch, 'CheckInDate', '0001-01-01T00:00:00'));\r\n var checkOutDate = new Date(_.get(hotelSearch, 'CheckOutDate', '0001-01-01T00:00:00'));\r\n var rooms = _.get(hotelSearch, 'Rooms', null);\r\n var today = new Date();\r\n if (dest === null || checkOutDate.getTime() < today.getTime() || checkInDate.getTime() > checkOutDate.getTime() || rooms === null || searchType === null) {\r\n return;\r\n }\r\n return _saveSearch(searchType.Hotels, 'savehotelsearch', function () { return hotelSearch; });\r\n });\r\n }\r\n function saveTransferSearch() {\r\n //PointToPointTransferSearch does not support Saved Search yet. OR-432 to implement this in the api.\r\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n _saveSearch(searchType.Transfers, 'savetransfersearch', _getTransferSearch);\r\n }\r\n }\r\n function saveParkingSearch(tripId) {\r\n _getParkingSearch(tripId).then(function (parkingSearch) { return _saveSearch(searchType.Parking, 'saveairportparkingsearch', function () { return parkingSearch; }); });\r\n }\r\n function saveInsuranceSearch() {\r\n _saveSearch(searchType.Insurance, 'saveinsurancesearch', _getInsuranceSearch);\r\n }\r\n function restoreSearch(search) {\r\n switch (search.SearchType) {\r\n case searchType.Flight:\r\n return _restoreFlightSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Hotels:\r\n return _restoreHotelSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Holidays:\r\n return _restoreHolidaySearch(search)\r\n .then(_searchRestored);\r\n case searchType.Transfers:\r\n return _restoreTransferSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Parking:\r\n return _restoreParkingSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Insurance:\r\n return _restoreInsuranceSearch(search)\r\n .then(_searchRestored);\r\n }\r\n return $q.when(); //just in case\r\n }\r\n function getSavedSearches(searchTypes) {\r\n if (isPrerender) {\r\n return $q.when([]);\r\n }\r\n if (searchTypes) {\r\n // 'searchTypes' must be an array\r\n if (!_.isArray(searchTypes)) {\r\n searchTypes = [searchTypes];\r\n }\r\n // search types must be supported\r\n searchTypes = _.intersection(searchTypes, supportedSearchTypes);\r\n }\r\n else {\r\n // default to supported search types\r\n searchTypes = supportedSearchTypes;\r\n }\r\n if (cachedSearches == null || !_.isEqual(searchTypes.sort(), cachedSearchTypes.sort())) {\r\n // get searches from server\r\n cachedSearchTypes = searchTypes;\r\n cachedSearches = requestRecentSearches(searchTypes);\r\n }\r\n return cachedSearches.then(function (list) {\r\n //filter out any searches that are not valid because they are same day searches\r\n //and we are past the cut off time\r\n return arrayUtil.filter(list, function (s) {\r\n if (s.SearchType !== searchType.Hotels ||\r\n (s.SearchType === searchType.Hotels &&\r\n !hotelSearchValidator.validateTimeOfDay(s.CheckInDate))) {\r\n return true;\r\n }\r\n service.removeSavedSearch(s.SavedSearchId);\r\n return false;\r\n });\r\n });\r\n function requestRecentSearches() {\r\n return $http.post(url + \"getsavedsearches\", { SearchTypes: searchTypes }, { ignoreErrors: true }).then(function (res) {\r\n return res.data instanceof Array ? arrayUtil.map(res.data, _normaliseSearch) : [];\r\n });\r\n }\r\n }\r\n function removeSavedSearch(id) {\r\n cachedSearches = null;\r\n return $http.post(url + \"removesavedsearch\", { SavedSearchId: id }).then(function () {\r\n broker.publish('savedSearchRemoved', id);\r\n return null;\r\n });\r\n }\r\n function getCabinType(idx) {\r\n return cabin[idx];\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('shortlistService', shortlistService);\r\n function shortlistService($http, $q, arrayUtil, hotelRehydrator, $rootScope, broker) {\r\n var url = '/api2/hotelshortlist/';\r\n var shortlists;\r\n $rootScope.$on('auth:signout', _clearCache);\r\n $rootScope.$on('auth:signin', _clearCache);\r\n var service = {\r\n clear: clear,\r\n getHotelsInShortlist: getHotelsInShortlist,\r\n getShortlist: getShortlist,\r\n getShortlistEstabIds: getShortlistEstabIds,\r\n removeFromShortlist: removeFromShortlist,\r\n addToShortlist: addToShortlist,\r\n isHotelShortlisted: isHotelShortlisted,\r\n getUrl: getUrl,\r\n toggleHotel: toggleHotel\r\n };\r\n function _getShortlists() {\r\n if (!shortlists) {\r\n shortlists = $http.get(url + \"getall\", { ignoreErrors: true })\r\n .then(function (result) {\r\n return result.data.Shortlists;\r\n });\r\n }\r\n return shortlists;\r\n }\r\n function _clearCache() {\r\n shortlists = null;\r\n }\r\n function clear(id) {\r\n return $http.post(url + \"clear\", id)\r\n .then(function () {\r\n shortlists = null;\r\n });\r\n }\r\n function getHotelsInShortlist() {\r\n return getShortlist()\r\n .then(function (sl) {\r\n if (!sl) {\r\n return null;\r\n }\r\n var estabIds = [];\r\n angular.forEach(sl.Hotels, function (h) {\r\n estabIds.push(h.EstabId);\r\n });\r\n return hotelRehydrator.hotels(estabIds)\r\n .then(function (hotels) {\r\n return {\r\n ShortlistId: sl.ShortlistId,\r\n Hotels: hotels\r\n };\r\n });\r\n });\r\n }\r\n function getShortlist() {\r\n return _getShortlists()\r\n .then(function (sls) {\r\n return sls[0];\r\n });\r\n }\r\n function getShortlistEstabIds() {\r\n return getShortlist().then(function (sl) {\r\n if (!sl) {\r\n return [];\r\n }\r\n return arrayUtil.map(sl.Hotels, function (h) {\r\n return h.EstabId;\r\n });\r\n });\r\n }\r\n function toggleHotel(hotel) {\r\n return isHotelShortlisted(hotel).then(function (isShortlisted) {\r\n var p = isShortlisted ? removeFromShortlist(hotel) : addToShortlist(hotel);\r\n return p.then(function () {\r\n return !isShortlisted; //it worked so invert setting\r\n }, function () {\r\n return isShortlisted; //it didn't so leave it alone\r\n });\r\n });\r\n }\r\n function removeFromShortlist(hotel) {\r\n if (_.get(hotel, 'Id', 0) <= 0) {\r\n return $q.when().then(gatherShortlist);\r\n }\r\n return $http.post(url + \"removehotel\", {\r\n EstabId: hotel.Id\r\n }).then(gatherShortlist);\r\n function gatherShortlist() {\r\n return _getShortlists()\r\n .then(function (sls) {\r\n angular.forEach(sls, function (sl) {\r\n var index = arrayUtil.indexOf(sl.Hotels, function (h) {\r\n return h.EstabId === hotel.Id;\r\n });\r\n if (index >= 0) {\r\n sl.Hotels.splice(index, 1);\r\n broker.publish('hotelRemovedFromShortlist', hotel);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n function addToShortlist(hotel) {\r\n function add(sl) {\r\n return $http.post(url + \"addhotel\", {\r\n EstabId: hotel.Id,\r\n ShortlistId: sl.ShortlistId,\r\n Note: ''\r\n }).then(function (result) {\r\n sl.Hotels.push({ EstabId: hotel.Id });\r\n broker.publish('hotelAddedToShortlist', hotel);\r\n return result.data;\r\n });\r\n }\r\n return _getShortlists()\r\n .then(function (sls) {\r\n return add(sls[0]);\r\n });\r\n }\r\n function isHotelShortlisted(hotel) {\r\n return _getShortlists()\r\n .then(function (sls) {\r\n var found = false;\r\n angular.forEach(sls, function (sl) {\r\n angular.forEach(sl.Hotels, function (h) {\r\n if (h.EstabId === hotel.Id) {\r\n found = true;\r\n }\r\n });\r\n });\r\n return found;\r\n });\r\n }\r\n function getUrl() {\r\n return url;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('sortCriteria', sortCriteria);\r\n function sortCriteria(resourceService, $location, hotelCriteria, flightCriteria, dealsCriteria) {\r\n var service = {\r\n getHotelCriteria: getHotelCriteria,\r\n getFlightCriteria: getFlightCriteria,\r\n getDealsCriteria: getDealsCriteria,\r\n saveSort: saveSort,\r\n getSort: getSort,\r\n translateHotelSort: translateHotelSort,\r\n getHotelSortValueById: getHotelSortValueById\r\n };\r\n function processCriteria(values, criteria) {\r\n var itemCriteria = {\r\n name: resourceService.getDeferred(criteria.name),\r\n val: criteria.val,\r\n oneWay: criteria.oneWay,\r\n translatedKey: criteria.name,\r\n trackingLabel: criteria.name\r\n };\r\n if (criteria.defaultSort) {\r\n itemCriteria.defaultSort = criteria.defaultSort;\r\n }\r\n if (criteria.defaultOrder) {\r\n itemCriteria.defaultOrder = criteria.defaultOrder;\r\n }\r\n if (criteria.ascSuffix) {\r\n itemCriteria.ascSuffix = resourceService.getDeferred(criteria.ascSuffix);\r\n }\r\n if (criteria.descSuffix) {\r\n itemCriteria.descSuffix = resourceService.getDeferred(criteria.descSuffix);\r\n }\r\n values.push(itemCriteria);\r\n return values;\r\n }\r\n var processedHotelCriteria = [];\r\n for (var i in hotelCriteria) {\r\n processCriteria(processedHotelCriteria, hotelCriteria[i]);\r\n }\r\n if (TRPCONFIG.Domain.ReviewsEnabled) {\r\n processedHotelCriteria.splice(1, 0, {\r\n name: resourceService.getDeferred('CUSTOMERRATING'),\r\n val: [2],\r\n trackingLabel: 'CUSTOMERRATING'\r\n });\r\n }\r\n var processedFlightCriteria = [];\r\n for (var ii in flightCriteria) {\r\n processCriteria(processedFlightCriteria, flightCriteria[ii]);\r\n }\r\n var processedDealsCriteria = [];\r\n for (var iii in dealsCriteria) {\r\n processCriteria(processedDealsCriteria, dealsCriteria[iii]);\r\n }\r\n function getHotelCriteria() {\r\n return processedHotelCriteria;\r\n }\r\n function getFlightCriteria(oneWay) {\r\n if (oneWay === true) {\r\n return processedFlightCriteria.filter(function (c) {\r\n return c.oneWay;\r\n });\r\n }\r\n return processedFlightCriteria;\r\n }\r\n function translateHotelSort(criteriaValue) {\r\n if (!criteriaValue) {\r\n return {};\r\n }\r\n var criteria = _.find(processedHotelCriteria, function (hc) { return angular.isArray(hc.val) ? (_.get(hc, 'val') || []).indexOf(criteriaValue) > -1 : _.get(hc, 'val') === criteriaValue; });\r\n var defaultDir = _.get(criteria, 'defaultOrder');\r\n var otherDir = defaultDir === 'asc' ? 'desc' : 'asc';\r\n var translated = { label: criteria.translatedKey };\r\n if (defaultDir) {\r\n _.set(translated, 'direction', _.get(criteria, 'defaultSort') === criteriaValue ? defaultDir : otherDir);\r\n }\r\n return translated;\r\n }\r\n function getDealsCriteria(criteria) {\r\n if (criteria === void 0) { criteria = undefined; }\r\n if (criteria) {\r\n return _.find(processedDealsCriteria, function (dc) { return dc.val.indexOf(criteria) > -1; });\r\n }\r\n return processedDealsCriteria;\r\n }\r\n function saveSort(sortCriteria) {\r\n $location.search('sort', sortCriteria).replace();\r\n }\r\n function getSort() {\r\n var sort = _.get($location.search(), 'sort');\r\n return sort ? parseInt(sort) : undefined;\r\n }\r\n function getHotelSortValueById(id) {\r\n var sortObj = getHotelCriteria().filter(function (el) {\r\n return el.val.indexOf(id) !== -1;\r\n });\r\n return _.get(sortObj, '[0].trackingLabel');\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('trackingPixelsService', trackingPixelsService);\r\n function trackingPixelsService($filter, cookieService, $http) {\r\n var data = { bookingRef: '', costing: { totalCost: 0, currencyCode: '' }, area: '' };\r\n var flightBookingPrefix = 'SCH';\r\n var hotelBookingPrefix = 'ACM';\r\n var bundleBookingPrefix = 'BND';\r\n var marhabaBookingPrefix = 'MHB';\r\n var insuranceBookingPrefix = 'INS';\r\n var transferBookingPrefix = 'TRN';\r\n var service = {\r\n setData: setData,\r\n report: report\r\n };\r\n function _getBookingId(bookingId) {\r\n var prefixExp = new RegExp(\"(\" + flightBookingPrefix + \"|\" + hotelBookingPrefix + \"|\" + bundleBookingPrefix + \"|\" + marhabaBookingPrefix + \"|\" + insuranceBookingPrefix + \"|\" + transferBookingPrefix + \")/\\\\d+\", 'g');\r\n bookingId = bookingId.split('|').find(function (id) {\r\n return id.search(prefixExp) >= 0;\r\n });\r\n if (bookingId && bookingId.indexOf('/') > -1) {\r\n bookingId = bookingId.split('/')[1];\r\n }\r\n return bookingId || '';\r\n }\r\n function report(eventType, source) {\r\n var provider = _getProvider(source);\r\n var eventData = {\r\n VisitSource: source,\r\n EventType: eventType,\r\n ClickId: provider.clickId,\r\n BookingId: parseInt(provider.bookingId)\r\n };\r\n $http.post('/api2/b2b/tpe/', eventData);\r\n }\r\n function setData(bookingRefs, currencyCode, totalCost, hotel, rooms) {\r\n if (bookingRefs && totalCost) {\r\n data = {\r\n bookingRef: bookingRefs.join('|'),\r\n costing: { totalCost: totalCost, currencyCode: currencyCode }\r\n };\r\n }\r\n else {\r\n data.bookingRef = '';\r\n }\r\n if (hotel) {\r\n data.hotel = hotel;\r\n }\r\n if (rooms) {\r\n data.rooms = rooms;\r\n }\r\n return data;\r\n }\r\n function _getProvider(source) {\r\n var provider = {\r\n name: 'unknown',\r\n source: source || 'unknown',\r\n bookingId: _getBookingId(data.bookingRef),\r\n clickId: ''\r\n };\r\n return provider;\r\n }\r\n return service;\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .service('urlStoreService', urlStoreService);\r\n function urlStoreService($location) {\r\n var service = {\r\n pushURL: pushURL,\r\n getPreviousURL: getPreviousURL,\r\n getURLHistory: getURLHistory,\r\n cameFromWrongPath: cameFromWrongPath,\r\n isTripIdChanged: isTripIdChanged,\r\n isPreviousUrlHotelDetails: isPreviousUrlHotelDetails,\r\n isPreviousUrlHotelOptions: isPreviousUrlHotelOptions,\r\n isPreviousUrlHotelBook: isPreviousUrlHotelBook\r\n };\r\n function pushURL() {\r\n var storage = sessionStorage.getItem('URLstorage');\r\n var currURL = $location.$$path;\r\n if (storage === null) {\r\n storage = {\r\n urls: [null],\r\n previous: null\r\n };\r\n }\r\n else {\r\n storage = JSON.parse(storage);\r\n }\r\n // ignore (do not push url in the storage) if user reload the page\r\n if (storage.urls[storage.urls.length - 1] !== currURL) {\r\n storage.urls.push(currURL);\r\n // find previous url in storage\r\n storage.previous = storage.urls.slice(-2)[0];\r\n if (storage.urls.length > 4) {\r\n // delete url before previous if it equal to current url,\r\n // we need this to check if user click back then forward after that back button\r\n // it is no make sense to store this in the history\r\n if (storage.urls[storage.urls.length - 3] === currURL) {\r\n storage.urls.splice(-3, 1);\r\n }\r\n else {\r\n // clear not needed url history to save storage memory\r\n storage.urls.shift();\r\n }\r\n }\r\n }\r\n sessionStorage.setItem('URLstorage', JSON.stringify(storage));\r\n }\r\n function getPreviousURL() {\r\n var storage = sessionStorage.getItem('URLstorage');\r\n return storage ? JSON.parse(storage).previous : null;\r\n }\r\n function getURLHistory() {\r\n var storage = sessionStorage.getItem('URLstorage');\r\n return storage ? JSON.parse(storage).urls : null;\r\n }\r\n function isTripIdChanged() {\r\n var previousURL = getPreviousURL();\r\n var changed = false;\r\n if (previousURL !== null) {\r\n var splitedCurrentPath = $location.$$path.split('/');\r\n var currentTripId = splitedCurrentPath.pop();\r\n var splitedPreviousPath = previousURL.split('/');\r\n var previousTripId = splitedPreviousPath.pop();\r\n if (JSON.stringify(splitedCurrentPath) === JSON.stringify(splitedPreviousPath) && currentTripId !== previousTripId) {\r\n changed = true;\r\n }\r\n }\r\n return changed;\r\n }\r\n function isPreviousUrlHotelDetails(tripId) {\r\n var r = new RegExp(\"/?holidays/\" + tripId + \"/[^/]+\", 'gi');\r\n return r.test(getPreviousURL());\r\n }\r\n function isPreviousUrlHotelOptions(tripId) {\r\n var r = new RegExp(\"/?holidays/options/\" + tripId + \"/?\", 'gi');\r\n return r.test(getPreviousURL());\r\n }\r\n function isPreviousUrlHotelBook(tripId) {\r\n var r = new RegExp(\"/?holidays/book/\" + tripId + \"/?\", 'gi');\r\n return r.test(getPreviousURL());\r\n }\r\n function cameFromWrongPath(applicablePathRegEx) {\r\n var previousURL = getPreviousURL();\r\n return previousURL !== null ? previousURL.match(applicablePathRegEx) === null : true;\r\n }\r\n return service;\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n var VoucherModalService = /** @class */ (function () {\r\n function VoucherModalService($http, cookieService) {\r\n this.$http = $http;\r\n this.cookieService = cookieService;\r\n this.domain = TRPCONFIG.Domain;\r\n this.apiUrl = 'api/hotels/modals';\r\n }\r\n VoucherModalService.prototype.getVoucherInfo = function (options) {\r\n if (options === void 0) { options = {}; }\r\n var bd4userId = this.cookieService.get('bd4ti') || '';\r\n return this.$http.post(this.apiUrl + \"/query/?domainId=\" + this.domain.DomainId + \"&bd4userId=\" + bd4userId, options).then(function (response) { return bd4userId ? response.data : {}; });\r\n };\r\n return VoucherModalService;\r\n }());\r\n TR.VoucherModalService = VoucherModalService;\r\n angular.module('TR').service('voucherModalService', VoucherModalService);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('AgentBookingForm', AgentBookingForm);\r\n function AgentBookingForm(currentUser, agentModeService) {\r\n var abf = this;\r\n abf.user = currentUser.get();\r\n if (TRPCONFIG.Domain.isAgentMode) {\r\n agentModeService.getAgentInformation().then(function (data) {\r\n if (data && data.OfficeLocations) {\r\n abf.officeDetails = data.OfficeLocations;\r\n data.OfficeLocations.forEach(function (loc) {\r\n if (loc.Id === data.CurrentOfficeLocation) {\r\n abf.selectedOffice = loc.Name;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('AgentPaymentBox', AgentPaymentBox);\r\n function AgentPaymentBox($scope, $rootScope, paymentsService, agentModeService) {\r\n var apb = this;\r\n var selectedCard;\r\n apb.authorizeOverride = authorizeOverride;\r\n apb.hideOverrideBox = hideOverrideBox;\r\n $scope.$watch('$parent.cm.booking.UserData.PaymentDetails.CardDetails.CardType', function (id) {\r\n if (!id) {\r\n return;\r\n }\r\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideUserId = undefined;\r\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideCardId = undefined;\r\n selectedCard = paymentsService.getCardFromId($scope.$parent.cm.paymentOptions, id);\r\n apb.showOverrideBox =\r\n selectedCard.AdminOverride &&\r\n !agentModeService.hasOverridePermission($rootScope.agent);\r\n });\r\n function authorizeOverride(username, password) {\r\n if ($scope.$parent.form.cardFeeOverrideForm.$invalid) {\r\n apb.overrideErrorMessage = 'Insert username and password';\r\n apb.formInvalid = true;\r\n return;\r\n }\r\n apb.formInvalid = false;\r\n agentModeService\r\n .loginOverride(username, password)\r\n .then(_confirmOverride, _failedOverride);\r\n }\r\n function hideOverrideBox() {\r\n $scope.$parent.cm.booking.cardOption = 0;\r\n $scope.$parent.cm.updateCardType();\r\n apb.overrideErrorMessage = undefined;\r\n apb.formInvalid = false;\r\n apb.showOverrideBox = false;\r\n }\r\n function _confirmOverride(overrideInfo) {\r\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideCardId = selectedCard.cardTypeId;\r\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideUserId = overrideInfo.UserName;\r\n apb.showOverrideBox = false;\r\n apb.overrideErrorMessage = undefined;\r\n }\r\n function _failedOverride(errorInfo) {\r\n switch (errorInfo.status) {\r\n case 404:\r\n apb.overrideErrorMessage = 'User not found';\r\n break;\r\n case 401:\r\n apb.overrideErrorMessage = 'Unauthorised';\r\n break;\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('FlightCapture', FlightCapture);\r\n function FlightCapture(bookingService, $routeParams, tripService, $scope, resourceService) {\r\n var cm = this;\r\n var dir;\r\n var inverse;\r\n cm.setDepartureAirport = setDepartureAirport;\r\n cm.setDestinationAirport = setDestinationAirport;\r\n cm.setDateAndTime = setDateAndTime;\r\n cm.resetDestinationAirport = resetDestinationAirport;\r\n tripService.getTransferDestinationAirport($routeParams.tripId).then(function (airport) { return cm.destinationAirport = airport; });\r\n function _setAirport(start, end, item, booking) {\r\n booking.UserData.ConnectingFlight = booking.UserData.ConnectingFlight || {};\r\n booking.UserData.ConnectingFlight[dir + start + \"Airport\"] = item.Code;\r\n booking.UserData.ConnectingFlight[dir + start + \"AirportName\"] = item.Title;\r\n if (booking.UserData.ConnectingFlight[inverse + end + \"Airport\"] == null || booking.UserData.ConnectingFlight[inverse + end + \"Airport\"] === '') {\r\n booking.UserData.ConnectingFlight[inverse + end + \"Airport\"] = item.Code;\r\n booking.UserData.ConnectingFlight[inverse + end + \"AirportName\"] = item.Title;\r\n }\r\n bookingService.updateBooking(booking);\r\n }\r\n function _resetAirport(start, booking) {\r\n booking.UserData.ConnectingFlight[dir + start + \"Airport\"] = null;\r\n booking.UserData.ConnectingFlight[dir + start + \"AirportName\"] = null;\r\n }\r\n function _setDirection(outbound) {\r\n dir = outbound === true ? 'Outbound' : 'Inbound';\r\n inverse = dir === 'Outbound' ? 'Inbound' : 'Outbound';\r\n }\r\n function setDepartureAirport(item, outbound, booking) {\r\n if (_isValidDepartureAirport(item)) {\r\n _setDirection(outbound);\r\n _setAirport('Departure', 'Destination', item, booking);\r\n $scope.$broadcast('flash:hide');\r\n }\r\n else {\r\n _setAirport('Departure', 'Destination', {}, booking);\r\n $scope.$broadcast('flash:error', resourceService.get('DEPARTUREAIRPORTERROR'));\r\n }\r\n }\r\n function _isValidDepartureAirport(airport) {\r\n return !cm.destinationAirport || airport && airport.Code && airport.Code !== cm.destinationAirport.Code;\r\n }\r\n function setDestinationAirport(item, outbound, booking) {\r\n _setDirection(outbound);\r\n _setAirport('Destination', 'Departure', item, booking);\r\n }\r\n function setDateAndTime(date, booking, outbound) {\r\n _setDirection(outbound);\r\n booking.UserData.ConnectingFlight[dir + \"Date\"] = cm.isStartTimeApprovedByCustomer ? date : null;\r\n bookingService.updateBooking(booking);\r\n }\r\n function resetDestinationAirport(outbound, booking) {\r\n _setDirection(outbound);\r\n _resetAirport('Destination', booking);\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('SeatPlan', SeatPlan);\r\n function SeatPlan(basketStore, tripService, $routeParams, flightSeatPlanService) {\r\n var sp = this;\r\n sp.showPlan = false;\r\n sp.totalPrice = 0;\r\n sp.minCostPerPerson = 0;\r\n sp.closePlan = function () {\r\n sp.showPlan = false;\r\n };\r\n sp.resetSeats = function () {\r\n for (var _i = 0, _a = sp.flightSeatPlan.Passengers; _i < _a.length; _i++) {\r\n var p = _a[_i];\r\n for (var _b = 0, _c = p.Seats; _b < _c.length; _b++) {\r\n var s = _c[_b];\r\n s.Number = null;\r\n s.Price = 0;\r\n }\r\n }\r\n sp.totalPrice = 0;\r\n };\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n return basketStore.flight(trip.BasketId);\r\n }).then(function (flight) {\r\n if (!flight.Details.CanSelectSeats) {\r\n return;\r\n }\r\n return flightSeatPlanService.getSeatPlan({\r\n DetailsSessionId: flight.Details.DetailsId\r\n });\r\n }).then(function (plan) {\r\n if (plan) {\r\n sp.flightSeatPlan = plan;\r\n }\r\n });\r\n }\r\n})();\r\nvar TR;\r\n(function (TR) {\r\n 'use strict';\r\n var HolidayDealsResults = /** @class */ (function () {\r\n function HolidayDealsResults($location, $scope, holidayDeals, broker, pagingService, resourceService, analytics, bd4t, sortCriteria) {\r\n var _this = this;\r\n this.$location = $location;\r\n this.$scope = $scope;\r\n this.holidayDeals = holidayDeals;\r\n this.broker = broker;\r\n this.pagingService = pagingService;\r\n this.resourceService = resourceService;\r\n this.analytics = analytics;\r\n $scope.$emit('block', {\r\n title: resourceService.get('SEARCHINGDEALS'),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-holidayDealsResults'\r\n });\r\n bd4t('send', 'pageview', { type: 'deals', label: 'dealsFinderResults' });\r\n this.page = function (page) { return _this.find(page - 1, _this.sortCriterion); };\r\n this.sortCriterion = sortCriteria.getSort() || 1;\r\n this.priceMode = 0;\r\n this.newSearch = true;\r\n this.showSearchUnit = !!_.get(this.$location.search(), 'promo');\r\n broker.publish('priceModeChanged', this.priceMode);\r\n broker.subscribe('holidayDealsResults', 'REFRESHSEARCH', function (e) {\r\n _this.newSearch = (e && e.data) ? e.data.newSearch : false;\r\n _this.find(0, _this.sortCriterion);\r\n });\r\n broker.subscribe('holidayDealsResults', 'priceModeChanged', function (e) { return _this.priceMode = e.data; });\r\n // This also starts the first search\r\n $scope.$watch('hd.sortCriterion', function (v) {\r\n _this.find(0, v).then(function () { return sortCriteria.saveSort(v); });\r\n });\r\n this.dealsSortCriteria = sortCriteria.getDealsCriteria();\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('holidayDealsResults');\r\n });\r\n broker.publish('priceModeChanged', 1);\r\n }\r\n HolidayDealsResults.prototype.toggleSearchUnit = function () {\r\n this.showSearchUnit = !this.showSearchUnit;\r\n };\r\n HolidayDealsResults.prototype.toggleMap = function () {\r\n this.showMap = !this.showMap;\r\n };\r\n HolidayDealsResults.prototype.isFiltered = function () {\r\n if (!this.results) {\r\n return false;\r\n }\r\n return !_.isEqual(this.results.Info.filters, this.holidayDeals.getDefaultFilters());\r\n };\r\n HolidayDealsResults.prototype.resetFilters = function () {\r\n this.results.Info.filters = this.holidayDeals.getDefaultFilters();\r\n };\r\n HolidayDealsResults.prototype.openSlideFilter = function () {\r\n this.showFilterBox = true;\r\n };\r\n HolidayDealsResults.prototype.find = function (page, sort) {\r\n var _this = this;\r\n if (page === void 0) { page = 0; }\r\n if (sort === void 0) { sort = 1; }\r\n this.updating = true;\r\n return this.holidayDeals\r\n .find({ page: page, sort: sort })\r\n .then(function (res) { return _this.results = res; })\r\n .then(function () {\r\n _this.broker.publish('hotelsReturnedFromSearch', _this.results.Products.filter(function (p) { return !p.IsCruise; }));\r\n _this.broker.publish('UPDATEMAP');\r\n })\r\n .then(function () {\r\n _this.paging = _this.pagingService.data(_this.results.Paging.Index + 1, _this.results.Paging.Size, _this.results.Paging.Total);\r\n _this.paging.UnfilteredTotal = _this.results.Paging.UnfilteredTotal;\r\n _this.updating = false;\r\n _this.$scope.$emit('unblock');\r\n if (_.has(_this.$location.search(), 'openBox')) {\r\n var hotel = _.first(_this.results.Products.filter(function (p) { return !p.IsCruise; }));\r\n if (hotel) {\r\n _this.broker.publish('SHOWDEALS', { hotel: hotel });\r\n }\r\n }\r\n if (_this.newSearch) {\r\n _this.analytics.track('mixpanel', 'HolidayDealsListing', {\r\n cruiseCount: (_this.results.Products.filter(function (p) { return p.IsCruise; }) || []).length,\r\n hotelCount: (_this.results.Products.filter(function (p) { return !p.IsCruise; }) || []).length\r\n });\r\n _this.newSearch = false;\r\n }\r\n if (sort !== 1) {\r\n var sortElement = _.find(_this.dealsSortCriteria, function (s) { return s.val.indexOf(sort) > -1; });\r\n if (!sortElement) {\r\n return;\r\n }\r\n var dir = _.min(sortElement.val) === sort ? 'asc' : 'desc';\r\n _this.analytics.track('mixpanel', 'HolidayDealsSort', {\r\n 'ChangedTo': sortElement.name() + \" \" + dir\r\n });\r\n }\r\n }, function () { return _this.$scope.$emit('unblock'); });\r\n };\r\n return HolidayDealsResults;\r\n }());\r\n angular\r\n .module('TR')\r\n .controller('HolidayDealsResults', HolidayDealsResults);\r\n})(TR || (TR = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('Country', Country);\r\n function Country(pagingService, urlUtils, $scope, $rootScope, pageStrand, destinationService, reviewService, windowUtil, imageService, countryService, broker, resourceService, $location, $q, currentDestination) {\r\n var cm = this;\r\n var inResource = resourceService.get('InDestination');\r\n cm.lightboxOpen = false;\r\n cm.mapReady = false;\r\n cm.loading = true;\r\n cm.loadingDestinations = true;\r\n cm.loadingCoords = true;\r\n cm.loadingReviews = true;\r\n cm.loadingInfo = true;\r\n cm.loadingChildren = true;\r\n cm.destinationThumb = destinationThumb;\r\n cm.openImageGallery = openImageGallery;\r\n cm.showReviews = showReviews;\r\n cm.popupMap = popupMap;\r\n cm.showAllDestinations = $location.search().allDest;\r\n var parsed = urlUtils.parse($location.url());\r\n parsed.qs.allDest = true;\r\n cm.allDestinationsUrl = urlUtils.stripLeadingSlash(urlUtils.format(parsed));\r\n cm.toggleDestinations = toggleDestinations;\r\n cm.pageReviews = function (page) {\r\n _getReviews(cm.selectedHotel, page);\r\n };\r\n function toggleDestinations(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (!cm.showAllDestinations) {\r\n destinationService.getAllChildren(cm.destination).then(function (children) { return cm.all = buildPagePaths(children); });\r\n cm.showAllDestinations = !cm.showAllDestinations;\r\n }\r\n }\r\n broker.subscribe('CountryCtrl', 'selectHotel', function (ev) {\r\n selectHotel(ev.data.hotel, ev.data.event);\r\n });\r\n broker.subscribe('CountryCtrl', 'lightboxOpened', function () {\r\n cm.lightboxOpen = true;\r\n });\r\n broker.subscribe('CountryCtrl', 'mapReady', function () {\r\n cm.mapReady = true;\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('CountryCtrl');\r\n });\r\n function popupMap() {\r\n cm.showPopupMap = true;\r\n }\r\n function destinationThumb(dest) {\r\n return destinationService.destinationThumb(dest);\r\n }\r\n function buildPagePaths(children) {\r\n return destinationService.sortByTitle(children).map(function (child) {\r\n child.PagePath = urlUtils.appendExistingQueryString(urlUtils.stripLeadingSlash(child.PagePath));\r\n return child;\r\n });\r\n }\r\n currentDestination.getCurrentDestination().then(function (destination) {\r\n cm.destination = destination;\r\n var requests = [destinationService.getText(cm.destination), destinationService.getTopChildren(8, cm.destination)];\r\n if (cm.showAllDestinations) {\r\n requests.push(destinationService.getAllChildren(cm.destination));\r\n }\r\n $q.all(requests).then(function (result) {\r\n var text = result[0];\r\n var children = buildPagePaths(result[1]);\r\n var defaultStr = '{name}';\r\n if (cm.showAllDestinations) {\r\n cm.all = buildPagePaths(result[2]);\r\n }\r\n cm.dealsTitle = function (dest) { return String.supplant(text.List1Title || defaultStr, _getVarMap(dest)); };\r\n countryService.getTopDeals(2, cm.destination, children.slice(0, 3)).then(function (deals) {\r\n cm.greatDeals = deals;\r\n cm.loadingDeals = false;\r\n });\r\n cm.popular = children;\r\n cm.loadingDestinations = false;\r\n }).finally(function () {\r\n $rootScope.unlockScreen($scope);\r\n });\r\n });\r\n function selectHotel(hotel, e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow) {\r\n windowUtil.open(_getHotelUrl(false, hotel));\r\n }\r\n else {\r\n $location.path(_getHotelUrl(true, hotel));\r\n }\r\n }\r\n function getHotelUrl(hotel) {\r\n return _getHotelUrl(false, hotel);\r\n }\r\n function _getHotelUrl(leadingSlash, hotel) {\r\n var url = hotel.Url;\r\n var index = url.indexOf('/');\r\n if (!leadingSlash && index === 0) {\r\n url = url.substring(1);\r\n }\r\n if (leadingSlash && index !== 0) {\r\n url = \"/\" + url;\r\n }\r\n return pageStrand.adjustUrl(url, cm.destination.PageStrand);\r\n }\r\n function openImageGallery(hotel, e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var w = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\r\n var h = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\r\n cm.hotelImageIndex = 0;\r\n cm.hotelImages = [];\r\n for (var i = 0, l = hotel.NumberOfPhotos; i < l; i++) {\r\n cm.hotelImages.push({\r\n src: imageService.getImageUrl(hotel.Id, w, h, i, false)\r\n });\r\n }\r\n cm.showHotelImages = true;\r\n }\r\n function showReviews(hotel, ev) {\r\n ev.preventDefault();\r\n cm.reviews = [];\r\n cm.selectedHotel = hotel;\r\n cm.reviewPaging = pagingService.data(1, 10, hotel.CustomerRatingCount);\r\n _getReviews(hotel, cm.reviewPaging.page);\r\n cm.reviewsShowing = true;\r\n ev.stopPropagation();\r\n }\r\n function _getVarMap(dest) {\r\n // Variable mapping in string templates i.e. {name}\r\n // Also supports legacy numeric vars i.e. {0}\r\n return {\r\n 0: dest.Title,\r\n 1: inResource,\r\n name: dest.Title,\r\n in: inResource\r\n };\r\n }\r\n function _getReviews(hotel, page) {\r\n cm.loadingReviews = true;\r\n if (page === 1) {\r\n cm.loadingFirstReviews = true;\r\n }\r\n return reviewService.getReviews(hotel, page - 1).then(function (result) {\r\n cm.reviews = result.reviews;\r\n cm.loadingReviews = false;\r\n cm.loadingFirstReviews = false;\r\n cm.reviewPaging = pagingService.data(page, 10, hotel.CustomerRatingCount);\r\n });\r\n }\r\n cm.selectHotel = selectHotel;\r\n cm.getHotelUrl = getHotelUrl;\r\n cm.bookButton = function () {\r\n return resourceService.get('VIEWDETAILS');\r\n };\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('TR')\r\n .controller('HotelsFilter', HotelsFilter);\r\n function HotelsFilter($scope, hotelSearch, broker, resourceService, hotelsFilter) {\r\n var hf = this;\r\n var agg;\r\n hf.newSearch = true;\r\n hotelSearch.getFilterLazy().then(function (filter) {\r\n hf.filter = filter;\r\n });\r\n broker.subscribe('HotelsFilterCtrl', 'newSearchTriggered', newSearchTriggered);\r\n broker.subscribe('HotelsFilterCtrl', 'hotelListUpdated', function (ev) {\r\n updateFilter();\r\n if (ev.data.Aggregates) {\r\n configureFilterLimits(ev.data);\r\n }\r\n watchFilter();\r\n });\r\n $scope.$on('$destroy', function () {\r\n broker.unsubscribe('HotelsFilterCtrl');\r\n });\r\n function configureFilterLimits(results) {\r\n agg = results.Aggregates;\r\n if (hf.filterLimits == null) {\r\n hf.filterLimits = hotelsFilter.getFilterLimits(agg);\r\n }\r\n hf.moreLess = function (filterName) {\r\n if (!agg[filterName + \"Array\"] || (agg[filterName + \"Array\"].length <= hotelsFilter.config[filterName].limit)) {\r\n return '';\r\n }\r\n if (hf.filterLimits[filterName] <= hotelsFilter.config[filterName].limit) {\r\n return resourceService.get('MORE');\r\n }\r\n if (hf.filterLimits[filterName] > hotelsFilter.config[filterName].limit) {\r\n return resourceService.get('FEWER');\r\n }\r\n };\r\n hf.toggleLimit = function (filterName) {\r\n hf.filterLimits[filterName] = (hf.filterLimits[filterName] < agg[filterName + \"Array\"].length) ? agg[filterName + \"Array\"].length : hotelsFilter.config[filterName].limit;\r\n };\r\n function toggleOpenSelected() {\r\n if (hf.newSearch === false) {\r\n return;\r\n }\r\n for (var i in agg) {\r\n if (typeof agg[i + \"Array\"] !== 'undefined') {\r\n if (i.indexOf('HotelsBy') >= 0) {\r\n var name_3 = i.replace('HotelsBy', '');\r\n //check in singular and plural form of model\r\n var f = hf.filter[name_3] || hf.filter[name_3 + \"s\"];\r\n hf.filterLimits[i] = f && f.length > 0 ? agg[i + \"Array\"].length : hf.filterLimits[i];\r\n }\r\n else if (checkFacilities(i)) {\r\n hf.filterLimits[i] = agg[i + \"Array\"].length;\r\n }\r\n }\r\n }\r\n hf.newSearch = false;\r\n }\r\n toggleOpenSelected();\r\n function checkFacilities(filterName) {\r\n return _.some(agg[filterName + \"Array\"], function (v) { return v.name && _.includes(hf.filter.FacilityCodes, v.name); });\r\n }\r\n }\r\n ['removeFilter', 'removeArrayFilter', 'resetArrayFilter', 'resetBitFilter', 'resetRangeFilter', 'resetFilters'].forEach(function (fn) {\r\n hf[fn] = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n stopWatch();\r\n return hotelSearch[fn].apply(hotelSearch, args).then(watchFilter).then(updateFilter);\r\n };\r\n });\r\n hf.resetFacilityFilter = function (group) {\r\n stopWatch();\r\n var codesInGroup = [];\r\n for (var code in agg[group]) {\r\n codesInGroup.push(code);\r\n }\r\n return hotelSearch.removeFiltersIn('FacilityCodes', codesInGroup).then(watchFilter).then(updateFilter);\r\n };\r\n function updateFilter() {\r\n hf.filter = hotelSearch.getFilter();\r\n }\r\n var canceller;\r\n function stopWatch() {\r\n if (canceller != null) {\r\n canceller();\r\n }\r\n }\r\n function watchFilter() {\r\n stopWatch();\r\n canceller = $scope.$watch('hf.filter', _.debounce(function (f, o) {\r\n if (f == null || _.isEqual(f, o)) {\r\n return;\r\n }\r\n //this filter has changed therefore we have to remove any estab group filter just in case\r\n hotelSearch.filter().then(updateFilter);\r\n }, 300), true);\r\n }\r\n //the reason that filters need to be reset when a new search is triggered is because the filter criteria\r\n //are built from the aggregates which will be completely different when the search results load. So\r\n //don't be tempted to remove this. Seriously.\r\n //Furthermore when we trigger a new search, becuase we have to reset the filters we also need to suspend\r\n //the watch until those results have been resolved otherwise we get double calling of the getHotelsFromSession\r\n //Fragile? absolutely.\r\n function newSearchTriggered() {\r\n hf.newSearch = true;\r\n hf.resetFilters(true).then(stopWatch);\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var BasePopupService = /** @class */ (function () {\r\n function BasePopupService($compile, $q, $rootScope, $timeout) {\r\n this.$compile = $compile;\r\n this.$q = $q;\r\n this.$rootScope = $rootScope;\r\n this.$timeout = $timeout;\r\n this.defaultOptions = {\r\n popupContainer: 'body'\r\n };\r\n }\r\n BasePopupService.prototype.showPopup = function (template, popupOptions) {\r\n var _this = this;\r\n var defer = this.$q.defer();\r\n var options = Object.assign(this.defaultOptions, popupOptions);\r\n var scope = this._createScope(defer, options.popupScope || {});\r\n var compiledElement = this.$compile(template)(scope);\r\n var container = angular.element(options.popupContainer);\r\n this.addPopupToContainer(container, compiledElement);\r\n return defer.promise.then(function (val) {\r\n scope.showPopup = false;\r\n _this.removePopupFromContainer(compiledElement);\r\n return _this.$q.when(val);\r\n }, function (val) {\r\n scope.showPopup = false;\r\n _this.removePopupFromContainer(compiledElement);\r\n return _this.$q.reject(val);\r\n });\r\n };\r\n BasePopupService.prototype.addPopupToContainer = function (container, template) {\r\n return container.append(template);\r\n };\r\n BasePopupService.prototype.removePopupFromContainer = function (element) {\r\n var _this = this;\r\n setTimeout(function () {\r\n element.remove();\r\n _this.$rootScope.$apply();\r\n });\r\n };\r\n BasePopupService.prototype._createScope = function (defer, customScope) {\r\n var sc = this.$rootScope.$new();\r\n var mergedScope = Object.assign(sc, __assign({ defer: defer, showPopup: true, close: function (value) {\r\n defer.reject({\r\n result: 'close',\r\n value: value\r\n });\r\n },\r\n confirm: function (value) {\r\n defer.resolve({\r\n result: 'confirm',\r\n value: value\r\n });\r\n },\r\n cancel: function (value) {\r\n defer.reject({\r\n result: 'cancel',\r\n value: value\r\n });\r\n } }, customScope));\r\n _.functions(mergedScope).forEach(function (f) {\r\n mergedScope[f] = mergedScope[f].bind(mergedScope);\r\n });\r\n return mergedScope;\r\n };\r\n return BasePopupService;\r\n }());\r\n Core.BasePopupService = BasePopupService;\r\n angular.module('TR').service('basePopupService', BasePopupService);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var template = \"\\n \\n
        \\n \\n
        \\n \\n \\n
        \\n
        \\n
        \\n \";\r\n var ChangeDurationPopupService = /** @class */ (function () {\r\n function ChangeDurationPopupService(basePopupService, $rootScope) {\r\n this.basePopupService = basePopupService;\r\n this.defaultPopupScope = {\r\n popupMessage: '',\r\n popupHeader: '',\r\n nightsButtonLabel: '',\r\n newNightsButtonLabel: ''\r\n };\r\n }\r\n ChangeDurationPopupService.prototype.showPopup = function (customScope) {\r\n var defScope = this.defaultPopupScope;\r\n var popupParams = {\r\n popupContainer: 'body',\r\n popupScope: __assign({}, defScope, customScope, { confirm: function (val) {\r\n if (val === 'changeDuration') {\r\n TRPCONFIG.Domain.ChangeHotelNightsDuration = true;\r\n }\r\n else {\r\n TRPCONFIG.Domain.ChangeHotelNightsDuration = false;\r\n }\r\n this.defer.resolve({\r\n result: 'confirm'\r\n });\r\n }, close: function (value) {\r\n this.defer.reject({\r\n result: 'close',\r\n value: value\r\n });\r\n this.$rootScope.$emit('unblock');\r\n },\r\n cancel: function (value) {\r\n this.defer.reject({\r\n result: 'cancel',\r\n value: value\r\n });\r\n this.$rootScope.$emit('unblock');\r\n } })\r\n };\r\n return this.basePopupService.showPopup(template, popupParams);\r\n };\r\n return ChangeDurationPopupService;\r\n }());\r\n Core.ChangeDurationPopupService = ChangeDurationPopupService;\r\n angular.module('TR').service('changeDurationPopupService', ChangeDurationPopupService);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var template = \"\\n \\n
        \\n \\n
        \\n \\n \\n
        \\n
        \\n
        \\n \";\r\n var ConfirmPopupService = /** @class */ (function () {\r\n function ConfirmPopupService(basePopupService, resourceService) {\r\n this.basePopupService = basePopupService;\r\n this.resourceService = resourceService;\r\n this.defaultPopupScope = {\r\n popupMessage: '',\r\n popupHeader: '',\r\n okButtonLabel: resourceService.get('OK'),\r\n cancelButtonLabel: resourceService.get('CANCEL')\r\n };\r\n }\r\n ConfirmPopupService.prototype.showPopup = function (customScope) {\r\n var defScope = this.defaultPopupScope;\r\n var popupParams = {\r\n popupContainer: 'body',\r\n popupScope: __assign({}, defScope, customScope)\r\n };\r\n return this.basePopupService.showPopup(template, popupParams);\r\n };\r\n return ConfirmPopupService;\r\n }());\r\n Core.ConfirmPopupService = ConfirmPopupService;\r\n angular.module('TR').service('confirmPopupService', ConfirmPopupService);\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var template = \"\\n \\n
        \\n
        \\n
        \\n
        {{showSuccess ? successMessage : titleLabel}}
        \\n \\n \\n
        \\n
        \\n
        \\n
        \\n \";\r\n var SignUpPopupService = /** @class */ (function () {\r\n function SignUpPopupService(basePopupService, resourceService, analytics) {\r\n this.basePopupService = basePopupService;\r\n this.resourceService = resourceService;\r\n this.analytics = analytics;\r\n this.signUpPopupBackgroundImageUrl = this._getBackgroundImageUrl();\r\n }\r\n SignUpPopupService.prototype._getBackgroundImageUrl = function () {\r\n var backgroundUrl;\r\n var configValue = TRPCONFIG.Domain2.SignUpPopupBackgroundUrl;\r\n try {\r\n var cfg = JSON.parse(configValue);\r\n backgroundUrl = TRPCONFIG.Rtl ? cfg.RightToLeft : cfg.LeftToRight;\r\n }\r\n catch (err) { }\r\n return backgroundUrl || configValue;\r\n };\r\n SignUpPopupService.prototype._sendPopupClosedGAEvent = function (_a) {\r\n var value = _a.value;\r\n if (!value || !value.isSuccess) {\r\n this.analytics.trackEvent({\r\n category: 'newsletterSignup',\r\n action: 'click',\r\n label: 'PopUp_Closed',\r\n dimension9: 'newsletterSignup'\r\n });\r\n }\r\n };\r\n SignUpPopupService.prototype.showPopup = function () {\r\n return this.basePopupService.showPopup(template, { popupScope: {\r\n showSuccess: false,\r\n continueButtonLabel: this.resourceService.get('CONTINUE'),\r\n successMessage: this.resourceService.get('NEWSLETTERSIGNUPREGISTRATIONSUCCESSFUL'),\r\n titleLabel: this.resourceService.get('NEWSLETTERSIGNUPPOPUPTITLE'),\r\n unsubscriptionNotes: this.resourceService.get('NEWSLETTERSIGNUPPOPUPUNSUBSCRIBENOTES'),\r\n subscribeButtonLabel: this.resourceService.get('NEWSLETTERSIGNUPPOPUPSUBSCRIBEBUTTON'),\r\n styles: {\r\n 'background-image': \"url(\" + this.signUpPopupBackgroundImageUrl + \")\"\r\n },\r\n confirm: function () {\r\n this.showSuccess = true;\r\n localStorage.setItem('subscriptionState', 'subscribed');\r\n },\r\n continue: function () {\r\n this.defer.resolve({\r\n result: 'confirm'\r\n });\r\n }\r\n }\r\n })\r\n .catch(this._sendPopupClosedGAEvent.bind(this));\r\n };\r\n return SignUpPopupService;\r\n }());\r\n Core.SignUpPopupService = SignUpPopupService;\r\n angular.module('TR').service('signUpPopupService', SignUpPopupService);\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('baseMap', baseMap);\r\n function baseMap(maps, broker) {\r\n // const template = `\r\n //
        \r\n //
        \r\n //
        \r\n //
        \r\n //
        \r\n //
        \r\n // `;\r\n // TODO template has now become domain specific as TR uses different spinner html.\r\n // This can be undone when we re-align.\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n zoom: '@',\r\n thumbnail: '=',\r\n visible: '=',\r\n dealsMode: '@',\r\n hotelPosition: '=',\r\n disableUpdates: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=BaseHotelMap',\r\n link: link\r\n };\r\n function link(scope, el) {\r\n var map = null;\r\n scope.$watch('visible', function (v) {\r\n if (!v) {\r\n return;\r\n }\r\n maps.loadScript(initializeMap);\r\n });\r\n function initializeMap() {\r\n maps.getLocations(scope.hotelPosition, null, !!scope.dealsMode)\r\n .then(populateMap);\r\n if (!scope.disableUpdates) {\r\n broker.subscribe('baseMap', 'UPDATEMAP', function () { return maps.getLocations(!!scope.dealsMode).then(populateMap); });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('baseMap');\r\n });\r\n }\r\n }\r\n function populateMap(mapInfo) {\r\n var canvas = el.find('.map-canvas')[0];\r\n var center = mapInfo.centre;\r\n var zoom = parseInt(scope.zoom || 4);\r\n if (!map) {\r\n map = maps.buildMap(canvas, center, zoom, null, scope.thumbnail);\r\n }\r\n if (mapInfo.markers) {\r\n if (scope.thumbnail) {\r\n var hotelId = scope.thumbnail.activeHotel.Id;\r\n var hotelMarker = null;\r\n for (var _i = 0, _a = mapInfo.markers; _i < _a.length; _i++) {\r\n var marker = _a[_i];\r\n if (marker.estabId === hotelId) {\r\n hotelMarker = marker;\r\n break;\r\n }\r\n }\r\n map = maps.buildMap(canvas, null, zoom, hotelMarker, scope.thumbnail);\r\n map = maps.addMarkers(map, [hotelMarker]);\r\n }\r\n else {\r\n map = maps.addMarkers(map, mapInfo.markers);\r\n map.fitBounds(mapInfo.bounds);\r\n google.maps.event.addListenerOnce(map, 'idle', function () {\r\n map.fitBounds(mapInfo.bounds);\r\n if (scope.zoom) {\r\n map.setZoom(zoom);\r\n }\r\n });\r\n }\r\n }\r\n broker.subscribe('baseMap', 'hotelListUpdated', initializeMap);\r\n broker.subscribe('baseMap', 'mapTabSelected', initializeMap);\r\n scope.initialized = true;\r\n /* If the map is hidden and the window is resized we have to build it again */\r\n google.maps.event.clearListeners(window, 'resize');\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('comboboxMkc', comboboxMkc);\r\n function comboboxMkc() {\r\n return {\r\n restrict: 'E',\r\n link: _linker,\r\n require: '^combobox'\r\n };\r\n function _linker(scope, el, attr, combobox) {\r\n var parentElement = combobox.element;\r\n var searchField = parentElement.find('input');\r\n var list = parentElement.find('ul');\r\n var pScope = scope.$parent;\r\n var keyBehaviours = {};\r\n searchField.on('keydown.combo', function keySelector(e) {\r\n var fn = keyBehaviours[e.keyCode] || angular.noop;\r\n fn(e);\r\n });\r\n list.on('mouseenter.combo', 'li', function selectItem() {\r\n $(this).addClass('combobox-selected');\r\n });\r\n list.on('mouseleave.combo', 'li', function selectItem() {\r\n $('.menu-list li').removeClass('combobox-selected');\r\n });\r\n scope.$on('$destroy', function () {\r\n searchField.off('keydown.combo');\r\n list.off('mouseenter.combo');\r\n list.off('mouseleave.combo');\r\n });\r\n keyBehaviours[9] = function tab() {\r\n list.hide();\r\n };\r\n // Return\r\n keyBehaviours[13] = function keyboardSelection() {\r\n pScope.clickHandler(_getScopeFromElement());\r\n };\r\n // Up arrow\r\n keyBehaviours[38] = _keyboardMovement(true);\r\n // Down arrow\r\n keyBehaviours[40] = _keyboardMovement();\r\n // Escape\r\n keyBehaviours[27] = function hideMenu() {\r\n pScope.menu = false;\r\n scope.$apply();\r\n };\r\n function _getScopeFromElement() {\r\n var se = $('.combobox-selected').scope();\r\n return se.d || {};\r\n }\r\n function _scrollOffset(sel) {\r\n var selHeight = sel.outerHeight();\r\n var elementTop = sel.offset() ? sel.offset().top : 0;\r\n var elementBottom = elementTop + selHeight;\r\n var listTop = list.offset() ? list.offset().top : 0;\r\n var listBottom = listTop + list.innerHeight();\r\n switch (true) {\r\n case (listTop >= elementTop):\r\n return -selHeight;\r\n case (listBottom <= elementBottom):\r\n return selHeight;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /* direction === true -> UP\r\n direction == false -> DOWN */\r\n function _keyboardMovement(direction) {\r\n return function () {\r\n var current = list.find('.combobox-selected');\r\n current.removeClass('combobox-selected');\r\n current = direction ? current.prev() : current.next();\r\n list[0].scrollTop += _scrollOffset(current);\r\n if (!current.length) {\r\n var elements = list.find('li');\r\n var index = direction ? elements.length - 1 : 0;\r\n current = $(elements[index]);\r\n list[0].scrollTop = direction ? list[0].scrollHeight : 0;\r\n }\r\n current.addClass('combobox-selected');\r\n };\r\n }\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var FlightLeg = /** @class */ (function () {\r\n function FlightLeg(resourceService, $filter) {\r\n this.resourceService = resourceService;\r\n this.$filter = $filter;\r\n this.isFlightsPage = false;\r\n this.displayFlightViaInfo = TRPCONFIG.Domain.DisplayFlightViaInfo && this.leg.Segments\r\n && this.leg.Segments.length > 0;\r\n this.displayMixedCarrierMessage = this.leg.IsMixedCarrier &&\r\n this.leg.NumberOfStops > 0 &&\r\n this.displayFlightViaInfo === false;\r\n this.displayCodeShareInfo = TRPCONFIG.Domain.DisplayFlightCodeshareInfo || false;\r\n this.isFlightsPage = window.location.pathname.includes('flights')\r\n || window.location.pathname.includes('quote');\r\n if (this.displayMixedCarrierMessage) {\r\n this.mixedCarrierMessage = this.resourceService.get('OPERATEDBYMIXED');\r\n }\r\n if (this.displayFlightViaInfo || this.displayCodeShareInfo) {\r\n this.viaInfo = this.getFlightViaInfo();\r\n }\r\n }\r\n FlightLeg.prototype.getNumberOfStops = function () {\r\n var msg = this.resourceService.get('NOSTOP');\r\n if (this.leg.NumberOfStops === 1) {\r\n msg = this.resourceService.get('1STOP');\r\n }\r\n else if (this.leg.NumberOfStops > 1) {\r\n msg = String.format(this.resourceService.get('XSTOPS'), this.leg.NumberOfStops);\r\n }\r\n return msg;\r\n };\r\n FlightLeg.prototype.getFlightViaInfo = function () {\r\n var _this = this;\r\n var info = [];\r\n angular.forEach(this.leg.Segments, function (segment, i) {\r\n if (segment.CodeshareAirlineName !== segment.CarrierName) {\r\n var carrier = segment.CarrierTradingName;\r\n if (segment.CarrierTradingName === '') {\r\n carrier = segment.CarrierName;\r\n }\r\n info.push({\r\n AirportCode: _this.leg.LegType === 'outbound'\r\n ? segment.DestinationAirportCode\r\n : segment.DepartureAirportCode,\r\n FlightNumber: segment.FlightNumber,\r\n CarrierTradingName: carrier\r\n });\r\n }\r\n });\r\n return info.map(function (item) {\r\n var tradingName = '';\r\n if (item.CarrierTradingName && item.CarrierTradingName !== '') {\r\n tradingName = item.CarrierTradingName.toLowerCase();\r\n }\r\n return {\r\n viaflight: String.format(_this.resourceService.get('VIASUMMARY'), item.AirportCode, item.FlightNumber),\r\n operatedBy: String.format(_this.resourceService.get('OPERATEDBYCARRIER'), '' + tradingName + '')\r\n };\r\n });\r\n };\r\n return FlightLeg;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('flightLeg', function ($filter) {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n bindToController: {\r\n leg: '='\r\n },\r\n controller: FlightLeg,\r\n controllerAs: 'fl',\r\n templateUrl: 'partials/home/directivetemplate?type=FlightLeg',\r\n link: function (scope, el, attr, controller) {\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var FlightListing = /** @class */ (function () {\r\n function FlightListing(basketStore, broker, resourceService, $scope, occupancyService, basketService, flightSearch, analytics, flightDetail, brandedFareTypesService, guidService, hotelSearch) {\r\n var _this = this;\r\n this.basketStore = basketStore;\r\n this.broker = broker;\r\n this.resourceService = resourceService;\r\n this.$scope = $scope;\r\n this.occupancyService = occupancyService;\r\n this.basketService = basketService;\r\n this.flightSearch = flightSearch;\r\n this.analytics = analytics;\r\n this.flightDetail = flightDetail;\r\n this.brandedFareTypesService = brandedFareTypesService;\r\n this.guidService = guidService;\r\n this.hotelSearch = hotelSearch;\r\n this.isFlightsPage = false;\r\n this.trip = localStorage.getItem('trip');\r\n this.qtys = sessionStorage.getItem('priceQtys');\r\n this.hotel = sessionStorage.getItem('hotelData');\r\n this.flightsSkywards = sessionStorage.getItem('flightsSkywards');\r\n this.skywardsPoints = 0;\r\n this.flightMiles = 0;\r\n this.sentPayload = false;\r\n this.skywardsFlightMiles = sessionStorage.getItem('SkywardsMilesFlights');\r\n //update properties after flight provided ( selected flight )\r\n if (!this.flight) {\r\n this.buttonType = this.buttonType ? this.buttonType : 'select';\r\n var flightWatch_1 = this.$scope.$watch('fl.flight', function (value) {\r\n if (value) {\r\n _this.update();\r\n flightWatch_1();\r\n }\r\n });\r\n }\r\n else {\r\n this.update();\r\n }\r\n }\r\n FlightListing.prototype.update = function () {\r\n this.recentlyViewed = this.isFirst && this.flight.RecentlyViewedIndex === 1;\r\n this.buttonType = this.buttonType ? this.buttonType : 'select';\r\n this.isFlightsPage = window.location.pathname.includes('flights')\r\n || window.location.pathname.includes('quote');\r\n this.flight && this.flight.Legs && this.flight.Legs[0] ?\r\n this.flight.Legs[0].isFlightsPage = this.isFlightsPage : '';\r\n this.flight && this.flight.Legs && this.flight.Legs[1] ?\r\n this.flight.Legs[1].isFlightsPage = this.isFlightsPage : '';\r\n this.showButton = this.buttonType === 'none' ? false : true;\r\n this.showTax = this.showPrice && this.getTotalPrice() > 0 || false;\r\n this.showDeposit = this.showInfo && this.flight && this.flight.DepositAmount > 0;\r\n this.showBaggage = TRPCONFIG.Domain.DisplayBaggageFeesLink\r\n && this.flight\r\n && this.flight.Legs\r\n && this.flight.Legs.some(function (leg) { return leg.IsMixedCarrier === true; });\r\n };\r\n FlightListing.prototype.init = function () {\r\n this.depositMessage = this.signedIn\r\n ? this.resourceService.get('FLIGHTLISTINGDEPOSITCAPTIONSIGNEDIN')\r\n : this.resourceService.get('FLIGHTLISTINGDEPOSITCAPTION');\r\n this.flightButtonText = this.buttonType && this.buttonType.toLowerCase() === 'keep'\r\n ? this.resourceService.get('KEEPTHISFLIGHT')\r\n : this.resourceService.get('SELECTFLIGHTTEXT');\r\n };\r\n FlightListing.prototype.showDetails = function () {\r\n var passengers = this.occupancyService.getTotalPeopleCounts();\r\n this.broker.publish('showModalFlightDetails', { flight: this.flight, passengers: passengers });\r\n };\r\n FlightListing.prototype.changeFlight = function () {\r\n this.analytics.track('mixpanel', 'ChangeFlightClick');\r\n this.flightSearch.resetPageIndex();\r\n this.basketService.changeJourneyUrl(10);\r\n };\r\n FlightListing.prototype.stops = function (n) {\r\n return n === '' ? undefined : new Array(parseInt(n, 10));\r\n };\r\n FlightListing.prototype.selectFlightAction = function () {\r\n this.flightAction({ f: this.flight });\r\n };\r\n FlightListing.prototype.calculateSkywardsPoints = function (flight) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n var trip, qtys, defaultFlightData, legs_1, hotel, adultQty, childQty, infantQty, adultTax, childTax, infantTax, totalFlightTax, packagePrice, flightId;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n trip = JSON.parse(this.trip);\r\n qtys = JSON.parse(this.qtys);\r\n this.flightInfo = flight;\r\n if (!TRPCONFIG.Domain.FlightMiles) {\r\n TRPCONFIG.Domain.FlightMiles = [];\r\n }\r\n if (qtys === null || qtys === undefined) {\r\n defaultFlightData = JSON.parse(sessionStorage.getItem('DefaultFlight') || '');\r\n if (defaultFlightData && defaultFlightData.Details.Itinerary.AdultFareQuantity) {\r\n qtys = {};\r\n qtys.AdultTaxQuantity = defaultFlightData.Details.Itinerary.AdultFareQuantity;\r\n qtys.ChildTaxQuantity = defaultFlightData.Details.Itinerary.ChildTaxQuantity;\r\n qtys.InfantTaxQuantity = defaultFlightData.Details.Itinerary.InfantTaxQuantity;\r\n }\r\n }\r\n if (!(flight && flight.Legs && flight.Legs.length)) return [3 /*break*/, 2];\r\n legs_1 = flight.Legs;\r\n hotel = JSON.parse(this.hotel);\r\n if (!(qtys && qtys.AdultTaxQuantity)) return [3 /*break*/, 2];\r\n adultQty = qtys.AdultTaxQuantity;\r\n childQty = qtys.ChildTaxQuantity;\r\n infantQty = qtys.InfantTaxQuantity;\r\n adultTax = flight.AdultTax.Amount * adultQty;\r\n childTax = flight.ChildTax.Amount * childQty;\r\n infantTax = flight.InfantTax.Amount * infantQty;\r\n totalFlightTax = adultTax + childTax + infantTax;\r\n packagePrice = flight.totalHolidayPrice - totalFlightTax;\r\n flightId = flight.FlightId;\r\n if (!(packagePrice && !Number.isNaN(packagePrice))) return [3 /*break*/, 2];\r\n if (!(this.sentPayload === false)) return [3 /*break*/, 2];\r\n this.sentPayload = true;\r\n return [4 /*yield*/, this.brandedFareTypesService.payloadEntry(flightId, trip, legs_1, hotel, packagePrice)\r\n .then(function (result) {\r\n if (result[0].Miles && TRPCONFIG.Domain.FlightMiles) {\r\n TRPCONFIG.Domain.FlightMiles.push(result[0].Miles);\r\n sessionStorage.setItem('FlightMiles', JSON.stringify(TRPCONFIG.Domain.FlightMiles));\r\n _this.skywardsPoints = result[0].Miles;\r\n _this.getFlightMiles(flight, legs_1);\r\n }\r\n })];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n FlightListing.prototype.getPassengerCount = function () {\r\n var priceQtys = sessionStorage.getItem('priceQtys');\r\n var defaultFlight = sessionStorage.getItem('DefaultFlight');\r\n var defaultFlightDetails = defaultFlight ? JSON.parse(defaultFlight) : null;\r\n var passengers = priceQtys ? JSON.parse(priceQtys) : defaultFlightDetails ?\r\n defaultFlightDetails.Details.Itinerary : null;\r\n return {\r\n infantCount: passengers.InfantFareQuantity ? passengers.InfantFareQuantity : 0,\r\n childCount: passengers.ChildFareQuantity ? passengers.ChildFareQuantity : 0,\r\n adultCount: passengers.AdultFareQuantity ? passengers.AdultFareQuantity : 0\r\n };\r\n };\r\n FlightListing.prototype.getBasePrice = function () {\r\n var p = this.getPassengerCount();\r\n var storeSelectedFlight = sessionStorage.getItem('storeSelectedFlight');\r\n var defaultFlight = sessionStorage.getItem('DefaultFlight');\r\n var defaultFlightDetails = defaultFlight ? JSON.parse(defaultFlight) : null;\r\n var selectedFlightData = storeSelectedFlight ? JSON.parse(storeSelectedFlight) : defaultFlightDetails ?\r\n defaultFlightDetails.Details.Itinerary : null;\r\n return ((p.adultCount * ((selectedFlightData.LeadAdultPrice ?\r\n selectedFlightData.LeadAdultPrice : selectedFlightData.AdultFare.Amount)\r\n + (selectedFlightData.LeadAdultTax ?\r\n selectedFlightData.LeadAdultTax : selectedFlightData.AdultTax.Amount)))\r\n + (p.childCount * (selectedFlightData.ChildFare.Amount + selectedFlightData.ChildTax.Amount))\r\n + (p.infantCount * (selectedFlightData.InfantFare.Amount + selectedFlightData.InfantTax.Amount)));\r\n };\r\n FlightListing.prototype.getTotalPrice = function () {\r\n var p = this.getPassengerCount();\r\n return ((p.adultCount * (this.flight.LeadAdultPrice + this.flight.LeadAdultTax))\r\n + (p.childCount * (this.flight.ChildFare.Amount + this.flight.ChildTax.Amount))\r\n + (p.infantCount * (this.flight.InfantFare.Amount + this.flight.InfantTax.Amount)));\r\n };\r\n FlightListing.prototype.isHFareFlightType = function () {\r\n return this.flightDetail.isHFlightType(this.flight);\r\n };\r\n FlightListing.prototype.getCabinCode = function (cabinType) {\r\n switch (cabinType) {\r\n case 'Economy':\r\n return 'Y';\r\n case 'Premium Economy':\r\n return 'W';\r\n case 'Business':\r\n return 'J';\r\n case 'First':\r\n return 'F';\r\n default:\r\n return '';\r\n }\r\n };\r\n FlightListing.prototype.getDepartureCode = function (legs) {\r\n for (var i = 0; i < legs.length; i++) {\r\n if (legs[i].LegType === 'outbound') {\r\n return legs[i].DepartureAirport.Code;\r\n }\r\n }\r\n };\r\n FlightListing.prototype.getDestinationCode = function (legs) {\r\n for (var i = 0; i < legs.length; i++) {\r\n if (legs[i].LegType === 'outbound') {\r\n return legs[i].ArrivalAirport.Code;\r\n }\r\n }\r\n };\r\n FlightListing.prototype.getFareBrandTitle = function (supplierfareclass) {\r\n switch (supplierfareclass) {\r\n case 'F':\r\n return 'First Flex Plus';\r\n case 'A':\r\n return 'First Flex';\r\n case 'Z':\r\n return 'First Others';\r\n case 'J':\r\n return 'Business Flex Plus';\r\n case 'C':\r\n return 'Business Flex Plus';\r\n case 'I':\r\n return 'Business Flex';\r\n case 'O':\r\n return 'Business Saver';\r\n case 'H':\r\n return 'Business Special';\r\n case 'D':\r\n return 'Business Others';\r\n case 'P':\r\n return 'Business Others';\r\n case 'W':\r\n return 'Premium Economy Flex Plus';\r\n case 'E':\r\n return 'Premium Economy Flex Plus';\r\n case 'N':\r\n return 'Premium Economy Others';\r\n case 'Y':\r\n return 'Economy Flex Plus';\r\n case 'R':\r\n return 'Economy Flex Plus';\r\n case 'M':\r\n return 'Economy Flex';\r\n case 'B':\r\n return 'Economy Flex';\r\n case 'U':\r\n return 'Economy Flex';\r\n case 'K':\r\n return 'Economy Flex';\r\n case 'Q':\r\n return 'Economy Saver';\r\n case 'L':\r\n return 'Economy Saver';\r\n case 'T':\r\n return 'Economy Saver';\r\n case 'X':\r\n return 'Economy Special';\r\n case 'V':\r\n return 'Economy Saver';\r\n case 'G':\r\n return 'Economy Others';\r\n case 'S':\r\n return 'Economy Others';\r\n default:\r\n return '';\r\n }\r\n };\r\n FlightListing.prototype.getFlightMiles = function (flight, legs) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var origin, destination, spplierClassFirstLeg, spplierClassSecondLeg, getBrandTitleFirstLeg, getBrandTitleSecondLeg, legsAreNotEmpty, firstLegEqualsSecondLeg;\r\n return __generator(this, function (_a) {\r\n origin = this.getDepartureCode(legs);\r\n destination = this.getDestinationCode(legs);\r\n spplierClassFirstLeg = flight.Legs[0].Segments[0].SupplierFareClass;\r\n spplierClassSecondLeg = flight.Legs[1].Segments[0].SupplierFareClass;\r\n getBrandTitleFirstLeg = this.getFareBrandTitle(spplierClassFirstLeg);\r\n getBrandTitleSecondLeg = this.getFareBrandTitle(spplierClassSecondLeg);\r\n legsAreNotEmpty = getBrandTitleFirstLeg !== '' && getBrandTitleSecondLeg !== '';\r\n firstLegEqualsSecondLeg = legsAreNotEmpty && getBrandTitleFirstLeg === getBrandTitleSecondLeg;\r\n this.brandedFareTypesService.getFareInfo(legsAreNotEmpty, firstLegEqualsSecondLeg, this.skywardsFlightMiles, flight, this.hotelSearch, origin, destination, getBrandTitleFirstLeg, getBrandTitleSecondLeg);\r\n return [2 /*return*/];\r\n });\r\n });\r\n };\r\n return FlightListing;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('flightListing', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n bindToController: {\r\n flight: '=',\r\n appliedBags: '=',\r\n nonInfantPassengers: '=',\r\n isFirst: '=',\r\n signedIn: '=',\r\n buttonType: '@',\r\n flightAction: '&',\r\n showPrice: '=',\r\n basePrice: '@',\r\n showInfo: '=',\r\n showChangeFlight: '=',\r\n trackingPage: '=',\r\n busy: '='\r\n },\r\n controller: FlightListing,\r\n controllerAs: 'fl',\r\n templateUrl: 'partials/home/directivetemplate?type=FlightListing',\r\n link: function (scope, el, attr, controller) {\r\n controller.init();\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\nvar Core;\r\n(function (Core) {\r\n var FlightStops = /** @class */ (function () {\r\n function FlightStops() {\r\n }\r\n FlightStops.prototype.getStops = function () {\r\n return this.stops === '' ? undefined : new Array(parseInt(this.stops, 10));\r\n };\r\n return FlightStops;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('flightStops', function () {\r\n return {\r\n scope: {},\r\n restrict: 'E',\r\n replace: true,\r\n bindToController: {\r\n stops: '@'\r\n },\r\n controller: FlightStops,\r\n controllerAs: 'fs',\r\n template: '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        '\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('infoWindow', infoWindow);\r\n function infoWindow($location, $routeParams, $filter, broker, preferences, occupancyService, resourceService, tripService, basketService, currentDestination, windowUtil, pageStrand, urlUtils, holidayDeals, hotelService) {\r\n // TODO this is a hack to let TR have a uniqiue template. The template needs to be an embedded string or\r\n // else the info window has a loading delay and can fail to load altogether on some devices.\r\n var viewHotelButton = \"\\n \";\r\n var templatesByTenant = {\r\n 1: \"\\n
        \\n
        \\n
        \\n
        \\n

        \\n \\n {{ ::hotel.Title }}\\n {{ ::(hotel.Name || hotel.Title) }}\\n \\n {{ ::(hotel.Name || hotel.Title) }}\\n

        \\n
          \\n
        • \\n \\n 0\\\">\\n \\n {{ ::hotel.CustomerRating }}\\n {{ ::hotel.CustomerRatingTitle }}\\n ({{ ::hotel.CustomerRatingCount }} {{ ::reviewString }})\\n \\n \\n
        • \\n
        • \\n
          \\n \\n \\n {{ hotel.OriginalCostStr }}\\n \\n \\n \\n {{hotel.displayPrice}}\\n \\n
          \\n
        • \\n
        \\n
        \\n \" + viewHotelButton + \"\\n
        \\n
        \"\r\n };\r\n var templateFallback = \"\\n
        \\n
        \\n \\n
        \\n
        \\n

        \\n \\n {{ ::hotel.Title }}\\n {{ ::(hotel.Name || hotel.Title) }}\\n \\n {{ ::(hotel.Name || hotel.Title) }}\\n \\n

        \\n
        \\n {{ ::hotel.AcomType }} | {{ ::hotel.Address }}\\n
        \\n \\n
        0\\\">\\n {{ ::hotel.CustomerRating }} \\n {{ ::hotel.CustomerRatingTitle }} \\n \\n ({{ ::hotel.CustomerRatingCount }} {{ ::reviewString }})\\n \\n
        \\n
        {{ hotel.displayPrice }}
        \\n \" + viewHotelButton + \"\\n
        \\n
        \";\r\n return {\r\n restrict: 'E',\r\n scope: true,\r\n template: templatesByTenant[TRPCONFIG.Domain.TenantId] ? templatesByTenant[TRPCONFIG.Domain.TenantId] : templateFallback,\r\n link: link\r\n };\r\n function link(scope) {\r\n var isTrip = !!$routeParams.tripId;\r\n var nonInfants = occupancyService.getNumberOfNonInfantPassengers();\r\n preferences.get('priceMode').then(function (pm) { return _calculatePrice(pm); });\r\n tripService.usePackageRates().then(function (packagePrice) { return scope.PackagePrice = packagePrice; });\r\n _setHotelId($routeParams.estabId);\r\n scope.inlineStarsEnabled = TRPCONFIG.Domain.InlineStarsEnabled;\r\n scope.hotelImage = { 'background-image': \"url(\" + scope.hotel.ImageUrl + \")\" };\r\n scope.reviewString = resourceService.get(scope.hotelCustomerRatingCount > 1 ? 'HOTELREVIEWS' : 'HOTELREVIEW');\r\n scope.displayReviews = TRPCONFIG.Domain.ReviewsEnabled;\r\n broker.subscribe(\"infoWindow\" + scope.$id, 'priceModeChanged', function (e) { return _calculatePrice(e.data); });\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe(\"infoWindow\" + scope.$id);\r\n });\r\n if (isTrip) {\r\n _setHotelId($routeParams.estabId);\r\n scope.selectButton = resourceService.get('SELECTHOTELTEXT');\r\n scope.selectHotel = _selectTripHotel;\r\n }\r\n else if (scope.dealsMode) {\r\n scope.selectButton = resourceService.get('SHOWDEALS');\r\n scope.selectHotel = function () { return _getDeals(scope.hotel); };\r\n }\r\n else {\r\n scope.selectButton = resourceService.get('VIEWDETAILS');\r\n scope.selectHotel = _selectLandingHotel;\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n _setHotelId(dest.EstablishmentId);\r\n });\r\n }\r\n function _setHotelId(id) {\r\n scope.pageHotelId = id || null;\r\n }\r\n function _calculatePrice(pm) {\r\n var costValue = pm === 0 ?\r\n scope.hotel.MinCost / nonInfants :\r\n scope.hotel.MinCost;\r\n if (costValue) {\r\n scope.hotel.displayPrice = $filter('roundedCurrency')(costValue);\r\n }\r\n }\r\n function _selectTripHotel(h) {\r\n tripService.getTrip($routeParams.tripId).then(function (trip) {\r\n basketService.selectHotel(trip.TripId, h, trip.BasketId);\r\n hotelService.trackHotelClick(_.get(h, 'Id'), undefined, undefined, undefined, _.get(trip, 'HotelsRequest.AvailabilitySearchId'));\r\n });\r\n }\r\n function _getDeals(hotel) {\r\n holidayDeals\r\n .getDealsFromMap(hotel.Id)\r\n .then(function (hotelWithDeals) {\r\n if (!hotelWithDeals) {\r\n return;\r\n }\r\n hotel.HolidayDeals = hotelWithDeals.HolidayDeals;\r\n hotel.TransferTimes = hotelWithDeals.TransferTimes;\r\n hotel.Airports = hotelWithDeals.Airports;\r\n broker.publish('SHOWDEALS', { hotel: holidayDeals.enrichHotel(hotel) });\r\n });\r\n }\r\n function _selectLandingHotel(h) {\r\n currentDestination.getCurrentDestination().then(function (dest) {\r\n var url = urlUtils.stripLeadingSlash(pageStrand.adjustUrl(urlUtils.appendExistingQueryString(h.Url), dest.PageStrand));\r\n if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow) {\r\n windowUtil.open(url);\r\n }\r\n else {\r\n $location.path(url);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('lightboxMap', lightboxMap);\r\n function lightboxMap(maps, broker) {\r\n var template = \"\\n \\n
        \\n
        \\n \";\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n zoom: '@',\r\n dealsMode: '@'\r\n },\r\n template: template,\r\n link: link\r\n };\r\n function link(scope, el) {\r\n var map = null;\r\n var data = {};\r\n broker.subscribe('lightboxMap', 'MAPLIGHTBOX', function (e) {\r\n data = e.data;\r\n maps.loadScript(initializeMap);\r\n });\r\n function initializeMap() {\r\n displayModal(true);\r\n displayLoader(true);\r\n var centre = {\r\n lat: data.hotel.lat || data.hotel.Latitude,\r\n lon: data.hotel.lon || data.hotel.Longitude,\r\n };\r\n maps.getLocations(null, centre, !!scope.dealsMode, data.showInfoWindow)\r\n .then(function (result) { populateMap(result); });\r\n }\r\n function populateMap(mapInfo) {\r\n var selectedMarker = null;\r\n if (mapInfo.markers) {\r\n selectedMarker = _.find(mapInfo.markers, function (x) { return x.estabId === data.hotel.Id; });\r\n }\r\n var canvas = el.find('.map-canvas');\r\n var zoom = parseInt(scope.zoom);\r\n var mapRendered = scope.$watch(function () { return canvas.height(); }, function (v) {\r\n if (v && v !== 100) {\r\n map = maps.buildMap(canvas[0], mapInfo.centre, zoom, selectedMarker);\r\n map = maps.addMarkers(map, mapInfo.markers, selectedMarker, mapInfo.infoWindow);\r\n mapRendered();\r\n }\r\n });\r\n scope.close = onClose;\r\n displayLoader(false);\r\n }\r\n function onClose() {\r\n displayModal(false);\r\n }\r\n function displayModal(value) {\r\n scope.showModal = value;\r\n }\r\n function displayLoader(value) {\r\n scope.loadingMap = value;\r\n }\r\n scope.$on('$destroy', function () {\r\n broker.unsubscribe('lightboxMap');\r\n });\r\n }\r\n }\r\n})();\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .directive('lightboxMapTrigger', lightboxMapTrigger);\r\n function lightboxMapTrigger(broker) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n scope: {\r\n element: '=',\r\n searchId: '@',\r\n showInfoWindow: '@'\r\n },\r\n link: link\r\n };\r\n function link(scope, el) {\r\n var showInfoWindow = scope.showInfoWindow !== 'false';\r\n el.on('click', function () {\r\n broker.publish('MAPLIGHTBOX', {\r\n hotel: scope.element,\r\n searchId: scope.searchId,\r\n showInfoWindow: showInfoWindow\r\n });\r\n });\r\n scope.$on('$destroy', function () {\r\n el.off('click');\r\n });\r\n }\r\n }\r\n})();\r\nvar Core;\r\n(function (Core) {\r\n var ModalParkingDetails = /** @class */ (function () {\r\n function ModalParkingDetails($scope, modalService) {\r\n this.$scope = $scope;\r\n this.modalService = modalService;\r\n this.Details = modalService.get('details');\r\n this.airport = modalService.get('airport');\r\n this.dropOffDate = modalService.get('dropOffDate');\r\n this.pickUpDate = modalService.get('pickUpDate');\r\n }\r\n return ModalParkingDetails;\r\n }());\r\n angular\r\n .module('core')\r\n .directive('parkingDetails', function () {\r\n return {\r\n scope: {},\r\n controller: ModalParkingDetails,\r\n controllerAs: 'pd',\r\n templateUrl: function (elem, attr) {\r\n return \"partials/booking/template?name=ParkingDetails&version=\" + attr.templateVersion;\r\n }\r\n };\r\n });\r\n})(Core || (Core = {}));\r\n(function () {\r\n 'use strict';\r\n angular\r\n .module('core')\r\n .factory('maps', maps);\r\n function maps($window, $timeout, $rootScope, $compile, $routeParams, $q, hotelCoordinates, hotelRehydrator, holidayDeals, tripService) {\r\n var MAX_ZOOM = 1;\r\n var isMapReady = false;\r\n var isDealsMode = false;\r\n return {\r\n loadScript: loadScript,\r\n getLocations: getLocations,\r\n buildMap: buildMap,\r\n addMarkers: addMarkers\r\n };\r\n function loadScript(mapLoadedCb) {\r\n if (TRPCONFIG.IsBot) {\r\n return;\r\n }\r\n // if the script is loading go in polling mode...\r\n if ($window.TRPMAPS && !isMapReady) {\r\n return _pollingForMap(mapLoadedCb);\r\n }\r\n // ...if script is loaded just callback..\r\n if ($window.TRPMAPS && isMapReady) {\r\n return mapLoadedCb();\r\n }\r\n // ...actually load the script for maps\r\n $window.TRPMAPS = _.bind(_mapLoaded, {}, mapLoadedCb);\r\n var script = \"',\n };\n\n });\n\n}\n","/// \nclass DeepLinkController {\n constructor(\n $rootScope: ng.IRootScopeService,\n deepLinkService: DeepLink.IDeepLinkService,\n $location: ng.ILocationService,\n searchQueryString\n ) {\n $rootScope.$emit('block', {});\n $location.replace();\n const reqParams = searchQueryString.getDeepLinkQSParams();\n deepLinkService.getSearchDeepLink(reqParams)\n .then((deepLinkUrl) => {\n $location.replace();\n const {pathnameWithoutCulture} = deepLinkService.parseFullUrl(deepLinkUrl);\n $location.url(pathnameWithoutCulture);\n $rootScope.$apply();\n });\n }\n}\n\nangular\n .module('deepLink')\n .controller('DeepLinkController', DeepLinkController);\n","/* tslint:disable:max-line-length */\nnamespace Device {\n\n class DeviceMeta {\n\n constructor() {\n // http://stackoverflow.com/questions/3514784/what-is-the-best-way-to-detect-a-mobile-device-in-jquery\n if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)\n || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(navigator.userAgent.substr(0,4))) {\n var metaTag: any = document.querySelector('meta[name=viewport]');\n metaTag.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0';\n }\n }\n\n }\n\n angular.module('core')\n .directive('deviceMeta', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controller: DeviceMeta\n };\n });\n}\n","\n'use strict';\n\nnamespace LangSwitcher {\n\n\n function languageSwitcher() {\n return {\n bindToController: {},\n restrict: 'E',\n replace: true,\n controller: 'LanguageSwitcher',\n controllerAs: 'ls',\n templateUrl: 'partials/home/directivetemplate?type=LanguageSwitcher'\n };\n }\n\n class LanguageSwitcher {\n\n menu;\n enabled = true;\n\n constructor (\n private languageService: any,\n private $location: ng.ILocationService,\n private $scope: ng.IScope,\n private $route: ng.route.IRouteService\n ) {\n this.menu = false;\n this.$scope.$on('$routeChangeSuccess', () => {\n var path = $location.path();\n this.enabled = !/book/.test(path) && !/options/.test(path);\n });\n }\n\n public toggle() {\n this.menu = !this.menu;\n }\n\n public setLanguage(lang, id) {\n this.languageService.setLanguage(lang, id)\n .then(() => {\n if (TRPCONFIG.Domain.RedirectLanguageChangeToHomepage) {\n window.location.href = '/?rl=1';\n }\n\t\t\t\telse {\n\t\t\t\t\t//window.location.href = this.$location.absUrl();\n this.$route.reload();\n }\n });\n }\n }\n\n angular.module('TR')\n .controller('LanguageSwitcher', LanguageSwitcher)\n .directive('languageSwitcher', languageSwitcher);\n}\n","'use strict';\n\nnamespace CMS {\n\n class CmsUtils {\n\n reWhitespace = /\\s/g;\n\n normaliseValue (val): string {\n return decodeURIComponent(String(val))\n .toLowerCase()\n .replace(this.reWhitespace, '');\n }\n\n propsMatch(srcOb, props): boolean {\n // Returns `true` if all `props` k:v pairs have a normalised match in `srcOb`\n if (!angular.isObject(srcOb) || !angular.isObject(props)) {\n return false;\n }\n let matchCount = 0;\n const srcKeys = Object.keys(srcOb);\n const propsKeys = Object.keys(props);\n let pi = propsKeys.length;\n\n while (pi--) {\n let si = srcKeys.length;\n const normalisedKey = this.normaliseValue(propsKeys[pi]);\n const normalisedVal = this.normaliseValue(props[propsKeys[pi]]);\n while (si--) {\n if (\n this.normaliseValue(srcKeys[si]) === normalisedKey &&\n this.normaliseValue(srcOb[srcKeys[si]]) === normalisedVal\n ) {\n if (++matchCount === propsKeys.length) {\n return true;\n }\n break;\n }\n }\n };\n return false;\n }\n }\n\n angular\n .module('cms')\n .service('cmsUtils', CmsUtils);\n}\n","'use strict';\n\nnamespace Booking {\n\n class ModalLink {\n\n private modalType:string;\n\n constructor(\n private $element:JQuery,\n private $location:ng.ILocationService,\n private currentUser:any,\n private accountMenuService: any,\n private postBookingLookup:any,\n private modalService: any,\n private analytics: any\n ){}\n\n select(event) {\n switch(this.modalType) {\n case 'termsconditions':\n this.modalService.launch('partials/popups/agencyterms');\n break;\n case 'unsubscribe':\n this.analytics.track('mixpanel', 'GDPRUnsubscribe');\n this.modalService.launch('partials/popups/unsubscribe');\n break;\n default:\n this.manage();\n break;\n }\n }\n\n manage() {\n if (this.currentUser.AnonSignedIn && !this.currentUser.SignedIn) {\n return this.postBookingLookup.redirect();\n }\n if (!this.currentUser.AnonSignedIn && this.currentUser.SignedIn) {\n return this.$location.path('dashboard/bookings/current');\n }\n return this.accountMenuService.launchOption('bookingsignin');\n }\n\n }\n\n angular\n .module('core')\n .directive('modalLink', (): ng.IDirective => {\n return {\n restrict: 'A',\n replace: true,\n transclude: true,\n scope: {},\n bindToController: {\n modalType: '@'\n },\n controller: ModalLink,\n controllerAs : 'ml',\n template : ''\n };\n });\n\n}\n","'use strict';\nnamespace Payment {\n\n type PaymentOption = Core.PaymentOption;\n type SavedCardOption = Core.SavedCardOption;\n type PaymentModel = Core.PaymentModel;\n type PaymentsUtilService = Core.PaymentsUtilService;\n type PaymentCardValidity = {\n invalid?: boolean,\n required?: boolean\n };\n\n enum PaymentCategory {\n SavedCard = 1,\n PayPal = 2,\n Card = 3\n }\n\n const year = new Date().getFullYear();\n\n class Payment {\n\n private cardCanBeSaved: boolean;\n private piPaymentOptions: PaymentOption[];\n private piSavedCards: SavedCardOption[];\n private savedCardsWatch: () => void;\n private viewPage: string;\n private usingOldTemplate: boolean;\n private currentDate: Date = new Date();\n private currentMonth: number = this.currentDate.getMonth();\n private currentYear: number = this.currentDate.getFullYear();\n private onReceive: Function;\n private addCommand: Function;\n\n public monthFrom: number = 1;\n public months: number[] = _.range(1, 13);\n public years: number[] = _.range(year, year + 21);\n public yearsPast: number [] = _.range(year - 10, year + 1);\n\n public model: PaymentModel;\n public cardTypeChanged: string;\n public cardPercentage: number;\n public haveSavedCards: boolean;\n public logoList: string[];\n public paymentAmount: number;\n public paymentOptions: PaymentOption[];\n public payPalOption: PaymentOption;\n\n public savedCards: SavedCardOption[];\n public fullCardDetailsRequired: boolean;\n public isExternalFop: boolean;\n\n public selectedPaymentOptionId: string; //to keep track of which radio option is selected\n\n //extra bits for tabbed version\n public paymentCategory: PaymentCategory;\n public selectedSavedCard: SavedCardOption | null;\n\n public creditCardErrors: PaymentCardValidity;\n\n constructor(\n private $scope: ng.IScope,\n private paymentsService: any,\n private paymentsUtilService: PaymentsUtilService,\n private broker: any\n ) {\n\n //use the viewPage property to determine which functions and watches we should be using.\n // This is only here so that we can support the old template for the cards\n this.usingOldTemplate = /v1/i.test(this.viewPage);\n\n const wait = $scope.$watch('pay.ready', b => {\n\n if(b) {\n this.initPaymentOptions();\n this.initSavedCards();\n\n if (this.paymentAmount != null) {\n $scope.$watch('pay.paymentAmount', (v:number) => {\n if (v != null) {\n this.setCardFee(v);\n }\n });\n }\n\n this.setDefaultSelection();\n\n wait();\n }\n });\n\n\n if (this.usingOldTemplate) {\n $scope.$watch('pay.selectedSavedCard', (v: SavedCardOption) => {\n if (v) {\n this.savedCardSelected_TabVersion(v);\n }\n });\n } else {\n //better to watch the change of options like this. Radio button onChange seems to get it self in to\n //a muddle and each click generates 3 changes!\n $scope.$watch('pay.selectedPaymentOptionId', (v: string) => {\n if (v) {\n if (v.length > 1) {\n this.savedCardSelected(v);\n } else {\n this.paymentOptionChanged(parseInt(v,10));\n }\n }\n });\n }\n\n $scope.$watch('[pay.model.cardDetail.expiryDate.year]',\n (v: SavedCardOption) => {\n const expiryDateYear = this.model.cardDetail.expiryDate.year;\n const expiryDateMonth = this.model.cardDetail.expiryDate.month;\n if (expiryDateYear === this.currentYear) {\n this.monthFrom = this.currentMonth + 1;\n expiryDateMonth < this.currentMonth ? this.model.cardDetail.expiryDate.month = 0 : null;\n this.months = _.range(this.monthFrom, 13);\n } else {\n this.months = _.range(1, 13);\n }\n });\n\n $scope.$watch('pay.creditCardErrors', (value:PaymentCardValidity, previousValue) => {\n if (value && value !== previousValue) {\n if(value.invalid){\n this.updateSelectedLogo(0);\n }\n }\n });\n }\n\n updateCardType() {\n\n this.model.cardDetail.cardNumber = undefined;\n\n if (this.model.cardDetail.cardTypeId) {\n const card = _.find(this.paymentOptions, { 'CardTypeId' : this.model.cardDetail.cardTypeId});\n this.model.isPayPalPayment = false;\n this.model.cardDetail.isSavedCard = false;\n this.model.cardDetail.paymentOptionId = card.Id;\n this.model.cardDetail.paymentTypeId = card.PaymentType;\n this.model.cardDetail.cardTypeId = card.CardTypeId;\n this.fullCardDetailsRequired = card.FullDetailsRequired;\n this.isExternalFop = card.IsExternalFop;\n this.model.externalFop = this.paymentsUtilService.createEmptyExternalFop();\n this.setCardFee(this.paymentAmount);\n this.updateSelectedLogo(this.model.cardDetail.cardTypeId);\n } else {\n this.clearModel();\n }\n }\n\n selectTab(category: PaymentCategory): void {\n //USED in tab version of template\n this.clearModel();\n\n this.paymentCategory = category;\n\n if (category === PaymentCategory.SavedCard) {\n this.selectedSavedCard = this.savedCards[0];\n } else {\n this.selectedSavedCard = null;\n\n if (category === PaymentCategory.PayPal) {\n this.selectPayPalOption();\n } else {\n this.model.saveCard = TRPCONFIG.Domain.SavedCardsEnabled && this.cardCanBeSaved;\n }\n }\n }\n\n updateDfReferenceId(dfReferenceId) {\n this.onReceive({dfReferenceId});\n }\n\n addPreBookCommand(command) {\n this.addCommand({command});\n }\n\n checkCreditCardNumber(cardNumber) {\n this.cardTypeChanged = '';\n if (!cardNumber) { return; }\n\n this.paymentsService.checkCardNumber(this.paymentOptions,\n cardNumber,\n this.model.cardDetail.cardTypeId)\n .then(result => {\n this.updateSelectedLogo(result);\n }, result => {\n const cardOption = _.find(this.paymentOptions, o => (o.CardTypeId === result));\n let correctId = cardOption ? cardOption.CardTypeId : undefined;\n if (this.model.cardDetail.cardTypeId !== correctId) {\n this.clearModel();\n this.model.cardDetail.cardTypeId = correctId;\n this.updateCardType();\n this.model.cardDetail.cardNumber = cardNumber;\n this.cardTypeChanged = this.paymentsService.getCardTitle(this.paymentOptions, correctId);\n }\n });\n }\n\n private selectPayPalOption(): void {\n this.model.isPayPalPayment = true;\n this.model.cardDetail.cardTypeId = this.payPalOption.CardTypeId;\n this.model.cardDetail.paymentOptionId = this.payPalOption.Id;\n this.model.cardDetail.paymentTypeId = this.payPalOption.PaymentType;\n this.setCardFee(this.paymentAmount);\n }\n\n private savedCardSelected(cardId: string): void {\n\n this.clearModel();\n\n const selectedCard = _.find(this.savedCards, { 'CardId' : cardId});\n\n this.fullCardDetailsRequired = selectedCard.FullDetailsRequired;\n this.model.isPayPalPayment = false;\n this.model.cardDetail.isSavedCard = true;\n this.model.cardDetail.paymentOptionId = selectedCard.CardType;\n this.model.cardDetail.paymentTypeId = selectedCard.PaymentTypeId;\n this.model.cardDetail.savedCardId = selectedCard.CardId;\n this.setCardFee(this.paymentAmount);\n\n }\n\n private savedCardSelected_TabVersion(card: SavedCardOption): void {\n //USED in tab version of template\n this.clearModel();\n\n this.model.isPayPalPayment = false;\n this.model.cardDetail.isSavedCard = true;\n this.model.cardDetail.savedCardId = card.CardId;\n this.model.cardDetail.paymentOptionId = card.CardType;\n this.model.cardDetail.paymentTypeId = card.PaymentTypeId;\n this.fullCardDetailsRequired = card.FullDetailsRequired;\n this.setCardFee(this.paymentAmount);\n }\n\n private paymentOptionChanged(category: PaymentCategory): void {\n\n this.clearModel();\n\n if (category=== PaymentCategory.Card) {\n this.model.saveCard = TRPCONFIG.Domain.SavedCardsEnabled && this.cardCanBeSaved;\n } else if (category === PaymentCategory.PayPal) {\n this.selectPayPalOption();\n }\n\n }\n\n private initPaymentOptions(): void {\n\n this.paymentOptions = angular.copy(this.piPaymentOptions);\n\n this.paymentOptions.map(payment => {\n if (payment.CardTypeId !== payment.Id) {\n payment.CardTypeId = payment.Id;\n }\n });\n\n const paypalOptions = _.remove(this.paymentOptions,\n (o: PaymentOption) => { return o.IsPayPal === true; }\n );\n\n if (paypalOptions && paypalOptions.length === 1){\n this.payPalOption = paypalOptions[0];\n }\n\n this.logoList = this.paymentsService.getLogosList(this.paymentOptions.concat(this.payPalOption|| []));\n }\n\n private updateSelectedLogo(selected):void {\n this.broker.publish('Qubit:TRB-4:cardTypeUpdated', { id: selected });\n }\n\n private initSavedCards(): void {\n\n if (this.piSavedCards && this.piSavedCards.length > 0) {\n this.savedCards = _.filter(this.piSavedCards, { 'IsExpired' : false});\n if (this.usingOldTemplate === false) {\n this.savedCards = _.take(this.savedCards, 3);\n }\n } else {\n this.savedCards = [];\n }\n\n this.haveSavedCards = this.savedCards.length > 0;\n\n if (this.haveSavedCards && !this.savedCardsWatch) {\n //watch if our original list is ever changed\n this.savedCardsWatch = this.$scope.$watch('pay.piSavedCards', () => {\n this.initSavedCards();\n this.setDefaultSelection();\n });\n }\n\n }\n\n private setDefaultSelection(): void {\n if (this.savedCards && this.savedCards.length > 0) {\n\n if (this.usingOldTemplate) {\n this.selectTab(PaymentCategory.SavedCard);\n } else {\n this.selectedPaymentOptionId = this.savedCards[0].CardId; //default to the 1st card\n }\n\n } else {\n if (this.usingOldTemplate) {\n this.selectTab(PaymentCategory.Card);\n } else {\n this.selectedPaymentOptionId = PaymentCategory.Card.toString();\n this.paymentOptionChanged(PaymentCategory.Card);\n }\n }\n }\n\n private setCardFee(total: number): void {\n\n //figure out which card type we are dealing with and update the\n //fee as required\n const setFee = (amount: number, total: number, percent: number): void => {\n const fee = amount || total * (percent / 100);\n if (fee !== this.model.fee) {\n this.model.fee = fee;\n }\n this.cardPercentage = percent;\n };\n\n if (this.model.cardDetail.isSavedCard === true) {\n //get saved card id, find card and update\n const card = _.find(this.savedCards, {'CardId': this.model.cardDetail.savedCardId});\n if(card) {\n setFee(card.FeeAmount, total, card.FeePercent);\n }\n } else if (this.model.isPayPalPayment === true) {\n setFee(this.payPalOption.FeeAmount, total, this.payPalOption.FeePercent);\n } else if (this.model.cardDetail.cardTypeId != null) {\n //get payment option info and set fee\n const card = _.find(this.paymentOptions, {'CardTypeId' : this.model.cardDetail.cardTypeId});\n setFee(card.FeeAmount, total, card.FeePercent);\n }\n }\n\n private clearModel(): void {\n this.model = this.paymentsUtilService.createEmptyPaymentModel();\n this.fullCardDetailsRequired = false;\n this.isExternalFop = false;\n this.cardPercentage = 0;\n }\n }\n\n angular\n .module('core')\n .directive('payment', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: false,\n transclude: true,\n scope: {\n piPaymentOptions: '=',\n piSavedCards: '=',\n atolProtected: '@',\n cardCanBeSaved: '=',\n flexiblePayments: '@',\n modal: '=',\n model: '=',\n onReceive: '&',\n addCommand: '&',\n paymentAmount: '=',\n ready: '=',\n rootForm: '=',\n viewPage: '@'\n },\n controller: Payment,\n controllerAs: 'pay',\n bindToController: true,\n templateUrl: (element,attr) => {\n if (attr.templateVersion) {\n return `partials/booking/template?name=PaymentWithTabs&version=${attr.templateVersion}`;\n }\n return `partials/home/PaymentDirective?form=${attr.viewPage}`;\n }\n };\n }\n );\n}\n","namespace QuoteManager {\n\n export interface ICreateQuoteRequest {\n DomainId?: number | null;\n QuoteId?: string | null;\n BasketId: string;\n SharedUse: boolean;\n SendEmail: boolean;\n CultureCode?: string | null;\n EmailAddress?: string | null;\n EmailSignUp: boolean;\n User: IContact | null;\n TrackingTag?: string;\n VisitSourceId?: number | null;\n }\n\n export interface IContact {\n Title?: string;\n FirstName?: string;\n LastName?: string;\n Email: string | null;\n MobileTel?: string;\n }\n\n\n export class QuoteManager {\n private domain: any;\n private url: string = '/api/quotes/';\n\n constructor (\n private $http: ng.IHttpService,\n private $window,\n private cookieService: any\n ) {\n this.domain = $window.TRPCONFIG.Domain;\n }\n\n create(params: ICreateQuoteRequest, cache: boolean = true): ng.IPromise{\n params.DomainId = params.DomainId || this.domain.DomainId;\n params.CultureCode = params.CultureCode || this.domain.CultureCode;\n params.VisitSourceId = Number(this.cookieService.get('visitSource')) || null;\n\n return this.$http.post(this.url + 'create', params, {\n cache,\n ignoreErrors: true\n }).then((res) => {\n return res.data;\n }, (res) => {\n return {Error: res.data};\n });\n }\n }\n\n angular\n .module('TR')\n .service('quoteManager', QuoteManager);\n}\n","namespace Dashboard {\n\n export class MybTrack {\n constructor(\n private analytics,\n private currentUser\n ) { }\n\n public track(event, props) {\n if (props == null) {\n props = {};\n }\n props.SignIn = !!this.currentUser.get().HardSignedIn;\n this.analytics.track('mixpanel', event, props);\n }\n }\n\n angular\n .module('dashboard')\n .service('mybTrack', MybTrack);\n\n}\n","namespace ekh {\n\n class ValidateCvvTokenErrors {\n private paymentForm: ng.IFormController;\n\n constructor(private $scope: ng.IScope) {\n $scope.$watch('validateCvvCtrl.tokenErrors', (tokenErrors) => {\n if (!this.paymentForm || !this.paymentForm.securityCode) {\n return false;\n }\n if (!tokenErrors || !Object.keys(tokenErrors).length) {\n $scope.ngModelCvvCtrl.$setViewValue('***');\n this.paymentForm.securityCode.$setValidity('validCvvCode', true);\n } else {\n $scope.ngModelCvvCtrl.$setViewValue();\n this.paymentForm.securityCode.$setValidity('validCvvCode', false);\n }\n });\n }\n }\n\n angular.module('ekh')\n .directive('validateCvvTokenErrors', () => {\n return {\n restrict: 'A',\n require: 'ngModel',\n controllerAs: 'validateCvvCtrl',\n bindToController: {\n tokenErrors: '=',\n paymentForm: '='\n },\n controller: ValidateCvvTokenErrors,\n template: '',\n link: ($scope, $element, $attrs, ngModelCtrl) => {\n $scope.ngModelCvvCtrl = ngModelCtrl;\n }\n };\n });\n};\n","'use strict';\n\nnamespace Insurance {\n class InsuranceResults {\n\n insuranceQuotes: Core.Insurance.InsuranceQuote[];\n summary;\n typeSummary;\n documentPaths;\n selectPolicy;\n\n constructor(\n private $location: ng.ILocationService,\n private resourceService: Core.ResourceService,\n private $scope: ng.IScope,\n private tripService: Core.TripService,\n private $routeParams,\n private insuranceService,\n private broker: Core.Broker,\n private basketService,\n private $q: ng.IQService,\n private analytics\n ) {\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGINSURANCE'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-insuranceSearchCtrl'\n });\n\n analytics.track('mixpanel', 'TransferPage');\n\n tripService.getTrip($routeParams.tripId).then(trip => {\n const insuranceReq = trip && trip.InsuranceRequest;\n if (insuranceReq) {\n const searchId = insuranceReq.AvailabilitySearchId;\n\n this.$q.all([\n insuranceService.getSearchResults(searchId, trip.TripId),\n tripService.getInsuranceRequestSummary($routeParams.tripId)\n ]).then(results => {\n this.insuranceQuotes = results[0];\n this.summary = results[1];\n this.typeSummary = this.summary && this.summary.Destination && this.summary.PolicyType ?\n this.summary.PolicyType.Name + ' - '\n + this.summary.Destination.Name + ' - ' : '';\n broker.publish('unblock');\n $scope.$emit('unblock');\n });\n\n this.selectPolicy = function (policy) {\n const data = {\n Title: policy.QuoteType.Type,\n CostTotal: policy.Price,\n TotalOptions: this.insuranceQuotes.length,\n SupplierName: policy.SupplierName\n };\n analytics.track('mixpanel', 'OptionsInsuranceSelected', data);\n basketService.selectInsurance(policy, searchId, trip.BasketId, trip.TripId);\n this.selectedInsurance = policy;\n };\n\n this.documentPaths = insuranceService.getDocumentPaths();\n }\n });\n }\n }\n\n angular.module('insurance')\n .controller('InsuranceResults', InsuranceResults);\n}\n","'use strict';\nnamespace liveChatModule {\n export class LiveChatService {\n\n private scriptUrl:string = TRPCONFIG.Domain.LiveChat.Script;\n private liveUrl:string = TRPCONFIG.Domain.LiveChat.ChatLocation;\n private interval:number;\n private routeChange:any;\n\n constructor (\n private loaderService,\n private $rootScope: ng.IRootScopeService\n ) {\n window['_laq'] = window['_laq'] || [];\n }\n\n public initialise() : void {\n if(typeof this.interval === 'undefined') {\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | Loading script: ${this.scriptUrl}`);\n }\n this.loaderService.loadJS(window.document, 'script', 'liveChat', this.scriptUrl, true);\n this.interval = setInterval(() => {\n if (typeof window['liveagent'] !== 'undefined') {\n const liveChatConfig = TRPCONFIG.Domain.LiveChat;\n const apiKey = liveChatConfig.ApiKey;\n const code = liveChatConfig.Code;\n const site = liveChatConfig.Site;\n const popupWidth = liveChatConfig.Sizes.Width;\n const popupHeight = liveChatConfig.Sizes.Height;\n\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.addCustomDetail('Site Name', ` +\n `'${TRPCONFIG.Domain.LiveChat.Site}').saveToTranscript('SiteName__c');`);\n }\n window['liveagent'].addCustomDetail('Site Name', site).saveToTranscript('SiteName__c');\n\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.setChatWindowWidth(${popupWidth});`);\n console.log(`LIVECHAT | liveagent.setChatWindowHeight(${popupHeight});`);\n }\n window['liveagent'].setChatWindowWidth(popupWidth);\n window['liveagent'].setChatWindowHeight(popupHeight);\n\n //add current page\n this.newPage();\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.init('${this.liveUrl}', '${code}', '${apiKey}');`);\n }\n window['liveagent'].init(this.liveUrl, code, apiKey);\n\n this.routeChange = this.$rootScope.$on('$routeChangeSuccess', () => this.reinit());\n\n clearInterval(this.interval);\n TRPCONFIG.Domain.LiveChat.Ready = true;\n }\n }, 100);\n }\n }\n\n reinit(): void {\n this.routeChange();\n this.disconnect();\n TRPCONFIG.Domain.LiveChat.Ready = false;\n delete this.interval;\n delete window['liveagent'];\n delete window['liveAgentDeployment'];\n\n this.initialise();\n }\n\n disconnect(): void {\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.disconnect();`);\n }\n window['liveagent'].disconnect();\n }\n\n newPage(): void {\n var currUrl = document.location.href;\n if(TRPCONFIG.Domain.LiveChat.ShowMessages){\n console.log(`LIVECHAT | liveagent.addCustomDetail('Current URL', '${currUrl}')` +\n `.saveToTranscript('Current_URL__c')`);\n }\n window['liveagent'].addCustomDetail('Current URL', currUrl).saveToTranscript('Current_URL__c');\n }\n\n startChat(code: string): void {\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.startChat('${code}')`);\n }\n window['liveagent'].startChat(code);\n }\n\n rejectChat(code: string): void {\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.rejectChat('${code}')`);\n }\n window['liveagent'].rejectChat(code);\n }\n\n addReactiveButton(): void {\n window['_laq'].push(() => {\n const reactiveCode = TRPCONFIG.Domain.LiveChat.ReactiveButtonCode;\n const reactiveOfflineCode = TRPCONFIG.Domain.LiveChat.ReactiveOfflineButtonCode;\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.showWhenOnline('${reactiveCode}', ` +\n `document.getElementById('liveagent_button_online_${reactiveCode}'))`);\n }\n window['liveagent'].showWhenOnline(reactiveCode,\n document.getElementById(`liveagent_button_online_${reactiveCode}`));\n\n if(TRPCONFIG.Domain.LiveChat.ShowButtonWhenOffline){\n if (TRPCONFIG.Domain.LiveChat.ShowMessages) {\n console.log(`LIVECHAT | liveagent.showWhenOffline('${reactiveCode}', ` +\n `document.getElementById('liveagent_button_offline_${reactiveOfflineCode}'))`);\n console.log(`LIVECHAT | liveagent.showWhenOnline('${reactiveOfflineCode}', ` +\n `document.getElementById('liveagent_button_online_${reactiveOfflineCode}'))`);\n }\n window['liveagent'].showWhenOffline(reactiveCode,\n document.getElementById(`liveagent_button_offline_${reactiveOfflineCode}`));\n window['liveagent'].showWhenOnline(reactiveOfflineCode,\n document.getElementById(`liveagent_button_online_${reactiveOfflineCode}`));\n\n }\n });\n }\n }\n\n angular\n .module('liveChatModule')\n .service('liveChatService', LiveChatService);\n\n}\n","'use strict';\n\nnamespace Quote {\n\n export interface BasketNoteCapture {\n Text: string;\n }\n\n class BasketNotes {\n\n public newNote: BasketNoteCapture | null;\n public notes: Core.Booking.Note[];\n public basketId:string;\n public basketType:string;\n\n constructor(\n private quoteService:Quote.QuoteService,\n private basketStore\n ) {\n }\n\n createNote(): void {\n this.newNote = { Text: '' };\n }\n\n addNote(): void {\n if (!this.newNote) { return; }\n const text = this.newNote.Text;\n let promise;\n\n if (this.basketType === 'basket') {\n promise = this.basketStore.addNote(this.basketId, text);\n } else if (this.basketType === 'quote') {\n promise = this.quoteService.addNote(this.basketId, text);\n }\n\n promise.then(basket => {\n this.newNote = null;\n this.notes = basket.Notes;\n });\n }\n\n getDate(note): Date {\n return new Date(note.Created + '+00:00');\n }\n }\n\n angular\n .module('quote')\n .directive('basketNotes', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n bindToController: {\n notes: '=',\n basketId: '=',\n basketType: '@'\n },\n templateUrl: 'partials/quote/directivetemplate?type=notes',\n controller: BasketNotes,\n controllerAs: 'n'\n };\n });\n}\n","/// \n'use strict';\n\nnamespace QuoteCreator {\n\n import ICreateQuoteResponse = Quote.ICreateQuoteResponse;\n type IQuote = Quote.IQuote;\n type IContact = QuoteManager.IContact;\n\n class QuoteCreator{\n\n contact: IContact | null;\n contactEmail: string | null = '';\n sendEmail: boolean = TRPCONFIG.Domain.EnableAgentSendQuoteEmail;\n sharedUseFlag: boolean;\n quote: IQuote;\n quoteCreated: boolean = false;\n showLink: boolean = true;\n newsletterSignup: boolean = false;\n\t\tcreateClicked: boolean = false;\n quoteCreationError: boolean = false;\n\n sharedUse: boolean;\n basketId: string;\n registerUser: boolean;\n formName: string;\n refEmail: string;\n invalidUser: boolean;\n quoteEmailAttempts: number = 0;\n quoteEmailAttemptsLimit: number = 3;\n emailPattern: RegExp = /^\\S+@\\S+\\.\\S+[^\\.]$/;\n\n constructor (\n private $scope: any,\n private analytics: any,\n private quoteManager: QuoteManager.QuoteManager,\n private broker: any,\n private quoteService: any,\n private $location: ng.ILocationService,\n private resourceService: Core.ResourceService,\n private currentUser: any,\n private localStorageProvider: any\n ) {\n this._initContact();\n\n this.$scope.$on('form:submitted-invalid', (event, form) => {\n if (form.$name === 'quoteForm') {\n this.invalidUser = true;\n }\n });\n }\n\n private _initContact() {\n const currentUser = this.currentUser.get();\n const contact = currentUser && currentUser.Contact || {};\n this.contact = {\n Title: contact.Title || '',\n FirstName: contact.FirstName || '',\n LastName: contact.LastName || '',\n Email: contact.Email || '',\n MobileTel: contact.MobileTel || ''\n };\n }\n\n private _newPostCreateQuote(response: ICreateQuoteResponse): void {\n if (response.Error) {\n this.quoteCreationError = true;\n this.quoteCreated = false;\n } else {\n this.quote = response.Payload;\n this.quoteCreated = true;\n this.quoteEmailAttempts++;\n this.localStorageProvider.removeItem('trackingTag');\n this.refEmail = this.$scope.qc.contact.Email;\n\n if (this.formName === 'quoteFormNonReg') {\n this.$scope.qc.contact.Email = '';\n }\n }\n this.createClicked = false;\n }\n\n private _newCreateQuote(\n contact: IContact | null = null,\n noUserCheck = false,\n trackingTag?: string,\n formName?: string\n ): ng.IPromise{\n const EmailAddress = contact ? contact.Email : null;\n const email = EmailAddress ? { Email: EmailAddress } : null;\n let request: QuoteManager.ICreateQuoteRequest = {\n QuoteId: '',\n BasketId: this.basketId,\n SharedUse: this.sharedUseFlag,\n SendEmail: noUserCheck ? false : this.sendEmail,\n TrackingTag: trackingTag,\n EmailAddress,\n EmailSignUp: this.newsletterSignup,\n User: noUserCheck || !this.registerUser ? email : contact\n };\n this.formName = formName ? formName : '';\n return this.quoteManager.create(request);\n }\n\n create(\n contact: IContact,\n noUserCheck: boolean = false,\n mixPanelTag: string,\n formName: string\n ): ng.IPromise{\n this.quoteCreationError = false;\n\t\t\tthis.createClicked = true;\n this.quoteCreated = false;\n\t\t\tif (mixPanelTag) {\n this.analytics.track('mixpanel', mixPanelTag);\n }\n\n return this.localStorageProvider.getItem('trackingTag')\n .then((trackingTag) => this._newCreateQuote(contact, noUserCheck, trackingTag, formName))\n .then(result => this._newPostCreateQuote(result));\n }\n\n manageQuote(reference: string): void {\n this.broker.publish('quoteSelected', reference);\n this.localStorageProvider.setItem('quoteSelected', reference);\n this.$location.path('quote/manage/' + reference);\n }\n\n getName(str: string): string {\n return this.resourceService.get(str.toUpperCase());\n }\n\n public isQuoteEmailDisabled() {\n return this.quoteEmailAttempts >= this.quoteEmailAttemptsLimit;\n }\n }\n\n angular.module('quote').directive('quoteCreator', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: false,\n scope: {},\n controllerAs: 'qc',\n bindToController: {\n sharedUse: '=',\n basketId: '=',\n registerUser: '=',\n expanded: '=',\n expandable: '='\n },\n templateUrl: (element,attr) => {\n if(attr.templateVersion) {\n return 'partials/booking/template?name=Agent/QuoteCreator&version='\n +attr.templateVersion;\n }\n return 'partials/quote/quotecreator';\n },\n controller: QuoteCreator,\n transclude: true\n };\n });\n}\n","'use strict';\n\nnamespace Search {\n\n type TripService = Core.TripService;\n export class UnifiedSearchService {\n\n constructor(\n private $http: ng.IHttpService,\n private $location: ng.ILocationService,\n private $route: ng.route.IRouteService,\n private $q: ng.IQService,\n private searchUnitService: any,\n private occupancyService: any,\n private resourceService: Core.ResourceService,\n private sharedSearchUnitService: any,\n private destinationService: any,\n private currentDestination: any,\n private holidayDeals: any,\n private preferences: any,\n private tripService: TripService,\n private searchQueryString: SearchQueryString,\n private geo: any,\n private analytics: any,\n private fidParser: Core.IFidParser\n ) {\n }\n\n getSearchMessage(type: UnifiedSearchType): string {\n let msg: string = '';\n switch (type) {\n case UnifiedSearchType.Holidays:\n msg = 'SEARCHINGFLIGHTSANDHOTELS';\n break;\n case UnifiedSearchType.Hotels:\n msg = 'SEARCHINGHOTELS';\n break;\n case UnifiedSearchType.Flights:\n msg = 'SEARCHINGFLIGHTS';\n break;\n default:\n }\n return msg;\n }\n\n getAreaName(type: UnifiedSearchType): string {\n let name: string = '';\n switch (type) {\n case UnifiedSearchType.Holidays:\n name = 'holidays';\n break;\n case UnifiedSearchType.Hotels:\n name = 'hotels';\n break;\n case UnifiedSearchType.Flights:\n name = 'flights';\n break;\n default:\n }\n return name;\n }\n\n populateSearchUnitService(model: UnifiedSearchModel): void {\n var destination = model.destination;\n if (destination && destination[0] && Object.keys(destination[0]).length !== 0) {\n this.searchUnitService.setDestination(destination[0]);\n this.searchUnitService.setDestinationAirport(destination[0]);\n }\n model.airports && this.searchUnitService.setMultipleDepartureAirports(model.airports);\n model.startDate && this.searchUnitService.startDate(this.searchUnitService.flight, model.startDate);\n model.endDate && this.searchUnitService.endDate(this.searchUnitService.flight, model.endDate);\n model.occupancy && this.occupancyService.setOccupancy(model.occupancy);\n model.currency && this.searchUnitService.setCurrency(model.currency);\n model.cabin && this.searchUnitService.setCabin(model.cabin);\n }\n\n populateModelFromSearchUnitService(trip, model: UnifiedSearchModel): void {\n if (trip) {\n if (trip.HotelsRequest) {\n model.destination[0] = this.searchUnitService.getDestination();\n } else if (trip.FlightsRequest) {\n model.destination[0] = this.searchUnitService.getDestinationAirport();\n }\n if (trip.FlightsRequest) {\n let filterCriteriaAirline = trip.FlightsRequest.FilterCriteria\n && trip.FlightsRequest.FilterCriteria.Airline;\n let airlines = _.union(filterCriteriaAirline, trip.FlightsRequest.PreferredCarrierCodes).join(',');\n\n if (TRPCONFIG.Domain2.NoAirlinesResetOnSearchPanelFixEnabled) {\n model.airlines = airlines ? this.searchQueryString.lookupAirlines(airlines) : model.airlines;\n } else {\n model.airlines = this.searchQueryString.lookupAirlines(airlines);\n }\n }\n }\n if (trip.TripType === this.tripService.tripTypes.MultiDestHoliday) {\n // API populates multiple FlightRequests with SelectedDepartureAirport by user's IP\n const flightRequests = trip.MultiDestinationFlightRequests;\n const first = flightRequests && flightRequests[0];\n if (first) {\n this.searchUnitService.setDepartureAirports(first.SelectedDepartureAirport);\n }\n }\n\n var airports = this.searchUnitService.getDepartureAirports();\n model.airports = ( model.domainId === TRPCONFIG.Domain.DomainId )\n ? _.map(airports, a => ({ Code: a }))\n : [];\n model.startDate = this.searchUnitService.startDate();\n model.endDate = this.searchUnitService.endDate();\n model.occupancy = this.occupancyService.getOccupancy();\n model.currency = this.searchUnitService.getCurrency();\n model.cabin = this.searchUnitService.getCabin();\n if (typeof this.searchUnitService.flexibleDates === 'boolean') {\n model.flexibleDates = this.searchUnitService.flexibleDates;\n }\n }\n\n launchSearch(\n model: UnifiedSearchModel,\n searchType: UnifiedSearchType,\n fid: string,\n savePreferences: boolean,\n allowDealsSearch: boolean,\n isFlexibleTripType: boolean\n ): void {\n model.domainId = TRPCONFIG.Domain.DomainId;\n\n if (savePreferences) {\n this.saveSearchModel(model);\n this.saveSearchType(searchType);\n }\n\n if (allowDealsSearch && (searchType === UnifiedSearchType.Holidays && !model.destination[0])) {\n // shortcircuit into holiday deals funnel\n this.holidayDealsSearch(model);\n return;\n }\n\n const areaName = this.getAreaName(searchType);\n this.sharedSearchUnitService.lockScreen(this.getSearchMessage(searchType), areaName + '-searchDirective');\n this.populateSearchUnitService(model);\n\n let modelCopy = angular.copy(model);\n\n let callSearch = (options) => {\n options.areaOverride = areaName;\n options.fid = fid || this.fidParser.parse();\n options.fbt = this.$location.search().boardType;\n options.fstr = this.$location.search().stars;\n options.hpr = this.$location.search().holidayPrice;\n this.sharedSearchUnitService.search(\n undefined,\n this.sharedSearchUnitService.showErrors,\n options,\n modelCopy,\n isFlexibleTripType\n );\n };\n\n let options;\n switch (searchType) {\n case UnifiedSearchType.Holidays:\n\n if (modelCopy.destination && this.destinationService.destinationIsCountry(modelCopy.destination)) {\n delete modelCopy.destination;\n }\n options = this.prepareFlightSearchOptions(modelCopy);\n callSearch(options);\n break;\n\n case UnifiedSearchType.Hotels:\n\n if (TRPCONFIG.Domain.NoDatesYetEnabled && modelCopy.noDatesYet) {\n if (modelCopy.destination && modelCopy.destination[0]) {\n // navigate to destination page\n this.$location.path(modelCopy.destination[0].PagePath);\n } else {\n this.sharedSearchUnitService.showErrors([this.resourceService.get('SELECTDESTINATION')]);\n }\n } else {\n callSearch({defaultFilters: true});\n }\n break;\n\n case UnifiedSearchType.Flights:\n\n options = this.prepareFlightSearchOptions(modelCopy);\n callSearch(options);\n break;\n\n default:\n }\n\n }\n\n holidayDealsSearch(model: UnifiedSearchModel): void {\n\n // convert model to deals search format\n const params = {\n airportsCodes: model.airports,\n startDate: model.startDate,\n duration: model.duration,\n occupancy: model.occupancy\n };\n\n // mixpanel tracking\n this.analytics.track('mixpanel', 'Search', {\n Nights: params.duration,\n DepartureAirports: params.airportsCodes,\n TypeTitle: 'Holiday Deals',\n FromDate: { Date: params.startDate },\n Rooms: params.occupancy\n });\n\n //if (!_validateParameters(params)) { return; }\n\n const serialised = this.holidayDeals.serialiseParameters(params, false);\n this.sharedSearchUnitService.lockScreen('SEARCHINGDEALS');\n\n for (let param in serialised) {\n this.$location.search(param, serialised[param]);\n }\n this.$location.path(`/holidaydeals`);\n\n }\n\n prepareFlightSearchOptions(model: UnifiedSearchModel): void {\n\n let options:any = {};\n\n options.onewayonly = model.onewayonly;\n options.flexibleDates = TRPCONFIG.Domain.FlexibleDatesEnabled ? model.flexibleDates : true;\n options.prefilterDirectFlights = TRPCONFIG.Domain.PrefilterDirectFlightsEnabled\n && model.prefilterDirectFlights;\n\n let isPrefilter = TRPCONFIG.Domain.PrefilterAirlineEnabled && !_.some(model.airlines, a => a.IsPostfilter);\n options.prefilterAirlines = isPrefilter ? _.map(model.airlines, a => a.Code) : [];\n options.postfilterAirlines = !isPrefilter ? _.map(model.airlines, a => a.Title) : [];\n\n return options;\n }\n\n prepopulateModel(model: UnifiedSearchModel,\n queryStringValues: any,\n disableResetOptions?: boolean\n ): ng.IPromise {\n let tripId = this.$route.current &&\n this.$route.current.params &&\n this.$route.current.params.tripId;\n\n let currentDestination = this.currentDestination.getCurrentDestination({ useSearchUnitService: false });\n let searchableDestination = this.getSearchableDestination(currentDestination);\n\n return this.$q.all({\n searchableDestination,\n preferences: queryStringValues.resetForm ? null : this.preferences.get('search'),\n trip: this.tripService.restoreSearchUnit(tripId)\n }).then(({\n searchableDestination,\n preferences,\n trip\n }) => {\n if (!model.destination || !model.destination[0]) {\n model.destination = [];\n if (preferences && !angular.isString(preferences)) {\n var searchArea = this.sharedSearchUnitService.getAreaInfo();\n if (searchArea && searchArea.mode && !queryStringValues.dealsOnly) {\n preferences.startDate = this.searchUnitService.startDate(searchArea.mode)\n || preferences.startDate;\n preferences.endDate = this.searchUnitService.endDate(searchArea.mode)\n || preferences.endDate;\n }\n angular.extend(model, _.omit(preferences, ['domainId'])); //ensure the domainID is preserved\n model.noDatesYet = false;\n model.airlines = this.searchQueryString.verifyAirlineModels(model.airlines);\n }\n if (trip) {\n this.populateModelFromSearchUnitService(trip, model);\n }\n }\n\n if (!disableResetOptions && TRPCONFIG.Domain2.ClearSearchPanelOptionsEnabled) {\n model.airlines = [];\n model.prefilterDirectFlights = false;\n model.flexibleDates = false;\n model.cabin = 1;\n model.noDatesYet = false;\n\n if (!searchableDestination) {\n model.destination = [];\n\n // workaround to clear destination, because validation should fail with empty destination\n this.searchUnitService.setDestination(null, null, null);\n this.searchUnitService.setDestinationAirport(null);\n }\n }\n\n if (searchableDestination && _.some(searchableDestination, value => value)) {\n model.destination[0] = searchableDestination;\n }\n\n _(['airports', 'startDate', 'endDate', 'occupancy', 'cabin', 'destination', 'currency'])\n .forEach(key => {\n const value = queryStringValues[key];\n if (value) {\n model[key] = value;\n }\n });\n\n if (model.domainId !== TRPCONFIG.Domain.DomainId ) {\n model.airports = [];\n }\n\n _.forEach(['airlines', 'prefilterDirectFlights'], key => {\n const value = queryStringValues[key];\n if (!angular.isUndefined(value)) {\n model[key] = value;\n }\n });\n\n if (TRPCONFIG.Domain.EnableNearestDepartureAirports) {\n if (!model.airports || !model.airports.length) {\n this.geo.getNearestAirports().then(airports => {\n if (airports && (!model.airports || !model.airports.length)) {\n model.airports = airports;\n }\n });\n }\n }\n\n const currencyOptions = this.searchUnitService.getCurrencyOptions();\n if(model.currency && currencyOptions.indexOf(model.currency) === -1) {\n model.currency = TRPCONFIG.Domain.CurrencyCode;\n }\n\n return model;\n });\n }\n\n getSearchableDestination(destinationPromise) {\n return destinationPromise.then(destination => {\n if (!destination || destination.Searchable !== false || !destination.Type || !destination.Id) {\n return destination;\n }\n let childDestinationPromise = this.$http.get('/api2/destination/v2/gettopchildrenV2', {\n params: {\n Count: 1,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n PageStrand: destination.PageStrand,\n Type: destination.Type,\n Id: destination.Id,\n },\n ignoreErrors: true,\n })\n .then(response => response.data[0])\n .then(this.destinationService.enhanceLegacyDestination)\n .then(this.destinationService.getDetails);\n\n return this.getSearchableDestination(childDestinationPromise);\n });\n }\n\n getDefaultModel(): UnifiedSearchModel {\n let model = new UnifiedSearchModel;\n model.occupancy = [new SearchOccupancy()];\n model.cabin = TRPCONFIG.Domain.DefaultSelectedFlightCabin || 1;\n model.destination = [];\n model.airports = [];\n model.airlines = [];\n model.flexibleDates = !TRPCONFIG.Domain.isAgentMode;\n model.prefilterDirectFlights = false;\n\t model.onewayonly = false;\n model.duration = 0;\n model.domainId = TRPCONFIG.Domain.DomainId;\n model.currency = TRPCONFIG.Domain.CurrencyCode;\n return model;\n }\n\n getQueryStringValues(hiddenQueryString: string): ng.IPromise {\n let params: any = {};\n _.forEach((hiddenQueryString || '').split('&'), x => {\n let parts = x.split('=');\n params[parts[0]] = parts[1];\n });\n return this.searchQueryString.getQueryStringValues(params);\n }\n\n saveSearchModel(model: UnifiedSearchModel) {\n this.preferences.set('search', model);\n }\n\n saveSearchType(searchType: UnifiedSearchType) {\n this.preferences.set('searchType', searchType);\n }\n\n validateOccupancy(occupancy: SearchOccupancy): boolean {\n // check child ages are set\n let childAges: number[] = [];\n _.each(occupancy, (o) => {\n childAges = _.concat(childAges, o.ChildAges);\n });\n const isValidOccupancy = _.every(childAges, ca => typeof ca !== 'undefined');\n return isValidOccupancy;\n }\n }\n\n angular\n .module('search')\n .service('unifiedSearchService', UnifiedSearchService);\n\n}\n","//Requires configuration options\n//HTMLHelpers - UseStaticDepartureDropdown : true\n//WebConfig - EnableStaticDepartureDropdown: true\n//WebConfig - FixedDepartureAirportOptions : (string value )\n\nnamespace SearchUnit {\n\n interface IAirport {\n Title: string;\n Code: string;\n titleCode: string;\n }\n\n interface ISearchUnitService {\n getAirport(code:string) : ng.IPromise;\n setDepartureAirports(airport: IAirport | null);\n getSelectedDepartureAirport();\n }\n\n interface IAirportOptions {\n options: IAirport[];\n selected: IAirport | null;\n }\n\n class FixedDepartureDropdown {\n\n options : string[];\n selected : IAirport[];\n data : string;\n airports: IAirportOptions = {\n options: [],\n selected: null\n };\n\n constructor( private searchUnitService: ISearchUnitService,\n private $q: ng.IQService)\n {\n $q.all(this.data.split(',').map(searchUnitService.getAirport)).then(results => {\n this.airports.options = results.map(r => _.assign(r, {titleCode:`${r.Title}, ${r.Code}`}));\n\n if(this.selected && this.selected.length > 0){\n _.each(this.airports.options, (airport) => {\n if(this.selected[0].Code === airport.Code){\n this.airports.selected = airport;\n }\n });\n }\n\n //ensure search criteria is persisted\n const preSelectedAirport = searchUnitService.getSelectedDepartureAirport();\n if ( preSelectedAirport ) {\n const preSelectedIndex = this.airports.options.filter(airport => {\n return airport.Code === preSelectedAirport.Code;\n });\n if ( preSelectedIndex.length ) {\n this.airports.selected = preSelectedIndex[0];\n }\n }\n });\n }\n\n onDepartureAirportChange():void {\n this.searchUnitService.setDepartureAirports(this.airports.selected);\n };\n }\n\n angular\n .module('searchUnit')\n .directive('fixedDepartureDropdown', fixedDepartureDropdown);\n\n function fixedDepartureDropdown(searchUnitService) {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'dd',\n bindToController: {\n data: '=',\n selected: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=FixedDepartureDropdown',\n controller : FixedDepartureDropdown\n };\n }\n}\n","namespace Area {\n\n function Area(searchUnitService,\n basketService) {\n return {\n 'hotels': {\n name: 'hotels',\n mode: searchUnitService.hotel,\n flow: basketService.hotelBooking,\n searchMsg: 'SEARCHINGHOTELS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Hotels,\n timeSupport: false,\n },\n 'transfers': {\n name: 'transfers',\n mode: searchUnitService.transfer,\n flow: basketService.transferBooking,\n searchMsg: 'SEARCHINGTRANSFERS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Transfers,\n timeSupport: true,\n },\n 'holidays': {\n name: 'holidays',\n mode: searchUnitService.flight,\n flow: basketService.holidayBooking,\n searchMsg: 'SEARCHINGFLIGHTSANDHOTELS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.FlightsAndHolidays,\n timeSupport: false,\n },\n 'flights': {\n name: 'flights',\n mode: searchUnitService.flight,\n flow: basketService.flightBooking,\n searchMsg: 'SEARCHINGFLIGHTS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.FlightsAndHolidays,\n timeSupport: false,\n },\n 'marhaba': {\n name: 'marhaba',\n mode: searchUnitService.marhaba,\n flow: basketService.marhabaBooking,\n searchMsg: 'SEARCHINGMARHABA',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Marhaba,\n timeSupport: true,\n },\n 'emirates': {\n name: 'emirates',\n mode: searchUnitService.hotel,\n flow: basketService.hotelBooking,\n searchMsg: 'SEARCHINGHOTELS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Hotels,\n timeSupport: false,\n },\n 'parking' : {\n name: 'parking',\n mode: searchUnitService.parking,\n flow: basketService.parkingBooking,\n searchMsg: 'SEARCHINGPARKING',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Parking,\n timeSupport: true,\n },\n 'attractions' : {\n name: 'attractions',\n mode: searchUnitService.attractions,\n flow: basketService.attractionsBooking,\n searchMsg: 'SEARCHINGATTRACTIONS',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Attractions,\n timeSupport: false,\n },\n 'insurance': {\n name: 'insurance',\n mode: searchUnitService.insurance,\n flow: basketService.insuranceBooking,\n searchMsg: 'SEARCHINGINSURANCE',\n endDateOffset: TRPCONFIG.Domain.SearchUnitEndDateOffsets.Insurance,\n timeSupport: false,\n }\n };\n }\n\n angular\n .module('TR')\n .factory('Area', Area);\n}\n","angular\n .module('deepLink')\n .config(DeepLinkConfig);\n\nfunction DeepLinkConfig($routeProvider) {\n $routeProvider.when('/holidays/search', {\n template: '',\n controller: 'DeepLinkController',\n controllerAs: 'deepLinkCtrl'\n });\n}\n","'use strict';\n\nangular\n .module('attractions')\n .service('attractionDetailsService', attractionDetailsService);\n\n\nfunction attractionDetailsService($http, $cacheFactory, $q) {\n\n var url = '/api2/attractions/details/',\n timeout,\n cacheLabel = 'detailPromiseCache',\n promiseCache = $cacheFactory.get(cacheLabel) || $cacheFactory(cacheLabel);\n\n var imageUrl = TRPCONFIG.Domain.AttractionsImageUrl;\n // var domain = TRPCONFIG.Domain,\n var service = {\n getAttractionDetails,\n getImageUrl,\n rehydrate,\n purge\n };\n\n function enhanceData(data) {\n data.AttractionIds = [];\n angular.forEach(data.AttractionRequests, function (r, k) {\n data.AttractionIds.push(parseInt(k, 10));\n });\n return data;\n }\n\n function getAttractionDetails(productDetails) {\n if (timeout != null) {\n timeout.resolve('CANCELLED');\n }\n timeout = $q.defer();\n return $http.post(url + 'get', productDetails, { ignoreErrors: true, timeout: timeout.promise })\n .then(function (res) {\n promiseCache.remove(res.data.DetailsSearchId);\n timeout = null;\n return enhanceData(res.data);\n });\n }\n\n function rehydrate(detailsSearchId) {\n // Retrieve product details from session\n if (!promiseCache.get(detailsSearchId)) {\n promiseCache.put(\n detailsSearchId,\n $http.post(url + 'getfromsession', { DetailsSearchId: detailsSearchId }, { ignoreErrors: true })\n .then((res) => enhanceData(res.data))\n );\n }\n return promiseCache.get(detailsSearchId);\n }\n\n function purge() {\n $cacheFactory.get(cacheLabel).removeAll();\n }\n\n function getImageUrl(id) {\n return imageUrl + id;\n }\n\n return service;\n\n}\n","'use strict';\ntype ArrayUtil = Core.ArrayUtil;\n\nangular\n .module('carHire')\n .controller('CarHire', CarHire);\n\nfunction CarHire($filter: any,\n $q: ng.IQService,\n $routeParams: any,\n $scope: any,\n arrayUtil: any,\n basketService: any,\n basketStore: any,\n carHireDetailsService: any,\n extraProductsService: any,\n scrollService: any,\n tripService: any\n ) {\n\n var ch = this;\n\n ch.noneCarHire = '-1';\n ch.currentCarHireLimit = ch.carHireLimit = 5;\n\n ch.DriverAgeConfig = {\n Min: 21,\n Max: 90\n };\n\n var deferred;\n var optionOperation;\n\n //Desktop\n ch.driverAgeList = arrayUtil.createRange(ch.DriverAgeConfig.Max, ch.DriverAgeConfig.Min);\n //DesktopEnd\n\n tripService.getTrip($routeParams.tripId).then(function (trip:any) {\n var basketId = trip.BasketId,\n tripId = trip.TripId,\n carHireSearchId = trip.CarHireRequest ? trip.CarHireRequest.AvailabilitySearchId : null,\n onewayonly = trip.FlightsRequest.OneWayOnly;\n\n ch.carHireDriverAge = trip.CarHireRequest ? trip.CarHireRequest.DriverAge : 30;\n\n $q.all([\n basketStore.carHire(basketId, $routeParams.productId),\n basketStore.rules(basketId, $routeParams.productId),\n basketStore.carHireOptions(basketId, $routeParams)\n ]).then(function (results:any) {\n\n var carHire = results[0] ? results[0].Details.CarHireId.CarHireCode : ch.noneCarHire;\n ch.basketRules = results[1];\n\n if ((TRPCONFIG.Domain.CarHireEnabled || TRPCONFIG.Domain.CarHireMobileEnabled) && !onewayonly) {\n\n $scope.$watch('ch.carHireDriverAge', _.debounce(function (val, oldVal) {\n if (val == null) {\n return;\n }\n ch.carHireBusyAvailability = true;\n if (oldVal !== val) {\n carHireSearchId = null;\n }\n deferred = $q.defer();\n\n const processResults = (carHireQuotes, options) => {\n ch.carHireQuotes = arrayUtil.sort(carHireQuotes, 'Price');\n ch.carHireLimit = 5;\n ch.carHireBusyAvailability = false;\n\n if (!ch.carHire) {\n ch.carHire = angular.copy(carHire);\n ch.carHireSelectedOptions = _normaliseCarHireOptions(options) || [];\n } else {\n const quote = arrayUtil.first(ch.carHireQuotes, q => {\n return q.CarHireId.CarHireCode === ch.carHire;\n });\n if (!quote) {\n ch.carHire = angular.copy(ch.noneCarHire);\n } else {\n ch.appendDetails(quote);\n }\n }\n };\n\n if(carHireSearchId == null) {\n basketService.getCarQuotes(basketId, tripId, ch.carHireDriverAge)\n .then(quotes => processResults(quotes, results[2]));\n } else {\n basketService.getCarQuotesFromSession(carHireSearchId, 0)\n .then(quotes => processResults(quotes, results[2]));\n }\n\n }, 400));\n\n\n $scope.$watch('ch.carHire', _selectCar, true);\n\n $scope.$watch('ch.carHireSelectedOptions', optionsWatch, true);\n\n }\n\n }).then(angular.noop, basketService.restartHolidayWorkflow);\n\n ch.appendDetails = function (quote, $event) {\n\n if ($event) {\n $event.preventDefault();\n }\n\n _.each(ch.carHireQuotes, function(q:any) {\n q.viewDetails = false;\n });\n\n if (!quote.Details) {\n quote.busy = true;\n tripService.getTrip(tripId).then(function (t:any) {\n carHireSearchId = t.CarHireRequest.AvailabilitySearchId;\n carHireDetailsService\n .getCarDetails({ AvailabilitySearchId: carHireSearchId, CarHireQuote: quote }, true)\n .then(function (d) {\n quote.viewDetails = true;\n quote.Details = d;\n quote.busy = false;\n quote.showDetailsError = false;\n }, function () {\n quote.busy = false;\n quote.showDetailsError = true;\n });\n });\n } else {\n quote.viewDetails = true;\n }\n };\n\n ch.hideDetails = function(quote, $event) {\n if ($event) {\n $event.preventDefault();\n }\n quote.viewDetails = false;\n };\n\n ch.showMoreOrLess = function ($event) {\n if ($event) {\n $event.preventDefault();\n }\n var moreCarHireQuotes = ch.currentCarHireLimit !== ch.carHireQuotes.length;\n var currentCarHireLimit = moreCarHireQuotes ? ch.carHireQuotes.length : ch.carHireLimit;\n if (!moreCarHireQuotes) {\n scrollService.scrollTo('#car-hire-product-expander', {animate:true, offset:70}).then(function () {\n ch.moreCarHireQuotes = false;\n ch.currentCarHireLimit = currentCarHireLimit;\n });\n } else {\n ch.moreCarHireQuotes = true;\n ch.currentCarHireLimit = currentCarHireLimit;\n }\n };\n\n var selectingCar:any = $q.when();\n\n function _selectCar(val, oldVal) {\n if (val == null || val === oldVal) {\n return;\n }\n _updateSubtitle();\n\n if (val !== ch.noneCarHire) {\n var quote = arrayUtil.first(ch.carHireQuotes, function (q) {\n return q.CarHireId.CarHireCode === val;\n });\n if (!!quote) {\n quote.busy = !quote.Details;\n\n if (!deferred) {\n deferred = $q.defer();\n }\n\n var select = function() {\n return tripService.getTrip(tripId).then(function(t:any) {\n carHireSearchId = t.CarHireRequest.AvailabilitySearchId;\n return basketService.selectCar(quote, carHireSearchId, basketId)\n .then(function(d:any) {\n ch.carHireSelectedOptions = arrayUtil.filter(ch.carHireSelectedOptions, function(op) {\n return op.carHireId === val;\n });\n quote.Details = d.Details;\n quote.showDetailsError = false;\n quote.viewDetails = true;\n quote.busy = false;\n\n if (deferred) {\n deferred.resolve();\n }\n\n if (optionOperation) {\n optionOperation.then(updateBasketAndCarHireOptions);\n }\n selectingCar = $q.when();\n }, function() {\n\n ch.carHire = angular.copy(ch.noneCarHire);\n quote.busy = false;\n\n quote.showDetailsError = true;\n });\n });\n };\n\n selectingCar = selectingCar.then(select);\n return selectingCar;\n }\n ch.carHire = ch.noneCarHire;\n } else {\n selectingCar = selectingCar.then(function () {\n return basketStore.removeCar(basketId).then(function () {\n ch.carHireSelectedOptions = [];\n if (deferred) {\n deferred.resolve();\n }\n updateBasketAndCarHireOptions();\n\n });\n });\n return selectingCar;\n }\n }\n\n optionOperation = $q.when();\n\n function optionsWatch(selectedOptions, old) {\n\n if (!selectedOptions ||\n selectedOptions === old ||\n selectedOptions.length === 0 && !!old && old.length > 1) {\n return;\n }\n\n optionOperation = optionOperation.then(function () {\n return selectOptions();\n });\n\n function selectOptions() {\n if (selectedOptions.length >= 1) {\n\n if (ch.carHire !== selectedOptions[selectedOptions.length - 1].carHireId) {\n ch.carHire = selectedOptions[selectedOptions.length - 1].carHireId;\n\n deferred = $q.defer();\n selectedOptions = [selectedOptions[selectedOptions.length - 1]];\n }\n }\n ch.carHireSelectedOptions = selectedOptions;\n\n return deferred.promise.then(function () {\n return addOrRemoveOption(selectedOptions);\n });\n }\n }\n\n function addOrRemoveOption(selectedOptions) {\n if (ch.carHire === ch.noneCarHire) {\n return $q.when();\n }\n return basketStore.carHireOptions(basketId).then(function (basketOptions) {\n var boNormal = _normaliseCarHireOptions(basketOptions);\n return _missingFrom(boNormal, selectedOptions, updateCarHireOptionsInBasket(basketStore.removeOptions))\n .then(function () {\n return _missingFrom(\n selectedOptions,\n boNormal,\n updateCarHireOptionsInBasket(basketStore.addOptions)\n )\n .then(function () {\n return updateBasketAndCarHireOptions();\n });\n });\n });\n }\n\n function updateCarHireOptionsInBasket(storeFn) {\n return function (options) {\n var quote = arrayUtil.first(ch.carHireQuotes, function (q) {\n return angular.equals(q.CarHireId.CarHireCode, ch.carHire);\n });\n if (!quote || !quote.Details) {\n return $q.when();\n }\n return storeFn.call(\n basketStore,\n basketStore.productType.CarHire,\n quote.Details.DetailsSearchId,\n options,\n basketId\n );\n\n };\n }\n\n function updateBasketAndCarHireOptions() {\n basketService.updateBasket();\n return basketStore.carHireOptions(basketId);\n }\n\n }, basketService.bookingAlreadyDone(`carHire: '${$routeParams.tripId}'`));\n\n function _missingFrom(src, dst, forall) {\n return forall(arrayUtil.map(arrayUtil.filter(src, function (o1) {\n return !arrayUtil.any(dst, function (o2) {\n return angular.equals(o1, o2);\n });\n }), function (optionId) {\n return { OptionId: optionId.optionId, ChosenQuantity: 1 };\n }));\n }\n ch.filterQuotes = extraProductsService.filterQuotes;\n\n\n function _normaliseCarHireOptions(bo) {\n var res:any = [];\n angular.forEach(bo, function (b) {\n res.push({ carHireId: ch.carHire, optionId: b });\n });\n return res;\n }\n\n function _updateSubtitle() {\n if (ch.carHireQuotes && ch.carHire) {\n var carHireQuote = arrayUtil.first(ch.carHireQuotes, function (c) {\n return angular.equals(c.CarHireId.CarHireCode, ch.carHire);\n });\n ch.carHireQuoteDescription = carHireQuote ?\n carHireQuote.Description + ' (' + $filter('customCurrency')(carHireQuote.Price) + ')'\n : null;\n\n }\n }\n\n}\n","'use strict';\n\nangular\n .module('carHire')\n .service('carHireService', carHireService);\n\n\nfunction carHireService($q, $http, tripService, analytics) {\n\n var domain = TRPCONFIG.Domain,\n service = {\n getCarQuotes: getCarQuotes,\n getCarQuotesFromSession: getCarQuotesFromSession\n };\n\n var timeout;\n\n\n function getCarQuotes(tripId, request) {\n var req = angular.extend({\n DomainId: domain.DomainId,\n Currency: domain.CurrencyCode\n }, request);\n if (timeout != null) {\n timeout.resolve('CANCELLED');\n }\n timeout = $q.defer();\n analytics.startTimer('CarHireAvailabilityRequest');\n return $http.post('/api2/carhire/availability/get', req, {\n ignoreErrors: true,\n timeout: timeout.promise\n }).then(function (res) {\n analytics.endTimer('CarHireAvailabilityRequest');\n tripService.recordCarHireSearch(tripId, request);\n timeout = null;\n return res.data.CarHireQuotes;\n });\n }\n\n function getCarQuotesFromSession(request) {\n return $http.post('/api2/carhire/availability/getfromsession',\n request,\n { ignoreErrors: true }\n ).then(function (res) {\n return res.data.CarHireQuotes;\n });\n }\n return service;\n\n}\n\nangular\n .module('carHire')\n .service('carHireDetailsService', carHireDetailsService);\n\n\nfunction carHireDetailsService($http, arrayUtil: ArrayUtil, $cacheFactory, $q, broker) {\n\n var url = '/api2/carhire/details/';\n var timeout;\n var promiseCache =\n $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\n\n\n // var domain = TRPCONFIG.Domain,\n var service = {\n getCarDetails: getCarDetails,\n rehydrate: rehydrate\n };\n\n function stringifyOptions(details) {\n details.AdditionalOptions = arrayUtil.map(details.AdditionalOptions, function (o:any) {\n o.OptionId = '' + o.OptionId;\n return o;\n });\n return details;\n }\n\n function getCarDetails(quote) {\n if (!!quote.CarHireQuote.Details) {\n return $q.when(quote.CarHireQuote.Details);\n }\n if (timeout != null) {\n timeout.resolve('CANCELLED');\n }\n var request = {\n AvailabilitySearchId: quote.AvailabilitySearchId,\n CarHireQuoteId: quote.CarHireQuote.CarHireId\n };\n timeout = $q.defer();\n return $http.post(url + 'get', request, {\n timeout: null,\n customErrCallback:\n function (args) {\n if (args.status) {\n broker.publish('carHireRequestFailed');\n }\n return true;\n }\n\n }).then(function (res) {\n promiseCache.remove(res.data.DetailsSearchId);\n timeout = null;\n return stringifyOptions(res.data);\n });\n }\n\n function rehydrate(id) {\n if (!promiseCache.get(id)) {\n promiseCache.put(id,\n $http.post(url + 'getfromsession', { DetailsSearchId: id }, { ignoreErrors: true })\n .then(function (res) {\n return stringifyOptions(res.data);\n }, function() {\n return $q.when('hello');\n }));\n }\n return promiseCache.get(id);\n }\n\n return service;\n\n}\n","'use strict';\ntype SearchUnitService = Search.SearchUnitService;\ntype HolidayDeals = TR.HolidayDeals;\n\nangular\n .module('searchUnit')\n .directive('dealsSearchUnit', dealsSearchUnit);\n\nfunction dealsSearchUnit($location: ng.ILocationService,\n holidayDeals: HolidayDeals,\n searchUnitService: SearchUnitService,\n sharedSearchUnitService,\n broker: Core.Broker,\n resourceService: Core.ResourceService,\n dateUtil,\n scrollTo,\n analytics) {\n\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'dealsSearchUnit');\n\n return {\n restrict: 'E',\n replace: true,\n scope: {\n areaOverride: '@',\n refresh: '=',\n noButton: '=',\n hideButton: '=',\n tracking: '=',\n pickMonths: '=',\n ldp: '=',\n writeToUrl: '='\n },\n templateUrl: 'partials/searchunit/deals',\n controller: 'SharedSearchUnit',\n link: function (scope, el, attr, controller) {\n broker.subscribe('dealsSearchUnit', 'autocompleterReady', function (e) {\n if (!$(e.data).isOnScreen()) {\n let container = ($('.horizontal-search-wrapper').length !== 0)\n ? '.horizontal-search-wrapper'\n : '.search-panel';\n scrollTo(container);\n }\n });\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('dealsSearchUnit');\n });\n\n return sharedSearchUnitService.initializeArea(\n scope,\n el,\n attr,\n controller,\n 'dealsSearchUnit'\n );\n }\n };\n\n function _delayedLinker(scope) {\n\n var currentArea = sharedSearchUnitService.getAreaInfo(scope.areaOverride);\n scope.area = currentArea.name;\n\n scope.durations = holidayDeals.DURATIONS.map(d => ({\n name: `${d} ${resourceService.get('NIGHTS')}`,\n value: d\n }));\n\n scope.airportDeselect = () => searchUnitService.clearDepartureAirports();\n\n scope.search = () => {\n const params = {\n airportsCodes: scope.airports,\n startDate: searchUnitService.startDate(currentArea.mode),\n duration: scope.duration,\n occupancy: scope.occupancy\n };\n\n analytics.track('mixpanel', 'Search', {\n Nights: params.duration,\n DepartureAirports: params.airportsCodes,\n TypeTitle: 'Holiday Deals',\n FromDate: { Date: params.startDate },\n Rooms: params.occupancy\n });\n\n if (!_validateParameters(params)) { return; }\n\n scope.refresh\n ? _refreshSearch(holidayDeals.serialiseParameters(params, false))\n : _startSearch(holidayDeals.serialiseParameters(params, false));\n };\n\n _restoreSearchCriteria(false);\n scope.$watch(() => _.size($location.search()), value => {\n if (value === 0) {\n _restoreSearchCriteria(true);\n }\n });\n\n function _restoreSearchCriteria(noWatch) {\n holidayDeals.getFullParameters(!!scope.writeToUrl).then(params => {\n scope.airports = params.depAir.map(a => ({ Code: a }));\n searchUnitService.setMultipleDepartureAirports(scope.airports);\n scope.startDate = searchUnitService.startDate(currentArea.mode, params.startDate);\n scope.duration = params.duration;\n scope.occupancy = params.occupancy;\n\n if (scope.refresh && !noWatch) {\n scope.$watch(() => searchUnitService.startDate(currentArea.mode), (n, o) => {\n _autoStartSearch(n, o);\n if (scope.tracking && !angular.equals(n, o)) {\n let date = dateUtil.parseDate(n);\n let month = date.getMonth() + 1;\n let year = date.getFullYear();\n _trackChange('startDate', `month-${month}-${year}`);\n }\n }, true);\n\n scope.$watch('occupancy', (n, o) => {\n _autoStartSearch(n, o);\n if (scope.tracking && !angular.equals(n, o)) {\n n = n[0] || n;\n const value:any = {\n Adults: n.Adults,\n Children: (n.ChildAges || []).length\n };\n _trackChange('Occupancy', value);\n }\n }, true);\n\n scope.$watch('duration', (n, o) => {\n _autoStartSearch(n, o);\n if (scope.tracking && !angular.equals(n, o)) {\n _trackChange('Duration', n);\n }\n });\n\n scope.$watch('airports', (n, o) => {\n if (_.size(n) === 0) { return; }\n searchUnitService.setMultipleDepartureAirports(n);\n if (scope.tracking && !angular.equals(n, o)) {\n _trackChange('Airports');\n }\n return _autoStartSearch(n, o);\n }, true);\n }\n });\n }\n\n function _autoStartSearch(newValue, oldValue) {\n if (newValue && scope.refresh && !angular.equals(newValue, oldValue)) {\n scope.search();\n }\n }\n\n function _trackChange(type, value?) {\n return value\n ? analytics.track('mixpanel', `HolidayDealsInsp${type}`, { value })\n : analytics.track('mixpanel', `HolidayDealsInsp${type}`);\n }\n\n function _refreshSearch(params) {\n for (let param in params) {\n $location.search(param, params[param]);\n $location.replace();\n }\n const position = $('body').scrollTop();\n broker.publish('REFRESHSEARCH', { newSearch: true });\n const listener = scope.$on(\n '$locationChangeSuccess',\n () => {\n $('body').scrollTop(position);\n listener();\n });\n }\n\n function _startSearch(params) {\n scope.$emit('block', {\n title: resourceService.get('SEARCHINGDEALS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-dealsSearchUnit'\n });\n for (let param in params) {\n $location.search(param, params[param]);\n }\n $location.path(`/holidaydeals`);\n }\n\n function _validateParameters(params) {\n if (_getNumberOfNonInfantPassengers(params.occupancy[0]) > 12) {\n scope.$emit('flash:error',\n String.format(decodeURI(resourceService.get('TOOMANYPASSENGERS')),\n `${TRPCONFIG.DesktopUrlRoot}/Help/Groupbookings.aspx`,\n resourceService.get('TELEPHONENUMBER')));\n return false;\n }\n const childAges = _.get(params, 'occupancy[0].ChildAges');\n const isValidOccupancy = _.every(childAges, ca => typeof ca !== 'undefined');\n if (!isValidOccupancy) {\n scope.$emit('flash:error', resourceService.get('CHILDAGESERROR'));\n } else {\n scope.$emit('flash:hide', resourceService.get('CHILDAGESERROR'));\n }\n return isValidOccupancy;\n }\n\n function _getNumberOfNonInfantPassengers(occ) {\n function _isolateNonInfants(value) {\n return value >= 2;\n }\n const childrenNumber = occ.ChildAges.filter(_isolateNonInfants).length;\n return occ.Adults + childrenNumber;\n }\n\n function _getNextMonth() {\n const today = new Date();\n let month = today.getMonth();\n const year = month === 11 ? today.getFullYear() + 1 : today.getFullYear();\n month = month === 11 ? 0 : month + 1;\n return new Date(year, month, 15, 0, 0, 0, 0);\n }\n }\n}\n","'use strict';\n\nangular.module('searchUnit')\n .directive('insuranceSearchUnit', insuranceSearchUnit);\n\nfunction insuranceSearchUnit($location, searchUnitService, sharedSearchUnitService, occupancyService, dateUtil) {\n // Configuration part, mandatory in every searchunit directive with delayed linker\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'insuranceSearchUnit');\n return {\n restrict: 'E',\n replace: true,\n scope: {\n areaOverride: '@'\n },\n templateUrl: 'partials/searchunit/insurance',\n controller: 'SharedSearchUnit',\n link(scope, el, attr, controller) {\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'insuranceSearchUnit');\n }\n };\n\n function _delayedLinker(scope, el, attr, ssu) {\n const mode = sharedSearchUnitService.getAreaInfo(scope.areaOverride).mode;\n scope.model = {};\n\n scope.policyTypeSelect = policyTypeSelect;\n scope.travelDestinationSelect = travelDestinationSelect;\n scope.search = search;\n\n // Initialise form\n _restoreSearchCriteria();\n\n function _restoreSearchCriteria() {\n scope.startDate = searchUnitService.startDate(mode);\n scope.endDate = searchUnitService.endDate(mode);\n scope.travelDestination = searchUnitService.getTravelDestination();\n scope.policyType = searchUnitService.getPolicyType();\n scope.occupancy = [occupancyService.reduceOccupancy()];\n }\n\n searchUnitService.getPolicyTypes().then((res: any) => {\n scope.policyTypes = res;\n });\n\n searchUnitService.getTravelDestinations().then((res: any) => {\n scope.travelDestinations = res;\n });\n\n searchUnitService.getPolicyExtras().then((res: any) => {\n scope.policyExtras = res;\n });\n\n function travelDestinationSelect() {\n searchUnitService.setTravelDestination(scope.travelDestination);\n }\n\n function policyTypeSelect() {\n searchUnitService.setPolicyType(scope.policyType);\n }\n\n function search() {\n //set selected polict extras\n let selectedPolicyExtras: any[] = [];\n scope.policyExtras.forEach(e => {\n if (e.Selected) {\n selectedPolicyExtras.push({Id : e.Id, Name : e.Name});\n }\n });\n searchUnitService.setPolicyExtra(selectedPolicyExtras);\n //set default end date for annual policy\n if (scope.policyType && scope.policyType.Id === 2) {\n scope.endDate = dateUtil.addDays(scope.startDate, 365, true);\n searchUnitService.endDate(mode, scope.endDate);\n }\n occupancyService.setOccupancy(scope.occupancy);\n ssu.lockScreen('SEARCHINGINSURANCE');\n sharedSearchUnitService.search(undefined, ssu.showErrors, {\n areaOverride: scope.areaOverride\n });\n }\n }\n}\n","'use strict';\nnamespace TR {\n angular\n .module('TR')\n .constant('hotelCriteria', [\n {val: [1], name: 'RECOMMENDED'},\n {val: [5, 6], name: 'PRICE', defaultSort: 5, defaultOrder: 'asc'},\n {val: [8, 7], name: 'STARRATING', defaultSort: 8, defaultOrder: 'desc'}\n ])\n .constant('flightCriteria', [\n {val: [10], name: 'RECOMMENDEDFLIGHT', oneWay: true},\n {val: [1, 2], name: 'PRICE', oneWay: true, defaultSort: 1, defaultOrder: 'asc'},\n {\n val: [4, 5],\n name: 'DEPARTURETIME',\n oneWay: true,\n defaultSort: 4,\n defaultOrder: 'asc',\n ascSuffix: 'SORTDIRECTIONTIMELABELASCENDING',\n descSuffix: 'SORTDIRECTIONTIMELABELDESCENDING'\n },\n {\n val: [6, 7],\n name: 'RETURNTIME',\n oneWay: false,\n defaultSort: 6,\n defaultOrder: 'asc',\n ascSuffix: 'SORTDIRECTIONTIMELABELASCENDING',\n descSuffix: 'SORTDIRECTIONTIMELABELDESCENDING'\n },\n {val: [9, 8], oneWay: true, name: 'TOTALJOURNEYTIME', defaultSort: 9, defaultOrder: 'asc'}\n ])\n .constant('dealsCriteria', [\n {val: [1], name: 'RECOMMENDED', qs: 'rc'},\n {val: [5, 6], name: 'PRICE', defaultSort: 5, defaultOrder: 'asc'},\n {val: [8, 7], name: 'STARRATING', defaultSort: 8, defaultOrder: 'desc'}\n ])\n .constant('costBreakdownCodes', {\n Hotel: 1,\n CancellationProtection: 21,\n });\n\n}\n","namespace Core {\n function AgentCorrelationId(\n agentModeService: any,\n tripService: TripService,\n $q: ng.IQService,\n $routeParams: ng.route.IRouteParamsService\n ) {\n return {\n scope: {},\n replace: true,\n template: `
        \n Search Id: {{::cm.hotelAvailabilitySearchId}}\n
        `,\n controllerAs: 'cm',\n controller: function() {\n agentModeService.getDebugSettings()\n .then(debugSettings => _.get(debugSettings, 'EnableSearchTracing'))\n .then(enableSearchTracing => enableSearchTracing && tripService.getTrip($routeParams.tripId))\n .then(trip => _.get(trip, 'HotelsRequest.AvailabilitySearchId'))\n .then(availabilitySearchId => this.hotelAvailabilitySearchId = availabilitySearchId);\n },\n };\n }\n\n if (TRPCONFIG.Domain.isAgentMode) {\n angular\n .module('core')\n .directive('agentCorrelationId', AgentCorrelationId);\n }\n}\n","namespace Core {\n\n class AgentNetInfo {\n\n data:any;\n displayToolTip:boolean = false;\n currency:string = TRPCONFIG.Domain.CurrencyCode;\n areas = {\n Holidays : 'holidays',\n Hotels: 'hotels',\n Flights: 'flights'\n };\n netValues:NetValues;\n enabled:boolean = false;\n mode:string;\n vat:number;\n markdown:{ OriginalPrice: Number, MarkdownAmount: Number};\n\n constructor(private $scope:ng.IScope, private $q:ng.IQService,\n private $route, private $routeParams, private agentNetInfoService) {\n const area = this.$route.current.area;\n this.enabled = false;\n const enabledAreas = TRPCONFIG.Domain.AgentNetInfoEnabledAreas.split(',');\n const areaIsEnabled = enabledAreas.length && enabledAreas.some( item => {\n return item === area;\n });\n if(areaIsEnabled) {\n this.createToolTip().then( data => {\n this.enabled = true;\n this.populateToolTip();\n }, data => {\n this.enabled = false;\n });\n }\n }\n\n createToolTip(){\n var deferred = this.$q.defer();\n if(this.data) {\n const isValidData = this.agentNetInfoService.hasRequiredValues(this.data, this.mode);\n isValidData ? deferred.resolve( this.data ) : deferred.reject( this.data );\n } else {\n const dataLoaded = this.$scope.$watch('ani.data', (value, prev)=> {\n if (this.agentNetInfoService.hasRequiredValues(value, this.mode)){\n dataLoaded();\n deferred.resolve( this.data );\n } else {\n deferred.reject( this.data );\n }\n });\n }\n return deferred.promise;\n }\n\n populateToolTip(){\n this.netValues = this.populateNetValues();\n }\n\n showToolTip() {\n this.displayToolTip = !this.displayToolTip;\n }\n\n populateNetValues() {\n if(this.$route.current.area === this.areas.Hotels) {\n this.data = this.data.concat(\n [\n { Cost : { Value : this.vat, CurrencyCode : TRPCONFIG.Domain.CurrencyCode}, Type : 0 },\n { ...this.markdown, Type: 99 }\n ]);\n }\n return this.agentNetInfoService.parse(this.data, this.mode);\n }\n\n }\n\n class AgentNetInfoHotels {\n data: any;\n displayToolTip: boolean = false;\n enabled: boolean = false;\n netValues:NetValues;\n\n constructor(private $scope: ng.IScope, private agentNetInfoService) {\n this.enabled = this.agentNetInfoService.hasRequiredValues(this.data, 'hotelinfo');\n if(this.enabled){\n this.netValues = this.populateNetValues();\n }\n }\n\n populateNetValues() {\n return this.agentNetInfoService.parse(this.data, 'hotelinfo');\n }\n\n showToolTip() {\n this.displayToolTip = !this.displayToolTip;\n }\n }\n\n angular\n .module('core')\n .directive('agentNetInfo', (): ng.IDirective => {\n return {\n restrict : 'E',\n scope: {},\n controller: AgentNetInfo,\n controllerAs: 'ani',\n bindToController: {\n data: '=',\n mode: '@',\n showTaxes: '=',\n vat: '=',\n markdown: '='\n },\n template: `
        \n
        \n \n
        \n
        `\n };\n })\n .directive('agentNetInfoHotels', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: AgentNetInfoHotels,\n controllerAs: 'anih',\n bindToController: {\n data: '='\n },\n template: `
        \n
        \n \n
        \n
        `\n };\n });\n};\n","namespace Core {\n class AgentNetInfoTable {\n data:NetValues;\n currency:string = TRPCONFIG.Domain.CurrencyCode;\n showTax:boolean;\n commissionType:string;\n constructor(){\n if(!this.commissionType) {\n this.commissionType = 'Commission';\n }\n }\n }\n\n angular\n .module('core')\n .directive('agentNetInfoTable', (): ng.IDirective => {\n return {\n restrict : 'E',\n scope: {},\n controller: AgentNetInfoTable,\n controllerAs: 'anit',\n bindToController: {\n data: '=',\n showTax: '=',\n commissionType: '@',\n mode:'@'\n },\n templateUrl: `partials/home/directivetemplate?type=AgentNetInfoTable`\n };\n });\n}\n","'use strict';\n/*\n Autocompleter field base class\n*/\nnamespace Autocompleter {\n\n export class AutocompleterField {\n\n prefix: any = '';\n inputField: JQuery;\n areaOverride: string;\n showLoading: boolean = false;\n initialData: any = null;\n debouncedFetch: () => void;\n\n // Attr\n data: any[] | null;\n currentValue: any[];\n minPrefix: number;\n select: (item: any) => void;\n deselect: () => void;\n setFocus: boolean;\n filterFunction: (prefix: string) => any[];\n titleProp: string;\n\n // DI - required in derived class\n $scope: any;\n $route: ng.route.IRouteService;\n resourceService: Core.ResourceService;\n autocompleter: any;\n $q: ng.IQService;\n\n constructor() {\n this.debouncedFetch = _.debounce(() => {\n this.$scope.$evalAsync(this.fetch());\n }, 300);\n this.minPrefix = this.minPrefix || TRPCONFIG.Domain.AutoCompleterMinPrefix;\n }\n\n init (areaOverride): void {\n if (areaOverride) {\n this.areaOverride = areaOverride;\n }\n }\n\n change (): void {\n this.debouncedFetch();\n }\n\n update (result: any): void {\n // Override in derived class to process `fetch()` result\n ;\n }\n\n addHeader (arr: any[], resourceName: string) {\n // Returns a copy of `arr` with header item prepended\n if (arr.length) {\n return [{\n Title: this.resourceService.get(resourceName),\n header: true\n }].concat(arr);\n }\n return [];\n }\n\n fetch() {\n this.$scope.$emit('flash:hide');\n\n if (!this.prefix || !this.prefix.length) {\n this.deselect();\n }\n\n const area = this.getArea();\n let allowedZeroInput = TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\n && area !== 'flights'\n && area !== 'transfers';\n if (this.prefix.length < this.minPrefix && !allowedZeroInput) {\n // `initialData` is `null` unless overwritten i.e. for recommendations\n this.data = this.initialData;\n if(area === 'flights-departure') {\n this.autocompleter.initialDepartureAirports().then(result => this.update(result));\n }\n return this.$q.when(null);\n\n }\n\n this.showLoading = true;\n return this.autocompleter.lookup(area, this.prefix, this.filterFunction).then(result => {\n this.showLoading = false;\n if (result.prefix === this.prefix) {\n this.update(result);\n return result;\n }\n return null;\n });\n }\n\n getArea() {\n const current = this.$route.current ? this.$route.current.area : '';\n return this.areaOverride || current;\n }\n }\n}\n","///\n'use strict';\n/*\n Creates an airport multi select field.\n Selectable options are exposed as `ac.data`.\n*/\nnamespace Autocompleter {\n\n class AirportMultiSelect extends AutocompleterField {\n\n private available: any[] = [];\n private selected: any[] = [];\n private selectAttrFn: (item: any) => void;\n prefilled: string;\n notActive: boolean;\n _placeholder: string;\n\n constructor (\n public $scope: any,\n public $route: ng.route.IRouteService,\n public resourceService: any,\n public $q: ng.IQService,\n public autocompleter: any\n ) {\n super();\n this.areaOverride = this.areaOverride || 'flights';\n this.$scope.$watch('ac.currentValue', v => {\n this._resetSelected(_.flattenDeep([v]));\n });\n\n // Wrap `select` attribute fn\n this.selectAttrFn = this.select;\n this.select = (item) => {\n this.selectItem(item);\n this.selectAttrFn({items: this.selected});\n };\n\n if(this.prefilled != null) {\n this.prefill(this.prefilled);\n }\n }\n\n private prefill(data) {\n let prefill = data.split(/\\s*,\\s*/);\n this.prefix = data;\n this.fetch().then(() => {\n prefill.forEach(code => {\n this.available.forEach(item => {\n if(item.Code === code) {\n this.select(item);\n }\n });\n });\n });\n }\n\n set placeholder(placeholder) {\n if(!this.notActive) {\n this._placeholder = placeholder;\n } else {\n this._placeholder = TRPCONFIG.Domain.DefaultStaticAirportLabel;\n }\n }\n\n get placeholder() {\n return this._placeholder;\n }\n\n update (result: any): void {\n // Called by super.fetch() with autocompleter.lookup result\n this.available = result.data;\n this._refreshData();\n\n if (_.isEmpty(this.data) && !this.notActive) {\n this.data = null;\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n }\n\n selectItem (item: any): void {\n if (item && item.Code) {\n // Remove codes that are already selected\n let codes = _.reject(item.Code.split(','), (item1: any) => {\n return _.find(this.selected, (item2: any) => item1 === item2.Code);\n });\n this._selectEachCode(codes, item.Title);\n this.prefix = '';\n }\n }\n\n removeItem (item: any): void {\n if (!item) { return; }\n this.selected.splice(this.selected.indexOf(item), 1);\n\n if (!this.selected.length) {\n this.deselect();\n }\n else {\n this.selectAttrFn({items: this.selected});\n }\n }\n\n private _refreshData (): void {\n this.data = this.addHeader(this._getAvailable(), 'AIRPORTS');\n }\n\n private _selectEachCode (codes: string[], sharedTitle: string) {\n codes.forEach(code => {\n if(!this.notActive || code === this.prefilled){\n this.selected.push({Code: code, Title: sharedTitle});\n }\n });\n }\n\n private _resetSelected (items: any[] = []) {\n // Overwrites `this.selected` with data from `currentValue` attr on every change\n this.selected = [];\n items.forEach(item => {\n if (item && item.Code) {\n this._selectEachCode(item.Code.split(','), item.Title);\n }\n });\n this._refreshData();\n }\n\n private _getAvailable () : any[] {\n // Filters out items where all codes are already selected\n return _.reject(this.available, (item: any) => {\n let selectedCodes = _.map(this.selected, 'Code');\n if (item.Code.indexOf(',') > -1) {\n return _.every(item.Code.split(','), (i) => {\n return _.indexOf(selectedCodes, i) > -1;\n });\n } else {\n return _.indexOf(selectedCodes, item.Code) > -1;\n }\n });\n }\n\n // This was refactored from holidaySearchUnit.directive.js `getTitle()` but removed as not needed.\n // To reinstate, call from `removeItem()` logic when only one entry is left in `this.selected`\n\n // private _refreshLastAirport (item): ng.IPromise {\n // let airportCode = item.Code;\n // return this.autocompleter.lookup('flights', airportCode).then(result => {\n // if (this.selected[0]) {\n // let match = _.find(this.available, {Code: airportCode}),\n // title = match && match.Title;\n // if (title) {\n // this.selected[0].Title = title;\n // }\n // }\n // });\n // }\n }\n\n angular\n .module('TR')\n .directive('airportMultiSelect', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'ac',\n bindToController: {\n placeholder: '@',\n select: '&',\n deselect: '&',\n currentValue: '=',\n focusTracker: '=',\n minPrefix: '@',\n notActive: '@',\n prefilled: '@',\n disabled: '@',\n areaOverride: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=AirportMultiSelect',\n controller: AirportMultiSelect,\n transclude: true,\n link: (\n scope: any,\n el: JQuery\n ) => {\n scope.ac.inputField = el.find('input');\n }\n };\n });\n}\n","///\n'use strict';\n/*\n Creates an airport multi select field.\n Selectable options are exposed as `ac.data`.\n*/\nnamespace Autocompleter {\n\n class AirportMultiSelectUnified2 extends AutocompleterField {\n\n private available: any[] = [];\n private selectAttrFn: (item: any) => void;\n private isCodeSelected: (code: string) => boolean =\n (code: string) => _.find(this.currentValue, v => code === v.Code);\n\n prefilled: string;\n notActive: boolean;\n _placeholder: string;\n elements: any;\n iconName: string;\n\n constructor (\n public $scope: any,\n public $route: ng.route.IRouteService,\n public autocompleter: any,\n public resourceService: Core.ResourceService,\n public $q: ng.IQService,\n private destinationService: any,\n public $timeout: ng.ITimeoutService\n ) {\n super();\n if (!this.areaOverride) {\n \tthis.areaOverride = 'flights';\n }\n this.$scope.$watch('ac.currentValue', v => {\n if (v) {\n this._refreshData();\n }\n });\n\n // Wrap `select` attribute fn\n this.selectAttrFn = this.select;\n this.select = (item) => {\n this.selectItem(item);\n this.selectAttrFn({items: this.currentValue});\n };\n\n if(this.prefilled != null) {\n this.prefill(this.prefilled);\n } else if (this.getArea() === 'flights-departure') {\n this.autocompleter.initialDepartureAirports().then(result => this.update(result));\n }\n\n this.$scope.$watch('extraFocusTrackerFocused', (val, old) => {\n if (val === false && old === true) {\n this.blur();\n }\n });\n }\n\n init (elements): void {\n this.elements = elements;\n this.inputField = this.elements.input;\n }\n\n private prefill(data) {\n let prefill = data.split(/\\s*,\\s*/);\n this.prefix = data;\n this.fetch().then(() => {\n prefill.forEach(code => {\n this.available.forEach(item => {\n if(item.Code === code) {\n this.select(item);\n }\n });\n });\n });\n }\n\n set placeholder(placeholder) {\n if(!this.notActive) {\n this._placeholder = placeholder;\n } else {\n this._placeholder = this.resourceService.get('DEFAULTAIRPORT');\n }\n }\n\n get placeholder() {\n return this._placeholder;\n }\n\n update (result: any): void {\n // Called by super.fetch() with autocompleter.lookup result\n this.available = result.data;\n this._refreshData();\n\n if (this.data && !this.data.length && !this.notActive) {\n this.data = null;\n\n const prefix = (result.prefix + '').toLowerCase();\n const hasPrefixAlreadyBeenUsed: boolean = prefix &&\n _.find(this.currentValue, v => (v.Title + '').toLowerCase().indexOf(prefix) > -1);\n\n if(!hasPrefixAlreadyBeenUsed) {\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n }\n }\n\n selectItem (item: any): void {\n if (item && item.Code) {\n // Add codes which are not already selected\n let codes = item.Code.split(',');\n _.forEach(codes, (code: string) => {\n if(!this.isCodeSelected(code)) {\n if(!this.currentValue) {\n this.currentValue = [];\n }\n let individual = _.find(this.available, i => i.Code === code);\n individual = individual ? angular.copy(individual) : {Code: code, Title: item.Title};\n this.currentValue.push(individual);\n }\n });\n this.prefix = '';\n this._refreshData();\n }\n }\n\n removeItem (item: any): void {\n if (!item) { return; }\n this.currentValue.splice(this.currentValue.indexOf(item), 1);\n\n if (!this.currentValue.length) {\n this.deselect();\n } else {\n this.selectAttrFn({items: this.currentValue});\n }\n this._refreshData();\n }\n\n blur () {\n this.$timeout(() => {\n if (this.prefix) {\n var firstItem = _.find(this.data || [], d => !d.header);\n if (firstItem) {\n this.select(firstItem);\n }\n }\n }, 200);\n }\n\n focusOnInput() {\n this.inputField.focus();\n }\n\n firstTitle() {\n if (!this.$scope.extraFocusTrackerFocused) {\n if (this.currentValue && this.currentValue[0]) {\n return this.getTitle(this.currentValue[0]);\n }\n }\n }\n titleCache = {};\n getTitle(airport) {\n if (airport.Code in this.titleCache) {\n return this.titleCache[airport.Code];\n }\n if (airport.Title) {\n return this.titleCache[airport.Code] = this.formatTitle(airport.Title);\n }\n this.destinationService\n .getAirport(airport.Code)\n .then(airport => this.titleCache[airport.Code] = this.formatTitle(airport.Title));\n return this.titleCache[airport.Code] = ' ';\n }\n formatTitle(title) {\n return (title || '').split('(')[0].split(',')[0];\n }\n\n private _refreshData (): void {\n //this.data = this.addHeader(this._getAvailable(), 'AIRPORTS');\n this.data = this._getAvailable();\n }\n\n private _getAvailable () : any[] {\n // Filters out items where all codes are already selected\n return _.reject(\n this.available,\n item => _.every(\n item.Code.split(','),\n this.isCodeSelected\n )\n );\n }\n }\n\n angular\n .module('TR')\n .directive('airportMultiSelectUnified2', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'ac',\n bindToController: {\n placeholder: '@',\n select: '&',\n deselect: '&',\n currentValue: '=',\n focusTracker: '=',\n minPrefix: '@',\n notActive: '@',\n prefilled: '@',\n disabled: '@',\n areaOverride: '@',\n iconName: '@?'\n },\n templateUrl: 'partials/home/directivetemplate?type=AirportMultiSelectUnified',\n controller: AirportMultiSelectUnified2,\n transclude: true,\n link: (\n scope: any,\n el: JQuery,\n attrs,\n ac: AirportMultiSelectUnified2\n ) => {\n const elements = {\n el: el,\n field: el.find('.field'),\n input: el.find('input')\n };\n ac.init(elements);\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class BookingExtrasCarHireOption {\n\n quote: any;\n model: string;\n selectable: boolean;\n selectCar: (x: { quoteId: string }) => void;\n\n public select($event) {\n $event.preventDefault();\n this.selectCar( { quoteId : this.quote.CarHireId.CarHireCode });\n }\n\n }\n\n angular\n .module('TR')\n .directive('bookingExtrasCarHireOption', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n bindToController: {\n quote: '=',\n model: '=',\n selectable: '=',\n selectCar: '&'\n },\n controller: BookingExtrasCarHireOption,\n controllerAs: 'cho',\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasCarHireOption'\n };\n\n });\n\n}\n","/**\n * Created by bdickson on 15/06/2016.\n */\n\nnamespace TR {\n\n class BookingExtrasOptionOld {\n\n model:any;\n val:any;\n group:string;\n selected:boolean;\n price:number;\n perPerson:boolean;\n pricePerPerson:number;\n priceFull?: number;\n included?: boolean;\n priceRounded?: boolean;\n\n private _input:any;\n\n constructor($scope:ng.IScope) {\n // watch the model\n $scope.$watch('beo.model', model => {\n this._checkSelected();\n });\n }\n\n click(event:MouseEvent) {\n // update the model only if the value has changed\n if (!angular.equals(this.model, this.val)) {\n this.model = this.val;\n }\n }\n\n private _checkSelected() {\n this.selected = angular.equals(this.model, this.val);\n //this._input.prop('checked', this.selected);\n }\n\n // init(container:ng.IAugmentedJQuery) {\n // this._input = container.find('input');\n // }\n\n }\n\n angular\n .module('TR')\n .directive('bookingExtrasOptionOld', ():ng.IDirective => {\n\n return {\n scope: {},\n bindToController: {\n model: '=',\n val: '=',\n group: '@',\n price: '=',\n perPerson: '=',\n pricePerDay: '=',\n isDelta: '=?',\n pricePerPerson: '=?',\n priceFull: '=?',\n included: '=?',\n priceRounded: '=?'\n },\n controller: BookingExtrasOptionOld,\n controllerAs: 'beo',\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasOptionOld',\n transclude: true,\n replace: true,\n\n // link: function (scope:ng.IScope, el:ng.IAugmentedJQuery, attr, controller:BookingExtraOption) {\n // controller.init(el);\n // }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n class BookingFormHeader {\n private tripHeading = '';\n\n constructor(tripService, $routeParams, basketStore, $q, resourceService) {\n tripService.getTrip($routeParams.tripId)\n .then(trip => {\n let promise = $q.when();\n let resource = '';\n switch (trip.TripType) {\n case tripService.tripTypes.Holiday:\n resource = resourceService.get('YOURHOLIDAYTO');\n promise = basketStore.hotel(trip.BasketId);\n break;\n case tripService.tripTypes.Hotel:\n resource = resourceService.get('YOURHOTELIN');\n promise = basketStore.hotel(trip.BasketId);\n break;\n case tripService.tripTypes.Flight:\n resource = resourceService.get('YOURFLIGHTTO');\n promise = basketStore.flight(trip.BasketId);\n break;\n case tripService.tripTypes.Transfer:\n resource = resourceService.get('YOURTRANSFERTO');\n promise = basketStore.transfer(trip.BasketId);\n break;\n case tripService.tripTypes.Parking:\n resource = resourceService.get('YOURAIRPORTPARKINGAT');\n break;\n case tripService.tripTypes.Attractions:\n resource = resourceService.get('YOURATTRACTIONS');\n break;\n case tripService.tripTypes.Insurance:\n resource = resourceService.get('YOURTRAVELINSURANCE');\n break;\n case tripService.tripTypes.Marhaba:\n resource = resourceService.get('YOURMARHABA');\n break;\n }\n\n promise.then((result) => {\n if (result) {\n const detail = () => {\n let prop = 'Details.Location';\n switch (trip.TripType) {\n case tripService.tripTypes.Flight:\n prop = 'Details.Itinerary.Legs[0].ArrivalAirport.Title';\n break;\n case tripService.tripTypes.Transfer:\n prop = 'Details.Itinerary.OutboundLeg.DestinationPoint';\n break;\n case tripService.tripTypes.Attractions:\n prop = 'LineItems[0].Description.Title';\n break;\n }\n return prop;\n };\n let destination = result ? _.get(result, detail(), '') : '';\n\n if(!destination) {\n if(trip.TripType === tripService.tripTypes.Transfer){\n destination = _.get(result, 'Details.Itinerary.InboundLeg.DestinationPoint', '');\n }\n }\n\n this.tripHeading = String.format(resource, destination);\n } else if (trip.TripType === tripService.tripTypes.Parking) {\n this.tripHeading = String.format(resource,\n _.get(trip, 'ParkingRequest.Airport.ShortTitle', ''));\n } else {\n this.tripHeading = resource;\n }\n });\n });\n\n }\n\n }\n\n angular\n .module('core')\n .directive('bookingFormHeader', (tripService, $routeParams, basketStore, resourceService) => {\n return {\n restrict: 'E',\n template: `
        \n
        \n

        \n {{ bfh.tripHeading }}\n

        \n
        \n
        `,\n controller: BookingFormHeader,\n controllerAs: 'bfh'\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class BookingFormSummary {\n\n private links: any;\n private detailsLinkCaption: string;\n private changeLinkCaption: string;\n private workflowState: number;\n private imageurl: string;\n private title: string;\n private price: number | string;\n private details: any;\n\n constructor() {\n\n this.links = {\n details: {\n enabled: false,\n caption: this.detailsLinkCaption || ''\n },\n change: {\n enabled: false,\n caption: this.changeLinkCaption || '',\n state: this.workflowState || 0,\n }\n };\n\n function changeWorkflow(state) {\n this.onChange(state);\n }\n\n }\n\n }\n\n angular\n .module('core')\n .directive('bookingFormSummary', ($route) => {\n return {\n link: (scope) => {\n var type = $route.current.area;\n scope.template = `partials/booking/template?name=BookingSummary${type}`;\n },\n template: `
        `\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class BookingSummaryBreakdown {\n constructor(){}\n }\n\n angular\n .module('core')\n .directive('bookingSummaryBreakdown', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n bindToController: {\n title : '@',\n total : '='\n },\n controller: BookingSummaryBreakdown,\n controllerAs: 'bsb',\n replace: true,\n templateUrl: 'partials/booking/template?name=BookingSummaryBreakdown'\n };\n\n });\n\n}\n","(function() {\n 'use strict';\n\n angular\n .module('TR')\n .directive('canonicalTags', canonicalDirective);\n\n function canonicalDirective(broker, $document, urlUtils) {\n return {\n restrict: 'E',\n link\n };\n\n function link(scope) {\n broker.subscribe('canonicalDirective', 'seoCanonicalDetected', function(eventData) {\n _.map($document[0].head.getElementsByTagName('link'), function(linkTag) {\n if (linkTag.rel === 'canonical' || linkTag.rel === 'alternate') {\n linkTag.href = setCanonicalFid(linkTag.href, eventData.data.fid);\n }\n });\n });\n\n scope.$on('$destroy', function() {\n broker.unsubscribe('canonicalDirective');\n });\n }\n\n // this assumes that a canonical url with a fid will be the path + the single fid parameter\n function setCanonicalFid(targetUrl, fid) {\n const parsedHref = urlUtils.parse(targetUrl);\n return `${parsedHref.url}?fid=${fid}`;\n }\n }\n})();\n","(function() {\n 'use strict';\n\nangular\n .module('core')\n .directive('datepickerMkc', datepickerMkc);\n\nfunction datepickerMkc(dateUtil) {\n return {\n restrict: 'E',\n link: _linker,\n require: '^datePicker'\n };\n\n function _linker(scope, el, attr, datepicker) {\n /* In the event of a transclusion inside an isolated-scope-directive the transcluding\n directive's scope will always be the previous sibling.\n This approach forced me to use an angular private property but, at least, we're not\n polluting the controller's scope (when using a shared directive-controller we can't\n create an isolated scope because we're on the same element) */\n const tScope = scope.$parent;\n const dateEl = datepicker.dateEl;\n\n scope = tScope.currentDate;\n\n dateEl.on('keydown', function switchToTab(event) {\n /* If we have two datepicker on the same page and we are concurrently updating them\n both the update event on the second dp will show the date selection div this will\n forcefully hide it */\n if (event.which === 13) {\n $('#ui-datepicker-div').fadeOut('fast');\n }\n\n if (event.which === 9) {\n tScope.$apply(function() {\n tScope.select({ date: dateEl.datepicker('getDate') });\n });\n }\n });\n\n tScope.$watch('currentDate', function(val) {\n if (val) {\n dateEl.datepicker('setDate', dateUtil.parseDate(tScope.currentDate));\n }\n });\n\n tScope.$on('$destroy', function() {\n dateEl.off('input');\n dateEl.off('blur');\n dateEl.off('keydown');\n });\n }\n}\n})();\n","'use strict';\n\nnamespace Core {\n function factory(template) {\n return function() {\n return {\n scope: true,\n bindToController: {\n message: '@'\n },\n restrict: 'E',\n controller: 'DiscountMessage',\n controllerAs: 'dm',\n template: template,\n replace: true\n };\n };\n }\n\n const messageTemplate = `\n
        \n {{::dm.message}}\n
        `;\n\n class DiscountMessage {\n message: string;\n }\n\n angular.module('core')\n .controller('DiscountMessage', DiscountMessage)\n .directive('discountMessage', factory(messageTemplate));\n}\n","'use strict';\n\nnamespace Core {\n\n class FlightBookingSummary {\n\n private trip: any;\n\n extrasCost: number;\n flight: any;\n flightCost: number;\n atolAvailable: boolean;\n atolCost: number;\n occupancy: any;\n totalCost: number;\n nights: number;\n carHireExtras: any;\n carHireExtrasTotal: number;\n extras: any;\n attractionsCost: string;\n\n constructor(\n private $q: ng.IQService,\n private $routeParams: any,\n private $scope: ng.IScope,\n private basketStore: any,\n private broker: Broker,\n private tripService: TripService,\n private occupancyService: any\n ) {\n tripService.getTrip($routeParams.tripId).then(trip => {\n if (trip && trip.BasketId) {\n this.trip = trip;\n\n tripService.getTripOccupancy(trip.TripId)\n .then(results => {\n this.occupancy = results[0];\n });\n\n this.getCostBreakdown();\n this.updateFlightInfo();\n\n broker.subscribe('FlightBookingSummary', 'basketUpdated', () => {\n this.getCostBreakdown();\n this.updateFlightInfo();\n });\n\n broker.subscribe('FlightBookingSummary', 'updatePricesOnPUP', e => {\n this.getCostBreakdown();\n this.updateFlightInfo();\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('FlightBookingSummary');\n });\n }\n });\n }\n\n private getCostBreakdown(): void {\n\n this.$q.all([\n this.basketStore.totalCost(this.trip.BasketId),\n this.basketStore.costBreakdownGrouped(this.trip.BasketId),\n this.basketStore.carHire(this.trip.BasketId),\n this.basketStore.isAtolProtected(this.trip.BasketId),\n this.basketStore.attractionCost(this.trip.BasketId)\n ]).then(([\n totalCost,\n costBreakdownGrouped,\n carHire,\n isAtolProtected,\n attractionsCost\n ]) => {\n\n this.totalCost = parseFloat(totalCost);\n this.atolAvailable = isAtolProtected;\n this.attractionsCost = attractionsCost;\n\n _.each(costBreakdownGrouped, (cb) => {\n if (cb.group === 2) {\n\n // FLIGHTS\n this.flightCost = cb.total;\n\n const atol = _.find(cb.costBreakdown, (item: any) => {\n return item.Description.indexOf('ATOL') >= 0;\n });\n if (atol) {\n this.atolCost = atol.UnitAmount * atol.Quantity;\n this.flightCost = cb.total - this.atolCost; // subtract the atol cost from the flights total\n } else {\n this.flightCost = cb.total;\n }\n } else if (cb.group === 3) {\n // EXTRAS\n this.extrasCost = cb.total;\n this.extras = this.basketStore.extrasBreakdown(cb.costBreakdown);\n }\n });\n\n let carHireExtras: any = _.get(carHire, 'RequestedItems');\n\n this.carHireExtras = carHireExtras;\n this.carHireExtrasTotal = carHireExtras ?\n carHireExtras.reduce((total, extra) => total += extra.UnitAmount, 0) :\n undefined;\n\n });\n\n }\n\n private updateFlightInfo(): void {\n this.basketStore.flight(this.trip.BasketId)\n .then(flight => {\n this.flight = flight;\n this.nights = this.flight.Details.Itinerary.Nights;\n });\n }\n\n public showDetails(e) {\n const passengers = this.occupancyService.getTotalPeopleCounts();\n e.preventDefault();\n this.broker.publish('showModalFlightDetails', { flight: this.flight.Details.Itinerary });\n }\n\n }\n\n angular\n .module('core')\n .directive('flightBookingSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n bindToController: {\n cardFeeForTotal: '=?'\n },\n controller: FlightBookingSummary,\n controllerAs: 'fbs',\n replace: true,\n templateUrl: (element, attr) => {\n if(attr.templateVersion) {\n return 'partials/booking/template?name=FlightBookingSummary&version='\n + attr.templateVersion;\n }\n return 'partials/home/directivetemplate?type=FlightBookingSummary';\n }\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class HotelList {\n\n public hotels :any;\n public hotelImageIndex :number = 0;\n public hotelImages : any[] = [];\n public ready :boolean = false;\n public showHotelImages :boolean = false;\n public spinnerId :number = 0;\n\n private removeHotel: (event: any, hotel: any) => void;\n\n\n constructor( private $scope: any,\n private imageService: any,\n private urlUtils: any\n )\n {\n if (!this.hotels) {\n const watch = $scope.$watch('hl.hotels', (n, o) => {\n if (n && n !== o) {\n this.ready = true;\n watch();\n }\n });\n } else {\n this.ready = true;\n }\n }\n\n public selectHotel(hotel) {\n this.spinnerId = hotel.Id;\n }\n\n public openImageGallery(hotelId, photoCount, e) {\n e.preventDefault();\n\n const w = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\n const h = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\n\n this.hotelImageIndex = 0;\n this.hotelImages = [];\n for (let i = 0, l = photoCount; i < l; i++) {\n this.hotelImages.push({\n src: this.imageService.getImageUrl(hotelId, w, h, i, false)\n });\n }\n this.showHotelImages = true;\n }\n\n public getHotelUrl(hotel) {\n return this.urlUtils.stripLeadingSlash(hotel.Url);\n }\n\n }\n\n angular\n .module('core')\n .directive('hotelList', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: HotelList,\n controllerAs: 'hl',\n replace: true,\n bindToController: {\n hotels: '=',\n removeHotel: '&'\n },\n templateUrl: 'partials/home/directivetemplate?type=HotelList'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class LoaderPanel {\n\n private busy: boolean;\n\n }\n\n angular\n .module('core')\n .directive('loaderPanel', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n bindToController: {\n busy: '='\n },\n controller: LoaderPanel,\n controllerAs: 'lp',\n template: '
        ' +\n '' +\n '
        '\n };\n });\n\n}\n","///\n'use strict';\nnamespace Autocompleter {\n\n type ArrayUtil = Core.ArrayUtil;\n\n class ManySelect {\n\n model: any[];\n options: any[];\n remainingOptions: any[];\n\n private prefix: string;\n\n constructor (\n public $scope: any,\n public $route: ng.route.IRouteService,\n public autocompleter: any,\n public resourceService: any,\n public $q: ng.IQService,\n public $timeout: ng.ITimeoutService,\n public arrayUtil: ArrayUtil\n ) {\n $timeout(() => {\n $scope.$watch(\n () => ({ options: this.options, model: this.model, prefix: this.prefix }),\n val => {\n this.remainingOptions = this.arrayUtil.difference(val.options, val.model);\n const prefix = val.prefix && val.prefix.toLowerCase();\n if (prefix) {\n this.remainingOptions = _.filter(this.remainingOptions,\n o => o.Title && o.Title.toLowerCase().indexOf(prefix) > -1);\n }\n },\n true\n );\n });\n }\n\n select (item: any): void {\n if (item && this.model) {\n const isAlreadySelected = _.some(this.model, o => angular.equals(item, o));\n if (!isAlreadySelected) {\n this.model.push(item);\n }\n this.prefix = '';\n }\n }\n\n removeItem (item: any): void {\n if (item) {\n this.model.splice(this.model.indexOf(item), 1);\n }\n }\n\n blur () {\n this.$timeout(() => {\n if (this.prefix) {\n var firstItem = _.find(this.remainingOptions, d => !d.header);\n if (firstItem) {\n this.select(firstItem);\n }\n }\n }, 200);\n }\n }\n\n angular\n .module('TR')\n .directive('manySelect', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'ms',\n bindToController: {\n placeholder: '@',\n model: '=',\n options: '=',\n iconClass: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=ManySelect',\n controller: ManySelect,\n transclude: true,\n link: (\n scope: any,\n el: JQuery\n ) => {\n scope.ms.inputField = el.find('input');\n }\n };\n });\n}\n","namespace Core {\n function MonthPicker(\n $location: ng.ILocationService,\n dateUtil: any,\n searchUnitService: SearchUnitService\n ) {\n return {\n scope: {\n value: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=MonthPicker',\n link($scope, $element) {\n $scope.showSelectors = false;\n\n $scope.range = (() => {\n const origin = dateUtil.todayPlus(4);\n const year = origin.getFullYear();\n const month = origin.getMonth();\n const months = _.range(month, month + 12);\n return _.map(months, m => new Date(year, m, 15, 0, 0, 0, 0));\n })();\n\n $scope.onSelectorClick = ($event:ng.IAngularEvent, date:Date) => {\n $scope.value = date;\n $location.search('startDate', dateUtil.format(date, 'yyyy-MM-dd'));\n searchUnitService.startDate(1, date);\n $scope.showSelectors = false;\n if ($event.stopPropagation) { $event.stopPropagation(); }\n };\n\n $scope.onInputClick = ($event:ng.IAngularEvent) => {\n $scope.showSelectors = !$scope.showSelectors;\n if ($event.stopPropagation) { $event.stopPropagation(); }\n };\n\n $scope.preventClose = ($event:ng.IAngularEvent) => {\n if ($event.stopPropagation) { $event.stopPropagation(); }\n };\n\n $(document.body).on('click.monthPicker', e => {\n $scope.showSelectors = false;\n $scope.$apply();\n });\n\n $scope.$on('$destroy', () => {\n $(document.body).off('click.monthPicker');\n });\n }\n };\n }\n\n angular\n .module('core')\n .directive('monthPicker', MonthPicker);\n}\n","angular\n .module('core')\n .directive('noIndexFollow', function (\n $rootScope : ng.IRootScopeService,\n broker\n ) {\n return {\n restrict: 'EA',\n replace: true,\n template: '',\n controllerAs: 'nif',\n controller: function($scope: ng.IScope) {\n $rootScope.$on('$routeChangeStart', () => this.isNoIndexFollow = false);\n broker.subscribe('noIndexFollow', 'ISNOINDEXFOLLOW',\n e => this.isNoIndexFollow = e.data.isNoIndexFollow);\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('noIndexFollow');\n });\n }\n };\n });\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('pauseCall', pauseCall);\n\nfunction pauseCall($rootScope, agentModeService, resourceService, broker) {\n return {\n restrict: 'A',\n link: _linker\n };\n\n function _linker(scope, element) {\n const structure = _createStructure();\n\n element.on('focus', 'input, select', _pollingStatus);\n\n broker.subscribe('pauseCallDirective', 'pciFrameFocus', _pollingStatus);\n\n const extensions = $rootScope.agent ? $rootScope.agent.PhoneNumbers : [];\n\n scope.$on('$destroy', function() {\n $(structure.action).off('click');\n broker.unsubscribe('pauseCallDirective');\n });\n\n function _pollingStatus() {\n _bringInFocus(element);\n _bringInFocus($('#payment-details'));\n\n agentModeService\n .checkExtensionStatus(extensions)\n .then(function existActiveExtension(exists) {\n if (exists) {\n structure.overlay.style.display = 'block';\n _addMessages({ messageText: resourceService.get('CPTRYPAUSE') });\n _tryToPause();\n } else {\n _hideOverlay();\n }\n });\n }\n\n function _tryToPause() {\n agentModeService\n .pauseCall()\n .then(\n function _successfullyPaused() {\n _addMessages({\n messageText: resourceService.get('CPSUCCESSPAUSE'),\n actionText: resourceService.get('CPRESUME'),\n actionHandler: _tryToResume\n });\n },\n function _pauseFailed(errorString) {\n if (errorString === 'ABORT') {\n _hideOverlay();\n return;\n }\n\n _addMessages(\n {\n messageText: `${resourceService.get('CPFAILPAUSE')} ${errorString}`,\n actionText: resourceService.get('CPTRYAGAIN'),\n actionHandler: _tryToPause\n },\n {\n messageText: resourceService.get('CPOR')\n },\n {\n actionText: resourceService.get('CPCONTINUEUNPAUSED'),\n actionHandler: _forceContinue('Pause')\n\n });\n }\n );\n }\n\n function _tryToResume() {\n agentModeService\n .resumeCall()\n .then(\n function _successfullyResumed() {\n _addMessages({\n messageText: resourceService.get('CPSUCCESSRESUME'),\n actionText: resourceService.get('CPHIDE'),\n actionHandler: _hideOverlay\n });\n },\n function _resumeFailed(errorString) {\n if (errorString === 'ABORT') {\n _hideOverlay();\n return;\n }\n\n _addMessages(\n {\n messageText: `${resourceService.get('CPFAILRESUME')} ${errorString}`,\n actionText: resourceService.get('CPTRYAGAIN'),\n actionHandler: _tryToResume\n },\n {\n messageText: resourceService.get('CPOR')\n },\n {\n actionText: resourceService.get('CPCONTINUE'),\n actionHandler: _forceContinue('Resume')\n\n });\n }\n );\n }\n\n function _forceContinue(type) {\n return function() {\n agentModeService.logFatalError(type);\n _hideOverlay();\n };\n }\n\n function _bringInFocus(el) {\n el.css('z-index', 4200);\n el.css('position', 'relative');\n }\n\n function _hideOverlay() {\n structure.container.style.display = 'none';\n structure.overlay.style.display = 'none';\n\n element.css('z-index', 0);\n $('#payment-details').css('z-index', 0);\n }\n\n function _addMessages(...args) {\n while (structure.container.lastChild) {\n structure.container.removeChild(structure.container.lastChild);\n }\n\n for (let i = 0, ii = args.length; i < ii; i++) {\n const curr = args[i];\n\n const message = document.createElement('span');\n message.textContent += i > 0 ? ' ' : '';\n message.textContent += curr.messageText ? `${curr.messageText} ` : '';\n structure.container.appendChild(message);\n\n const action = document.createElement('span');\n action.className = 'pause-resume-action';\n action.textContent = curr.actionText || '';\n action.onclick = curr.actionHandler || undefined;\n structure.container.appendChild(action);\n }\n structure.container.style.display = 'block';\n }\n\n function _createStructure() {\n const overlay = document.createElement('div');\n overlay.className = 'pause-resume-overlay';\n document.body.appendChild(overlay);\n\n const messageContainer = document.createElement('div');\n messageContainer.className = 'agent-panel';\n messageContainer.style.display = 'none';\n element[0].appendChild(messageContainer);\n\n return {\n overlay,\n container: messageContainer\n };\n }\n }\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n class ScrollToTopWhen {\n\n constructor(\n private $scope: ng.IScope,\n private $timeout: any,\n private broker: any)\n {\n }\n\n init (element : ng.IAugmentedJQuery, eventName : string) {\n this.broker.subscribe('ScrollToTopWhen', eventName, e => {\n this.$timeout(function() {\n angular.element(element)[0].scrollTop = 0;\n }, 100);\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('ScrollToTopWhen');\n });\n }\n\n }\n\n angular\n .module('core')\n .directive('scrollToTopWhen', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'A',\n controller: ScrollToTopWhen,\n controllerAs: 'sttw',\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : ScrollToTopWhen) {\n controller.init(el, attr['scrollToTopWhen']);\n }\n };\n\n });\n\n}\n","namespace Core {\n\n export interface NetValues {\n SupplierNetRate:number|string;\n SupplierCurrency?:string;\n SupplierGrossRate?:number|string;\n SupplierBindingPrice?:number|string;\n CommissionAmount:any;\n CommissionPercentage:number|string;\n CommissionCurrency?:string;\n Tax:number;\n TaxCommissionAmount:any;\n TaxCommissionPercentage:number|string;\n TotalGross:number;\n TotalGrossCurrency?:string;\n ExchangeRate?:number;\n ExchangeRateTotal?:number;\n ExchangeCurrency?:string;\n Markups?:CalculationItem[];\n Promotions?:CalculationItem[];\n PriceAdjustments?:CalculationItem[];\n CommissionType:string;\n OutputVat?:number;\n OutputVatCurrency?:string;\n }\n\n interface Fare {\n Amount:number;\n Currency:number;\n }\n\n interface FlightData {\n AdultNetFare:Fare;\n AdultTax:Fare;\n Legs:any;\n }\n\n interface CostTypes {\n AdultReturn:string;\n AdultTaxAirlineFees:string;\n }\n\n interface CalculationItem {\n Markup?:Markup;\n Change?:Money;\n Cost:Money;\n PercentChange?:number;\n ExchangeRate?:number;\n Type:number;\n CommissionPercent?:number;\n Cancelled?:boolean;\n MarkdownAmount:number;\n }\n\n interface Money {\n CurrencyCode:string;\n Value:number|string;\n }\n\n interface Markup {\n MarkupId?:number;\n SupplierId?:number;\n MarkupAmount?:number;\n MarkupPercent?:number;\n CommissionAmount?:number;\n CommissionPercent?:number;\n AdditionalInfo:string;\n Priority:number;\n EstabGroupName?:string;\n SupplierName?:string;\n DomainName?:string;\n DepartureStartDate?:string;\n DepartureEndDate?:string;\n }\n\n interface Commission {\n Amount:number;\n Percent:number;\n CommissionType:string;\n }\n\n class AgentNetInfoService {\n\n costTypes:CostTypes = {\n AdultReturn: 'AdultReturnTicket',\n AdultTaxAirlineFees: 'AdultTaxandAirlineFees'\n };\n\n commissionTypes = {\n Commission : 'Commission',\n Markup: 'Markup'\n };\n\n calculationItemTypes = {\n ExchangeRate: 4,\n ClientExchangeRate: 11,\n Commission: 2,\n Rounding: 12,\n Markup:7,\n SupplierNetRate: 1,\n SupplierGrossRate: 5,\n SupplierBindingPrice: 3,\n Vat: 0,\n PriceAdjustment: 15,\n Promotion: 16,\n Markdown:99\n };\n\n modes = {\n Hotel : 'hotel',\n Flight: 'flight',\n Markup: 'markup',\n HotelInfo: 'hotelinfo'\n };\n\n requiredProps = {\n hotel : ['Type'],\n flight: ['AdultNetFare.Amount'],\n markup: ['Type'],\n hotelinfo: ['AgentToolTip.SupplierNetRate',\n 'AgentToolTip.CommissionPercentage',\n 'AgentToolTip.TotalCommission', 'Cost']\n };\n\n constructor() {}\n\n parse(data, mode) {\n switch(mode){\n case this.modes.Hotel:\n return this._parseHotelData(data);\n case this.modes.Flight:\n return this._parseFlightData(data);\n case this.modes.Markup:\n return this._parseMarkupData(data);\n case this.modes.HotelInfo:\n return this._parseHotelInfo(data);\n default:\n return this._getDefaultValues();\n\n }\n }\n\n hasRequiredValues(data, mode) {\n switch(mode){\n case this.modes.Hotel:\n case this.modes.Flight:\n case this.modes.Markup:\n return this._validate(data, this.requiredProps[mode.toLowerCase()]);\n case this.modes.HotelInfo:\n return this._validate(data, this.requiredProps[mode.toLowerCase()], true);\n default:\n return false;\n\n }\n }\n\n private _getDefaultValues():NetValues {\n return {\n SupplierNetRate:0, CommissionAmount:0, CommissionPercentage:0, Tax:0,\n TaxCommissionAmount:0, TaxCommissionPercentage:0, TotalGross:0,\n CommissionType: this.commissionTypes.Commission\n };\n }\n\n private _validate(data,props,showNegativeValues = false):boolean {\n let valid = false;\n if(_.isArray(data)){\n valid = data.every(item =>{\n return props.every(prop => {\n return _.has(item, prop);\n });\n });\n } else {\n valid = props.every(prop => {\n const hasProp = _.has(data, prop);\n if (!showNegativeValues) {\n return hasProp && _.get(data, prop, 0) > 0;\n }\n return hasProp;\n });\n }\n return valid;\n }\n\n private _parseHotelData( data:CalculationItem[] ):NetValues {\n const netValues:NetValues = this._getDefaultValues();\n\n //Commission\n const commission = data.find(item => {\n return item.Type === this.calculationItemTypes.Commission;\n });\n\n netValues.CommissionPercentage = this._calculateValue(commission,'CommissionPercent');\n netValues.CommissionAmount = this._calculateValue(commission,'Cost.Value');\n netValues.CommissionCurrency = this._getCurrencyCode(commission);\n // Commission changes\n const commissionChanges = data.filter(item => {\n return item.Type === this.calculationItemTypes.Markup\n && item.PercentChange && item.Cancelled === false;\n });\n if(commissionChanges && commissionChanges.length > 0){\n const firstChange = commissionChanges.find(change => {\n return change.Cost.CurrencyCode !== '';\n });\n netValues.CommissionCurrency = this._getCurrencyCode(firstChange);\n }\n const commissionChangeTotal = commissionChanges.reduce((total, value)=> {\n return total + (value.PercentChange || 0);\n }, netValues.CommissionPercentage);\n\n netValues.CommissionPercentage += (commissionChanges && commissionChanges.length > 0)\n ? commissionChangeTotal : 0;\n\n //SupplierNetRate\n const supplierPrefs = [\n this.calculationItemTypes.ExchangeRate,\n this.calculationItemTypes.SupplierNetRate,\n this.calculationItemTypes.SupplierGrossRate\n ];\n\n let supplierRate;\n for (var index = 0; index < supplierPrefs.length; index++) {\n var supplierPref = supplierPrefs[index];\n supplierRate = data.find(item => {\n return item.Type === supplierPref;\n });\n if(supplierRate) {\n break;\n }\n }\n let supplierRateValue:number = this._calculateValue(supplierRate,'Cost.Value');\n netValues.SupplierNetRate = supplierRateValue - (supplierRate && supplierRate.Type\n === this.calculationItemTypes.SupplierNetRate\n ? 0 : netValues.CommissionAmount );\n netValues.SupplierCurrency = this._getCurrencyCode(supplierRate);\n\n //commission adjustments\n if (netValues.CommissionPercentage > 0 && netValues.CommissionAmount === 0) {\n netValues.CommissionAmount = this._calculatePercentageAmount(\n netValues.SupplierNetRate,\n netValues.CommissionPercentage\n );\n };\n\n // Total gross ( rounded up)\n const totalGross = data.find(item => {\n return item.Type === this.calculationItemTypes.Rounding;\n });\n\n const totalGrossValue = this._calculateValue(totalGross, 'Cost.Value');\n netValues.TotalGross = Math.ceil(totalGrossValue);\n\n //client exchange rate\n const clientExchange = data.find(item => {\n return item.Type === this.calculationItemTypes.ClientExchangeRate;\n });\n\n const exchangeRate = this._calculateValue(clientExchange,'ExchangeRate');\n const exchangedGross = ( exchangeRate > 0 )\n ? netValues.TotalGross / exchangeRate\n : netValues.TotalGross;\n\n //exchanged commission adjustments\n netValues.CommissionAmount = exchangedGross - netValues.SupplierNetRate;\n if(exchangeRate>0) {\n netValues.CommissionAmount *= exchangeRate;\n };\n\n //remove any markdown value from commission amount\n const markdown = data.find(item => {\n return item.Type === this.calculationItemTypes.Markdown;\n });\n const markdownValue = this._calculateValue(markdown, 'MarkdownAmount');\n netValues.CommissionAmount -= markdownValue;\n\n netValues.CommissionPercentage = (netValues.CommissionAmount / netValues.TotalGross) * 100;\n netValues.TotalGrossCurrency = this._getCurrencyCode(totalGross);\n netValues.CommissionCurrency = netValues.TotalGrossCurrency;\n\n //VAT\n const outputVat = data.find(item => {\n return item.Type === this.calculationItemTypes.Vat;\n });\n netValues.OutputVat = this._calculateValue(outputVat, 'Cost.Value');\n netValues.OutputVatCurrency = netValues.TotalGrossCurrency || this._getCurrencyCode(outputVat);\n\n return this._formatAsDecimals(netValues);\n }\n\n private _parseHotelInfo(data) {\n const netValues: NetValues = this._getDefaultValues();\n\n const currency = data.AgentToolTip.CurrencyCode || TRPCONFIG.Domain.CurrencyCode;\n netValues.SupplierNetRate = data.AgentToolTip.SupplierNetRate || 0;\n netValues.SupplierCurrency = this._getCurrencyCode(data.AgentToolTip.SupplierNetRate, currency);\n netValues.CommissionAmount = data.AgentToolTip.TotalCommission || 0;\n netValues.CommissionPercentage = data.AgentToolTip.CommissionPercentage || 0;\n netValues.CommissionCurrency = this._getCurrencyCode(data.AgentToolTip.TotalCommission, currency);\n netValues.TotalGross = data.Cost || 0;\n netValues.TotalGrossCurrency = this._getCurrencyCode(data.Cost, currency);\n netValues.OutputVat = data.OutputVat || 0;\n netValues.OutputVatCurrency = netValues.TotalGrossCurrency ||\n this._getCurrencyCode(data.OutputVat, currency);\n\n return this._formatAsDecimals(netValues);\n }\n\n private _parseFlightData( data:FlightData ):NetValues {\n let netValues:NetValues = this._getDefaultValues();\n\n netValues.SupplierNetRate = this._calculateValue(data,'AdultNetFare.Amount');\n\n const commissionMarkup:Markup = this._getMarkup(data,this.costTypes.AdultReturn);\n const commission = this._calculateCommission(commissionMarkup, netValues.SupplierNetRate);\n netValues.CommissionAmount = commission.Amount;\n netValues.CommissionPercentage = Math.floor(commission.Percent);\n netValues.CommissionType = commission.CommissionType;\n\n if( netValues.CommissionType === this.commissionTypes.Commission ) {\n netValues.SupplierNetRate -= netValues.CommissionAmount;\n }\n\n netValues.Tax = this._calculateValue(data,'AdultNetTax.Amount');\n\n const taxMarkup:Markup = this._getMarkup(data,this.costTypes.AdultTaxAirlineFees);\n const taxcommission = this._calculateCommission(taxMarkup, netValues.Tax);\n netValues.TaxCommissionAmount = taxcommission.Amount;\n netValues.TaxCommissionPercentage = Math.floor(taxcommission.Percent);\n\n netValues.CommissionType = taxcommission.CommissionType;\n if( netValues.CommissionType === this.commissionTypes.Commission ) {\n netValues.Tax -= netValues.TaxCommissionAmount;\n }\n netValues.TotalGross = Math.ceil(\n netValues.SupplierNetRate\n + netValues.CommissionAmount\n + netValues.Tax\n + netValues.TaxCommissionAmount\n );\n\n return this._formatAsDecimals(netValues);\n }\n\n private _parseMarkupData( data:CalculationItem[] ):NetValues {\n let netValues:NetValues = this._getDefaultValues();\n\n const commission = data.find(item => {\n return item.Type === this.calculationItemTypes.Commission;\n });\n\n netValues.CommissionPercentage = this._calculateValue(commission,'CommissionPercent');\n netValues.CommissionAmount = this._calculateValue(commission,'Cost.Value');\n netValues.CommissionCurrency = this._getCurrencyCode(commission);\n\n let supplierNetRate = data.find((item:CalculationItem) =>{\n return item.Type === this.calculationItemTypes.SupplierNetRate;\n });\n\n netValues.SupplierNetRate = this._calculateValue(supplierNetRate,'Cost.Value');\n\n let supplierGrossRate = data.find((item:CalculationItem) =>{\n return item.Type === this.calculationItemTypes.SupplierGrossRate;\n });\n\n let supplierBindingPrice = data.find((item:CalculationItem) =>{\n return item.Type === this.calculationItemTypes.SupplierBindingPrice;\n });\n netValues.SupplierNetRate = this._calculateValue(supplierNetRate,'Cost.Value');\n netValues.SupplierGrossRate = this._calculateValue(supplierGrossRate,'Cost.Value');\n netValues.SupplierBindingPrice = this._calculateValue(supplierBindingPrice,'Cost.Value');\n const activeRate = (supplierNetRate || supplierGrossRate || supplierBindingPrice);\n netValues.SupplierCurrency = this._getCurrencyCode(activeRate);\n\n const exchangeRate = data.find((item:CalculationItem) => {\n return item.Type === this.calculationItemTypes.ExchangeRate;\n });\n\n netValues.ExchangeRate = ( exchangeRate && exchangeRate.ExchangeRate ) || 0;\n netValues.ExchangeRateTotal = this._calculateValue(exchangeRate,'Cost.Value');\n netValues.ExchangeCurrency = this._getCurrencyCode(exchangeRate);\n\n netValues.Markups = data.filter((item:CalculationItem) => {\n return item.Type === this.calculationItemTypes.Markup;\n }) || [];\n\n netValues.Markups = netValues.Markups.map(markup => {\n if (markup.Markup){\n if (markup.Markup.DepartureStartDate && markup.Markup.DepartureStartDate === '0001-01-01T00:00:00')\n { markup.Markup.DepartureStartDate = ''; }\n if (markup.Markup.DepartureEndDate && markup.Markup.DepartureEndDate === '0001-01-01T00:00:00')\n { markup.Markup.DepartureEndDate = ''; }\n }\n return markup;\n });\n\n netValues.Promotions = data.filter((item:CalculationItem) => {\n return item.Type === this.calculationItemTypes.Promotion;\n });\n\n netValues.PriceAdjustments = data.filter((item:CalculationItem) => {\n return item.Type === this.calculationItemTypes.PriceAdjustment;\n });\n\n const totalGross = data.find((item:CalculationItem) => {\n return item.Type === this.calculationItemTypes.Rounding;\n });\n\n netValues.TotalGross = this._calculateValue(totalGross, 'Cost.Value');\n netValues.TotalGrossCurrency = this._getCurrencyCode(totalGross);\n\n const outputVat = data.find(item => {\n return item.Type === this.calculationItemTypes.Vat;\n });\n netValues.OutputVat = this._calculateValue(outputVat, 'Cost.Value');\n netValues.OutputVatCurrency = this._getCurrencyCode(outputVat);\n\n return this._formatAsDecimals(netValues);\n }\n\n private _calculatePercentageAmount(value, percentage) {\n return ((value)/100) * percentage;\n }\n\n private _getMarkup(data, costType):Markup {\n let markup:Markup = { AdditionalInfo :'', CommissionAmount: 0, CommissionPercent: 0,\n MarkupAmount: 0, MarkupPercent: 0, Priority: 0 };\n\n if(!data || !costType) { return markup; };\n\n if(data.Legs && data.Legs.length) {\n const leg = data.Legs[0];\n if(leg.MarkupsApplied && leg.MarkupsApplied.length) {\n markup = leg.MarkupsApplied.find((item:Markup) => {\n return new RegExp(costType,'g').test(item.AdditionalInfo);\n });\n }\n }\n return markup;\n }\n\n private _calculateCommission(data:Markup, rate:number):Commission {\n let amount = 0;\n let percent = 0;\n let commissionType = this.commissionTypes.Commission;\n\n if(data && rate) {\n const commissionPercentage = data.CommissionPercent || 0;\n let commissionAmount = data.CommissionAmount || 0;\n const markupPercentage = data.MarkupPercent || 0;\n let markupAmount = data.MarkupAmount || 0;\n if ( markupPercentage > 0 || markupAmount > 0) {\n commissionType = this.commissionTypes.Markup;\n if( markupAmount === 0 && markupPercentage > 0 ) {\n markupAmount = this._calculatePercentageAmount(rate, markupPercentage);\n }\n amount = markupAmount;\n percent = markupPercentage;\n } else {\n if( commissionAmount === 0 && commissionPercentage > 0 ) {\n commissionAmount = this._calculatePercentageAmount(rate, commissionPercentage);\n }\n amount = commissionAmount;\n percent = commissionPercentage;\n }\n }\n\n return { Amount : amount, Percent: percent, CommissionType : commissionType };\n }\n\n private _calculateValue(data ,type, defaultValue:number = 0) {\n if(data && type) {\n return _.get(data, type, defaultValue);\n }\n\n return defaultValue;\n }\n\n private _getCurrencyCode(data, defaultValue:string = TRPCONFIG.Domain.CurrencyCode) {\n if(data) {\n return _.get(data, 'Cost.CurrencyCode', defaultValue);\n }\n\n return defaultValue;\n }\n\n private _formatAsDecimals(value) {\n return _.mapValues(value, item => {\n return (!Number.isInteger(item) && item > 0 ) ? item.toFixed(2) : item;\n });\n }\n\n private _toNearest10(value) {\n return Math.ceil(value/10) * 10;\n }\n }\n\n angular\n .module('core')\n .service('agentNetInfoService', AgentNetInfoService);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .factory('crossSellService', crossSellService);\n\nfunction crossSellService(analytics,\n crossSellCommonService,\n enumService,\n imageService,\n flightExtrasService,\n $q) {\n const crossSellKeyByProductType = {\n 1: 'Flight',\n 2: 'Attractions',\n 4: 'CarHire',\n 8: 'Hotels',\n 16: 'Parking',\n 32: 'Transfer'\n };\n\n const maxCrossSell = 4;\n const maxSameType = 2;\n\n const service = {\n getBookingCrossSell,\n getTripCrossSell,\n getCrossSellProbability,\n startCrossSellJourney,\n addExtrasAndCrossSells\n };\n\n function getBookingCrossSell(bookingId) {\n return crossSellCommonService.getBookingCrossSell(bookingId).then(processData);\n }\n\n function addExtrasAndCrossSells(tr) {\n let crossSells = [];\n let addBaggage = [];\n getTripCrossSell(tr, true).then(cs => {\n crossSells = cs || [];\n updateTripWithCrossSells();\n });\n getExtras(tr).then(ab => {\n addBaggage = ab || [];\n updateTripWithCrossSells();\n });\n\n function updateTripWithCrossSells() {\n tr.crossSellProducts = _mergeExtrasAndCrossSells(addBaggage, crossSells);\n }\n }\n\n function getTripCrossSell(tr) {\n return crossSellCommonService.getTripCrossSell(tr, service.getBookingCrossSell);\n }\n\n function getExtras(tr) {\n const flightBookingType = 1;\n const flightBooking = _.find(tr.Bookings, b => b.Type === flightBookingType);\n return TRPCONFIG.Domain.DashboardAddBagsEnabled && flightBooking\n ? flightExtrasService.getExtrasCrossSell(flightBooking.BookingId)\n : $q.when([]);\n }\n\n function _mergeExtrasAndCrossSells(extras, crossSells) {\n const crossSellToReplace = crossSells.length + extras.length - maxCrossSell;\n if (crossSellToReplace > 0) {\n _.remove(crossSells, cs =>\n cs.Priority >= crossSells.length - crossSellToReplace);\n }\n _.each(crossSells, cs => { cs.Priority += extras.length; });\n return extras.concat(crossSells);\n }\n\n function processData(result) {\n if (!result) {\n return [];\n }\n const crossSells = result.data;\n return filterCrossSellByPriority(crossSells).map(cs =>\n _.extend(cs, { roundedCurrency: true }));\n }\n\n function startCrossSellJourney(bookingId, crossSellProduct) {\n crossSellCommonService.startCrossSellJourney(bookingId, crossSellProduct);\n }\n\n function getCrossSellImage(product) {\n switch (product.ProductType) {\n case enumService.ProductType.Hotel:\n return imageService.getMainImageUrl(product.EstabId, 400, 140, true);\n case enumService.ProductType.Transfer:\n return '/build/img/assets/product/transfers.jpg';\n case enumService.ProductType.CarHire:\n return '/build/img/assets/car_hire.jpg';\n case enumService.ProductType.Parking:\n return '/build/img/assets/car_parking.jpg';\n case enumService.ProductType.Attraction:\n return `/attractions/Handlers/crosssellimage.ashx?acsid=${product.Id}`;\n default:\n return '';\n }\n }\n\n function addProperties(productType, product, type) {\n const productToDisplay = _.merge(_.omit(productType, 'CrossSells'), product);\n _.assignIn(productToDisplay, type);\n productToDisplay.Image = getCrossSellImage(productToDisplay);\n productToDisplay.Price = productToDisplay.AdultPrice || productToDisplay.Price;\n productToDisplay.Title = productToDisplay.Title || productToDisplay.Description || productToDisplay.CarPark;\n return productToDisplay;\n }\n\n function getCrossSellProbability(basketId, productTypes) {\n return crossSellCommonService.getBasketCrossSell(basketId).then(function(data) {\n const result = {};\n _.forEach(data, function(i) {\n if (productTypes.indexOf(i.Product) !== -1) {\n result[i.Product] = i.Probability;\n }\n });\n\n analytics.track('Event', 'BasketCrossSell', { BasketId: basketId, ProductProbability: result });\n analytics.track('mixpanel', 'BasketCrossSell', {\n ProductProbabilityCarHire: result[enumService.ProductType.CarHire],\n ProductProbabilityTransfer: result[enumService.ProductType.Transfer]\n });\n\n return result !== {} ? result : null;\n });\n }\n\n function filterCrossSellByPriority(crossSell) {\n const filteredCrossSell = {};\n const simplifiedCrossSellList = [];\n let counter = 0;\n if (crossSell.Priorities.length > 0) {\n const priorities = _.sortBy(crossSell.Priorities, p => p.Order);\n _.times(maxCrossSell, c => {\n if (counter >= priorities.length) {\n counter = 0;\n }\n const key = crossSellKeyByProductType[priorities[counter].Type];\n if (!filteredCrossSell[key]) {\n filteredCrossSell[key] = [];\n }\n if (filteredCrossSell[key].length < maxSameType) {\n let cs = crossSell[key].CrossSells[filteredCrossSell[key].length];\n if (cs) {\n cs.Priority = c;\n cs = addProperties(crossSell[key], cs, crossSellCommonService.productTypeProperties[key]);\n filteredCrossSell[key].push(cs);\n }\n }\n counter++;\n });\n _.each(priorities, p => simplifiedCrossSellList.push(...filteredCrossSell[crossSellKeyByProductType[p.Type]]));\n }\n return simplifiedCrossSellList;\n }\n\n\n return service;\n}\n})();\n","'use strict';\nnamespace Core {\n\n export class PostBookingLookup {\n\n constructor(private $location: ng.ILocationService, private authService) {\n }\n\n redirect(): void {\n if (TRPCONFIG.Domain.DashboardBookingEnabled) {\n let bookingId = this.authService.getSignedInBookingId();\n if(bookingId) {\n this.$location.path('dashboard/booking-details/' + bookingId);\n }\n return;\n }\n document.location.href = '/manage-your-booking/options.aspx';\n }\n\n }\n\n angular\n .module('core')\n .service('postBookingLookup', PostBookingLookup);\n\n}\n","namespace Dashboard {\n\n export class BookingActionLink {\n private desktopUrl: string = 'desktop-url/{{BookingRef}}/{{BookingId}}/{{LeadPassengerLastName}}';\n private actionLinks: any = {\n 'VIEWBOOKINGDETAILS': 'dashboard/booking-details/{{::BookingId}}',\n 'CHANGECONTACTDETAILS': 'dashboard/contact-detail/{{::BookingId}}',\n 'CANCELBOOKINGS': TRPCONFIG.Domain.CreateCSRToCancelBooking ?\n 'dashboard/create-csr/{{BookingId}}?id=3': this.desktopUrl + '/cancel',\n 'CSR': TRPCONFIG.Domain.DisableFAQs ?\n 'dashboard/create-csr/{{BookingId}}': 'dashboard/csr/{{BookingId}}',\n 'MANAGEPASSENGERDETAILS': this.desktopUrl + '/api',\n 'PRINTVOUCHER': 'document/receipt/{{::BookingId}}',\n 'PRINTRECEIPT': 'document/receipt/{{::BookingId}}',\n 'PAYBALANCE': TRPCONFIG.Domain.PaybalanceV2Enabled ?\n 'dashboard/pay-balance/{{::BookingId}}' : this.desktopUrl + '/payment',\n 'ONLINECHECKIN': 'dashboard/online-checkin/{{BookingId}}',\n 'VOUCHERACTIONS': 'dashboard/resend-voucher/{{BookingId}}',\n 'AMENDBOOKING': TRPCONFIG.Domain.CreateCSRToAmendBooking ?\n 'dashboard/create-csr/{{BookingId}}?id=159' :\n TRPCONFIG.Domain.EnableAmendBookingV2 ?\n 'dashboard/amend-booking/{{BookingRef}}/{{BookingId}}/{{LeadPassengerLastName}}/start' :\n this.desktopUrl + '/amend',\n 'ENTERAPI': TRPCONFIG.Domain.DashboardAddAPIEnabled ?\n 'dashboard/add-api/{{::BookingId}}' : this.desktopUrl + '/api',\n 'ENTERREVIEW': 'review-hotel/{{BookingId}}',\n 'ADDBAGGAGE': 'dashboard/add-baggage/{{::BookingId }}',\n 'ADDSEATS': 'dashboard/seat-selection/{{::BookingId }}',\n 'DERWENTLINK': TRPCONFIG.Domain.DerwentUrl + 'Booking/boBookingDetails.aspx?BookingId={{BookingId}}',\n 'PRINTINVOICE': 'document/invoice/{{::BookingId}}'\n };\n public get() {\n return angular.copy(this.actionLinks);\n }\n }\n\n angular\n .module('dashboard')\n .service('bookingActionLink', BookingActionLink);\n\n}\n","'use strict';\nnamespace Dashboard {\n\n angular\n .module('dashboard')\n .constant('dashboardEnabledConfig', 'DashboardBookingEnabled')\n .constant('dashboardDisabledReferenceUrl', '/manage-your-booking/options.aspx')\n .constant('dashboardDisabledUrl', '/account/bookings.aspx');\n\n}\n","namespace Dashboard {\n\n export class NotificationLink {\n private desktopUrl: string = 'desktop-url/{{SiteId}}/{{BookingId}}/{{LastName}}';\n private notificationLinks: any = {\n 1: '/dashboard/csr/{{::BookingId}}',\n 2: '/dashboard/csr/{{::BookingId}}',\n 3: '/dashboard/pay-balance/{{::BookingId}}',\n 4: this.desktopUrl + '/api',\n 6: 'review-hotel/{{::BookingId}}'\n //0,5,6,7,8,9 type of notifications are there.. need link for them\n };\n public get() {\n return angular.copy(this.notificationLinks);\n }\n }\n\n angular\n .module('dashboard')\n .service('notificationLink', NotificationLink);\n\n}\n","'use strict';\nnamespace Dashboard {\n\n export interface IRedirectParams {\n CSRID?: string;\n NAV: string;\n SID: string;\n BID: string;\n SN: string;\n trackingTag?: string;\n categoryId?: string;\n }\n\n export class V1Redirection {\n\n constructor(private $http,\n private $window,\n private $location,\n private dashboardBookingService) {\n }\n\n v1Redirect(routeParams: IRedirectParams): void {\n var url;\n switch (routeParams.NAV) {\n case 'contactdetails':\n url = 'change-your-contact-details.aspx';\n break;\n case 'cancel':\n url = 'cancel-your-booking.aspx';\n break;\n case 'api':\n url = 'submit-your-passenger-information.aspx';\n break;\n case 'printvoucher':\n url = 'view-booking-receipt.aspx';\n break;\n case 'payment':\n url = 'make-a-payment.aspx';\n break;\n case 'newrequest':\n url = 'raise-a-customer-service-request.aspx';\n break;\n case 'viewrequest':\n url = 'customer-service-request-details.aspx?Id=' + routeParams.CSRID;\n break;\n case 'amend':\n // tslint:disable-next-line\n url = 'amend-your-booking.aspx?';\n if (routeParams.trackingTag) {\n url += `trackingTag=${routeParams.trackingTag}&`;\n }\n if (routeParams.categoryId) {\n url += `categoryId=${routeParams.categoryId}&`;\n }\n break;\n case 'review':\n url = '/Client/clClientFeedBack.aspx?bid={0}&emailLink=0';\n break;\n case 'options':\n url = 'options.aspx';\n break;\n }\n\n this._loadBooking(routeParams, url);\n\n }\n\n private _loadBooking(routeParams: IRedirectParams, url) {\n var mybPath = '/manage-your-booking/';\n var data = {\n bookingId: routeParams.BID,\n siteId: routeParams.SID,\n surname: routeParams.SN,\n type: (routeParams.NAV === 'review')?2:1\n };\n\n const loadV1 = () => {\n return this.$http.get('/Include/Handlers/UserAccount.ashx?' + $.param(data)).then((result) => {\n if (result.data.success === true) {\n if (data.type === 2) {\n url = String.format(url, result.data.secureId);\n this.$window.location = url;\n location.replace(url);\n } else {\n this.$window.location = mybPath + url;\n location.replace(mybPath + url);\n }\n\n }\n });\n };\n\n if (TRPCONFIG.Domain.AccountsEnabled && _.includes(['amend', 'cancel'], routeParams.NAV)) {\n return this.dashboardBookingService.getBookingDetail(routeParams.BID).then(details =>\n details && details.PackageId\n ? this.$location.path(`dashboard/csr/${data.bookingId}`).search({\n id: routeParams.NAV === 'amend' ? '129' : '3'\n })\n : loadV1()\n );\n }\n\n return loadV1();\n }\n\n }\n\n angular\n .module('dashboard')\n .service('v1Redirection', V1Redirection);\n\n}\n","namespace TR {\n\n 'use strict';\n\n class HolidayDealsPromo {\n\n summary: any;\n blocks: any;\n flags: any;\n\n constructor(\n private $location: ng.ILocationService,\n private $scope: any,\n private $rootScope: any,\n private filtering: any,\n private analytics: any,\n private broker: Core.Broker,\n private holidayDeals: any,\n private holidayDealsPromoService: any,\n private resourceService: Core.ResourceService\n ) {\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGDEALS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-holidayDealsResults'\n });\n\n this.$rootScope.hideFooterToolbar = true;\n this.analytics.track('mixpanel', 'HolidayDealsInsLanding');\n this.holidayDealsPromoService.getInfoPromo().then(info => {\n this.summary = info.summary;\n this.blocks = info.blocks;\n this.$scope.$emit('unblock');\n });\n\n this.flags = {\n searchUnit: true,\n clicks: 0\n };\n\n this.broker.subscribe('holidayDealsPromoController', 'PROMO_OVERLAY', ({ data }) => {\n this.flags.clicks = this.flags.clicks + 1;\n this.flags.holidayType = data.group === 'type' ? data.type : this.flags.holidayType;\n this.flags.budget = data.group === 'budget' ? data.type : this.flags.budget;\n });\n\n this.broker.subscribe('holidayDealsPromoController', 'REFRESHSEARCH', () => {\n this.holidayDealsPromoService.getInfoPromo().then(info => {\n this.summary = info.summary;\n this.blocks = info.blocks;\n });\n });\n\n $scope.$on('$destroy', () => {\n this.broker.unsubscribe('holidayDealsPromoController', 'PROMO_OVERLAY');\n this.broker.unsubscribe('holidayDealsPromoController', 'REFRESHSEARCH');\n });\n }\n\n toggleSearchUnit() {\n this.flags.searchUnit = !this.flags.searchUnit;\n }\n\n goToDeals() {\n this.broker.unsubscribe('holidayDealsPromoController', 'PROMO_OVERLAY');\n this.broker.unsubscribe('holidayDealsPromoController', 'REFRESHSEARCH');\n this.$scope.$emit('block', {\n title: this.resourceService.get('SEARCHINGDEALS'),\n subtitle: this.resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-holidayDealsResults'\n });\n const params = this.$location.search();\n this.analytics.track('mixpanel', 'HolidayInspSelected', {\n Budget: this.flags.budget,\n Type: this.flags.holidayType,\n Clicks: this.flags.clicks\n });\n this.$location.search('flex', 15);\n this.$location.path('/holidaydeals');\n }\n }\n\n angular\n .module('TR')\n .controller('HolidayDealsPromo', HolidayDealsPromo);\n}\n","namespace TR {\n function Loading (\n $scope: any,\n $timeout: ng.ITimeoutService,\n resourceService: Core.ResourceService\n )\n {\n $timeout(() => {\n $scope.$emit('block', {\n title: resourceService.get('LOADINGRECOMMENDEDESTAB'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'hotels-hotelSearchCtrl-isHolidayFalse'\n });\n });\n }\n\n angular\n .module('TR')\n .controller('Loading', Loading);\n}\n\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('acceptanceText', function(insuranceService) {\n const domain = TRPCONFIG.Domain;\n return {\n restrict: 'A',\n link(scope, el) {\n scope.$watch('cm.booking.AcceptanceText', function() {\n if (scope.cm.booking == null) {\n return;\n }\n\n //various bad things happening here, all because the acceptance text is coming from the server in one block\n if (scope.cm.insurance) {\n const docPaths = insuranceService.getDocumentPaths();\n $('a.showInsuranceTerms', el).attr('href', docPaths.PolicyWording).attr('target', '_blank');\n $('a.showStatusDisclosure', el).attr('href', docPaths.Disclosure).attr('target', '_blank');\n $('a.insuranceProductInformation', el).attr('href', docPaths.InsuranceProductInformation).attr('target', '_blank');\n } else {\n $('a.showInsuranceTerms', el).parent().hide();\n }\n\n function attachLightbox(e, url, content) {\n e.preventDefault();\n scope.cm.selectedImportantInfo = url;\n scope.cm.showImportantInfo = true;\n scope.cm.importantInfoContent = content || '';\n scope.$apply();\n }\n\n $('a.agencyTerms', el).bind('click', function(e) {\n attachLightbox(e, 'partials/popups/agencyterms');\n });\n\n const route = [domain.CultureCode, scope.cm.booking.BookingProcessId, scope.cm.booking.TermsData.Suppliers.join('|'), (scope.cm.booking.TermsData.TransferRateId || '')].join('/');\n\n // Supplier Terms\n let sup = '';\n angular.forEach(scope.cm.booking.TermsData.Suppliers, function(s) {\n sup += `&suppliers=${s}`;\n });\n\n const termsUrl = String.format('partials/terms/provider?cultureCode={0}&bookingProcessId={1}{2}&transferRateId={3}',\n domain.CultureCode,\n scope.cm.booking.BookingProcessId,\n sup,\n scope.cm.booking.TermsData.TransferRateId || '');\n\n $('a.bookingTerms', el).attr('href', route).attr('target', '_blank');\n\n $('a.bookingTerms', el).bind('click', function(e) {\n attachLightbox(e, termsUrl);\n });\n\n\n if (scope.cm.flight) {\n $('a.showFareRules', el).bind('click', function(e) {\n const fareRulesText = _.get(scope.cm.flight, 'Details.SupplierFareRules', '');\n attachLightbox(e, 'partials/popups/farerules', fareRulesText);\n });\n }\n });\n }\n };\n });\n})();\n","(function() {\n'use strict';\n\nangular.module('TR')\n .directive('accordionDirective', function() {\n return {\n scope: true,\n link($scope) {\n $scope.accordion = { show: false };\n }\n };\n });\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('agentAutofill', AgentAutofill);\n\nfunction AgentAutofill(agentModeService, resourceService) {\n return {\n restrict: 'E',\n require: '?ngModel',\n scope: {\n booking: '='\n },\n templateUrl: (element, attr) => {\n if (attr.templateVersion) {\n return `partials/booking/template?name=Agent/AgentAutofillDirective&version=${attr.templateVersion}`;\n }\n return 'partials/home/directivetemplate?type=AgentAutofillDirective';\n },\n link: linker\n };\n\n function linker(scope) {\n scope.lookup = lookup;\n\n function lookup(bookingId) {\n scope.errorMessage = undefined;\n agentModeService.getBookingContact(bookingId)\n .then(fillInformations, handleErrors);\n }\n\n function fillInformations(bookingInfo) {\n if (TRPCONFIG.Domain.AutofillBasicContactInfo) {\n //agent mode for dnata agents needs only the following keys to be auto populated\n const basicInfoKeys = ['Title', 'FirstName', 'LastName', 'CountryCode'];\n fillBasicInformations(bookingInfo, basicInfoKeys);\n return;\n }\n fillBasicInformations(bookingInfo, Object.keys(scope.booking));\n }\n\n function fillBasicInformations(bookingInfo, keys) {\n keys.forEach(function(key) {\n if (bookingInfo[key]) {\n scope.booking[key] = bookingInfo[key];\n }\n });\n }\n\n function handleErrors(res) {\n switch (res.status) {\n case 400:\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDINVALID');\n break;\n case 404:\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDNOTFOUND');\n break;\n default:\n scope.errorMessage = resourceService.get('AGENTBOOKINGIDERROR');\n break;\n }\n }\n }\n}\n})();\n","namespace TR {\n class BoardTypeFilter {\n\n model: any;\n aggregate: any;\n limit: any;\n showAll: boolean;\n titles: any;\n boardArr: any;\n people: any;\n\n constructor(\n $scope: ng.IScope,\n resourceService: Core.ResourceService,\n occupancyService: Core.OccupancyService\n ) {\n const titles = {\n 1: resourceService.get('ROOMONLY'),\n 2: resourceService.get('BEDANDBREAKFAST'),\n 3: resourceService.get('HALFBOARD'),\n 4: resourceService.get('FULLBOARD'),\n 5: resourceService.get('ALLINCLUSIVE'),\n 6: resourceService.get('SELFCATERING')\n };\n\n $scope.$watch('bt.aggregate', agg => {\n if (!agg) { return; }\n let boardArr:any = [];\n for (let key in agg) {\n boardArr.push(_.extend(agg[key], { id: key, title: titles[key] }));\n }\n _.set(\n _.minBy(boardArr, (v:any) => v.MinPrice),\n 'cheapest',\n true\n );\n this.boardArr = boardArr;\n this.people = occupancyService.getNumberOfNonInfantPassengers();\n });\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n reset() {\n this.model = [];\n }\n\n more(all: boolean) {\n this.showAll = all;\n }\n\n showMoreLess() {\n return Object.keys(this.aggregate || {}).length > this.limit;\n }\n }\n\n angular\n .module('TR')\n .directive('boardTypeFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=BoardTypeFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n limit: '@',\n priceMode: '='\n },\n controller: BoardTypeFilter,\n controllerAs: 'bt'\n };\n });\n\n class BoardTypeFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{bt.getName(board)}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n titles: any;\n\n constructor($scope: ng.IScope, resourceService: any, analytics: any) {\n this.titles = {\n 1: resourceService.get('ROOMONLY'),\n 2: resourceService.get('BEDANDBREAKFAST'),\n 3: resourceService.get('HALFBOARD'),\n 4: resourceService.get('FULLBOARD'),\n 5: resourceService.get('ALLINCLUSIVE'),\n 6: resourceService.get('SELFCATERING')\n };\n\n $scope.$watch('bt.model', (value: any) => {\n if (!value || !value.length) { return; }\n let boardType = value.map(v => this.getName(v));\n analytics.track(\n 'mixpanel',\n 'HolidayDealsFilterBoardTypes',\n { value: boardType }\n );\n });\n }\n\n getName(board) {\n return this.titles[board];\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n remove(board) {\n this.model = this.model.filter(v => v !== board);\n }\n }\n\n angular\n .module('TR')\n .directive('boardTypeFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: BoardTypeFilterLabel.getTemplate(),\n bindToController: {\n model: '='\n },\n controller: BoardTypeFilterLabel,\n controllerAs: 'bt'\n };\n });\n\n}\n","namespace TR {\n class ChildDestinationFilter {\n\n model: any;\n aggregate: any;\n limit: any;\n showAll: boolean;\n destArray: any;\n people: any;\n\n constructor($scope: ng.IScope,\n occupancyService: Core.OccupancyService) {\n $scope.$watch('cd.aggregate', agg => {\n if (!agg) { return; }\n\n const destArray:any = [];\n for (let key in agg) {\n destArray.push(_.extend(agg[key], { id: key }));\n }\n const min:any = _.minBy(destArray, (v:any) => v.MinPrice);\n if (min) { min.cheapest = true; }\n this.model = _.filter(this.model, d => _.has(agg, d));\n this.destArray = destArray;\n this.people = occupancyService.getNumberOfNonInfantPassengers();\n });\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n reset() {\n this.model = [];\n }\n\n more(all: boolean) {\n this.showAll = all;\n }\n\n showMoreLess() {\n return Object.keys(this.aggregate || {}).length > this.limit;\n }\n }\n\n angular\n .module('TR')\n .directive('childDestinationFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=ChildDestinationFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n limit: '@',\n priceMode: '='\n },\n controller: ChildDestinationFilter,\n controllerAs: 'cd'\n };\n });\n\n class ChildDestinationFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{cd.getName(dest)}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n\n constructor($scope: ng.IScope, analytics: any) {\n $scope.$watch('cd.model', (value: any) => {\n if (!value || !value.length) { return; }\n let destinations = value.map(v => this.getName(v));\n analytics.track(\n 'mixpanel',\n 'HolidayDealsFilterDestinations',\n { value: destinations }\n );\n });\n }\n\n getName(dest) {\n if (!this.aggregate) { return ''; }\n return (this.aggregate[dest] || {}).Title;\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n remove(dest) {\n this.model = this.model.filter(v => v !== dest);\n }\n }\n\n angular\n .module('TR')\n .directive('childDestinationFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: ChildDestinationFilterLabel.getTemplate(),\n bindToController: {\n aggregate: '=',\n model: '='\n },\n controller: ChildDestinationFilterLabel,\n controllerAs: 'cd'\n };\n });\n\n}\n","angular\n .module('TR')\n .directive('chooseDifferentHotel', function (\n $location: ng.ILocationService,\n ) {\n return {\n scope: {\n changeHotel: '&?',\n dest: '=?'\n },\n templateUrl: 'partials/home/directivetemplate?type=ChooseDifferentHotel',\n link: (scope: ng.IScope) => {\n\n scope.handleChangeHotel = () => {\n\n if (scope.changeHotel) {\n scope.changeHotel();\n } else {\n let breadcrumbTrail = _.get(scope, ['dest', 'BreadcrumbTrail'], []);\n $location.url(_.get(_.nth(breadcrumbTrail, -2), 'PagePath', '/'));\n }\n };\n },\n restrict: 'E',\n replace: true,\n };\n });\n","namespace TR {\n type TripService = Core.TripService;\n class ClickTripz {\n constructor(private $routeParams,\n private tripService: TripService,\n private loaderService) {\n if ($routeParams.tripId\n && _.includes(TRPCONFIG.Domain.ClickTripzProviders, $routeParams.source)\n && !window.document.getElementById('click-tripz')) {\n\n tripService.getTripNumberOfNights(0, $routeParams.tripId).then(numberOfNights => {\n if (_.includes(TRPCONFIG.Domain.ClickTripzNumberOfNights, numberOfNights)) {\n loaderService.loadJS(window.document, 'script', 'click-tripz', TRPCONFIG.Domain.ClickTripzURL);\n }\n });\n }\n }\n }\n\n angular\n .module('TR')\n .directive('clickTripz', (): ng.IDirective => {\n return {\n controller: ClickTripz,\n };\n });\n\n}\n","namespace TR {\n class CruiseListing {\n cruise: any;\n\n constructor(private analytics: any) { }\n\n gotToCruise(url) {\n this._trackClick();\n window.open(url);\n }\n\n private _trackClick() {\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsCruiseDetails',\n {\n Title: this.cruise.Title,\n ShipName: this.cruise.ShipName,\n LineName: this.cruise.CruiseLineName\n }\n );\n }\n }\n\n angular\n .module('TR')\n .directive('cruiseListing', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=CruiseListing',\n replace: true,\n bindToController: {\n cruise: '=',\n priceMode: '=',\n },\n controller: CruiseListing,\n controllerAs: 'cl'\n };\n });\n\n}\n","namespace TR {\n\n interface PaymentData {\n minimumDeposit :number;\n products :PaymentProduct[];\n totalBalances :number;\n }\n\n interface PaymentProduct {\n balance :number;\n currentDeposit :number;\n directPayments :DirectPayment[];\n initialDeposit :number;\n productTitle :string;\n productType :number;\n schedule :PaymentSchedule[];\n }\n\n interface DirectPayment {\n amount :number;\n currency :string;\n localAmount :number;\n localCurrency :string;\n }\n\n interface PaymentSchedule {\n amount :number;\n balance :number;\n due :Date;\n }\n\n interface KeyModel {\n conversion :string;\n noConversion :string;\n }\n\n class DirectPaymentInformation {\n\n private keyMap : { [type :number] :KeyModel } = {};\n private hasFootnote :string;\n\n public paymentData :PaymentData;\n public showDirectPayments :boolean;\n\n constructor(private $filter: ng.IFilterService,\n private resourceService: Core.ResourceService,\n private $scope:ng.IScope) {\n\n //decide which resource keys we want to push in to our object based on the footnote scope value\n let m = {\n conversion :'',\n noConversion :''\n };\n\n if (this.hasFootnote === 'true') {\n m.conversion = 'DIRECTPAYMENTTOHOTELCONVERTED';\n m.noConversion = 'DIRECTPAYMENTTOHOTEL';\n } else {\n m.conversion = 'DIRECTPAYMENTTOHOTELCONVERTEDNONOTE';\n m.noConversion = 'DIRECTPAYMENTTOHOTELNONOTE';\n }\n\n this.keyMap[0] = m; //add the keys for hotels to the map\n }\n\n public directPaymentCaveat(product, payment) {\n const res = product.productType === 0 ? 'DIRECTACCOMPAYMENTADVICE' : 'DIRECTFLIGHTPAYMENTADVICE';\n if (payment.localCurrency === payment.currency) {\n return String.format(this.resourceService.get(res),\n this.$filter('customCurrency')(payment.amount, payment.currency));\n }\n return String.format(this.resourceService.get(res),\n `${this.$filter('customCurrency')(payment.localAmount, payment.localCurrency)} \n ${String.format(this.resourceService.get('CUSTOMEREQUIVALENT'),\n this.$filter('customCurrency')(payment.amount, payment.currency))}`);\n }\n\n\n public getText(productType :number, payment :DirectPayment) :string {\n const paymentAmount = this.$filter('customCurrency')(payment.amount, payment.currency);\n const resource = this.keyMap[productType];\n\n if (productType === 0) {\n\n if (payment.localCurrency === payment.currency) {\n return String.format(this.resourceService.get(resource.noConversion), paymentAmount);\n } else {\n return String.format(this.resourceService.get(resource.conversion),\n this.$filter('customCurrency')(payment.localAmount, payment.localCurrency),\n paymentAmount\n );\n }\n }\n return '';\n }\n\n }\n\n angular\n .module('TR')\n .directive('directPaymentInformation', (): ng.IDirective => {\n return {\n scope: {\n hasFootnote: '@',\n paymentData: '=',\n showDirectPayments: '='\n },\n templateUrl: (element, attr) => {\n if (attr.templateVersion){\n return 'partials/booking/template?name=DirectPaymentInformation&version='+ attr.templateVersion;\n }\n return 'partials/home/directivetemplate?type=DirectPaymentInformation';\n },\n bindToController: true,\n controller: DirectPaymentInformation,\n controllerAs: 'dpi',\n replace: true\n };\n });\n}\n","namespace TR {\n class FacilitiesFilter {\n model: any;\n aggregate: any;\n limits: any;\n showPrice: any;\n showAll: any;\n groupArray: any;\n people: any;\n\n facLimit: string;\n htLimit: string;\n\n constructor($scope: ng.IScope,\n occupancyService: Core.OccupancyService) {\n this.limits = {};\n this.showPrice = {};\n $scope.$watch('ff.aggregate', agg => {\n if (!agg) { return; }\n this.people = occupancyService.getNumberOfNonInfantPassengers();\n let groupArray:any = [];\n for (let group in agg) {\n let elementArray:any = [];\n\n if (group === 'Facilities') {\n this.limits[group] = parseInt(this.facLimit, 10);\n this.showPrice[group] = false;\n } else {\n this.limits[group] = parseInt(this.htLimit, 10);\n this.showPrice[group] = true;\n }\n\n for (let key in agg[group]) {\n elementArray.push(_.extend(agg[group][key], { id: key }));\n }\n _.minBy(elementArray, (v:any) => v.MinPrice).cheapest = true;\n groupArray.push({ title: group, elements: _.clone(elementArray) });\n }\n this.groupArray = groupArray;\n });\n this.showAll = {};\n }\n\n isSet(group) {\n if (!this.aggregate[group] || !this.model) { return; }\n const keys = Object.keys(this.aggregate[group]);\n return _.intersection(this.model, keys).length > 0;\n }\n\n reset(group) {\n const keys = Object.keys(this.aggregate[group]);\n this.model = _.difference(this.model, keys);\n }\n\n more(group: string, all: boolean) {\n this.showAll[group] = all;\n }\n\n showMoreLess(group) {\n return Object.keys(this.aggregate[group] || {}).length > this.limits[group];\n }\n }\n\n angular\n .module('TR')\n .directive('facilitiesFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=FacilitiesFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n facLimit: '@',\n htLimit: '@',\n priceMode: '='\n },\n controller: FacilitiesFilter,\n controllerAs: 'ff'\n };\n });\n\n class FacilitiesFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{ff.getName(item)}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n\n constructor($scope: ng.IScope, analytics: any) {\n $scope.$watch('ff.model', (value: any) => {\n if (!value || !value.length) { return; }\n const grouped = this._getNameGrouped(value);\n for (let group in grouped) {\n analytics.track(\n 'mixpanel',\n `HolidayDealsFilter${group.replace(' ', '')}`,\n { value: grouped[group] }\n );\n }\n });\n }\n\n getName(item) {\n if (!this.aggregate) { return ''; }\n for (let group in this.aggregate) {\n const filter = this.aggregate[group][item];\n if (filter) { return filter.Title; }\n }\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n remove(dest) {\n this.model = this.model.filter(v => v !== dest);\n }\n\n private _getNameGrouped(filter) {\n if (!this.aggregate) { return ''; }\n let grouped = {};\n for (let i = 0, ii = filter.length; i < ii; i++) {\n let filterValue = filter[i];\n for (let group in this.aggregate) {\n let item = this.aggregate[group][filterValue];\n if (item) {\n if (!grouped[group]) { grouped[group] = []; }\n grouped[group].push(item.Title);\n }\n }\n }\n return grouped;\n }\n }\n\n angular\n .module('TR')\n .directive('facilitiesFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: FacilitiesFilterLabel.getTemplate(),\n bindToController: {\n aggregate: '=',\n model: '='\n },\n controller: FacilitiesFilterLabel,\n controllerAs: 'ff'\n };\n });\n\n}\n","(function() {\n/*\n Imports value from a remote field when it updates, if this form is `$pristine`.\n If the remote field is a select field, only option `label` matches are accepted.\n\n Example HTML:\n \n*/\n'use strict';\n\nangular.module('TR')\n .directive('fieldImport', () => {\n // Deregister all instances\n let allowInit = true;\n let deregisterFns = [];\n const deregisterAll = () => {\n if (deregisterFns) {\n allowInit = false;\n deregisterFns.forEach(fn => fn());\n deregisterFns = null; // Clear memory\n }\n };\n\n return {\n restrict: 'A',\n require: '^form', // Parent ngForm\n scope: {\n ngModel: '=',\n fieldImport: '&'\n },\n link: (scope, el, attr, formCtrl) => {\n const remoteField = scope.fieldImport();\n\n // `remoteField` may be `false` if attribute contains a condition\n if (allowInit && typeof remoteField === 'object') {\n init();\n }\n\n // Initialise\n function init() {\n // If fields were autofilled, form is still `$pristine` so check value\n if (scope.ngModel) {\n deregisterAll();\n } else {\n // Set listeners\n deregisterFns.push(\n scope.$watch(\n () => remoteField.$modelValue,\n updateField\n )\n );\n scope.$on('$destroy', deregisterAll);\n }\n }\n\n // Populate this field\n function updateField(val) {\n let submittedForm = false;\n let lastParent = formCtrl;\n\n while (!submittedForm && lastParent) {\n submittedForm = lastParent.$submitted;\n lastParent = lastParent.$$parentForm;\n }\n\n // If form was changed by user\n if (!formCtrl.$pristine || submittedForm) {\n deregisterAll();\n } else {\n // Set any falsy value to `undefined` to clear field\n if (!val) {\n val = undefined;\n }\n // For a select, only allow label matches (case insensitive)\n if (val && el.is('select')) {\n val = enforceMatch(\n // i.e. [\"--\", \"Mr\", \"Mrs\", \"Miss\", \"Ms\", \"Dr\"]\n $.map(el.find('option'), op => op.label),\n val\n );\n }\n // Set field value\n scope.ngModel = val;\n formCtrl.$setPristine(); // Only user edits will make '$pristine' false\n }\n }\n\n // Restrict value to specified strings\n function enforceMatch(allowedVals, val) {\n let i = allowedVals.length;\n while (i--) {\n const allowedStr = allowedVals[i];\n if (val.toLowerCase() === allowedStr.toLowerCase()) {\n return allowedStr;\n }\n }\n // `val` not found, clear field\n return undefined;\n }\n }\n };\n });\n})();\n","namespace TR {\n class FiltersBox {\n\n aggregates: any;\n filters: any;\n enabledFilters: any;\n show: boolean;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private filtering: any\n ) {\n $scope.$watch('fi.filters', f => this.updateFilters(f), true);\n this.enabledFilters = [];\n }\n\n updateFilters(filters) {\n if (!filters) { return; }\n const position = $('body').scrollTop();\n const listener = this.$scope.$on(\n '$locationChangeSuccess',\n () => {\n $('body').scrollTop(position);\n listener();\n });\n this.enabledFilters = Object.keys(filters);\n if (this.filtering.serialiseFilters(filters)) {\n return this.broker.publish('REFRESHSEARCH');\n }\n }\n\n showFilter(name) {\n return this.enabledFilters.indexOf(name) > -1;\n }\n\n apply() {\n return this.show = false;\n }\n }\n\n angular\n .module('TR')\n .directive('filtersBox', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=FiltersBox',\n bindToController: {\n aggregates: '=',\n filters: '=',\n priceMode: '=',\n show: '='\n },\n controller: FiltersBox,\n controllerAs: 'fi'\n };\n });\n\n}\n","namespace TR {\n class FiltersLabels { }\n\n angular\n .module('TR')\n .directive('filtersLabels', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=FiltersLabels',\n replace: true,\n bindToController: {\n filters: '=',\n aggregates: '=',\n priceMode: '='\n },\n controller: FiltersLabels,\n controllerAs: 'fl'\n };\n });\n\n}\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\n\nTR.directive('formSubmit', function(\n $rootScope,\n scrollService,\n $timeout,\n analytics,\n $routeParams,\n tripService,\n resourceService) {\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {\n isDisabled: '=',\n inputClass: '@',\n form: '=',\n click: '&',\n model: '=',\n label: '@',\n scroll: '=',\n preFlight: '&',\n templateVersion: '='\n },\n templateUrl: (element, attr) => attr.templateVersion ?\n `partials/booking/template?name=FormSubmit&version=${attr.templateVersion}` :\n 'partials/home/directivetemplate?type=FormSubmit',\n link(scope, element, attrs) {\n let noClass = (scope.inputClass || '').replace(/ /g, '').length <= 0;\n scope.buttonClass = noClass ? 'button primary' : scope.inputClass;\n\n function onClick(event) {\n $rootScope.submittedForm = null;\n if (!scope.form.$valid) {\n $rootScope.submittedForm = scope.form;\n $rootScope.$broadcast('form:submitted-invalid', scope.form);\n //wrap in timeout to allow time for address search field to reveal itself\n $timeout(function() {\n const form = $(element).parents('form');\n const selectors = '.tokenising-field.ng-invalid:visible,' +\n '.dob-picker.ng-invalid select:visible,' +\n 'input.ng-invalid:visible,' +\n 'select.ng-invalid:visible,' +\n 'div.ng-invalid .driver-type-select:visible,' +\n 'div.checkbox-btn.ng-invalid:visible,' +\n 'label.checkbox-btn.ng-invalid:visible,' +\n '.pseudo-input.ng-invalid:visible,' +\n 'textarea.ng-invalid:visible,' +\n 'date-picker.ng-invalid .hasDatepicker:visible,' +\n 'div.ng-invalid input:visible';\n\n //check if we have a closer isolated ng-form, if so pick the next element\n let target = null;\n const elements = $(selectors, form);\n if (form.length > 0) {\n _.each(elements, i => {\n let ngForm = $(i).closest('ng-form')[0] || null;\n if (!ngForm || !$(ngForm).hasClass('isolated-form')) {\n target = $(i);\n return false;\n }\n });\n } else {\n target = $(selectors).first();\n }\n\n if (scope.scroll) {\n scrollService.scrollTo(target, { animate: true, offset: 100 })\n .then(() => target.focus());\n } else {\n target.focus();\n }\n });\n setTimeout(() => analytics.track('mixpanel', 'FormValidation', { form: scope.form }));\n return;\n }\n scope.click({ model: scope.model, event });\n }\n\n scope.$click = function(event) {\n const res = scope.preFlight && scope.preFlight();\n if (res) {\n scope.disabled = true;\n res.then(() => $timeout(() => {\n scope.disabled = false;\n onClick(event);\n })).catch(() => scope.disabled = false);\n } else {\n onClick(event);\n }\n };\n\n if (attrs.templateVersion) {\n tripService.getTrip($routeParams.tripId)\n .then(trip => {\n let tripType = _.findKey(tripService.tripTypes, o => o === trip.TripType);\n tripType = (tripType || '').toUpperCase();\n scope.labelForJourney = resourceService.get(`FORMSUBMITBUTTON_TRIPTYPE_${tripType}`);\n })\n .catch(angular.noop)\n .then(() => {\n if (!scope.labelForJourney || scope.labelForJourney.indexOf('FORMSUBMITBUTTON') > -1) {\n scope.labelForJourney = resourceService.get('FORMSUBMITBUTTON_TRIPTYPE_NONE');\n }\n });\n }\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('hiddenContent', function() {\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {\n open: '@',\n showMoreText: '@',\n showLessText: '@',\n hideable: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=HiddenContent',\n link(scope) {\n scope.more = function(e) {\n e.preventDefault();\n scope.showMore = true;\n };\n\n scope.less = function(e) {\n e.preventDefault();\n scope.showMore = false;\n };\n\n scope.showMore = scope.open === 'true';\n }\n };\n});\n})();\n","(function() {\n 'use strict';\n\n const TR = angular.module('TR');\n TR.directive('hideMenuBar', function($location, $window) {\n\n return {\n restrict: 'A',\n scope: '=',\n compile($elem) {\n if (window.TRPCONFIG.Domain2.ShowMinimalHeader) { return; }\n const elem = $elem[0];\n\n const isMatchedPath = () => {\n const regEx = /.*\\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[0-9a-fA-F]{0,1}[/]*?/;\n let abtesttUrl = ($location.$$path.match(regEx) || $location.$$path.match(/attractions[/].*/));\n const abtesttUrlMatched = abtesttUrl && abtesttUrl.input;\n return abtesttUrlMatched;\n };\n\n if (isMatchedPath()) {\n elem.classList.add('u-hidden');\n } else {\n elem.classList.remove('u-hidden');\n }\n\n return function postLink($scope, $el) {\n const el = $el[0];\n const hideMenu = () => {\n const elClassList = el.classList;\n const menuBarEl = elClassList.contains('sc-c-menubar');\n const headerEl = el.closest('.sc-c-masthead');\n const headerNextElementSiblingEl = headerEl && headerEl.nextElementSibling;\n const mastHeadMainEl = headerEl && headerEl.querySelector('.sc-c-masthead__main');\n const hasShadowClass = mastHeadMainEl && mastHeadMainEl.classList.contains('sc-c-masthead__main--box-shadow');\n const hasHiddenMenuClass = headerNextElementSiblingEl && headerNextElementSiblingEl.classList.contains('sc-c-main--hidden');\n const hasHiddenClass = elClassList.contains('u-hidden');\n const mastHeadMainElClassList = mastHeadMainEl.classList;\n const headerNextElementSiblingElClassList = headerNextElementSiblingEl.classList;\n const mastHeadCss = 'sc-c-masthead__main--box-shadow';\n const menuBarCss = 'sc-c-main--hidden';\n\n if (isMatchedPath()) {\n if (!hasShadowClass) {\n mastHeadMainElClassList.add(mastHeadCss);\n }\n\n if (!hasHiddenMenuClass) {\n headerNextElementSiblingElClassList.add(menuBarCss);\n }\n\n if (menuBarEl && !hasHiddenClass) {\n elClassList.add('u-hidden');\n }\n } else {\n if (hasShadowClass) {\n mastHeadMainElClassList.remove(mastHeadCss);\n }\n\n if (hasHiddenMenuClass) {\n headerNextElementSiblingElClassList.remove(menuBarCss);\n }\n\n if (menuBarEl && hasHiddenClass) {\n elClassList.remove('u-hidden');\n }\n }\n\n };\n\n const initHideMenu = () => {\n if (window.TRPCONFIG.Domain2.HideMinimalHeader) {\n hideMenu();\n }\n };\n\n $scope.$on('$routeChangeStart', () => {\n initHideMenu();\n });\n\n $scope.$on('$routeChangeSuccess', () => {\n initHideMenu();\n });\n\n $window.onload = () => {\n initHideMenu();\n };\n\n /*eslint-disable */\n window._vwo_evq = window._vwo_evq || [];\n window._vwo_evq.push = function(...args) {\n /*eslint-enable */\n const eventData = args[0];\n if (eventData[1] === '303') {\n initHideMenu();\n }\n };\n };\n }\n };\n });\n })();\n","namespace TR {\n class HolidayDealPromoListing {\n\n getLabel: Function;\n\n name: string;\n value: string;\n group: string;\n label: string;\n type: string;\n index: number;\n\n $overlay;\n $iconOverlay;\n\n constructor (\n $element: any,\n $scope: ng.IScope,\n $sce: ng.ISCEService,\n private $location: any,\n private broker: any,\n private resourceService: Core.ResourceService\n ) {\n this.$overlay = $element.find('.holiday-deal-promo-listing .click-overlay');\n this.$iconOverlay = $element.find('.holiday-deal-promo-listing .icon-overlay');\n\n this.getLabel = label => {\n const res = resourceService.get(label);\n $sce.trustAsHtml(label);\n return res;\n };\n\n this.broker.subscribe(`PROMO_${this.type}_${this.index}`, 'PROMO_OVERLAY', ({ data }) => {\n if (this.group !== data.group) { return; }\n\n if (this.name !== data.name) {\n this.$location.search(this.name, null);\n }\n\n if (this.value !== data.value) {\n this._toggleOverlay(false);\n }\n });\n\n $scope.$watch('hpl.value', v => {\n if (!v) { return; }\n const params = this.$location.search();\n this._toggleOverlay(params[this.name] === v);\n });\n\n $scope.$on('$destroy', () => {\n this.broker.unsubscribe('holidayDealsPromoController', `PROMO_${this.type}_${this.index}`);\n });\n }\n\n select() {\n this.broker.publish('PROMO_OVERLAY', {\n name: this.name,\n group: this.group,\n value: this.value,\n type: this.type || this.getLabel(this.label)\n });\n const params = this.$location.search();\n const isAlreadySelected = params[this.name] === this.value;\n if (isAlreadySelected) { return; }\n this.$location.search(this.name, this.value);\n this._toggleOverlay(true);\n }\n\n private _toggleOverlay(show) {\n if (show) {\n this.$overlay.fadeIn(200);\n this.$iconOverlay.fadeIn(200);\n return;\n }\n this.$overlay.fadeOut(200);\n this.$iconOverlay.fadeOut(200);\n }\n }\n\n angular\n .module('TR')\n .directive('holidayDealPromoListing', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=HolidayDealPromoListing',\n bindToController: {\n label: '@',\n img: '@',\n name: '@',\n value: '=',\n group: '@',\n type: '@',\n index: '@'\n },\n controller: HolidayDealPromoListing,\n controllerAs: 'hpl'\n };\n });\n\n}\n","namespace TR {\n class HotelReviewsBrowser {\n\n loadingFirstReviews: boolean;\n selectedHotel: any;\n reviews: any[];\n reviewPaging: any;\n reviewsShowing: any;\n pageReviews: Function;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private pagingService: Core.PagingService,\n private reviewService: any\n ) {\n this.broker.subscribe(\n 'hotelReviewsBrowser',\n 'SHOWREVIEWS',\n this.showReviews.bind(this));\n\n this.pageReviews = (page) => this.getReviews(this.selectedHotel, page);\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('hotelReviewsBrowser');\n });\n }\n\n private showReviews(e, page = 1) {\n this.selectedHotel = e.data.hotel;\n this.reviewPaging = this.pagingService.data(\n 1,\n 10,\n this.selectedHotel.CustomerRatingCount\n );\n this.getReviews(e.data.hotel, page);\n }\n\n private getReviews(hotel, page) {\n if (this.reviewPaging.page === 1) { this.loadingFirstReviews = true; }\n this.reviewsShowing = true;\n return this.reviewService.getReviews(this.selectedHotel, this.reviewPaging.page - 1)\n .then(res => {\n this.reviews = res.reviews;\n this.loadingFirstReviews = false;\n this.reviewPaging = this.pagingService.data(\n this.reviewPaging.page,\n 10,\n this.selectedHotel.CustomerRatingCount\n );\n });\n }\n }\n\n angular\n .module('TR')\n .directive('hotelReviewsBrowser', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=HotelReviewBrowser',\n bindToController: {\n },\n controller: HotelReviewsBrowser,\n controllerAs: 'cm'\n };\n });\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('hotelStats', HotelStats);\n\nfunction HotelStats(arrayUtil, urgencyMessaging, toaster) {\n return {\n restrict: 'E',\n replace: false,\n scope: {\n model: '='\n },\n template: '
        ',\n link(scope) {\n if (TRPCONFIG.Domain.UrgencyMessaging) {\n urgencyMessaging.get(scope.model).then(function(stats) {\n if (stats != null) {\n const msgs = arrayUtil.filter([stats.CurrentViewsText, stats.LastBookedDateText], function(msg) {\n return msg != null;\n });\n\n angular.forEach(msgs, function(msg) {\n toaster.pop('info', msg);\n });\n }\n });\n }\n }\n };\n}\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('imageGallery', function(imageService, $timeout) {\n return {\n restrict: 'E',\n replace: false,\n scope: {\n model: '=',\n enableReviews: '@',\n showReviews: '&'\n },\n templateUrl: 'partials/hotels/imagegallery',\n link(scope, el, attrs) {\n scope.isPrerender = /prerender/i.test(navigator.userAgent);\n //need to do this as type of the original property gets changed back to text later (by angular we suspect)\n scope.reviewsEnabled = scope.enableReviews === 'true' && TRPCONFIG.Domain.ReviewsEnabled;\n scope.images = [];\n\n const itemCarousel = el.find('.large-gallery');\n const thumbCarousel = el.find('.thumb-list');\n const thumbH = 68;\n const thumbW = 68;\n const mainH = 480;\n const mainW = 870;\n const cms = attrs.cms === 'true';\n\n const cancel = scope.$watch('model', function(v) {\n if (!v) {\n return;\n }\n\n cancel();\n\n const cmsImageUrls = scope.model.CmsImageUrls;\n\n if (cms) {\n scope.images = v;\n } else if (cmsImageUrls) {\n _.forEach(cmsImageUrls, i => {\n scope.images.push({\n altText: '',\n thumbUrl: i,\n mainUrl: i,\n backgroundImage: { 'background-image': `url('${i}')` }\n });\n });\n } else {\n const { model } = scope;\n const { Title = '', Location = '', Province = '', Country = '' } = model;\n\n const altText = `${Title}${Title && ', '}${Location}${Location && ', '}${Province}${Province && ', '}${Country}${Country && ', '}`;\n\n const { NumberOfPhotos } = scope.model;\n for (let i = 0; i < NumberOfPhotos; i++) {\n const thumbUrl = imageService.getImageUrl(scope.model.Id, thumbW, thumbH, i, true);\n const mainUrl = imageService.getImageUrl(scope.model.Id, mainW, mainH, i, false);\n scope.images.push({\n altText: `${altText}${i + 1}`,\n thumbUrl,\n mainUrl,\n backgroundImage: { 'background-image': `url('${thumbUrl}')` }\n });\n }\n }\n\n $timeout(initCarousel);\n });\n\n // checkWidths function has been added to solve an issue on the product card gallery whereby, when coming back from the Room page, the first product card image appears broken and doesn't load. This code get the initial styles and width on the first load and saves them for use later on in the fix.\n function checkWidths() {\n let hotelListings = document.querySelectorAll('.hotel-listing');\n let slickTrack = document.querySelectorAll('.gallery-slides .slick-track');\n let originalStylesArr = [];\n let originalImageWidthArr = [];\n\n if (slickTrack.length === hotelListings.length) {\n for (let i = 0; i < slickTrack.length; i++) {\n let style = slickTrack[i].getAttribute('style');\n let slickWidth = slickTrack[i].querySelectorAll('.slick-active img')[0].width;\n originalStylesArr.push(style);\n originalImageWidthArr.push(slickWidth);\n }\n\n let imgMaxWidth = Math.max(...originalImageWidthArr);\n let slickActive = document.querySelectorAll('.gallery-slides .slick-track .slick-slide');\n\n if (!TRPCONFIG.Domain2.SlickTrackWidth) {\n TRPCONFIG.Domain2.SlickTrackWidth = originalStylesArr[0];\n }\n\n if (!TRPCONFIG.Domain2.SlickTrackImgWidth) {\n TRPCONFIG.Domain2.SlickTrackImgWidth = imgMaxWidth;\n }\n\n for (let i = 0; i < slickActive.length; i++) {\n let width = imgMaxWidth;\n\n if (width === 0) {\n width = TRPCONFIG.Domain2.SlickTrackImgWidth;\n }\n\n slickActive[i].style = `width: ${width}px`;\n }\n\n if (originalStylesArr[0] !== TRPCONFIG.Domain2.SlickTrackWidth) {\n slickTrack[0].style = TRPCONFIG.Domain2.SlickTrackWidth;\n }\n }\n }\n\n function initCarousel() {\n // slick is dumb and won't clone enough slides to fill the whole container\n // https://github.com/kenwheeler/slick/issues/1207\n const imgCount = scope.images.length;\n\n itemCarousel.slick({\n rtl: TRPCONFIG.Rtl,\n asNavFor: thumbCarousel,\n speed: 500,\n prevArrow: el.find('.stage .slick-prev'),\n nextArrow: el.find('.stage .slick-next'),\n infinite: imgCount > 5\n });\n\n itemCarousel.on('beforeChange', function(event, slick, currentSlide, nextSlide) {\n scope.selected = nextSlide;\n scope.$apply();\n });\n\n // we need to remove 1 slide so the infinite carousel looks infinite\n const minSlidesToShow = imgCount > 1 ? imgCount - 1 : imgCount;\n\n thumbCarousel.slick({\n rtl: TRPCONFIG.Rtl,\n asNavFor: itemCarousel,\n infinite: imgCount > 5,\n centerMode: true,\n focusOnSelect: true,\n slidesToShow: minSlidesToShow,\n swipeToSlide: true,\n variableWidth: true\n });\n\n scope.$on('$destroy', function() {\n itemCarousel.slick('unslick');\n thumbCarousel.slick('unslick');\n });\n\n checkWidths();\n\n window.addEventListener('resize', function() {\n TRPCONFIG.Domain2.SlickTrackWidth = '';\n TRPCONFIG.Domain2.SlickTrackImgWidth = '';\n checkWidths();\n });\n }\n }\n };\n});\n})();\n","/* this exists because we need to force angular to reload a route if it is clicked inside\n a link list. If left to its own devices it may not do the right thing because sometimes\n only the query string is different\n */\nangular\n .module('TR')\n .directive('linklist', function ($location : ng.ILocationService,\n $route,\n $rootScope : ng.IRootScopeService,\n urlUtils) {\n\n return {\n restrict: 'A',\n scope:{},\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery){\n function stripAndParse(url) {\n return urlUtils.parse(urlUtils.stripLeadingSlash(url));\n }\n\n let url = stripAndParse($location.path());\n $('a', el).click((e:any) => {\n let linkPath = $(e.target).attr('href');\n let linkUrl = stripAndParse(linkPath);\n if(url.url === linkUrl.url) {\n $route.reload();\n }\n });\n scope.$on('$destroy', () => $('a', el).off());\n $rootScope.$on('$routeChangeSuccess', function () {\n url = stripAndParse($location.path());\n });\n }\n };\n });\n","(function() {\n'use strict';\n\nangular.module('TR')\n .directive('newsletterBanner', (currentUser, cookieService, $timeout) => ({\n restrict: 'E',\n replace: true,\n transclude: true,\n templateUrl: 'partials/home/directivetemplate?type=newsletterbanner',\n controllerAs: 'nb',\n controller($scope, $rootScope) {\n const key = 'trpNewsletterClose';\n const monthMs = 2592e6; // 30 days\n const tempTTL = monthMs * 3;\n const permTTL = monthMs * 120;\n const user = currentUser.get();\n const isSignedIn = user && user.HardSignedIn;\n\n this.if = false; // DOM inclusion\n this.hide = false; // CSS transition\n\n if (!isSignedIn) {\n // Get persisted timestamp (async)\n localforage.getItem(key, (err, value) => {\n let hideTs = value * 1; // Ensure is a number\n let cookies = cookieService.get('CookiesAccepted') || false;\n\n if (hideTs && (Date.now() > hideTs)) {\n localforage.removeItem(key);\n hideTs = null;\n }\n this.hide = !cookies; // Hide if cookies never accepted\n this.if = !hideTs;\n });\n }\n\n this.close = (ttl = tempTTL) => {\n localforage.setItem(key, Date.now() + ttl);\n this.hide = true;\n $timeout(() => this.if = false, 1000);\n };\n\n $rootScope.$on('cookiesAccepted', () => {\n this.hide = false;\n });\n\n $scope.$on('newsletterSignUp', () => {\n // Display success message before hiding\n $timeout(() => {\n this.close(permTTL);\n }, 1400);\n });\n }\n }));\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .directive('occupancyDesktop', Occupancy);\r\n\r\nfunction Occupancy($timeout, $route, $document, arrayUtil, occupancyService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n maxRooms: '@',\r\n maxAge: '@',\r\n occupancy: '=',\r\n multiroomDisabled: '=',\r\n hideGroupBookingLink: '@',\r\n areaOverride: '@'\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=OccupancyDesktop',\r\n link: _linker\r\n };\r\n\r\n function _linker(scope, el) {\r\n const area = scope.areaOverride || scope.$parent.areaOverride || $route.current.area;\r\n const limits = TRPCONFIG.Domain.OccupancyLimits[area];\r\n const wrapper = $('#occupancy-selectors', el);\r\n const inp = $('.input-occupancy', el);\r\n let timer;\r\n\r\n const initPos = function() {\r\n $timeout.cancel(timer);\r\n timer = $timeout(function() {\r\n wrapper.position({\r\n my: 'right top',\r\n of: el,\r\n at: 'right bottom',\r\n collision: 'fit'\r\n });\r\n }, 50);\r\n };\r\n\r\n scope.ages = arrayUtil.createRange(parseInt(scope.maxAge) || TRPCONFIG.Domain.MaximumChildAge, 0);\r\n scope.getAdultsLimit = _.memoize(getAdultsLimit);\r\n scope.getChildrenLimit = _.memoize(getChildrenLimit);\r\n scope.rooms = arrayUtil.createRange(scope.maxRooms || limits.maxRooms);\r\n scope.updateOccupancy = updateOccupancy;\r\n scope.showOccupancyWrapper = showOccupancyWrapper;\r\n scope.switchWrapper = switchWrapper;\r\n\r\n scope.changeRooms = changeRooms;\r\n\r\n scope.$watch('occupancy', function(val) {\r\n if (val == null) {\r\n return;\r\n }\r\n scope.occupancyString = scope.multiroomDisabled ?\r\n occupancyService.getOccupancyString() :\r\n occupancyService.getRoomOccupancyString();\r\n }, true);\r\n\r\n\r\n function getAdultsLimit(firstRoom) {\r\n return arrayUtil.createRange(firstRoom ? limits.maxAdults : 6);\r\n }\r\n\r\n function getChildrenLimit(firstRoom) {\r\n return arrayUtil.createRange(firstRoom ? limits.maxChildren : 5, 0);\r\n }\r\n\r\n function switchWrapper(value) {\r\n if (value) {\r\n initPos();\r\n }\r\n scope.showWrapper = value;\r\n }\r\n\r\n function showOccupancyWrapper(e) {\r\n initPos();\r\n scope.showWrapper = true;\r\n\r\n // Going to attach another click event which should not be fired\r\n // in the current event bubble\r\n e.stopPropagation();\r\n\r\n //this function must be declared locally to prevent it being hoisted to far,\r\n //and then removed from scope\r\n let _hideOccupancyWrapper = function _hideOccupancyWrapperFn(e) {\r\n const isChild = el.find(e.target).length > 0;\r\n\r\n if (!isChild) {\r\n scope.$apply(function() {\r\n scope.showWrapper = false;\r\n $document.off('click.occupancy', _hideOccupancyWrapper);\r\n });\r\n }\r\n };\r\n\r\n inp.on('keydown', function tab(e) {\r\n if (e.which === 9 || e.which === 27) {\r\n scope.$apply(function() {\r\n scope.showWrapper = false;\r\n });\r\n }\r\n });\r\n\r\n $document.on('click.occupancy', _hideOccupancyWrapper);\r\n }\r\n\r\n scope.$on('$destroy', function() {\r\n inp.off('keydown');\r\n $document.off('click.occupancy');\r\n });\r\n\r\n function changeRooms() {\r\n _.each(scope.occupancy, (room, index) => {\r\n // ensure we have not added a null room to the occupancy array\r\n room = room || {};\r\n room.ChildAges = room.ChildAges || [];\r\n room.Adults = room.Adults || 2;\r\n scope.occupancy[index] = room;\r\n });\r\n updateOccupancy(scope.occupancy);\r\n }\r\n\r\n function updateOccupancy(o) {\r\n occupancyService.setOccupancy(o, true);\r\n scope.occupancyString = scope.multiroomDisabled ?\r\n occupancyService.getOccupancyString() :\r\n occupancyService.getRoomOccupancyString();\r\n }\r\n }\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('openNewTab', function($parse) {\n return {\n restrict: 'A',\n scope: '=',\n link($scope, $el, $attr) {\n const fn = $parse($attr.openNewTab);\n const el = $el[0];\n\n function handleRightClick(event) {\n $scope.$apply(function() {\n if (typeof fn === 'function') {\n fn($scope, { $event: event });\n }\n });\n }\n\n el.addEventListener('contextmenu', handleRightClick);\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('pageTitle', function($rootScope, resourceService) {\n return {\n restrict: 'A',\n link(scope, el, attr) {\n const defaultTitle = attr.pageTitle;\n const resources = {\n transfers: 'TRANSFERSHOMEPAGETITLE'\n };\n\n $rootScope.$on('$routeChangeStart', function(scope, next) {\n if (!next.landing) {\n let title = defaultTitle;\n const resource = resources[next.area];\n if (resource) {\n title = resourceService.get(resource);\n }\n document.title = title;\n }\n });\n }\n };\n});\n})();\n","namespace TR {\n class PriceFilter {\n model: any;\n aggregate: any;\n range: any;\n people: any;\n\n constructor(\n private $scope: ng.IScope,\n private occupancyService: Core.OccupancyService,\n broker: Core.Broker\n ) {\n $scope.$watch('pf.aggregate', this.setRange.bind(this), true);\n $scope.$watch('pf.model', m => {\n if (m === null) { this.reset(undefined); }\n });\n broker.subscribe('priceFilter', 'RESETPRICE', this.reset.bind(this));\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('priceFilter');\n });\n }\n\n setRange(a) {\n if (!a) { return; }\n\n if (_.get(this.model, 'Min') === 0) {\n this.model.Min = a.Min;\n }\n\n\n if (_.get(this.model, 'Max') === 0) {\n this.model.Max = a.Max;\n }\n\n this.range = this.model\n ? { Min: this.model.Min, Max: this.model.Max }\n : { Min: a.Min, Max: a.Max };\n\n this.people = this.occupancyService.getNumberOfNonInfantPassengers();\n }\n\n updateModel() {\n // if model already in sync skip\n if (this.model &&\n ((this.model.Min === this.range.Min) && (this.model.Max === this.range.Max))) {\n return;\n }\n\n // if new value is the default one reset\n if (this.range.Min === this.aggregate.Min && this.range.Max === this.aggregate.Max) {\n return this.model = null;\n }\n\n return this.model = { Min: this.range.Min, Max: this.range.Max };\n }\n\n isSet() {\n return !!this.model;\n }\n\n reset(e) {\n if (e && e.data) {\n this.range[e.data] = this.aggregate[e.data];\n return this.model[e.data] = this.aggregate[e.data];\n }\n this.range = { Min: this.aggregate.Min, Max: this.aggregate.Max };\n this.model = null;\n }\n\n\n }\n\n angular\n .module('TR')\n .directive('priceFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=PriceFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n priceMode: '='\n },\n controller: PriceFilter,\n controllerAs: 'pf'\n };\n });\n\n class PriceFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{pf.getName('Min', pf.priceMode)}} \n \n \n \n \n {{pf.getName('Max', pf.priceMode)}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n sentenceMax: string;\n sentenceMin: string;\n currencyFilter: any;\n currencySymbol: any;\n\n constructor(\n $scope: ng.IScope,\n private $filter: any,\n private broker: Core.Broker,\n analytics: any,\n private occupancyService: Core.OccupancyService\n ) {\n this.currencySymbol = TRPCONFIG.Domain.CurrencyCode;\n this.currencyFilter = this.$filter('roundedCurrency');\n\n $scope.$watch('pf.model', (value: any) => {\n if (!value) { return; }\n analytics.track('mixpanel', 'HolidayDealsFilterPrice');\n });\n }\n\n getName(end, priceMode) {\n const price = end === 'Min' ? this.model.Min : this.model.Max;\n const priceSentence = end === 'Min' ? this.sentenceMin : this.sentenceMax;\n const people = this.occupancyService.getNumberOfNonInfantPassengers();\n\n return priceSentence.replace(\n '{0}',\n this.currencyFilter(priceMode === 1 ? price : price / people, this.currencySymbol)\n );\n }\n\n isSet(end) {\n return !!this.model && this.model[end] !== this.aggregate[end] && this.model[end] !== 0;\n }\n\n remove(end) {\n this.broker.publish('RESETPRICE', end);\n }\n }\n\n angular\n .module('TR')\n .directive('priceFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: PriceFilterLabel.getTemplate(),\n bindToController: {\n aggregate: '=',\n model: '=',\n priceMode: '=',\n sentenceMin: '@',\n sentenceMax: '@'\n },\n controller: PriceFilterLabel,\n controllerAs: 'pf'\n };\n });\n\n}\n","'use strict';\nangular\n .module('TR')\n .directive('priceToken', function () {\n return {\n restrict: 'E',\n replace: true,\n template: '',\n transclude: true\n };\n });\n","\nangular\n .module('TR')\n .directive('primaryNavigationList', function ($location : ng.ILocationService,\n broker: Core.Broker,\n scrollService,\n $route,\n $window,\n $document) {\n\n return {\n restrict: 'A',\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery) {\n const navBarContentElement = $('#navbarcont');\n let isSlidePanel = (el.parents('.navigation-drawer').length === 1);\n if (isSlidePanel) {\n // we are not showing sub menus in the navigation drawer yet,\n // just publish the instruction to close the slide panel\n el.find('a').click(\n (e:any) => {\n broker.publish('hideNavigationDrawer');\n }\n );\n return;\n }\n\n let setStaticBar = () => {\n navBarContentElement.addClass('static');\n };\n let unsetStaticBar = () => {\n navBarContentElement.removeClass('static');\n };\n\n broker.subscribe('primaryNavigationList', 'bookingFormInitialised', setStaticBar);\n\n broker.subscribe('primaryNavigationList', 'bookingFormClosed', unsetStaticBar);\n\n let $listItemsWithSubMenus = el.find('> li.has-sub-menu');\n let $subMenuLinks = $listItemsWithSubMenus.find('.sub-menu a');\n\n if ($window.TRPCONFIG.IsTouchDevice) {\n\n $listItemsWithSubMenus.find('> a').on('click',\n (e: any) => {\n\n let $link = $(e.currentTarget);\n let $listItem = $link.parent();\n\n let isOpen = $listItem.hasClass('open');\n\n if (isOpen) {\n\n // let navigation execute and close menu\n $listItem.removeClass('open');\n\n } else {\n\n // prevent link navigation and open the sub menu\n e.preventDefault();\n\n // close any other sub menus\n $listItemsWithSubMenus.filter('.open').removeClass('open');\n\n // open this sub menu\n $listItem.addClass('open');\n\n e.stopPropagation();\n\n // close sub menu when anything else is clicked\n $document.one('click.primaryNavigationList', (e2: any) => {\n\n // something else was clicked so close menu\n $listItem.removeClass('open');\n\n });\n\n }\n\n }\n );\n\n\n } else {\n\n // apply \"open\" class on hover\n let hoverTimeout:any = null;\n\n $listItemsWithSubMenus.hover(\n (e:any) => {\n // hover action has a 200ms delay\n hoverTimeout = setTimeout(() => {\n $(e.currentTarget).addClass('open');\n }, 200);\n },\n (e:any) => {\n clearTimeout(hoverTimeout);\n $(e.currentTarget).removeClass('open');\n }\n );\n\n $listItemsWithSubMenus.find('a').one('click',\n (e:any) => {\n let $link = $(e.currentTarget);\n $link.parent().removeClass('open');\n }\n );\n\n }\n\n // close sub menu on any sub menu link clicks\n $subMenuLinks.click(\n (e:any) => {\n let $link = $(e.currentTarget);\n $link.parents('li.has-sub-menu').removeClass('open');\n }\n );\n\n scope.$on('$destroy', () => {\n $listItemsWithSubMenus.off();\n $subMenuLinks.off();\n });\n\n }\n };\n });\n","namespace TR {\n class PropertyTypeFilter {\n model: any;\n aggregate: any;\n limit: any;\n showAll: boolean;\n propArray: any;\n people: any;\n\n constructor($scope: ng.IScope,\n occupancyService: Core.OccupancyService) {\n $scope.$watch('pt.aggregate', agg => {\n if (!agg) { return; }\n this.people = occupancyService.getNumberOfNonInfantPassengers();\n let propArray:any = [];\n for (let key in agg) {\n propArray.push(_.extend(agg[key], { id: key }));\n }\n _.set(\n _.minBy(propArray, (v:any) => v.MinPrice),\n 'cheapest',\n true\n );\n this.propArray = propArray;\n });\n }\n\n\n isSet() {\n return !!_.size(this.model);\n }\n\n reset() {\n this.model = [];\n }\n\n more(all:boolean) {\n this.showAll = all;\n }\n\n showMoreLess() {\n return Object.keys(this.aggregate || {}).length > this.limit;\n }\n }\n\n angular\n .module('TR')\n .directive('propertyTypeFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=PropertyTypeFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n limit: '@',\n priceMode: '='\n },\n controller: PropertyTypeFilter,\n controllerAs: 'pt'\n };\n });\n\n class PropertyTypeFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{pt.getName(type)}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n\n constructor($scope: ng.IScope, analytics: any) {\n $scope.$watch('pt.model', (value: any) => {\n if (!value || !value.length) { return; }\n let pt = value.map(v => this.getName(v));\n analytics.track(\n 'mixpanel',\n 'HolidayDealsFilterPropertyType',\n { value: pt }\n );\n });\n }\n\n getName(type) {\n if (!this.aggregate) { return ''; }\n return (this.aggregate[type] || {}).Title;\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n remove(type) {\n this.model = this.model.filter(v => v !== type);\n }\n }\n\n angular\n .module('TR')\n .directive('propertyTypeFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: PropertyTypeFilterLabel.getTemplate(),\n bindToController: {\n aggregate: '=',\n model: '='\n },\n controller: PropertyTypeFilterLabel,\n controllerAs: 'pt'\n };\n });\n\n}\n","(function() {\n/*\n Brings data from publicityService into scope\n*/\n'use strict';\n\nangular.module('TR')\n .directive('publicityData', publicityService => ({\n restrict: 'A',\n scope: false, // Use parent scope\n link(scope) {\n publicityService\n .getStats({\n StatisticTypes: 'All'\n })\n .then(data => {\n // Add returned data to scope\n scope.publicityData = data;\n });\n }\n }));\n})();\n","namespace TR {\n class RatingFilter {\n model: any;\n aggregate: any;\n range: any;\n\n constructor(\n private $scope: ng.IScope,\n broker: any\n ) {\n this.$scope.$watch('rf.aggregate', this.setRange.bind(this), true);\n $scope.$watch('rf.model', m => {\n if (m === null) { this.reset(); }\n });\n broker.subscribe('ratingFilter', 'RESETRATING', this.reset.bind(this));\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('ratingFilter');\n });\n }\n\n setRange(a) {\n if (!a) { return; }\n this.range = this.model\n ? { Min: this.model.Min, Max: this.model.Max }\n : { Min: a.Min, Max: a.Max };\n }\n\n updateModel() {\n // if model already in sync skip\n if (this.model && (this.model.Min === this.range.Min)) {\n return;\n }\n\n // if new value is the default one reset\n if (this.range.Min === this.aggregate.Min) {\n return this.model = null;\n }\n\n return this.model = { Min: this.range.Min, Max: this.range.Max };\n }\n\n isSet() {\n return !!this.model;\n }\n\n reset() {\n this.range = { Min: this.aggregate.Min, Max: this.aggregate.Max };\n this.model = null;\n }\n\n\n }\n\n angular\n .module('TR')\n .directive('ratingFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=RatingFilter',\n bindToController: {\n aggregate: '=',\n model: '='\n },\n controller: RatingFilter,\n controllerAs: 'rf'\n };\n });\n\n class RatingFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{rf.getName()}} \n \n \n `;\n }\n\n model: any;\n aggregate: any;\n sentence: string;\n\n constructor($scope: ng.IScope, private broker: any, analytics: any) {\n $scope.$watch('rf.model', (value: any) => {\n if (!value) { return; }\n analytics.track('mixpanel', 'HolidayDealsFilterRating');\n });\n }\n\n getName() {\n return this.sentence.replace('{0}', this.model.Min);\n }\n\n isSet() {\n return !!this.model && this.model.Min > this.aggregate.Min;\n }\n\n remove(dest) {\n this.broker.publish('RESETRATING');\n }\n }\n\n angular\n .module('TR')\n .directive('ratingFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: RatingFilterLabel.getTemplate(),\n bindToController: {\n aggregate: '=',\n model: '=',\n sentence: '@'\n },\n controller: RatingFilterLabel,\n controllerAs: 'rf'\n };\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ReviewSnippetBrowser {\n\n // Attr\n hotel: any;\n\n private elements: any;\n private eventNamespace = 'reviewsnippetbrowser';\n private show: boolean = false;\n\n private slickOptions: any = {\n infinite: true,\n slidesToShow: 1,\n slidesToScroll: 1,\n rtl: TRPCONFIG.Rtl,\n speed: 200,\n autoplay: true,\n autoplaySpeed: 6000\n };\n\n constructor (\n private $scope: ng.IScope,\n private $q: ng.IQService,\n private $interval: ng.IIntervalService,\n private $timeout: ng.ITimeoutService,\n private $locale: any\n ) {\n }\n\n init (elements): void {\n this.elements = elements;\n this.$scope.$watch('rsb.hotel', (val) => {\n if (val) {\n this.initSlick();\n }\n });\n }\n\n // private initSlick(): void {\n // this.elements.carousel.slick(this.slickOptions);\n // this.$scope.$on('$destroy', () => {\n // this.elements.carousel.slick('unslick');\n // });\n // }\n\n private initSlick(): void {\n\n let interval: number = 10,\n attempts: number = 5,\n stopTrying: ng.IPromise;\n\n let tryInit = () => {\n const ready = this.elements.carousel[0].children && this.elements.carousel[0].children.length > 0;\n if (ready) {\n // stop the loop\n this.$interval.cancel(stopTrying);\n // do the init\n this.elements.carousel.slick(this.slickOptions);\n this.show = true;\n this.$scope.$on('$destroy', () => {\n this.elements.carousel.slick('unslick');\n });\n }\n };\n // start the loop\n stopTrying = this.$interval(tryInit, interval, attempts);\n }\n\n }\n\n angular\n .module('search')\n .directive('reviewSnippetBrowser', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: ReviewSnippetBrowser,\n controllerAs: 'rsb',\n transclude: true,\n bindToController: {\n hotel: '='\n },\n templateUrl: 'partials/home/reviewsnippetbrowser',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : ReviewSnippetBrowser\n ) => {\n const elements = {\n carousel: el.find('.carousel')\n };\n controller.init(elements);\n }\n };\n });\n\n\n}\n","(function() {\n 'use strict';\n\n const TR = angular.module('TR');\n TR.directive('scrollIntoView', scrollIntoView);\n\n function scrollIntoView($timeout) {\n return {\n restrict: 'A',\n scope: '=',\n compile($element, $attrs) {\n // raw template\n const element = $element[0];\n const showLessbutton = element.querySelector('#seo-lists__showLessButton');\n const showMorebutton = element.querySelector('#seo-lists__showMoreButton');\n const seoListsPanel = element.querySelector('#seo-lists__grid');\n const seoListsContainer = element.querySelector('#seo-lists');\n\n if (!showLessbutton && !seoListsPanel && !seoListsContainer) { return; }\n\n const configTimeout = $attrs.timeout && parseInt($attrs.timeout) || '';\n const configDelay = (typeof configTimeout === 'number') ? configTimeout : 0;\n if (configDelay) {\n seoListsPanel.classList.add('open');\n }\n\n return function postLink($scope) {\n\n const removeOpen = () => {\n if (seoListsPanel.classList.contains('open')) {\n seoListsPanel.classList.remove('open');\n }\n };\n\n const addActive = () => {\n if (!showMorebutton.classList.contains('active')) {\n showMorebutton.classList.add('active');\n }\n };\n\n const wait = (ms = 0) => new Promise(resolve => $timeout(resolve, ms));\n\n function handleScrollToView() {\n seoListsContainer.scrollIntoView();\n }\n\n function scrollToSeoListContainer() {\n showLessbutton.addEventListener('click', handleScrollToView);\n }\n\n async function delayRemoveOpen() {\n await wait(configDelay);\n removeOpen();\n scrollToSeoListContainer();\n }\n\n function handleError(err) {\n console.log(err);\n }\n\n $scope.$on('$routeChangeSuccess', function(prev, next, current) {\n addActive();\n if (current) {\n removeOpen();\n scrollToSeoListContainer();\n }\n });\n\n window.onload = (function() {\n if (configDelay) {\n delayRemoveOpen().catch(handleError);\n }\n })();\n };\n }\n };\n }\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular.module('TR')\r\n .directive('shortlistToggle', shortlistToggle);\r\n\r\nfunction shortlistToggle(shortlistService, $rootScope) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n hotel: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=ShortlistToggle',\r\n link(scope) {\r\n const cancel = scope.$watch('hotel', v => {\r\n if (v) {\r\n cancel();\r\n\r\n shortlistService.isHotelShortlisted(scope.hotel)\r\n .then(shortlisted => scope.hotel.inShortlist = shortlisted);\r\n\r\n scope.toggleShortlist = function(e) {\r\n e.preventDefault();\r\n shortlistService.toggleHotel(scope.hotel).then(shortlisted => {\r\n scope.hotel.inShortlist = shortlisted;\r\n scope.$emit('hotelShortlistStatusUpdated', scope.hotel);\r\n });\r\n e.stopPropagation();\r\n };\r\n\r\n $rootScope.$on('hotelShortlistStatusUpdated', function(ev, args) {\r\n if (scope.hotel.Id === args.Id) {\r\n scope.hotel.inShortlist = args.inShortlist;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n };\r\n}\r\n})();\r\n","namespace TR {\n class SimpleImageGallery {\n\n width: number;\n height: number;\n\n imageNumber: number;\n estabId: number;\n images: string[];\n slider: any;\n directions = { LEFT: 0, RIGHT: 1 };\n size: any;\n\n touchStart: number;\n\n constructor(\n private $scope: ng.IScope,\n $element: any,\n private imageService: any\n ) {\n // CSS Setup\n const gallery = $element.find('.simple-image-gallery');\n const leftArrow = gallery.find('.icon-chevron-left');\n const rightArrow = gallery.find('.icon-chevron-right');\n this.slider = gallery.find('.slider');\n\n const arrowSize = Math.floor(this.height / 8);\n const arrowTop = (this.height / 2) - (arrowSize / 2);\n const arrowCss = {\n 'font-size': `${arrowSize}px`,\n 'top': `${arrowTop}px`\n };\n\n gallery.css('height', `${this.height}px`);\n leftArrow.css(arrowCss);\n rightArrow.css(arrowCss);\n\n $scope.$watch(() => gallery.is(':visible'), () => this._setPadding(gallery));\n $scope.$watch(() => gallery.width(), () => this._setPadding(gallery));\n\n this.slider.css({\n left: `-${this.width}px`,\n });\n\n this.size = {\n width: `${this.width}px`,\n height: `${this.height}px`\n };\n\n // Image Insertion\n this.$scope.$watch('si.estabId', v => {\n if (!v) { return; }\n this.images = [];\n for (let i = 0, ii = this.imageNumber; i < ii; i++) {\n this.images.push(\n imageService.getImageUrl(this.estabId, this.width, this.height, i, true)\n );\n }\n });\n\n // Events\n rightArrow.click(() => this._slide(this.directions.RIGHT));\n leftArrow.click(() => this._slide(this.directions.LEFT));\n\n gallery[0].addEventListener('touchstart', e => this._handleTouchStart(e), false);\n gallery[0].addEventListener('touchend', e => this._handleTouchMove(e), false);\n }\n\n private _setPadding(gallery) {\n const w = gallery.width();\n const pad = w > this.width ? `${(w - this.width) / 2}px` : '10px';\n\n if (w > this.width) {\n this.slider.css('padding-left', pad);\n }\n }\n\n private _handleTouchStart(e) {\n this.touchStart = e.touches[0].clientX;\n }\n\n private _handleTouchMove(e) {\n if (!this.touchStart) { return; }\n const touchEnd = e.changedTouches[0].clientX;\n const diff = this.touchStart - touchEnd;\n if (Math.abs(diff) < 30) { return; }\n return this._slide(diff > 0 ? this.directions.RIGHT : this.directions.LEFT);\n }\n\n private _slide(dir: number) {\n const current = parseInt(this.slider.css('left'), 10);\n const move = dir === this.directions.LEFT\n ? current + this.width\n : current - this.width;\n\n this.slider.animate(\n { left: move },\n 200,\n () => {\n const selectedImage = TRPCONFIG.Rtl ? 'img:nth-last-child(2)' : 'img:nth-child(2)';\n this.slider.find(selectedImage).css('opacity', '0.5');\n const first = this.slider.find('img:first');\n const last = this.slider.find('img:last');\n\n if ( TRPCONFIG.Rtl ) {\n if (dir === this.directions.RIGHT) { first.before(last); }\n else { last.after(first); }\n } else {\n if (dir === this.directions.LEFT) { first.before(last); }\n else { last.after(first); }\n }\n this.slider.css({ 'left': `-${this.width}px` });\n this.slider.find(selectedImage).css('opacity', '1');\n });\n }\n }\n\n angular\n .module('TR')\n .directive('simpleImageGallery', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=SimpleImageGallery',\n bindToController: {\n estabId: '=',\n imageNumber: '=',\n width: '=?',\n height: '=?'\n },\n controller: SimpleImageGallery,\n controllerAs: 'si'\n };\n });\n\n}\n","namespace TR {\n class StarsFilter {\n model: any;\n ordered: any;\n people: any;\n\n constructor($scope: ng.IScope,\n occupancyService: Core.OccupancyService) {\n $scope.$watch('sf.aggregate', agg => {\n if (!agg) { return; }\n this.people = occupancyService.getNumberOfNonInfantPassengers();\n this.ordered = Object.keys(agg)\n .map(v => parseInt(v, 10))\n .sort((a, b) => b - a)\n .map(v => ({\n stars: v.toString(),\n Count: agg[v].Count,\n MinPrice: agg[v].MinPrice\n }));\n\n _.set(\n _.minBy(this.ordered, (v:any) => v.MinPrice),\n 'cheapest',\n true\n );\n });\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n reset() {\n this.model = [];\n }\n }\n\n angular\n .module('TR')\n .directive('starsFilter', (): ng.IDirective => {\n return {\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=StarsFilter',\n bindToController: {\n aggregate: '=',\n model: '=',\n priceMode: '='\n },\n controller: StarsFilter,\n controllerAs: 'sf'\n };\n });\n\n class StarsFilterLabel {\n\n public static getTemplate() {\n return `\n \n \n {{::sf.unrated}} \n 1 {{::sf.singular}} \n 1\"> {{::star}} {{::sf.plural}} \n \n \n `;\n }\n\n model: any;\n\n constructor($scope: ng.IScope, analytics: any) {\n $scope.$watch('sf.model', (value: any) => {\n if (!value || !value.length) { return; }\n analytics.track(\n 'mixpanel',\n 'HolidayDealsFilterStars',\n { value: value }\n );\n });\n }\n\n isSet() {\n return !!_.size(this.model);\n }\n\n remove(star) {\n this.model = this.model.filter(v => v !== star);\n }\n }\n\n angular\n .module('TR')\n .directive('starsFilterLabel', (): ng.IDirective => {\n return {\n scope: {},\n template: StarsFilterLabel.getTemplate(),\n bindToController: {\n unrated: '@',\n singular: '@',\n plural: '@',\n model: '='\n },\n controller: StarsFilterLabel,\n controllerAs: 'sf'\n };\n });\n}\n","namespace TR {\n\n class TextFader {\n\n height: number;\n showContent: boolean = true;\n showExpanderLink: boolean = true;\n\n constructor() {\n }\n\n init (contentHeight: number): void {\n\n console.log('text fader: ' + contentHeight);\n //if there isn't enough content remove the more less links\n this.showContent = !(contentHeight > this.height);\n this.showExpanderLink = !this.showContent;\n }\n\n }\n\n angular\n .module('TR')\n .directive('textFader', (): ng.IDirective => {\n return {\n scope: {\n height: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=TextFader',\n bindToController: true,\n controller: TextFader,\n controllerAs: 'tf',\n link: (scope: ng.IScope, el: ng.IAugmentedJQuery, attr: ng.IAttributes, ctrl:TextFader) => {\n\n setTimeout(function () {\n // angular finished its thing we can get the height\n ctrl.init(el.find(' > .content').outerHeight());\n }, 0);\n },\n replace: true,\n transclude: true\n };\n });\n}\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('tooltip', function() {\n return {\n restrict: 'A',\n scope: {\n placement: '@'\n },\n link(scope, el, attr) {\n if (TRPCONFIG.IsTouchDevice) {\n return;\n }\n\n let popup;\n\n const placement = (() => {\n switch (scope.placement) {\n case 'start': return TRPCONFIG.Rtl ? 'right' : 'left';\n case 'end': return TRPCONFIG.Rtl ? 'left' : 'right';\n default: return scope.placement || 'top';\n }\n })();\n\n el.on('mouseenter', function() {\n if (!attr.tooltip) {\n return;\n }\n\n if (!popup) {\n el.trppopup({\n trigger: 'manual',\n placement,\n content() {\n return attr.tooltip;\n }\n });\n popup = el.data('trppopup');\n }\n\n popup.show();\n });\n el.on('mouseleave', function() {\n if (popup) {\n popup.hide();\n }\n });\n\n scope.$on('$destroy', function() {\n el.off('mouseenter');\n el.off('mouseleave');\n if (popup) {\n popup.destroy();\n }\n });\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('tooltipUi', tooltipUi);\n\nfunction tooltipUi() {\n return {\n restrict: 'A',\n scope: {\n tooltipClass: '@'\n },\n\n link(scope, el, attr) {\n $(el).mouseover(function() {\n $(el).tooltip({\n items: el[0].tagName,\n content: attr.tooltipUi,\n position: { my: 'center top+15', at: 'center bottom' },\n hide: false,\n show: false,\n tooltipClass: scope.tooltipClass\n });\n $(el).tooltip('open');\n });\n\n scope.$on('$destroy', () => $(el).off());\n }\n };\n}\n})();\n","namespace TR {\n\n class TrustpilotLogo {\n\n stars: number;\n count: number;\n fallbackImage: string;\n\n summary: any;\n\n\n constructor (private TrustpilotService: TR.TrustpilotService) {\n // get business unit info from Trustpilot\n this.TrustpilotService.getBusinessUnit().then(\n (res:any) => {\n this.summary = res;\n }\n );\n\n }\n\n }\n\n angular\n .module('TR')\n .directive('trustpilotLogo', (): ng.IDirective => {\n\n return {\n bindToController: {\n stars: '=',\n count: '=',\n name: '@',\n class: '@',\n path: '@',\n altLogo: '=?',\n },\n controller: TrustpilotLogo,\n controllerAs: 'tpl',\n templateUrl: 'partials/home/directivetemplate?type=TrustpilotLogo',\n link: ($scope) => {\n $scope.hostName = 'https://uk.trustpilot.com/review/www.' + TRPCONFIG.Domain.HostName;\n setTimeout(() => {\n let widgetManagement: any = _.get(window, 'Trustpilot.Modules.WidgetManagement');\n if (!widgetManagement) {\n $(document.body).append(``);\n }\n }, 1500);\n }\n };\n\n });\n}\n","(function() {\n'use strict';\nconst TR = angular.module('TR');\n\n ///NOTE: this is now deprecated, please use the validationMessage directive as that\n //is aligned with what we would like to do going forward with the look and feel and activation\n //or errors across the site.\n\nTR.directive('validationErrors', function($rootScope, validationService, broker) {\n return {\n restrict: 'E',\n replace: true,\n priority: 1000,\n scope: {\n rootForm: '=',\n field: '=',\n label: '@',\n msgMap: '@',\n immediate: '@',\n stayActive: '@' // Error stays visible until another field is focused (i.e. whilst using calendar)\n },\n template: '
        ' +\n '
          ' +\n '
        • ' +\n ' {{translate(name, val)}}' +\n '
        • ' +\n '
        ' +\n '
          ' +\n '
        • ' +\n '

          {{translate(name, val)}}

          ' +\n '
        • ' +\n '
        ' +\n '
        ',\n link(scope) {\n scope.showErrors = function() {\n const field = scope.field;\n if (field) {\n const stayActive = (scope.stayActive === 'true' && field.lastFocused);\n\n return (field.focused || stayActive || immediateTest()) &&\n ($rootScope.submittedForm === scope.rootForm && !scope.rootForm.$valid || immediateTest());\n }\n };\n\n scope.showErrorsdob = function() {\n const field = scope.field;\n if (field && field.$name === 'dob') {\n const stayActive = (scope.stayActive === 'true');\n return (stayActive && $rootScope.submittedForm === scope.rootForm && !scope.rootForm.$valid);\n }\n };\n\n function immediateTest() {\n if (scope.immediate != null) {\n if (scope.immediate === 'true') {\n return true;\n }\n const immediate = scope.immediate.split('|');\n for (const i in immediate) {\n const doNow = immediate[i];\n if (doNow && scope.field.$error[doNow]) {\n return true;\n }\n }\n }\n return false;\n }\n\n const map = scope.msgMap == null ? {} : JSON.parse(scope.msgMap);\n\n const watcher = scope.$watch('field', function(val) {\n if (val) {\n scope.field.label = scope.label;\n watcher();\n }\n });\n\n scope.$watch(scope.showErrors, val => {\n if (val && scope.field.$invalid) {\n const validationErrors = Object.keys(scope.field.$error)\n .map(name => validationService.translateField(scope.field, name, map));\n broker.publish('validationErrors', validationErrors);\n }\n });\n\n scope.translate = function(name, val) {\n if (!val) { return ''; }\n return validationService.translateField(scope.field, name, map);\n };\n }\n };\n});\n})();\n","namespace TR {\n\n interface ValidationMessageScope extends ng.IScope {\n vs :ValidationMessage;\n }\n interface ValidationMessageModel extends ng.INgModelController {\n ValidationSummary :{ Focused :boolean, PreviouslyFocused :boolean};\n }\n\n class FormField {\n private Field :ValidationMessageModel;\n private Children :ValidationMessageModel[] = [];\n private Inputs : JQuery[] = [];\n\n constructor(field: ng.INgModelController) {\n this.Field = FormField.addValidationObjectToField(field);\n }\n\n public addChildField(input: JQuery, field: ng.INgModelController) :void {\n this.addInputField(input);\n this.Children.push(FormField.addValidationObjectToField(field));\n }\n\n public addInputField(input: JQuery) :void {\n this.Inputs.push(input);\n }\n\n public errorMessages() :{} {\n return this.isValid() ? {} : this.Field.$error;\n }\n\n public getInputFields() :JQuery[] {\n return this.Inputs;\n }\n\n public isFocused() :boolean {\n return this.Children.length > 0 ?\n _.some(this.Children, (f) => f.ValidationSummary.Focused === true)\n : this.Field.ValidationSummary.Focused;\n }\n\n public isValid() :boolean {\n return !this.Field.$invalid;\n }\n\n public wasPreviouslyFocused() :boolean {\n return this.Children.length > 0 ?\n _.every(this.Children, (f) => f.ValidationSummary.PreviouslyFocused === true)\n : this.Field.ValidationSummary.PreviouslyFocused;\n }\n\n private static addValidationObjectToField(field: ng.INgModelController) :ValidationMessageModel{\n let f = field as ValidationMessageModel;\n f.ValidationSummary = {\n Focused: false,\n PreviouslyFocused: false\n };\n return f;\n }\n }\n\n class ValidationMessage {\n\n private fieldNames :string;\n private fields :FormField[] = [];\n private form :ng.IFormController;\n private readonly labels :string[] = [];\n private labelStrings :string;\n private readonly map :any;\n private msgMap :string | null;\n private rootForm :ng.IFormController;\n private watchers :{() :void}[] = [];\n\n public active :boolean;\n public invalid :boolean;\n public errorMessages :string[] = [];\n private alwaysWatchFields :string;\n\n constructor(private $scope :ValidationMessageScope,\n private $timeout :ng.ITimeoutService,\n private validationService :any) {\n\n for (let l of this.labelStrings.split('|')) {\n this.labels.push(l);\n }\n\n this.map = this.msgMap == null ? {} : JSON.parse(this.msgMap);\n }\n\n init(form :ng.IFormController, formElement :JQuery) :void {\n\n this.form = form;\n\n for (let name of this.fieldNames.split('|')) {\n var f = this.form[name];\n let formField = new FormField(this.form[name]);\n //find the input DOM element within our form and attach some handlers\n //use the name property to associate the field and input also keep a\n //pointer to the input field as we will want to add/remove css classes\n //depending on its validity\n const input = formElement.find(`[name='${name}']`).first();\n if (input.is('select') || input.is('input')) {\n input\n .focus((e) => this.focusHandler(e))\n .blur((e) => this.blurHandler(e));\n formField.addInputField(input);\n } else {\n //find our actual sub inputs and add a Validation summary to these\n _.each(input.find('select,input')\n , (ele :JQuery) => formField.addChildField($(ele), this.form[ele.name])\n );\n\n input\n .focusin((e) => this.focusHandler(e))\n .focusout((e) => this.blurHandler(e));\n }\n\n this.fields.push(formField);\n }\n\n //this is a bit of a hack to solve issues where we have external influences on a field.\n //we should avoid having so many watches\n if (this.alwaysWatch()) {\n _.each(this.fields, (f,i) => {\n this.watchers.push(\n this.$scope.$watch(`vm.fields[${i}].isValid()`, (n, o) => {\n if (n !== o) {\n this.active = _.every(this.fields, (f) => f.wasPreviouslyFocused() === true)\n || _.every(this.fields, (f) => f.isValid() === true);\n this.updateValidationStatus();\n }\n })\n );\n });\n }\n\n this.$scope.$watch('vm.rootForm.$submitted', (v) => {\n if (v) {\n this.active = true;\n this.updateValidationStatus();\n }\n });\n }\n\n private blurHandler(e: any) :void {\n\n if (this.watchers.length && !this.alwaysWatch()) {\n _.each(this.watchers, w => w());\n this.watchers = [];\n }\n\n //use the elements name to get the field from the form\n let field = this.form[e.target.name];\n field.ValidationSummary.Focused = false;\n field.ValidationSummary.PreviouslyFocused = true;\n\n this.active = _.every(this.fields, (f) => f.wasPreviouslyFocused() === true);\n this.updateValidationStatus();\n }\n\n private focusHandler(e: any) :void {\n\n //use the elements name to get the field from the form\n let field = this.form[e.target.name];\n field.ValidationSummary.Focused = true;\n\n\n //if all the fields were previously active and we are invalid then watch our fields while we type\n //so that we know when we are valid\n if (_.every(this.fields, (f) => f.wasPreviouslyFocused() === true) && !this.alwaysWatch()) {\n _.each(this.fields, (f,i) => {\n this.watchers.push(\n this.$scope.$watch(`vm.fields[${i}].isValid()`, () => {\n this.updateValidationStatus();\n }, true\n )\n );\n });\n }\n }\n\n private updateValidationStatus() :void {\n let allValid = true;\n let errors :string[] = [];\n\n const errorClassName = 'sc-c-field--error';\n const successClassName = 'sc-c-field--success';\n const fds = this.fields;\n _.each(this.fields, (f, index) => {\n const valid = f.isValid();\n if (!valid && this.active) {\n allValid = false;\n _.forOwn(f.errorMessages(), (v, k) =>\n errors.push(this.validationService.translateFieldLabel(this.labels[index], k, this.map))\n );\n const inputfields = f.getInputFields();\n _.each(inputfields, field => {\n field.parent().addClass(errorClassName);\n if (field.parent().hasClass(successClassName)){\n field.parent().removeClass(successClassName);\n }\n });\n } else if (valid && this.active) {\n const inputfields = f.getInputFields();\n _.each(f.getInputFields(), field => {\n if (field.parent().hasClass(errorClassName)){\n field.parent().removeClass(errorClassName);\n }\n field.parent().addClass(successClassName);\n });\n }\n });\n\n this.$timeout(() => {\n this.invalid = !allValid;\n this.errorMessages = _.uniq(errors);\n }, 0);\n }\n\n private alwaysWatch() :boolean {\n return this.alwaysWatchFields === 'true';\n }\n\n }\n\n angular\n .module('TR')\n .directive('validationMessage', (): ng.IDirective => {\n return {\n require: '^form',\n restrict: 'E',\n replace: true,\n scope: {},\n template:\n `
        \n

        \n {{err}}\n

        \n
        `,\n bindToController: {\n fieldNames: '@',\n labelStrings: '@',\n msgMap: '@?',\n rootForm: '=',\n waitFor: '=?',\n alwaysWatchFields: '@?'\n },\n controller: ValidationMessage,\n controllerAs: 'vm',\n link: (scope :ValidationMessageScope,\n el :ng.IAugmentedJQuery,\n attr :ng.IAttributes,\n formCtrl :ng.IFormController) => {\n\n //there is an assumption here that the directive is within the same form as the input field\n //we are validating and also that the field name is that same as the name property on the input.\n // Not great, but so the we can keep everything together this might be ok (maybe, sort of)\n\n //we need our form DOM element so that we can find the inputs\n //get the elements parent forms and the first one should be the one to use\n const formEl = ($(angular.element(el).parents('ng-form')[0])\n || $(angular.element(el).closest('form.quoteFormNonReg')) );\n\n if (attr.waitFor) {\n const watch = scope.$watch('vm.waitFor', (v) => {\n if (v) {\n scope.vm.init(formCtrl, formEl);\n watch();\n }\n });\n } else {\n scope.vm.init(formCtrl, formEl);\n }\n }\n };\n });\n}\n","namespace TR {\n\n ///NOTE: this is now deprecated, please use the validationMessage directive as that\n //is aligned with what we would like to do going forward with the look and feel and activation\n //or errors across the site.\n interface ValidationStatusAttributes extends ng.IAttributes {\n fieldNames: string;\n labelStrings: string;\n msgMap: string;\n rootForm: string;\n waitFor: string;\n }\n\n interface ValidationStatusElement extends Element {\n name :string;\n }\n\n interface ValidationStatusModel extends ng.INgModelController {\n ValidationSummary :{ PreviouslyFocused :boolean};\n }\n\n interface ValidationStatusScope extends ng.IScope {\n vs :ValidationStatus;\n }\n\n\n class FormField {\n private Field :ValidationStatusModel;\n private Children:ValidationStatusModel[] = [];\n\n constructor(field: ng.INgModelController) {\n this.Field = FormField.addValidationObjectToField(field);\n }\n\n public addChildField(field: ng.INgModelController) :void {\n this.Children.push(FormField.addValidationObjectToField(field));\n }\n\n public wasPreviouslyFocused() :boolean {\n return this.Children.length > 0 ?\n _.every(this.Children, (f) => f.ValidationSummary.PreviouslyFocused === true)\n : this.Field.ValidationSummary.PreviouslyFocused;\n }\n\n public isValid() :boolean {\n return !this.Field.$invalid;\n }\n\n public errorMessages() :{} {\n return this.isValid() ? {} : this.Field.$error;\n }\n\n private static addValidationObjectToField(field: ng.INgModelController) :ValidationStatusModel{\n let f = field as ValidationStatusModel;\n f.ValidationSummary = {\n PreviouslyFocused: false\n };\n return f;\n }\n }\n\n class ValidationStatus {\n\n private alwaysWatchFields :string;\n private fieldNames :string;\n private fields :FormField[] = [];\n private form :ng.IFormController;\n private readonly labels :string[] = [];\n private labelStrings :string;\n private readonly map :any;\n private msgMap :string | null;\n private rootForm :ng.IFormController;\n private watchers :{() :void}[] = [];\n\n public active :boolean;\n public invalid :boolean;\n public errorMessages :string[] = [];\n\n constructor(private $scope :ValidationStatusScope,\n private analytics :any,\n private broker :Core.Broker,\n private validationService :any) {\n\n for (let l of this.labelStrings.split('|')) {\n this.labels.push(l);\n }\n\n this.map = this.msgMap == null ? {} : JSON.parse(this.msgMap);\n }\n\n init(form :ng.IFormController, formElement :JQuery) :void {\n\n this.form = form;\n\n for (let name of this.fieldNames.split('|')) {\n let field = this.form[name];\n if (!field) {\n throw new Error(`There was no field named \"${name}\"`);\n }\n let formField = new FormField(field);\n\n //find the input DOM element within our form and attach some handlers\n //use the name property to associate the field and input\n const input = formElement.find(`[name='${name}']`).first();\n if (input.is('select') || input.is('input')) {\n input\n .focus(() => this.focusHandler())\n .blur((e) => this.blurHandler(e));\n } else {\n //find our actual sub inputs and add track these\n _.each(input.find('select,input'), (ele :ValidationStatusElement) => {\n const field = this.form[ele.name];\n if (field) {\n formField.addChildField(field);\n }\n });\n\n input\n .focusin(() => this.focusHandler())\n .focusout((e) => this.blurHandler(e));\n }\n\n this.fields.push(formField);\n }\n\n //this is a bit of a hack to solve issues where we have external influences on a field.\n //we should avoid having so many watches\n if (this.alwaysWatch()) {\n _.each(this.fields, (f,i) => {\n this.watchers.push(\n this.$scope.$watch(`vs.fields[${i}].isValid()`, (n, o) => {\n if (n !== o) {\n this.active = _.every(this.fields, (f) => f.wasPreviouslyFocused() === true)\n || _.every(this.fields, (f) => f.isValid() === true);\n this.updateValidationStatus();\n }\n })\n );\n });\n }\n\n this.$scope.$watch('vs.rootForm.$submitted', (v) => {\n if (v) {\n this.active = true;\n this.updateValidationStatus();\n }\n });\n }\n\n private blurHandler(e: JQueryEventObject) :void {\n if (this.watchers.length && !this.alwaysWatch()) {\n _.each(this.watchers, w => w());\n this.watchers = [];\n }\n\n //use the elements name to get the field from the form\n let field = this.form[(e.target).name];\n field.ValidationSummary.PreviouslyFocused = true;\n\n this.$scope.$apply(() => {\n this.active = _.every(this.fields, (f) => f.wasPreviouslyFocused() === true)\n || _.every(this.fields, (f) => f.isValid() === true);\n if (this.active) {\n this.updateValidationStatus();\n }\n });\n }\n\n private focusHandler() :void {\n //if all the fields were previously active and we are invalid then watch our fields while we type\n //so that we know when we are valid\n if (_.every(this.fields, (f) => f.wasPreviouslyFocused() === true) && !this.alwaysWatch()) {\n _.each(this.fields, (f,i) => {\n this.watchers.push(\n this.$scope.$watch(`vs.fields[${i}].isValid()`, () => {\n this.updateValidationStatus();\n }, true\n )\n );\n });\n }\n }\n\n private updateValidationStatus() :void {\n let errors :string[] = [];\n\n _.transform(this.fields, (result, f, i :number) => {\n if (!f.isValid()) {\n _.forOwn(f.errorMessages(), (v, k) =>\n result.push(this.validationService.translateFieldLabel(this.labels[i], k, this.map))\n );\n }\n return result;\n }, errors);\n\n this.invalid = errors.length > 0;\n this.errorMessages = _.uniq(errors);\n\n if (errors.length > 0 && this.active) {\n this.analytics.track('mixpanel', 'FormValidationInline', {InlineErrors : this.errorMessages.join(',')});\n this.broker.publish('validationErrors', this.errorMessages);\n }\n }\n\n private alwaysWatch() :boolean {\n return this.alwaysWatchFields === 'true';\n }\n }\n\n angular\n .module('TR')\n .directive('validationStatus', (): ng.IDirective => {\n return {\n require: '^form',\n restrict: 'E',\n replace: true,\n scope: {},\n template:\n `
        \n
        \n \n \n
        \n
        \n
          \n
        • \n {{err}}\n
        • \n
        \n
        `,\n transclude: true,\n bindToController: {\n alwaysWatchFields: '@?',\n cssAutoWidth: '@?',\n fieldNames: '@',\n labelStrings: '@',\n msgMap: '@?',\n rootForm: '=',\n waitFor: '=?'\n },\n controller: ValidationStatus,\n controllerAs: 'vs',\n link: (scope :ValidationStatusScope,\n el :ng.IAugmentedJQuery,\n attr :ValidationStatusAttributes,\n formCtrl :ng.IFormController) => {\n\n //there is an assumption here that the input field we are validating has a name attribute that is a\n //property on the form with the same value.\n //Not great, but so the we can keep everything together this might be ok (maybe, sort of)\n\n //we need our form DOM element so that we can find the inputs\n //get the elements parent forms and the first one should be the one to use\n const formEl = angular.element(el).closest('form,ng-form');\n\n if (attr.waitFor) {\n const watch = scope.$watch('vs.waitFor', (v) => {\n if (v) {\n scope.vs.init(formCtrl, formEl);\n watch();\n }\n });\n } else {\n scope.vs.init(formCtrl, formEl);\n }\n\n }\n };\n });\n}\n","(function() {\n'use strict';\n\n/*\n * Depends:\n * jquery.ui.core.js\n * jquery.ui.widget.js\n */\n(function($) {\n $.widget('trp.modal', {\n\n options: {\n template: '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n ' ' +\n ' ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ',\n fadeSpeed: 200,\n easing: 'swing',\n clickOffToClose: false\n },\n\n _create() {\n // element refs\n this.$lightbox = null;\n this.$stage = null;\n this.$loader = null;\n\n this.isShown = false;\n\n this._show();\n },\n\n _show() {\n if (this.isShown) { return; }\n\n this.isShown = true;\n\n this._createLightbox();\n },\n\n\n _createLightbox() {\n const self = this;\n\n // create lightbox using template\n this.$lightbox = $(this.options.template)\n .appendTo(document.body)\n .fadeIn(this.options.fadeSpeed, this.options.easing, $.proxy());\n\n // set refs to child elements\n this.$stage = this.$lightbox.find('.stage');\n this.$loader = this.$stage.find('.loader');\n\n this.$stage.find('a.close-btn')\n .on('click.modal', $.proxy(function(e) {\n e.preventDefault();\n this._trigger('closeClicked', e);\n this._hide();\n }, this));\n\n\n this._getContent(function(content) {\n self.$loader.hide();\n\n // set the content\n if (content) { self.$stage.find('.modal-content').html(content); }\n });\n\n // bind for any confirmation buttons\n this.$stage.find('a.ok-btn')\n .on('click.modal', $.proxy(function(e) {\n e.preventDefault();\n this._trigger('okClicked', e);\n this._hide();\n }, this));\n\n this.$stage.find('a.cancel-btn')\n .on('click.modal', $.proxy(function(e) {\n e.preventDefault();\n self._trigger('cancelClicked', e);\n this._hide();\n }, this));\n\n if (this.options.clickOffToClose) {\n // hide if user clicks outside the lightbox\n this.$lightbox.on('click.modal', $.proxy(this._hide, this));\n this.$stage.on('click.modal', function(e) { e.stopPropagation(); });\n\n // support keyboard commands\n $('html').on('keyup.modal', $.proxy(function(e) {\n return (e.which === 27 && this._hide()); // escape to close\n }, this));\n }\n\n this._trigger('created');\n },\n\n _getContent(callback) {\n if (typeof this.options.content === 'function') {\n // default behaviour using content function\n this.options.content.call(this.element[0], function(response) {\n callback(response);\n });\n } else {\n // just return content as is\n callback(this.options.content);\n }\n },\n\n _hide() {\n if (!this.isShown) { return; }\n\n this.isShown = false;\n\n\n // fade out the overlay and destroy\n this.$lightbox.fadeOut(200, this.options.easing, $.proxy(function() {\n this.destroy();\n }, this));\n\n this._trigger('hidden');\n },\n\n _destroy() {\n this.$lightbox.remove();\n //this.$overlay.remove();\n $('html').off('keyup.modal');\n }\n\n });\n})(window.jQuery);\n})();\n","(function() {\n'use strict';\n\n(function($) {\n const Trppopup = function(element, options) {\n this.init('trppopup', element, options);\n };\n\n Trppopup.prototype = {\n constructor: Trppopup,\n\n init(type, element, options) {\n // initialise\n this.type = type;\n this.$el = $(element);\n\n this.options = $.extend({}, $.fn[this.type].defaults, options);\n\n this.$popup = null; // (created on first \"show')\n\n // listen to appropriate trigger events\n switch (this.options.trigger) {\n case 'click':\n // toggle popup on click of target element\n this.$el.on(`click.${this.type}`, $.proxy(this.toggle, this));\n break;\n case 'hover':\n this.$el.on(`mouseenter.${this.type}`, $.proxy(this.enter, this));\n this.$el.on(`mouseleave.${this.type}`, $.proxy(this.hide, this));\n break;\n case 'focus':\n // for use with input fields\n this.$el.on(`focus.${this.type}`, $.proxy(this.enter, this));\n\n if (this.options.hideOnBlur) {\n this.$el.on(`blur.${this.type}`, $.proxy(this.hide, this));\n }\n\n // close on tab out\n this.$el.on(`keydown.${this.type}`, $.proxy(this.checkKeydown, this));\n\n // close on external click\n $('html').on(`mousedown.${this.type}`, $.proxy(this.checkClick, this));\n\n break;\n case 'blur':\n this.hide();\n break;\n case 'manual':\n // hide and show must be triggered manually\n break;\n }\n },\n\n enter() { this.show(true); },\n leave() { this.hide(); },\n toggle() {\n if (this.open) {\n this.hide();\n } else {\n this.show(true);\n }\n },\n\n checkClick(e) {\n const $target = $(e.target);\n\n if (this.$popup && this.open) {\n // close popup on external click\n if ($target[0] !== this.$popup && this.$popup.find('*').index($target[0]) === -1) {\n this.hide();\n }\n } else if (this.$popup && !this.open && $target.index(this.$el) >= 0) {\n this.show(true);\n }\n },\n\n checkKeydown(e) {\n const key = e.keyCode || e.which;\n // close if user tabs out\n if (key === 9) {\n this.hide();\n }\n },\n\n show(animate) {\n if (this.open) {\n return;\n }\n\n const $popup = this.popup();\n\n this.setContent();\n\n // we need to show the panel to get position\n $popup.show().css({ opacity: 0 });\n\n let options = {};\n\n switch (this.options.placement) {\n case 'top':\n options = {\n my: 'center bottom',\n of: this.$el,\n at: 'center top-10',\n collision: 'none'\n };\n break;\n case 'bottom':\n options = {\n my: 'center top',\n of: this.$el,\n at: 'center bottom+10',\n collision: 'none'\n };\n break;\n case 'left':\n options = {\n my: 'right center',\n of: this.$el,\n at: 'left-15 center',\n collision: 'none'\n };\n break;\n case 'right':\n options = {\n my: 'left center',\n of: this.$el,\n at: 'right+15 center',\n collision: 'none'\n };\n break;\n }\n\n $popup.position(options);\n\n if (animate) {\n $popup.animate({ opacity: 1 }, 150);\n } else {\n $popup.css({ opacity: 1 });\n }\n this.open = true;\n },\n\n hide() {\n if (!this.open) {\n return;\n }\n\n const self = this;\n const _popup = this.$popup;\n\n _popup.animate({ opacity: 0 }, 150, function() {\n _popup.hide();\n self.open = false;\n self.destroy();\n });\n },\n\n getPosition() {\n return $.extend({}, (this.$el.offset()), {\n width: this.$el[0].offsetWidth,\n height: this.$el[0].offsetHeight\n });\n },\n\n setContent() {\n const $popup = this.popup();\n const content = this.getContent();\n\n $popup.find('.content')[this.options.html ? 'html' : 'text'](content);\n },\n\n getContent() {\n // content can be a string or a function\n return typeof this.options.content === 'function' ? this.options.content.call(this.$el[0]) : this.options.content;\n },\n\n popup() {\n // create element if it does not exist\n if (!this.$popup) {\n this.$popup = $(this.options.popupTemplate)\n .addClass(this.options.placement);\n\n if (this.options.variant) {\n this.$popup.addClass(this.options.variant);\n }\n\n if (this.options.width) {\n this.$popup.css('width', this.options.width);\n }\n\n //this.$popup.insertAfter(this.$el);\n this.$popup.appendTo(document.body);\n }\n\n return this.$popup;\n },\n\n destroy() {\n //this.hide();\n\n switch (this.options.trigger) {\n case 'click':\n // toggle popup on click of target element\n this.$el.off(`click.${this.type}`);\n break;\n case 'hover':\n this.$el.off(`mouseenter.${this.type}`);\n this.$el.off(`mouseleave.${this.type}`);\n break;\n case 'focus':\n // for use with input fields\n this.$el.off(`focus.${this.type}`);\n this.$el.off(`blur.${this.type}`);\n // close on tab out\n this.$el.off(`keydown.${this.type}`);\n // close on external click\n $('html').off(`mousedown.${this.type}`);\n break;\n }\n\n this.$el.data('trppopup', null);\n\n //DK quick fix to stop our logs filling up\n if (this.$popup != null) {\n this.$popup.remove();\n this.$popup = null;\n }\n }\n };\n\n /* trppopup PLUGIN DEFINITION\n * ========================= */\n\n $.fn.trppopup = function(option) {\n return this.each(function() {\n const $this = $(this);\n const options = typeof option === 'object' && option;\n let data = $this.data('trppopup');\n if (!data) {\n $this.data('trppopup', (data = new Trppopup(this, options)));\n }\n if (typeof option === 'string') {\n data[option]();\n }\n });\n };\n\n $.fn.trppopup.Constructor = Trppopup;\n\n $.fn.trppopup.defaults = {\n trigger: 'focus',\n placement: 'bottom',\n popupTemplate: '
        ',\n variant: '', // , e.g. 'error'\n content: '',\n html: true, // < is content html?,\n width: null,\n hideOnBlur: false\n };\n})(jQuery);\n})();\n","(function() {\n 'use strict';\n\n angular.module('TR')\n .service('breadcrumbDetailsService', breadcrumbDetailsService);\n\n function breadcrumbDetailsService(resourceService, tripService, $routeParams, basketService) {\n const service = {\n getClasses,\n getText,\n getCrumbs,\n getTextShort\n };\n\n function getClasses(bc) {\n return function(c) {\n let currentCrumb = basketService.isFlightPreselected() && bc.crumb === 10 ? 25 : bc.crumb;\n return c < currentCrumb ? 'done' : c === currentCrumb ? 'is-active' : '';\n };\n }\n\n function getText() {\n return {\n 0: resourceService.getDeferred('BREADCRUMBHOME'),\n 5: resourceService.getDeferred('BREADCRUMBDEAL'),\n 10: resourceService.getDeferred('BREADCRUMBFLIGHT'),\n 20: resourceService.getDeferred('BREADCRUMBHOTEL'),\n 21: resourceService.getDeferred('BREADCRUMBROOM'),\n 25: resourceService.getDeferred('BREADCRUMBCHANGEFLIGHT'),\n 30: resourceService.getDeferred('BREADCRUMBTRANSFER'),\n 35: resourceService.getDeferred('BREADCRUMBPARKING'),\n 40: resourceService.getDeferred('BREADCRUMBEXTRAS'),\n 50: resourceService.getDeferred('BREADCRUMBPAYMENT')\n };\n }\n\n function getTextShort() {\n return {\n 0: resourceService.getDeferred('BREADCRUMBHOMESHORT'),\n 20: resourceService.getDeferred('BREADCRUMBHOTELSHORT'),\n 21: resourceService.getDeferred('BREADCRUMBROOMSHORT'),\n 25: resourceService.getDeferred('BREADCRUMBCHANGEFLIGHTSHORT'),\n 40: resourceService.getDeferred('BREADCRUMBEXTRASSHORT'),\n 50: resourceService.getDeferred('BREADCRUMBPAYMENTSHORT')\n };\n }\n\n function getCrumbs() {\n return tripService.getTrip($routeParams.tripId).then(function(trip) {\n if (trip && trip.Deal) {\n return [5, 21, 50];\n }\n if (!trip.FlightsRequest.SelectedFlight) {\n return [];\n }\n if ((basketService.isFlightPreselected() && trip.TripType === tripService.tripTypes.Holiday) ||\n TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\n\n let destination = trip.HotelsRequest.Destination;\n return destination.Type === 1 && destination.HotelCount && destination.HotelCount > 0\n ? [0, 21, 25, 40, 50]\n : [0, 20, 21, 25, 40, 50];\n }\n switch (trip.TripType) {\n case 1: //flight\n return [0, 10, 40, 50];\n case 2: //hotel\n return [0, 20, 21, 50];\n case 3: //transfer\n return [0, 30, 50];\n case 4: //holiday\n return [0, 10, 20, 21, 40, 50];\n case 5: // marhaba\n return []; // ?\n case 6: // parking\n return [0, 35, 50];\n default:\n return [];\n }\n });\n }\n\n return service;\n }\n})();\n","/**\n * Created by bdickson on 04/12/2015.\n */\n\nnamespace TR {\n\n type ILoggingService = Core.ILoggingService;\n\n export class TrustpilotService {\n\n private apiRootUrl: string = 'https://api.trustpilot.com/v1/business-units/' + TRPCONFIG.Domain.TrustPilotId;\n private apiKey: string = TRPCONFIG.Domain.TrustPilotAPIKey;\n\n constructor (private $http: ng.IHttpService,\n private loggingService: ILoggingService) {\n }\n\n getJsonp (url: string) {\n\n url += (url.indexOf('?') === -1) ? '?' : '&';\n url += 'apikey=' + this.apiKey;\n\n return this.$http.jsonp(url + '&callback=JSON_CALLBACK', {ignoreErrors: true, cache: true })\n .then(\n (res:any) => {\n if (res && angular.isObject(res.data)) {\n return res.data;\n }\n return {};\n },\n (err: any) => {\n this.loggingService\n .logWarn(`Trustpilot api call failed with following response ${JSON.stringify(err)}`);\n return {\n reviews: []\n };\n }\n );\n\n }\n\n getBusinessUnit () {\n return this.getJsonp(this.apiRootUrl);\n }\n\n\n }\n\n angular.module('TR').service('TrustpilotService', TrustpilotService);\n\n}\n\n","'use strict';\n\nnamespace Attractions {\n type TripState = Core.Trip.TripState;\n type TripService = Core.TripService;\n class Attractions {\n\n attractions: any = {\n selected: [],\n occupancy: {}\n };\n\n attractionsAvailabilityBusy: boolean = true;\n getImageUrl: any;\n attractionQuotes: any;\n attractionsTotal: any;\n attractionsDescription: any;\n cheapestAttraction: any;\n\n toggleResults: any;\n showResults: boolean;\n viewInformation: any;\n viewResults: any;\n informationPath: string;\n state: any;\n viewWhatsIncluded: any;\n destination: string;\n\n isHotelJourney: boolean;\n hotel: any;\n constructor(\n private $routeParams,\n private $scope,\n private attractionDetailsService,\n private basketService,\n private basketStore,\n private dateUtil,\n private tripService: TripService,\n private broker: Core.Broker\n ) {\n\n var at = this;\n\n tripService.getTrip($routeParams.tripId).then(function (trip: TripState) {\n var basketId = trip.BasketId,\n tripId = trip.TripId,\n attractionSearchId = trip.AttractionRequest ? trip.AttractionRequest.AvailabilitySearchId : null;\n at.destination = trip.HotelsRequest && trip.HotelsRequest.Destination ?\n trip.HotelsRequest.Destination['Title'] : '';\n basketStore.attraction(basketId).then(function (results) {\n var occupancyMap = {},\n // Extras attractions format is one product entry with nested data for multiples\n products = results && results[0];\n\n if (products) {\n at.attractions = {\n selected: angular.copy(products.Details.AttractionIds),\n occupancy: angular.copy(products.Details.AttractionRequests)\n };\n }\n\n\n if (TRPCONFIG.Domain.AttractionsExtraEnabled || TRPCONFIG.Domain.AttractionsExtraMobileEnabled) {\n basketStore.flight(basketId).then(function (flight) {\n var flightDate = _.get(flight ,'Details.Itinerary.DepartureDate');\n var dateDiff = dateUtil.dayDiff(flightDate, new Date());\n if (dateDiff >= TRPCONFIG.MinDaysBeforeDeparture || at.isHotelJourney) {\n\n\n basketService.getAttractionQuotes(attractionSearchId, basketId, tripId)\n .then(function (attractionQuotes) {\n at.attractionQuotes = attractionQuotes;\n at.cheapestAttraction = attractionQuotes[0];\n at.attractionsAvailabilityBusy = false;\n\n at.cheapestAttraction = getCheapest(at.attractionQuotes);\n\n function getCheapest(quotes) {\n const hasAdult = _.filter(quotes, (a: any) => {\n return a.Prices[0].Price > 0;\n });\n return _.minBy(hasAdult, (a: any) => {\n return a.Prices[0].Price;\n });\n }\n\n _updateSubtitle();\n var stopAttractionWatch = $scope.$watch('at.attractions',\n _attractionsWatch, true);\n\n angular.forEach(attractionQuotes, function (a) {\n occupancyMap[a.AttractionId] = at.attractions.occupancy[a.AttractionId] || {\n Adult: a.Prices[0].Count,\n Child: a.Prices[1].Count,\n Infant: a.Prices[2].Count\n };\n\n });\n // angular copy throwing digest loops in ie9, ie10\n at.attractions.occupancy = $.extend(true, {}, occupancyMap);\n\n function _attractionsWatch(val, oldval) {\n if (val == null || angular.equals(val, oldval) || !val.selected) {\n return;\n }\n if (val.selected.length > 0 && _validateAttractionOccupancy(val, oldval)) {\n tripService.getTrip(tripId).then(t => {\n attractionSearchId = t.AttractionRequest.AvailabilitySearchId;\n basketStore.putAttractionExtras(attractionSearchId, val, basketId)\n .then(() => basketService.updateBasket())\n .then(() => basketStore.attractionCost(basketId))\n .then(cost => {\n at.attractionsTotal = cost;\n _updateSubtitle();\n });\n });\n } else {\n basketStore.removeAttraction(basketId).then(basketService.updateBasket);\n at.attractionsTotal = 0;\n _updateSubtitle();\n }\n }\n\n function _validateAttractionOccupancy(val, oldval) {\n var selectedOriginal = angular.copy(val);\n var valid = false;\n var occupacyChange = false;\n angular.forEach(selectedOriginal.selected, function (attractionId, index) {\n var attrOcc = val.occupancy[attractionId];\n occupacyChange = _.some(attrOcc,\n (occ:any, type:any) => type !== 'Infant' && occ);\n if (occupacyChange) {\n valid = true;\n } else {\n if (val.selected.length <= oldval.selected.length) {\n val.selected.splice(index, 1);\n }\n stopAttractionWatch();\n var attrOccu = occupancyMap[attractionId];\n val.occupancy[attractionId] = angular.copy(attrOccu);\n stopAttractionWatch = $scope.$watch('at.attractions',\n _attractionsWatch, true);\n }\n });\n return valid;\n }\n\n });\n\n basketStore.attractionCost(basketId).then(function (cost) {\n at.attractionsTotal = cost;\n });\n\n } else {\n at.attractionsAvailabilityBusy = false;\n }\n });\n }\n\n\n }).then(null, basketService.restartHolidayWorkflow);\n\n function _updateSubtitle() {\n let subTitle = '';\n if (at.attractionQuotes && at.attractions.selected.length) {\n angular.forEach(at.attractions.selected, id => {\n let quote = _.find(at.attractionQuotes, (a:any) => id === a.AttractionId);\n if (quote) {\n subTitle += quote.ShortTitle + '
        ';\n }\n });\n }\n at.attractionsDescription = subTitle;\n }\n\n }, basketService.bookingAlreadyDone(`attractions: '${$routeParams.tripId}'`));\n\n at.getImageUrl = attractionDetailsService.getImageUrl;\n\n at.toggleResults = function(e) {\n e.preventDefault();\n at.showResults = !at.showResults;\n at.state.showInformation = false;\n };\n\n at.state = {\n showInformation: false,\n informationRequested: false,\n informationLoaded: false\n };\n\n at.viewInformation = function(e, id) {\n e.preventDefault();\n at.informationPath = 'partials/holidays/attractionmoreinformation/' + id;\n at.state.showInformation = true;\n broker.publish('attractionsInformationRequested');\n };\n\n at.viewWhatsIncluded = function(e, id) {\n e.preventDefault();\n at.informationPath = `partials/holidays/attractionwhatsincluded/${id}`;\n at.state.showInformation = true;\n broker.publish('attractionsInformationRequested');\n };\n\n at.$scope.$on('$includeContentRequested', function(args) {\n at.state.informationRequested = true;\n at.state.informationLoaded = false;\n\n });\n\n at.$scope.$on('$includeContentLoaded', function(args) {\n at.state.informationLoaded = true;\n });\n\n at.viewResults = function(e) {\n e.preventDefault();\n at.state.showInformation = false;\n };\n }\n }\n\n angular\n .module('attractions')\n .controller('Attractions', Attractions);\n\n}\n","'use strict';\n\nnamespace Attractions {\n\n import Broker = Core.Broker;\n class BasketItem {\n\n // From response\n Title: string;\n Description: any;\n Date: string;\n LineItemId: string;\n ProductId: string;\n Tickets: {\n Label: string;\n Key: string;\n Value: string;\n Currency: string;\n Price: number;\n Ages: string;\n Id: string;\n }[];\n\n // UI\n Changes: any = {};\n Totals: any = {};\n SelectedDate: string;\n Validity:any = {};\n\n\n constructor (responseData,\n private attractionService) {\n angular.extend(this, responseData);\n this.orderTickets();\n this.updateTotals();\n this.setDates();\n }\n\n onChange (changes): void {\n angular.extend(this.Changes, changes);\n this.updateTotals();\n }\n\n orderTickets (): void {\n let order = {};\n this.Tickets.forEach(o => {\n let key = o.Key;\n order[key] = /adult/.test(key) ? 0 :\n /:child/.test(key) ? 1 : 2; // i.e. not ':youngchild'\n });\n this.Tickets.sort((a, b): number =>\n order[a.Key] < order[b.Key] ? -1 :\n order[a.Key] > order[b.Key] ? 1 : 0\n );\n }\n\n flushChanges (): void {\n let changes = this.Changes;\n this.Changes = {};\n return changes;\n }\n\n updateTotals (): void {\n this.Totals = {total: 0};\n this.Tickets.forEach(o => {\n let amount = Number(o.Value || 0) * Number(o.Price || 0);\n this.Totals[o.Key] = amount;\n this.Totals.total += amount;\n });\n }\n\n setDates (): void {\n const dates = this.attractionService.getLineItemDates(this);\n this.SelectedDate = dates.selected;\n this.Validity = dates.from && dates.to\n ? {from: dates.from, to: dates.to} : null;\n }\n }\n\n class AttractionsBasket {\n\n items: any[] = [];\n basketId: string;\n totalPrice: number = 0;\n initialising: boolean = true;\n loading: boolean = false;\n error: boolean = false;\n debouncedUpdate: Function;\n\n\n constructor (\n private $scope: ng.IScope,\n private $timeout: ng.ITimeoutService,\n private $routeParams: any,\n private $location: ng.ILocationService,\n private $http: ng.IHttpService,\n private attractionService: any,\n private basketService: any,\n private basketStore: any,\n private broker: Broker,\n private attractionDetailsService: any\n ) {\n this.debouncedUpdate = _.debounce(p => this.update(p), 400);\n\n basketStore.getAttractionsBasket()\n .then(basket => {\n this.basketId = basket.BasketId;\n this.setBasketItems(basket.LineItems);\n this.initialising = false;\n });\n }\n\n setBasketItems (lineItems = []): void {\n this.items = [];\n\n if (lineItems.length) {\n lineItems.forEach(lineItem => {\n let item = new BasketItem(lineItem, this.attractionService);\n\n item.Tickets.forEach(ticket => {\n this.$scope.$watch(\n () => ticket.Value,\n (v, oldV) => {\n if (v != null && v !== oldV && !this.error) {\n item.onChange({\n [ticket.Key]: v\n });\n this.updateTotalPrice();\n this.debouncedUpdate(item);\n }\n }\n );\n });\n this.items.push(item);\n });\n }\n this.updateTotalPrice();\n this.broker.publish('attractionsBasketUpdated');\n }\n\n update (item: BasketItem): void {\n // Do nothing if no tickets remain selected\n if (this.totalPrice) {\n this.loading = true;\n this.basketStore.updateAttraction(\n item.LineItemId,\n item.flushChanges(),\n this.basketId\n ).then(res => {\n if (res.error) {\n this.error = true;\n return;\n }\n this.error = false;\n this.loading = false;\n let basket = res.Basket;\n this.setBasketItems(basket && basket.LineItems);\n });\n }\n }\n\n remove (item: BasketItem) {\n this.basketStore.removeAttractionsLineItem(\n item.LineItemId,\n this.basketId\n ).then(res => {\n if (res.error) {\n this.error = true;\n return;\n }\n this.error = false;\n let basket = res.Basket;\n this.setBasketItems(basket && basket.LineItems);\n });\n }\n\n updateTotalPrice (): void {\n this.totalPrice = this.items.reduce(\n (prev: number, item: any) => prev + item.Totals.total, 0);\n }\n\n book (): void {\n if (this.totalPrice && !this.error) {\n this.loading = true;\n this.basketService.bookAttractionsBasket();\n }\n }\n }\n\n angular\n .module('attractions')\n .controller('AttractionsBasket', AttractionsBasket);\n}\n","'use strict';\n\nnamespace Attractions {\n\n class AttractionsBasketModal {\n\n lineItems: any[];\n total: number;\n\n constructor (\n private $location: ng.ILocationService,\n private $scope: ng.IScope,\n private modalService: any,\n private broker: any\n ) {\n broker.subscribe('AttractionsBasketModal', 'modal:ready', () => {\n this.total = modalService.get('total');\n this.lineItems = modalService.get('lineItems');\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('AttractionsBasketModal');\n });\n }\n\n continueShopping (): void {\n this.modalService.close();\n }\n\n viewBasket (): void {\n this.$location.path('attractions/basket');\n }\n }\n\n angular\n .module('attractions')\n .controller('AttractionsBasketModal', AttractionsBasketModal);\n}\n","'use strict';\nnamespace Attractions {\n class AttractionsHeaderPanel {\n\n teaserPrice: number;\n debouncedUpdateTeaserPrice: Function;\n\n // Attributes\n product: any = this.product();\n productId: string;\n chooseAgainUrl: string;\n title: string;\n\n\n constructor (\n private $location: ng.ILocationService,\n private $scope: ng.IScope,\n private productService,\n private broker\n ) {\n this.debouncedUpdateTeaserPrice = _.debounce(p => this.updateTeaserPrice(p), 100);\n\n if (!this.chooseAgainUrl) {\n this.chooseAgainUrl = 'attractions';\n }\n\n let qsTags = $location.search();\n if (qsTags) {\n angular.extend(this.product, {Tags: qsTags});\n }\n\n broker.subscribe(\n 'attractionsHeaderPanel',\n 'attractionsProductUpdate',\n res => this.debouncedUpdateTeaserPrice({Tags: res.data})\n );\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('attractionsHeaderPanel');\n });\n }\n\n updateTeaserPrice (productData?): void {\n if (this.product) {\n const date = _.get(productData, 'Tags.date', null);\n let product = angular.extend(\n {\n DomainId: TRPCONFIG.Domain.DomainId,\n Currency: TRPCONFIG.Domain.CurrencyCode\n },\n this.product,\n date === null ? { Tags : _.omit(productData.Tags,('date')) } : productData\n );\n\n this.productService.getTeaserPrices('attraction', [product])\n .then(res => {\n const resKey = Object.keys(res)[0];\n if(resKey) {\n const first = res[resKey];\n const adultPrice = _.find(first.Prices, {Type: 'Adult'});\n const price:any = adultPrice || (Array.isArray(first.Prices) && first.Prices.length\n ? first.Prices[0] : null);\n this.teaserPrice = price && price.Price;\n }\n });\n }\n }\n }\n\n angular\n .module('attractions')\n .directive('attractionsHeaderPanel', (): ng.IDirective => {\n return {\n restrict: 'E',\n transclude: true,\n replace: true,\n scope: {},\n bindToController: {\n product: '&',\n productId: '@',\n chooseAgainUrl: '@',\n panelTitle: '@'\n },\n controller: AttractionsHeaderPanel,\n controllerAs: 'hp',\n templateUrl: 'partials/attractions/headerpanel'\n };\n });\n}\n","'use strict';\n\nnamespace Attractions {\n\n class AttractionsProductForm {\n\n areaInfo: any;\n stepsData: any[] = [];\n priceData: any = {};\n formModel: any = {};\n totalPrice: number;\n dateLimits: any = {};\n initialised: boolean = false;\n initTimer: ng.IPromise;\n loading: boolean = false;\n throttledUpdateTotalPrice: () => void;\n throttledUpdatePrices: () => void;\n infoModal: any = {};\n infoText: any = {};\n normalisedValues: any = {};\n\n // Attributes\n productId: string;\n\n\n constructor (\n private $scope: any,\n private $timeout: ng.ITimeoutService,\n private $routeParams: ng.route.IRouteParamsService,\n private $location: ng.ILocationService,\n private attractionService: any,\n private attractionSearchValidator: any,\n private dateUtil: any,\n private basketService: any,\n private broker: any,\n private modalService: any,\n private Area: any,\n private resourceService: Core.ResourceService,\n private cmsUtils: any\n ) {\n this.areaInfo = Area['attractions'];\n this.fetchCriteria();\n this.dateLimits = {\n startDateMin: this.dateUtil.todayPlus(0, 0, true),\n activeDateFrom: this.dateUtil.todayPlus(7, 0, true)\n };\n this.throttledUpdateTotalPrice = _.throttle(() => this.updateTotalPrice(), 100);\n this.throttledUpdatePrices = _.throttle(() => this.updatePrices(), 100);\n\n broker.subscribe('attractionsProductForm', 'tabProductOptionSelected',\n e => _.forEach(e.data || {}, (v, k:string) => this.changeField(k, v))\n );\n\n // Show spinner if delayed\n this.initTimer = $timeout(() => this.loading = true, 1000);\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('attractionsProductForm');\n });\n }\n\n fetchCriteria(): void {\n this.attractionService.getProductFormCriteria(this.productId)\n .then(res => {\n let qsTags = this.$location.search();\n if (qsTags) {\n angular.extend(this.formModel, qsTags);\n }\n this.$timeout.cancel(this.initTimer);\n this.initialised = true;\n this.loading = false;\n this.stepsData = res.Steps;\n\n if (Array.isArray(this.stepsData)) {\n this.stepsData.forEach(item => {\n this.mapNormalisedValues(item);\n\n item.Fields.forEach(field => {\n if (field.Type.toLowerCase() === 'group') {\n this.formModel[field.Key] = 1;\n }\n });\n\n if (item.Info) {\n this.infoModal[ item.Info.ResourceKey ] = false;\n this.infoText[ item.Info.ResourceKey ] = {\n header: this.resourceService.get( item.Info.ResourceKey + ':HEADER'),\n body: this.resourceService.get( item.Info.ResourceKey)\n };\n }\n });\n }\n });\n }\n\n setPriceData(key: string, price: string): void {\n this.priceData[key] = {\n price: price\n };\n }\n\n initField (fieldKey: string, value: any, allowUnknown?: boolean): void {\n // Set initial value, unless already populated\n if (this.formModel[fieldKey] == null) {\n this.changeField(fieldKey, value, allowUnknown);\n }\n }\n\n changeField (fieldKey: string, value: any, allowUnknown?: boolean): void {\n // NOTE: only allows existing option values unless `allowUnknown` is true\n let isUpdate;\n if (allowUnknown) {\n this.formModel[fieldKey] = value;\n isUpdate = true;\n }\n else {\n const existingVal = this.getMatchedValue(value);\n if (existingVal != null) {\n this.formModel[fieldKey] = existingVal;\n isUpdate = true;\n }\n }\n if (isUpdate) {\n this.publishUpdate();\n this.throttledUpdateTotalPrice();\n }\n }\n\n fieldChangeHandler (affectsPrices: boolean = false): void {\n this.changeField('date', null, true);\n this.publishUpdate();\n if (affectsPrices) {\n this.throttledUpdatePrices();\n }\n else {\n this.throttledUpdateTotalPrice();\n }\n }\n\n publishUpdate (): void {\n this.broker.publish('attractionsProductUpdate', this.formModel);\n }\n\n mapNormalisedValues (step): void {\n // Map existing field values for normalised comparison with CMS values\n const map = {};\n const fields = step.Fields || [];\n fields.forEach(field => {\n if (field.Data) {\n field.Data.forEach(op => {\n map[this.cmsUtils.normaliseValue(op.Value)] = op.Value;\n });\n }\n });\n angular.extend(this.normalisedValues, map);\n }\n\n getMatchedValue (value: any): string {\n return this.normalisedValues[\n this.cmsUtils.normaliseValue(value)\n ];\n }\n\n isDateMatch(d1: string = '', d2: string = ''): boolean {\n // Dates may or may not end with '.000Z'\n return d1.split('.')[0] === d2.split('.')[0];\n }\n\n updatePrices(): void {\n if (this.formModel.date) {\n this.loading = true;\n\n this.attractionService.getAvailability(\n this.productId,\n angular.extend({}, this.formModel)\n )\n .then(res => {\n if (res.error) {\n this.totalPrice = 0;\n }\n else {\n this.loading = false;\n res.Dates.forEach(o => {\n if (this.isDateMatch(o.Date, this.formModel.date)) {\n o.Tickets.forEach(d => {\n this.setPriceData(d.Key, d.Price);\n });\n }\n });\n this.throttledUpdateTotalPrice();\n }\n });\n }\n }\n\n updateTotalPrice (): void {\n let total = 0;\n _.each(this.formModel, (v: any, k: string) => {\n let priceData = this.priceData[k],\n price = priceData && priceData.price;\n if (price) {\n total += (price * v);\n }\n });\n this.$scope.$evalAsync(() => {\n this.totalPrice = total;\n });\n }\n\n book(): void {\n let errors = this.attractionSearchValidator.validate(this.formModel);\n if (errors.length) {\n this.$scope.$emit('flash:error', errors);\n }\n else {\n this.loading = true;\n this.$scope.$emit('flash:hide');\n\n this.basketService.startWorkflow(this.areaInfo.flow, {\n productId: this.productId,\n productTags: this.formModel\n })\n .then(lineItems => {\n this.loading = false;\n this.modalService.launch('partials/attractions/BasketModal', {\n lineItems: lineItems,\n total: this.attractionService.getProductTotals(lineItems).price\n });\n });\n }\n }\n }\n\n angular\n .module('attractions')\n .directive('attractionsProductForm', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n bindToController: {\n productId: '@' // From CMS\n },\n controller: AttractionsProductForm,\n controllerAs: 'pf',\n templateUrl: 'partials/attractions/productform'\n };\n });\n}\n","/// \n'use strict';\nnamespace Attractions {\n const KEY_ENTER = 13;\n class AttractionsSearch extends Autocompleter.AutocompleterField {\n\n private selectAttrFn: (item: any) => void;\n public areaOverride: string = 'attractions';\n public selectedData: any;\n public searchId: string;\n\n constructor (\n public $scope: any,\n public $element: JQuery,\n public $parse: ng.IParseService,\n public $route: ng.route.IRouteService,\n public autocompleter: any,\n public resourceService: Core.ResourceService,\n public attractionService: any,\n public $location: ng.ILocationService,\n public $q: ng.IQService\n ) {\n super();\n\n // Watch for initial value\n const unwatchInit = this.$scope.$watch('ac.currentValue', item => {\n if (item && item.Title) {\n this.prefix = item.Title;\n unwatchInit();\n }\n });\n\n // Wrap `select` attribute fn\n this.selectAttrFn = this.select;\n this.select = (item) => {\n this.selectAttrFn({item: item});\n this.selectItem(item);\n };\n\n $scope.$on('fieldOptionSelected', (e, data) => {\n this.selectedData = data;\n });\n }\n\n search(): void {\n if (this.selectedData) {\n this.attractionService.trackAttractionSearch(\n this.searchId,\n this.selectedData.Id,\n this.selectedData.Title\n );\n this.selectedData.Route ? this.$location.url(this.selectedData.Route) : this.showError(null);\n } else {\n if (this.inputField && this.inputField.val().length) {\n this.automaticSearch();\n } else {\n this.showError(null);\n }\n }\n }\n\n automaticSearch(): void {\n if (this.selectedData) {\n this.search();\n } else {\n this.fetch().then(res => {\n this.update(res);\n if (this.data) {\n this.selectedData = this.data[0];\n this.search();\n } else {\n this.showError(null);\n }\n });\n }\n }\n\n update (result: any): void {\n let options = result.data.Results;\n\n if (this.selectedData) {\n /// On update reset previously selected data.\n this.selectedData = null;\n }\n\n if (options.length) {\n this.searchId = result.data.SearchId;\n this.data = options.map((item:any) => {\n return {\n Title: item.Name,\n Id: item.Id,\n Value: item.Value,\n Route: item.Route\n };\n });\n } else {\n this.data = null;\n //this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n }\n\n selectItem (item: any): void {\n if (item && item.Title) {\n this.prefix = item.Title;\n }\n }\n\n showError(e): void {\n this.$scope.$emit('flash:error', this.resourceService.get('NOATTRACTIONURL'));\n }\n }\n\n angular\n .module('TR')\n .directive('attractionsSearch', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'ac',\n bindToController: {\n placeholder: '@',\n select: '&',\n deselect: '&',\n currentValue: '=',\n areaOverride: '@',\n focusTracker: '=',\n minPrefix: '@',\n notActive: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=AttractionsAutocompleter',\n controller: AttractionsSearch,\n transclude: true,\n compile: (el: any, attrs: any, transclude: any) => {\n return $scope => {\n transclude($scope, clone => {\n el.append(clone);\n $scope.ac.inputField = el.find('input');\n $scope.ac.inputField.on('keyup', e => {\n if(KEY_ENTER === e.keyCode && $scope.ac.inputField.val().length > 2) {\n $scope.ac.automaticSearch();\n } else {\n $scope.ac.selectedData = null;\n }\n });\n });\n };\n }\n };\n });\n}\n","'use strict';\nnamespace Attractions {\n\n enum ShowBeforeOrAfter {\n Both, Before, After\n }\n\n interface ComboItem {\n Url: string|null;\n NewWindow: boolean;\n Title: string|null;\n Description: string|null;\n FastPass: boolean;\n FreeParking: boolean;\n MemoryMaker: boolean;\n DinnerCard: boolean;\n ParksIncluded: number[];\n Prices: ComboItemPrice[];\n ShowBeforeOrAfter: number;\n };\n\n interface ComboItemPrice {\n Currency: string;\n Key: string|null;\n Price: number;\n Type: string;\n }\n\n interface ComboFilter {\n id:number;\n img: string;\n title: string;\n included:never[]|ComboIncluded[];\n };\n\n interface ComboIncluded {\n img: string;\n title: string;\n available: ShowBeforeOrAfter;\n }\n\n class ThemeParkCombo {\n private comboItems:ComboItem[];\n private comboFilters:ComboFilter[];\n private checkedFilters: {[key:string]:boolean};\n private showMobileFilters:boolean = false;\n private pricesSorted:boolean = false;\n private afterDateVal:string = '2017-05-01T00:00:00.000Z';\n private afterDate:boolean = false; // Value of the toggle filter\n private isAfterDate:boolean = false; // True if today is actually after the afterDateVal\n private hasItems:boolean = true;\n\n constructor() {\n this.isAfterDate = this.checkIsAfterDate();\n this.comboFilters = [\n { id: 1\n , img: 'disney_logos/WDW-blk.jpg'\n , title: 'Walt Disney World Resort'\n , included: [\n { img: 'disney_logos/Disneys_Magic_Kingdom.jpg'\n , title: 'Magic Kingdom'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'disney_logos/Disneys_Animal_Kingdom.jpg'\n , title: 'Animal Kingdom'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'disney_logos/Disneys_Epcot.jpg'\n , title: 'Epcot'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'disney_logos/Disneys_Blizzard_Beach.jpg'\n , title: 'Blizzard Beach Water Park'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'disney_logos/Disneys_Hollywood_Studios.jpg'\n , title: 'Disney\\'s Hollywood Studios'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'disney_logos/Disneys_Typhoon_Lagoon.jpg'\n , title: 'Typhoon Lagoon Water Park'\n , available: ShowBeforeOrAfter.Both\n }]\n },\n { id: 2\n , img: 'seaworld_logos/SeaWorld-All.jpg'\n , title: 'SeaWorld Parks'\n , included: [\n { img: 'seaworld_logos/SeaWorld.jpg'\n , title: 'SeaWorld'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'seaworld_logos/Busch_Gardens.jpg'\n , title: 'Busch Gardens'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'seaworld_logos/Aquatica.jpg'\n , title: 'Aquatica'\n , available: ShowBeforeOrAfter.Both\n }]\n },\n { id: 3\n , img: 'universal_logos/Universal_Studios.png'\n , title: 'Universal Orlando Resort™'\n , included: [\n { img: 'universal_logos/universal-studios-florida.png'\n , title: 'Universal Studios Florida™'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'universal_logos/Universal_Island_of_Adventure.jpg'\n , title: 'Universal\\'s Islands Of Adventure™'\n , available: ShowBeforeOrAfter.Both\n },\n { img: 'universal_logos/Universal_Volcano_Bay.jpg'\n , title: 'Universal\\'s Volcano Bay™'\n , available: ShowBeforeOrAfter.After\n }]\n },\n { id: 4\n , img: 'legoland/Legoland.jpg'\n , title: 'LEGOLAND Florida Resort'\n , included: []\n },\n { id: 5\n , img: 'kennedy-space-center/kennedy-space-center.jpg'\n , title: 'Kennedy Space Center'\n , included: []\n }\n ];\n }\n\n getItems():ComboItem[] {\n if (!this.pricesSorted) {\n this.pricesSorted = true;\n this.comboItems.map((item:ComboItem) =>\n item.Prices = item.Prices.sort((a:ComboItemPrice, b:ComboItemPrice):number =>\n a.Type.toLowerCase() === 'adult' ? -1 : 1));\n }\n\n const selectedParkIds:number[] = _.map(this.checkedFilters, (val:boolean, key:string) =>\n val ? parseInt(key, 10) : 0).filter((val:number) => val > 0);\n\n const beforeOrAfterItems = this.comboItems.filter((item:ComboItem) =>\n (item.ShowBeforeOrAfter === ShowBeforeOrAfter.Both)\n || (item.ShowBeforeOrAfter === ShowBeforeOrAfter.Before && !this.afterDate)\n || (item.ShowBeforeOrAfter === ShowBeforeOrAfter.After && this.afterDate));\n\n const filteredItems = !selectedParkIds.length ? beforeOrAfterItems :\n beforeOrAfterItems.filter((item:ComboItem) => {\n const filterId:number = item.ParksIncluded\n .reduce((res:number, val:number) => res|Math.pow(2, val-1), 0);\n return selectedParkIds\n .map((parkId:number) => Math.pow(2, parkId-1) & filterId)\n .every((parkFilterId:number) => parkFilterId > 0);\n });\n\n this.hasItems = filteredItems.length > 0;\n return filteredItems;\n }\n\n getFilters(limit:number|undefined):ComboFilter[] {\n return (typeof limit === 'number' && limit > 0) ? this.comboFilters.slice(0, limit) : this.comboFilters;\n }\n\n getFilter(num:number):ComboFilter {\n return this.comboFilters[num - 1];\n }\n\n hasFiltersSelected():boolean {\n return _.map(this.checkedFilters, (val:boolean, key:string) => val).some((val:boolean) => val);\n }\n\n getSelectedFilters():ComboFilter[] {\n return this.comboFilters.filter((filter:ComboFilter) => this.checkedFilters[filter.id]);\n }\n\n hasIncludedParksToDisplay(included:ComboIncluded[]):boolean {\n return included.map((i:ComboIncluded) => this.showIncludedPark(i)).some(t => t);\n }\n\n showIncludedPark(item:ComboIncluded):boolean {\n return item.available === ShowBeforeOrAfter.Both\n || (item.available === ShowBeforeOrAfter.Before && !(this.afterDate || this.isAfterDate))\n || (item.available === ShowBeforeOrAfter.After && (this.afterDate || this.isAfterDate));\n }\n\n includesPark(parkId:number, comboItem:ComboItem):boolean {\n return comboItem.ParksIncluded.indexOf(parkId) > -1;\n }\n\n includesParkClass(parkId:number, comboItem:ComboItem):string {\n return this.includesPark(parkId, comboItem) ? 'icon-check' : 'icon-close';\n }\n\n checkIsAfterDate():boolean {\n return (new Date()) > (new Date(this.afterDateVal));\n }\n }\n\n angular\n .module('TR')\n .directive('themeParkCombo', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {},\n bindToController: {\n comboItems: '='\n },\n controller: ThemeParkCombo,\n controllerAs: 'tpc',\n compile: (el: any, attrs: any, transclude: any) =>\n $scope => transclude($scope, clone => el.append(clone))\n };\n });\n}\n","'use strict';\n\nnamespace Attractions {\n\n type AttractionDetails = Core.Booking.AttractionDetails;\n type TripService = Core.TripService;\n type IHttpService = Core.IHttpService;\n\n angular\n .module('attractions')\n .service('attractionService', attractionService);\n\n\n function attractionService($q,\n $http: IHttpService,\n tripService: TripService,\n analytics,\n dateUtil) {\n var domain = TRPCONFIG.Domain,\n apiUrl = '/api2/attractions',\n service = {\n trackAttractionSearch,\n getProductName,\n getProductFormCriteria,\n getAvailability,\n getProductTotals,\n getLineItemChanges,\n getAttractionQuotes,\n getAttractionQuotesFromSession,\n getOccupancy,\n getLineItemDates,\n getAttractionsDesc\n };\n\n function getAttractionsDesc(attractions, attractionDetails: AttractionDetails[], id) {\n let desc = '';\n let prefDate = '';\n const product = _.find(attractions,\n (a: any) => a.Details && a.Details.AttractionRequests[id]\n );\n const details = _.find(attractionDetails, {\n ProductId: id\n });\n\n if (product) {\n const attractionIds = _.get(product, 'Details.AttractionIds');\n const i = attractionIds && attractionIds.indexOf(id);\n const cb = product.CostBreakdown;\n\n if (cb && i != null) {\n desc = cb[i].Description;\n }\n if (details) {\n prefDate = dateUtil.format(\n dateUtil.parseDate(details.PreferredDate)\n ) + ', ';\n }\n }\n return prefDate + desc;\n };\n\n function trackAttractionSearch(searchId, itemId, itemName) {\n return $http.post(\n apiUrl + '/analytics/autocompleter/selection',\n {\n SearchId: searchId,\n SelectedItemId: itemId,\n SelectedItemName: itemName\n },\n {ignoreErrors: true}\n );\n }\n\n function getProductName(productId) {\n return $http.post(\n `${apiUrl}/bookingfunnel/getproduct/${productId}`,\n [],\n {ignoreErrors: true}\n ).then(res => res.data);\n }\n\n function getProductFormCriteria(productId) {\n return $http.post(\n apiUrl + '/bookingfunnel/getcriteria/' + productId\n ).then(res => res.data);\n }\n\n function getAvailability(productId, tags) {\n // Standardise date to first of month\n let date = new Date(dateUtil.parseDate(tags.date).getTime());\n date.setDate(1);\n date.setHours(12);\n\n return $http.post(\n apiUrl + '/bookingfunnel/searchavailability',\n {\n Id: productId,\n Tags: angular.extend({}, tags, {date: date}),\n DomainId: domain.DomainId,\n Currency: domain.CurrencyCode\n },\n {ignoreErrors: true}\n ).then(\n res => res.data,\n err => ({error: err})\n );\n }\n\n function getProductTotals(lineItems) {\n let totals = {count: 0, price: 0};\n totals.price = lineItems && lineItems.reduce((total, item) => {\n if (item.Tickets) {\n totals.count++;\n return total + item.Tickets.reduce((t, o) => t + (o.Price * o.Value), 0);\n }\n }, 0);\n return totals;\n }\n\n function getLineItemDates(lineItem) {\n const dates = {\n selected: null,\n from: null,\n to: null\n };\n\n if (lineItem.Description && lineItem.Description.SelectedDate) {\n dates.selected = dateUtil.format(lineItem.Description.SelectedDate);\n }\n\n const validity = lineItem.Description && lineItem.Description.Validity\n ? lineItem.Description.Validity : null;\n\n if (validity) {\n const from = dateUtil.format(validity.From);\n const to = dateUtil.format(validity.To);\n\n if (from && to && !dateUtil.sameDay(validity.From, validity.To)) {\n dates.from = from;\n dates.to = to;\n }\n }\n\n return dates;\n }\n\n function getLineItemChanges(basketData) {\n // Returns lineItems data indicating basket changes\n let lineItems: any = [],\n changeData = basketData.Change,\n modifiedData = changeData && changeData.Modified || [];\n\n modifiedData.forEach(modifiedItem => {\n let LineItemId = modifiedItem.LineItemId,\n basketItem = _.find(basketData.Basket.LineItems, {\n LineItemId: LineItemId\n });\n if (basketItem) {\n lineItems.push(\n _mergeTicketChanges(basketItem, modifiedItem)\n );\n }\n });\n return lineItems;\n }\n\n function _mergeTicketChanges(basketItem, modifiedData) {\n // Merges ticket changes data into basket lineItem data\n // Resulting data indicates ticket changes\n let lineItem = angular.extend({}, basketItem);\n lineItem.Tickets = [];\n\n ['Modified', 'New'].forEach(modificationType => {\n modifiedData[modificationType].forEach(props => {\n let basketTicket = _.find(basketItem.Tickets, {\n Key: props.Key\n });\n if (basketTicket) {\n lineItem.Tickets.push(\n angular.extend({}, basketTicket, props)\n );\n }\n });\n });\n return lineItem;\n }\n\n\n /*\n Attractions extras\n */\n function getAttractionQuotes(tripId, request) {\n var req = angular.extend({\n DomainId: domain.DomainId,\n Currency: domain.CurrencyCode\n }, request);\n analytics.startTimer('AttractionsAvailabilityRequest');\n return $http.post(apiUrl + '/availability/GetCrossSell', req, {ignoreErrors: true}).then(function (res) {\n analytics.endTimer('AttractionsAvailabilityRequest');\n tripService.recordAttractionSearch(tripId, request);\n return res.data.AttractionQuotes;\n });\n }\n\n function getAttractionQuotesFromSession(availabilitySearchId) {\n return $http.post(apiUrl + '/availability/getfromsession', {\n 'AvailabilitySearchId': availabilitySearchId\n }, {ignoreErrors: true}).then(function (res) {\n return res.data.AttractionQuotes;\n });\n }\n\n function getOccupancy(tripId) {\n return tripService.getTripReducedOccupancy(tripId).then(occ => {\n var res: any = [];\n for (var i = 0; i < occ.Adults; i++) {\n res.push({Age: 21, Type: 'Adult'});\n }\n angular.forEach(occ.ChildAges, function (age) {\n res.push({\n Type: age < 2 ? 'Infant' : 'Child',\n Age: age\n });\n });\n return res;\n });\n }\n\n return service;\n\n }\n}\n","'use strict';\n\nnamespace Attractions {\n\n interface IAttractionsProductForm {\n duration: number;\n adultcount: number;\n childcount: number;\n infantcount: number;\n tickettype: string;\n date: string;\n }\n\n class AttractionSearchValidator {\n\n constructor (\n private resourceService: Core.ResourceService\n ) {\n\n }\n\n validate (formModel: IAttractionsProductForm): string[] {\n let errors: string[] = [],\n uiCountTotal = 0;\n\n Object.keys(formModel).forEach(k => {\n if(/ui:count/.test(k)) {\n let v = formModel[k];\n if (!isNaN(v)) {\n uiCountTotal += v * 1;\n }\n }\n });\n\n if (!uiCountTotal) {\n errors.push(this.resourceService.get('ATTRACTIONSSELECTWHO'));\n }\n if (!formModel.date) {\n errors.push(this.resourceService.get('SELECTDATE'));\n }\n\n return errors;\n }\n }\n\n angular\n .module('attractions')\n .service('attractionSearchValidator', AttractionSearchValidator);\n}\n","namespace CMS {\n\n interface HeroCard {\n name: string;\n url: string;\n header: string;\n }\n interface MobileHero {\n elements: string;\n area: string;\n heroes: HeroCard[];\n currentArea: string;\n heroStyle: any;\n sale: string;\n showHero: any;\n }\n interface ControllerScope extends ng.IScope {\n mh: MobileHero;\n }\n interface CurrentRoute extends ng.route.ICurrentRoute {\n area: string;\n }\n interface RouteService extends ng.route.IRouteService {\n current: CurrentRoute;\n }\n\n angular\n .module('cms')\n .component('mobileHero', {\n bindings: {\n elements: '@',\n heroStyle: '=',\n sale: '=',\n },\n controller: function ($scope: ControllerScope, $route: RouteService) {\n const scope : MobileHero = $scope.mh;\n scope.showHero = (name: string) : boolean => {\n const supportsHeroStyle = ['hotels', 'holidays'].indexOf(name) >= 0;\n const supportsSalesStyle = ['hotels', 'holidays'].indexOf(name) >= 0;\n\n if (supportsHeroStyle && scope.heroStyle && scope.heroStyle['background-image'] !== '') {\n return false;\n } else if (supportsSalesStyle && scope.sale && scope.sale !== '') {\n return false;\n }\n\n return true;\n };\n\n scope.currentArea = $route.current.area && $route.current.area.toLowerCase();\n\n const supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(p => p.toLowerCase());\n try {\n const heroes = JSON.parse(scope.elements);\n const heroKeys = _.keys(heroes);\n this.heroes = [];\n heroKeys.forEach(elem =>{\n const url = _.get(heroes, `${elem}`, null);\n const header = _.get(heroes, `${elem}Header`, '');\n let name = elem.toLowerCase();\n if (_.isString(url) && url.replace(/\\s+/,'').length > 0 &&\n supportedProducts.indexOf(name) >= 0 &&\n scope.currentArea === name &&\n scope.showHero(name)) {\n scope.heroes.push({ name, url, header });\n }\n });\n } catch (e) { }\n },\n controllerAs: 'mh',\n template: `\n \n
        \n \n
        \n
        0\"\n class=\"sc-c-container sc-c-container--gutters-x\">\n
        \n

        {{hero.header}}

        \n
        \n
        \n
        \n `\n });\n}\n","namespace CMS {\n\n interface AnalyticsEventData extends ng.IScope {\n type : string;\n name : string;\n properties : Object;\n }\n\n angular\n .module('cms')\n .directive('analyticsEvent', function(analytics) {\n return {\n scope: {\n type : '@',\n name : '@',\n properties : '='\n },\n link : function(scope : AnalyticsEventData) {\n analytics.track(scope.type, scope.name, scope.properties);\n }\n };\n });\n}\n","namespace CMS {\n\n const observable = 'IntersectionObserver' in window;\n\n class CmsComponent {\n pageId : string;\n componentName : string;\n componentId : string;\n inView: boolean;\n lazy: boolean;\n url():string {\n if(!this.inView && this.lazy && observable) {\n return 'loadingcmscomponent.html';\n }\n if(this.componentId) {\n return `cms/component/${this.pageId}/${this.componentId}`;\n } else if(this.componentName) {\n return `cms/component/${this.pageId}/${this.componentName}`;\n } else if(this.pageId) {\n return `cms/component/${this.pageId}`;\n } else {\n return `cms/missing`;\n }\n }\n modal : any;\n rc : any;\n }\n\n angular.module('cms').directive('lazyCms', () => {\n return {\n restrict: 'A',\n require: '^cmsComponent',\n link: (scope, el, attr, controller: CmsComponent) => {\n if (!observable || !controller.lazy) {\n return;\n }\n const observer = new IntersectionObserver(loadContent, {\n rootMargin: '200px 0px 200px 0px'\n });\n observer.observe(el[0]);\n function loadContent(changes) {\n changes.forEach(function (change) {\n if (change.intersectionRatio > 0) {\n observer.unobserve(change.target);\n scope.$apply(() => controller.inView = true);\n }\n });\n }\n }\n };\n });\n\n /*\n The lazy attribute controls whether this component will be loaded lazily based on whether it is\n visible in the viewport\n */\n angular.module('cms').directive('cmsComponent', function($timeout) {\n return {\n scope: {},\n replace: true,\n bindToController: {\n data: '=',\n pageId: '@',\n componentName: '@',\n componentId: '@',\n lazy: '<'\n },\n controller: CmsComponent,\n controllerAs: 'cc',\n template: '',\n link: function(scope: ng.IScope, el, attr, controller: CmsComponent) {\n let p:any = scope.$parent;\n while (p != null) {\n if (p['rc'] != null) {\n controller.modal = p['rc'].modal;\n controller.rc = p['rc'];\n p = null;\n } else {\n p = p.$parent;\n }\n }\n }\n };\n });\n}\n","namespace CMS {\n\n interface IMetaData extends ng.IScope {\n title : string;\n description : string;\n keywords : string;\n robots : string;\n }\n\n angular.module('cms').directive('seoMetaData', function() {\n return {\n scope: {\n title : '@',\n description : '@',\n keywords : '@',\n robots : '@'\n },\n replace : false,\n link : function(scope : IMetaData, el, attr) {\n let tags :any = {},\n head = $('head');\n\n if (scope.title) {\n tags.title = `${scope.title}`;\n tags['meta[name=title]'] = ``;\n }\n if (scope.description) {\n tags['meta[name=description]'] = ``;\n }\n if (scope.keywords) {\n tags['meta[name=keywords]'] = ``;\n }\n if (scope.robots) {\n tags['meta[name=robots]'] = ``;\n }\n\n $.each(tags, (selector, html) => {\n $(selector).remove();\n head.append(html);\n });\n }\n };\n });\n}\n","\nnamespace Core.AdHoc {\n\n /// Duration unit enum\n export enum DurationUnitSingular {\n Hour = 1, Day\n }\n\n export enum DurationUnitPlural {\n Hours = 1, Days\n }\n\n export interface AdHocAvailabilityType {\n Id: number;\n Title: string;\n }\n\n export interface AdHocProductTypesRequest {\n CultureCode: string;\n DomainId: number;\n }\n\n /// availability/get\n export interface AdHoc {\n AvailabilityId: string;\n AdHocOptions: AdHocOptions[];\n }\n\n export interface AdHocOptions {\n Id: number;\n TypeId: number;\n Supplier: Supplier;\n Title: string;\n CanOverrideTitle: boolean;\n RequiresPassengers: boolean;\n RequiresQuantity: boolean;\n RequiresSupplierRef: boolean;\n SupplierUnitCost: number;\n SupplierChildCost: number;\n SupplierCurrency: string;\n CanOverrideSupplierCost: boolean;\n PickUpLocation: string;\n DropOffLocation: string;\n Availability: AdHocAvailability[];\n ClientUnitCost: number;\n ClientChildCost: number;\n ClientCurrency: string;\n CanOverrideClientCost: boolean;\n MaximumChildAge: number;\n Duration: AdHocDuration;\n IsDateSpecific: boolean;\n IsBookable: boolean;\n CanOverrideCommission: boolean;\n Itinerary: AdHocItinerary[];\n }\n\n export interface AdHocAvailability {\n Date: string;\n SupplierUnitCost: number;\n SupplierChildCost: number;\n ClientUnitCost: number;\n ClientChildCost: number;\n Timing: AdHocTiming[];\n }\n\n export interface AdHocTiming {\n StartTime: string;\n EndTime: string;\n }\n\n export interface AdHocDuration {\n Amount: number;\n Unit: number;\n }\n\n export interface AdHocItinerary {\n Id: number;\n ItemTime: string;\n Description: string;\n }\n\n\n /// availability/get request payload\n export interface AdHocAvailabilityRequest {\n CultureCode: string;\n CurrencyCode: string;\n DomainId: number;\n IsFlightPlus: boolean;\n ProductTypeId: number;\n StartDate: Date;\n EndDate: Date;\n SearchTerm?: string;\n }\n\n\n /// Used in api/adhoc/details/get\n export interface AdHocDetailsGetRequest {\n AvailabilityId: string;\n Product: {\n Id: string;\n ProductId: number | null;\n Title: string | null;\n Date: string | null;\n Time: string;\n Adults: number;\n ChildAges: number[];\n Quantity: number;\n SupplierRef: string | null;\n SupplierUnitCost: number | null;\n SupplierChildCost: number | null;\n ClientUnitCost: number | null;\n ClientChildCost: number | null;\n ManualCommissionAmount: number | null;\n PickUpLocation: string | null;\n DropOffLocation: string | null;\n };\n }\n\n export interface AdHocDetailsGetResponse {\n AvailabilityId: string;\n DetailsId: string;\n Product: {\n Id: string;\n ProductId: number;\n TypeId: number;\n SupplierId: number;\n Title: string;\n StartDate: Date;\n EndDate: Date;\n Adults: number;\n ChildAges: number[];\n Quantity: number;\n SupplierRef: string;\n SupplierUnitCost: number;\n SupplierChildCost: number;\n ClientUnitCost: number;\n ClientChildCost: number;\n PickUpLocation: string;\n DropOffLocation: string;\n ManualCommissionAmount: number;\n Duration: AdHocDuration;\n Itinerary: AdHocItinerary[];\n IsBookable: boolean;\n IsHidden: boolean;\n IsPriceHidden: boolean;\n };\n }\n\n export interface AdHocAdjustmentRequest {\n BasketId: string;\n AdjustmentId: number;\n Title: string;\n SupplierUnitCost: number;\n SupplierChildCost: number;\n ClientUnitCost: number;\n ClientChildCost: number;\n ManualCommissionAmount: number;\n ExpectedVersion: number;\n }\n\n export interface Supplier {\n Id: number;\n Name: string;\n }\n\n export interface Occupancy {\n Adults: number;\n ChildAges: number[];\n }\n\n export interface BookedItem {\n ProductTypeId: number;\n SupplierId: number;\n Title: string;\n SupplierCost: number;\n ClientCost: number;\n ClientCurrency: string;\n ManualCommissionAmount?: number;\n }\n}\n","namespace Core.Booking {\n\n export enum BookingStatus {\n Complete = 1,\n Alert = 2,\n ThreeDs = 3,\n Error = 4,\n ValidationError = 5,\n TimedOut = 6,\n BookingError = 7,\n PayPalVerification = 8,\n PayPalVerified = 9,\n Cpg = 10,\n Refresh = 13\n }\n\n export interface TrimmedBooking {\n BookingProcessId: string;\n UserData: UserData;\n LinkedBookingId: number | undefined;\n }\n\n export interface Booking extends TrimmedBooking {\n PaymentOptions: PaymentCardType[];\n SavedPaymentCards: SavedPaymentCard[];\n InsuranceBands: InsuranceBand[];\n BookingRules: BookingRules;\n PaymentRules: PaymentRules;\n TermsData: TermsData;\n AcceptanceText: string;\n AgentScripts: KeyValuePairOfStringAndString[];\n DeliveryOptions: DeliveryOption[];\n }\n\n export enum PassengerType {\n None = 0,\n Adult = 1,\n Child = 2,\n Infant = 3,\n AdultSwimmer = 4,\n AdultNonSwimmer = 5,\n ChildSwimmer = 6,\n ChildNonSwimmer = 7,\n }\n\n export interface BookingRules {\n ForcePayment: boolean;\n IsStartDateMandatory: boolean;\n IsEveryPassengerRequired: boolean;\n IsEmailMandatory: boolean;\n IsPostCodeMandatory: boolean;\n EnablePostCodeLookup: boolean;\n AddressRequired: boolean;\n CaptureFlightDetails: boolean;\n CaptureHotelDetails: boolean;\n CaptureExcursionDate: boolean;\n IsDOBRequiredForAllAdults: boolean;\n IsDOBRequiredForAllChildren: boolean;\n IsDOBRequiredForAllInfants: boolean;\n IsFlightPlus: boolean;\n NationalityRequired: boolean;\n CheckCardExpiryAgainstArrivalDate: boolean;\n CaptureSMSAlerts: boolean;\n ShowCardFeeIfZero: boolean;\n LockEmailControls: boolean;\n PassengerTitle: string;\n NumberOfDrivers: number;\n PassengerPrompts: string[];\n CanChangeBusinessCustomer: boolean;\n ShowBusinessCustomerList: boolean;\n WillAutoDebitBalance: boolean;\n CaptureOfficeLocationInAgentMode: boolean;\n CaptureMarhabaConnectingFlight: boolean;\n CaptureChauffeurDetails: boolean;\n AllowChauffeurTimeEdit: boolean;\n ChauffeurMinAdvanceHours: number;\n ChauffeurTimeWindow: number;\n PassengerFirstNameMinLength: number;\n CaptureHolidayStartDate: boolean;\n ProductRules: ProductRules | null | undefined;\n MultiProductBehaviour: boolean;\n }\n\n export interface PaymentRules {\n BalanceAmount: number;\n BalanceDueDate: string;\n BalanceDueWeeksText: string | null;\n IsDepositAllowed: boolean;\n IsFullAmountAllowed: boolean;\n MinimumDepositAmount: number;\n TotalAmount: number;\n TravelAgentCommissionAmount: number;\n TravelAgentVat: number;\n }\n\n export type ProductRules =\n AccommodationProductRules |\n FlightProductRules |\n TransferProductRules;\n\n export interface AccommodationProductRules {\n ProductType: number;\n ProductGuid: string;\n RoomRules: RoomRules[];\n }\n\n export interface RoomRules {\n LinkedBkItemSeqNo: number;\n PassengerRules: PassengerRules;\n RoomNumber: number;\n }\n\n export interface FlightProductRules {\n ProductType: number;\n ProductGuid: string;\n PassengerRules: PassengerRules;\n }\n\n export interface TransferProductRules {\n ProductType: number;\n ProductGuid: string;\n ProposedInboundFlightProductGuid: string;\n ProposedOutboundFlightProductGuid: string;\n PassengerRules: PassengerRules;\n OutboundLeg: TransferLegRules;\n InboundLeg: TransferLegRules;\n }\n\n export interface TransferLegRules {\n CaptureDeparturePointDescription: boolean;\n CaptureDepartureFlightArrivalTime: boolean;\n CaptureDepartureFlightNumber: boolean;\n CaptureDepartureFlightOrigin: boolean;\n CaptureDestinationPointDescription: boolean;\n CaptureDestinationFlightDepartureTime: boolean;\n CaptureDestinationFlightNumber: boolean;\n CaptureDestinationFlightDestination: boolean;\n };\n\n export interface PassengerRules {\n AgeAtDate: string;\n NumAdults: number;\n NumChildren: number;\n NumInfants: number;\n ChildrenAges: number[];\n InfantAges: number[];\n AllAdultsDOBRequired: boolean;\n AllChildrenDOBRequired: boolean;\n AllInfantDOBRequired: boolean;\n }\n\n export interface TermsData {\n Suppliers: number[];\n TransferRateId: number;\n }\n\n export interface UserData {\n Contact: Contact;\n Rooms: Room[];\n PaymentDetails: PaymentDetails;\n ConnectingFlight: ConnectingFlight;\n HotelDetails: HotelDetails;\n ChauffeurDetails: ChauffeurDetails;\n AirportParking: AirportParking;\n AttractionDetails: AttractionDetails[];\n Companions: Companion[];\n RequirementsList: Requirement[];\n HolidayStartDate: string;\n DeliverySupplierId: number;\n ProductDetails: ProductDetails[];\n MultiProductBehaviour: boolean;\n TravelAgent: Agent;\n Notes: Note[];\n InfoItems: InfoItem[] | null | undefined;\n CovidDisclaimer: boolean;\n }\n\n export type ProductDetails =\n ProductPassengerDetails |\n ProductHotelDetails |\n ProductTransferDetails |\n ProductMarhabaDetails;\n\n export interface ProductPassengerDetails {\n ProductGuid: string;\n ProductType: number;\n PassengerList: Core.Booking.Person[];\n }\n\n export interface ProductHotelDetails extends ProductPassengerDetails {\n RequirementsList: Requirement[];\n }\n\n export interface ProductTransferDetails extends ProductPassengerDetails {\n OutboundLeg: ProductDetailsTransferLeg;\n InboundLeg: ProductDetailsTransferLeg;\n }\n\n export interface ProductMarhabaDetails extends ProductPassengerDetails {\n ConnectingFlight: {\n OutboundFlightNumber: string;\n OutboundFlightClass: string;\n };\n }\n\n export interface ProductDetailsTransferLeg {\n DepartureFlightNumber: string;\n DepartureFlightArrivalTime: string;\n DestinationFlightNumber: string;\n DestinationFlightDepartureTime: string;\n DeparturePointDescription?: string;\n DepartureFlightOrigin?: string;\n DestinationPointDescription?: string;\n DestinationFlightDestination?: string;\n }\n\n export interface Person {\n Title: string;\n FirstName: string;\n LastName: string;\n Age: number;\n DateOfBirth: string | undefined;\n Type: PassengerType;\n DriverType: DriverType;\n InsuranceBandId: number;\n LinkedBkItemSeqNo: number;\n LoyaltyNumber: string;\n Id: number;\n PassengerFirstNameMinLength: number;\n Label: string;\n RequiresDob: boolean;\n }\n\n export interface Contact extends Person {\n CountryCode: string;\n PostCode: string;\n Address: string;\n City: string;\n County: string;\n HomeTel: string;\n MobileTel: string;\n WorkTel: string;\n Email: string;\n SendTextAlerts: boolean;\n EmailSignUp: boolean;\n EmailOptOut: boolean;\n AgreeToConditions: boolean;\n BookingCallBack: boolean;\n }\n\n export interface PaymentDetails {\n PaypalDetails: PaypalDetails;\n CardDetails: CardDetails;\n SaveThisCard: boolean;\n CanDebitBalance: boolean;\n DepositAmount: number;\n IsSkippingPayment: boolean;\n PrePaymentID: string;\n PaRes: string;\n MD: string;\n OfficeId: number;\n CustomerId: number;\n CustomerName: string;\n ExternalFopDetails: ExternalFopDetails;\n IsExternalFop: boolean;\n PaymentAmount: number;\n DfReferenceId: string;\n }\n\n export interface ConnectingFlight {\n OutboundFlightNumber: string;\n OutboundDate: string;\n OutboundDepartureAirport: string;\n OutboundDepartureAirportName: string;\n OutboundDestinationAirport: string;\n OutboundDestinationAirportName: string;\n InboundFlightNumber: string;\n InboundDate: string;\n InboundDepartureAirport: string;\n InboundDepartureAirportName: string;\n InboundDestinationAirport: string;\n InboundDestinationAirportName: string;\n InboundFlightClass: string;\n OutboundFlightClass: string;\n }\n\n export interface HotelDetails {\n Name: string;\n Address: string;\n }\n\n export interface ChauffeurDetails {\n Address: string;\n Building: string;\n ContactNo: string;\n Landmark: string;\n PickUpTime: string;\n }\n\n export interface AirportParking {\n CarMake: string;\n CarModel: string;\n CarColour: string;\n CarRegistration: string;\n }\n\n export interface Agent {\n FirstName: string;\n LastName: string;\n Title: string;\n }\n\n export enum DriverType {\n NotADriver = 0,\n MainDriver = 1,\n AdditionalDriver = 2,\n }\n\n export interface PaypalDetails {\n }\n\n export interface CardDetails {\n PaymentTypeId: number | null;\n CardType: number | null;\n CardNumber: string | null;\n MaskedCardNumber: string | null;\n StartDate: any | null;\n ExpiryDate: any | null;\n SecurityCode: string | null;\n IssueNumber: string | null;\n CardId: string | null;\n }\n\n export interface ExternalFopDetails {\n CardType: number | null;\n AuthorisationCode: string | null;\n Note: string | null;\n }\n\n export interface PaymentCardType {\n CardTypeId: number;\n PaymentTypeId: number;\n FeePercent: number;\n FeeAmount: number;\n FeeCap: number;\n Title: string;\n DataCashScheme: string;\n AdminOverride: boolean;\n ImageUrl: string;\n IsBankPayment: boolean;\n Type: string;\n IsPayPalPayment: boolean;\n FullDetails: boolean;\n PreAuthorisationToken: string;\n IsExternalFop: boolean;\n }\n\n export interface SavedPaymentCard {\n CardId: string;\n CardTypeId: number;\n ExpiryYear: number;\n MasterCardTypeId: number;\n ExpiryMonth: number;\n IsExpired: boolean;\n LogoName: string;\n CardName: string;\n MaskedNumber: string;\n }\n\n export interface InsuranceBand {\n Id: number;\n StartAge: number;\n EndAge: number;\n PassengerType: PassengerType;\n Price: number;\n Available: boolean;\n Label: string;\n }\n\n export interface ValueType {\n }\n\n export interface KeyValuePairOfStringAndString extends ValueType {\n Key: string;\n Value: string;\n }\n\n export interface DeliveryOption {\n SupplierId: number;\n Price: number;\n CurrencyCode: string;\n Title: string;\n Selected: boolean;\n }\n\n export interface Room {\n Guests: Person[];\n SpecialRequest: string;\n LinkedBkItemSeqNo: number;\n }\n\n export interface AttractionDetails {\n ProductId: number;\n ProductTitle: string;\n ProductDescription: string;\n PreferredDate: string;\n RestrictionText: string;\n CaptureDate: boolean;\n }\n\n export interface Companion {\n Title: string;\n FirstName: string;\n LastName: string;\n DateOfBirth: string | undefined;\n EstimatedAge: number;\n TravelDate: string;\n LoyaltyNumber: string;\n }\n\n export interface Requirement {\n DisplayRoomNumber: number;\n RequirementsText: string;\n RoomId: number;\n }\n\n export interface Note {\n Id: string;\n Text: string;\n Created: string;\n CreatedById: number;\n CreatedBy: string;\n }\n\n export interface InfoItem {\n Title: string;\n Description: string;\n Important: boolean;\n Voucher: boolean;\n }\n\n export interface BookingResponse {\n Status: CreateBookingStatus;\n Messages: string[];\n BookingReferences: string[];\n ThreeDSecure: ThreedsecureResponse;\n PayPal: PayPalResponse;\n RefreshPrepareBookingResponse: Booking;\n RefreshResponse: RefreshResponse;\n }\n\n export interface RefreshResponse\n {\n Basket: object;\n StaleProducts: ProductAndNewId[];\n }\n\n export interface ProductAndNewId\n {\n Product: RefreshProduct;\n NewProductId: string;\n }\n\n export interface RefreshProduct\n {\n ProductId: string;\n ProductType: number;\n TotalAmount: number;\n }\n\n export enum CreateBookingStatus {\n Complete = 1,\n Alert = 2,\n ThreeDs = 3,\n Error = 4,\n ValidationError = 5,\n TimedOut = 6,\n BookingError = 7,\n PayPalVerification = 8,\n PayPalVerified = 9,\n Cpg = 10,\n Refresh = 13\n }\n\n export interface ThreedsecureResponse {\n AcsUrl: string;\n TermUrl: string;\n PaReq: string;\n TL: string;\n MD: string;\n CanByPass: boolean;\n PrePaymentID: string;\n }\n\n export interface PayPalResponse {\n AcsUrl: string;\n }\n\n export enum ProductType {\n Flight = 1,\n Attraction = 2,\n CarHire = 4,\n Hotel = 8,\n Parking = 16,\n Transfer = 32,\n Insurance = 64,\n Marhaba = 256,\n Cruise = 512\n }\n\n export enum RecentSearchType {\n Flights = 1,\n Hotels = 2,\n Holidays = 3\n }\n\n // This enum is only used client side in order to provide a common type for\n // standard products cross-sells (e.g. transfers/attractions) and\n // flight extras cross sells (e.g. bags/seats)\n export enum CrossSellType {\n Hotels = 1,\n Attractions = 2,\n Transfers = 3,\n CarHire = 4,\n Seats = 5,\n Baggage = 6,\n Parking = 7\n }\n\n}\n","\n// Contracts for TravelRepublic.Manager.Bookings\n// --------------------------------------------------\nnamespace Core.ManageBooking {\n\n export enum TripStage {\n PreTrip,\n OnTrip,\n PostTrip\n }\n\n export class BookedTrip {\n AdHocBooking: AdHocBooking;\n Adults: number;\n AirportParkingBooking: AirportParkingBooking;\n AttractionsBooking: AttractionsBooking;\n BundleBooking: BundleBooking;\n CarHireBooking: CarHireBooking;\n Children: number;\n CruiseBooking: CruiseBooking;\n EndDate: string;\n FlightBooking: FlightBooking;\n HotelBooking: HotelBooking;\n Infants: number;\n InsuranceBooking: TravelInsuranceBooking;\n MarhabaBooking: MarhabaBooking;\n StartDate: string;\n TransferBooking: TransferBooking;\n\n // decorated properties\n DaysUntilDeparture: number = 0;\n DaysUntilReturn: number = 0;\n Destination: Destinations.DestinationSummary;\n Duration: number = 0;\n MainBookingId: number = 0;\n PaymentDetails: PaymentDetails = new PaymentDetails();\n TripStage: TripStage;\n }\n\n export class PaymentDetails {\n Balances: BalanceDue[] = [];\n CurrencyCode: string;\n Paid: number = 0;\n PayDirect: DirectPayment[] = [];\n Outstanding: number = 0;\n Total: number = 0;\n }\n\n export class BalanceDue {\n Amount: number = 0;\n BookingType: BookingType;\n CurrencyCode: string;\n Due: string;\n }\n\n export class DirectPayment {\n Amount: number = 0;\n BookingType: BookingType;\n LocalAmount: number = 0;\n LocalCurrency: string;\n }\n\n export interface ProductBooking {\n readonly BookingId: number;\n readonly BookingRef: string;\n readonly BookingType: number;\n readonly DomainId: number;\n readonly EndDate: string;\n readonly PackageId: string;\n PaymentInfo :PaymentInformation;\n readonly PriceBreakdown : PriceBreakdown[];\n readonly StartDate: string;\n readonly Status: BookingStatus;\n }\n\n export interface BundleBooking extends ProductBooking {\n }\n\n export interface HotelBooking extends ProductBooking {\n readonly Hotel: Hotel;\n readonly CheckInDate: string;\n readonly CheckOutDate: string;\n readonly Rooms: Room[];\n readonly ReviewedByCustomer: boolean;\n Duration?: number;\n }\n\n export interface Hotel {\n readonly EstabId: number;\n readonly Title: string;\n readonly StarRating: number;\n readonly Latitude: number;\n readonly Longitude: number;\n readonly CustomerRating: number;\n readonly CustomerRatingTitle: string;\n readonly CustomerRatingCount: number;\n readonly Url: string;\n readonly Destinations: Destinations.DestinationSummary[];\n // decorated properties\n ImageUrl: string;\n }\n\n export interface Room {\n readonly Title: string;\n readonly BoardType: number;\n readonly Adults: number;\n readonly ChildAges: number[];\n }\n\n export interface FlightBooking extends ProductBooking {\n readonly Legs: FlightLeg[];\n }\n\n export interface FlightLeg {\n readonly ArrivalAirport: AirportSummary;\n readonly ArrivalTime: string;\n readonly Cabin: number;\n readonly Carrier: string;\n readonly DepartureAirport: AirportSummary;\n readonly DepartureTime: string;\n readonly FlightNo: string;\n readonly IsOutbound: boolean;\n\n DayDiff: number;\n }\n\n export interface AirportSummary {\n readonly Title: string;\n readonly Code: string;\n readonly Destination: Destinations.DestinationSummary;\n }\n\n export interface TransferBooking extends ProductBooking {\n Outbound?: TransferLeg;\n Return?: TransferLeg;\n\n Legs: TransferLeg[];\n Title: string;\n }\n\n export interface TransferLeg {\n readonly Date: string;\n readonly DropOffPoint: string;\n readonly PickUpPoint: string;\n readonly Title: string;\n }\n\n export interface CarHireBooking extends ProductBooking {\n readonly CarDescription: string;\n readonly DropOffDate: string;\n readonly DropOffPoint: string;\n readonly PickUpDate: string;\n readonly PickUpPoint: string;\n readonly SIPPCode: string;\n }\n\n export interface AttractionsBooking extends ProductBooking {\n readonly Attractions: Attraction[];\n }\n\n export interface Attraction {\n readonly Adults: number;\n readonly Children: number;\n readonly Date: string;\n readonly Destination: Destinations.DestinationSummary;\n readonly Infants: number;\n readonly Title: string;\n }\n\n export interface AirportParkingBooking extends ProductBooking {\n readonly CarParkName: string;\n readonly DropOffDate: string;\n readonly PickUpDate: string;\n }\n\n export interface AdHocBooking extends ProductBooking {\n }\n\n export interface MarhabaBooking extends ProductBooking {\n }\n\n export interface CruiseBooking extends ProductBooking {\n }\n\n export interface TravelInsuranceBooking extends ProductBooking {\n readonly Title: string;\n }\n\n export interface Payment {\n readonly CardFeeAmount: number;\n readonly Cleared: boolean;\n readonly ClientCurrencyCode: string;\n readonly ClientCurrencyExchangeRate: number;\n readonly ClientCurrencyPaymentAmount: number; //Total amount\n readonly PaymentAmount: number;\n readonly PaymentDate: string;\n readonly IsScheduledPayment: boolean;\n }\n\n export interface PaymentDirect {\n readonly Amount: number;\n readonly Currency: string;\n readonly LocalAmount: number;\n readonly LocalCurrency: string;\n }\n\n export interface PaymentInformation {\n readonly ClearedPayments: Payment[];\n readonly DirectPayments: PaymentDirect[];\n readonly FuturePayments: Payment[];\n }\n\n export interface PriceBreakdown {\n readonly CurrencyCode: string;\n readonly Description: string;\n readonly IsPaymentFee: boolean;\n readonly Quantity: number;\n readonly UnitAmount: number;\n readonly IsPriceHidden: boolean;\n readonly SupplierRef: string;\n readonly TypeId: number;\n }\n}\n","namespace Core.CarHire {\n\n export enum FuelPolicyType {\n FullFull = 0,\n EmptyEmpty = 1,\n FullEmpty = 2,\n HalfEmpty = 3,\n QuarterEmpty = 4,\n HalfHalf = 5,\n QuarterQuarter = 6,\n FreeTank = 7,\n FullEmptyRefund = 8,\n FullFullHybrid = 9,\n ChauFulFul = 10,\n ChaufFuelInc = 11,\n Unknown = 12\n }\n\n export enum FuelType {\n Unspecified = 0,\n Petrol = 1,\n Diesel = 2\n }\n\n export interface RentalInformation {\n Code :string;\n Information :string;\n Title :string;\n }\n\n export interface Id {\n CarHireCode :string;\n SupplierId :number;\n }\n\n export interface Quote {\n CarHireId : Id;\n Adults :number;\n BaggageQuantity :number;\n BaggageQuantitySmall :number;\n BalanceDueDays :number | null;\n Capacity :number;\n CarImageSmall :string;\n Children :number;\n Class :string|null;\n CompanyLogo :string;\n CompanyName :string;\n DealId :number;\n Deposit :number | null;\n DepositAmount :number;\n Description :string;\n DoorCount:number;\n DropOffLocation :string;\n DropOffLocationId :string;\n ExampleModel :string;\n Exclusions :RentalInformation[];\n FuelPolicy :string;\n FuelPolicyDescription :string;\n FuelPolicyType :FuelPolicyType;\n FuelType :FuelType;\n Inclusions :RentalInformation[];\n Information :RentalInformation[];\n IsAirConditioned :boolean;\n IsAutomatic :boolean;\n IsBasicOption :boolean;\n Mileage :number;\n PickUpLocation :string;\n PickUpLocationId :string;\n Price :number;\n PricePayableLocally :number;\n PricePayableNow :number;\n SpecialOfferText :string;\n SupplierId :number;\n SupplierName :string;\n SupplierRateCode :string;\n TheftWaiver :boolean;\n ThirdPartyLiabilityProtection :boolean;\n VendorCode :string;\n VendorImageUrl :string;\n VendorLocationCode :string;\n VendorName :string;\n VendorOperatorCode :string;\n VendorOperatorImageUrl :string;\n VendorOperatorName :string;\n }\n\n export enum SortOrder {\n None = 0,\n Price = 1,\n Recommended = 2\n }\n\n}\n","\nnamespace Core.Customer {\n\n export abstract class CrossSellOption {\n BookingId: number = 0;\n CrossSellType: Booking.CrossSellType;\n PriceIsPerPerson: boolean = false;\n TeaserPrice: number = 0;\n\n public constructor(bookingId :number,\n crossSellType :Booking.CrossSellType,\n priceIsPerPerson :boolean,\n teaserPrice :number)\n {\n this.BookingId = bookingId;\n this.CrossSellType = crossSellType;\n this.PriceIsPerPerson = priceIsPerPerson;\n this.TeaserPrice = teaserPrice;\n }\n }\n\n export class CrossSellProductOption extends CrossSellOption {\n ImageUrl: string;\n ProductDetails: any;\n Title: string;\n\n public constructor(bookingId :number,\n crossSellType :Booking.CrossSellType,\n priceIsPerPerson :boolean,\n teaserPrice :number,\n imageUrl :string,\n productDetails :any,\n title :string)\n {\n super(bookingId, crossSellType, priceIsPerPerson, teaserPrice);\n this.ImageUrl = imageUrl;\n this.ProductDetails = productDetails;\n this.Title = title;\n }\n }\n\n export class CrossSellHotelOption extends CrossSellProductOption {\n Hotel: Hotels.StaticHotel;\n\n public constructor(bookingId :number,\n crossSellType :Booking.CrossSellType,\n priceIsPerPerson :boolean,\n teaserPrice :number,\n imageUrl :string,\n productDetails :any,\n title :string,\n hotel :Hotels.StaticHotel)\n {\n super(bookingId, crossSellType, priceIsPerPerson, teaserPrice, imageUrl, productDetails, title);\n this.Hotel = hotel;\n }\n }\n\n export class CrossSellFlightExtraOption extends CrossSellOption {\n Url: string;\n\n public constructor(bookingId :number,\n crossSellType :Booking.CrossSellType,\n priceIsPerPerson :boolean,\n teaserPrice :number,\n url :string)\n {\n super(bookingId, crossSellType, priceIsPerPerson, teaserPrice);\n this.Url = url;\n }\n }\n\n export interface RecentSearchContentCard {\n DepartureAirports?: ManageBooking.AirportSummary[];\n Destinations?: Destinations.DestinationSummary[];\n StartDate: string;\n EndDate: string;\n Title: string;\n TitleResource: string;\n ImageUrl: string;\n Icons: string[];\n Adults: number;\n Children: number;\n Rooms: number|null;\n }\n\n // this is used for mix-panel analytics\n export enum DashboardTileType {\n SignIn,\n Trip,\n Search,\n Destination,\n LastHotel,\n CrossSellHotels,\n CrossSellAttractions,\n CrossSellTransfers,\n CrossSellCarHire,\n CrossSellSeats,\n CrossSellBaggage,\n InsuranceOption,\n InsuranceClaim,\n InsuranceConf,\n TravelGuide,\n ContactUs,\n ReviewHotel,\n AppPromo,\n InspirationalContent,\n }\n}\n","namespace Core.Destinations {\n\n export enum DestinationType {\n Establishment = 1,\n Location = 2,\n Province = 3,\n Country = 4,\n Place = 5,\n Polygon = 10,\n Universal = 12\n }\n\n export interface DestinationSummary {\n Id: number;\n Type: DestinationType;\n Title?: string;\n ImageUrl?: string;\n PagePath?: string;\n }\n\n export interface DestinationContentCard extends DestinationSummary {\n HolidayEnabled: boolean;\n HotelCount: number;\n MinFlightPrice: number;\n MinHotelPrice: number;\n PagePath: string;\n Searchable: boolean;\n RecommendationType: number;\n }\n\n}\n","namespace Core.Flights {\n\n export enum DetailsResponseCode {\n Success,\n Unavailable\n }\n\n export interface DetailsRequest {\n AvailabilitySearchId: string;\n FlightId: string;\n IncludeSeatPlan: boolean;\n MultiSector: boolean;\n IncludeBrandedFares?: boolean;\n }\n\n export interface Range {\n Min: T;\n Max: T;\n }\n\n export interface Destination {\n CountryId: number;\n ProvinceId: number;\n LocationId: number;\n EstablishmentId: number;\n PolygonId: number;\n }\n\n export interface FilterCriteria {\n DepartureAirport: string[];\n Airline: string[];\n Stop: number[];\n OutboundTakeOffRange: Range;\n OutboundLandingRange: Range;\n ReturnTakeOffRange: Range;\n ReturnLandingRange: Range;\n PriceRange: Range;\n HideAlternativeDates: boolean;\n DepartureDates: string[];\n }\n\n export interface SearchRequest {\n TripId: string;\n Adults: number;\n ChildAges: number[];\n AvailabilitySearchId: string;\n Cabin: Cabin;\n DepartureAirports: string[];\n DestinationAirports: string[];\n DepartureDate: Date;\n Destination: Destination;\n FilterCriteria: FilterCriteria;\n FlightOnlySearch: boolean;\n IsDirectFlight: boolean;\n OneWayOnly: boolean;\n Paging: Paging;\n PreferredCarrierCodes: string[];\n ReturnDate?: Date;\n SortCriterion: SortCriterion;\n }\n\n export enum SortCriterion {\n None,\n PriceLowToHigh,\n PriceHighToLow,\n Airline,\n DepartureTimeEarlyToLate,\n DepartureTimeLateToEarly,\n ReturnTimeEarlyToLate,\n ReturnTimeLateToEarly,\n TotalJourneyTimeLongestFirst,\n TotalJourneyShortestLongestFirst,\n Convenience\n }\n\n export interface Paging\n {\n PageIndex: number;\n PageSize: number;\n }\n\n export interface SearchResponse {\n AvailabilitySearchId: string;\n CombinedDates: AvailabilityGroup;\n FilterCriteria: FilterCriteria;\n }\n\n export interface AvailabilityGroup {\n AvailableFlights: Flight[];\n UnfilteredAggregated: AvailabilityAggregates;\n FilteredAggregated: AvailabilityAggregates;\n Aggregated: AvailabilityAggregates;\n }\n\n export interface AvailabilityAggregates {\n TotalNumberOfFlights: number;\n FilteredNumberOfFlights: number;\n FlightsByDepartureAirportTitles: { [key:string]:MinPriceAggregateInfo };\n FlightsByAirline: { [key:string]:AirlineAggregateInfo };\n FlightsByStops: { [key:string]:MinPriceAggregateInfo };\n PriceRange: Range;\n OutboundTakeOffRange: Range;\n ReturnTakeOffRange: Range;\n DepartureDates: { [key:string]:MinPriceAggregateInfo };\n }\n\n interface AggregateInfo {\n Count: number;\n }\n\n export interface MinPriceAggregateInfo extends AggregateInfo {\n MinumumPrice: number;\n }\n\n export interface AirlineAggregateInfo extends MinPriceAggregateInfo {\n Logo: string;\n }\n\n export interface Flight extends Itinerary {\n FlightId: string;\n DetailsId?: string;\n CurrencyCode: string;\n LeadAdultPrice: number;\n LeadAdultTax: number;\n FlightPlusChargePerPerson: number;\n LeadBaggagePrice: number;\n AllBagsOrNone: boolean;\n }\n\n export interface Details {\n ResponseCode : DetailsResponseCode;\n CanSelectSeats: boolean;\n DetailsId: string;\n Itinerary: Itinerary;\n AdditionalInformation: string;\n OptionConditions: { [key:string]:string };\n FlightSectorOptionalExtras: FlightSectorOptionalExtras[];\n SupplierFareRules:string;\n }\n\n export enum FareType {\n NotSpecified,\n Published,\n Private,\n Package\n }\n\n export interface Itinerary {\n HasFullDates: boolean;\n IsOriginOpenJaw: boolean;\n Legs: Leg[];\n Nights: number;\n AirlineImages: string[];\n DepartureDate: string;\n FareType: FareType;\n FareTypeName: string;\n }\n\n export interface FlightSectorOptionalExtras {\n ArrivalAirport: string;\n DepartureAirport: string;\n Description: string;\n OptionalExtras: OptionalExtraGroup[];\n CheckInOptions: OptionalExtraGroup[];\n NonCheckInOptions: OptionalExtraGroup[];\n }\n\n export interface OptionalExtraGroup {\n Title: string;\n Type: OptionalExtraGroupType;\n MultiOptionalExtras: MultiOptionalExtra[];\n SingleOptionalExtras: OptionalExtra[];\n }\n\n export interface MultiOptionalExtra {\n Description: string;\n Type: string;\n Options: OptionalExtra[];\n }\n\n export interface OptionalExtra {\n Key: OptionalExtraKey;\n OptionId: string;\n Description: string;\n Type: string;\n UnitAmount: number;\n UnitAmountString: string;\n TotalAmountString: string;\n Quantity: number;\n IsDefault: boolean;\n UnitWeightKg: number;\n }\n\n export interface OptionalExtraKey {\n OptionId: string;\n Quantity: number;\n }\n\n export enum OptionalExtraGroupType\n {\n Baggage,\n Meal,\n Other,\n SpecialBaggage,\n CheckIn\n }\n\n export enum Cabin\n {\n NotSpecified,\n Economy,\n PremiumEconomy,\n First,\n Business\n }\n\n export interface Leg {\n WifiAvailable: boolean;\n Cabin: Cabin;\n CabinType: string;\n DurationMinutes: number;\n Duration: string;\n DurationSummary: string;\n DayDiff: string;\n IsOutboundLeg: boolean;\n LegType: string;\n Segments: Segment[];\n Nights: number;\n DepartureAirport: AirportSummary;\n ArrivalAirport: AirportSummary;\n IsOriginOpenJaw: boolean;\n IsMixedCarrier: boolean;\n ViaInfo: ViaInfo[];\n NumberOfStops: number;\n ArrivalDate: Date;\n DepartureDate: Date;\n RawDisplayDate: string;\n DisplayDate: BindableDate;\n BagsIncludedCount: number;\n HandBaggageInformation: HandBaggageInformation;\n FareType: FareType;\n FareTypeName: string;\n LegIndex: number;\n }\n\n export interface Segment {\n CarrierName: string;\n FlightNumber: string;\n DepartureDate: string;\n ArrivalDate: string;\n AdditionalStops: number;\n CodeshareAirlineName: string;\n DepartureAirportTitle: string;\n DepartureAirportCode: string;\n DestinationAirportTitle: string;\n DestinationAirportCode: string;\n Logo: string;\n DestinationTerminal: string;\n DepartureTerminal: string;\n Cabin: Cabin;\n CabinType: string;\n SupplierFareClass: string;\n ZonedDepartureDate: string;\n ZonedArrivalDate: string;\n Duration: string;\n Connection: SegmentConnection;\n DayDiff: string;\n }\n\n export interface SegmentConnection {\n DurationMinutes: number;\n Duration: string;\n InfoIsComplete: boolean;\n }\n\n export interface AirportSummary {\n Title: string;\n Code: string;\n }\n\n export interface ViaInfo {\n AirportTitle: string;\n AirportCode: string;\n ArrivalDate: Date;\n DepartureDate: Date;\n FlightNumber: string;\n AdditionalStops: number;\n HideTimes: boolean;\n }\n\n export interface BindableDate {\n e: string;\n d: number;\n m: string;\n y: number;\n }\n\n export interface HandBaggageInformation {\n PiecesAllowed: number;\n WidthCm: number;\n HeightCm: number;\n DepthCm: number;\n WeightKg: number;\n }\n\n export interface DepartureDatesResponse {\n DepartureDates : string[];\n }\n}\n","namespace Core.Hotels {\n\n export interface HotelRoom {\n Title : string;\n Availability : RoomAvailability[];\n }\n\n export interface HotelSummary {\n Id: number;\n CustomerRating: number;\n CustomerRatingTitle: string;\n CustomerRatingCount: number;\n Location: string;\n StarRating: number;\n Title: string;\n Url: string;\n }\n\n export interface HotelWithRooms extends StaticHotel {\n\n OriginalCostPerPersonPerNightStr: string;\n OriginalCostPerNightStr: string;\n OriginalCostStr: string;\n MinCostPerPersonPerNightStr: string;\n MinCostPerNightStr: string;\n MinCostStr: string;\n OriginalCostPerPersonPerNight: number;\n OriginalCostPerPerson: number;\n OriginalCostPerNight: number;\n MinCostPerPersonPerNight: number;\n MinCostPerPerson: number;\n MinCostPerNight: number;\n LowDepositValue: number;\n IsPayAtHotelOnly: boolean;\n Rooms: HotelRoom[];\n EstabGroupIds: number[];\n\n Deposit: number;\n MinCost: number;\n NonRefundable: boolean;\n OriginalCost: number;\n PayAtHotelAvailable: boolean;\n RefundableCutOffDate: Date;\n TopSlotRank: number;\n\n HotelAward: HotelAward|undefined;\n }\n\n export interface StaticHotel extends HotelSummary {\n AcomTypeId: number;\n AcomType: string;\n Address: string;\n CallToBookBehaviour: number;\n Characteristics: string[];\n Country: string;\n CountryId: number;\n CurrentViews: number;\n DealMinPrice: number;\n Description: string;\n FacilityGroups: FacilityGroup[];\n HasReviewSnippets: boolean;\n ImageUrl: string;\n IndicativeMinPrice: number;\n IsVilla: boolean;\n Latitude: number;\n LocationId: number;\n Longitude: number;\n LongSpecialOfferText: string;\n NumberOfPhotos: number;\n ObjectTypeId: number;\n Postcode: string;\n Province: string;\n ProvinceId: number;\n Recommended: boolean;\n ReviewSnippets: ReviewSnippet[];\n RoomDetails: RoomDetails[];\n RoomNightsBooked: number;\n SpecialOfferText: string;\n StarRatingTitle: string;\n Summary: string;\n TeaserStr: string;\n\n //the properties below are added in support of CMS hotels\n HotelName: string|undefined;\n CmsImageUrls: string[]|null|undefined;\n HideFacilitiesList: boolean|undefined;\n HideRoomFacilitiesList: boolean|undefined;\n IsPlatinumHotel: boolean|undefined;\n IsBoutiqueHotel: boolean|undefined;\n IsDsfHotel: boolean|undefined;\n }\n\n export enum GroupType {\n Facilities = 1,\n HolidayType = 2,\n }\n\n export enum BoardType {\n Mixed = 0,\n RoomOnly = 1,\n BedAndBreakfast = 2,\n HalfBoard = 3,\n FullBoard = 4,\n AllInclusive = 5,\n SelfCatering = 6,\n }\n\n export interface Money {\n Value: number;\n CurrencyCode: string;\n }\n\n export interface YieldManagementSupplierSwap {\n OrigSupplierId: number;\n OrigSupplierName: string;\n OrigSupplierNetCost: number;\n OrigSupplierClientCost: number;\n OrigSupplierDescription: string;\n NewSupplierId: number;\n NewSupplierName: string;\n NewSupplierNetCost: number;\n NewSupplierClientCost: number;\n NewSupplierDescription: string;\n NewSupplierCostChanged: boolean;\n OrigSupplierIncentive: number;\n NewSupplierIncentive: number;\n OrigSupplierDiscount: SupplierDiscount;\n }\n\n export interface SupplierDiscount {\n SupplierDiscountAmount: number;\n SupplierDiscountMessage: string;\n SupplierDiscountType: SupplierDiscountType;\n }\n\n export enum SupplierDiscountType {\n None = 1,\n Mobile = 2,\n Promotional = 3,\n }\n\n export interface ReviewSnippet {\n EstabId: number;\n ReviewId: number;\n Comments: string;\n Rating: number;\n RatingTitle: string;\n ReviewerName: string;\n ReviewerFrom: string;\n CultureCode: string;\n Translated: boolean;\n IsDefaultLanguage: boolean;\n }\n\n export interface FacilityGroup {\n Type: GroupType;\n Name: string;\n Codes: string[];\n }\n\n export interface HotelAward {\n ResourceString: string;\n Type: AwardType;\n Year: number;\n }\n\n export enum AwardType {\n Winner = 1,\n BestIn = 2,\n }\n\n export interface RoomDetails {\n MasterId: number;\n Title: string;\n Description: string;\n ImageUrl: string;\n }\n\n export interface ApiRequestedRoom {\n BoardTypeMinPrices: BoardTypeMinPriceFull[];\n Availability: ApiRoomAvailability[];\n }\n\n export interface BoardTypeMinPriceFull {\n BoardType: BoardType;\n MinCost: number;\n NetCost: number;\n OriginalCost: number;\n SpecialOfferText: string;\n LongSpecialOfferText: string;\n AllowDiscounts: boolean;\n MasterRoomId: number;\n RoomDescription: string;\n UserDiscount: boolean;\n }\n\n export interface ApiRoomAvailability {\n MasterId: number;\n RoomDescription: string;\n QuantityAvailable: number;\n Facilities: string[];\n BoardOptions: BoardOption[];\n }\n\n export type RoomAvailability = ApiRoomAvailability & BoardOption;\n\n export interface BoardOption {\n Id: string;\n BoardType: BoardType;\n BoardDescription: string;\n Cost: number;\n NetCost: number;\n OriginalCost: number;\n TotalLocalNetCost: Money;\n TotalLocalCost: Money;\n CityTax: number;\n IsPayAtHotel: boolean;\n IsOnRequest: boolean;\n IsShortlisted: boolean;\n LowDepositValue: number;\n NonRefundable: boolean;\n AllowDiscounts: boolean;\n SpecialOfferText: string;\n LongSpecialOfferText: string;\n CostCalculationDebugInfo: string;\n SupplierId: number;\n SupplierName: string;\n YieldManagementSupplierSwap: YieldManagementSupplierSwap;\n UserDiscount: boolean;\n CostPerNight: number;\n OriginalCostPerNight: number;\n IsCheapest: boolean;\n BTInclusions: BTInclusion[];\n BTExclusions: BTExclusion[];\n }\n\n export interface BTInclusion {\n InclusionId: number;\n ReplacementText: string;\n Title: string;\n }\n\n export interface BTExclusion {\n InclusionId: number;\n ReplacementText: string;\n Title: string;\n }\n\n /* when we rehydrate the basket we squash together the hotel and the details */\n export type HotelDetails = Details & HotelWithRooms;\n\n /* Hotel details interfaces */\n export interface DetailsRequest {\n AvailabilitySearchId: string;\n EstabId: number;\n DiscountCode: string;\n RoomAndBoardIds: string[];\n BookingPath: BookingPath;\n LoyaltyInfo: { SkywardsTier: string };\n }\n\n export interface Details {\n DetailsId: string;\n Itinerary: Itinerary;\n BookedItems: Room[];\n AdditionalInformation: AdditionalInformationItem[];\n PromotionalInformation: InformationItem[];\n SpecialOfferText: string[];\n FreeTransfer: FreeTransfer;\n LongSpecialOfferText: string[];\n }\n\n export enum BookingPath {\n HotelOnly = 1,\n Holiday = 2,\n HotelDeal = 3,\n HolidayDeal = 4,\n MetaHotelOnly = 5,\n MetaHoliday = 6,\n }\n\n export interface Itinerary {\n EstabId: number;\n Country: string;\n Province: string;\n Location: string;\n Title: string;\n CheckInDate: string;\n CheckOutDate: string;\n Duration: number;\n StarRating: number;\n }\n\n export interface FreeTransfer {\n TransferType: string;\n Quantity: number;\n SupplierName: string;\n SupplierId: number;\n }\n\n export interface Room {\n Title: string;\n RoomNumber: number;\n NonRefundable: boolean;\n BoardDescription: string;\n RoomDescription: string;\n Price: number;\n IsOnRequest: boolean;\n }\n\n export interface InformationItem {\n Title: string;\n Description: string;\n }\n\n export interface AdditionalInformationItem extends InformationItem {\n ShowOnVoucher: boolean;\n }\n\n export enum BoostReason {\n UserClickPrimary = 1,\n UserClickSecondary = 2,\n UserClickTertiary = 3,\n UserClickOther = 4,\n TopSlot = 5,\n Recommended = 6,\n }\n}\n","namespace Core.ManageBooking {\n\n export interface ItineraryBase {\n ItineraryId: number;\n StartDate?: string;\n EndDate?: string;\n Description?: string;\n DestinationPoint?: string;\n }\n\n export type ItineraryItem =\n FlightItinerary |\n AccommodationItinerary |\n TransferItinerary |\n MeetAndGreetItinerary |\n AdHocItinerary;\n\n export interface FlightItinerary extends ItineraryBase {\n Type: ItineraryType;\n CarrierName?: string;\n DepartureAirportCode?: string;\n DestinationAirportCode?: string;\n FlightNumber?: string;\n BookingClass: string;\n }\n\n export interface AccommodationItinerary extends ItineraryBase {\n Type: ItineraryType;\n Occuppancy?: Occuppancy;\n EstabTitle?: string;\n Province?: string;\n Address?: string;\n Phone?: string;\n RoomType?: string;\n BoardType?: string;\n EstabId: number;\n }\n\n export interface AdHocItinerary extends ItineraryBase {\n Type: ItineraryType;\n Adults: number;\n Children: number;\n Infants: number;\n }\n\n export interface MeetAndGreetItinerary extends ItineraryBase {\n Type: ItineraryType;\n /** Meet and Greet location, airport code */\n DeparturePoint?: string;\n /** The flight number stored against the Meet and Greet itinerary item\n (may be comma separated list of flight numbers) */\n FlightNo?: string;\n /** If we are able to identify the connecting flight,\n this is the flight booking id (may be null) */\n ConnectingFlightBookingId: number;\n /** If we are able to identify the connecting flight,\n this is the flight itinerary id (may be null) */\n ConnectingFlightItineraryId: number;\n /** If we are able to identify the connecting flight,\n this is the flight number recorded against the flight itinerary (may be null) */\n ConnectingFlightNo?: string;\n /** If we are able to identify the connecting flight,\n this is the flight description (contains \"via\" information if there is more than one flight number) */\n ConnectingFlightDescription?: string;\n }\n\n export interface TransferItinerary extends ItineraryBase {\n Type: ItineraryType;\n DeparturePoint?: string;\n FlightNo?: string;\n }\n\n export interface BundleItinerary extends ItineraryBase {\n TypeId: number;\n }\n\n export interface BookedItem {\n Description?: string;\n UnitAmount: number;\n Quantity: number;\n AtolProtected: boolean;\n ClientCurrencyCode?: string;\n UnitSupplierNet: number;\n UnitMargin: number;\n UnitTravelAgentCommission: number;\n BookedItemId: number;\n ReversedBookedItemId: number;\n ItineraryId: number;\n // Front-end props\n Selected: boolean;\n }\n\n export interface Booking {\n Summary?: BookingSummary2;\n Contact?: BookingContact;\n TravelAgent?: TravelAgent;\n }\n\n export interface LeadPassenger {\n FirstName?: string;\n LastName?: string;\n Title?: string;\n Email?: string;\n PassengerFrom?: string;\n CountryCode?: string;\n }\n\n export interface Passenger {\n TypeId: number;\n AgeOnReturn: number;\n Title?: string;\n LastName?: string;\n FirstName?: string;\n }\n\n export interface Occuppancy {\n Adults: number;\n Children: number;\n Infants: number;\n }\n\n export interface TravelAgent {\n Id: number;\n Title?: string;\n FirstName?: string;\n LastName?: string;\n }\n\n export enum BookingStatus {\n Pending = 1,\n Receipted = 2,\n Ticketed = 4,\n Complete = 5,\n CancelledByClient = 6,\n Void = 7,\n HoldAwaitingConfirmation = 8,\n DeclinedByEstab = 9,\n ConfirmedByEstab = 10,\n CancellationConfirmedByEstab = 11,\n CancellationDeclinedByEstab = 12,\n FailedSecurityCheck = 13,\n HoldSupplierSwap = 14,\n AutoAccepted = 15,\n PriceUp = 16,\n NotAvailable = 17,\n AwaitingCustomerResponse = 18,\n Migrated = 19,\n }\n\n export enum BookingInfoItemType {\n Invalid = 0,\n Generic = 1,\n CancellationCondition = 2,\n PublishedNote = 3,\n BaggageInformation = 4,\n TerminalInformation = 5,\n FareRules = 6,\n OutboundFlights = 7,\n InboundFlights = 8,\n SpecialOffer = 9,\n BookingCondition = 10,\n }\n\n export interface BookingSummary {\n BookingId: number;\n Title?: string;\n BookingRef?: string;\n Type: BookingType;\n StartDate: string;\n ReturnDate: string;\n Duration: number;\n }\n\n export enum ItineraryType {\n FlightOutbound = 1,\n FlightInbound = 2,\n CarHire = 3,\n HotelRoom = 4,\n AttractionTicket = 5,\n FlightInfo = 6,\n CarParking = 7,\n TransferArrival = 8,\n TransferReturn = 9,\n Insurance = 10,\n PackageHoliday = 11,\n Marhaba = 13,\n Bundle = 14,\n PointToPointTransfer = 15,\n AdHoc = 16,\n }\n\n export enum BookingType {\n Flight = 1,\n AttractionTickets = 2,\n CarHire = 4,\n Accommodation = 8,\n TailorMadeHoliday = 9,\n Parking = 16,\n Transfer = 32,\n TravelInsurance = 64,\n PackageHolidays = 128,\n Marhaba = 256,\n CruiseHolidays = 512,\n Bundle = 1024,\n AdHoc = 2048,\n }\n\n export interface BookingSummary2 {\n BookingId: number;\n BookingRef?: string;\n SiteId?: string;\n Type: BookingType;\n StartDate: string;\n SupplierId: number;\n DomainBookedOn?: Domain;\n DomainBookedOnId: number;\n }\n\n export interface BookingContact {\n Title?: string;\n FirstName?: string;\n LastName?: string;\n Email?: string;\n LoyaltyNumber?: string;\n SiteId?: string;\n BookingId: number;\n }\n\n export interface Domain {\n Id: number;\n Name?: string;\n Label?: string;\n }\n\n export interface BookingAndLeadPassengerResponse {\n Booking?: BookingSummary;\n LeadPassenger?: LeadPassenger;\n }\n\n export interface BookingDetail extends BookingAndLeadPassengerResponse {\n BookedItems?: BookedItem[];\n Itineraries?: ItineraryBase[];\n BookingStatus: BookingStatus;\n BookingInfoItems?: BookingInfoItem[];\n }\n\n export interface BookingInfoItem {\n Id: number;\n BookingId: number;\n Title?: string;\n Description?: string;\n ShowOnVoucher: boolean;\n BookingInfoItemType: BookingInfoItemType;\n }\n\n}\n","namespace Quote {\n\n export enum QuoteProductType {\n Accommodation = 0,\n Flight = 1,\n Transfer = 2,\n AirportParking = 3,\n AttractionTicket = 4,\n CarHire = 5\n }\n\n export enum CreateQuoteResponseCode {\n Success = 0,\n Unknown = 1\n }\n\n\n export interface IQuoteProductOption {\n Id: string;\n Title: string;\n Quantity: number;\n QuotedUnitCost: number;\n CurrentUnitCost: number;\n OnRequest: boolean;\n RestoreFailed: boolean;\n }\n\n export interface IQuoteProduct {\n Id: string;\n AvailabilityId: string;\n Type: string;\n TypeId : number;\n QuotedCost: number;\n CurrentCost: number;\n Options: IQuoteProductOption[];\n StalePrice: boolean;\n RestoreFailed: boolean;\n }\n\n\n\n export interface IQuoteProductHotel extends IQuoteProduct {\n Alternatives :IAlternativeHotel[];\n CheckInDate :string;\n CheckOutDate :string;\n Establishment :string;\n EstablishmentId :number;\n Rooms :string[];\n }\n\n export interface IAlternativeHotel {\n Board :string;\n Cost :string;\n Id :string;\n Room :number;\n }\n\n\n export interface IQuoteProductFlight extends IQuoteProduct {\n OutboundLeg :IQuoteProductFlightLeg;\n InboundLeg :IQuoteProductFlightLeg;\n Adults :number;\n ChildAges :number[];\n Alternatives :IAlternativeFlight[];\n }\n\n export interface IQuoteProductFlightLeg {\n Segments :IQuoteProductFlightSegment[];\n }\n\n export interface IQuoteProductFlightSegment {\n ArrivalCode :string;\n ArrivalDate :string;\n Carrier :string;\n CabinName :string;\n Cabin :number;\n DepartureDate :string;\n DepartureCode :string;\n FlightNumber :string;\n ZonedDepartureDate :string;\n ZonedArrivalDate :string;\n }\n\n export interface IAlternativeFlight {\n Cost :string;\n Id :string;\n InboundLeg :IQuoteProductFlightLeg;\n OutboundLeg :IQuoteProductFlightLeg;\n }\n\n\n export interface IQuoteProductTransfer extends IQuoteProduct {\n Airport :string;\n Alternatives :IAlternativeGeneric[];\n OutboundDate? :string;\n Passengers :number;\n ResortLocation :string;\n ReturnDate? :string;\n Titles :string[];\n }\n\n export interface IAlternativeGeneric {\n Cost :number;\n Description :string;\n Id :string;\n }\n\n\n export interface IQuoteProductCarHire extends IQuoteProduct {\n Alternatives :IAlternativeGeneric[];\n DropOffDate :string;\n DropOffPoint :string;\n PickUpPoint :string;\n PickUpDate :string;\n Titles :string[];\n }\n\n\n export interface IQuote {\n Id: string;\n Reference: string;\n BasketId: string;\n AccountingCurrency: string;\n Currency: string;\n ForHoliday: boolean;\n Products: IQuoteProduct[];\n StalePrices: boolean;\n SharedUse: boolean;\n BookingIds: number[];\n UserId: string;\n Error: any;\n Notes: any[];\n }\n\n export interface IQuoteCreateRequest {\n QuoteId?: string | null;\n DomainId?: number | null;\n BasketId?: string;\n SharedUse?: boolean | null;\n UserId?: string | null;\n EmailAddress?: string | null;\n SendEmail?: boolean | null;\n CultureCode?: string | null;\n TrackingTag?: string | null;\n }\n\n export interface ICreateQuoteResponse {\n Code: CreateQuoteResponseCode;\n Payload: IQuote;\n Error: any;\n }\n\n export interface IQuoteSearchModel {\n domainId: number;\n page: number;\n limit: number;\n quoteRef?: string;\n quoteNo?: number;\n reference?: string;\n userId?: string;\n externalAgentId?: number | null;\n quotedById?: number | null;\n from?: Date;\n to?: Date;\n destination?: string;\n hotelName?: string;\n sortDirection?: string;\n }\n\n export interface IQuoteSearchResponse {\n Results: IQuoteSearchResult[];\n Limit: number;\n Total: number;\n Page: number;\n TotalPages: number;\n }\n\n export interface IQuoteSearchResult {\n Id: string;\n UserId: string;\n Reference: string;\n Created: string;\n Components: IQuoteSearchComponent[];\n BookingIds: number[];\n AgentFirstName: number;\n CustomerEmailAddress: string;\n CustomerFirstName: string;\n CustomerLastName: string;\n TravelAgentFirstName: string;\n TravelAgentId: number;\n TravelAgentLastName: string;\n TravelAgentTitle: string;\n }\n\n export interface IQuoteSearchComponent {\n Type: string;\n TypeId: number;\n Destinations: string[];\n Detail: string;\n }\n\n export interface IQuoteSearch {\n searchModel: IQuoteSearchModel;\n searchResponse: IQuoteSearchResponse | null;\n }\n\n export interface IQuotePriceDifference{\n priceDifferenceAbs: number;\n priceDifferencePercentage: number;\n }\n\n}\n","namespace Core.Trip {\n\n export enum TripType {\n None = 0,\n Flight = 1,\n Hotel = 2,\n Transfer = 3,\n Holiday = 4,\n Marhaba = 5,\n AirportParking = 6,\n Attractions = 7,\n DynamicPackage = 8,\n Insurance = 9\n }\n\n export interface TripState {\n TripType: TripType;\n HotelsRequest?: HotelsRequest;\n FlightsRequest?: FlightsRequest;\n MultiFlightsRequest?: MultiFlightsRequest;\n TransfersRequest?: TransfersRequest;\n MarhabaRequest?: MarhabaRequest;\n InsuranceRequest?: InsuranceRequest;\n CarHireRequest?: CarHireRequest;\n ParkingRequest?: ParkingRequest;\n AttractionRequest?: AttractionRequest;\n MultiDestinationFlightRequests?: FlightsRequest[];\n TripId: string;\n BasketId?: string;\n BookingId?: string;\n Deal?: Deal;\n QuoteId?: string;\n FromHolidayDeal: boolean;\n PackageId: string;\n IsKidsFree: boolean;\n }\n\n export interface HotelsRequest {\n AvailabilitySearchId?: string;\n Destination?: Destination;\n SearchArea?: SearchArea;\n CheckInDate: string;\n CheckOutDate: string;\n Rooms: Occupancy[];\n DirectToHotel: boolean;\n CurrencyCode?: string;\n }\n\n export interface FlightsRequest {\n AvailabilitySearchId?: string;\n Destination?: Destination;\n Adults: number;\n Cabin: number;\n ChildAges?: number[];\n DepartureDate: string;\n ReturnDate?: string;\n SelectedDepartureAirport?: Airport;\n SelectedDestinationAirport?: Airport;\n OneWayOnly: boolean;\n SelectedFlight?: SelectedFlight;\n PreferredCarrierCodes?: string[];\n }\n\n export interface MultiFlightsRequest {\n AvailabilitySearchId?: string;\n Adults: number;\n Cabin: number;\n ChildAges?: number[];\n FlightRoutes?: FlightRoute[];\n }\n\n export interface TransfersRequest {\n AvailabilitySearchId?: string;\n AirportCode?: string;\n Route?: TransferRoute;\n ResortId: number;\n ResortTitle?: string;\n LocationId: number;\n ArrivalDate?: string;\n ReturnDate?: string;\n Adults: number;\n ChildAges?: number[];\n DestinationAirport?: Airport;\n }\n\n export interface MarhabaRequest {\n AvailabilitySearchId?: string;\n Terminal?: Terminal;\n Airport?: Airport;\n DateAndTime: string;\n FlightType: number;\n Occupancy: Occupancy;\n }\n\n export interface InsuranceRequest {\n AvailabilitySearchId?: string;\n AirportCode?: string;\n StartDate: string;\n EndDate: string;\n Ages?: number[];\n PolicyType: PolicyType;\n PolicyExtras: PolicyExtra[];\n TravelDestination: TravelDestination;\n }\n\n export interface PolicyExtra {\n Id: number;\n Name?: string;\n }\n\n export interface TravelDestination {\n Id: number;\n Name?: string;\n }\n\n export interface PolicyType {\n Id: number;\n Name?: string;\n }\n\n export interface CarHireRequest {\n AvailabilitySearchId?: string;\n DropOffLocation: {\n Code: string;\n Type: number;\n };\n PickUpLocation: {\n Code: string;\n Type: number;\n };\n PickUpDate: string;\n DropOffDate: string;\n DriverAge: number;\n }\n\n export interface ParkingRequest {\n AvailabilitySearchId?: string;\n Airport?: Airport;\n DepartureDate: string;\n ReturnDate: string;\n PassengerCount: number;\n DepartureTerminalCode?: string;\n }\n\n export type AttractionRequest = any;\n\n export interface Deal {\n DealId: number;\n EstablishmentId: number;\n OriginPath?: string;\n Sale: boolean;\n }\n\n export interface Destination {\n Type: Destinations.DestinationType;\n Id: number;\n CountryId: number;\n ProvinceId: number;\n LocationId: number;\n PlaceId: number;\n EstablishmentId: number;\n PolygonId: number;\n }\n\n export interface SearchArea {\n Latitude: number;\n Longitude: number;\n Radius: number;\n }\n\n export interface Airport {\n Code?: string;\n Title?: string;\n ShortTitle?: string;\n }\n\n export interface SelectedFlight {\n FlightId?: string;\n DetailsId?: string;\n LeadAdultPrice: number;\n LeadAdultTax: number;\n LeadBaggagePrice: number;\n BaggageCount: number;\n AllBagsOrNone: boolean;\n }\n\n export interface TransferRoute {\n PickUpPoint?: EndPoint;\n DropOffPoint?: EndPoint;\n }\n\n export interface Terminal {\n Id: number;\n Name?: string;\n TerminalNumber?: string;\n }\n\n export interface Occupancy {\n Adults: number;\n Children: number;\n Infants: number;\n ChildAges?: number[];\n }\n\n export interface EndPoint {\n Type: any;\n Code?: string;\n Title?: string;\n Description?: string;\n }\n\n export interface FlightRoute {\n DepartureDate: string;\n DepartureAirport?: string;\n DestinationAirport?: string;\n }\n\n export interface TripFromQuoteRequest {\n QuoteId?: string;\n BasketId?: string;\n ForHoliday: boolean;\n HotelsRequestId?: string;\n FlightsRequestId?: string;\n AttractionsRequestId?: string;\n CarHireRequestId?: string;\n InsuranceRequestId?: string;\n MarhabaRequestId?: string;\n ParkingRequestId?: string;\n TransfersRequestId?: string;\n }\n\n export interface TripFromQuoteResponse {\n TripId?: string;\n BookingId?: string;\n }\n\n export interface TripFromDealRequest {\n AvailabilitySearchId: string;\n EstablishmentId: number;\n Deal?: DealRequest;\n DealId: number;\n OriginPath?: string;\n DomainId: number;\n }\n\n export interface TripFromDealResponse {\n TripId?: string;\n }\n\n export interface DealRequest {\n Id: number;\n DomainId: number;\n EstabId: number;\n CheckInDate: string;\n Duration: number;\n Adults: number;\n Children: number;\n Infants: number;\n Price: number;\n TagIds?: number[];\n SortWeight: number;\n PriceUpdated: string;\n AvailabilitySearchId?: string;\n Sale: boolean;\n }\n\n}\n","'use strict';\n\nnamespace Core {\n\n class BookingComplete {\n manageBookingStarted: boolean;\n lightboxOpened: boolean;\n bookingSummarySurname: string;\n payLaterEnabled: boolean;\n\n constructor(\n private $location: ng.ILocationService,\n private $routeParams,\n private $scope,\n private $window,\n private agentModeService,\n private analytics,\n private broker: Broker,\n ) {\n this._initPage();\n this.payLaterEnabled = TRPCONFIG.Domain.BuyNowPayLaterEnabled && this.$location.search().pl === '1';\n if (TRPCONFIG.Domain.isAgentMode) {\n const bookingId = this.$routeParams.ref.split('|')[0];\n if (bookingId && bookingId.split('/')[1]) {\n agentModeService.getBookingContact(bookingId.split('/')[1]).then(result => {\n this.bookingSummarySurname = result.LastName;\n });\n }\n }\n if (TRPCONFIG.Domain.HideBookingRefOnConfirmation) {\n this.$location.replace();\n this.$location.url('booking/complete');\n }\n if ((this.$routeParams.paypal === 'true') && this.$routeParams.tripData) {\n const tripData = JSON.parse(decodeURIComponent(this.$routeParams.tripData));\n this.analytics.track('eCommercePaypal', 'purchase', tripData);\n }\n if(sessionStorage.getItem('eCommercePurchaseData')) {\n const purchaseData = JSON.parse(sessionStorage.getItem('eCommercePurchaseData') || '{}');\n this.$window.dataLayer.push(purchaseData);\n sessionStorage.removeItem('eCommercePurchaseData');\n }\n }\n\n private _initPage() {\n this.broker.publish('unblock');\n this.$scope.$emit('unblock');\n this.broker.subscribe('bookingComplete', 'lightboxOpened', () => this.lightboxOpened = true);\n this.broker.subscribe('bookingComplete', 'lightboxCloseClicked', () => this.lightboxOpened = false);\n this.broker.subscribe('bookingComplete', 'manageBookingClicked', () => this.manageBookingStarted = true);\n this.manageBookingStarted = false;\n }\n\n }\n\n angular\n .module('core')\n .controller('BookingComplete', BookingComplete);\n}\n","'use strict';\n\nnamespace Core {\n\n /**\n * If we receive a route that does not match any of our static routes\n * we will end up here. We will then call an api to check whether this is\n * a dynamic route of some kind. If we still don't understand the route\n * just send the user to the home page.\n */\n\n interface IStatistics {\n numberOfAirlines : number;\n numberOfHotels : number;\n bookingsLastHour : number;\n customersCurrentlyOnHoliday : number;\n reviewCount : number;\n searchesInLastHour : number;\n villaCount : number;\n }\n\n class DynamicRouting {\n\n template : string;\n data : IStatistics;\n minimalRoutes: RegExp[] = [\n /^\\/famous-film-locations$/,\n /^\\/famous-film-locations\\/.+/\n ];\n\n constructor(private $location : ng.ILocationService,\n private publicityService:any,\n private broker: Core.Broker) {\n\n publicityService.getStats({\n StatisticTypes: 'All'\n }).then((data:any) => {\n this.data = {\n numberOfAirlines : data.AirlineCount.Value,\n numberOfHotels : data.EstabCount.Value,\n bookingsLastHour : data.BookingsInLastHour.Value,\n customersCurrentlyOnHoliday : data.CustomersCurrentlyOnHoliday.Value,\n reviewCount : data.ReviewCount.Value,\n searchesInLastHour : data.SearchesInLastHour.Value,\n villaCount : data.VillaCount.Value\n };\n });\n this.template = `cms/page${$location.path()}`;\n const path = $location.path();\n const minimal = this.minimalRoutes.reduce((matched, re) => matched || re.test(path), false);\n this.template = `cms/page${path}`;\n if(minimal) {\n broker.publish('stripHeader');\n broker.publish('hideFooter');\n }\n }\n }\n\n angular\n .module('core')\n .controller('DynamicRouting', DynamicRouting);\n\n}\n\n","'use strict';\n\nnamespace Core {\n\n class CmsPageProps {\n private pageName: string;\n\n constructor (\n private $rootScope: ng.IRootScopeService,\n private broker: Core.Broker\n ) {}\n\n $onInit(): void {\n this.$rootScope.$broadcast('cmsPageProps', {\n pageName: this.pageName\n });\n }\n\n showUSPpopup(data) {\n this.broker.publish('showModalUspPopupDetails', data);\n }\n }\n\n angular\n .module('core')\n .directive('cmsPageProps', (): ng.IDirective => {\n return {\n restrict: 'E',\n controller: CmsPageProps,\n controllerAs: 'cmsCtrl',\n bindToController: {\n pageName: '@'\n },\n template: ``\n };\n });\n}\n","namespace Core {\n class MultiSectorFlight {\n\n constructor(\n private broker\n ) {\n }\n\n isSameCarrierOnAllSegments(flightSector) {\n return flightSector.Segments.every(s => s.CodeshareAirlineName === s.CarrierName);\n }\n\n showModalFlightDetails(flightSector) {\n this.broker.publish('showModalFlightDetails', { flight: { Legs : [flightSector] } });\n }\n }\n\n angular\n .module('core')\n .directive('multiSectorFlight', (): ng.IDirective => {\n return {\n replace: true,\n restrict: 'E',\n scope: {\n legs: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=multisectorflight',\n controller: MultiSectorFlight,\n controllerAs: 'msf'\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class AbTestSelector {\n\n tests: string;\n bindableTests: any[];\n\n constructor( private cookieService : any ) {\n this.bindableTests = JSON.parse(this.tests);\n this.bindableTests.forEach(t => {\n const cookie = cookieService.get(t.CookieName);\n t.variant = cookie ? parseInt(cookie, 10) : 0;\n });\n }\n\n update() {\n this.bindableTests.forEach(t => {\n this.cookieService.set(t.CookieName, t.variant, t.variant === 0 ? new Date() : null);\n });\n }\n\n numArray(i) {\n return new Array(i);\n }\n }\n\n angular\n .module('core')\n .directive('abTestSelector', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n bindToController: {\n tests: '@'\n },\n controller: AbTestSelector,\n controllerAs: 'abt',\n templateUrl: 'partials/home/directivetemplate?type=AbTestSelector'\n };\n });\n}\n\n","'use strict';\n\nnamespace Core {\n\n class AddFlightDetailsModal {\n\n show: boolean;\n private hotel: any;\n private priceMode: number;\n private totalNonInfants: number;\n private transfers: any[] = [];\n public transferExtras: any;\n private roomId: string;\n private priceId: any[];\n private roomsWithTransfers: any;\n private multipleRoomMode: boolean;\n public includedTransfer: any;\n private roomCost: number;\n public flightDetails: {\n transfer: any,\n transfers: any,\n options: any,\n outboundFlightNum: string,\n arrivalTime: {hours: string, minutes: string},\n inboundFlightNum: string,\n departureTime: {hours: string, minutes: string},\n };\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private mandatoryTransferService\n )\n {\n this.hotel = $scope.hotel;\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('modalAddFlightDetails', 'showModalAddFlightDetails', e => {\n this.transfers = this.mandatoryTransferService.getTransfers(e.data.roomInfo.Extras || []);\n this.includedTransfer = this.mandatoryTransferService\n .findSelectedTransfer(this.transfers, e.data.roomInfo.IncludedExtras);\n this.flightDetails.transfer = this.includedTransfer || this.transfers[0];\n this.roomId = e.data.roomId;\n this.priceId = [e.data.priceId];\n this.show = true;\n this.multipleRoomMode = false;\n this.priceMode = e.data.priceMode;\n this.totalNonInfants = e.data.totalNonInfants;\n this.roomCost = e.data.roomInfo.TotalCost;\n });\n\n this.broker.subscribe('modalAddFlightDetails', 'showModalAddFlightDetailsForMultiRooms', e => {\n this.show = true;\n this.multipleRoomMode = true;\n this.priceMode = e.data.priceMode;\n this.roomsWithTransfers = e.data.rooms;\n this.includedTransfer = [];\n this.flightDetails.transfers = [];\n this.transfers = [];\n this.transferExtras = [];\n this.includedTransfer = [];\n this.priceId = [];\n for(let i = 0; i < this.roomsWithTransfers.length; i++) {\n this.flightDetails.transfers[i] = this.mandatoryTransferService\n .findSelectedTransfer(this.roomsWithTransfers.mandatoryTransfers,\n this.roomsWithTransfers[i].IncludedExtras)\n || this.roomsWithTransfers[i].mandatoryTransfers[0];\n\n this.transfers = this.roomsWithTransfers[i].mandatoryTransfers ||\n this.roomsWithTransfers[i].IncludedExtras;\n this.priceId.push(this.roomsWithTransfers[i].Id);\n this.transferExtras = this.mandatoryTransferService.getTransfers(\n this.roomsWithTransfers[i].Extras || []);\n this.includedTransfer[i] = this.mandatoryTransferService\n .findSelectedTransfer(this.transferExtras,\n this.roomsWithTransfers[i].IncludedExtras);\n\n }\n });\n\n this.broker.subscribe('modalAddFlightDetails', 'HotelAvailabilityReceive', e => {\n this.hotel.Availability = e.data.Availability;\n });\n\n this.broker.subscribe('modalAddFlightDetails', 'roomsSet', e => {\n this.hotel.Availability = e.data.RequestedRooms[0].Availability;\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalAddFlightDetails');\n });\n }\n\n continueToBook() {\n if(!this.multipleRoomMode) {\n this.broker.publish('continueToBookFromFlightDetailsModal', {\n roomId: this.roomId,\n priceId: this.priceId,\n flightDetails: this.flightDetails\n });\n this.mandatoryTransferService.generateMandatoryOptions(this.roomId, this.flightDetails);\n } else {\n this.flightDetails.options = this.mandatoryTransferService\n .generateOptionsForMultiRooms(this.flightDetails,\n this.roomsWithTransfers);\n this.mandatoryTransferService.generateMandatoryOptions(this.roomId, this.flightDetails);\n this.broker.publish('continueToBookFromFlightDetailsModal', {\n multipleRoomMode: this.multipleRoomMode,\n flightDetails: this.flightDetails,\n priceId: this.priceId\n });\n }\n\n }\n\n }\n\n angular\n .module('core')\n .directive('addFlightDetailsModal', (): ng.IDirective => {\n\n return {\n scope: {hotel: '='},\n controller: AddFlightDetailsModal,\n controllerAs: 'afdc',\n templateUrl: 'partials/home/directivetemplate?type=AddFlightDetailsModal',\n\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : AddFlightDetailsModal) {\n controller.init(el);\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n interface IAtolProtectedCost {\n Quantity: number;\n UnitAmount: number;\n AtolProtected: boolean;\n ClientCurrencyCode: string;\n }\n\n interface IBookingDetailRouteParams extends ng.route.IRouteParamsService {\n tripId: string;\n }\n\n class AtolCostBreakdown {\n costs: IAtolProtectedCost[];\n totalLabel: string;\n atolSubtotalLabel: string;\n\n atolProtectedCosts: IAtolProtectedCost[];\n otherCosts: IAtolProtectedCost[];\n total: number;\n atolSubTotal: number;\n clientCurrencyCode: string;\n\n constructor(\n private $scope: ng.IScope,\n private tripService: TripService,\n private $routeParams: IBookingDetailRouteParams) {\n\n const killTheWatch = $scope.$watchCollection(() => this.costs,\n (val) => {\n if (val) {\n let costs = _.groupBy(this.costs, 'AtolProtected');\n this.atolProtectedCosts = costs['true'];\n this.otherCosts = costs['false'];\n this.total = this.sumCosts(this.costs);\n this.atolSubTotal = this.sumCosts(this.atolProtectedCosts);\n this.setClientCurrencyCode();\n killTheWatch();\n }\n });\n }\n\n private sumCosts(costs: IAtolProtectedCost[]) {\n if (costs) {\n return costs.reduce((sum, item) => sum + item.Quantity * item.UnitAmount, 0);\n }\n return 0;\n }\n\n private setClientCurrencyCode() {\n if (this.costs && (this.costs.length >= 1)) {\n if (this.costs[0].ClientCurrencyCode) {\n this.clientCurrencyCode = this.costs[0].ClientCurrencyCode;\n } else {\n this.tripService.getCurrency(this.$routeParams.tripId).then(currency => {\n this.clientCurrencyCode = currency;\n });\n }\n }\n }\n }\n\n angular\n .module('core')\n .directive('atolCostBreakdown', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n bindToController: {\n costs: '=',\n totalLabel: '@',\n atolSubtotalLabel: '@'\n },\n controller: AtolCostBreakdown,\n controllerAs: 'acb',\n templateUrl: 'partials/home/atolcostbreakdown'\n };\n });\n}\n","'use strict';\n\nnamespace Search {\n\n interface AutoSearchParams {\n type:string;\n id: string;\n }\n\n class AutoSearch {\n requestModel: UnifiedSearchModel;\n requestParams: any;\n href:string;\n\n constructor(private basketService, private unifiedSearchService, private destinationService,\n private searchQueryString, private urlUtils, private $scope, private resourceService) {}\n\n search($event) {\n if($event) { $event.preventDefault(); }\n if( this.href && this.href.length > 0 ) {\n\n let index = this.href.indexOf('?');\n\n if( index > 0 ) {\n this.$scope.$emit('block', {\n title: this.resourceService.get('SEARCHINGHOTELS'),\n subtitle: this.resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-searchUnitCtrl'\n });\n this.href = this.href.slice(index+1);\n let queryParams:AutoSearchParams = { type : '0', id: '0' };\n\n queryParams = this.urlUtils.splitQs( this.href || '');\n\n if ( parseInt(queryParams.type,10)>=0 && parseInt(queryParams.id,10)>=0 ) {\n\n this.destinationService.enhanceLegacyDestination({\n LegacyType : queryParams.type ,\n LegacyId: queryParams.id\n })\n .then(this.destinationService.getDetails)\n .then(dest => {\n this.requestModel = this.unifiedSearchService.getDefaultModel();\n\n this.searchQueryString.getQueryStringValues(queryParams).then(\n queryStringValues => {\n\n this.requestParams = queryStringValues;\n this.requestParams.destination = [dest];\n this.unifiedSearchService.populateSearchUnitService(this.requestParams);\n this.basketService.startWorkflow( this.basketService.autoSearch,\n this.requestParams);\n\n });\n\n });\n }\n }\n }\n };\n }\n\n angular\n .module('core')\n .directive('autoSearch', (): ng.IDirective => {\n return {\n replace: true,\n restrict: 'A',\n transclude: true,\n scope: {},\n bindToController: {\n href: '@'\n },\n controller: AutoSearch,\n controllerAs: 'autosearch',\n template: '
        '\n };\n });\n\n}\n","///\n'use strict';\n/*\n Creates an autocompleter field.\n Results are exposed as `ac.data`.\n*/\nnamespace Autocompleter {\n\n class Autocompleter extends AutocompleterField {\n\n private selectAttrFn: (item: any) => void;\n private setPrefixDebounced: (prefix: string) => void;\n\n constructor (\n public $scope: any,\n public $element: JQuery,\n public $parse: ng.IParseService,\n public $route: ng.route.IRouteService,\n public autocompleter: any,\n public resourceService: Core.ResourceService,\n public $timeout: ng.ITimeoutService,\n public $q: ng.IQService\n ) {\n super();\n\n this.setPrefixDebounced = _.debounce(prefix => {\n this.prefix = prefix;\n $scope.$apply();\n }, 100);\n\n // Watch for initial value\n this.$scope.$watchCollection('ac.currentValue', value => {\n let selected: any = _.isArray(value) ? value[0] : value;\n if (selected) {\n let title = selected[this.titleProp];\n if (title) {\n this.setPrefixDebounced(title);\n }\n } else {\n this.prefix = '';\n }\n });\n\n // Wrap `select` attribute fn\n this.selectAttrFn = this.select;\n this.select = (item) => {\n this.selectAttrFn({item: item});\n this.selectItem(item);\n };\n this.titleProp = this.titleProp || 'Title';\n\n // set focus on input field when required\n this.$scope.$watch(() => this.setFocus, value => {\n if (value === true) {\n this.$timeout(() => {\n this.inputField && this.inputField.focus();\n });\n }\n });\n\n }\n\n focus () {\n if (TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\n && (this.prefix === '' || this.prefix === undefined)) {\n this.fetch();\n }\n }\n\n update (result: any): void {\n let data = result.data,\n area = this.getArea();\n\n if (['businesscustomers', 'travelAgents', 'coworkers', 'userAccounts'].indexOf(area) > -1) {\n this.data = data;\n }\n else if (['transfers', 'flights', 'flights-departure', 'marhaba', 'parking'].indexOf(area) > -1) {\n this.data = this.addHeader(data, 'AIRPORTS');\n }\n else if (area === 'resorts') {\n this.data = this.addHeader(data, 'RESORTSPLUSHOTELS');\n }\n else {\n this.data = this._groupHotelResults(data);\n }\n\n if (!this.data || !this.data.length) {\n this.data = null;\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n }\n\n selectItem (item: any): void {\n if (item && item[this.titleProp]){\n angular.isArray(this.currentValue) ? this.currentValue[0] = item : this.currentValue = item;\n }\n }\n\n blur () {\n this.setFocus = false;\n\n // timeout is to prevent blur firing immediately before we select a menu item\n this.$timeout(() => {\n\n if (!this.prefix &&\n !TRPCONFIG.Domain.AllowZeroInputDestinationAutocompleter &&\n TRPCONFIG.Domain.DeviceType !== 'Desktop') {\n // we have no prefix so clear the current value\n angular.isArray(this.currentValue) ? this.currentValue.length = 0 : delete this.currentValue;\n return;\n }\n if (!this.data || !this.data.length) {\n // no data\n return;\n }\n\n let value = this.currentValue && this.currentValue[0] || this.currentValue,\n title = value && value[this.titleProp],\n isCurrentValueInMenu = _.some(this.data, (d: any) => d[this.titleProp] === title);\n\n if (!isCurrentValueInMenu) {\n // current value is not in our data so select the first option\n let firstItem = _.find(this.data, (d: any) => !d.header);\n if (firstItem) {\n this.select(angular.copy(firstItem));\n return;\n }\n }\n if (title) {\n // set the autcompleter text to match the current value\n this.setPrefixDebounced(title);\n }\n\n }, 200);\n }\n\n private _groupHotelResults (data: any[]) {\n let hotels:any = [];\n let destinations:any = [];\n\n angular.forEach(data, item => {\n if (item.EstablishmentId !== 0) {\n hotels.push(item);\n } else {\n destinations.push(item);\n }\n });\n return this.addHeader(destinations, 'DESTINATIONS')\n .concat(this.addHeader(hotels, 'HOTELS'));\n }\n }\n\n angular\n .module('TR')\n .directive('autocompleter', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: true,\n scope: {},\n controllerAs: 'ac',\n bindToController: {\n placeholder: '@',\n select: '&',\n deselect: '&',\n setFocus: '=?',\n currentValue: '=?',\n areaOverride: '@',\n focusTracker: '=',\n minPrefix: '@',\n notActive: '@',\n titleProp:'@',\n filterFunction:'&?',\n iconName: '@?'\n },\n templateUrl: 'partials/home/directivetemplate?type=Autocompleter',\n controller: Autocompleter,\n transclude: true,\n link: (\n scope: any,\n el: JQuery\n ) => {\n scope.ac.inputField = el.find('input');\n }\n };\n });\n}\n","'use strict';\n/*\n Displays recommendations on an autocompleter field.\n Requires `autocompleter` directive as parent.\n*/\nnamespace Autocompleter {\n\n class AutocompleterRecommendations {\n private data: any[];\n private recommendationType: number;\n private parentCtrl: any;\n private isHoliday: boolean;\n private acMethods: any = {};\n\n constructor (\n private $scope: any,\n private $route: ng.route.IRouteService,\n private $timeout: ng.ITimeoutService,\n private $q: ng.IQService,\n private resourceService: Core.ResourceService,\n private autocompleter: any,\n private houseRecommender: any\n ) {\n\n }\n\n init (ac: any): void {\n this.parentCtrl = ac;\n this._wrapAcMethod('focus', this.load);\n this._wrapAcMethod('select', this.select);\n }\n\n load (): void {\n if (this.allow()) {\n this.fetch().then(destinations => {\n if (destinations) {\n this.$timeout(() => {\n if (this.allow()) {\n // Set `data` on autocompleter\n this.parentCtrl.data = destinations;\n }\n // Set `initialData` on autocompleter\n // Repopulates menu when no search term i.e. <3 chars\n this.parentCtrl.initialData = destinations;\n\n this._unwrapAcMethod('focus');\n });\n }\n });\n }\n }\n\n select (dest: any): boolean | undefined {\n if (dest && this.allow()) {\n const currentArea = this.$route.current ? this.$route.current.area : '';\n let ac: any = this.parentCtrl;\n let area = ac.areaOverride || currentArea;\n let destTitle = dest && dest.Title;\n\n if (destTitle) {\n ac.loading = true;\n ac.prefix = destTitle;\n ac.data = null;\n\n // Fetch autocompleter item data on select\n this.autocompleter.lookup(area, destTitle)\n .then(res => {\n let item = res && res.data && res.data[0];\n if (item) {\n // Call original non-wrapped method\n this.acMethods.select(item);\n this.houseRecommender.trackHouseClick(dest);\n }\n else {\n ac.prefix = '';\n ac.data = null;\n ac.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n ac.loading = false;\n });\n }\n return true; // Block wrapped ac.select()\n }\n }\n\n allow (): boolean {\n let prefix = this.parentCtrl.prefix;\n return !prefix || prefix.length < this.parentCtrl.minPrefix;\n }\n\n fetch (): ng.IPromise {\n // `houseRecommendationService` has its own caching\n return this.houseRecommender.getHouseRecs()\n .then((dests: any) => {\n const destinations = _.filter(\n dests,\n (d:any) => d.searchable && (!this.isHoliday || (this.isHoliday && d.holidayEnabled))\n );\n if (destinations && destinations.length) {\n destinations.splice(0, 0, {\n Title: this.resourceService.get('RECOMMENDED'),\n header: true\n });\n this.recommendationType = dests[0].Type;\n return _.map(destinations, d => {\n if (!d.header) {\n d.Title = d.title;\n d.EstablishmentCount = d.estabCount;\n }\n return d;\n });\n }\n });\n }\n\n private _wrapAcMethod (method: string, fn: Function) {\n // Original method doesn't run if `fn()` returns `true`\n let m = this.parentCtrl[method];\n if (m) {\n this.acMethods[method] = m;\n }\n this.parentCtrl[method] = (...args: any[]) => {\n let v = fn.apply(this, args);\n if (m && v !== true) {\n return m.apply(this.parentCtrl, args);\n }\n };\n }\n\n private _unwrapAcMethod (method: string) {\n let m = this.acMethods[method];\n if (m) {\n delete this.acMethods[method];\n }\n this.parentCtrl[method] = m; // May be undefined\n }\n };\n\n angular\n .module('TR')\n .directive('autocompleterRecommendations', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: AutocompleterRecommendations,\n controllerAs: 'acr',\n bindToController: {\n isHoliday: '='\n },\n require: '^autocompleter',\n link: (\n scope: any,\n el: JQuery,\n attr: ng.IAttributes,\n autocompleterCtrl: any\n ) => {\n scope.acr.init(autocompleterCtrl);\n }\n };\n });\n}\n","'use strict';\n\nnamespace Dashboard {\n\n type INgModelController = angular.INgModelController;\n\n interface BagOption {\n Description: string;\n OptionId: string;\n UnitAmount: number;\n UnitWeightKg: number;\n }\n\n class BaggageOptions {\n private flightBaggageTotal : number;\n private bagOptions: BagOption[];\n private maxBagsSelectable : number;\n private bagsTeaserCost : number;\n private holdBaggageWeight : number;\n private bagsSelected : number; // number of bags selected\n private selectedBagOptions;\n private loading : boolean = true;\n\n constructor(\n private $scope\n ) {\n const bagOptionsWatch = this.$scope.$watch('cm.bagOptions', val => {\n if (val) {\n this.maxBagsSelectable = this.bagOptions && this.bagOptions.length || 0;\n let bag = _.minBy(this.bagOptions, 'UnitAmount');\n if (bag) {\n this.bagsTeaserCost = bag.UnitAmount / 2;\n this.holdBaggageWeight = bag.UnitWeightKg || TRPCONFIG.Domain.DashboardHoldBaggageWeight;\n }\n bagOptionsWatch();\n this.loading = false;\n }\n }, true);\n }\n\n updateBaggageOptions() {\n const selectedBagOptionsRaw : BagOption[] = this.bagOptions.slice(0, this.bagsSelected);\n this.flightBaggageTotal = _(selectedBagOptionsRaw).sumBy('UnitAmount');\n this.selectedBagOptions = (selectedBagOptionsRaw.map(so => ({OptionId: so.OptionId, ChosenQuantity: 1})));\n }\n }\n\n angular\n .module('core')\n .component('baggageOptions', {\n bindings: {\n bagOptions: '=',\n handBaggageInformation: '=',\n flightBaggageTotal: '=',\n selectedBagOptions: '='\n },\n controller: BaggageOptions,\n controllerAs: 'cm',\n templateUrl: 'partials/home/baggageoptions'\n }\n );\n}\n","(function() {\n'use strict';\nangular\n .module('core')\n .directive('baseStaticMap', baseStaticMap);\n\nconst template = `\n
        \n \n
        \n
        \n
        \n`;\n\nfunction baseStaticMap(\n $window,\n $compile,\n $rootScope,\n currentDestination,\n mapLabel,\n broker,\n hotelRehydrator,\n hotelStaticMapService,\n maps\n) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n zoom: '=',\n hideLabels: '@'\n },\n template,\n link(scope, el) {\n maps.loadScript(_.bind(_linker, {}, scope, el));\n }\n };\n\n function _linker(scope, el) {\n scope.ready = true;\n\n const Label = mapLabel($window.google);\n const infoWindow = new google.maps.InfoWindow();\n const labels = [];\n\n currentDestination.getCurrentDestination().then(destination => {\n broker.subscribe('hotelStaticMap', 'MAPLIGHTBOX', _.bind(buildMap, {}, destination));\n\n scope.$on('$destroy', function() {\n broker.unsubscribe('hotelStaticMap');\n });\n });\n\n function buildMap(destination) {\n scope.showModal = true;\n scope.close = () => {\n scope.showModal = false;\n };\n\n const map = new google.maps.Map(el.find('.map-canvas')[0], {\n zoom: scope.zoom || destination.ZoomLevel,\n scrollwheel: true,\n overviewMapControl: false,\n center: new google.maps.LatLng(\n destination.Latitude,\n destination.Longitude\n ),\n mapTypeControl: false,\n streetViewControl: true,\n scaleControl: true\n });\n\n google.maps.event.addListenerOnce(map, 'idle', () => {\n setTimeout(() => {\n google.maps.event.trigger(map, 'resize');\n map.setCenter(new google.maps.LatLng(\n destination.Latitude,\n destination.Longitude\n ));\n }, 500);\n });\n\n google.maps.event.addListener(map, 'idle', () => {\n const zoom = map.getZoom();\n const loadedBounds = map.getBounds();\n const sw = loadedBounds.getSouthWest();\n const ne = loadedBounds.getNorthEast();\n const url = `?X1=${sw.lng()}&Y1=${sw.lat()}&X2=${ne.lng()}&Y2=${ne.lat()}&Z=${zoom}`;\n\n hotelStaticMapService.getMarkers(url).then(res => {\n if (scope.hideLabels !== 'true') {\n _clearLabels();\n generateLabels(res.data.Markers, map);\n }\n });\n });\n }\n\n function generateLabels(points, map) {\n for (let i = 0, ii = points.length; i < ii; i++) {\n const p = points[i];\n const key = _getKey(p);\n const markerLabel = new Label({\n map,\n visible: true,\n position: new google.maps.LatLng(p.Y, p.X, true),\n text: p.N\n }, key, p.N);\n\n markerLabel.clickHandler =\n p.N === 1 ?\n _.bind(hotelClickHandler, markerLabel, p.Id, map) :\n _.bind(clusterClickHandler, markerLabel, p, map);\n\n labels.push(markerLabel);\n }\n }\n\n function clusterClickHandler(point, map) {\n const sw = new google.maps.LatLng(point.B.Y1, point.B.X1);\n const ne = new google.maps.LatLng(point.B.Y2, point.B.X2);\n const bds = new google.maps.LatLngBounds(sw, ne);\n map.fitBounds(bds);\n }\n\n function hotelClickHandler(estabId, map) {\n infoWindow.close();\n infoWindow.setContent('
        ');\n infoWindow.open(map, this);\n hotelRehydrator.hotel(estabId).then(h => {\n const t = '';\n const s = $rootScope.$new(true);\n\n s.hotel = h;\n infoWindow.setContent($compile(t)(s)[0]);\n });\n }\n\n function _clearLabels() {\n for (let i = 0, ii = labels.length; i < ii; i++) {\n labels[i].visible = false;\n }\n labels.length = 0;\n broker.publish('CHANGEDLABELVISIBILITY');\n }\n\n function _getKey(point) {\n return `${point.X}__${point.Y}__${point.N}__${point.T}`.replace(/\\./g, '_');\n }\n }\n}\n})();\n","'use strict';\n\nnamespace Core {\n class BasicContentCard {\n // Attr\n click: () => void;\n header: string;\n overlay: string;\n imageUrl: string;\n href: string;\n contentCardClass: string;\n }\n angular\n .module('core')\n .directive('basicContentCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: BasicContentCard,\n controllerAs: 'bcc',\n transclude: true,\n bindToController: {\n click: '&',\n header: '@',\n overlay: '@',\n imageUrl: '@',\n href: '@',\n contentCardClass: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=BasicContentCard'\n };\n });\n}\n","namespace Core {\r\n angular\r\n .module('core')\r\n .directive('blogSection', (): ng.IDirective => {\r\n return {\r\n restrict: 'E',\r\n templateUrl: (tElement, tAttrs) =>\r\n `partials/home/directivetemplate?type=LandingPage/BlogSection&search=${tAttrs.search}`,\r\n link: function($scope, element) {\r\n $scope.posts = [];\r\n let raw = element.find('.blog-post-raw');\r\n raw.children()\r\n .each(function () {\r\n let e = $(this);\r\n let imgStyle = e.find('.search-image-inner').attr('style');\r\n let imgFeatured = e.find('.post-featured-image-inner')\r\n .attr('style');\r\n let image = imgStyle ? imgStyle : imgFeatured || '';\r\n let blogSummaryText = e.find('.entry-summary p').text();\r\n let blogEntryContent = e.find('.entry-content p').text();\r\n let blogText = (blogSummaryText) ? blogSummaryText : blogEntryContent || '';\r\n let blogElipsis = blogText.slice(0, 150) + (blogText.length > 150 ? '...' : '') || '';\r\n\r\n $scope.posts.push({\r\n imgSrc: image ? image.match(/['\"](.*)['\"]/)![1]: '',\r\n heading: e.find('h4 a').text() || '',\r\n text: blogElipsis,\r\n href: e.find('h4 a').attr('href') || '',\r\n });\r\n });\r\n raw.remove();\r\n },\r\n };\r\n });\r\n}\r\n","/**\n * Created by bdickson on 15/06/2016.\n */\n\nnamespace TR {\n\n class BookingExtrasOption {\n model: any;\n val: any;\n group: string;\n price: number;\n\t priceTotal: number;\n showTotal: boolean;\n perPerson: boolean;\n isDelta: boolean;\n priceFull?: number;\n included?: boolean;\n priceRounded?: boolean;\n }\n\n angular\n .module('TR')\n .directive('bookingExtrasOption', ():ng.IDirective => {\n return {\n scope: {},\n bindToController: {\n model: '=',\n val: '=',\n group: '@',\n price: '=',\n perPerson: '=',\n showFrom: '=',\n showTotal: '=',\n priceTotal: '=',\n pricePerDay: '=',\n isDelta: '=?',\n priceFull: '=?',\n included: '=?',\n priceRounded: '=?'\n },\n controller: BookingExtrasOption,\n controllerAs: 'beo',\n templateUrl: 'partials/home/directivetemplate?type=BookingExtrasOption',\n transclude: true,\n replace: true\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n type HotelFromSessionService = Core.Hotels.HotelFromSessionService;\n type HotelWithRooms = Core.Hotels.HotelWithRooms;\n\n export interface CostBreakdownCodes {\n Hotel: number;\n CancellationProtection: number;\n }\n\n class BookingSummary {\n\n private readonly basketId :string;\n private readonly tripId :string;\n\n public atolAvailable: boolean;\n private atolCost: number;\n public cardFeeForDeposit: number;\n public cardFeeForTotal: number;\n public continueToNextStep: () => void;\n public priceDifference :number;\n public modifyEssentials :boolean;\n public readonly showContinueButton :boolean;\n private trip: any;\n public occupancy: Core.Trip.Occupancy;\n public attraction: any;\n public carhire: any;\n public flight: any;\n public hotel: HotelWithRooms;\n public insurance: any;\n public parking: any;\n public quoteRef: string;\n public quoteNo: string;\n public modifyEssentialsRoute: string;\n\n public transfer: any;\n private costBreakdown: any;\n private totalCost: any;\n private totalDiscount: any;\n private totalDeposit: any;\n private flightCost: number;\n private hotelCost: number;\n private cancellationProtection: number;\n private extrasCost: number;\n private hasDeposit: boolean;\n private hasPayDirect: boolean;\n private packagePrice: boolean;\n private changeFlightEnabled: string | boolean;\n private isKidsFree: boolean;\n private tax: any;\n private carHireExtras: any;\n private carHireExtrasTotal: number;\n private currencyCode: string;\n private extras: any;\n private flightCostBreakdown: any;\n private hotelCostBreakdown: any;\n private hotelExtrasCostBreakdown: any;\n private isMultiDestHoliday: boolean = false;\n private cityTaxTypeId: number = 22; // typeId of cityTax product in cost breakdown list\n private voucherDiscountMsg = { Message: '', Code: 0 };\n private voucherSuccessMsg = '';\n private isDiscountMsgPositive = false;\n private attractionsCost: number;\n private mandatoryTransferTypeId: number = 23;\n private hotelExtrasTypeIds: number[] = [1, 23, 24, 25, 26];\n private mandatoryTransfersCost: number = 0;\n\n constructor(\n private $q: ng.IQService,\n private $routeParams: any,\n private $scope: ng.IScope,\n private analytics: any,\n private basketStore: any,\n private broker: Broker,\n private hotelFromSession: HotelFromSessionService,\n private tripService: TripService,\n private taxationService: TaxationService,\n private costBreakdownCodes: CostBreakdownCodes,\n private occupancyService: any,\n private cookieService: any\n ) {\n this.voucherDiscountMsg = JSON.parse(cookieService.get('VoucherWarnMessage')\n || '{ \"Message\": \"\", \"Code\": 0 }') || { Message: '', Code: 0 };\n\n switch (this.voucherDiscountMsg!.Code!) {\n case 3:\n this.voucherSuccessMsg = 'Promotional discount applied';\n this.isDiscountMsgPositive = true;\n break;\n case 5:\n this.voucherSuccessMsg = 'Voucher code discount updated';\n this.isDiscountMsgPositive = true;\n break;\n case 6:\n this.voucherSuccessMsg = 'Voucher code discount applied';\n this.isDiscountMsgPositive = true;\n break;\n case 7:\n this.voucherSuccessMsg = 'Voucher code discount removed';\n this.isDiscountMsgPositive = true;\n break;\n default:\n this.voucherSuccessMsg = '';\n this.isDiscountMsgPositive = false;\n break;\n }\n\n this.changeFlightEnabled = this.changeFlightEnabled === 'true';\n tripService.getTrip($routeParams.tripId).then(trip => {\n if (trip && trip.BasketId) {\n this.trip = trip;\n //we can have two ever so slightly different modes that this directive is used in\n //1. as part of a holiday booking search\n //2. as part of a quote which has no trip info just a basket\n //we need to remove the reliance on the trip if possible\n\n this.getProductInfo(trip.BasketId, $routeParams.tripId);\n this.getCostBreakdown(trip.BasketId);\n\n //checks we have a number of optional attributes, so here are some rules\n //to keep us in check\n if (_.isUndefined(this.cardFeeForDeposit) !== _.isUndefined(this.cardFeeForTotal)) {\n throw Error('BookingSummary directive, both CardFee attributes should be supplied or neither.');\n }\n\n // Multi destination holidays, 'change flight' starts a new workflow which needs a loading screen\n if (trip && trip.HotelsRequest && trip.HotelsRequest.Destinations) {\n this.isMultiDestHoliday = true;\n }\n }\n });\n this.showContinueButton = !!this.continueToNextStep;\n const init = (basketId :string, tripId :string) => {\n this.getProductInfo(basketId, tripId);\n this.getCostBreakdown(basketId);\n\n broker.subscribe('BookingSummary', 'basketUpdated', () => {\n this.getCostBreakdown(basketId);\n this.updateFlightInfo(basketId);\n });\n\n broker.subscribe('BookingSummary', 'updatePricesOnPUP', e => {\n this.getCostBreakdown(basketId);\n this.updateFlightInfo(basketId);\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('BookingSummary');\n });\n\n if (tripId) {\n //need to override the package price setting to show flight cost breakdown\n this.tripService.usePackageRates(tripId)\n .then(packagePrice => this.packagePrice = packagePrice);\n this.modifyEssentialsRoute = `/holidays/options/${this.tripId}`;\n }\n\n if (!this.priceDifference) {\n this.priceDifference = 0;\n }\n };\n\n if (!$routeParams.tripId && this.basketId && this.tripId) {\n init(this.basketId, this.tripId);\n } else {\n tripService.getTrip($routeParams.tripId).then(trip => {\n if (trip && trip.BasketId) {\n init(trip.BasketId, trip.TripId);\n }\n });\n }\n this.quoteRef = $routeParams.quoteRef;\n this.quoteNo = $routeParams.quoteNo;\n }\n\n private getProductInfo(basketId :string, tripId :string): void {\n\n this.$q.all([\n this.basketStore.all(basketId),\n\t\t this.tripService.getTripReducedOccupancy(tripId)\n ]).then(results => {\n const basket = results[0];\n\n if (basket.h) {\n const hotelFromBasket = basket.h;\n\n this.hotelFromSession.getHotel(hotelFromBasket.AvailabilitySearchId,\n hotelFromBasket.Details.Id,\n tripId)\n .then(hotel => {\n this.hotel = angular.extend(hotel, hotelFromBasket);\n });\n }\n\n this.occupancy = results[1];\n\n this.flight = basket.f;\n this.attraction = basket.a;\n this.carhire = basket.c;\n this.insurance = basket.i;\n this.parking = basket.p;\n this.transfer = basket.t;\n });\n\n this.updateFlightInfo(basketId);\n this.updateHotelInfo(basketId);\n }\n\n private updateFlightInfo(basketId :string): ng.IPromise {\n return this.basketStore.flight(basketId)\n .then(flight => {\n if (!flight) {\n return;\n }\n this.flight = flight;\n this.flightCostBreakdown = flight.CostBreakdown;\n //remove atol cost from flight cost breakdown\n const atol = _.find(this.flightCostBreakdown, (item: any) => {\n return item.Description.indexOf('ATOL') >= 0;\n });\n if (atol) {\n this.flightCostBreakdown = _.filter(this.flightCostBreakdown, item => item !== atol);\n }\n return;\n });\n }\n\n private updateHotelInfo(basketId: string): ng.IPromise {\n return this.basketStore.hotel(basketId)\n .then(hotel => {\n if (!hotel) {\n return;\n }\n\n const costType = {\n Unknown: 0,\n Accommodation: 1,\n Discount: 20,\n AccommodationCancellationProtection: 21,\n AccommodationLocalFeesAndTaxes: 22,\n AccommodationExtraTransfer: 23,\n AccommodationExtraEvent: 24,\n AccommodationExtraAttraction: 25,\n AccommodationExtra: 26,\n };\n\n const costBreakdown = hotel.CostBreakdown;\n\n const extraCostItems = costBreakdown.filter(cost => {\n const match = _.get(cost, 'ParentId') && _.get(cost, 'TypeId') ===\n (costType.AccommodationExtraTransfer ||\n costType.AccommodationExtraEvent ||\n costType.AccommodationExtraAttraction ||\n costType.AccommodationExtra ||\n costType.AccommodationLocalFeesAndTaxes ||\n costType.AccommodationCancellationProtection ||\n costType.Discount);\n return match;\n\n }).filter(extra => extra);\n\n const roomCostItems = costBreakdown.filter(cost => !_.get(cost, 'ParentId')\n && _.get(cost, 'TypeId') === costType.Accommodation).map((room, LinkId) => {\n return { ...room, LinkId };\n });\n\n if (extraCostItems && extraCostItems.length > 0 && roomCostItems && roomCostItems.length > 0) {\n\n const updatedRoomCostItems = roomCostItems.map(room => {\n return { RoomId: room.Id, RoomDescription: room.Description };\n });\n\n const enhancedExtras = extraCostItems.map(extras => {\n return { ...extras, ...updatedRoomCostItems.find(acc => acc.RoomId === extras.ParentId) };\n });\n\n const updatedExtrasCostItems = enhancedExtras.map((extra, LinkId) => {\n const splitDescription = _.get(extra, 'RoomDescription').toString().split('(');\n const Description = splitDescription[1] ?\n `${extra.Description} (${splitDescription[1]}` :\n extra.Description;\n return {\n ...extra,\n Description,\n LinkId,\n };\n });\n\n const updatedCostBreakdown = [...roomCostItems, ...updatedExtrasCostItems];\n const costsSortedById = updatedCostBreakdown.sort((a, b) => (a.LinkId >= b.LinkId) ? 1 : -1);\n this.hotelCostBreakdown = costsSortedById;\n\n } else {\n\n this.hotelCostBreakdown = hotel.CostBreakdown.filter(item => {\n return this.hotelExtrasTypeIds.indexOf(item.TypeId) !== -1;\n });\n }\n\n this.hotelExtrasCostBreakdown = this.hotelCostBreakdown.filter(item => item.TypeId !== 1);\n\n return;\n });\n }\n\n private getCostBreakdown(basketId :string): void {\n\n this.$q.all([\n this.basketStore.totalDiscount(basketId),\n this.basketStore.totalDeposit(basketId, this.$routeParams.ProductId),\n this.basketStore.costBreakdownGrouped(basketId),\n this.basketStore.rules(basketId, this.$routeParams.ProductId),\n this.basketStore.payDirectTotal(basketId),\n\t\t this.basketStore.carHire(basketId),\n this.basketStore.isAtolProtected(basketId),\n this.basketStore.attractionCost(basketId)\n ]).then(([\n totalDiscount,\n totalDeposit,\n costBreakdownGrouped,\n rules,\n payDirectTotal,\n carHire,\n isAtolProtected,\n attractionsCost\n ]) => {\n\n this.totalDiscount = totalDiscount;\n this.totalDeposit = totalDeposit;\n this.costBreakdown = costBreakdownGrouped;\n this.totalCost = costBreakdownGrouped.total;\n this.atolAvailable = isAtolProtected;\n this.attractionsCost = attractionsCost;\n\n _.each(this.costBreakdown, (cb) => {\n if (cb.group === 1) {\n // HOTEL\n this.hotelCost = cb.costBreakdown\n .reduce((totalCost, currentHotel) =>\n totalCost\n + (currentHotel.UnitAmount > 0\n ? currentHotel.UnitAmount\n : (currentHotel.TypeId !== 20 ? currentHotel.UnitAmount : 0)),\n 0); /* id: 20 is discounts */\n this.cancellationProtection = _.get(cb.costBreakdown.find(cost =>\n cost.TypeId === this.costBreakdownCodes.CancellationProtection), 'UnitAmount', 0);\n this.tax = cb.costBreakdown\n .reduce((totalCost, currentHotel) =>\n totalCost + (currentHotel.TypeId === this.cityTaxTypeId ? currentHotel.UnitAmount : 0),\n 0);\n if (this.tax && this.tax > 0) {\n this.hotelCost = this.hotelCost - this.tax;\n }\n if (this.cancellationProtection) {\n this.hotelCost = this.hotelCost - this.cancellationProtection;\n }\n this.mandatoryTransfersCost = cb.costBreakdown\n .reduce((totalCost, currentHotel) =>\n totalCost + (currentHotel.TypeId === this.mandatoryTransferTypeId ?\n currentHotel.UnitAmount : 0),\n 0);\n } else if (cb.group === 2) {\n // FLIGHTS\n // Isolate the ATOL cost\n // Ideally we would be able to search by type but we have to use the description\n const atol = _.find(cb.costBreakdown, (item: any) => {\n return item.Description.indexOf('ATOL') >= 0;\n });\n if (atol) {\n this.atolCost = atol.UnitAmount * atol.Quantity;\n this.flightCost = cb.total - this.atolCost; // subtract the atol cost from the flights total\n } else {\n this.flightCost = cb.total;\n }\n } else if (cb.group === 3) {\n // EXTRAS\n this.extrasCost = cb.total;\n this.extras = this.basketStore.extrasBreakdown(cb.costBreakdown);\n }\n });\n\n this.hasDeposit = rules.depositAllowed;\n this.hasPayDirect = payDirectTotal > 0;\n\n let carHireExtras: any = _.get(carHire, 'RequestedItems');\n\n this.carHireExtras = carHireExtras;\n this.carHireExtrasTotal = carHireExtras ?\n carHireExtras.reduce((total, extra) => total += extra.UnitAmount, 0) :\n undefined;\n });\n\n }\n\n public editEssentials() {\n this.analytics.track('mixpanel', 'EmailMeEditQuote');\n }\n\n public showDetails(e) {\n const passengers = this.occupancyService.getTotalPeopleCounts();\n e.preventDefault();\n this.broker.publish('showModalFlightDetails', { flight: this.flight.Details.Itinerary, passengers });\n }\n }\n\n angular\n .module('core')\n .directive('bookingSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n bindToController: {\n basketId: '=?', //ignored if a TripId is available from the routeParams\n tripId: '=?', //ignored if a TripId is available from the routeParams\n cardFeeForDeposit: '=?',\n cardFeeForTotal: '=?',\n changeFlightEnabled: '@?',\n continueToNextStep: '&?',\n occupancy: '=?',\n //for quotes we also watch out for price changes and tell the user so enable that functionality if\n //set. (i know not great but short of duplicating all of this code it seems like the best thing to do)\n priceDifference: '=?',\n modifyEssentials: '=?',\n currencyCode: '=',\n showAncillaries: '@?'\n },\n controller: BookingSummary,\n controllerAs: 'hbs',\n replace: true,\n templateUrl: (element, attr) => {\n if (attr.templateVersion) {\n return 'partials/booking/template?name=BookingSummary&version='\n + attr.templateVersion;\n }\n return 'partials/home/directivetemplate?type=BookingSummary';\n }\n };\n\n });\n\n}\n","/// \n'use strict';\n\nnamespace ekh {\n\n const ONE_SEVEN = !!TRPCONFIG.Rtl ? '‎7 x 1' : '1 x 7';\n const ONE_TEN = !!TRPCONFIG.Rtl ? '‎10 x 1' : '1 x 10';\n const TWO_SEVEN = !!TRPCONFIG.Rtl ? '‎7 x 2' : '2 x 7';\n const ONE_TWO_THREE = !!TRPCONFIG.Rtl ? '‎23 x 1' : '1 x 23';\n const TWO_TWO_THREE = !!TRPCONFIG.Rtl ? '‎23 x 2' : '2 x 23';\n const TWO_THREE_TWO = !!TRPCONFIG.Rtl ? '‎32 x 2' : '2 x 32';\n\n\n export enum TransformedType {\n EconomySpecial,\n EconomySaver,\n EconomyFlex,\n EconomyFlexPlus,\n PremiumEconomyFlexPlus,\n BusinessSpecial,\n BusinessSaver,\n BusinessFlex,\n BusinessFlexPlus,\n FirstSaver,\n FirstFlex,\n FirstFlexPlus,\n NotDefined\n }\n\n export enum AttributeTypes {\n Baggage = 0,\n CabinBaggage,\n SeatsSelection,\n Meals,\n WiFi,\n Refundable,\n Changes,\n PriorityCheckin,\n FastTrack\n }\n\n export interface IBrandedFareType {\n FlightSectors: IFlightSector[];\n BrandedFareTypeTotalPrice: number;\n [key: string]: any;\n }\n\n export interface IFlightSector {\n [key: string]: any;\n TransformedType: TransformedType;\n BaggageType: string;\n BaggageText: string;\n CabinBaggageText: string;\n SeatsSelectionText: string;\n ChauffeurText: string;\n }\n\n export class BrandedFareTypesService {\n\n constructor(\n private dateUtil: any,\n private guidService: Core.GuidService,\n private resourceService: Core.ResourceService,\n private basketStore: any\n ) {\n }\n\n public allPayloads: any = [];\n public sentApi: boolean = false;\n public brandedFares: any = [];\n public flightMilesToPkgPP: number = 0;\n\n public transform(brandedFareType: { [key: string]: any }): IBrandedFareType {\n const flightSectors = brandedFareType.FlightSectors.map(fs => {\n fs.TransformedType = this._getTransformedType(fs.BrandTitle);\n fs.BaggageType = this._getBaggageType(fs);\n fs.BaggageText = this.getBaggage(fs);\n fs.CabinBaggageText = this.getCabinBaggage(fs);\n fs.ChauffeurText = this.getChauffeur(fs);\n fs.SeatsSelectionText = this.getSeatsSelection(fs);\n return fs;\n });\n\n const brandedFareTypePrice = this.getBrandedFareTypePrice(brandedFareType);\n this.setSkywards(brandedFareType);\n\n let defaultPrice;\n\n return {\n ...brandedFareType,\n FlightSectors: flightSectors,\n BrandedFareTypeTotalPrice: brandedFareTypePrice\n };\n }\n\n public squeeze(brandedfareTypes: IBrandedFareType[]): IBrandedFareType[] {\n return brandedfareTypes.reduce((prev: IBrandedFareType[], curBf: IBrandedFareType) => {\n if (prev.length) {\n const lastBf = prev.slice(-1)[0];\n const sectorFirstEqual = this._isEqualFlightSectors(\n lastBf.FlightSectors[0],\n curBf.FlightSectors[0]\n );\n const sectorSecondEqual = this._isEqualFlightSectors(\n lastBf.FlightSectors[1],\n curBf.FlightSectors[1]\n );\n\n if (!sectorFirstEqual || !sectorSecondEqual) {\n prev.push(curBf);\n }\n } else {\n prev.push(curBf);\n }\n return prev;\n }, [] as IBrandedFareType[]);\n }\n\n private getCabinName(title) {\n let classes = [\n 'Premium Economy',\n 'Economy',\n 'Business',\n 'First'\n ];\n\n for (let i = 0; i < classes.length; i++) {\n if (title.match(classes[i])) {\n return classes[i];\n }\n }\n }\n\n private addCabinType(data) {\n if (!data.CabinType) {\n let cabinType = this.getCabinName(data.BrandTitle);\n data.CabinType = cabinType;\n }\n }\n\n private _isEqualFlightSectors(oneFs: IFlightSector, secondFs: IFlightSector): boolean {\n this.addCabinType(oneFs);\n this.addCabinType(secondFs);\n const props = [\n 'BaggageText',\n 'CabinBaggageText',\n 'CabinType',\n 'SeatsSelectionText',\n 'ChauffeurText'];\n let res = true;\n for (let i = 0; i < props.length; ++i) {\n let propName = props[i];\n if (oneFs[propName] !== secondFs[propName]) {\n res = false;\n break;\n }\n }\n return res;\n }\n\n public getBrandedFareTypePrice(brandedFareType: { [key: string]: any }): number {\n if (brandedFareType.TotalAmount) {\n return brandedFareType.TotalAmount;\n }\n const adultPrice = this._getPricePerPassengerAge('Adult', brandedFareType);\n const childPrice = this._getPricePerPassengerAge('Child', brandedFareType);\n const infantPrice = this._getPricePerPassengerAge('Infant', brandedFareType);\n return adultPrice + childPrice + infantPrice;\n }\n\n private _getPricePerPassengerAge(type: string, brandedFareType): number {\n const fare = _.get(brandedFareType, `${type}Fare.Amount`) || 0;\n const fareQuantity = _.get(brandedFareType.priceQuantities, `${type}FareQuantity`) || 0;\n const tax = _.get(brandedFareType, `${type}Tax.Amount`) || 0;\n const taxQuantity = _.get(brandedFareType.priceQuantities, `${type}TaxQuantity`) || 0;\n return fare * fareQuantity + tax * taxQuantity;\n }\n\n public async getCancellationCharges(id) {\n let payload = {\n 'BasketId': id\n };\n\n try {\n let url = `/api/holidays/basketcancellationcharges`;\n const response = await fetch(url, {\n method: 'post',\n body: JSON.stringify(payload),\n mode: 'cors',\n headers: new Headers({\n 'Content-Type': 'application/json'\n })\n });\n\n const details = await response.json();\n return details;\n } catch (error) {\n console.log('error', error);\n throw error;\n }\n }\n\n public getBaggage(sector: IFlightSector) {\n switch (sector.BaggageType) {\n case 'ONE_TWO_THREE':\n return `${ONE_TWO_THREE} ${this.resourceService.get('BRANDED_FARE_TYPES_KGPP')}`;\n case 'PIECE_CONCEPT':\n return this.resourceService.get('BRANDED_FARE_TYPES_BAGGAGE_PIECE_CONCEPT');\n case 'TWO_TWO_THREE':\n return `${TWO_TWO_THREE} ${this.resourceService.get('BRANDED_FARE_TYPES_KGPP')}`;\n case 'TWO_THREE_TWO':\n return `${TWO_THREE_TWO} ${this.resourceService.get('BRANDED_FARE_TYPES_KGPP')}`;\n case 'NOT_INCLUDED':\n return this.resourceService.get('BRANDED_FARE_TYPES_BAGGAGE_NOT_INCLUDED');\n default:\n return `${sector.BaggageAllowanceTotalKg} ${this.resourceService.get('BRANDED_FARE_TYPES_KGPP')}`;\n }\n }\n\n private _getBaggageType(sector: IFlightSector) {\n const attr = this._getAttribute(sector, AttributeTypes.Baggage);\n const checkedMatcher = attr.Text.match(/^Checked[^\\d]+(\\d+)kg/);\n const cabin = this._getCabin(sector);\n const isEconomySaver = sector.TransformedType === TransformedType.EconomySaver;\n const isEconomySpecial = sector.TransformedType === TransformedType.EconomySpecial;\n const isPremiumEconomyFlexPlus = sector.TransformedType === TransformedType.PremiumEconomyFlexPlus;\n\n if (attr.AttributeInclusionType === 0) {\n switch (true) {\n case checkedMatcher !== null:\n return checkedMatcher[1];\n case cabin === 1 && isEconomySpecial:\n return 'ONE_TWO_THREE';\n case cabin === 1 && isEconomySaver:\n return 'PIECE_CONCEPT';\n case cabin === 1:\n return 'TWO_TWO_THREE';\n default:\n return 'TWO_THREE_TWO';\n }\n } else if (isPremiumEconomyFlexPlus) {\n return sector.BaggageAllowanceTotalKg.toString();\n } else {\n return 'NOT_INCLUDED';\n }\n }\n\n public setCabinBaggage(attr, cabin) {\n let value = '';\n if (attr.AttributeInclusionType === 0 && cabin === 1) {\n value = ONE_SEVEN;\n } else if (attr.AttributeInclusionType === 0 && cabin === 2) {\n value = ONE_TEN;\n } else {\n value = TWO_SEVEN;\n }\n\n return `${value} ${this.resourceService.get('BRANDED_FARE_TYPES_KGPP')}`;\n }\n\n public getCabinBaggage(sector: IFlightSector) {\n const cabin = this._getCabin(sector);\n const attr = this._getAttribute(sector, AttributeTypes.CabinBaggage);\n return this.setCabinBaggage(attr, cabin);\n }\n\n public getSeatsSelection(sector: IFlightSector) {\n if (this.isRestrictedSeats(sector)) {\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_RESTRICTED');\n }\n const attr = this._getAttribute(sector, AttributeTypes.SeatsSelection);\n if (attr.AttributeInclusionType === 0) {\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_COMPLIMENTARY');\n } else {\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_SELECTION_AT_CHECK_IN');\n }\n }\n\n public isRestrictedSeats(sector: IFlightSector): boolean {\n const attr = this._getAttribute(sector, AttributeTypes.SeatsSelection);\n return (attr.AttributeInclusionType === 0 || attr.AttributeInclusionType === 3)\n && sector.TransformedType === TransformedType.BusinessSpecial;\n }\n\n public getChauffeur(sector: IFlightSector) {\n const cabin = this._getCabin(sector);\n return sector.TransformedType === TransformedType.BusinessSpecial\n || sector.TransformedType === TransformedType.PremiumEconomyFlexPlus\n || cabin === 1 ?\n this.resourceService.get('BRANDED_FARE_TYPES_CHAUFFEUR_NOT_ELIGIBLE') :\n this.resourceService.get('BRANDED_FARE_TYPES_CHAUFFEUR_ELIGIBLE');\n }\n\n public containPieceBaggageConcept(fareTypes: IBrandedFareType[], sectorNumber: number): boolean {\n let res = false;\n for (let i = 0; i < fareTypes.length; ++i) {\n const sector = fareTypes[i].FlightSectors[sectorNumber];\n if (sector.BaggageType === 'PIECE_CONCEPT') {\n res = true;\n break;\n }\n }\n return res;\n }\n\n public calculateTotalFares(fare, qtys) {\n if (fare && qtys && fare.AdultFare && fare.AdultFare.Amount) {\n let adultCost = fare.AdultFare.Amount;\n let adultQty = qtys.AdultFareQuantity;\n let childCost = fare.ChildFare.Amount;\n let childQty = qtys.ChildFareQuantity;\n let infantCost = fare.InfantFare.Amount;\n let infantQty = qtys.InfantFareQuantity;\n let totalAdultFares = adultCost * adultQty;\n let totalChildFares = childCost * childQty;\n let totalInfantFares = infantCost * infantQty;\n let totalFares = totalAdultFares + totalChildFares + totalInfantFares;\n return totalFares;\n }\n }\n\n public calculateTotalTaxes(fare, qtys) {\n if (fare && qtys && fare.AdultTax && fare.AdultTax.Amount) {\n let adultTaxCost = fare.AdultTax.Amount;\n let adultTaxQty = qtys.AdultTaxQuantity;\n let childTaxCost = fare.ChildTax.Amount;\n let childTaxQty = qtys.ChildTaxQuantity;\n let infantTaxCost = fare.InfantTax.Amount;\n let infantTaxQty = qtys.InfantTaxQuantity;\n let totalAdultTax = adultTaxCost * adultTaxQty;\n let totalChildTax = childTaxCost * childTaxQty;\n let totalInfantTax = infantTaxCost * infantTaxQty;\n let totalTaxes = totalAdultTax + totalChildTax + totalInfantTax;\n return totalTaxes;\n }\n }\n\n public getPriceQtys(data) {\n return data;\n }\n\n public setSkywards(arr) {\n arr.AccruedMiles = [{\n Miles: 0\n }];\n }\n\n public setPriceDifference(arr, defaultPrice, i) {\n let farePrice = arr[i].BrandedFareTypeTotalPrice;\n let priceDiff = Math.ceil(farePrice - defaultPrice);\n arr[i].BrandedFarePriceDifference = priceDiff;\n }\n\n public getPriceDifference(fareTypes) {\n let defaultPrice;\n let undefinedIndexes: number[] = [];\n for (let i = 0; i < fareTypes.length; i++) {\n\n if (fareTypes[i].IsSelected) {\n defaultPrice = fareTypes[i].BrandedFareTypeTotalPrice;\n }\n\n if (defaultPrice === undefined) {\n undefinedIndexes.push(i);\n }\n\n this.setPriceDifference(fareTypes, defaultPrice, i);\n }\n\n if (undefinedIndexes.length > 0) {\n for (let j = 0; j < undefinedIndexes.length; j++) {\n this.setPriceDifference(fareTypes, defaultPrice, j);\n }\n }\n\n return fareTypes;\n }\n\n public getDepartureCode(legs) {\n if (legs) {\n for (let i = 0; i < legs.length; i++) {\n if (legs[i].LegType === 'outbound') {\n return legs[i].DepartureAirport.Code;\n }\n }\n }\n }\n\n public getDestinationCode(legs) {\n if (legs) {\n for (let i = 0; i < legs.length; i++) {\n if (legs[i].LegType === 'outbound') {\n return legs[i].ArrivalAirport.Code;\n }\n }\n }\n }\n\n public getDepartureDate(legs) {\n for (let i = 0; i < legs.length; i++) {\n if (legs[i].LegType === 'outbound') {\n return legs[i].DepartureDate;\n }\n }\n }\n\n public async collatePayloads(payload, domainId) {\n this.allPayloads.push(payload);\n let elemCount = document.querySelectorAll('.flight-listing-container').length;\n elemCount = elemCount - 1;\n if (this.allPayloads.length === elemCount) {\n let theCall = await this.callMilesApi(this.allPayloads, domainId);\n sessionStorage.setItem('flightsSkywards', JSON.stringify(theCall));\n TRPCONFIG.Domain.flightsSkywards = theCall;\n return theCall;\n }\n }\n\n\n public async callMilesApi(payload, domainId) {\n try {\n let url = `/api/skywards/Accrual/getMiles?domainId=${domainId}&bookingChannelId=2`;\n const response = await fetch(url, {\n method: 'post',\n body: JSON.stringify(payload),\n mode: 'cors',\n headers: new Headers({\n 'Content-Type': 'application/json'\n })\n });\n\n const miles = await response.json();\n return miles;\n } catch (error) {\n console.log('error', error);\n throw error;\n }\n\n }\n\n public async payloadEntry(id, trip, legs, hotel, price) {\n let domainId = TRPCONFIG.Domain.DomainId;\n let tripHotel;\n let pid = id;\n if (trip.HotelsRequest) {\n tripHotel = trip.HotelsRequest;\n } else {\n tripHotel = trip.HotelInfo;\n }\n if (id === null) {\n pid = this.guidService.uuid();\n }\n\n let payload =\n {\n id: pid,\n price: price,\n bookingDate: this.dateUtil.serialiseDate(Date.now()),\n flights: [\n {\n departureAirportCode: this.getDepartureCode(legs),\n departureDate: this.dateUtil.serialiseDate(this.getDepartureDate(legs))\n }\n ],\n hotels: [\n {\n estabGroupIds: hotel.EstabGroupIds,\n checkInDate: tripHotel.CheckInDate\n }\n ]\n };\n return await this.callMilesApi([payload], domainId);\n }\n\n private languageCheck(cabinType) {\n switch (cabinType) {\n case 'Economy':\n case 'Økonomi klasse':\n case 'Economy Class':\n case 'Ekonomiklass':\n case 'الدرجة السياحية':\n return 'Economy';\n case 'Premium Economy':\n case 'Premium ekonomiklass':\n case 'الدرجة الاقتصادية المميزة':\n return 'Premium Economy';\n case 'Business':\n case 'Business Class':\n case 'درجة رجال الأعمال':\n return 'Business';\n case 'First':\n case 'Erste Klasse':\n case 'Första klass':\n case 'الدرجة الأولى':\n return 'First';\n default:\n return '';\n }\n }\n\n private getCabin(fareBrandLeg, cabinLeg) {\n let legArr = fareBrandLeg.split(' ');\n let updatedLegArr: any = [];\n\n let isPremium = legArr.includes('Premium');\n\n if (isPremium) {\n legArr.splice(0, 2);\n }\n\n legArr.forEach((cabin, i) => {\n if (cabin !== cabinLeg) {\n if ((cabinLeg !== 'Premium Economy' && i === 1) ||\n (cabinLeg === 'Premium Economy' && i === 0)) {\n cabin = cabin.toLowerCase();\n }\n updatedLegArr.push(cabin);\n }\n });\n return updatedLegArr;\n }\n\n private getCabinCode(cabinType) {\n switch (cabinType) {\n case 'Economy':\n return 'Y';\n case 'Premium Economy':\n return 'W';\n case 'Business':\n return 'J';\n case 'First':\n return 'F';\n default:\n return '';\n }\n }\n\n private getFlightMiles(hotelSearch, origin, destination, cabinCodeLeg, journeyType, fareBrandLegResult) {\n if (origin && destination && cabinCodeLeg && journeyType) {\n return hotelSearch.getFlightMiles(origin, destination, cabinCodeLeg, journeyType)\n .then(result => {\n if (result.getMilesFromCouchbase.miles &&\n result.getMilesFromCouchbase.miles.earn &&\n result.getMilesFromCouchbase.miles.earn.skywards[fareBrandLegResult]) {\n return result.getMilesFromCouchbase.miles.earn.skywards[fareBrandLegResult].skywardsMiles;\n }\n });\n }\n }\n\n\n public async getFareInfo\n (fareOrLegsSelection, fareOrLegsAndBrandtitles, bft, fare,\n hotelSearch, origin, destination, getBrandTitleFirstLeg, getBrandTitleSecondLeg) {\n\n bft = Number(bft);\n\n let flight = fare.FlightSectors;\n\n if (!fare.FlightSectors) {\n flight = fare.Legs;\n }\n\n if (fareOrLegsSelection && fareOrLegsSelection !== undefined) {\n if (fareOrLegsAndBrandtitles) {\n let journeyType ='RT';\n let fareBrand = flight[0].BrandTitle;\n let cabinType = flight[0].CabinType;\n\n if (!fareBrand) {\n fareBrand = getBrandTitleFirstLeg;\n }\n\n cabinType = this.languageCheck(cabinType);\n let updatedFirstLegArr = this.getCabin(fareBrand, cabinType);\n let fareBrandResult = updatedFirstLegArr.join('');\n\n let cabinCode = this.getCabinCode(cabinType);\n\n bft = await this.getFlightMiles\n (hotelSearch, origin, destination, cabinCode, journeyType, fareBrandResult);\n } else {\n let journeyType ='OW';\n let fareBrandFirstLeg = flight[0].BrandTitle;\n let cabinTypeFirstLeg = flight[0].CabinType;\n let fareBrandSecondLeg = flight[1].BrandTitle;\n let cabinTypeSecondLeg = flight[1].CabinType;\n\n if (!fareBrandFirstLeg) {\n fareBrandFirstLeg = getBrandTitleFirstLeg;\n }\n\n if (!fareBrandSecondLeg) {\n fareBrandSecondLeg = getBrandTitleSecondLeg;\n }\n\n cabinTypeFirstLeg = this.languageCheck(cabinTypeFirstLeg);\n cabinTypeSecondLeg = this.languageCheck(cabinTypeSecondLeg);\n\n let updatedFirstLegArr = this.getCabin(fareBrandFirstLeg, cabinTypeFirstLeg);\n let updatedSecondLegArr = this.getCabin(fareBrandSecondLeg, cabinTypeSecondLeg);\n\n let fareBrandFirstLegResult = updatedFirstLegArr.join('');\n let fareBrandSecondLegResult = updatedSecondLegArr.join('');\n\n let cabinCodefirstLeg =\n this.getCabinCode(cabinTypeFirstLeg);\n let cabinCodeSecondLeg =\n this.getCabinCode(cabinTypeSecondLeg);\n\n let skywardFlightMileForFirstLeg =\n await this.getFlightMiles(hotelSearch, origin, destination,\n cabinCodefirstLeg, journeyType, fareBrandFirstLegResult);\n\n let skywardFlightMileForSecondLeg =\n await this.getFlightMiles(hotelSearch, origin, destination,\n cabinCodeSecondLeg, journeyType, fareBrandSecondLegResult);\n\n bft = parseInt(skywardFlightMileForFirstLeg,10)+\n parseInt(skywardFlightMileForSecondLeg,10);\n }\n } else {\n if (fare.Legs[0].BrandTitle === fare.Legs[1].BrandTitle) {\n let journeyType = 'RT';\n let fareBrand = fare.Legs[0].BrandTitle;\n let cabinType = fare.Legs[0].CabinType;\n\n cabinType = this.languageCheck(cabinType);\n let updatedFirstLegArr = this.getCabin(fareBrand, cabinType);\n let fareBrandResult = updatedFirstLegArr.join('');\n let cabinCode = this.getCabinCode(cabinType);\n\n bft = await this.getFlightMiles(hotelSearch, origin, destination,\n cabinCode, journeyType, fareBrandResult);\n } else {\n let journeyType ='OW';\n let cabinTypeFirstLeg = fare.Legs[0].CabinType;\n let cabinTypeSecondLeg = fare.Legs[1].CabinType;\n let fareBrandFirstLeg = fare.Legs[0].BrandTitle;\n let fareBrandSecondLeg = fare.Legs[1].BrandTitle;\n\n cabinTypeFirstLeg = this.languageCheck(cabinTypeFirstLeg);\n cabinTypeSecondLeg = this.languageCheck(cabinTypeSecondLeg);\n\n let updatedFirstLegArr = this.getCabin(fareBrandFirstLeg, cabinTypeFirstLeg);\n let updatedSecondLegArr = this.getCabin(fareBrandSecondLeg, cabinTypeSecondLeg);\n\n let fareBrandFirstLegResult = updatedFirstLegArr.join('');\n let fareBrandSecondLegResult = updatedSecondLegArr.join('');\n\n let cabinCodefirstLeg = this.getCabinCode(cabinTypeFirstLeg);\n let cabinCodeSecondLeg = this.getCabinCode(cabinTypeSecondLeg);\n\n let skywardFlightMileForFirstLeg =\n await this.getFlightMiles(hotelSearch, origin, destination,\n cabinCodefirstLeg, journeyType, fareBrandFirstLegResult);\n\n let skywardFlightMileForSecondLeg =\n await this.getFlightMiles(hotelSearch, origin, destination,\n cabinCodeSecondLeg, journeyType, fareBrandSecondLegResult);\n\n bft = parseInt(skywardFlightMileForFirstLeg,10)+\n parseInt(skywardFlightMileForSecondLeg,10);\n }\n }\n\n this.flightMilesToPkgPP = bft;\n return bft;\n }\n\n private _getCabin(sector: IFlightSector) {\n return sector.Segments[0].Cabin;\n }\n\n private _getAttribute(leg, attrType: AttributeTypes): { [key: string]: any } {\n return _.find(leg.BrandAttributes, { AttributeType: attrType });\n }\n\n public _getTransformedType(brandTitle: string): TransformedType {\n switch (brandTitle.trim().toLowerCase()) {\n case 'economy special':\n return TransformedType.EconomySpecial;\n case 'eco special':\n return TransformedType.EconomySpecial;\n case 'economy saver':\n return TransformedType.EconomySaver;\n case 'eco saver':\n return TransformedType.EconomySaver;\n case 'economy flex':\n return TransformedType.EconomyFlex;\n case 'eco flex':\n return TransformedType.EconomyFlex;\n case 'economy flex plus':\n return TransformedType.EconomyFlexPlus;\n case 'eco flexplus':\n return TransformedType.EconomyFlexPlus;\n case 'premium economy flex plus':\n return TransformedType.PremiumEconomyFlexPlus;\n case 'prem eco flexplus':\n return TransformedType.PremiumEconomyFlexPlus;\n case 'business special':\n return TransformedType.BusinessSpecial;\n case 'business saver':\n return TransformedType.BusinessSaver;\n case 'business flex':\n return TransformedType.BusinessFlex;\n case 'business flex plus':\n return TransformedType.BusinessFlexPlus;\n case 'business flexplus':\n return TransformedType.BusinessFlexPlus;\n case 'first saver':\n return TransformedType.FirstSaver;\n case 'first flex':\n return TransformedType.FirstFlex;\n case 'first flex plus':\n return TransformedType.FirstFlexPlus;\n case 'first flexplus':\n return TransformedType.FirstFlexPlus;\n default:\n return TransformedType.NotDefined;\n }\n }\n\n public getClassName(fc) {\n let classObj = {\n 'F': 'First Flex Plus',\n 'A': 'First Flex',\n 'Z': 'First Others',\n 'J': 'Business Flex Plus',\n 'C': 'Business Flex Plus',\n 'I': 'Business Flex',\n 'O': 'Business Saver',\n 'H': 'Business Special',\n 'D': 'Business Others',\n 'P': 'Business Others',\n 'W': 'Premium Economy Flex Plus',\n 'E': 'Premium Economy Flex Plus',\n 'N': 'Premium Economy Others',\n 'Y': 'Economy Flex Plus',\n 'R': 'Economy Flex Plus',\n 'M': 'Economy Flex',\n 'B': 'Economy Flex',\n 'U': 'Economy Flex',\n 'K': 'Economy Flex',\n 'Q': 'Economy Saver',\n 'L': 'Economy Saver',\n 'T': 'Economy Saver',\n 'X': 'Economy Special',\n 'V': 'Economy Special',\n 'G': 'Economy Others',\n 'S': 'Economy Others'\n };\n\n let coKey = Object.keys(classObj);\n for(let i = 0; i < coKey.length; i++) {\n if (coKey[i] === fc) {\n return classObj[coKey[i]];\n }\n }\n }\n\n public getBookingClassName(fc) {\n let classObj = {\n 'F': 'Flex Plus',\n 'A': 'Flex',\n 'Z': 'Others',\n 'J': 'Flex Plus',\n 'C': 'Flex Plus',\n 'I': 'Flex',\n 'O': 'Saver',\n 'H': 'Special',\n 'D': 'Others',\n 'P': 'Others',\n 'W': 'Flex Plus',\n 'E': 'Flex Plus',\n 'N': 'Others',\n 'Y': 'Flex Plus',\n 'R': 'Flex Plus',\n 'M': 'Flex',\n 'B': 'Flex',\n 'U': 'Flex',\n 'K': 'Flex',\n 'Q': 'Saver',\n 'L': 'Saver',\n 'T': 'Saver',\n 'X': 'Special',\n 'V': 'Special',\n 'G': 'Others',\n 'S': 'Others'\n };\n\n let coKey = Object.keys(classObj);\n for(let i = 0; i < coKey.length; i++) {\n if (coKey[i] === fc) {\n return classObj[coKey[i]];\n }\n }\n }\n\n public _setClassName(type: ekh.TransformedType) {\n switch (type) {\n case ekh.TransformedType.EconomySpecial:\n return 'economy-special';\n case ekh.TransformedType.EconomySaver:\n return 'economy-saver';\n case ekh.TransformedType.EconomyFlex:\n return 'economy-flex';\n case ekh.TransformedType.EconomyFlexPlus:\n return 'economy-flex-plus';\n case ekh.TransformedType.PremiumEconomyFlexPlus:\n return 'premium-economy-flex-plus';\n case ekh.TransformedType.BusinessSpecial:\n return 'business-special';\n case ekh.TransformedType.BusinessSaver:\n return 'business-saver';\n case ekh.TransformedType.BusinessFlex:\n return 'business-flex';\n case ekh.TransformedType.BusinessFlexPlus:\n return 'business-flex-plus';\n case ekh.TransformedType.FirstSaver:\n return 'first-saver';\n case ekh.TransformedType.FirstFlex:\n return 'first-flex';\n case ekh.TransformedType.FirstFlexPlus:\n return 'first-flex-plus';\n default:\n return '';\n }\n }\n\n }\n\n angular\n .module('ekh')\n .service('brandedFareTypesService', BrandedFareTypesService);\n}\n","/// \n/// \n/// \n/// \n/// \n\n'use strict';\n\nnamespace Core {\n\n class BrandedFare {\n onSelect: (any) => void;\n fare: ekh.IBrandedFareType;\n classNameIn: string;\n classNameOut: string;\n selectButtonLabel: string;\n selectedButtonLabel: string;\n selectedFareTotalPrice: number;\n currency: string;\n pieceConceptLegIn: boolean;\n pieceConceptLegOut: boolean;\n fs: any = sessionStorage.getItem('storeSelectedFlight');\n qtys: any = sessionStorage.getItem('priceQtys');\n collected: boolean = false;\n guid: any = this.guidService.uuid();\n hts: any = sessionStorage.getItem('hotelDetailsSkywards');\n skywardsPoints: number = 0;\n flightMilesToPkgPP: number = 0;\n code: string = TRPCONFIG.Domain.CultureCode;\n constructor (\n private brandedFareTypesService: ekh.BrandedFareTypesService,\n private resourceService: Core.ResourceService,\n private $filter: ng.IFilterService,\n private basketStore: any,\n private guidService: Core.GuidService,\n private tripService: any,\n private $routeParams: ng.route.IRouteParamsService,\n private hotelSearch: any,\n ) {\n\n }\n\n $onInit() {\n this.getPackage(this.fare);\n this.classNameIn = this.brandedFareTypesService._setClassName(this.fare.FlightSectors[0].TransformedType);\n this.classNameOut = this.brandedFareTypesService._setClassName(this.fare.FlightSectors[1].TransformedType);\n this.selectButtonLabel = this.resourceService.get('BRANDED_FARE_TYPES_BUTTON_SELECT');\n this.selectedButtonLabel = this.resourceService.get('BRANDED_FARE_TYPES_BUTTON_SELECTED');\n }\n\n public select() {\n TRPCONFIG.Domain.totalHolidayPrice = undefined;\n this.onSelect(this.fare);\n\n let oldPrice = TRPCONFIG.Domain.FlightFare.BrandedFareTypeTotalPrice;\n let t = this;\n\n let intvl = setInterval(function(){\n if (oldPrice !== TRPCONFIG.Domain.FlightFare.BrandedFareTypeTotalPrice) {\n clearInterval(intvl);\n t.getCancellationDetails();\n }\n }, 100);\n }\n\n public async getCancellationDetails() {\n let cancellation = await this.brandedFareTypesService.getCancellationCharges(TRPCONFIG.BasketId);\n TRPCONFIG.Domain.BrandedFareCancellations = cancellation;\n return cancellation;\n }\n\n public getBaggage(sector: ekh.IFlightSector) {\n return sector.BaggageText;\n }\n\n public getCabinBaggage(sector: ekh.IFlightSector) {\n return sector.CabinBaggageText;\n }\n\n public getSeatsSelection(sector: ekh.IFlightSector) {\n return sector.SeatsSelectionText;\n }\n\n public getChauffeur(sector: ekh.IFlightSector) {\n return sector.ChauffeurText;\n }\n\n public getCancellations(sector: ekh.IFlightSector) {\n let charge = sector.BrandedFareCancellationCharge.Amount;\n let date = sector.BrandedFareCancellationDate;\n let formatedDate = this._cancellationDateFormat(date);\n return `${this.$filter('roundedCurrency')(charge)} after ${formatedDate}`;\n }\n\n public displaySkywards(sector: ekh.IBrandedFareType) {\n return this.skywardsPoints;\n }\n public displayTotalPkgFlightMiles(sector: ekh.IBrandedFareType) {\n TRPCONFIG.Domain.SkywardsFlightMiles = this.flightMilesToPkgPP;\n return this.flightMilesToPkgPP;\n }\n public async getPackage(fare) {\n let trip = await this.tripService.getTrip(this.$routeParams.tripId).then(t => {\n return t;\n });\n let selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\n let legs = fare.Legs || selectedFlight.Legs;\n let hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\n\n let baseCost = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\n let qtys = JSON.parse(this.qtys);\n\n let totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\n let packageCost = baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\n if (packageCost) {\n let accruedMiles =\n await this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost);\n if (accruedMiles[0] && accruedMiles[0].Miles) {\n this.skywardsPoints = await accruedMiles[0].Miles;\n }\n }\n let origin = this.brandedFareTypesService.getDepartureCode(legs);\n let destination = this.brandedFareTypesService.getDestinationCode(legs);\n\n let fareAndFlightSelectors = fare && fare.FlightSectors;\n let fareAndFlightAndBrandtitles =\n fareAndFlightSelectors &&\n fare.FlightSectors[0].BrandTitle === fare.FlightSectors[1].BrandTitle;\n\n let miles = this.brandedFareTypesService.getFareInfo\n (fareAndFlightSelectors, fareAndFlightAndBrandtitles, this.brandedFareTypesService.flightMilesToPkgPP,\n fare, this.hotelSearch, origin, destination, null, null);\n\n this.flightMilesToPkgPP = await miles;\n return await miles;\n }\n public getPriceDelta(): string {\n const dif = this.fare.BrandedFareTypeTotalPrice - this.selectedFareTotalPrice;\n if (Math.round(dif) === 0) {\n return '';\n }\n let sign = dif > 0 ? '+' : '';\n return `${sign}${this.$filter('roundedCurrency')(dif, this.currency)}`;\n }\n\n public isRestrictedSeats(sector: ekh.IFlightSector) {\n return this.brandedFareTypesService.isRestrictedSeats(sector);\n }\n\n public getSeatsSelectionTooltipText() {\n return this.resourceService.get('BRANDED_FARE_TYPES_SEAT_RESTRICTED_TOOLTIP_TEXT');\n }\n\n public isSameClass(tripBound, flight) {\n if (flight.Segments.length > 1) {\n let fs = flight.Segments;\n if (fs) {\n const fareClassArr = fs.map(x => {\n if (x.FareClass) {\n return x.FareClass;\n } else {\n return x.SupplierFareClass;\n }\n });\n const allEqual = arr => arr.every(val => val !== undefined && val === arr[0]);\n const result = allEqual(fareClassArr);\n return result;\n }\n\n }\n\n return true;\n }\n\n\n public titleHeader(fs, dir, bound, flight) {\n let brandTitle = flight.BrandTitle;\n if(brandTitle.match(/flex/i)) {\n let splitText = brandTitle.split('Flex');\n brandTitle = `${splitText[0]}
        Flex ${splitText[1]}`;\n } else if(brandTitle.match(/saver/i)) {\n let splitText = brandTitle.split('Saver');\n brandTitle = `${splitText[0]}
        Saver ${splitText[1]}`;\n }else if(brandTitle.match(/special/i)) {\n let splitText = brandTitle.split('Special');\n brandTitle = `${splitText[0]}
        Special ${splitText[1]}`;\n }\n\n let classCheck = this.isSameClass(bound, flight);\n let toolTipText = '';\n let codes = [];\n if (!classCheck) {\n\n if (fs) {\n let fsParse = JSON.parse(fs);\n let legs = bound === 'outbound' ? fsParse.Legs[0] : fsParse.Legs[1];\n\n codes = legs.Segments.map(x => {\n return `${x.DepartureAirportCode} - ${x.DestinationAirportCode}`;\n });\n }\n\n let segments: any = [];\n\n for(let i = 0; i < flight.Segments.length; i++) {\n let fc = flight.Segments[i].FareClass;\n if(!fc) {\n fc = flight.Segments[i].SupplierFareClass;\n }\n\n let s = `${codes[i]}: ${this.brandedFareTypesService.getClassName(fc)} Class`;\n segments.push(s);\n }\n\n let segmentText = segments.join('
        ');\n\n toolTipText = `
        \n

        ${flight.BrandTitle} Class is partially available

        \n

        ${flight.BrandTitle} Class is not avaliable on all sectors of your journey\n
        ${segmentText}

        \n
        \n \n \n Partially Available\n `;\n }\n\n return `\n ${brandTitle} ${toolTipText}`;\n }\n\n private getCultureCode(code) {\n let data = {\n 'ar-ae': {\n 'MONTH': ['\\u064a\\u0646\\u0627\\u064a\\u0631', '\\u0641\\u0628\\u0631\\u0627\\u064a\\u0631',\n '\\u0645\\u0627\\u0631\\u0633', '\\u0623\\u0628\\u0631\\u064a\\u0644', '\\u0645\\u0627\\u064a\\u0648',\n '\\u064a\\u0648\\u0646\\u064a\\u0648', '\\u064a\\u0648\\u0644\\u064a\\u0648',\n '\\u0623\\u063a\\u0633\\u0637\\u0633', '\\u0633\\u0628\\u062a\\u0645\\u0628\\u0631',\n '\\u0623\\u0643\\u062a\\u0648\\u0628\\u0631', '\\u0646\\u0648\\u0641\\u0645\\u0628\\u0631',\n '\\u062f\\u064a\\u0633\\u0645\\u0628\\u0631'],\n },\n 'de-de': {\n 'MONTH': ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',\n 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n },\n 'dk-da': {\n 'MONTH': ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni',\n 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\n },\n 'en-gb': {\n 'MONTH': ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December']\n },\n 'it-it': {\n 'MONTH': ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',\n 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],\n },\n 'ru-ru': {\n 'MONTH': ['\\u044f\\u043d\\u0432\\u0430\\u0440\\u044f', '\\u0444\\u0435\\u0432\\u0440\\u0430\\u043b\\u044f',\n '\\u043c\\u0430\\u0440\\u0442\\u0430', '\\u0430\\u043f\\u0440\\u0435\\u043b\\u044f', '\\u043c\\u0430\\u044f',\n '\\u0438\\u044e\\u043d\\u044f', '\\u0438\\u044e\\u043b\\u044f',\n '\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430',\n '\\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f',\n '\\u043e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044f',\n '\\u043d\\u043e\\u044f\\u0431\\u0440\\u044f',\n '\\u0434\\u0435\\u043a\\u0430\\u0431\\u0440\\u044f'],\n },\n 'sv-se': {\n 'MONTH': ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni',\n 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'],\n }\n };\n\n let months = data['en-gb'].MONTH;\n\n let d = Object.keys(data);\n for (let i = 0; i < d.length; i++) {\n if (code === d[i]) {\n months = data[d[i]].MONTH;\n }\n }\n\n return months;\n }\n\n private _monthFormat(month) {\n let months = this.getCultureCode(this.code);\n return months[month];\n }\n\n private _cancellationDateFormat(date) {\n let timestamp = Date.parse(date);\n let d = new Date (timestamp);\n let month = this._monthFormat(d.getMonth());\n return `${d.getDate()} ${month} ${d.getFullYear()}`;\n\n }\n\n }\n\n angular\n .module('core')\n .directive('brandedFare', (): ng.IDirective => {\n return {\n restrict: 'E',\n controller: BrandedFare,\n controllerAs: 'bf',\n bindToController: {\n isSelected: '=',\n fare: '=',\n onSelect: '&',\n pieceConceptLegIn: '=',\n pieceConceptLegOut: '=',\n selectedFareTotalPrice: '=',\n currency: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=BrandedFares'\n };\n });\n}\n","/// \n/// \n/// \n/// \n/// \n'use strict';\n\nnamespace ekh {\n\n\n class BrandedFareTypes {\n public flight: { [key: string]: any } = {};\n public originalCabinClass: number = 0;\n public trip: { [key: string]: any } = {};\n public loadingBrandedFareTypes: boolean;\n public savingSelectedFareType: boolean;\n public expanded: boolean;\n public brandedFareTypes: ekh.IBrandedFareType[] | undefined = undefined;\n public filteredBrandedFareTypes: ekh.IBrandedFareType[] | undefined = undefined;\n public isContainPieceBaggageConceptInLeg: boolean;\n public isContainPieceBaggageConceptOutLeg: boolean;\n public selectedBrandedFareType: ekh.IBrandedFareType;\n public defaultBrandedFareType: ekh.IBrandedFareType;\n public selectedBrandedFareTypeIndex: number = 0;\n public currency: string;\n public getPriceDifference: any;\n public qtys: any = sessionStorage.getItem('priceQtys');\n public baseCost: number = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\n public priceQuantities: {\n AdultFareQuantity: number;\n AdultTaxQuantity: number;\n ChildFareQuantity: number;\n ChildTaxQuantity: number;\n InfantFareQuantity: number;\n InfantTaxQuantity: number;\n };\n\n\n constructor(\n private tripService: any,\n protected broker: Core.Broker,\n private $routeParams: ng.route.IRouteParamsService,\n private flightDetail: Core.Flights.IFlightDetailService,\n private $q: ng.IQService,\n private basketStore: any,\n private basketService: any,\n private $element: ng.IAugmentedJQuery,\n private brandedFareTypesService: ekh.BrandedFareTypesService,\n private resourceService: Core.ResourceService,\n private $filter: ng.IFilterService,\n private analytics: any,\n private occupancyService: any,\n private hotelSearch:any,\n ) { }\n\n $onInit(): void {\n this.loadingBrandedFareTypes = true;\n this.expanded = !TRPCONFIG.IsMobileDevice;\n this._getTrip()\n .then(this._getFlight.bind(this))\n .then(this._getBrandedFareTypes.bind(this))\n .then(this._setCurrency.bind(this))\n .finally(() => {\n this.loadingBrandedFareTypes = false;\n });\n }\n\n public getTranslation(term: string): string {\n return this.resourceService.get(term);\n }\n\n public getPostLoadedHeader(): string {\n const priceDif = this._getStartUpgradePrice();\n if (this.filteredBrandedFareTypes && this.filteredBrandedFareTypes.length) {\n if (TRPCONFIG.IsMobileDevice || !priceDif || priceDif === '') {\n return String.format(\n this.getTranslation('BRANDED_FARE_TYPES_POSTLOADED_MOBILE_HEADER'),\n this.filteredBrandedFareTypes.length, priceDif);\n } else {\n return String.format(\n this.getTranslation('BRANDED_FARE_TYPES_POSTLOADED_HEADER'),\n this.filteredBrandedFareTypes.length, priceDif);\n }\n }\n return '';\n }\n\n public getAirports(leg): string {\n const arAir = _.get(leg, 'ArrivalAirport.Code');\n const depAir = _.get(leg, 'DepartureAirport.Code');\n return `${depAir}-${arAir}`;\n }\n\n private _getTrip(): ng.IPromise {\n return this.tripService.getTrip(this.$routeParams.tripId).then(trip => {\n this.trip = trip;\n });\n }\n\n private _setStartingSelection(brandedFareTypes) {\n let selectedFarePrice = this.selectedBrandedFareType.BrandedFareTypeTotalPrice;\n brandedFareTypes.map(function(v){\n v.IsSelected = false;\n let farePrice = v.BrandedFareTypeTotalPrice;\n farePrice = farePrice.toFixed(2);\n farePrice = Number(farePrice);\n if (farePrice === selectedFarePrice) {\n v.IsSelected = true;\n }\n });\n }\n\n private async _skywardsInfo(arr, tripId, ts, bfs) {\n if (arr.length && ts) {\n let trip = await ts.getTrip(tripId).then(t => {\n return t;\n });\n let legs = arr[0].Legs;\n let hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i].IsSelected) {\n let taxes: any = [{\n adultTax: arr[i].AdultTax.Amount,\n childTax: arr[i].ChildTax.Amount,\n infantTax: arr[i].InfantTax.Amount\n }];\n sessionStorage.setItem('selectedFareTaxes', JSON.stringify(taxes));\n }\n\n let price = arr[i].PackagePrice;\n\n if (price !== undefined && price !== null) {\n let accruedMiles = await bfs.payloadEntry(null, trip, legs, hotel, price);\n arr[i].AccruedMiles = accruedMiles;\n\n if (arr[i].IsSelected) {\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\n }\n }\n\n }\n }\n\n }\n\n private _getBrandedFareTypes(): Promise | ng.IPromise {\n const tripId = this.trip && this.trip.TripId;\n const searchId = _.get(this.trip, 'FlightsRequest.AvailabilitySearchId');\n const flightId = _.get(this.trip, 'FlightsRequest.SelectedFlight.FlightId');\n if (tripId && searchId && flightId) {\n return this.flightDetail.getFlightDetails(tripId, {\n AvailabilitySearchId: searchId,\n FlightId: flightId,\n IncludeSeatPlan: true,\n MultiSector: false,\n IncludeBrandedFares: true\n })\n .then((details) => {\n if (details) {\n this._setPriceQuantities(details);\n this._setDefaultBrandedFareType(details);\n this._setSelectedFareType(this.flight);\n const brandedFareTypes = _.get(\n details, 'Itinerary.BrandedFares', [])\n .map(b => {\n b.priceQuantities = this.priceQuantities;\n return this.brandedFareTypesService.transform(b);\n });\n if (!this._isExistedDefaultFareType(brandedFareTypes)) {\n brandedFareTypes.unshift(this.defaultBrandedFareType);\n }\n this.brandedFareTypes = this.brandedFareTypesService.squeeze(brandedFareTypes);\n this.isContainPieceBaggageConceptInLeg = this.brandedFareTypesService\n .containPieceBaggageConcept(this.brandedFareTypes, 0);\n this.isContainPieceBaggageConceptOutLeg = this.brandedFareTypesService\n .containPieceBaggageConcept(this.brandedFareTypes, 1);\n\n // This code is to get the Skywards Info\n this._setStartingSelection(this.brandedFareTypes);\n this.getPriceDifference = this.brandedFareTypesService\n .getPriceDifference(this.brandedFareTypes);\n\n // This is a hack to get the Skywards info for the Branded Fares\n let si = this._skywardsInfo;\n let ts = this.tripService;\n let bfs = this.brandedFareTypesService;\n let intvl = setInterval(function(){\n if(bfs.brandedFares.length) {\n clearInterval(intvl);\n si(bfs.brandedFares, tripId, ts, bfs);\n }\n }, 100);\n\n if (this.brandedFareTypes && this.originalCabinClass === 2) {\n this.filteredBrandedFareTypes = this.brandedFareTypes.filter(\n item => item.FlightSectors[0].TransformedType >=\n TransformedType.PremiumEconomyFlexPlus\n );\n } else if (this.brandedFareTypes && this.originalCabinClass === 8) {\n this.filteredBrandedFareTypes = this.brandedFareTypes.filter(\n item => item.FlightSectors[0].TransformedType >= TransformedType.BusinessSpecial\n );\n }\n else if (this.brandedFareTypes && this.originalCabinClass === 4) {\n this.filteredBrandedFareTypes = this.brandedFareTypes.filter(\n item => item.FlightSectors[0].TransformedType >= TransformedType.FirstSaver\n );\n }\n else {\n this.filteredBrandedFareTypes = this.brandedFareTypes;\n }\n }\n });\n }\n return this.$q.when();\n }\n\n private _getFlight(): ng.IPromise {\n if (this.trip && this.trip.BasketId) {\n return this.basketStore.flight(this.trip.BasketId).then((flight) => {\n this.flight = _.get<{ [key: string]: any }>(flight, 'Details.Itinerary') || {};\n this.flight.TotalAmount = flight.TotalAmount;\n this.originalCabinClass = flight.Details.Itinerary.Legs[0].Segments[0].Cabin;\n });\n }\n return this.$q.when();\n }\n\n private async getPackagePrice(fare) {\n let trip = await this.tripService.getTrip(this.$routeParams.tripId).then(t => {\n return t;\n });\n\n let selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\n let legs = fare.Legs || selectedFlight.Legs;\n let hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\n let qtys = JSON.parse(this.qtys);\n TRPCONFIG.Domain.FlightFare = fare;\n\n sessionStorage.setItem('flightFare', JSON.stringify(fare));\n let totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\n let totalTaxes = this.brandedFareTypesService.calculateTotalTaxes(fare, qtys);\n let fareEachPerson = fare.AdultFare.Amount;\n\n if (!TRPCONFIG.Domain.TransferPrice) {\n TRPCONFIG.Domain.TransferPrice = 0;\n }\n\n if (this.baseCost && totalFares) {\n let packageCost = this.baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\n\n let accruedMiles =\n await this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost);\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\n }\n let origin = this.brandedFareTypesService.getDepartureCode(legs);\n let destination = this.brandedFareTypesService.getDestinationCode(legs);\n\n TRPCONFIG.Domain.SkywardsFlightMiles = sessionStorage.getItem('SkywardsMilesFlights');\n\n let fareAndFlightSelectors = fare && fare.FlightSectors;\n let fareAndFlightAndBrandtitles =\n fareAndFlightSelectors &&\n fare.FlightSectors[0].BrandTitle === fare.FlightSectors[1].BrandTitle;\n\n let miles = await this.brandedFareTypesService.getFareInfo\n (fareAndFlightSelectors, fareAndFlightAndBrandtitles, TRPCONFIG.Domain.SkywardsFlightMiles,\n fare, this.hotelSearch, origin, destination, null, null);\n\n TRPCONFIG.Domain.SkywardsFlightMiles = miles;\n sessionStorage.setItem('SkywardsMilesFlights', miles);\n\n }\n private _setSelectedFareType(flight): void {\n this.getPackagePrice(flight);\n this.selectedBrandedFareType = this.brandedFareTypesService.transform({\n FlightSectors: [\n this.flight.Legs[0],\n this.flight.Legs[1]\n ],\n ...flight,\n priceQuantities: this.priceQuantities\n });\n }\n\n private _setPriceQuantities(details) {\n const quantities = [\n 'AdultFareQuantity',\n 'AdultTaxQuantity',\n 'ChildFareQuantity',\n 'ChildTaxQuantity',\n 'InfantFareQuantity',\n 'InfantTaxQuantity'\n ];\n this.priceQuantities = _.pick(details.Itinerary, quantities);\n }\n\n private _getStartUpgradePrice(): string {\n if (this.flight && this.filteredBrandedFareTypes && this.filteredBrandedFareTypes.length\n && this.selectedBrandedFareTypeIndex < this.filteredBrandedFareTypes.length - 1) {\n const defPrice = _.get(\n this.filteredBrandedFareTypes[this.selectedBrandedFareTypeIndex], 'BrandedFareTypeTotalPrice'\n );\n const firstPrice = _.get(\n this.filteredBrandedFareTypes[this.selectedBrandedFareTypeIndex + 1], 'BrandedFareTypeTotalPrice'\n );\n const dif = firstPrice - defPrice;\n return this.$filter('roundedCurrency')(dif, this.currency);\n }\n return '';\n }\n\n private _setDefaultBrandedFareType(details): void {\n this.defaultBrandedFareType = this.brandedFareTypesService.transform({\n FlightSectors: [\n details.Itinerary.Legs[0],\n details.Itinerary.Legs[1]\n ],\n ...details.Itinerary,\n detailsId: details.DetailsId,\n priceQuantities: this.priceQuantities\n });\n }\n\n private _isEqualBrandedFareTypes(b1: ekh.IBrandedFareType, b2: ekh.IBrandedFareType): boolean {\n if (b1 && b2) {\n return b1.FlightSectors[0].TransformedType === b2.FlightSectors[0].TransformedType &&\n b1.FlightSectors[1].TransformedType === b2.FlightSectors[1].TransformedType;\n }\n return false;\n }\n\n private _isExistedDefaultFareType(fareTypes: ekh.IBrandedFareType[]): boolean {\n let res = false;\n for (let i = 0; i < fareTypes.length; ++i) {\n if (this._isEqualBrandedFareTypes(this.defaultBrandedFareType, fareTypes[i])) {\n res = true;\n break;\n }\n }\n return res;\n }\n\n private _setCurrency(): void {\n return this.tripService.getCurrency(this.trip.TripId)\n .then(c => {\n this.currency = c;\n });\n }\n\n public isSelectedFare(b: ekh.IBrandedFareType): boolean {\n return this._isEqualBrandedFareTypes(b, this.selectedBrandedFareType);\n }\n\n public initCarousel(isLastChild): void {\n if (isLastChild) {\n this.$element.find('.bft-items').slick({\n infinite: false,\n slidesToShow: 5,\n slidesToScroll: 1,\n nextArrow: '.next-arrow',\n prevArrow: '.prev-arrow',\n rtl: !!TRPCONFIG.Rtl,\n draggable: false,\n touchMove: false,\n responsive: [\n {\n breakpoint: 600,\n settings: {\n slidesToShow: 2\n }\n },\n {\n breakpoint: 769,\n settings: {\n slidesToShow: 3\n }\n },\n {\n breakpoint: 1000,\n settings: {\n slidesToShow: 4\n }\n }\n ]\n });\n }\n }\n public showField() {\n let show = false;\n if (TRPCONFIG.Domain.SkywardsInfo && TRPCONFIG.Domain.SkywardsInfo[0].Miles) {\n show = true;\n }\n return show;\n }\n public resetSelection(brandedFareTypes, selectedFare) {\n for(let i = 0; i < brandedFareTypes.length; i++) {\n brandedFareTypes[i].IsSelected = false;\n }\n selectedFare.IsSelected = true;\n let bft = this.brandedFareTypesService.getPriceDifference(brandedFareTypes);\n this._skywardsInfo(bft, this.trip.TripId, null, null);\n }\n\n public select(selectedFare, idx): void {\n this.resetSelection(this.brandedFareTypes, selectedFare);\n this.savingSelectedFareType = true;\n this.selectedBrandedFareTypeIndex = idx;\n this.selectFare(selectedFare).then(_ => {\n this._updateBrandedFare(selectedFare);\n });\n const bLen = this.brandedFareTypes ? this.brandedFareTypes.length : 0;\n this._trackSelection(this.flight.Legs[0].ArrivalAirport.Code, idx + 1, bLen);\n }\n\n public selectFare(selectedFare: any): ng.IPromise {\n let detailsPromise;\n if (this._isEqualBrandedFareTypes(this.defaultBrandedFareType, selectedFare)) {\n detailsPromise = this.$q.when({\n DetailsId: this.defaultBrandedFareType.detailsId,\n Itinerary: this.defaultBrandedFareType\n });\n } else {\n detailsPromise = this.flightDetail.getBrandSpecificFlightDetails(selectedFare.Id);\n }\n this.flight.LeadAdultPrice = selectedFare.AdultFare.Amount;\n this.flight.LeadAdultTax = selectedFare.AdultTax.Amount;\n return detailsPromise.then(details => {\n let opts: { [key: string]: any } = {\n details,\n searchId: _.get(this.trip, 'FlightsRequest.AvailabilitySearchId'),\n basketId: this.trip.BasketId,\n packageId: this.trip.PackageId,\n bags: this.flight.bags,\n maxbags: this.occupancyService.getNumberOfNonInfantPassengers() || 1\n };\n let selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\n selectedFlight.Legs = details.Itinerary.Legs;\n sessionStorage.setItem('storeSelectedFlight',JSON.stringify(selectedFlight));\n this.broker.publish('updateBrandedFareFlight',selectedFlight.Legs);\n return this.basketService.updateBrandedFare(opts);\n });\n }\n\n private _updateBrandedFare(selectedBrandedFare): void {\n this.savingSelectedFareType = false;\n this.selectedBrandedFareType = selectedBrandedFare;\n this.getPackagePrice(selectedBrandedFare);\n }\n\n private _trackSelection(airport, position, bLen): void {\n this.analytics.trackEvent({\n category: 'Branded Fares holidaysOptions',\n label: `${airport}_${position}_${bLen}`\n });\n }\n\n }\n\n angular\n .module('core')\n .directive('brandedFareTypes', (): ng.IDirective => {\n return {\n restrict: 'E',\n controller: BrandedFareTypes,\n controllerAs: 'bft',\n bindToController: {\n flight: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=BrandedFareTypes'\n };\n });\n}\n","'use strict';\n\nnamespace core {\n\n class BreakdownTable {\n\n total: number;\n tax: number;\n package: number;\n\n constructor(private modalService:any, private $filter:any){\n\n this.tax = this.$filter('customCurrency')(modalService.get('tax'));\n //this.currency = this.$filter('customCurrency')(modalService.get('currency'));\n this.total = this.$filter('customCurrency')(modalService.get('total'));\n this.package = this.$filter('customCurrency')(modalService.get('total') + modalService.get('tax'));\n\n }\n\n }\n\n angular\n .module('core')\n .directive('breakdownTable', () => {\n return {\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=BreakdownTable',\n controllerAs: 'bt',\n controller: BreakdownTable\n };\n });\n\n}\n","namespace Core {\n angular\n .module('core')\n .directive('callToBookModal', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {\n show: '=',\n close: '&'\n },\n templateUrl: 'partials/Home/directivetemplate?type=CallToBookModal',\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class CanonicalTag {\n\n constructor(\n private $element: HTMLLinkElement,\n private $rootScope: ng.IRootScopeService) {\n\n $rootScope.$watch(() => {\n if ($element[0].href !== location.href) {\n $element[0].href = location.href;\n $element[0].href = $element[0].href.split('?')[0];\n }\n });\n\n $rootScope.$watch('canonicalSuffix', (val, old) => {\n if (val !== old && $element && $element[0] && $element[0].href) {\n $element[0].href = $element[0].href.split('?')[0] + val;\n }\n });\n\n }\n };\n\n angular\n .module('core')\n .directive('canonicalTag', (): ng.IDirective => {\n return {\n restrict: 'A',\n controller: CanonicalTag,\n bindToController: true\n };\n });\n}\n","(function() {\n 'use strict';\n\n const TR = angular.module('TR');\n TR.directive('checkUserPrefs', checkUserPrefs);\n\n function checkUserPrefs(authService) {\n return {\n restrict: 'A',\n scope: '=',\n compile() {\n if (!window.TRPCONFIG.Domain2.ClearUserPrefs) { return; }\n return function postLink() {\n const cookieName = authService.createCookieName();\n authService.doesHttpOnlyCookieExist(cookieName);\n authService.checkUserPreferences();\n };\n }\n };\n }\n})();\n","'use strict';\n\nnamespace Core {\n\n class CheckboxPopup {\n public checked: boolean = false;\n public labelText: string;\n public popupMessageText: string;\n public popupHeaderText: string;\n\n private getPopupHeaderText: () => string;\n private getPopupMessageText: () => string;\n private getLabelText: () => string;\n\n static getEventData() {\n return {\n label: 'Hotel for only part of Holiday',\n category: 'Search Bar',\n action: 'Click',\n value: 1\n };\n }\n\n constructor (\n private analytics: any,\n private $route: ng.route.IRouteService\n ) {}\n\n $onInit(): void {\n this.labelText = this.getLabelText();\n this.popupMessageText = this.getPopupMessageText();\n this.popupHeaderText = this.getPopupHeaderText();\n }\n\n public closePopup() {\n this.checked = false;\n }\n\n private getCurrentRouteLabel() {\n return _.get(this.$route, 'current.$$route.pixelTrackingPageName');\n }\n\n public checkboxClick() {\n let eventData = CheckboxPopup.getEventData();\n const currentRouteName = this.getCurrentRouteLabel();\n if (currentRouteName) {\n eventData.category = `${eventData.category} ${currentRouteName}`;\n }\n\n this.analytics.trackEvent(eventData);\n }\n }\n\n angular\n .module('core')\n .directive('checkboxPopup', (): ng.IDirective => {\n return {\n restrict: 'E',\n controller: CheckboxPopup,\n controllerAs: 'checkboxPopupCtrl',\n bindToController: {\n getLabelText: '&',\n getPopupHeaderText: '&',\n getPopupMessageText: '&'\n },\n template: `\n \n
        \n \n \n
        \n
        \n
        \n \n {{checkboxPopupCtrl.labelText}}\n \n
        \n `\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class ConfidenceMessages {\n private showNortonLogo: boolean = true;\n private messages: string[] = [];\n private messagesResolved: string[];\n private atolProtected: string;\n private showAtolLogo: boolean = false;\n private commissionOfAviation: string;\n private showCommissionOfAviation: boolean = false;\n private flexiblePayments: string;\n private debitMessageType: string;\n\n public showDebitIcon: boolean;\n public debitMessage: string;\n\n constructor(resourceService: Core.ResourceService) {\n if (this.flexiblePayments === 'true') {\n this.messages.unshift('USPFLEXIBLEPAYMENT');\n }\n if (this.atolProtected === 'true') {\n this.showAtolLogo = true;\n this.messages.unshift('ATOLPROTECTEDHOLIDAY');\n }\n\n if (this.commissionOfAviation === 'true') {\n this.showCommissionOfAviation = true;\n this.messages.unshift('COMMISSIONOFAVIATIONMESSAGE');\n }\n this.messagesResolved = this.messages.map(s => resourceService.get(s));\n }\n }\n\n angular\n .module('core')\n .component('confidenceMessages', {\n bindings: {\n atolProtected: '@',\n commissionOfAviation: '@',\n flexiblePayments: '@',\n debitMessageType: '@'\n },\n controller: ConfidenceMessages,\n template: `\n
        \n
        \n \n \n \n \n \n \n \n \n \n \n \n \n
        \n
        \n
          \n
        • {{message}}
        • \n
        \n
        \n
        \n \n {{$ctrl.debitMessage}}\n
        \n
        \n `\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('contactForm', contactForm);\n\nfunction contactForm(bookingService) {\n return {\n restrict: 'E',\n replace: false,\n transclude: true,\n scope: {\n contactDetail: '=',\n rootForm: '=',\n loggedInUser: '=',\n contactForm: '=',\n bookingTracker: '@',\n namePart: '@',\n signupPart: '@',\n emailPart: '@',\n isPostCodeRequired: '@',\n onNotYouClick: '&',\n enableEditEmailAlways: '@'\n },\n controller() {\n const cm = this;\n cm.form = cm.contactForm || cm.rootForm;\n\n cm.getContentUrl = function() {\n return `partials/home/contactdetailsform?bookingTracker=${cm.bookingTracker}`;\n };\n\n cm.agentMode = TRPCONFIG.Domain.isAgentMode;\n cm.showNamePart = cm.namePart === 'true';\n cm.showSignupPart = cm.signupPart === 'true';\n cm.showEmailPart = cm.emailPart === 'true';\n\n cm.adultTitles = bookingService.getAdultTitles();\n },\n controllerAs: 'cm',\n bindToController: true,\n template: '
        '\n };\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('core')\r\n .directive('costBreakdown', costBreakdown);\r\n\r\n\r\nfunction costBreakdown(tripService, $routeParams, broker, $location) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n costs: '=',\r\n totalLabel: '@',\r\n isPackage: '=',\r\n hideAgentDetail: '@',\r\n isInsurance: '@'\r\n },\r\n templateUrl: 'partials/home/costbreakdown',\r\n controller() {\r\n const cm = this;\r\n cm.isTravelAgentMode = TRPCONFIG.Domain.IsTravelAgentMode;\r\n const localPaymentsList = [22]; // id's of payable locally products\r\n\r\n cm.localPayable = function(costBreakdownItem) {\r\n return (localPaymentsList.indexOf(costBreakdownItem.TypeId) !== -1);\r\n };\r\n\r\n cm.payableNow = function(costBreakdownItem) {\r\n return (localPaymentsList.indexOf(costBreakdownItem.TypeId) === -1);\r\n };\r\n },\r\n controllerAs: 'cm',\r\n link(scope) {\r\n function sumCosts() {\r\n return (scope.costs || []).reduce((sum, cost) => {\r\n sum.total += (cost.Quantity * cost.UnitAmount);\r\n sum.netTotal += (cost.Quantity * cost.NetUnitAmount);\r\n sum.totalTravelAgentCommission += (cost.Quantity * cost.TravelAgentCommission);\r\n checkIsInsurance(cost);\r\n return sum;\r\n }, { total: 0, netTotal: 0, totalTravelAgentCommission: 0 });\r\n }\r\n\r\n function setClientCurrencyCode() {\r\n if (scope.costs && (scope.costs.length >= 1)) {\r\n if (scope.costs[0].ClientCurrencyCode) {\r\n scope.clientCurrencyCode = scope.costs[0].ClientCurrencyCode;\r\n } else {\r\n tripService.getCurrency($routeParams.tripId).then(currency => {\r\n scope.clientCurrencyCode = currency;\r\n });\r\n }\r\n }\r\n }\r\n\r\n function _setBinRangeDiscount(discount) {\r\n if (discount.data != null) {\r\n scope.binRangeDiscount = discount.data[0];\r\n } else {\r\n scope.binRangeDiscount = null;\r\n }\r\n calcCosts();\r\n }\r\n\r\n function calcCosts() {\r\n const sum = sumCosts();\r\n scope.total = sum.total;\r\n scope.netTotal = sum.netTotal;\r\n scope.totalTravelAgentCommission = sum.totalTravelAgentCommission;\r\n if (scope.binRangeDiscount != null) {\r\n scope.total -= scope.binRangeDiscount.DiscountValue;\r\n scope.deposit -= scope.binRangeDiscount.DiscountValue;\r\n }\r\n setClientCurrencyCode();\r\n }\r\n\r\n function checkIsInsurance(cost) {\r\n let isManageBooking = $location.path().indexOf('booking-details') > -1;\r\n let inInsuranceQoute = false;\r\n if (cost.Description) {\r\n inInsuranceQoute = cost.Description.toLowerCase().indexOf('insurance') > -1;\r\n }\r\n if (!scope.isInsurance && isManageBooking && inInsuranceQoute) {\r\n scope.isInsurance = true;\r\n }\r\n }\r\n\r\n scope.$watchCollection('costs', function() {\r\n calcCosts();\r\n });\r\n\r\n broker.subscribe('costBreakdownDirective', 'discountUpdated', _setBinRangeDiscount);\r\n\r\n scope.$on('$destroy', () => {\r\n broker.unsubscribe('costBreakdownDirective');\r\n });\r\n }\r\n };\r\n}\r\n})();\r\n","'use strict';\n\nnamespace Core.Customer {\n\n import CrossSellType = Core.Booking.CrossSellType;\n\n class CrossSellSetting {\n public readonly captionResourceKey :string | null;\n public readonly tagLineResourceKey :string | null;\n public readonly iconClass :string;\n\n constructor(iconClass :string, captionResourceKey? :string, tagLineResourceKey? :string) {\n this.iconClass = iconClass;\n this.captionResourceKey = captionResourceKey || null;\n this.tagLineResourceKey = tagLineResourceKey || null;\n }\n }\n\n class CrossSellCard {\n\n private readonly crossSellSettings :{[id: number]: CrossSellSetting} = {};\n private layout :string;\n private model :CrossSellOption;\n\n public caption :string;\n public cssClass :string;\n public icon :string;\n public tagline: string | null;\n public teaserPrice :number;\n\n constructor(private $scope :ng.IScope,\n private $location :ng.ILocationService,\n private crossSellCommonService :any,\n private resourceService :ResourceService) {\n\n //set up our settings\n this.crossSellSettings[CrossSellType.Attractions] = new CrossSellSetting('attractions');\n this.crossSellSettings[CrossSellType.Baggage] =\n new CrossSellSetting('baggage', 'CROSSSELL_BAGS_CAPTION', 'CROSSSELL_BAGS_TAGLINE');\n this.crossSellSettings[CrossSellType.CarHire] =\n new CrossSellSetting('car-hire', 'CROSSSELL_CARHIRE_CAPTION', 'CROSSSELL_CARHIRE_TAGLINE');\n this.crossSellSettings[CrossSellType.Hotels] =\n new CrossSellSetting('hotels', 'CROSSSELL_HOTEL_CAPTION');\n this.crossSellSettings[CrossSellType.Parking] =\n new CrossSellSetting('parking', 'CROSSSELL_PARKING_CAPTION', 'CROSSSELL_PARKING_TAGLINE');\n this.crossSellSettings[CrossSellType.Seats] =\n new CrossSellSetting('seating', 'CROSSSELL_SEATS_CAPTION', 'CROSSSELL_SEATS_TAGLINE');\n this.crossSellSettings[CrossSellType.Transfers] =\n new CrossSellSetting('transfers', 'CROSSSELL_TRANSFER_CAPTION', 'CROSSSELL_TRANSFER_TAGLINE');\n\n this.cssClass = (this.layout === 'tall') ? 'cross-sell-card-tall' : 'cross-sell-card-wide';\n\n let watch = $scope.$watch('csc.model', m => {\n if (m) {\n const settings= this.crossSellSettings[this.model.CrossSellType];\n this.icon = settings.iconClass;\n this.teaserPrice = this.model.TeaserPrice;\n\n if (settings.captionResourceKey) {\n this.caption = this.resourceService.get(settings.captionResourceKey);\n } else if (this.model instanceof Customer.CrossSellProductOption) {\n this.caption = this.model.Title;\n }\n\n if (settings.tagLineResourceKey !== null) {\n this.tagline = this.resourceService.get(settings.tagLineResourceKey) || null;\n }\n\n if (this.model instanceof Customer.CrossSellHotelOption) {\n this.tagline = this.model.Title;\n }\n\n watch();\n }\n });\n\n }\n\n public click() :void {\n if (this.model instanceof Customer.CrossSellFlightExtraOption) {\n this.$location.url(this.model.Url);\n } else if (this.model instanceof Customer.CrossSellProductOption) {\n this.crossSellCommonService.startCrossSellJourney(this.model.BookingId, this.model.ProductDetails);\n }\n }\n }\n angular\n .module('core')\n .directive('crossSellCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: CrossSellCard,\n controllerAs: 'csc',\n bindToController: {\n model: '=',\n layout: '@'\n },\n templateUrl: 'partials/customer/crosssellcard'\n };\n });\n}\n","'use strict';\n\nnamespace Core.Customer {\n\n import TripStage = Core.ManageBooking.TripStage;\n\n export enum CurrentTripType {\n Flight = 1,\n Hotel,\n Holiday\n }\n\n class CurrentTripCard {\n\n private titles = {\n Holiday: {\n PreTrip: {\n Days: 'CURRENTTRIP_HOLIDAY_STARTSINXDAYS',\n Tomorrow: 'CURRENTTRIP_HOLIDAY_STARTSTOMORROW',\n Today: 'CURRENTTRIP_HOLIDAY_STARTSTODAY'\n },\n OnTrip: {\n Days: 'CURRENTTRIP_HOLIDAY_ENDSINXDAYS',\n Tomorrow: 'CURRENTTRIP_HOLIDAY_ENDSTOMORROW',\n Today: 'CURRENTTRIP_HOLIDAY_ENDSTODAY'\n }\n },\n Hotel: {\n PreTrip: {\n Days: 'CURRENTTRIP_HOTEL_STARTSINXDAYS',\n Tomorrow: 'CURRENTTRIP_HOTEL_STARTSTOMORROW',\n Today: 'CURRENTTRIP_HOTEL_STARTSTODAY'\n },\n OnTrip: {\n Days: 'CURRENTTRIP_HOTEL_ENDSINXDAYS',\n Tomorrow: 'CURRENTTRIP_HOTEL_ENDSTOMORROW',\n Today: 'CURRENTTRIP_HOTEL_ENDSTODAY'\n }\n }\n ,\n Flight: {\n PreTrip: {\n Days: 'CURRENTTRIP_FLIGHT_STARTSINXDAYS',\n Tomorrow: 'CURRENTTRIP_FLIGHT_STARTSTOMORROW',\n Today: 'CURRENTTRIP_FLIGHT_STARTSTODAY'\n },\n OnTrip: {\n Days: 'CURRENTTRIP_FLIGHT_ENDSINXDAYS',\n Tomorrow: 'CURRENTTRIP_FLIGHT_ENDSTOMORROW',\n Today: 'CURRENTTRIP_FLIGHT_ENDSTODAY'\n }\n }\n };\n\n // Attr\n trip: ManageBooking.BookedTrip;\n\n private flightLegsToDisplay: ManageBooking.FlightLeg[] = [];\n private showExtraProducts: boolean = false;\n private cardTitle: string;\n\n private tripType: CurrentTripType;\n\n constructor (\n private $scope: ng.IScope,\n private resourceService: any\n ) {\n }\n\n init (): void {\n if (this.trip.FlightBooking && this.trip.HotelBooking) {\n this.tripType = CurrentTripType.Holiday;\n } else {\n this.tripType = this.trip.HotelBooking ? CurrentTripType.Hotel : CurrentTripType.Flight;\n }\n\n if (this.trip.FlightBooking) {\n if (this.trip.TripStage === TripStage.PreTrip) {\n this.flightLegsToDisplay = this.trip.FlightBooking.Legs;\n } else {\n this.flightLegsToDisplay.push(_.last(this.trip.FlightBooking.Legs));\n }\n }\n\n if (this.trip.TransferBooking\n || this.trip.CarHireBooking\n || this.trip.AirportParkingBooking\n || this.trip.InsuranceBooking) {\n this.showExtraProducts = true;\n }\n\n this.cardTitle = this.getTitle();\n }\n\n private getTitle(): string {\n\n let tripTypeKey = CurrentTripType[this.tripType];\n let tripStageKey = TripStage[this.trip.TripStage];\n\n let daysUntil: number =\n this.trip.TripStage === TripStage.PreTrip\n ? this.trip.DaysUntilDeparture\n : this.trip.DaysUntilReturn;\n\n // Days, Tomorrow OR Today\n let durationKey: string = 'Today';\n\n if (daysUntil > 1) {\n durationKey = 'Days';\n\n } else if (daysUntil === 1) {\n durationKey = 'Tomorrow';\n } else {\n durationKey = 'Today';\n }\n\n let resourceKey: string = this.titles[tripTypeKey][tripStageKey][durationKey];\n let title = this.resourceService.getDeferred(resourceKey)();\n\n if (daysUntil > 1) {\n title = title.replace('{0}', daysUntil);\n }\n\n return title;\n }\n }\n angular\n .module('core')\n .directive('currentTripCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: CurrentTripCard,\n controllerAs: 'ct',\n bindToController: {\n trip: '='\n },\n templateUrl: 'partials/customer/currenttripcard',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : CurrentTripCard\n ) => {\n controller.init();\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core.Customer {\n\n import CrossSellType = Core.Booking.CrossSellType;\n import BookedTrip = Core.ManageBooking.BookedTrip;\n import TripStage = Core.ManageBooking.TripStage;\n\n class CustomerDashboard {\n\n // Object literal defines which cross-sells are supported by each place holder.\n // Cross-sells are arranged in priority order.\n private crossSellsByPlaceholder = {\n 2: [\n CrossSellType.Hotels,\n CrossSellType.Attractions\n ],\n 4: [\n CrossSellType.Transfers,\n CrossSellType.CarHire,\n CrossSellType.Seats,\n CrossSellType.Baggage\n ],\n 5: [\n CrossSellType.Transfers,\n CrossSellType.CarHire,\n CrossSellType.Seats,\n CrossSellType.Baggage\n ]\n };\n\n showDashboard: boolean;\n fetching: boolean;\n tripReady: boolean;\n user: any|null = null;\n trip: BookedTrip|null = null;\n lastViewedHotel: Hotels.StaticHotel|null = null;\n searches: any[] = [];\n destinations: Destinations.DestinationContentCard[] = [];\n\n crossSellOptions = {\n Hotels: null,\n Attractions: null,\n Transfers: null,\n CarHire: null,\n Baggage: null,\n Seats: null\n };\n\n dashboardTemplate: string;\n\n tileTemplates = {\n 1: null,\n 2: null,\n 3: null,\n 4: null,\n 5: null\n };\n\n tileModels = {\n 1: null,\n 2: null,\n 3: null,\n 4: null,\n 5: null\n };\n\n tileTypes = {\n 1: null,\n 2: null,\n 3: null,\n 4: null,\n 5: null\n };\n\n constructor (\n private $rootScope,\n private $scope: ng.IScope,\n private $q: ng.IQService,\n private bookingsManagerService: ManageBooking.BookingsManagerService,\n private crossSellCommonService: any,\n private customerDashboardService: CustomerDashboardService,\n private houseRecommender: any,\n private currentUser: any,\n private authService: any\n ) {\n $scope.$on('auth:signin', () => {\n this.setDashboardState();\n });\n\n $scope.$on('auth:signout', () => {\n this.setDashboardState();\n });\n\n this.setDashboardState();\n }\n\n private setDashboardState(): void {\n // Set local scope user\n this.user = this.currentUser.get();\n // Show this dashboard if the user is signed in\n this.showDashboard = this.user.AnonSignedIn || this.user.SignedIn;\n this.showDashboard && this.fetch();\n }\n\n private fetch(): void {\n this.fetching = true;\n this.tripReady = false;\n\n this.resetData();\n\n let bookingId = this.user.AnonSignedIn && this.authService.getSignedInBookingId();\n let tripPromise: ng.IPromise = bookingId\n ? this.bookingsManagerService.getTrip(bookingId)\n : this.bookingsManagerService.getCurrentTripForUser();\n\n tripPromise.then(trip => {\n this.trip = trip;\n\n // // DEBUG -- force trip stage\n // if (this.trip) {\n // this.trip.TripStage = TripStage.PreTrip;\n // }\n\n // Set the dashboard template\n this.dashboardTemplate = this.customerDashboardService.getTemplateForDashboard(this.trip);\n\n // If appropriate, set the trip template whilst other content loads\n if (this.trip && (this.trip.TripStage === TripStage.PreTrip\n || this.trip.TripStage === TripStage.OnTrip)) {\n this.tileTypes[1] = DashboardTileType.Trip;\n this.tileTemplates[1] =\n this.customerDashboardService.getTemplateForPlaceholder(DashboardTileType.Trip);\n this.tripReady = true;\n }\n\n let promises: ng.IPromise[] = [];\n\n if (this.trip && this.trip.TripStage === TripStage.PreTrip) {\n // get cross sells\n promises.push(this.customerDashboardService.getAllCrossSellOptions(this.trip.MainBookingId));\n } else {\n promises.push(this.$q.when()); // dummy the cross-sell promise\n // Get recent searches, last viewed hotel and recommended destinations\n //promises.push(this.customerDashboardService.getRecentSearches(2));\n promises.push(this.$q.when());\n promises.push(this.customerDashboardService.getLastViewedHotel());\n promises.push(this.houseRecommender.getHouseRecs());\n }\n\n this.$q.all(promises).then(([crossSells, searches, hotel, destinations]) => {\n\n if (crossSells) {\n // Assign any cross-sell options to our object literal\n _.each(crossSells, (option: CrossSellOption) => {\n this.crossSellOptions[CrossSellType[option.CrossSellType]] = option;\n });\n }\n\n if (searches) {\n this.searches = searches;\n }\n if (hotel) {\n this.lastViewedHotel = hotel;\n }\n if (destinations) {\n this.destinations = destinations;\n }\n\n // Now that we have all information, set the templates for each cell\n this.configureTiles().then(() => {\n // We are done - display everything else\n this.fetching = false;\n this.customerDashboardService.trackDashboardLoad(this.trip, this.tileTypes);\n });\n\n });\n\n });\n\n }\n\n private configureTiles(): ng.IPromise {\n let deferred = this.$q.defer();\n\n if (this.trip) {\n\n if (this.trip.TripStage === TripStage.PreTrip) {\n // *** PRE TRIP ***\n\n // Placeholder 1\n // Trip\n this.tileTypes[1] = DashboardTileType.Trip;\n\n // Placeholders 2, 3, 4, 5\n // Assign cross sell templates to placeholders according to our validity rules\n let assignedTypes: CrossSellType[] = [];\n\n // iterate placeholders which support cross-sells\n _.forOwn(this.crossSellsByPlaceholder, (types: CrossSellType[], key: string) => {\n\n // Take the first non-assigned cross-sell type which we have a cross-sell option for\n let chosenType = _.find(types, (type: CrossSellType) => {\n return this.crossSellOptions[CrossSellType[type]]\n && assignedTypes.indexOf(type) === -1;\n });\n if (chosenType) {\n // assign the placeholder type for this cross-sell\n assignedTypes.push(chosenType);\n\n this.tileTypes[key] = DashboardTileType[`CrossSell${CrossSellType[chosenType]}`];\n this.tileModels[key] = this.crossSellOptions[CrossSellType[chosenType]];\n }\n });\n\n // Placeholder 2 (if not populated by a cross-sell)\n // Small App Promo\n if (!this.tileTypes[2]) {\n this.tileTypes[2] = DashboardTileType.AppPromo;\n }\n\n // Placeholder 3 (if not populated by a cross-sell)\n // Insurance Confirmation OR Insurance Option\n if (!this.tileTypes[3]) {\n this.tileTypes[3] = this.trip.InsuranceBooking\n ? DashboardTileType.InsuranceConf\n : DashboardTileType.InsuranceOption;\n }\n\n } else if (this.trip.TripStage === TripStage.OnTrip) {\n // *** ON TRIP ***\n\n // Placeholder 1\n // Trip\n // *** ALREADY SET ***\n\n\n\n // Placeholder 2\n // TR Contact\n this.tileTypes[2] = DashboardTileType.ContactUs;\n\n // Placeholder 3\n // Insurance claim OR Travel guide\n this.tileTypes[3] = this.trip.InsuranceBooking\n ? DashboardTileType.InsuranceClaim\n : DashboardTileType.TravelGuide;\n\n } else if (this.trip.TripStage === TripStage.PostTrip) {\n // *** POST TRIP ***\n\n // Placeholder 1\n // Review your hotel OR App promo\n this.tileTypes[1] =\n this.trip.HotelBooking && !this.trip.HotelBooking.ReviewedByCustomer\n ? DashboardTileType.ReviewHotel\n : DashboardTileType.AppPromo;\n\n // Placeholder 2\n // Searches[0] OR Destinations[0]\n if (this.searches[0]) {\n this.tileTypes[2] = DashboardTileType.Search;\n this.tileModels[2] = this.searches[0];\n } else {\n this.tileTypes[2] = DashboardTileType.Destination;\n this.tileModels[2] = this.destinations[0];\n }\n\n // Placeholder 3\n // Destinations[0] OR Destinations[1]\n this.tileTypes[3] = DashboardTileType.Destination;\n if (this.tileTypes[2] === DashboardTileType.Search) {\n // show the first destination which doesn't match the destination of the search\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(\n this.tileModels[2],\n this.destinations);\n } else {\n // show the second destination\n this.tileModels[3] = this.destinations[1];\n }\n }\n\n } else {\n // *** NO TRIP ***\n\n // Placeholder 1\n // App promo\n this.tileTypes[1] = DashboardTileType.AppPromo;\n\n // Placeholder 2\n // Last Viewed Hotel OR Searches[0] OR Destinations[0]\n if (this.lastViewedHotel) {\n // show last viewed hotel\n this.tileTypes[2] = DashboardTileType.LastHotel;\n this.tileModels[2] = this.lastViewedHotel;\n } else if (this.searches[0]) {\n // show first search\n this.tileTypes[2] = DashboardTileType.Search;\n this.tileModels[2] = this.searches[0];\n } else {\n // show first destination\n this.tileTypes[2] = DashboardTileType.Destination;\n this.tileModels[2] = this.destinations[0];\n }\n\n // Placeholder 3\n // Searches[0] OR Destinations[0] OR Destinations[1]\n if (this.tileTypes[2] === DashboardTileType.LastHotel) {\n // show first search OR first Destination\n if (this.searches[0]) {\n this.tileTypes[3] = DashboardTileType.Search;\n this.tileModels[3] = this.searches[0];\n } else {\n this.tileTypes[3] = DashboardTileType.Destination;\n this.tileModels[3] = this.destinations[0];\n }\n } else if (this.tileTypes[2] === DashboardTileType.Search) {\n this.tileTypes[3] = DashboardTileType.Destination;\n // show the first destination which doesn't match the destination of the search\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(\n this.tileModels[2],\n this.destinations);\n } else {\n // show second destination\n this.tileTypes[3] = DashboardTileType.Destination;\n this.tileModels[3] = this.destinations[1];\n }\n\n }\n\n // map the templates to the types\n _.forOwn(this.tileTypes, (type: DashboardTileType, key: string) => {\n if (type) {\n this.tileTemplates[key] = this.customerDashboardService.getTemplateForPlaceholder(type);\n }\n });\n\n deferred.resolve();\n return deferred.promise;\n }\n\n private resetData(): void {\n // reset all data to initial state\n this.trip = null;\n this.lastViewedHotel = null;\n this.searches.length = 0;\n this.destinations.length = 0;\n _.forOwn(this.crossSellOptions, o => o = null);\n\n // placeholder templates and models\n _.forOwn(this.tileTemplates, p => p = null);\n _.forOwn(this.tileModels, p => p = null);\n _.forOwn(this.tileTypes, p => p = null);\n }\n\n public getModelForPlaceholder(position: number): any[] {\n // We return the model in an array so that we can use ng-repeat\n // to declare a privately scoped model for the ng-included template\n return [this.tileModels[position]];\n }\n\n public crossSellClick(option: CrossSellProductOption): void {\n //mybTrack.track('MYB - Cross Sell Click');\n this.crossSellCommonService.startCrossSellJourney(option.BookingId, option.ProductDetails);\n }\n\n public tileClick(position: number): void {\n this.customerDashboardService.trackDashboardClick(position, this.tileTypes[position]);\n }\n }\n\n angular\n .module('core')\n .directive('customerDashboard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: CustomerDashboard,\n controllerAs: 'cd',\n bindToController: {\n },\n templateUrl: 'partials/customer/customerdashboard'\n };\n });\n}\n","namespace Core {\n\n class DateOrMonthPicker {\n show: boolean;\n value: Date;\n flexibility?: number;\n minimumDate: Date;\n\n constructor (\n $scope: ng.IScope,\n dateUtil: any\n ) {\n this.minimumDate = dateUtil.todayPlus(1);\n }\n }\n\n angular\n .module('core')\n .directive('dateOrMonthPicker', (): ng.IDirective => ({\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=DateOrMonthPicker',\n controller: DateOrMonthPicker,\n controllerAs: 'cm',\n bindToController: {\n show: '=',\n value: '=',\n flexibility: '=',\n },\n scope: {},\n }));\n}\n","'use strict';\n\nnamespace Core {\n class DestinationContentCard {\n // Attr\n model: Destinations.DestinationContentCard;\n header: string;\n\n constructor (\n private houseRecommender: any\n ) {\n }\n\n public trackClick() {\n this.houseRecommender.trackHouseClick(this.model);\n }\n\n }\n angular\n .module('core')\n .directive('destinationContentCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: DestinationContentCard,\n controllerAs: 'dc',\n replace: true,\n bindToController: {\n model: '=',\n header: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=DestinationContentCard'\n };\n });\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('core')\r\n .directive('expander', expander);\r\n\r\nfunction expander($rootScope) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n title: '@',\r\n subtitle: '@',\r\n expanded: '=',\r\n expandable: '@',\r\n accordion: '@',\r\n accordionGroup: '@',\r\n headerClass: '@',\r\n bodyClass: '@',\r\n iconClassExpanded: '@',\r\n iconClassCollapsed: '@',\r\n forceHeaderClasses: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=Expander',\r\n link(scope, el, attr) {\r\n scope.hClass = '';\r\n\r\n //set defaults for unset scope values\r\n if (!attr.iconClassExpanded) {\r\n attr.iconClassExpanded = 'icon icon-collapse';\r\n }\r\n\r\n if (!attr.iconClassCollapsed) {\r\n attr.iconClassCollapsed = 'icon icon-expand';\r\n }\r\n\r\n\r\n //we have to capture the expanded attribute and assign it to a new property\r\n //otherwise angular gets upset if the attribute is not assignable (which we as\r\n //a directive have no control over\r\n scope.$watch('expanded', function(val) {\r\n scope.e = val;\r\n });\r\n\r\n const accordion = attr.accordion === 'true';\r\n if (accordion) {\r\n scope.$on(String.format('{0}expanderExpanded', attr.accordionGroup ? attr.accordionGroup : ''), function(ev, s) {\r\n if (scope.$id !== s.$id && scope.e) {\r\n scope.toggle();\r\n }\r\n });\r\n }\r\n\r\n scope.$on('forceExpand', function() {\r\n scope.e = true;\r\n });\r\n\r\n scope.toggle = function() {\r\n if (scope.expandable === 'false') {\r\n return;\r\n }\r\n\r\n scope.e = !scope.e;\r\n if (scope.e) {\r\n $rootScope.$broadcast(String.format('{0}expanderExpanded', attr.accordionGroup ? attr.accordionGroup : ''), scope);\r\n }\r\n };\r\n scope.headerClasses = function() {\r\n if (scope.forceHeaderClasses === true) {\r\n scope.hClass = scope.headerClass == null ? '' : ` ${scope.headerClass}`;\r\n } else {\r\n scope.hClass = '';\r\n }\r\n };\r\n scope.expanderClass = function() {\r\n if (scope.expandable === 'false') {\r\n scope.headerClasses();\r\n return 'ng-hide';\r\n }\r\n\r\n //update the hClass property\r\n scope.hClass = scope.e ? 'expanded' : 'collapsed';\r\n scope.hClass += scope.headerClass == null ? '' : ` ${scope.headerClass}`;\r\n\r\n return scope.e ? scope.iconClassExpanded : scope.iconClassCollapsed;\r\n };\r\n\r\n scope.bClass = function() {\r\n return scope.bodyClass == null ? '' : scope.bodyClass;\r\n };\r\n }\r\n };\r\n}\r\n})();\r\n","'use strict';\n\nnamespace core {\n\n class Tag {\n title: string;\n isNew :boolean;\n\n public constructor(title, isNew) {\n this.title = title;\n this.isNew = isNew;\n }\n }\n\n class ExtendableTagList {\n\n private readonly formName :string;\n private analyticsTag :string;\n private tags :string[];\n\n public readonly componentInputId :string;\n public readonly inputLabelText :string;\n public readonly labelText :string;\n public readonly maxExtraTags :number;\n public readonly maxTagLength :string;\n public readonly minTagLength :string;\n\n public form :ng.IFormController;\n public model :string[];\n public newTagTitle :string = '';\n public tagLists :{ predefined :Tag[], userDefined :Tag[] } = { predefined: [], userDefined: []};\n\n\n constructor(private $scope : ng.IScope,\n private analytics : any) {\n let uniqueId = Math.random().toString(36).substr(2, 7);\n this.componentInputId = `extendable-tag-list--${uniqueId}`;\n this.formName = `tagForm_${uniqueId}`;\n\n //basic checks of our min, max values\n if (!this.maxTagLength || !this.minTagLength) {\n throw 'Extendable Tag List - Invalid parameters';\n }\n\n _.each(this.tags, t => {\n this.tagLists.predefined.push(new Tag(t, false));\n });\n\n //sometimes our model will be set and may contain non-predefined tags, these need to be added to the\n //user defined list\n if (this.model && this.model.length > 0) {\n const userTags = _.difference(this.model, this.tags);\n _.each(userTags, t => { this.addTagToUserDefinedList(t); });\n }\n\n if (this.analyticsTag) {\n $scope.$watchCollection('twi.model', (n: string[], o: string[]) => {\n if (n && o && (n.length > 0 || o.length > 0)) {\n\n let changes = _.difference(n, o);\n //we are only interested in additions\n if (changes.length) {\n _.each(changes, c => {\n let userDefined = _.findIndex(this.tagLists.userDefined, t => t.title === c) > -1;\n this.analytics.track('mixpanel',\n `${this.analyticsTag}_Add`,\n { value : c, userDefined : userDefined });\n });\n }\n }\n });\n }\n }\n\n public addUserTag (form) :void {\n form.$setSubmitted();\n\n if (!form.$valid) {\n return;\n }\n\n //check we don't already have it in the predefined list (if we do just select it)\n let tag = _.find(this.tagLists.predefined, t => t.title.toLowerCase() === this.newTagTitle.toLowerCase());\n\n if (tag) {\n if(!_.find(this.model, t => t === tag.title)) {\n this.model.push(tag.title);\n }\n return;\n }\n\n //add it to our user defined list instead\n if (this.addTagToUserDefinedList(this.newTagTitle)) {\n this.model.push(this.newTagTitle); //also update our model\n }\n\n //clear our value and make sure the form is returned to a clean state\n this.newTagTitle = '';\n form.$setPristine();\n form.$setUntouched();\n\n }\n\n public removeUserTag(title :string) :void {\n let titleLowercase = title.toLowerCase();\n _.remove(this.tagLists.userDefined, t => t.title.toLowerCase() === titleLowercase);\n _.remove(this.model, t => t.toLowerCase() === titleLowercase);\n }\n\n public tagLimitReached() :boolean {\n return this.tagLists.userDefined.length >= this.maxExtraTags;\n }\n\n public $postLink() {\n //set our form correctly as it is dynamically named\n this.form = this.$scope[this.formName];\n };\n\n //adds a tag with the given title to the tags.userDefined list if it does not exist already. Returns a bool\n //indicating if anything was added\n private addTagToUserDefinedList(tagTitle :string) :boolean{\n //do we have the tag in our userdefined list? if so move on\n let tag = _.find(this.tagLists.userDefined, t => t.title.toLowerCase() === tagTitle.toLowerCase());\n\n if (!tag) {\n this.tagLists.userDefined.push(new Tag(tagTitle, true));\n return true;\n }\n\n return false;\n }\n\n }\n\n angular\n .module('core')\n .directive('extendableTagList', () => {\n return {\n restrict: 'E',\n template: `
        \n
        \n
          \n
        • \n \n
        • \n \n
        • \n
        \n
        \n\n \n
        \n \n
        \n \n \n
        \n
        \n Please ensure your entry is between {{::twi.minTagLength}} and \n {{::twi.maxTagLength}} characters\n
        \n
        Please enter a value
        \n
        \n
        \n
        \n
        \n
        \n You are allowed to specify a maximum of {{::twi.maxExtraTags}} tags, you'll have \n to remove tags before being able to add more.\n
        \n
        `,\n bindToController: {\n analyticsTag: '@', //DK: this will hopefully be temporary while we measure interaction with this\n inputLabelText: '@',\n maxExtraTags: '=',\n maxTagLength: '@',\n minTagLength: '@',\n model: '=',\n labelText: '@',\n tags: '<'\n },\n scope: {},\n replace: true,\n controllerAs: 'twi',\n controller: ExtendableTagList\n };\n });\n\n}\n","'use strict';\nnamespace Core {\n\n interface IExtraFocusTrackerEventQueue {\n queue: ((JQuery) => void)[];\n }\n\n class ExtraFocusTracker {\n\n cssClass = _.uniqueId('extra-focus-tracker-');\n\n constructor(\n private $element,\n private $scope,\n private extraFocusTrackerEventQueue: IExtraFocusTrackerEventQueue\n ) {\n let func = target => {\n if (target.is('body, body *')) {\n if (!target.is('a[href], a[href] *')) {\n this.setFocus(target.is(`.${this.cssClass}, .${this.cssClass} *`));\n }\n }\n };\n extraFocusTrackerEventQueue.queue.push(func);\n $scope.$on('$destroy', () => _.pull(extraFocusTrackerEventQueue.queue, func));\n }\n\n setFocus(value) {\n if (this.$scope.extraFocusTrackerFocused !== value) {\n this.$scope.$evalAsync(() => this.$scope.extraFocusTrackerFocused = value);\n }\n }\n }\n\n angular\n .module('core')\n .factory('extraFocusTrackerEventQueue', () => {\n const service: IExtraFocusTrackerEventQueue = {\n queue: []\n };\n $(() => {\n $('body').on('focusin click touchstart', '*', event => {\n const target = $(event.target);\n service.queue.forEach(f => f(target));\n });\n });\n return service;\n })\n .directive('extraFocusTracker', ($timeout): ng.IDirective => {\n return {\n controller: ExtraFocusTracker,\n restrict: 'A',\n link: (scope: any, element: JQuery, attrs, controller: ExtraFocusTracker) => {\n element.addClass(controller.cssClass);\n scope.extraFocusTrackerFocused = false;\n }\n };\n });\n}\n","'use strict';\n/*\n Creates a dropdown menu of options for an input field.\n Header items must contain a truthy `header` property (will not be selectable).\n\n Configurable via attributes:\n Input field as `inputField`\n Data source as `data`.\n Options format as `headerFormat`, `optionFormat` (defaults to `Title`)\n `select` function receives arguments `(item, e)`.\n\n Other options defined in `bindToController`.\n*/\nnamespace Autocompleter {\n\n class FieldOptions {\n\n private inputField: JQuery;\n private data: any[];\n private select: Function;\n private headerFormat: string;\n private optionFormat: string;\n private noHide: boolean;\n private classes: string;\n private restricted: string;\n\n uiState = {\n fieldFocused: false,\n menuShowing: false,\n menuPopulated: false,\n selectedIndex: -1,\n selectableOptions: {},\n selectableOpsCount: 0,\n denyHide: false,\n denyScroll: false,\n denyFocus: false,\n denyBlur: false\n };\n\n createMenu: (inputEl: JQuery) => void;\n\n constructor(\n private $scope: any,\n private $element: JQuery,\n private $parse: ng.IParseService,\n private $timeout: ng.ITimeoutService,\n private $q: ng.IQService\n ) {\n let self = this;\n\n // `no-hide` attribute\n if (this.noHide){\n this.uiState.denyHide = true;\n this.uiState.menuShowing = true;\n }\n else {\n $element.hide();\n }\n\n this.createMenu = (inputEl: JQuery) => {\n\n let uiState = this.uiState,\n selectHandler: Function = this.select,\n formatHeader = $parse(this.headerFormat || 'Title'),\n formatLabel = $parse(this.optionFormat || 'Title'),\n ul: JQuery = $element,\n eventNS: string = '.fieldOptions',\n selOptionClass: string = 'selected';\n\n let uiHandlers = {\n 9: selectCurrOption, // Tab\n 13: selectCurrOption, // Return\n 16: angular.noop, // Shift\n 27: blurField, // Escape\n 38: () => traverseOptions(-1), // Up arrow\n 40: () => traverseOptions(1) // Down arrow\n };\n\n // Debounced menu refresh (thenable)\n let debouncedPopulateMenu = _.debounce(resolve => {\n populateMenu(this.data);\n resolve();\n }, 100);\n\n init();\n\n\n function init() {\n // Watch `data` attribute\n $scope.$watch('fo.data', v => {\n if (v) {\n if (!uiState.denyFocus) {\n refreshMenu().then(showMenu);\n }\n }\n else {\n hideMenu();\n clearMenu();\n }\n });\n\n // DOM listeners on input field\n inputEl\n .on('focus' + eventNS, function() {\n focusField();\n })\n .on('keydown' + eventNS, function(e) {\n let handler = uiHandlers[e.keyCode];\n // Special keys i.e. escape, tab\n if (handler) { handler(e); }\n // Normal keypress\n else {\n refreshMenu().then(showMenu);\n }\n })\n .on('click' + eventNS, function() {\n this.setSelectionRange(0, this.value.length);\n focusField();\n })\n .on('blur' + eventNS, function() {\n // IE fix (clicking scrollbar hides menu)\n $timeout(() => {\n if (uiState.denyBlur) { inputEl.focus(); }\n else { blurField(); }\n });\n });\n\n // DOM listeners on menu ul\n ul.on('mousedown' + eventNS, () => {\n uiState.denyBlur = true; // IE fix (above)\n suppressFocus();\n })\n .on('mouseup' + eventNS, () => uiState.denyBlur = false)\n .on('mouseleave' + eventNS, () => uiState.denyBlur = false)\n .on('mouseleave' + eventNS, () => clearHighlight())\n .on('mouseenter' + eventNS, '> li', e => {\n const index = ul.find('.field-options-item').index(e.target);\n if (index > -1) {\n highlightOption(index);\n } else {\n clearHighlight();\n }\n });\n\n $scope.$on('$destroy', deregister);\n }\n\n function showMenu() {\n if (uiState.menuPopulated && uiState.fieldFocused) {\n if (!uiState.menuShowing){\n selectNone();\n uiState.menuShowing = true;\n $element.show();\n if (ul.isOnScreen && !ul.isOnScreen()) {\n scrollToMenu();\n }\n }\n }\n else {\n hideMenu();\n }\n }\n\n function hideMenu() {\n if (!uiState.denyHide && uiState.menuShowing) {\n uiState.menuShowing = false;\n selectNone();\n $element.hide();\n }\n }\n\n function refreshMenu() {\n return $q( res => debouncedPopulateMenu(res) );\n }\n\n function focusField() {\n if (!uiState.denyFocus) {\n uiState.fieldFocused = true;\n refreshMenu().then(showMenu);\n }\n }\n\n function blurField() {\n uiState.fieldFocused = false;\n hideMenu();\n }\n\n function scrollToMenu() {\n if (!uiState.denyScroll) {\n uiState.denyScroll = true;\n let winPos = $(window).scrollTop(),\n winHeight = $(window).height(),\n ulPos = ul.offset().top,\n ulHeight = ul.outerHeight(),\n ulBottom = ulPos - winPos + ulHeight + 10, // Arbitrary gap\n scrollPos = winPos + Math.min(ulBottom - winHeight, 150);\n\n if (scrollPos > 0) {\n $('html, body').animate({scrollTop: scrollPos}, 200);\n }\n }\n }\n\n function getSelectedOption() {\n if (uiState.selectedIndex > -1){\n return $element.find('li').eq(\n uiState.selectableOptions[uiState.selectedIndex].domIndex\n );\n }\n }\n\n function selectCurrOption() {\n if (uiState.menuShowing) {\n let op = getSelectedOption();\n if (op) {\n op.trigger('click');\n }\n hideMenu();\n }\n }\n\n function selectItem(params: any) {\n let item = params.item;\n if (params.e) {\n params.e.preventDefault();\n params.e.stopPropagation();\n }\n suppressFocus();\n hideMenu();\n if (item && !item.header) {\n self.$scope.$emit('fieldOptionSelected', item);\n $timeout(() => {\n selectHandler(params); // `select` attribute\n });\n }\n }\n\n function populateMenu(data: any[]) {\n clearMenu();\n\n if (data) {\n let opsCount = 0;\n data.forEach((o, i) => {\n\n // restricted Code for directive\n if(\n self.restricted != null\n && o.Code !== self.restricted\n && o.Title !== 'Airports')\n {\n return;\n }\n\n $(`
      • \n ${getLabelHTML(o)}\n
      • `)\n .click(e => selectItem({item:o, e:e}))\n .appendTo(ul);\n\n // Index non-headers\n if (!o.header) {\n uiState.selectableOptions[opsCount++] = {domIndex: i, item: o};\n }\n });\n uiState.selectableOpsCount = opsCount;\n\n if (opsCount) {\n selectNone();\n uiState.menuPopulated = true;\n }\n else {\n hideMenu();\n clearMenu();\n }\n }\n }\n\n function clearMenu() {\n uiState.selectableOptions = {};\n uiState.selectableOpsCount = 0;\n uiState.menuPopulated = false;\n ul.empty();\n }\n\n function getLabelHTML(item: any) {\n if (item.header) {\n return formatHeader(item);\n }\n let label = formatLabel(item),\n fieldVal = inputEl.val(),\n term = fieldVal && fieldVal.trim().toLowerCase();\n if (term) {\n let termPos = label.toLowerCase().indexOf(term);\n if (termPos > -1) {\n let termEnd = termPos + term.length,\n [str0, str1, str2] = [\n label.substring(0, termPos),\n label.substring(termPos, termEnd),\n label.substring(termEnd)\n ];\n label = `${str0}${str1}${str2}`;\n }\n }\n // let icon = '';\n // if (item.icon) {\n // const cssClass = item.isChild ? 'field-options-child' : '';\n // icon = ``;\n // }\n //label = `${icon} ${label}`;\n return label;\n }\n\n function highlightOption(i: number) {\n clearHighlight();\n uiState.selectedIndex = loopIndex(i, 0, uiState.selectableOpsCount-1);\n const selectedOption = getSelectedOption();\n if (selectedOption) {\n selectedOption.addClass(selOptionClass);\n }\n return selectedOption;\n }\n\n function clearHighlight() {\n $element.find('.' + selOptionClass).removeClass(selOptionClass);\n }\n\n function suppressFocus() {\n // Stops input focus showing menu again i.e. on menu click\n // NOTE: angular $timeout would run an unwanted digest\n uiState.denyFocus = true;\n setTimeout(() => uiState.denyFocus = false, 200);\n }\n\n function selectNone() {\n uiState.selectedIndex = -1;\n clearHighlight();\n }\n\n function traverseOptions(incr: number) {\n if (uiState.menuShowing) {\n let op:any = highlightOption(uiState.selectedIndex + incr),\n opPos = op.position(),\n opTop = opPos && opPos.top;\n\n if (opTop) {\n // Center option vertically\n ul.scrollTop(\n ul.scrollTop() + opTop - ul.height()/2 + op.outerHeight(true)/2\n );\n }\n }\n }\n\n function loopIndex(i: number, start: number, end: number) {\n return i < start ? end : (i > end ? start : i);\n }\n\n function deregister() {\n inputEl.off(eventNS);\n ul.off(eventNS);\n }\n\n function getItemClasses(item) {\n let classes: string[] = [];\n classes.push(item.header ? 'field-options-header' : 'field-options-item');\n if (item.isGroup) {\n classes.push('field-options-item-parent');\n }\n if (item.isChild) {\n classes.push('field-options-item-child');\n }\n return classes.join(' ');\n }\n };\n }\n };\n\n angular\n .module('core')\n .directive('fieldOptions', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: FieldOptions,\n controllerAs: 'fo',\n bindToController: {\n inputField: '&', // JQuery element\n data: '=', // Array of objects\n select: '&', // Selection handler fn\n headerFormat: '@', // Expression for header text format in menu (via $parse)\n optionFormat: '@', // Expression for option text format in menu (via $parse)\n noHide: '=', // Boolean to prevent menu hiding\n classes: '@' // Additional CSS classes on wrapping
        \n },\n replace: true,\n template: `
          `,\n link: (scope: any) => {\n // Initialise once input field exists\n let unwatchInit = scope.$watch(\n () => scope.fo.inputField(),\n (inputEl: JQuery) => {\n if (inputEl) {\n unwatchInit();\n scope.fo.createMenu(inputEl);\n }\n }\n );\n }\n };\n });\n}\n","'use strict';\n/*\n Creates a dropdown menu of options for an input field.\n Header items must contain a truthy `header` property (will not be selectable).\n*/\nnamespace Autocompleter {\n\n interface ISelected {\n item: IData;\n e: JQueryEventObject;\n }\n\n interface IData {\n header: string;\n }\n\n class FieldOptions2 {\n\n private inputEl: JQuery;\n private data: any[];\n private select: (ISelected) => void;\n private headerFormat: string;\n private optionFormat: string;\n private formatHeader: ng.ICompiledExpression;\n private formatLabel: ng.ICompiledExpression;\n private ul: JQuery;\n private selOptionClass: string = 'selected';\n\n uiState = {\n menuPopulated: false,\n denyScroll: false,\n selectedIndex: -1,\n selectableOptions: {},\n selectableOpsCount: 0,\n };\n\n constructor(\n private $scope: any,\n private $element: JQuery,\n private $timeout: ng.ITimeoutService,\n private $q: ng.IQService,\n $parse: ng.IParseService\n ) {\n this.formatHeader = $parse(this.headerFormat || 'Title');\n this.formatLabel = $parse(this.optionFormat || 'Title');\n this.ul = $element;\n }\n\n createMenu(): void {\n\n let eventNS: string = '.fieldOptions';\n\n let uiHandlers = {\n 9: () => this.selectCurrentOption(), // Tab\n 13: () => this.selectCurrentOption(), // Return\n 16: angular.noop, // Shift\n 38: () => this.traverseOptions(-1), // Up arrow\n 40: () => this.traverseOptions(1) // Down arrow\n };\n\n // Debounced menu refresh (thenable)\n const debouncedPopulateMenu = _.debounce(resolve => {\n this.populateMenu(this.data);\n resolve();\n }, 100, {\n 'leading': true,\n 'trailing': true\n });\n const refreshMenu = () => this.$q(debouncedPopulateMenu);\n\n this.$scope.$watch('fo.data', v => {\n if (v) {\n refreshMenu();\n }\n });\n\n // DOM listeners on input field\n this.inputEl\n .on('focus' + eventNS, refreshMenu)\n .on('keydown' + eventNS, function(event: JQueryEventObject) {\n let handler = uiHandlers[event.keyCode];\n handler ? handler() : refreshMenu();\n })\n .on('click' + eventNS, function() {\n this.setSelectionRange(0, this.value.length);\n refreshMenu();\n });\n\n // DOM listeners on menu ul\n this.ul\n .on('mouseleave' + eventNS, () => this.clearHighlight())\n .on('mouseenter' + eventNS, '> li', (event: JQueryEventObject) => {\n const index = this.ul.find('.field-options-item').index(event.target);\n if (index > -1) {\n this.highlightOption(index);\n } else {\n this.clearHighlight();\n }\n });\n\n this.$scope.$on('$destroy', () => {\n this.inputEl.off(eventNS);\n this.ul.off(eventNS);\n });\n }\n\n getCurrentOption() {\n if (this.uiState.selectedIndex > -1) {\n return this.$element.find('li').eq(\n this.uiState.selectableOptions[this.uiState.selectedIndex].domIndex\n );\n }\n }\n\n selectCurrentOption() {\n let op = this.getCurrentOption();\n if (op) {\n op.trigger('click');\n }\n }\n\n selectItem(params: ISelected) {\n let item = params.item;\n if (params.e) {\n params.e.preventDefault();\n params.e.stopPropagation();\n }\n if (item && !item.header) {\n this.$scope.$emit('fieldOptionSelected', item);\n this.$timeout(() => {\n this.select(params); // `select` attribute\n });\n }\n }\n\n clearMenu() {\n this.uiState.selectableOptions = {};\n this.uiState.selectableOpsCount = 0;\n this.uiState.menuPopulated = false;\n this.ul.empty();\n }\n\n populateMenu(data: any[]) {\n this.clearMenu();\n\n if (data) {\n let opsCount = 0;\n data.forEach((o, i) => {\n $(`
        • \n ${this.getLabelHTML(o)}\n
        • `)\n .click(e => this.selectItem({item:o, e:e}))\n .appendTo(this.ul);\n\n // Index non-headers\n if (!o.header) {\n this.uiState.selectableOptions[opsCount++] = {domIndex: i, item: o};\n }\n });\n this.uiState.selectableOpsCount = opsCount;\n\n if (opsCount) {\n this.selectNone();\n this.uiState.menuPopulated = true;\n this.scrollToMenu();\n } else {\n this.clearMenu();\n }\n }\n }\n\n scrollToMenu() {\n this.$timeout(() => {\n if (!this.uiState.denyScroll && this.ul.is(':visible')) {\n let winPos = $(window).scrollTop(),\n winHeight = $(window).height(),\n ulPos = this.ul.offset().top,\n ulHeight = this.ul.outerHeight(),\n ulBottom = ulPos - winPos + ulHeight + 10, // Arbitrary gap\n scrollPos = winPos + Math.min(ulBottom - winHeight, 150);\n\n if (scrollPos > 0) {\n this.uiState.denyScroll = true;\n $('html, body').animate({scrollTop: scrollPos}, 200);\n }\n }\n });\n }\n\n getLabelHTML(item: any) {\n if (item.header) {\n return this.formatHeader(item);\n }\n let label = this.formatLabel(item),\n fieldVal = this.inputEl.val(),\n term = fieldVal && fieldVal.trim().toLowerCase();\n if (term) {\n let termPos = label.toLowerCase().indexOf(term);\n if (termPos > -1) {\n let termEnd = termPos + term.length,\n [str0, str1, str2] = [\n label.substring(0, termPos),\n label.substring(termPos, termEnd),\n label.substring(termEnd)\n ];\n label = `${str0}${str1}${str2}`;\n }\n }\n let icon = '';\n if (item.icon) {\n //const cssClass = item.isChild ? 'field-options-child' : '';\n //icon = ``;\n //icon = ``;\n }\n label = `${icon} ${label}`;\n return label;\n }\n\n highlightOption(i: number) {\n this.clearHighlight();\n this.uiState.selectedIndex = this.loopIndex(i, 0, this.uiState.selectableOpsCount-1);\n const currentOption = this.getCurrentOption();\n if (currentOption) { currentOption.addClass(this.selOptionClass); }\n }\n\n clearHighlight() {\n this.$element.find('.' + this.selOptionClass).removeClass(this.selOptionClass);\n }\n\n selectNone() {\n this.uiState.selectedIndex = -1;\n this.clearHighlight();\n }\n\n traverseOptions(incr: number) {\n let op:any = this.highlightOption(this.uiState.selectedIndex + incr),\n opPos = op.position(),\n opTop = opPos && opPos.top;\n\n if (opTop) {\n // Center option vertically\n this.ul.scrollTop(\n this.ul.scrollTop() + opTop - this.ul.height()/2 + op.outerHeight(true)/2\n );\n }\n }\n\n loopIndex(i: number, start: number, end: number) {\n return i < start ? end : (i > end ? start : i);\n }\n\n getItemClasses(item) {\n let classes: string[] = [];\n classes.push(item.header ? 'field-options-header' : 'field-options-item');\n if (item.isGroup) {\n classes.push('field-options-item-parent');\n }\n if (item.isChild) {\n classes.push('field-options-item-child');\n }\n return classes.join(' ');\n }\n };\n\n angular\n .module('core')\n .directive('fieldOptions2', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: FieldOptions2,\n controllerAs: 'fo',\n bindToController: {\n inputField: '&', // JQuery element\n data: '=', // Array of objects\n select: '&', // Selection handler fn\n headerFormat: '@', // Expression for header text format in menu (via $parse)\n optionFormat: '@' // Expression for option text format in menu (via $parse)\n },\n replace: true,\n template: `
            `,\n link: (scope: any) => {\n // Initialise once input field exists\n let unwatchInit = scope.$watch(\n () => scope.fo.inputField(),\n (inputEl: JQuery) => {\n if (inputEl) {\n unwatchInit();\n scope.fo.inputEl = inputEl;\n scope.fo.createMenu();\n }\n }\n );\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class FlightExtraTitles {\n public Bag: () => string;\n public Bags: () => string;\n public Extra: () => string;\n public Extras: () => string;\n public Seat: () => string;\n public Seats: () => string;\n }\n\n class FlightExtrasSummary {\n\n private flightStrings: FlightExtraTitles;\n private optionCounts: any;\n\n public flightExtrasDescription: string = '';\n\n constructor(\n private $scope: ng.IScope,\n private resourceService: Core.ResourceService\n ) {\n\n this.flightStrings = {\n Bag: resourceService.getDeferred('BREAKDOWNBAG'),\n Bags: resourceService.getDeferred('BREAKDOWNBAGS'),\n Extra: resourceService.getDeferred('BREAKDOWNFLIGHTEXTRA'),\n Extras: resourceService.getDeferred('BREAKDOWNFLIGHTEXTRAS'),\n Seat: resourceService.getDeferred('BREAKDOWNSEAT'),\n Seats: resourceService.getDeferred('BREAKDOWNSEATS')\n };\n\n $scope.$watch('fes.optionCounts', (v) => {\n if (v) {\n this.updateFlightExtrasDescription();\n }\n });\n }\n\n private updateFlightExtrasDescription(): void {\n\n //we want to build a description of the extras included with our flight eg (+ bags, seats)\n let labels: string[] = [];\n\n if (this.optionCounts.HoldBags > 0) {\n let bagslabel = this.optionCounts.HoldBags === 1 ? this.flightStrings.Bag() : this.flightStrings.Bags();\n labels.push(`${bagslabel}`);\n }\n\n if (this.optionCounts.Seats > 0) {\n labels.push(this.optionCounts.Seats === 1 ? this.flightStrings.Seat() : this.flightStrings.Seats());\n }\n\n if (labels.length > 0) {\n this.flightExtrasDescription =\n String.format(\n labels.length > 1 ? this.flightStrings.Extras() : this.flightStrings.Extra(),\n ...labels\n );\n } else {\n this.flightExtrasDescription = '';\n }\n\n }\n\n }\n\n angular\n .module('core')\n .directive('flightExtrasSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n bindToController: {\n optionCounts: '='\n },\n controller: FlightExtrasSummary,\n controllerAs: 'fes',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=FlightExtrasSummary'\n };\n\n });\n\n}\n","'use strict';\n\n//This directive is to delay the loading of all Google Tag Manager type scripts\n//until after AngularJS has has a change to load itself.\n\nnamespace Core {\n class Gtm {\n constructor (\n $element: JQuery,\n $timeout: ng.ITimeoutService\n ) {\n $timeout(() => {\n $element.append('');\n if (TRPCONFIG.Domain.GtmHelpersScriptEnabled) {\n $element.append('');\n }\n }, 1000);\n }\n }\n angular\n .module('core')\n .directive('gtm', (): ng.IDirective => {\n return {\n restrict: 'E',\n controller: Gtm\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n class HotelContentCard {\n // Attr\n model: Hotels.StaticHotel;\n click: () => void;\n href: string;\n header: string;\n teaserPrice: string;\n }\n angular\n .module('core')\n .directive('hotelContentCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n controller: HotelContentCard,\n controllerAs: 'hc',\n replace: true,\n bindToController: {\n model: '=',\n click: '&',\n header: '@',\n href: '@',\n teaserPrice: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=HotelContentCard'\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class CancellationInformation {\n readonly amendableUntil: Date;\n readonly freeCancellationUntil: Date;\n readonly isPayAtHotel: boolean;\n readonly nonRefundable: boolean;\n\n constructor(nonRefundable: boolean,\n refundableCutOff: Date | null,\n cancellationCutOff: Date | null,\n payAtHotel: boolean) {\n\n if (nonRefundable === true) {\n this.nonRefundable = nonRefundable;\n } else if (refundableCutOff != null) {\n this.amendableUntil = refundableCutOff;\n } else if (cancellationCutOff != null) {\n this.freeCancellationUntil = cancellationCutOff;\n }\n\n this.isPayAtHotel = payAtHotel;\n }\n }\n\n class HotelStaySummaryRoom {\n readonly boardDescription: string;\n readonly cancellationInfo: CancellationInformation;\n readonly roomDescription: string;\n quantity: number = 1;\n\n constructor(quantity: number,\n roomDescription: string,\n boardDescription: string,\n cancellationPolicy: CancellationInformation) {\n this.quantity = quantity;\n this.roomDescription = roomDescription;\n this.boardDescription = boardDescription;\n this.cancellationInfo = cancellationPolicy;\n }\n\n }\n\n class HotelStaySummary {\n\n atolAvailable: boolean;\n hotel: any;\n occupancy: any;\n groupRooms:boolean;\n rooms: HotelStaySummaryRoom[];\n\n constructor(\n public $scope: any,\n private modalService: any,\n private basketService: any\n ) {\n\n this.$scope.$watch('hss.hotel.Details.BookedItems', v => {\n if (!_.isArray(v)) {\n return;\n }\n // concatenate rooms which have matching descriptions, board types and cancellation messages\n this.rooms = [];\n _.each(v, (bi: any) => {\n let room: string = bi.RoomDescription;\n let board: string = bi.BoardDescription;\n\n const info = new CancellationInformation( bi.NonRefundable,\n this.hotel.RefundableCutOffDate,\n this.hotel.FreeCancellationCutOffDate,\n bi.IsPayAtHotel);\n\n if(this.groupRooms === false){\n this.rooms.push(new HotelStaySummaryRoom(1, room, board, info));\n } else {\n let match: HotelStaySummaryRoom = _.find(this.rooms, (r) => {\n return r.roomDescription === room\n && r.boardDescription === board\n && _.isEqual(r.cancellationInfo, info);\n });\n if (match) {\n match.quantity += 1;\n } else {\n this.rooms.push(new HotelStaySummaryRoom(1, room, board, info));\n }\n }\n });\n });\n\n }\n\n public showModal(url) {\n this.modalService.launch(url);\n }\n\n public changeHotel() {\n this.basketService.changeJourneyUrl(20);\n }\n\n }\n\n angular\n .module('core')\n .directive('hotelStaySummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: HotelStaySummary,\n controllerAs: 'hss',\n replace: true,\n bindToController: {\n atolAvailable: '=',\n hotel: '=',\n occupancy: '=',\n groupRooms: '='\n },\n templateUrl: (element, attr) => {\n if(attr.templateVersion){\n return 'partials/booking/template?name=HotelStaySummary&version='\n + attr.templateVersion;\n }\n return 'partials/home/directivetemplate?type=HotelStaySummary';\n }\n };\n\n });\n\n}\n","namespace Core {\n\n interface HowToGetThereAirport {\n Code: string;\n Title: string;\n }\n\n interface HowToGetThereFlightOption {\n departureTitle: string;\n duration: string;\n };\n\n class HowToGetThere {\n\n destinationTitle: string;\n destinationAirports: string;\n options: HowToGetThereFlightOption[];\n\n constructor(\n flightStaticService: TR.FlightStaticService,\n private geo,\n private $q: ng.IQService\n ) {\n this.getDepartureAirports().then((departureAirports: HowToGetThereAirport[]) => {\n\n let departureAirportGroups = _.map(departureAirports, a => a.Code);\n let destinationAirportGroups = [this.destinationAirports];\n\n flightStaticService.getFlightDurations(departureAirportGroups, destinationAirportGroups)\n .then((durations: TR.FlightDurationResponse[]) => {\n this.options = _.chain(departureAirports)\n .map(a => ({\n a,\n d: _.find(durations, d => d.DurationMinutesDepartureAirport === a.Code)\n }))\n .filter(tuple => tuple.d)\n .map(tuple => {\n let option: HowToGetThereFlightOption = {\n departureTitle: tuple.a.Title,\n duration: this.formatDuration(tuple.d.DurationMinutes)\n };\n return option;\n })\n .value();\n });\n });\n }\n\n getDepartureAirports() {\n if (TRPCONFIG.Domain.HowToGetThereDepartureAirports) {\n let departureAirports: HowToGetThereAirport[] =\n angular.fromJson(TRPCONFIG.Domain.HowToGetThereDepartureAirports);\n return this.$q.when(departureAirports);\n }\n return this.geo.getNearestAirportTitles();\n }\n\n formatDuration(minutes: number): string {\n let hours: number = Math.floor(minutes / 60);\n let duration: string = hours > 0 ? (hours + 'h ') : '';\n duration += (minutes % 60) + 'm';\n return duration;\n }\n }\n\n angular\n .module('core')\n .directive('howToGetThere', (): ng.IDirective => {\n return {\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=LandingPage/HowToGetThere',\n bindToController: {\n destinationTitle: '@',\n destinationAirports: '@'\n },\n scope: {},\n controller: HowToGetThere,\n controllerAs: 'ht'\n };\n });\n}\n","namespace ekh {\n angular\n .module('ekh')\n .directive('imageResize', (imageService): ng.IDirective => {\n return {\n restrict: 'A',\n link: ($scope:any, $element:JQuery, $attrs:any) => {\n const [size] = imageService.getAppropriateSize($(window).width());\n let source = $attrs['imageResize'];\n\n if(!source){\n let imageObserver = $attrs.$observe('imageResize', value => {\n if(value){\n source = value;\n applySource();\n imageObserver();\n }\n });\n } else {\n applySource();\n }\n\n function applySource(){\n if( source ) {\n source = source.replace(/(width|height)=\\d+&?/g, '');\n const hasParams = /\\?/.test(source);\n source += `${hasParams ? '&' : '?'}width=${size}`;\n\n if($element[0].tagName.toUpperCase() === 'IMG'){\n $element.attr('src', source);\n } else {\n $element.css({ 'background-image': `url('${source}')`});\n }\n }\n }\n }\n };\n });\n}\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\n\nlet count = 1;\nconst startTime = new Date().toISOString();\nfunction uniqueId() {\n return startTime + count++;\n}\n\nfunction newCompile($element) {\n if (TRPCONFIG.Domain.AutocompleteFix === 'remove') {\n $element.removeAttr('autocomplete');\n } else if (TRPCONFIG.Domain.AutocompleteFix === 'nope') {\n //https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n $element.attr('autocomplete', 'nope');\n } else if (TRPCONFIG.Domain.AutocompleteFix === 'unique') {\n $element.attr('autocomplete', uniqueId());\n }\n}\n\nif (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.AutocompleteFix) {\n TR.config(function($provide) {\n $provide.decorator('inputDirective', function($delegate) {\n const formDirective = $delegate[0];\n const oldCompile = formDirective.compile;\n formDirective.compile = function($element) {\n newCompile($element);\n // eslint-disable-next-line prefer-rest-params\n return oldCompile.apply(this, arguments);\n };\n return $delegate;\n });\n });\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n /*\n * This is for cases where we have nested forms and we'd like to validate the nested form independently of its\n * parent form\n * \"borrowed\" from here: https://github.com/angular/angular.js/issues/5858\n */\n class IsolateForm implements ng.IDirective {\n restrict: string;\n require: string;\n\n constructor() {\n this.restrict = 'A';\n this.require = '?form';\n }\n\n link = (scope: ng.IScope,\n element: ng.IAugmentedJQuery,\n attrs: ng.IAttributes,\n controller: ng.IFormController) => {\n\n if (!controller) {\n return;\n }\n\n element.addClass('isolated-form');\n\n // Do a copy of the controller\n let copy :ng.IFormController = {};\n angular.copy(controller, copy);\n\n // Get the parent of the form\n let parent = element.parent().controller('form');\n\n // Remove parent link to the controller\n parent.$removeControl(controller);\n\n // Replace form controller with a \"isolated form\"\n let isolatedFormCtrl = {\n $setValidity: function (validationToken, isValid, control) {\n copy.$setValidity(validationToken, isValid, control);\n parent.$setValidity(validationToken, true, controller);\n },\n $setDirty: function () {\n element.removeClass('ng-pristine').addClass('ng-dirty');\n controller.$dirty = true;\n controller.$pristine = false;\n }\n };\n angular.extend(controller, isolatedFormCtrl);\n }\n\n static factory(): ng.IDirectiveFactory {\n const directive = () => new IsolateForm();\n directive.$inject = [];\n return directive;\n }\n\n }\n\n const TR = angular.module('TR');\n TR.directive('isolateForm', IsolateForm.factory());\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('isolatedNestedForm', isolatedNestedForm);\n\nfunction isolatedNestedForm() {\n return {\n restrict: 'A',\n require: '?form',\n link(scope, element, attrs, formController) {\n let isolatedFormEnabled = true;\n if (attrs.isolatedNestedFormEnabled !== undefined) {\n isolatedFormEnabled = (attrs.isolatedNestedFormEnabled === 'true');\n }\n if (!formController) {\n return;\n }\n const parentForm = formController.$$parentForm;\n if (!parentForm) {\n return;\n }\n // Remove this form from parent controller\n if (isolatedFormEnabled) {\n parentForm.$removeControl(formController);\n }\n }\n };\n }\n})();\n","(function() {\n'use strict';\n\nlet allImages = {};\n\nangular\n .module('core')\n .directive('lazySrc', lazySrc);\n\nfunction lazySrc($window,\n imageService,\n broker,\n $document) {\n const lazyLoader = (() => {\n let images = [];\n let renderTimer = null;\n const renderDelay = 100;\n const win = $($window);\n const doc = $document;\n let documentHeight = doc.height();\n let documentTimer = null;\n const documentDelay = 2000;\n let isWatchingWindow = false;\n\n function addImage(image) {\n images.push(image);\n if (!renderTimer) {\n startRenderTimer();\n }\n if (!isWatchingWindow) {\n startWatchingWindow();\n }\n }\n\n function removeImage(image) {\n images = _.reject(images, i => i === image);\n if (!images.length) {\n clearRenderTimer();\n stopWatchingWindow();\n }\n }\n\n function checkDocumentHeight() {\n if (renderTimer) {\n return;\n }\n const currentDocumentHeight = doc.height();\n if (currentDocumentHeight === documentHeight) {\n return;\n }\n documentHeight = currentDocumentHeight;\n startRenderTimer();\n }\n\n function checkImages() {\n const windowHeight = win.height();\n const topFoldOffset = win.scrollTop();\n const bottomFoldOffset = (topFoldOffset + windowHeight);\n\n images = _.filter(images, image => {\n const visible = image.isVisible(topFoldOffset, bottomFoldOffset);\n if (visible) {\n image.render();\n }\n return !visible;\n });\n\n clearRenderTimer();\n\n if (!images.length) {\n stopWatchingWindow();\n }\n }\n\n function clearRenderTimer() {\n clearTimeout(renderTimer);\n renderTimer = null;\n }\n\n function startRenderTimer() {\n renderTimer = setTimeout(checkImages, renderDelay);\n }\n\n function startWatchingWindow() {\n isWatchingWindow = true;\n win.on('resize.lazySrc', windowChanged);\n win.on('scroll.lazySrc', windowChanged);\n documentTimer = setInterval(checkDocumentHeight, documentDelay);\n broker.subscribe('LazySrc', 'LazySrcRetry', windowChanged);\n }\n\n function stopWatchingWindow() {\n isWatchingWindow = false;\n win.off('resize.lazySrc');\n win.off('scroll.lazySrc');\n clearInterval(documentTimer);\n broker.unsubscribe('LazySrc');\n }\n\n function windowChanged() {\n if (!renderTimer) {\n startRenderTimer();\n }\n }\n\n return ({ addImage, removeImage });\n })();\n\n\n function LazyImage(element, isFixedSize, isRendered) {\n let source = null;\n let height = null;\n\n $(element).addClass('lazy-load');\n\n function isVisible(topFoldOffset, bottomFoldOffset) {\n if (!element.is(':visible')) {\n return false;\n }\n\n if (height === null) {\n height = element.height();\n }\n\n const top = element.offset().top;\n const bottom = top + height;\n\n return (top <= bottomFoldOffset && top >= topFoldOffset) ||\n (bottom <= bottomFoldOffset && bottom >= topFoldOffset) ||\n (top <= topFoldOffset && bottom >= bottomFoldOffset);\n }\n\n function setSource(newSource) {\n source = newSource;\n if (isRendered) {\n render();\n }\n }\n\n function render() {\n isRendered ? renderSource() : setTimeout(renderSource);\n }\n\n function renderSource() {\n\n const el = element[0];\n if (!isFixedSize) {\n\n const elWidth = element.outerWidth();\n const elHeight = element.outerHeight();\n\n let appropWidth;\n let appropHeight;\n\n source = source.replace(/(width|height)=\\d+&?/g, '');\n if (!/\\?/.test(source)) {\n source += '?';\n }\n\n if (elWidth < 2 || elHeight < 2) {\n // i.e. a 1x1 placeholder (no `src` fails ':visible' test above)\n // Use parent width, leave height unspecified\n appropWidth = elWidth > 2 ? elWidth : 0;\n appropWidth = appropWidth || element.parent().width() || element.parent().parent().width() || 0;\n } else {\n // Else add height to the img src string\n [appropWidth, appropHeight] = imageService.getAppropriateSize(elWidth, elHeight);\n }\n\n let isRatio16x9 = $(element).is('.sc-c-responsive-image--16x9, .sc-c-responsive-image--16x9 *');\n if (isRatio16x9) {\n appropHeight = Math.ceil(appropWidth * 9 / 16);\n source += '&crop=true';\n }\n\n source += `&width=${appropWidth}`;\n if (appropHeight) {\n source += `&height=${appropHeight}`;\n }\n source = source.replace(/\\?&+/g, '?');\n source = source.replace(/&&+/g, '&');\n }\n if (isRendered) {\n addSourceToElement(el, source);\n } else {\n // preload the image before we set the src (for smooth fade in)\n const image = new Image();\n image.onload = () => addSourceToElement(el, source);\n image.src = source;\n }\n isRendered = true;\n }\n\n function addSourceToElement(el, source) {\n if (el.tagName.toUpperCase() === 'IMG') {\n el.src = source;\n } else {\n el.style.backgroundImage = `url(${source})`;\n }\n $(el).addClass('lazy-loaded');\n }\n\n return ({ isVisible, render, setSource });\n }\n\n function link($scope, element, attributes) {\n let isRendered = (function() {\n if (attributes.lazySrcIsPrerender === 'true') {\n return true;\n }\n if (attributes.lazySrcIsPrerender === 'false') {\n return false;\n }\n if (attributes.lazySrc && allImages[attributes.lazySrc]) {\n return true;\n }\n return TRPCONFIG.IsPrerender;\n })();\n allImages[attributes.lazySrc] = true;\n let isFixedSize = attributes.lazySrcFixedSize === 'true';\n const lazyImage = new LazyImage(element, isFixedSize, isRendered);\n lazyLoader.addImage(lazyImage);\n attributes.$observe('lazySrc', newSource => lazyImage.setSource(newSource));\n $scope.$on('$destroy', () => lazyLoader.removeImage(lazyImage));\n }\n\n return ({ link, restrict: 'A' });\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('core')\r\n .directive('loadingSpinner', loadingSpinner);\r\n\r\nfunction loadingSpinner(resourceService) {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n block: '=loadingSpinner',\r\n message: '@message'\r\n },\r\n link(scope, el) {\r\n const loadingTemplate = `${'
            ' +\r\n '
            ' +\r\n '

            '}${resourceService.get(scope.message ? scope.message : 'LOADING')}

            ` +\r\n '
            ' +\r\n `

            ${resourceService.get('THISMAYTAKE')}

            ` +\r\n '
            ' +\r\n '
            ';\r\n const wait = angular.element(loadingTemplate);\r\n\r\n el.css('display', 'none');\r\n el.after(wait);\r\n\r\n const sw = scope.$watch('block', function(val) {\r\n if (val) {\r\n el.css('display', '');\r\n wait.css('display', 'none');\r\n sw();\r\n }\r\n });\r\n }\r\n };\r\n}\r\n})();\r\n","'use strict';\n\nnamespace Core {\n\n class ModalCancellationsBasketDetails {\n show: boolean;\n public cancellationData;\n public isCancellationReady = false;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n )\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('modalCancellationsBasketDetails', 'showModalCancellationsBasketDetails', e => {\n this.show = true;\n if (TRPCONFIG.Domain.BrandedFareCancellations) {\n this.cancellationData = TRPCONFIG.Domain.BrandedFareCancellations.CancellationChargeEvents;\n }\n else if (sessionStorage.getItem('BrandedFareCancellations') !== null) {\n const BrandedFareCancellations =\n JSON.parse(sessionStorage.getItem('BrandedFareCancellations') || '');\n this.cancellationData = BrandedFareCancellations.CancellationChargeEvents;\n }\n\n this.formatEventName(this.cancellationData);\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalCancellationsBasketDetails');\n });\n }\n\n formatEventName(data) {\n for (let i = 0; i < data.length; i++) {\n let eventType = data[i].EventTypes;\n for (let j = 0; j < eventType.length; j++) {\n let chargeName = data[i].EventTypes[j];\n chargeName = chargeName.replace(/([A-Z])/g, ' $1').trim();\n data[i].EventTypes[j] = chargeName;\n }\n }\n }\n }\n\n angular\n .module('core')\n .directive('modalCancellationsBasketDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalCancellationsBasketDetails,\n controllerAs: 'mcbd',\n templateUrl: 'partials/home/directivetemplate?type=CancellationsBasketDetails',\n link: function (\n scope : ng.IScope,\n el : ng.IAugmentedJQuery,\n attr,\n controller : ModalCancellationsBasketDetails) {\n controller.init(el);\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ModalCancellationsDetails {\n show: boolean;\n public cancellationData;\n public roomId;\n public roomCancellationCharges;\n public marhabaCost = Number(sessionStorage.getItem('marhabaCost'));\n public hotelData = sessionStorage.getItem('hotelData');\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n )\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n let t = this;\n if (this.hotelData) {\n let hotelDataJson = JSON.parse(this.hotelData);\n if (hotelDataJson.RequestedRooms.length > 1) {\n this.$scope.$on('multiRoomCancellationCharges', function(e, data) {\n t.roomCancellationCharges = data;\n t.formatEventName(t.roomCancellationCharges);\n });\n }\n }\n\n this.broker.subscribe('modalCancellationsDetails', 'showModalCancellationsDetails', e => {\n this.show = true;\n this.roomId = e.data;\n\n if (this.hotelData) {\n let hotelDataJson = JSON.parse(this.hotelData);\n\n if (hotelDataJson.RequestedRooms.length === 1) {\n this.cancellationData = TRPCONFIG.Domain.CancellationData;\n this.compareData(this.cancellationData, this.roomId);\n }\n }\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalCancellationsDetails');\n });\n }\n\n findEventType(eventType, price) {\n for (let i = 0; i < eventType.length; i++) {\n if (eventType[i] === 'Departure') {\n return price + this.marhabaCost;\n }\n }\n return price;\n }\n\n formatEventName(data) {\n for (let i = 0; i < data.length; i++) {\n let eventType = data[i].EventTypes;\n for (let j = 0; j < eventType.length; j++) {\n let chargeName = data[i].EventTypes[j];\n chargeName = chargeName.replace(/([A-Z])/g, ' $1').trim();\n data[i].EventTypes[j] = chargeName;\n }\n }\n }\n\n compareData(data, id) {\n let roomCancellationData = data.filter(function (d) {\n if (d.Id === id) {\n return d;\n }\n });\n\n this.roomCancellationCharges = roomCancellationData[0].CancellationCharges;\n this.formatEventName(this.roomCancellationCharges);\n }\n }\n\n angular\n .module('core')\n .directive('modalCancellationsDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalCancellationsDetails,\n controllerAs: 'mcd',\n templateUrl: 'partials/home/directivetemplate?type=CancellationsDetails',\n bindToController: {\n roomId: '='\n },\n link: function (\n scope : ng.IScope,\n el : ng.IAugmentedJQuery,\n attr,\n controller : ModalCancellationsDetails) {\n controller.init(el);\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ModalFlightDetails {\n\n flight: any;\n passengers: number;\n show: boolean;\n customiseMessage: boolean = false;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private flightDetail: any\n )\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('modalFlightDetails', 'showModalFlightDetails', e => {\n this.flight = e.data.flight;\n this.passengers = e.data.passengers;\n this.show = true;\n this.customiseMessage = e.data.customiseMessage;\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalFlightDetails');\n });\n }\n\n public isHFareFlightType() {\n return this.flightDetail.isHFlightType(this.flight);\n }\n\n }\n\n angular\n .module('core')\n .directive('modalFlightDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalFlightDetails,\n controllerAs: 'fdc',\n templateUrl: 'partials/home/directivetemplate?type=FlightListingDetails',\n\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : ModalFlightDetails) {\n controller.init(el);\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ModalTransferDetails {\n\n transfers: any;\n passengers: any = { adults : 0, children : 0 };\n show: boolean = false;\n details: any = [];\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private $filter: any)\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('modalTransferDetails', 'showModalTransferDetails', e => {\n this.show = true;\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalTransferDetails');\n });\n\n if(this.transfers) {\n this.passengers = {\n adults: this.transfers.Details.Adults || 0,\n children: this.transfers.Details.ChildAges ? this.transfers.Details.ChildAges.length : 0\n };\n\n this.details = ['Outbound', 'Inbound'].map( direction => {\n const itinerary = this.transfers.Details.Itinerary;\n return {\n Direction : direction,\n Departure: _.get(itinerary,`[${direction}Leg].DeparturePoint`,''),\n DepartureDate: this.$filter('date')(\n _.get(itinerary,`[${direction}Leg].DepartureDate`,''), 'EEE d MMM yyyy, hh:mm'),\n Destination: _.get(itinerary,`[${direction}Leg].DestinationPoint`,''),\n FlightDate: this.$filter('date')(\n _.get(itinerary,`[${direction}Leg].FlightDate`,''), 'EEE d MMM yyyy, hh:mm'),\n TransferType: _.get(itinerary,`[${direction}Leg].TransferType`,'')\n };\n });\n }\n }\n\n }\n\n angular\n .module('core')\n .directive('modalTransferDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalTransferDetails,\n controllerAs: 'mtd',\n templateUrl: 'partials/home/directivetemplate?type=TransferDetails',\n bindToController : {\n transfers : '='\n },\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : ModalTransferDetails) {\n controller.init(el);\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ModalUspPopupDetails {\n show: boolean;\n public popupContent;\n public header;\n public content;\n public hasSplit = false;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n )\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('modalUspPopupDetails', 'showModalUspPopupDetails', e => {\n this.show = true;\n this.popupContent = e.data;\n let contentSplit = this.popupContent.split('|');\n\n this.header = contentSplit[0];\n this.content = contentSplit[1];\n });\n\n if(TRPCONFIG.IsMobileDevice) {\n (document.querySelector('.great-reasons-banner > div') as HTMLInputElement)\n .classList.add('isMobile');\n } else {\n (document.querySelector('.great-reasons-banner > div') as HTMLInputElement)\n .classList.remove('isMobile');\n }\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('modalUspPopupDetails');\n });\n }\n\n }\n\n angular\n .module('core')\n .directive('modalUspPopupDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalUspPopupDetails,\n controllerAs: 'muspd',\n templateUrl: 'partials/home/directivetemplate?type=UspPopupDetails',\n bindToController: {\n popupContent: '='\n },\n link: function (\n scope : ng.IScope,\n el : ng.IAugmentedJQuery,\n attr,\n controller : ModalUspPopupDetails) {\n controller.init(el);\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class NewsFlash {\n\n dismissable : boolean;\n text : string;\n isDismissed : boolean = false;\n\n constructor(private $element:JQuery, private cookieService:any){\n\n this.isDismissed = this.cookieService.get('newsflash') !== null;\n }\n\n onClosed() {\n this.$element.slideUp();\n this.persist();\n }\n\n persist() {\n this.cookieService.set('newsflash', 'dismissed');\n }\n }\n\n angular\n .module('core')\n .directive('newsflash', (cookieService) => {\n return {\n restrict: 'A',\n replace: true,\n transclude: true,\n controller: NewsFlash,\n controllerAs: 'nf',\n scope : {},\n bindToController: {\n dismissable :'@',\n text : '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=Newsflash'\n };\n });\n\n}\n","namespace Core {\n\n class PayLater {\n\n message: string;\n total: number;\n enabled: boolean = false;\n area: string;\n validAreas = {\n Holidays: 'holidays',\n Hotels: 'hotels'\n };\n overrideEnabled: boolean;\n\n constructor(private $scope: ng.IScope, private analytics, private modalService, private $route){\n\n if( this.overrideEnabled ){\n this.enabled = true;\n } else {\n const total = this.$scope.$watch('pl.total', value => {\n if( value ){\n this.enabled = this.getEnabled();\n total();\n }\n });\n const area = this.$scope.$watch('pl.area', value => {\n if (value) {\n this.enabled = this.getEnabled();\n area();\n }\n });\n }\n }\n\n getEnabled() {\n const area = this.area || this.$route.current.area;\n return (area.toLowerCase() === this.validAreas.Holidays || area.toLowerCase() === this.validAreas.Hotels)\n && TRPCONFIG.Domain.BuyNowPayLaterEnabled && this.total > TRPCONFIG.Domain.BuyNowPayLaterCost;\n }\n\n showPayLaterModal() {\n this.analytics.track('mixpanel', 'PayLaterModal');\n this.modalService.launch('partials/popups/paylater');\n }\n }\n\n angular\n .module('core')\n .directive('payLater', ($filter): ng.IDirective => {\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n bindToController: {\n message: '@',\n total: '@',\n viewType: '@',\n area : '@',\n overrideEnabled : '='\n },\n controller: PayLater,\n controllerAs: 'pl',\n template: (elem, attrs) => {\n if (attrs.viewType === 'link') {\n return ``;\n } else if( attrs.viewType === 'banner') {\n return `
            \n \n
            `;\n } else if ( attrs.viewType === 'block') {\n return `
            \n
            \n
            \n

            \n
            \n
            `;\n }\n return `
            \n {{ pl.message }}\n
            `;\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Core {\n type INgModelController = angular.INgModelController;\n type IScope = ng.IScope;\n\n class PaymentAmountSelection {\n private maxValue: number;\n private partPaymentAmount: number | undefined;\n private currencySymbol: string;\n private currencyCode: string;\n private payFull: boolean = true;\n private paymentAmount: INgModelController;\n\n constructor(\n private currencyService,\n private $scope: IScope\n ) {\n this.currencySymbol = this.currencyService.getSymbol(this.currencyCode);\n\n let partPaymentAmountWatch;\n this.$scope.$watch('cm.payFull', payFull => {\n if (payFull) {\n this.paymentAmount.$setViewValue(this.maxValue);\n partPaymentAmountWatch && partPaymentAmountWatch();\n this.partPaymentAmount = undefined;\n } else {\n partPaymentAmountWatch = this._setPartPaymentAmountWatch();\n }\n });\n }\n\n _setPartPaymentAmountWatch() {\n return this.$scope.$watch('cm.partPaymentAmount', val => {\n this.paymentAmount.$setViewValue(val);\n });\n }\n }\n\n angular\n .module('core')\n .component('paymentAmountSelection', {\n require: {\n form: '?^form',\n paymentAmount : 'ngModel'\n },\n bindings: {\n maxValue: '@',\n currencyCode: '@',\n payFull: '='\n },\n controller: PaymentAmountSelection,\n controllerAs: 'cm',\n templateUrl: 'partials/dashboard/paymentamountselection'\n });\n}\n","'use strict';\n\nnamespace core {\n\n class PriceInfo {\n\n total: number;\n tax: number;\n currency: string;\n\n constructor(private modalService:any){}\n\n onInfoClicked () {\n this.modalService.launch('partials/popups/tax', {\n tax: this.tax,\n currency: this.currency,\n total: this.total\n });\n };\n\n }\n\n angular\n .module('core')\n .directive('priceInfo', () => {\n return {\n restrict: 'E',\n template: '
            ',\n bindToController: {\n total: '=',\n tax: '=?',\n currency: '@?'\n },\n scope: {},\n replace: true,\n controllerAs: 'pi',\n controller: PriceInfo\n };\n });\n\n}\n","namespace Core {\n angular\n .module('core')\n .directive('pricingModals', (\n voucherModalService: any,\n tripService: Core.TripService,\n $route: any,\n cookieService: any\n ): ng.IDirective => {\n return {\n restrict: 'E',\n template: ''\n + ''\n + '',\n link: function ($scope) {\n $scope.voucherModalInfo = {};\n $scope.showCallToBookModal = false;\n $scope.showVoucherModal = false;\n\n $scope.closeVoucherModal = function () {\n $scope.showVoucherModal = false;\n };\n\n $scope.closeCallToBookModal = function () {\n $scope.showCallToBookModal = false;\n };\n\n const voucherInfoResponse = (data) => {\n const showedModals = JSON.parse(sessionStorage.getItem('pricingShowedModals')\n || '{ \"callToBook\": false, \"vouchers\": [] }');\n\n $scope.voucherModalInfo = data && data.ModalForm || {};\n $scope.showCallToBook = (data && data.CallToBookRequested || '') && !showedModals.callToBook;\n\n\n if (!_.isEmpty($scope.voucherModalInfo)) {\n let isShowedVoucher = false;\n _.forEach(showedModals.vouchers, voucher => {\n if(voucher === $scope.voucherModalInfo.VoucherCode){\n isShowedVoucher = true;\n return false;\n }\n });\n if(!isShowedVoucher){\n $scope.showVoucherModal = true;\n $scope.showCallToBookModal = false;\n showedModals.vouchers.unshift($scope.voucherModalInfo.VoucherCode);\n }\n } else if ($scope.showCallToBook) {\n $scope.showVoucherModal = false;\n $scope.showCallToBookModal = true;\n showedModals.callToBook = true;\n }\n\n sessionStorage.setItem('pricingShowedModals', JSON.stringify(showedModals));\n };\n\n $scope.$on('$locationChangeSuccess', function () {\n const paramBoardTypes = $route.current.params && $route.current.params.fbt || '';\n const tripId: string = $route.current.params && $route.current.params.tripId || '';\n const userId: string = $route.current.params && $route.current.params.userId || '';\n const estabId: number = Number($route.current.params && $route.current.params.estabId || 0);\n const sourceId: number = Number(cookieService.get('visitSource') || 0);\n const boardType: number[] = paramBoardTypes.length > 0 ?\n paramBoardTypes.split(',').map(item => {\n const board = item && parseInt(item, 10) || null;\n if (board) {\n return board;\n }\n }) : [];\n\n if (tripId) {\n tripService.getTrip(tripId).then(trip => {\n const adults = trip.HotelsRequest.Rooms.map(x => x.Adults)\n .reduce((a, b) => a + b);\n const children = trip.HotelsRequest.Rooms.map(x => x.ChildAges.length)\n .reduce((a, b) => a + b);\n\n const selections = JSON.parse(localStorage.getItem('flightsSelections') || '{}');\n const inboundSegmentDetails = selections.InboundSegmentDetails\n && selections.InboundSegmentDetails[0] || {};\n const outboundSegmentDetails = selections.OutboundSegmentDetails\n && selections.OutboundSegmentDetails[0] || {};\n\n const options = {\n DestinationAirport: inboundSegmentDetails.DepartureAirport || null,\n OriginalAirport: outboundSegmentDetails.DepartureAirport || null,\n Adults: adults,\n Children: children,\n CheckInDate: trip.HotelsRequest.CheckInDate,\n CheckOutDate: trip.HotelsRequest.CheckOutDate,\n IsPackage: trip.PackageId ? true : false,\n IsFlightPlus: trip.HotelsRequest.IsFlightPlus || false,\n Cabin: outboundSegmentDetails.Cabin || 0,\n UserId: userId,\n EstabId: estabId,\n VisitSourceId: sourceId,\n BoardType: boardType,\n DepartureDate: trip.FlightsRequest && trip.FlightsRequest.DepartureDate || '',\n RoomsCount: trip.HotelsRequest.Rooms.length,\n Carrier: outboundSegmentDetails.CarrierCode\n };\n\n voucherModalService.getVoucherInfo(options).then(voucherInfoResponse);\n });\n } else {\n voucherModalService.getVoucherInfo().then(voucherInfoResponse);\n }\n });\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core.Customer {\n\n import DestinationSummary = Destinations.DestinationSummary;\n import DestinationType = Destinations.DestinationType;\n\n class RecentSearchCard {\n\n private icons = {\n 1: ['flights'],\n 2: ['hotels'],\n 3: ['flights', 'hotels']\n };\n\n private titles = {\n 1: 'SEARCHUNITTITLEFLIGHTS',\n 2: 'SEARCHUNITTITLEHOTELS',\n 3: 'SEARCHUNITTITLEHOLIDAYS'\n };\n\n // Attr\n model: any;\n viewModel: RecentSearchContentCard|null = null;\n\n private busy: boolean = false;\n\n constructor (\n private $scope: ng.IScope,\n private imageService: any,\n private savedSearchService: any,\n private basketService: any,\n private analytics: any,\n private dateUtil: any\n ) {\n this.$scope.$watch('rs.model', (val, old) => {\n if (val) {\n this.viewModel = this.enhanceModel(val);\n }\n });\n }\n\n private enhanceModel(s: any): RecentSearchContentCard {\n let details = s.DisplayDetails;\n // get destination for image\n let dest: DestinationSummary;\n if (details.Destinations) {\n // if hotel, use that\n let first: DestinationSummary = _.head(details.Destinations);\n if (first.Type === DestinationType.Establishment) {\n dest = first;\n } else {\n // get province OR first destination\n dest = _.find(details.Destinations, ['Type', DestinationType.Province])\n || first;\n }\n } else {\n // flight only - use airport\n dest = details.DestinationAirports[0].Destination;\n }\n\n // Return the display details only\n return _.assignIn(details, {\n Title: dest.Title,\n ImageUrl: this.imageService.getDestinationImage({ Id: dest.Id, Type: dest.Type }),\n Icons: this.icons[s.SearchType],\n TitleResource: this.titles[s.SearchType],\n StartDate: s.FromDate.Date,\n EndDate: s.ToDate.Date,\n Duration: s.OneWayOnly ? null : this.dateUtil.numberOfNights(s.FromDate.Date, s.ToDate.Date),\n Adults: s.Adults,\n Children: s.Children,\n Rooms: s.Rooms ? s.Rooms.length : null\n });\n }\n\n // public deleteSearch(event, s: any) {\n // event.preventDefault();\n // event.stopPropagation();\n // this.savedSearchService.removeSavedSearch(s.SavedSearchId);\n // }\n\n public restoreSearch(event, s: any) {\n event.preventDefault();\n if (!this.busy) {\n this.busy = true;\n this.savedSearchService.restoreSearch(s)\n .then(() => {\n this.analytics.trackEvent({ label: 'restore saved search' });\n return this.basketService.startWorkflow(this.basketService.workflowType[s.SearchType]);\n })\n .catch()\n .then(() => this.busy = false);\n }\n }\n }\n angular\n .module('core')\n .directive('recentSearchCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: RecentSearchCard,\n controllerAs: 'rs',\n bindToController: {\n model: '='\n },\n templateUrl: 'partials/customer/recentsearchcontentcard'\n };\n });\n}\n","'use strict';\nnamespace Core {\n\n class RefreshView {\n\n private _initialised: boolean = false;\n private showWarning: boolean = false;\n\n constructor(private $q: ng.IQService,\n private $routeParams: ng.route.IRouteParamsService,\n private $scope: ng.IScope,\n private $window: ng.IWindowService,\n private basketService: any,\n private broker: Broker,\n private tripService: TripService,\n private windowUtil: any)\n {\n }\n\n init(): void\n {\n if(this._initialised) {\n return;\n }\n this._initialised = true;\n\n if (!this.isLocalStorageSupported()) {\n return;\n }\n\n const updateData = () => {\n if (this.$routeParams['tripId']) {\n this.getInfoFromTrip(this.$routeParams['tripId']).then((info) => {\n this.setData(info);\n });\n }\n };\n\n this.broker.subscribe('RefreshView', 'flightAddedToBasket', updateData);\n this.broker.subscribe('RefreshView', 'roomsAddedToBasket', updateData);\n\n const selectionHandler = this.selectionChanged.bind(this);\n\n this.$window.addEventListener('storage', selectionHandler);\n\n this.$scope.$on('$destroy', () => {\n this.$window.removeEventListener('storage', selectionHandler);\n this.broker.unsubscribe('RefreshView');\n });\n }\n\n private selectionChanged(ev: any): void\n {\n //leave if this page is not on a trip type page\n const tripId: string = this.$routeParams['tripId'];\n\n if (!tripId) {\n return;\n }\n\n //is the current page somewhere where we'd like to monitor the basket change on?\n let pageProduct = this.productsRelatedToPage(this.$window.location.toString());\n if(pageProduct === null) {\n return;\n }\n\n if (ev.key === 'trip') {\n const actual: SelectedProductInfo = JSON.parse(ev.newValue);\n\n //check if it is our trip and if our other ids don't match\n if (actual.TripId === tripId) {\n\n this.getInfoFromTrip(tripId).then( my => {\n let displayWarning = false;\n\n if (pageProduct !== null && (pageProduct & Product.Flight) === Product.Flight) {\n displayWarning = actual.FlightInfo.ProductId !== my.FlightInfo.ProductId ||\n actual.TripType !== my.TripType;\n }\n\n if(!displayWarning && pageProduct !== null && (pageProduct & Product.Hotel) === Product.Hotel) {\n displayWarning = actual.HotelInfo !== my.HotelInfo\n && actual.HotelInfo.ProductId !== my.HotelInfo.ProductId;\n }\n\n if(displayWarning) {\n this.$scope.$evalAsync(() => {\n this.showWarning = true;\n });\n }\n });\n\n }\n }\n }\n\n private refreshPage(): void {\n\n //this is a bit tricky now, depending on what is in the actual trip, where we are\n //in our journey and the type of journey we want to redirect the user to the most useful point.\n const tripId = this.$routeParams['tripId'];\n const currentLocation = this.$window.location.toString();\n\n if (currentLocation.indexOf('/holidays/options/') > -1\n || currentLocation.indexOf('/holidays/book/') > -1\n || /\\/holidays\\/[a-zA-Z\\-0-9]{36}\\/\\d{4,}/.test(currentLocation)) {\n\n //for holidays always go back to hotel availability if we are on the hotels details page,\n //options page or the booking form.\n //This is to handle the situation where changing flights also changes the hotel results\n //due to filtering based on proximity to airports (Canary islands)\n this.getInfoFromTrip(tripId).then((my) => {\n\n if (my.TripType === Core.Trip.TripType.Holiday) {\n this.windowUtil.location.href('holidays/hotels/' + tripId);\n return;\n }\n\n this.$window.location.reload();\n });\n } else {\n this.$window.location.reload();\n }\n }\n\n private setData (productIds: SelectedProductInfo): void {\n // date is needed to force refresh on the hotels on flights workflow on the second change to flight workflow\n localStorage.setItem('trip', JSON.stringify({ ...productIds, date: Date.now() }));\n }\n\n private getInfoFromTrip (tripId: string): ng.IPromise{\n\n return this.tripService.getTrip(tripId).then((trip) => {\n\n const basketId = trip.BasketId;\n\n return this.$q.all([\n this.basketService.getHotel(basketId),\n this.basketService.getFlight(basketId)\n ]).then( (results: any[]) => {\n\n const flightProductId = results[1] && results[1].ProductId || null;\n\n let hotelInfo:any = null;\n\n if (trip.TripType === Core.Trip.TripType.Hotel\n || trip.TripType === Core.Trip.TripType.Holiday )\n {\n hotelInfo = new HotelInfo(results[0] && results[0].ProductId,\n results[0] && results[0].Details.Id,\n trip.HotelsRequest.CheckInDate,\n trip.HotelsRequest.CheckOutDate);\n }\n\n\n return new SelectedProductInfo(tripId,\n trip.TripType,\n new FlightInfo(flightProductId),\n hotelInfo);\n });\n });\n }\n\n private getInfoFromStorage(tripId: string): SelectedProductInfo | null {\n const info: SelectedProductInfo = JSON.parse(localStorage.getItem('trip') || '');\n\n if (info.TripId === tripId) {\n return info;\n } else {\n return null;\n }\n }\n\n private isLocalStorageSupported(): boolean {\n const key = 'test';\n\n try {\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n private productsRelatedToPage(url: string): Product | null {\n\n let map = [\n {Regex:/\\/(hotels)\\/book\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel},\n {Regex:/\\/(holidays)\\/book\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight},\n {Regex:/\\/holidays\\/hotels\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight},\n {Regex:/\\/holidays\\/[a-zA-Z\\-0-9]{36}\\/\\d{4,}/, Products: Product.Flight},\n {Regex:/\\/holidays\\/options\\/[a-zA-Z\\-0-9]{36}/, Products: Product.Hotel + Product.Flight}\n ];\n\n for(let i=0; i< map.length; i++){\n if (map[i].Regex.test(url)) {\n return map[i].Products;\n }\n }\n\n return null;\n }\n\n\n }\n\n ///Enum for holding product types should be keyed so that you can use bitwise operators\n ///to decide if a product is included in a set\n enum Product {\n Flight = 1 << 0,\n Hotel = 1 << 1\n }\n\n class FlightInfo\n {\n constructor(public ProductId: string)\n {}\n }\n class HotelInfo\n {\n constructor(public ProductId: string,\n public Id: number,\n public CheckInDate: string,\n public CheckOutDate: string)\n {}\n }\n class SelectedProductInfo\n {\n constructor(public TripId: string,\n public TripType: number,\n public FlightInfo: FlightInfo,\n public HotelInfo: HotelInfo,\n public date?: Date)\n {}\n }\n\n angular\n .module('core')\n .directive('refreshView', function () {\n\n return {\n restrict: 'E',\n replace: true,\n scope:{},\n controllerAs : 'rv',\n controller : RefreshView,\n templateUrl: 'partials/home/directivetemplate?type=RefreshView',\n link: function (scope, el, attr, controller : RefreshView) {\n controller.init();\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Core.Customer {\n class ReviewHotelCard {\n // Attr\n trip: ManageBooking.BookedTrip;\n }\n angular\n .module('core')\n .directive('reviewHotelCard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: ReviewHotelCard,\n controllerAs: 'rh',\n bindToController: {\n trip: '='\n },\n templateUrl: 'partials/customer/reviewhotelcard'\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n angular\n .module('core')\n .directive('sash', (): ng.IDirective => {\n\n return {\n scope: {\n ribbon: '=?',\n isFromOverlay: '=?'\n },\n restrict: 'E',\n link: (scope: ng.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => {\n scope.$watch('ribbon', function(value: any) {\n // TODO - refactor, fixes attaching several child content elements\n element.empty();\n let ribbon = scope.isFromOverlay ?\n scope.ribbon && scope.ribbon.hotel && scope.ribbon.hotel.OverlaysNew[0]\n || (scope.ribbon && scope.ribbon.OverlaysNew[0] || scope.ribbon)\n : scope.ribbon;\n\n if (ribbon) {\n ribbon = !scope.isFromOverlay ? ribbon && (ribbon.ribbon || ribbon)\n && (ribbon.ribbon && ribbon.ribbon.ribbon || ribbon.ribbon) : ribbon; // Find ribbon object\n\n const prefix = 'sc-c-sash--'; // Sash base style class\n const styles = [\n 'sc-c-sash',\n `${prefix}${ribbon && ribbon.ColourClass}`\n ]; // Sash color class style\n\n ribbon.EffectClasses.forEach((effect: string) => {\n styles.push(`${prefix}${effect}`); // Sets effect class to sash\n });\n\n const styleClass = styles.join(' '); // Join all styles into one\n const contentClass = 'sc-c-sash__label';\n\n let ribbonElement = angular.element(`
            `).addClass(styleClass);\n const ribbonContent = angular.element(`
            `).addClass(contentClass);\n const textLengthValidator = (text: string) => text && text.slice(0, 10);\n const textSeparator = ribbon.Text.includes('|') ? '|' : ' ';\n const textArray: string[] = ribbon.Text.toUpperCase()\n .split(textSeparator)\n .map(textLengthValidator);\n\n const boldStrClass = 'star-rating sc-u-bold sc-c-sash__row row-gutter-y__zero';\n const normalStrClass = 'star-rating sc-c-sash__row row-gutter-y__zero';\n textArray.forEach((current: string, index: number) => {\n const isBold = ((textArray.length - 1) === index && textArray.length > 2) || index === 0;\n const label = angular.element(`${current}`)\n .addClass(isBold ? boldStrClass : normalStrClass);\n ribbonContent.append(label);\n });\n\n ribbonElement.append(ribbonContent);\n element.append(ribbonElement);\n }\n });\n }\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class ScrollAndClickCtrl {\n\n private scrollTarget: string;\n private clickTarget: string;\n private activeClass: string;\n\n constructor(\n private $scope: ng.IScope,\n private $timeout: ng.ITimeoutService,\n private scrollService: any,\n ) {\n }\n\n scrollAndClick(): void {\n this.scrollService.scrollTo(this.scrollTarget, { animate: true });\n\n this.$timeout(() => {\n const clickTarget = angular.element(this.clickTarget);\n\n if (!clickTarget.hasClass(this.activeClass)) {\n clickTarget.click();\n }\n });\n }\n }\n\n angular\n .module('core')\n .directive('scrollAndClick', (): ng.IDirective => {\n\n return {\n bindToController: {\n scrollTarget: '@',\n clickTarget: '@',\n activeClass: '@'\n },\n controller: ScrollAndClickCtrl,\n controllerAs: 'scr',\n replace: false,\n restrict: 'E',\n scope: {},\n template: '',\n transclude: true\n };\n });\n}\n","(function() {\n'use strict';\n\nangular.module('TR')\n .directive('scrollPage', scrollPage);\n\nfunction scrollPage() {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n toBottom: '='\n },\n template: '',\n link(scope) {\n let scrollTo = 0;\n const offset = 400;\n const maxDuration = 500;\n const win = $(window);\n const toBottom = scope.toBottom;\n\n scope.visible = false;\n\n scope.checkVisibility = function() {\n scrollTo = win.scrollTop() + (toBottom ? win.height() : 0);\n if ((toBottom && scope.visible !== (scrollTo <= $(document).height() - offset))\n || !toBottom && scope.visible !== (scrollTo >= offset)) {\n scope.$apply(scope.visible = !scope.visible);\n }\n };\n\n win.on(toBottom ? 'scroll.scrollBottom' : 'scroll.scrollTop', _.debounce(scope.checkVisibility, 100));\n\n scope.scrollPage = function() {\n // set a duration relative to the distance we need to scroll\n const duration = Math.min(maxDuration, Math.abs(Math.round(scrollTo * 0.3)));\n let scrollInfo = { scrollTop: toBottom ? $(document).height() : 0 };\n $('html, body').stop().animate(scrollInfo, { easing: 'swing', duration });\n };\n\n scope.$on('$destroy', function() {\n win.off(toBottom ? 'scroll.scrollBottom' : 'scroll.scrollTop');\n });\n }\n };\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n class ScrollerCtrl {\n\n private target: string;\n private offset: string;\n\n constructor(\n private $scope: ng.IScope,\n private scrollService: any,\n ) {\n }\n\n scroll(): void {\n const options: {animate: boolean, offset: string, container?: string} = {\n animate: true,\n offset: this.offset\n };\n\n if (angular.element('.scroller-relative-container').length !== 0) {\n options.container = '.scroller-relative-container';\n }\n\n this.scrollService.scrollTo(this.target, options);\n }\n }\n\n angular\n .module('core')\n .directive('scroller', (): ng.IDirective => {\n\n return {\n bindToController: {\n target: '@',\n offset: '@',\n linkClass: '@'\n },\n controller: ScrollerCtrl,\n controllerAs: 'scr',\n replace: false,\n restrict: 'E',\n scope: {},\n template: '',\n transclude: true\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedAttractionSummary {\n\n attraction: any;\n\n public show :boolean = false;\n public tickets : {quantity :number, title :string}[];\n\n constructor(\n private $scope: ng.IScope\n ) {\n\n let stop = this.$scope.$watch('sas.attraction', v => {\n if (v) {\n this.init(v);\n stop();\n }\n });\n\n }\n\n private init(attraction :any) :void {\n let tickets :{quantity :number, title :string}[] = [];\n\n _.each(attraction, a => {\n _.each(a.CostBreakdown, i => {\n tickets.push({quantity :i.Quantity, title :i.Description});\n });\n });\n this.tickets = tickets;\n this.show = tickets.length > 0;\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedAttractionSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedAttractionSummary,\n controllerAs: 'sas',\n replace: true,\n bindToController: {\n attraction: '=',\n titleText: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=SelectedAttractionSummary'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedCarhireSummary {\n\n carhire: any;\n\n public details :any;\n public show :boolean = false;\n\n constructor(\n private $scope: ng.IScope\n ) {\n\n let stop = this.$scope.$watch('scs.carhire', v => {\n if (v) {\n this.init(v);\n stop();\n }\n });\n\n }\n\n private init(carhire :any) :void {\n this.details = carhire.Details.HireDetails;\n this.show = true;\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedCarhireSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedCarhireSummary,\n controllerAs: 'scs',\n replace: true,\n bindToController: {\n carhire: '=',\n titleText: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=SelectedCarHireSummary'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedFlightSummary {\n\n flight: any;\n hideCaption: boolean = false;\n changeFlightEnabled: string | boolean;\n changeFlightInterstitial: boolean;\n tripId: string;\n\n constructor(private broker: Broker,\n private flightSearch,\n private $scope: ng.IScope,\n private resourceService: Core.ResourceService,\n private basketService,\n private occupancyService) {\n this.changeFlightEnabled = this.changeFlightEnabled === 'true';\n }\n\n init (container : ng.IAugmentedJQuery) {\n }\n\n public showDetails(e) {\n const passengers = this.occupancyService.getTotalPeopleCounts();\n e.preventDefault();\n this.broker.publish('showModalFlightDetails', {\n flight: this.flight.Details.Itinerary,\n passengers\n });\n }\n\n private changeFlight(): void {\n this.flightSearch.resetPageIndex();\n this.basketService.changeJourneyUrl(10, this.tripId);\n\n if (this.changeFlightInterstitial) {\n this.$scope.$emit('block', {\n title: this.resourceService.get('SEARCHINGFLIGHTS'),\n subtitle: this.resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-searchUnitCtrl'\n });\n }\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedFlightSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedFlightSummary,\n controllerAs: 'sfs',\n replace: true,\n bindToController: {\n tripId: '=?',\n flight: '=',\n changeFlightEnabled: '@',\n changeFlightInterstitial: '<',\n hideCaption: '@'\n },\n templateUrl: (element, attr) => {\n if(attr.templateVersion){\n return 'partials/booking/template?name=SelectedFlightSummary&version='\n + attr.templateVersion;\n }\n return 'partials/home/directivetemplate?type=SelectedFlightSummary';\n },\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : SelectedFlightSummary) {\n controller.init(el);\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedInsuranceSummary {\n\n insurance: any;\n\n public quote :Core.Insurance.InsuranceQuote;\n public show :boolean = false;\n\n constructor(\n private $scope: ng.IScope\n ) {\n\n let stop = this.$scope.$watch('sis.insurance', v => {\n if (v) {\n this.init(v);\n stop();\n }\n });\n\n }\n\n private init(insurance :any) :void {\n this.quote = insurance.Details.InsuranceQuotes[0];\n this.show = true;\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedInsuranceSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedInsuranceSummary,\n controllerAs: 'sis',\n replace: true,\n bindToController: {\n insurance: '=',\n titleText: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=SelectedInsuranceSummary'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedParkingSummary {\n\n parking: any;\n\n public quote :Core.Parking.Quote;\n public show :boolean = false;\n\n constructor(\n private $scope: ng.IScope\n ) {\n\n let stop = this.$scope.$watch('sps.parking', v => {\n if (v) {\n this.init(v);\n stop();\n }\n });\n\n }\n\n private init(parking :any) :void {\n this.quote = parking.Details.Quote;\n this.show = true;\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedParkingSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedParkingSummary,\n controllerAs: 'sps',\n replace: true,\n bindToController: {\n parking: '=',\n titleText: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=SelectedParkingSummary'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectedTransferSummary {\n\n transfer: any;\n\n public legs :any[];\n public show :boolean = false;\n\n constructor(\n private $scope: ng.IScope\n ) {\n\n let stop = this.$scope.$watch('sts.transfer', v => {\n if (v) {\n this.init(v);\n stop();\n }\n });\n\n }\n\n private init(transfer :any) :void {\n let legs :any[] = [];\n if (transfer.Details.Itinerary.OutboundLeg) {\n legs.push({...transfer.Details.Itinerary.OutboundLeg, isOutboundLeg: true});\n }\n if (transfer.Details.Itinerary.InboundLeg) {\n legs.push({...transfer.Details.Itinerary.InboundLeg, isOutboundLeg: false});\n }\n\n this.legs = ([]).concat(legs);\n this.show = true;\n }\n\n }\n\n angular\n .module('core')\n .directive('selectedTransferSummary', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: SelectedTransferSummary,\n controllerAs: 'sts',\n replace: true,\n bindToController: {\n transfer: '=',\n titleText: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=SelectedTransferSummary'\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core.Customer {\n\n import DestinationContentCard = Core.Destinations.DestinationContentCard;\n\n class SignInDashboard {\n\n showDashboard: boolean;\n fetching: boolean;\n user: any|null = null;\n searches: any[] = [];\n destinations: DestinationContentCard[] = [];\n\n tileTemplates = {\n 1: null,\n 2: null,\n 3: null\n };\n\n tileModels = {\n 1: null,\n 2: null,\n 3: null\n };\n\n tileTypes = {\n 1: null,\n 2: null,\n 3: null,\n 4: null,\n 5: null\n };\n\n constructor (\n private $rootScope,\n private $scope: ng.IScope,\n private $q: ng.IQService,\n private customerDashboardService: CustomerDashboardService,\n private houseRecommender: any,\n private analytics: any,\n private currentUser: any\n ) {\n $scope.$on('auth:signin', () => {\n this.setDashboardState();\n });\n\n $scope.$on('auth:signout', () => {\n this.setDashboardState();\n this.user = null;\n });\n\n this.setDashboardState();\n }\n\n private setDashboardState(): void {\n // Set local scope user\n this.user = this.currentUser.get();\n // Show this dashboard if the user is NOT signed in\n this.showDashboard = !this.user.AnonSignedIn && !this.user.SignedIn;\n this.showDashboard && this.fetch();\n }\n\n private fetch(): void {\n this.fetching = true;\n\n this.resetData();\n\n // The sign-in card doesn't require data so we can load it immediately\n this.tileTypes[1] = DashboardTileType.InspirationalContent;\n this.tileTemplates[1] = this.customerDashboardService.getTemplateForPlaceholder(\n DashboardTileType.InspirationalContent\n );\n\n let promises: ng.IPromise[] = [];\n\n // Get 2 recent searches\n promises.push(this.customerDashboardService.getRecentSearches(2));\n\n // Get recommended destinations\n promises.push(this.houseRecommender.getHouseRecs());\n\n this.$q.all(promises).then(([searches, destinations]) => {\n this.searches = searches;\n this.destinations = destinations;\n\n this.configureTiles().then(() => {\n this.fetching = false;\n this.customerDashboardService.trackDashboardLoad(null, this.tileTypes);\n });\n });\n\n }\n\n private configureTiles(): ng.IPromise {\n let deferred = this.$q.defer();\n\n // Placeholder 1\n // Sign-in card\n // *** ALREADY SET ***\n\n // Placeholder 2\n // Searches[0] OR Destinations[0]\n let type: DashboardTileType;\n\n if (this.searches[0]) {\n // show the first search\n this.tileTypes[2] = DashboardTileType.Search;\n this.tileModels[2] = this.searches[0];\n } else {\n // show the first destination\n this.tileTypes[2] = DashboardTileType.Destination;\n this.tileModels[2] = this.destinations[0];\n }\n\n // Placeholder 3\n // Searches[1] OR Destinations[0] OR Destinations[1]\n if (this.searches[1]) {\n // show the second search\n this.tileTypes[3] = DashboardTileType.Search;\n this.tileModels[3] = this.searches[1];\n } else {\n // show a destination\n this.tileTypes[3] = DashboardTileType.Destination;\n if (this.tileTypes[2] === DashboardTileType.Search) {\n // show the first destination which doesn't match the destination of the search\n this.tileModels[3] = this.customerDashboardService.getDestinationExcludingSearch(\n this.tileModels[2],\n this.destinations);\n } else {\n // show the second destination\n this.tileModels[3] = this.destinations[1];\n }\n }\n\n // map the templates to the types\n _.forOwn(this.tileTypes, (type: DashboardTileType, key: string) => {\n if (type) {\n this.tileTemplates[key] = this.customerDashboardService.getTemplateForPlaceholder(type);\n }\n });\n\n deferred.resolve();\n return deferred.promise;\n }\n\n private resetData(): void {\n // reset all data to initial state\n this.searches.length = 0;\n this.destinations.length = 0;\n\n // placeholder templates and models\n _.forOwn(this.tileTemplates, p => p = null);\n _.forOwn(this.tileModels, p => p = null);\n _.forOwn(this.tileTypes, p => p = null);\n }\n\n public getModelForPlaceholder(position: number): any[] {\n // We return the model in an array so that we can use ng-repeat\n // to declare a privately scoped model for the ng-included template\n return [this.tileModels[position]];\n }\n\n public tileClick(position: number): void {\n this.customerDashboardService.trackDashboardClick(position, this.tileTypes[position]);\n }\n }\n\n angular\n .module('core')\n .directive('signInDashboard', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: SignInDashboard,\n controllerAs: 'sid',\n bindToController: {\n },\n templateUrl: 'partials/customer/signindashboard'\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n angular.module('core')\n .directive('stickyElement', (): ng.IDirective => {\n return {\n restrict: 'E',\n template:\n '
            0 ? bottomLimitId : \\'0\\'}}\">' +\n '
            ' +\n '
            ',\n transclude: true,\n compile: (el: JQuery, attrs: any, transclude: any) => {\n return $scope => {\n let stickyTopOffset = 0;\n const fixedClass = 'fixed';\n const absoluteClass = 'absolute';\n const $stickyWrapper = el.find('.sticky-wrapper');\n const $stickyContent = el.find('.sticky-content');\n const bottomLimit = 'true' === attrs.bottomLimit;\n const bottomSelector =\n parseInt(attrs.bottomLimitId,10) > 0 ? `[data-id=${attrs.bottomLimitId}]` : '.page-content';\n\n\n const debounceThreshold = 100;\n const resizeStickyContent = _.debounce(() => {\n const stickyWrapperWidth = $stickyWrapper.width();\n const stickyContentWidth = $stickyContent.outerWidth();\n if (stickyContentWidth !== stickyWrapperWidth) {\n $stickyContent.css({width: stickyWrapperWidth + 'px'});\n $stickyWrapper.css({height: $stickyContent.outerHeight() + 'px'});\n }\n }, debounceThreshold);\n\n\n const checkStickyOffset = () => {\n const checkOffset = $stickyWrapper.offset().top;\n if (!stickyTopOffset || (!$stickyWrapper.hasClass(fixedClass) &&\n stickyTopOffset !== checkOffset)) {\n stickyTopOffset = checkOffset;\n }\n };\n\n\n const handleScroll = () => {\n checkStickyOffset();\n const scrollOffset = $(window).scrollTop();\n let isAtBottomLimit = false;\n\n if (bottomLimit) {\n const $pageContent = $(bottomSelector);\n if ($pageContent.length && $stickyWrapper.hasClass(fixedClass)) {\n const bottomLimit = $pageContent.offset().top + $pageContent.outerHeight();\n const currentBottom = scrollOffset + $stickyContent.outerHeight();\n\n if (bottomLimit <= currentBottom) {\n isAtBottomLimit = true;\n if (!$stickyWrapper.hasClass(absoluteClass)) {\n $stickyWrapper.addClass(absoluteClass);\n $stickyContent.css({top:(bottomLimit - $stickyContent.outerHeight())+'px'});\n }\n } else {\n if ($stickyWrapper.hasClass(absoluteClass)) {\n $stickyWrapper.removeClass(absoluteClass);\n $stickyContent.css({top: 0});\n }\n }\n }\n }\n\n if (!isAtBottomLimit) {\n if (scrollOffset >= stickyTopOffset && !$stickyWrapper.hasClass(fixedClass)) {\n const wrapperHeight = $stickyWrapper.outerHeight();\n if (wrapperHeight) {\n const contentWidth = $stickyContent.outerWidth();\n $stickyWrapper.css({height: wrapperHeight + 'px'});\n $stickyContent.css({width: contentWidth + 'px'});\n $stickyWrapper.addClass(fixedClass);\n window.addEventListener('resize', resizeStickyContent, false);\n }\n } else if (scrollOffset < stickyTopOffset && $stickyWrapper.hasClass(fixedClass)) {\n $stickyWrapper.removeClass(fixedClass);\n $stickyWrapper.removeAttr('style');\n $stickyContent.removeAttr('style');\n window.removeEventListener('resize', resizeStickyContent, false);\n }\n }\n };\n\n\n transclude($scope, clone => {\n $stickyContent.append(clone);\n $scope.wrapperClass = attrs.wrapperClass;\n $scope.bottomLimitId = attrs.bottomLimitId;\n\n /// Watch the height of the content in the sticky wrapper. Height can change as the data is\n /// being loaded in the sticky element. If the height of the wrapper is zero, it will not\n /// stick.\n let initialContentHeight = $stickyContent.outerHeight();\n $scope.$watch(() => {\n const contentHeight = $stickyContent.outerHeight();\n const wrapperHeight = $stickyWrapper.outerHeight();\n if (0 === initialContentHeight && contentHeight > 0) {\n initialContentHeight = -1;\n handleScroll();\n } else if (contentHeight !== wrapperHeight && $stickyWrapper.hasClass(fixedClass)) {\n $stickyWrapper.css({height: contentHeight + 'px'});\n }\n });\n\n window.addEventListener('scroll', handleScroll, false);\n $scope.$on('$destroy', function () {\n window.removeEventListener('scroll', handleScroll, false);\n });\n });\n };\n }\n };\n });\n}\n","'use strict';\n\nnamespace ekh {\n\n interface Campaign {\n Source: string;\n Medium: string;\n Number: string;\n }\n\n class CampaignTelephoneNumber {\n\n campaigns: Campaign[];\n telephoneNumber: string;\n\n constructor(private cookieService:any, private resourceService:any){\n let matchedCampaign:Campaign[] = [];\n\n this.telephoneNumber = this.resourceService.get('TELEPHONENUMBER');\n\n const ref = this.cookieService.get('CampaignReferrer');\n if ( ref && ref.includes('_') ) {\n let referrerList = ref.split('_');\n let referrer = {\n Source: referrerList[0].toLowerCase(),\n Medium: referrerList[1].toLowerCase()\n };\n matchedCampaign = this.campaigns.filter(function(campaign) {\n const campSource = campaign.Source.toLowerCase();\n const referSource = referrer.Source.toLowerCase();\n const campMedium = campaign.Medium.toLowerCase();\n const referMedium = referrer.Medium.toLowerCase();\n return CampaignTelephoneNumber.isMatched(campSource, referSource)\n && CampaignTelephoneNumber.isMatched(campMedium, referMedium);\n });\n }\n\n if ( matchedCampaign.length && matchedCampaign[0].Number ) {\n this.telephoneNumber = matchedCampaign[0].Number;\n }\n }\n\n static isMatched(campVal, referVal): boolean {\n if (campVal === referVal) {\n return true;\n }\n if (campVal.indexOf('%') !== -1) {\n campVal = campVal.replace(/[-\\/\\\\^$*+?.()|\\[\\]{}]/g, '\\\\$&');\n campVal = campVal.replace(/%/g, '.*');\n const regEx = new RegExp(`^${campVal}$`);\n return regEx.test(referVal);\n }\n return false;\n }\n }\n\n angular\n .module('core')\n .directive('campaignTelephoneNumber', (cookieService) => {\n return {\n restrict: 'A',\n replace: true,\n controller: CampaignTelephoneNumber,\n controllerAs: 'tn',\n scope : {},\n bindToController: {\n campaigns: '=',\n eventTracker: '@',\n eventCategory: '@',\n eventAction: '@',\n eventLabel: '@',\n },\n template: (element, attrs) => {\n if (!attrs.eventCategory) {\n return `\n {{ tn.telephoneNumber }}`;\n }\n return `{{ tn.telephoneNumber }}`;\n }\n };\n });\n\n}\n","namespace Core {\n\n class UniqueSellingPoint {\n\n icon:string;\n title:string;\n text:string;\n modal:string;\n\n constructor(private modalService:any, private $location:ng.ILocationService) {\n this.autoLaunch();\n }\n\n launchModal () {\n if (this.modal !== '') {\n this.modalService.launch( this.modal );\n }\n }\n\n autoLaunch() {\n const usp = this.$location.search().usp;\n\n if (usp && this.modal !== '' && this.modal.indexOf('/') > 0) {\n if(usp === this.modal.split('/').pop()) {\n this.launchModal();\n }\n }\n }\n\n }\n\n angular\n .module('core')\n .directive('uniqueSellingPoint', () => {\n return {\n restrict: 'E',\n replace: true,\n controller: UniqueSellingPoint,\n controllerAs: 'usp',\n scope : {},\n bindToController: {\n icon: '@',\n title: '@',\n text : '@',\n modal : '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=UniqueSellingPoint'\n };\n });\n}\n","namespace Core {\n\n class UrlDiscount {\n\n code:string;\n\n constructor(private $http){\n if (TRPCONFIG.DiscountCode === null || TRPCONFIG.DiscountCode === undefined) {\n $http.get('?dlc=' + this.code).then(() => {\n TRPCONFIG.DiscountCode = this.code;\n });\n }\n }\n }\n\n\n angular.module('core')\n .directive('urlDiscount', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n bindToController: {\n code: '@'\n },\n controller: UrlDiscount,\n controllerAs: 'urld'\n };\n });\n}\n","namespace Core {\n angular\n .module('core')\n .directive('voucherModal', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {\n show: '=',\n close: '&',\n voucherInfo: '='\n },\n templateUrl: 'partials/Home/directivetemplate?type=VoucherModal',\n link: function($scope){\n $scope.copyVoucherToClipboard = function(voucher) {\n const copyElement = document.createElement('textarea');\n copyElement.style.position = 'fixed';\n copyElement.style.opacity = '0';\n copyElement.textContent = voucher;\n const body = document.getElementsByTagName('body')[0];\n body.appendChild(copyElement);\n copyElement.select();\n document.execCommand('copy');\n body.removeChild(copyElement);\n };\n }\n };\n });\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('core')\r\n .filter('roundedCurrency', roundedCurrency)\r\n .filter('roundUpToNearest', roundUpToNearest);\r\n\r\nfunction roundedCurrency(currencyFilter, $locale, currencyService, decimalAdjust) {\r\n const formats = $locale.NUMBER_FORMATS;\r\n\r\n function separate(decimals, formats, result) {\r\n if (!decimals) {\r\n return result.lastIndexOf(formats.DECIMAL_SEP);\r\n }\r\n return result.lastIndexOf(formats.DECIMAL_SEP) + 3;\r\n }\r\n\r\n return function(amount, code = TRPCONFIG.Domain.CurrencyCode, type = 'ceil', decimals = false, exp = 0, spaced = false) {\r\n if (amount == null) {\r\n return undefined;\r\n }\r\n\r\n const sym = currencyService.getSymbol(code);\r\n\r\n if (isNaN(amount)) {\r\n if (amount.toString().indexOf(sym) >= 0) {\r\n const patt = new RegExp(`${sym}|,| `, 'g');\r\n const amountStr = amount.toString().replace(patt, '');\r\n amount = parseFloat(amountStr);\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n if (type !== 'cut') {\r\n amount = decimalAdjust(type, amount, exp);\r\n }\r\n const res = sym ? currencyFilter(amount, sym) : currencyFilter(amount);\r\n const separated = separate(decimals, formats, res);\r\n const result = res.substring(0, separated) + res.substring(separated + 3);\r\n if (spaced) {\r\n const indexOfNumber = result.indexOf(result.match(/\\d/));\r\n return `${result.substring(0, indexOfNumber)} ${result.substring(indexOfNumber)}`;\r\n }\r\n let finalResult;\r\n if (amount < 0 && result.includes('(') && result.includes(')')) {\r\n finalResult = result.replace('(', '-').replace(')', '');\r\n } else {\r\n finalResult = result;\r\n }\r\n return finalResult;\r\n };\r\n}\r\n\r\n// use to round a value up to nearest specified whole number\r\n// used for ensuring price values are always rounded higher;\r\n// defaults to use nearest 5 and 9\r\n\r\nfunction roundUpToNearest(currencyFilter, currencyService) {\r\n return function(amount, code = TRPCONFIG.Domain.CurrencyCode, targets = [5, 9]) {\r\n if (angular.isNumber(targets)) {\r\n targets = [targets];\r\n }\r\n\r\n let value = Math.ceil(amount);\r\n\r\n const diff = Math.abs(value) % 10;\r\n //check if the amount already ends in the specified targets\r\n if (targets.indexOf(diff) === -1) {\r\n targets = targets.concat(targets.map(i => i + 10));\r\n targets.sort(function(a, b) { return a - b; });\r\n\r\n for (let i = 0; i < targets.length; i++) {\r\n if (diff < targets[i]) {\r\n value += (targets[i] - diff);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const sym = currencyService.getSymbol(code);\r\n const res = currencyFilter(value, sym, 0);\r\n\r\n return res;\r\n };\r\n}\r\n\r\n\r\nangular\r\n .module('core')\r\n .filter('customCurrency', customCurrency);\r\n\r\nfunction customCurrency(currencyFilter, currencyService) {\r\n return (cost, code) => {\r\n if (cost == null || isNaN(cost)) {\r\n return undefined;\r\n }\r\n\r\n if (!code) {\r\n code = TRPCONFIG.Domain.CurrencyCode;\r\n }\r\n\r\n let symbol = currencyService.getCurrencies()[code];\r\n if (!symbol) {\r\n symbol = `${code} `;\r\n } else {\r\n symbol = symbol();\r\n }\r\n\r\n return currencyFilter(cost, symbol);\r\n };\r\n}\r\n})();\r\n","(function() {\n 'use strict';\n\n angular\n .module('core')\n .filter('insuranceBandFilter', function() {\n return function(bands, guest) {\n let filteredBands = [];\n if (guest.Type === 1) {\n angular.forEach(bands, function(band) {\n if (guest.Type === band.PassengerType) {\n filteredBands.push(band);\n }\n });\n } else {\n angular.forEach(bands, function(band) {\n if (guest.Age <= band.EndAge && guest.Age >= band.StartAge) {\n filteredBands.push(band);\n }\n });\n }\n return filteredBands;\n };\n });\n})();\n","(function() {\n 'use strict';\n\n angular\n .module('core')\n .filter('parseUtilityClasses', () =>\n (classes, prefix) => classes && classes.map(i => `${prefix}--${i}`).join(' ')\n );\n})();\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .filter('unadjustedDate', unadjustedDate);\n\nfunction unadjustedDate(dateFilter, dateUtil) {\n return (date, format) =>\n date == null\n ? undefined\n : dateFilter(dateUtil.parseDate(date), format);\n}\n})();\n","(function() {\n 'use strict';\n\n angular.module('core')\n .filter('unique', function() {\n return function(collection, keyname) {\n let output = [];\n let keys = [];\n angular.forEach(collection, function(item) {\n const key = item[keyname];\n if (keys.indexOf(key) === -1) {\n keys.push(key);\n output.push(item);\n }\n });\n return output;\n };\n });\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('core')\r\n .factory('authService', authService);\r\n\r\nfunction authService($rootScope,\r\n $window,\r\n $http,\r\n $location,\r\n $q,\r\n $route,\r\n $timeout,\r\n currentUser,\r\n broker,\r\n urlUtils,\r\n discountsService,\r\n criteoService,\r\n preferences,\r\n analytics,\r\n cookieService,\r\n dateUtil) {\r\n const domain = TRPCONFIG.Domain;\r\n const url = '/api2/useraccounts/';\r\n const preferencesUrl = '/api2/useraccounts/preferences/get';\r\n let bufferedRoute = {\r\n route: null,\r\n reload: false\r\n };\r\n let regPromise;\r\n const signInLevel = {\r\n None: 0,\r\n Soft: 1,\r\n Hard: 2\r\n };\r\n\r\n let skywardsResult;\r\n\r\n broker.subscribe('authService', 'bookingComplete', function() {\r\n $timeout(function() {\r\n let cu = currentUser.get();\r\n let userToExtend = {\r\n Agent: cu ? cu.Agent : null,\r\n AnonSignedIn: !!cu && cu.AnonSignedIn,\r\n BookingId: getSignedInBookingId()\r\n };\r\n _extendUser(userToExtend);\r\n }, 2000);\r\n });\r\n\r\n broker.subscribe('authService', 'agentSignIn', signOut);\r\n\r\n\r\n const service = {\r\n register,\r\n registerForNewsletter,\r\n unsubscribeFromNewsletter,\r\n signin,\r\n socialSignin,\r\n verify,\r\n forgotPassword,\r\n changeEmail,\r\n changePasswordWithToken,\r\n changePassword,\r\n signOut,\r\n changeContactDetails,\r\n changeContactInfo,\r\n deleteAccount,\r\n getUser,\r\n setUser,\r\n getUrl,\r\n bufferRoute,\r\n anonSignIn,\r\n bookingSignInByAgent,\r\n getNextRoute,\r\n newsletterSignUp,\r\n redirectToBufferedRoute,\r\n getSignedinBooking,\r\n impersonatedSignIn,\r\n getUserByAgent,\r\n anyEndUser,\r\n getSignedInBookingId,\r\n doesHttpOnlyCookieExist,\r\n checkUserPreferences,\r\n createCookieName,\r\n getSkywardsUserDetails,\r\n };\r\n\r\n function _postRequest(path, data, options) {\r\n if (data) {\r\n data.CultureCode = domain.CultureCode;\r\n data.TenantId = domain.TenantId;\r\n }\r\n return $http\r\n .post(url + path, data, options || {})\r\n .then(function(res) {\r\n return res.data;\r\n });\r\n }\r\n\r\n function _extendUser(user) {\r\n return $http\r\n .get(`${url}getsignedinuser`)\r\n .then(function(res) {\r\n user.Provider = res.data.Identity.Provider;\r\n user.Email = res.data.Identity.Email;\r\n user.UserIdHash = res.data.Identity.UserIdHash;\r\n user.EmailHash = res.data.Identity.EmailHash;\r\n user.HardSignedIn = res.data.SigninLevel === signInLevel.Hard;\r\n user.SoftSignedIn = res.data.SigninLevel >= signInLevel.Soft;\r\n user.ImpersonatedSignedIn = !!res.data.Identity.IsImpersonated;\r\n user.SignedIn = user.HardSignedIn || user.SoftSignedIn || user.ImpersonatedSignedIn;\r\n //soft signed in - Contact.Email is not populated, but Identity.Email always is, so don't overwrite it\r\n if (res.data.Contact) {\r\n delete res.data.Contact.Email;\r\n }\r\n user = angular.extend(user, res.data.Contact);\r\n currentUser.set(user);\r\n broker.publish('userExtended', user);\r\n skywardsResult = res;\r\n if (!sessionStorage.getItem('skywardsLoginUser')) {\r\n sessionStorage.setItem('skywardsLoginUser', JSON.stringify(skywardsResult));\r\n }\r\n\r\n return user;\r\n });\r\n }\r\n\r\n function _updateUserFromResponse(user) {\r\n if (user != null) {\r\n user.Contact = user.Contact || {};\r\n const hard = user.SigninLevel === signInLevel.Hard;\r\n const soft = user.SigninLevel >= signInLevel.Soft;\r\n const existUser = currentUser.get();\r\n user.Contact = user.SigninLevel < signInLevel.Soft && !!existUser\r\n ? angular.extend(user.Contact, {\r\n AnonSignedIn: existUser.AnonSignedIn,\r\n Contact: existUser.Contact,\r\n BookingSummary: existUser.BookingSummary\r\n })\r\n : angular.extend(user.Contact, { AnonSignedIn: false });\r\n currentUser.set(angular.extend(user.Contact, {\r\n Provider: 'TRP',\r\n Agent: existUser ? existUser.Agent : null,\r\n Email: user.Identity.Email,\r\n UserIdHash: user.Identity.UserIdHash,\r\n EmailHash: user.Identity.EmailHash,\r\n HardSignedIn: hard,\r\n SoftSignedIn: soft,\r\n ImpersonatedSignedIn: !!user.Identity.IsImpersonated,\r\n SignedIn: hard || soft || !!user.Identity.IsImpersonated\r\n }));\r\n broker.publish('userExtended', user);\r\n preferences.clear();\r\n $rootScope.user = currentUser.get();\r\n $rootScope.$broadcast('auth:signin', user.Contact);\r\n }\r\n }\r\n\r\n function register(createRequest) {\r\n return regPromise || (regPromise = _postRequest('register', createRequest)\r\n .then(function(res) {\r\n regPromise = null;\r\n if (res.Result === 0) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n }));\r\n }\r\n\r\n function registerForNewsletter(createRequest) {\r\n if (createRequest) {\r\n createRequest.CultureCode = domain.CultureCode;\r\n createRequest.TenantId = domain.TenantId;\r\n createRequest.DomainId = domain.DomainId;\r\n }\r\n return $http.post(`${url}registerfornewsletter`, createRequest, { ignoreErrors: true });\r\n }\r\n\r\n function unsubscribeFromNewsletter(createRequest) {\r\n\r\n return $http.post(\r\n `${url}unsubscribe`,\r\n _.assignIn({}, createRequest, { DomainId: domain.DomainId }),\r\n {\r\n ignoreErrors: false\r\n }\r\n );\r\n }\r\n\r\n function verify(verifyRequest) {\r\n return _postRequest('verify', verifyRequest).then(function(res) {\r\n if (res.Success) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function afterPostSignin(res) {\r\n if (0 === res.Result) {\r\n if (currentUser.get() && currentUser.get().AnonSignedIn) {\r\n $http.post('/api2/managebooking/signout');\r\n }\r\n return discountsService.getDiscountCodeForUser().then(() => {\r\n _updateUserFromResponse(res.User);\r\n if ($location.search().cb) {\r\n // if cb starts with '?' redirect to homepage\r\n $location.url($location.search().cb.indexOf('?') ? $location.search().cb : '');\r\n } else {\r\n redirectToBufferedRoute();\r\n }\r\n criteoService.enqueue(currentUser.get(), 'signin');\r\n if (currentUser.get().Email) {\r\n analytics.setMixpanelEmail(currentUser.get().Email);\r\n }\r\n bufferedRoute.route = null;\r\n return res;\r\n });\r\n }\r\n return res;\r\n }\r\n\r\n function signin(signInRequest) {\r\n return _postRequest('signin', signInRequest)\r\n .then(afterPostSignin);\r\n }\r\n\r\n function socialSignin(signInRequest) {\r\n return _postRequest('externalsignin', signInRequest)\r\n .then(afterPostSignin);\r\n }\r\n\r\n function forgotPassword(req) {\r\n return _postRequest('initiatechangepassword', req);\r\n }\r\n\r\n function changeEmail(req) {\r\n return _postRequest('changeemail', req)\r\n .then(function(res) {\r\n if (res.Result === 0) {\r\n currentUser.set({ SignedIn: false });\r\n $rootScope.$broadcast('auth:signout');\r\n $location.path('changeemailsent');\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function changePasswordWithToken(req) {\r\n return _postRequest('changepasswordwithtoken', req)\r\n .then(function(res) {\r\n if (res.Result === 0) {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function clearAllBrowserSessions(e) {\r\n if (e.key === 'clear-sessions' && e.newValue === 'session-cleared') {\r\n _updateUserSignedOut();\r\n }\r\n }\r\n\r\n $window.addEventListener('storage', clearAllBrowserSessions);\r\n\r\n function changePassword(req) {\r\n\r\n return _postRequest('changepassword', req).then(function(res) {\r\n if (res.Result === 0) {\r\n localStorage.setItem('clear-sessions', 'session-cleared');\r\n _updateUserSignedOut();\r\n if ($route.current.requiresHardAuth || $route.current.requiresAnonAuth) {\r\n $location.path('/signin');\r\n }\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function signOut(req) {\r\n const promises = [];\r\n if (currentUser.get().SignedIn) {\r\n promises.push(_postRequest('signout', req));\r\n }\r\n\r\n if (currentUser.get().AnonSignedIn) {\r\n promises.push($http.post('/api2/managebooking/signout'));\r\n }\r\n\r\n if (currentUser.get().HardSignedIn) {\r\n closeSkywardsOktaSession();\r\n sessionStorage.removeItem('skywardsLoginUser');\r\n }\r\n\r\n return $q\r\n .all(promises)\r\n .then(() => {\r\n discountsService.validate(TRPCONFIG.DiscountCode);\r\n })\r\n .then(function() {\r\n _updateUserSignedOut();\r\n if ($route.current.requiresHardAuth || $route.current.requiresAnonAuth) {\r\n $location.path('');\r\n }\r\n });\r\n }\r\n\r\n function changeContactDetails(c) {\r\n return _postRequest('setcontact', c);\r\n }\r\n\r\n function changeContactInfo(c) {\r\n return _postRequest('setcontactinformation', c, { customErrCallback: () => true });\r\n }\r\n\r\n function getSkywardsUserDetails() {\r\n return skywardsResult;\r\n }\r\n\r\n function closeSkywardsOktaSession() {\r\n let url = `${TRPCONFIG.Domain.SkywardsOktaBaseUri}/api/v1/sessions/me`;\r\n let xhr = new XMLHttpRequest();\r\n\r\n xhr.open('DELETE', url, true);\r\n xhr.withCredentials = true;\r\n xhr.send(null);\r\n }\r\n\r\n function _updateUserSignedOut() {\r\n\r\n currentUser.set(angular.extend({}, currentUser.get(), {\r\n SignedIn: false,\r\n AnonSignedIn: false,\r\n HardSignedIn: false,\r\n SoftSignedIn: false,\r\n ImpersonatedSignedIn: false,\r\n Contact: null\r\n }));\r\n\r\n preferences.clear();\r\n $rootScope.$broadcast('auth:signout');\r\n $rootScope.user = currentUser.get();\r\n const signedOut = localStorage.getItem('clear-sessions');\r\n if (signedOut === 'session-cleared') {\r\n $timeout(localStorage.removeItem('clear-sessions'), 500);\r\n }\r\n }\r\n\r\n function deleteAccount(req) {\r\n return _postRequest('delete', req)\r\n .then(function(res) {\r\n if (res.Success) {\r\n _updateUserSignedOut();\r\n $location.path('');\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function getUser() {\r\n return currentUser.get();\r\n }\r\n\r\n function setUser(user) {\r\n currentUser.set(user);\r\n if (user.SignedIn) {\r\n if (user.AnonSignedIn && user.SigninLevel >= signInLevel.Soft) {\r\n //Only if the user is not impersonated\r\n $http.post('/api2/managebooking/signout');\r\n }\r\n _extendUser(user);\r\n }\r\n }\r\n\r\n function getUrl() {\r\n return url;\r\n }\r\n\r\n function bufferRoute(r, reload = false) {\r\n bufferedRoute.route = r;\r\n bufferedRoute.reload = reload;\r\n }\r\n\r\n function redirectToBufferedRoute() {\r\n const redirect = !!(bufferedRoute.route && bufferedRoute.route.indexOf('?'));\r\n if (redirect) {\r\n if (bufferedRoute.reload) {\r\n //Relaoding the location immediately after $location.path will fail in some browser.\r\n window.location.href = bufferedRoute.route;\r\n } else {\r\n const parsedUri = urlUtils.parse(bufferedRoute.route);\r\n $location.path(parsedUri && parsedUri.url).search(parsedUri.qs);\r\n }\r\n }\r\n return redirect;\r\n }\r\n\r\n function bookingSignInByAgent(bookingId) {\r\n return $http.post('api2/bookings/manage/signinByAgent', {\r\n BookingId: bookingId\r\n }).then(res => {\r\n return res;\r\n })\r\n .then(res => _signInResult(res));\r\n }\r\n\r\n function anonSignIn(bookingRef, lastName) {\r\n const user = currentUser.get();\r\n\r\n return (user.SignedIn ?\r\n _postRequest('signout') :\r\n $q.when()).then(() =>\r\n $http.post('/api2/bookings/manage/signinv2', {\r\n BookingRef: bookingRef,\r\n Surname: lastName,\r\n DomainId: TRPCONFIG.Domain.DomainId\r\n }).then(res => _signInResult(res)));\r\n }\r\n\r\n function _signInResult(res) {\r\n if (!res.data.Success) {\r\n return $q.when(false);\r\n }\r\n return getSignedinBooking().then(booking => {\r\n const user = angular.extend({}, currentUser.get(), {\r\n AnonSignedIn: res.data.Success,\r\n Contact: booking.Contact,\r\n BookingSummary: booking.Summary\r\n });\r\n setUser(user);\r\n if (user.AnonSignedIn) {\r\n analytics.track('mixpanel', 'UserSignedIn', {\r\n IdentityProvider: 'bookingLookup'\r\n });\r\n $rootScope.$broadcast('auth:signin', user);\r\n }\r\n return user.AnonSignedIn;\r\n });\r\n }\r\n\r\n function newsletterSignUp(userId, signupreason = 'Newsletter Signup') {\r\n const data = {\r\n UserId: userId,\r\n Channel: 1,\r\n Status: 1,\r\n Source: 'TravelRepublic',\r\n Reason: signupreason,\r\n Date: (new Date()).toISOString()\r\n };\r\n\r\n return $http.post(`${url}Setcommunicationpreference`, data);\r\n }\r\n\r\n function getNextRoute() {\r\n return bufferedRoute.route || '';\r\n }\r\n\r\n function getSignedinBooking() {\r\n return $http.post('/api2/bookings/manage/getsignedinbookingcontact')\r\n .then(result => {\r\n return result && result.data ? result.data : null;\r\n });\r\n }\r\n\r\n function getHost() {\r\n return $location.host();\r\n }\r\n\r\n function getDomain() {\r\n const host = getHost();\r\n let cookieDomain;\r\n let domainParts;\r\n\r\n if (host.startsWith('pp2.')) {\r\n cookieDomain = host.replace('pp2.', '.pp2.');\r\n } else {\r\n domainParts = host.split('.');\r\n domainParts.shift();\r\n cookieDomain = `.${domainParts.join('.')}`;\r\n }\r\n return cookieDomain;\r\n }\r\n\r\n function createCookieName() {\r\n let domainParts;\r\n const host = getHost();\r\n const devEnv = _.get(TRPCONFIG, 'Domain2.CookieEnv');\r\n domainParts = host.split('.');\r\n const match = domainParts.some(part => devEnv && devEnv.includes(part));\r\n const devEnvStr = (match) ? 'DEV' : '';\r\n return `${devEnvStr}.ASPXAUTH`;\r\n }\r\n\r\n const getUserPreferences = async () => {\r\n const response = await fetch(preferencesUrl);\r\n const { status } = response;\r\n if (status === 401 || status === 403) {\r\n return status;\r\n }\r\n };\r\n\r\n async function checkUserPreferences() {\r\n const enabled = _.get(TRPCONFIG, 'Domain2.ClearUserPrefs');\r\n if (!enabled) { return; }\r\n let getUserPrefResponse;\r\n const user = getUser();\r\n const signedIn = _.get(user, 'SignedIn');\r\n if (signedIn) {\r\n getUserPrefResponse = await getUserPreferences();\r\n }\r\n if (getUserPrefResponse && signedIn === true) {\r\n _updateUserSignedOut();\r\n $location.path('/signin');\r\n }\r\n }\r\n\r\n function doesHttpOnlyCookieExist(cookiename) {\r\n const enabled = _.get(TRPCONFIG, 'Domain2.ClearUserPrefs');\r\n if (!enabled) { return; }\r\n const cookieDomain = getDomain();\r\n const duration = dateUtil.addDays(new Date(), 14);\r\n const expires = `expires= + ${duration}`;\r\n cookieService.set(cookiename, 1, expires, cookieDomain);\r\n const cookies = `${document.cookie}`;\r\n\r\n let cookieASPXAUTH = cookieService.get(cookiename, cookies);\r\n const user = currentUser.get();\r\n const requiresHardAuth = _.get($route, 'current.requiresHardAuth');\r\n const requiresAnonAuth = _.get($route, 'current.requiresAnonAuth');\r\n\r\n if (cookieASPXAUTH !== null && _.get(user, 'SignedIn')) {\r\n _updateUserSignedOut();\r\n if (requiresHardAuth || requiresAnonAuth) {\r\n $location.path('/signin');\r\n }\r\n }\r\n }\r\n\r\n function impersonatedSignIn(userId) {\r\n return _postRequest('impersonatedsignin', { userId })\r\n .then(res => {\r\n if (res.Success === false) {\r\n broker.publish('userDeimpersonated', null);\r\n } else {\r\n _updateUserFromResponse(res.User);\r\n }\r\n return res;\r\n });\r\n }\r\n\r\n function getUserByAgent(userId) {\r\n return $http.get(`${url}getuserbyagent?request.userId=${userId}`, { ignoreErrors: true });\r\n }\r\n\r\n //True, if there is either Travel agent / Customer is selected\r\n function anyEndUser() {\r\n return TRPCONFIG.Domain.IsTravelAgentMode || (!!currentUser.get() && currentUser.get().ImpersonatedSignedIn);\r\n }\r\n\r\n function getSignedInBookingId() {\r\n let user = getUser();\r\n return user && user.AnonSignedIn ? (user.Contact ? user.Contact.BookingId : user.BookingId) : null;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","'use strict';\n\nnamespace Core.Booking {\n\n type SearchUnitService = Search.SearchUnitService;\n export interface BookingService {\n driverOptions: {name:() => string, value: DriverType}[];\n trimBooking(booking : Booking ) : TrimmedBooking;\n prepareBooking(basketId: string,\n bookingId: string,\n tripId: string,\n userData: UserData ) : ng.IPromise;\n getBooking(bookingId: string, tripId?: string) : ng.IPromise;\n updateBooking(b : Booking, description? : string) : ng.IPromise;\n book(booking: Booking, tripId: string, basketId: string) : ng.IPromise;\n getCpgStatus(id: number, $scope: any) : null | ng.IPromise<{\n paRes: string;\n prePaymentId: string;\n error: string;\n }>;\n getUrl() : string;\n getAdultTitles() : () => string;\n copyFromContact(booking: Booking, e: Event) : void;\n detailsMatch(booking: Booking) : boolean;\n clearContact(userData : UserData) : void;\n clearGuests(rooms: Room[]) : void;\n checkValidEmail(email: string) : ng.IPromise;\n updateDeposit(deposit: ng.INgModelController,\n payment : PaymentDetails,\n totalCost,\n minDeposit);\n paypalPostBooking(paypalResult : PayPalResponse) : void;\n getDiscountForCard(bookingId: string,\n cardNumber: string,\n domainId: number,\n cultureCode: string) : ng.IPromise;\n getCardDiscountsForDomain(domainId: number, cultureCode: string) : ng.IPromise;\n setTrackingTag(tag : string) : void;\n getTrackingTag(cb) : () => any;\n pauseRecording(agentIpAddress: string) : void;\n resumeRecording(agentIpAddress: string) : void;\n browserDetails(browserDetails: any) : void;\n }\n\n interface IWindow extends ng.IWindowService {\n paypal: { checkout : { startFlow: (s) => void}};\n }\n\n export interface PrepareBookingRequest {\n BookingProcessId: string;\n BasketId: string;\n TripId: string;\n CultureCode: string;\n IsRebook: boolean;\n }\n\n export class BookingRequest {\n constructor(public TripId:string,\n public BookingProcessId: string,\n public UserData: UserData,\n public CultureCode: string,\n public DomainId: number,\n public ApplicationType: number,\n public LinkedBookingId: number | undefined,\n public TrackingTag: string | null,\n public CheckLivePrices: boolean,\n public BasketId: string){\n }\n }\n\n angular\n .module('core')\n .service('bookingService', bookingService);\n\n function bookingService($http : Core.IHttpService,\n resourceService : Core.ResourceService,\n basketStore,\n searchUnitService : SearchUnitService,\n $q: ng.IQService,\n $location: ng.ILocationService,\n $timeout: ng.ITimeoutService,\n $interval: any,\n preferences,\n loggingService,\n urlUtils,\n $routeParams: any,\n localStorageProvider: any,\n $window: IWindow,\n mandatoryTransferService,\n authService: any,\n $rootScope : ng.IRootScopeService) : BookingService {\n const url: string = '/api2/bookings/';\n const gmtUrl: string = '/api2/callmgmt/';\n const driverOptions = [\n {name: resourceService.getDeferred('NOTADRIVER'), value: DriverType.NotADriver},\n {name: resourceService.getDeferred('MAINDRIVER'), value: DriverType.MainDriver},\n {name: resourceService.getDeferred('ADDITIONALDRIVER'), value: DriverType.AdditionalDriver}\n ];\n let promise: ng.IPromise | null;\n\n const service: BookingService = {\n driverOptions,\n trimBooking,\n prepareBooking,\n getBooking,\n updateBooking,\n book,\n getCpgStatus,\n getUrl,\n getAdultTitles,\n copyFromContact,\n detailsMatch,\n clearContact,\n clearGuests,\n checkValidEmail,\n updateDeposit,\n paypalPostBooking,\n getDiscountForCard,\n getCardDiscountsForDomain,\n setTrackingTag,\n getTrackingTag,\n pauseRecording,\n resumeRecording,\n browserDetails\n };\n\n function setTrackingTag(tag: string): ng.IPromise {\n return localStorageProvider.setItem('trackingTag', tag);\n }\n\n function getTrackingTag(cb): () => string | null | Error {\n return localStorageProvider.getItem('trackingTag', (error, value) => cb(value));\n }\n\n function removeTrackingTag(): ng.IPromise {\n return localStorageProvider.removeItem('trackingTag');\n }\n\n function _enhanceBooking(booking: Booking): ng.IPromise {\n //this has to be done on the client because PayPalEnabled is dictated by whether or not cookies are enabled.\n booking.PaymentOptions = _.filter(\n booking.PaymentOptions,\n option => TRPCONFIG.PayPalEnabled || !option.IsPayPalPayment\n );\n\n return $q.when(booking).then(setDashboardPreferences);\n }\n\n function setDashboardPreferences(booking: Booking): ng.IPromise {\n if (!TRPCONFIG.Domain.DashboardSettingsEnabled) {\n return $q.when(booking);\n }\n return preferences.get('smokingRoom').then(smokingRoom => {\n return {\n ...booking,\n UserData: {\n ...booking.UserData,\n Rooms: booking.UserData.Rooms.map(room => {\n const [ yes, no ] = [ 1, 2 ];\n\n let hasSpecialRequest = room.SpecialRequest === '' || room.SpecialRequest == null;\n let isSmokingRoomSet = smokingRoom === yes || smokingRoom === no;\n\n if (hasSpecialRequest && isSmokingRoomSet) {\n let smokingRequestResource = smokingRoom === yes\n ? 'SMOKINGROOMREQUEST'\n : 'NOSMOKINGROOMREQUEST';\n room.SpecialRequest = resourceService.getDeferred(smokingRequestResource)();\n }\n\n return room;\n })\n }\n };\n });\n\n }\n\n function paypalPostBooking(paypalResult : PayPalResponse) : void {\n if (TRPCONFIG.Domain.PaypalInContextEnabled) {\n const token = urlUtils.parse(paypalResult.AcsUrl).qs.token;\n $window.paypal.checkout.startFlow(token);\n } else {\n $window.location.href = paypalResult.AcsUrl;\n }\n }\n\n function trimBooking(booking : Booking ) : TrimmedBooking {\n let copy = _.cloneDeep(booking);\n return {\n UserData: copy.UserData,\n BookingProcessId: copy.BookingProcessId,\n LinkedBookingId: copy.LinkedBookingId\n };\n }\n\n function prepareBooking(basketId: string,\n bookingId: string,\n tripId: string,\n userData: UserData) : ng.IPromise {\n const req : PrepareBookingRequest = {\n BookingProcessId: bookingId,\n BasketId: basketId,\n TripId: tripId,\n IsRebook: !!$routeParams.BookingRef,\n CultureCode: TRPCONFIG.Domain.CultureCode\n };\n\n promise = $http.post('website/booking/preparebooking', req)\n .then(({ data: booking }) => {\n return basketStore.applyCancelations(basketId, booking.BookingProcessId)\n .then(() => booking);\n })\n .then((booking: Booking) => {\n if (userData) {\n booking.UserData = userData;\n }\n\n return $q.all([\n basketStore.rules(basketId),\n basketStore.carHire(basketId),\n _enhanceBooking(_.cloneDeep(booking))\n ]);\n })\n .then(([rules, carHire, booking]) => {\n if (rules.captureFlight) {\n const mode = searchUnitService.transfer;\n booking.UserData.ConnectingFlight = {\n OutboundDate: searchUnitService.startDate(mode),\n InboundDate: searchUnitService.endDate(mode)\n };\n }\n if (TRPCONFIG.Domain.MandatoryExtrasEnabled) {\n let connectingFlight = booking.UserData.ConnectingFlight;\n let flightWithDetaild = mandatoryTransferService.addFlightDetails(connectingFlight);\n booking.UserData.ConnectingFlight = flightWithDetaild;\n }\n if (carHire) {\n booking.BookingRules.AdditionalDrivers = carHire.AdditionalDrivers;\n }\n if (rules.captureMainDriver) {\n let main = false;\n let additional = 0;\n let { AdditionalDrives: additionalDrivers } = booking.BookingRules;\n booking.UserData.Rooms = booking.UserData.Rooms.map(room => ({\n ...room,\n Guests: room.Guests.map(guest => {\n if (!main && guest.DriverType !== 1) {\n main = true;\n guest.DriverType = 1;\n } else if (additional < additionalDrivers && guest.Type === 1) {\n guest.DriverType = 2;\n additional++;\n }\n return guest;\n }),\n }));\n }\n\n service.updateBooking(booking);\n return booking;\n });\n return >promise;\n }\n\n function checkValidEmail(email: string) : ng.IPromise {\n const domain = TRPCONFIG.Domain;\n return $http.post(`${url}validateemail`, {\n DomainId: domain.DomainId,\n CultureCode: domain.CultureCode,\n Email: email\n }).then(result => {\n if (result && result.data) {\n return $q.resolve();\n }\n return $q.reject();\n });\n }\n\n function getBooking(bookingId: string, tripId?: string) : ng.IPromise {\n if (promise != null && !TRPCONFIG.Domain.isAgentMode) {\n return promise.then(_enhanceBooking);\n }\n\n promise = $http.get(\n `website/booking/getbooking?${$.param({\n TripId: tripId,\n BookingProcessId: bookingId,\n CultureCode: TRPCONFIG.Domain.CultureCode\n })}`, {\n customErrCallback(data) {\n if (data.status === 404) {\n loggingService.logError(`Booking Already Done: booking.service: getbooking?${$.param({\n TripId: tripId, BookingProcessId: bookingId,\n CultureCode: TRPCONFIG.Domain.CultureCode\n })}, DomainId:${TRPCONFIG.Domain.DomainId}, href:\"${$location.absUrl()}`);\n $location.path('bookingalreadydone');\n } else {\n return true;\n }\n }\n }).then(function (result) {\n if (result) {\n return _enhanceBooking(_.cloneDeep(result.data));\n }\n promise = null;\n });\n\n return >promise;\n }\n\n function updateBooking(booking : Booking, description? : string) : ng.IPromise {\n const copy = _.cloneDeep(booking);\n //make sure that we are not sending card data when calling update booking\n _.get(copy, 'UserData.PaymentDetails.CardDetails') && delete copy.UserData.PaymentDetails.CardDetails;\n promise = $q.when(booking);\n return $http.post(`${url}updatebooking`, {\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n BookingProcessId: booking.BookingProcessId,\n UserData: copy.UserData,\n Description: description\n }, {ignoreErrors: true}).then(() => promise != null ? promise : booking).then(() => {\n const cookieName = authService.createCookieName();\n if(cookieName) {\n authService.doesHttpOnlyCookieExist(cookieName);\n }\n });\n }\n\n function browserDetails() {\n const browserDetails = {\n ScreenHeight: window.screen.height,\n ScreenWidth: window.screen.width,\n ColorDepth: window.screen.colorDepth,\n AdditionalDetails: {\n ExtraData: [\n {\n Name: null,\n value: null\n }\n ]\n }\n };\n\n return browserDetails;\n }\n\n function book(booking: Booking, tripId: string, basketId: string) : ng.IPromise {\n const domain = TRPCONFIG.Domain;\n //enable timeouts only for desktop\n const isMobile = TRPCONFIG.IsMobileView;\n const checkLivePrice = domain.CheckLivePrices && !isMobile;\n let skywardsUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\n let skywardsLoyalityNumber = sessionStorage.getItem('SkywardsLoyalityNumber');\n\n return $q((res, rej) => {\n service.getTrackingTag(value => {\n if (skywardsUser && skywardsUser.data && skywardsUser.data.Contact) {\n booking.UserData.Contact.LoyaltyNumber = skywardsUser.data.Contact.LoyaltyId;\n } else if (skywardsLoyalityNumber) {\n booking.UserData.Contact.LoyaltyNumber = skywardsLoyalityNumber;\n }\n\n booking.UserData['BrowserDetails'] = browserDetails();\n\n const req = new BookingRequest(tripId,\n booking.BookingProcessId,\n booking.UserData,\n domain.CultureCode,\n domain.DomainId,\n TRPCONFIG.ApplicationType,\n booking.LinkedBookingId,\n value,\n checkLivePrice,\n basketId);\n\n $http.post(`${url}createbooking`, req).then(result => {\n // Discard booking after creation if there are no messages and the status is complete\n if (result.data.Messages && result.data.Messages.length === 0 &&\n result.data.Status === CreateBookingStatus.Complete) {\n promise = null;\n removeTrackingTag();\n }\n res(result.data);\n });\n });\n });\n\n }\n\n function getCpgStatus(prePaymentId): null | ng.IPromise<{\n paRes: string;\n prePaymentId: string;\n error: string;\n }> {\n const pollDelayMs = TRPCONFIG.Domain.CpgStatusIntervalDelay;\n const stopApiMs = TRPCONFIG.Domain.CpgStatusTimeout;\n if (!prePaymentId) {\n return null;\n }\n const host = $location.host();\n const protocol = $location.protocol();\n const cpgstatusURL = `${protocol}://${host}/cpgstatus?prebookpaymentid=${prePaymentId}`;\n return $q((res, rej) => {\n let interval = $interval(() => {\n $http.get(`${cpgstatusURL}`).then((result) => {\n const bookingPath = $location.path();\n\n if (result.data.Status === 'SUCCESS') {\n const cpgStatus = result.data.Status;\n const authCode =\n result.data && result.data.AuthCode;\n const paRes =\n cpgStatus === 'SUCCESS'\n ? `^${authCode}^^^AUTHORISED`\n : '';\n\n const response = {\n paRes,\n prePaymentId,\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (bookingPath && !bookingPath.includes('book')) {\n console.log('cpgStatus cancelled');\n const response = {\n paRes: '',\n prePaymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (result && result.status !== 200) {\n console.log('cpgStatus result.status', result.status);\n const response = {\n paRes: '',\n prePaymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if(result.data.Status === 'FAILED') {\n // payment failed so stop polling\n // Log an error?\n const error = 'FAILED';\n const response = {\n paRes: '',\n prePaymentId: '',\n error,\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if(result.data.Status === 'STOP') {\n // stop polling\n // Duplicate, log error\n console.log('stop polling');\n const response = {\n paRes: '',\n prePaymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n });\n }, pollDelayMs);\n\n $timeout(() => {\n $interval.cancel(interval);\n const error = 'TIMER';\n const response = {\n paRes: '',\n prePaymentId: '',\n error,\n };\n $rootScope.$broadcast('cpgStatusAPIError', response);\n }, stopApiMs);\n });\n }\n\n function getUrl() : string {\n return url;\n }\n\n function _getTitleIndex(t: string) : number {\n if (!t) {\n return -1;\n }\n\n const clean = s =>\n s.toLowerCase()\n .replace(/[.-/#!$%^&*;:{}=\\-_`~()]/g, '')\n .replace(/\\s{2,}/g, ' ');\n\n const titlesString = clean(getAdultTitles()());\n const titleArray = titlesString.split(',');\n\n return titleArray\n .indexOf(clean(t));\n }\n\n function copyFromContact(booking: Booking, e: Event) : void {\n const guest = _.get(booking, 'UserData.Rooms[0].Guests[0]');\n const contact = booking.UserData.Contact;\n const titles = getAdultTitles()();\n\n guest.FirstName = contact.FirstName;\n guest.LastName = contact.LastName;\n\n const index = _getTitleIndex(contact.Title);\n\n if (index !== -1) {\n guest.Title = titles.split(',')[index];\n }\n\n if (!!guest.FirstName && !!guest.LastName && index !== -1) {\n service.updateBooking(booking);\n if (e) {\n e.stopPropagation();\n }\n }\n }\n\n function getAdultTitles() : () => string {\n return resourceService.getDeferred('ADULTTITLES');\n }\n\n function detailsMatch(booking: Booking) : boolean {\n const guest = _.get(booking, 'UserData.Rooms[0].Guests[0]');\n const contact = booking.UserData.Contact;\n return (!contact.FirstName && !contact.LastName && !contact.Title)\n ? true\n : guest.FirstName === contact.FirstName &&\n guest.LastName === contact.LastName &&\n _getTitleIndex(contact.Title) === getAdultTitles()().split(',').indexOf(guest.Title);\n }\n\n function clearContact(userData : UserData) : void {\n (document.querySelector\n ('.contact-section.page-content-panel [name=\"contactForm\"] [name=\"LoyaltyNumber\"]'))\n .removeAttribute('disabled');\n (document.querySelectorAll\n ('[name=\"passengers\"] .guest-panel [name=\"loyaltyNumber\"]')[0])\n .removeAttribute('disabled');\n (document.querySelectorAll\n ('[name=\"passengers\"] .guest-panel [name=\"loyaltyNumber\"]')[0]).value = '';\n userData.Contact = {\n CountryCode: TRPCONFIG.Domain.CountryCode,\n Title: '',\n FirstName: '',\n LastName: '',\n MobileTel : '',\n HomeTel : '',\n\n };\n }\n\n function clearGuests(rooms: Room[]) : void {\n _.forEach(rooms, room => {\n _.forEach(room.Guests, g => {\n g.Title = '';\n g.FirstName = '';\n g.LastName = '';\n g.DateOfBirth = '';\n g.LoyaltyNumber = '';\n });\n });\n }\n\n function updateDeposit(deposit: ng.INgModelController,\n payment : PaymentDetails,\n totalCost,\n minDeposit) {\n $timeout(function () {\n if (deposit && deposit.$valid) {\n payment.PaymentAmount = parseFloat(deposit.$modelValue);\n return;\n }\n const errors = Object.keys(deposit.$error);\n if (errors.length === 1) {\n if (deposit.$error.maxValue) {\n payment.PaymentAmount = parseFloat(totalCost);\n return;\n }\n }\n payment.PaymentAmount = parseFloat(minDeposit);\n });\n }\n\n function getDiscountForCard(bookingId: string, cardNumber: string, domainId: number, cultureCode: string) {\n return $http.get(`${url}getdiscountforcard`, {\n params: {\n 'basketId': bookingId,\n 'cardNumber': cardNumber,\n 'domainId': domainId,\n 'cultureCode': cultureCode\n }\n }\n ).then(result => {\n return result.data.DiscountDetails.Discount;\n });\n }\n\n function getCardDiscountsForDomain(domainId: number, cultureCode: string) {\n return $http.get(`${url}getcarddiscountsfordomain`, {\n params: {\n 'domainId': domainId,\n 'cultureCode': cultureCode\n },\n cache: true\n }\n ).then(result => {\n return result.data;\n });\n }\n\n function pauseRecording(agentIpAddress) {\n return $http.post(`${gmtUrl}pauserecording`, {\n params: {\n 'AgentIpAddress': agentIpAddress\n }\n });\n }\n\n function resumeRecording(agentIpAddress) {\n return $http.post(`${gmtUrl}resumerecording`, {\n params: {\n 'AgentIpAddress': agentIpAddress\n }\n });\n }\n\n return service;\n }\n}\n","'use strict';\n\nnamespace Core.ManageBooking {\n\n type DestinationSummary = Core.Destinations.DestinationSummary;\n\n interface BookedTripApi {\n readonly Adults: number;\n Bookings: ProductBooking[];\n readonly Children: number;\n readonly EndDate: string;\n readonly Infants: number;\n readonly StartDate: string;\n }\n\n interface CancellationOptions {\n CanAutoCancel: boolean;\n RejectionReason: number;\n CancellationDetails: null | {\n RefundableTotalBeforeCharges: number;\n TotalPaidLessFees: number;\n CancellationPercentage: number | null;\n CancellationAmount: number | null;\n RefundableTotal: number;\n NonRefundableFeesPaid: number;\n ExpiryDate: string;\n };\n }\n\n angular\n .module('core')\n .service('bookingsManagerService', BookingsManagerService);\n\n export interface BookingsManagerService {\n getCurrentTripForUser(): ng.IPromise;\n getCancellationOptions(bookingId: number): ng.IPromise;\n getTrip(bookingId: number): ng.IPromise;\n }\n\n function BookingsManagerService (\n $http: ng.IHttpService,\n $q: ng.IQService,\n $routeParams: ng.route.IRouteParamsService,\n dateUtil: any,\n imageService: any,\n destinationService: any\n ) : BookingsManagerService {\n\n const service: BookingsManagerService = {\n getCurrentTripForUser,\n getCancellationOptions,\n getTrip\n };\n\n enum BookingTypePropertyMap {\n FlightBooking = BookingType.Flight,\n AttractionsBooking = BookingType.AttractionTickets,\n CarHireBooking = BookingType.CarHire,\n HotelBooking = BookingType.Accommodation,\n AirportParkingBooking = BookingType.Parking,\n TransferBooking = BookingType.Transfer,\n InsuranceBooking = BookingType.TravelInsurance,\n MarhabaBooking = BookingType.Marhaba,\n BundleBooking = BookingType.Bundle,\n AdHocBooking = BookingType.AdHoc,\n }\n\n function getCancellationOptions(bookingId: number) {\n let url = `/api/bookings/cancellations/options?bookingId=${bookingId}`;\n return $http.get(url).then(response => response && response.data);\n }\n\n function getCurrentTripForUser() {\n let url = `/api/bookings/trips/current?culturecode=${TRPCONFIG.Domain.CultureCode}`;\n return $http.get(url).then((response) => {\n if (response.status === 204) {\n // 'No content' - this is expected if there is no current trip!\n return null;\n }\n return _enrichBookedTrip(response.data);\n });\n }\n\n function getTrip(bookingId: number): ng.IPromise {\n let url = `/api/bookings/${bookingId}/trip?culturecode=${TRPCONFIG.Domain.CultureCode}`;\n return $http.get(url)\n .then(({data}) => {\n if ($routeParams.ref) {\n let refs = $routeParams.ref.toUpperCase().split('|');\n data.Bookings = _.filter(data.Bookings, b => _.find(refs,\n r => r === b['BookingRef'].toUpperCase()));\n }\n return _enrichBookedTrip(data);\n });\n }\n\n function _enrichBookedTrip(booking: BookedTripApi): ng.IPromise {\n // Decorate trip with properties not returned by the API response\n let trip = new BookedTrip();\n trip.StartDate = booking.StartDate;\n trip.EndDate = booking.EndDate;\n trip.Adults = booking.Adults;\n trip.Children = booking.Children;\n trip.Infants = booking.Infants;\n\n const startDate: Date = dateUtil.parseDate(trip.StartDate);\n const endDate: Date = dateUtil.parseDate(trip.EndDate);\n trip.Duration = dateUtil.getDifferenceInDays(startDate, endDate);\n trip.DaysUntilDeparture = dateUtil.getDifferenceInDays(new Date(), startDate);\n trip.DaysUntilReturn = dateUtil.getDifferenceInDays(new Date(), endDate);\n\n //payment bits\n _.each(booking.Bookings, b => {\n\n //set the currency code to be the same as the first bookings cleared payment currency\n //handle cases where agents skip a payment (no payment info)\n if (!trip.PaymentDetails.CurrencyCode) {\n const head = _.head(b.PaymentInfo.ClearedPayments);\n trip.PaymentDetails.CurrencyCode = head ? head.ClientCurrencyCode : '';\n }\n\n if (TRPCONFIG.Domain2.MonthlyPaymentsEnabled) {\n trip.PaymentDetails.Paid += _.reduce(b.PaymentInfo.ClearedPayments,\n (r, p) => {\n const isAmountSkipped = p.IsScheduledPayment && p.ClientCurrencyPaymentAmount < 0;\n\n return isAmountSkipped ? r : r + p.ClientCurrencyPaymentAmount;\n }, 0);\n } else {\n trip.PaymentDetails.Paid += _.reduce(b.PaymentInfo.ClearedPayments,\n (r, p) => r + p.ClientCurrencyPaymentAmount,\n 0);\n }\n\n _.each(b.PaymentInfo.FuturePayments, p => {\n const updateArray = (arr :BalanceDue[], amount :number, due :string, currencyCode :string) => {\n const item = _.find(arr, { 'Due' : due , 'CurrencyCode' : currencyCode});\n if (item) {\n item.Amount += amount;\n } else {\n arr.push({Amount:amount, BookingType:b.BookingType, CurrencyCode:currencyCode, Due:due});\n }\n };\n\n trip.PaymentDetails.Total += p.ClientCurrencyPaymentAmount;\n updateArray(\n trip.PaymentDetails.Balances, p.ClientCurrencyPaymentAmount, p.PaymentDate, p.ClientCurrencyCode\n );\n });\n\n _.each(b.PaymentInfo.DirectPayments, p => {\n trip.PaymentDetails.PayDirect.push(\n { Amount: p.Amount,\n LocalAmount: p.LocalAmount,\n LocalCurrency: p.LocalCurrency,\n BookingType: b.BookingType\n }\n );\n trip.PaymentDetails.Total += p.Amount;\n });\n\n delete b.PaymentInfo; //remove the payment info as we shouldn't need it going forward\n });\n trip.PaymentDetails.Total += trip.PaymentDetails.Paid; //set the total correctly\n trip.PaymentDetails.Outstanding = trip.PaymentDetails.Total - trip.PaymentDetails.Paid;\n trip.PaymentDetails.Balances = _.sortBy(trip.PaymentDetails.Balances, 'Due'); //tidy up\n\n //map our bookings array to our bookedTrip properties\n _mapBookingsArrayToProperties(trip, booking.Bookings);\n\n let mainBooking = (trip.FlightBooking || trip.HotelBooking);\n if (!mainBooking) {\n mainBooking = booking.Bookings[0];\n }\n trip.MainBookingId = mainBooking.BookingId;\n\n if (trip.DaysUntilDeparture > 0) {\n trip.TripStage = TripStage.PreTrip;\n } else if (trip.DaysUntilReturn > 0) {\n trip.TripStage = TripStage.OnTrip;\n } else {\n trip.TripStage = TripStage.PostTrip;\n }\n\n // get destination based on either hotel OR flight destination airport\n let dest: DestinationSummary|null = null;\n if (trip.HotelBooking) {\n const b = trip.HotelBooking;\n\n // use Province OR first destination\n const dests: DestinationSummary[] = b.Hotel.Destinations;\n dest = _.find(dests,\n ['Type', Destinations.DestinationType.Province])\n || dests[0];\n } else if (trip.FlightBooking) {\n // use destination of arrival airport\n dest = _.head(trip.FlightBooking.Legs).ArrivalAirport.Destination;\n } else if (trip.TransferBooking) {\n //we handle sorting out the destination info a little further down\n //look there\n } else if (trip.AttractionsBooking) {\n dest = _.head(trip.AttractionsBooking.Attractions).Destination;\n }\n\n let destPromise: ng.IPromise;\n if (dest) {\n trip.Destination = dest;\n trip.Destination.ImageUrl= imageService.getDestinationImage({ Id: dest.Id, Type: dest.Type });\n // Make an additional API call to get the destination landing page path\n destPromise = destinationService.getDetails(angular.copy(trip.Destination), ['PagePath']);\n } else {\n destPromise = $q.when();\n }\n\n //extend product infos\n if (trip.HotelBooking) {\n const b = trip.HotelBooking;\n\n trip.HotelBooking.Duration = dateUtil.dayDiff(b.CheckInDate, b.CheckOutDate);\n\n // get hotel image url\n const d = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\n b.Hotel.ImageUrl = imageService.getMainImageUrl(b.Hotel.EstabId, d, d, true);\n }\n\n if (trip.FlightBooking) {\n _.each(trip.FlightBooking.Legs, l => {\n const start = dateUtil.parseDate(l.DepartureTime);\n const end = dateUtil.parseDate(l.ArrivalTime);\n l.DayDiff = dateUtil.getDifferenceInDays(start, end);\n });\n }\n\n if (trip.TransferBooking) {\n trip.TransferBooking.Legs = [];\n if(trip.TransferBooking.Outbound) {\n trip.TransferBooking.Legs.push(trip.TransferBooking.Outbound);\n }\n if(trip.TransferBooking.Return) {\n trip.TransferBooking.Legs.push(trip.TransferBooking.Return);\n }\n trip.TransferBooking.Title = trip.TransferBooking.Legs[0].Title;\n\n //a bit of a hack to use a default image for transfers\n if (!trip.Destination) {\n trip.Destination = {\n Id: 0,\n Type: Destinations.DestinationType.Universal,\n Title: trip.TransferBooking.Legs[0].DropOffPoint,\n ImageUrl: '/build/img/backdrops/transfers-dec16.jpg'\n };\n }\n }\n\n return destPromise.then((response) => {\n if (response && trip.Destination) {\n trip.Destination.PagePath = response.PagePath;\n }\n return trip;\n });\n }\n\n function _mapBookingsArrayToProperties(trip :BookedTrip, bookings :ProductBooking[]) :void {\n //go through the array setting our properties, currently we support only one of each product\n //type, this may change in future possibly\n _.each(bookings, b => {\n const property = BookingTypePropertyMap[b.BookingType];\n trip[property] = b;\n });\n }\n\n return service;\n }\n}\n","'use strict';\n\nnamespace Core {\n\n import ProductType = Core.Booking.ProductType;\n import CrossSellType = Core.Booking.CrossSellType;\n\n enum BookingStatus {\n Confirmed= 1,\n Pending= 2,\n Canceled= 3\n };\n\n export interface IBookingProbability {\n Product: ProductType;\n Probability: number;\n }\n\n export interface IBooking {\n BookingId: number;\n Status: number;\n }\n\n // this enum used for mapping cross sells to priorities\n // (required because the API fails to define a ProductType for each cross sell)\n export enum productTypeByCrossSellKey {\n Attractions = ProductType.Attraction,\n Hotels = ProductType.Hotel,\n CarHire = ProductType.CarHire,\n Parking = ProductType.Parking,\n Transfer = ProductType.Transfer\n };\n\n export enum crossSellTypeByCrossSellKey {\n Attractions = CrossSellType.Attractions,\n Hotels = CrossSellType.Hotels,\n CarHire = CrossSellType.CarHire,\n Parking = CrossSellType.Parking,\n Transfer = CrossSellType.Transfers\n };\n\n export class CrossSellCommonService {\n\n private baseUrl = '/api2/crosssell/';\n private sourceId = 2010;\n private crossSellsCache = {};\n\n\t\tconstructor(private $http: ng.IHttpService,\n private $location: ng.ILocationService,\n private $window: any,\n private searchUnitService: Search.SearchUnitService,\n private dateUtil,\n private $q: ng.IQService,\n private occupancyService: Core.OccupancyService,\n private $locale,\n private currentUser) { }\n\n public productTypeProperties = {\n Attractions: {\n CrossSellType: crossSellTypeByCrossSellKey['Attractions'],\n ProductType: productTypeByCrossSellKey['Attractions'],\n Icon: 'icon-attractions',\n Code: 'ATTRACTIONS'\n },\n Hotels: {\n CrossSellType: crossSellTypeByCrossSellKey['Hotels'],\n ProductType: productTypeByCrossSellKey['Hotels'],\n Icon: 'icon-hotels',\n Code: 'HOTELS'\n },\n CarHire: {\n CrossSellType: crossSellTypeByCrossSellKey['CarHire'],\n ProductType: productTypeByCrossSellKey['CarHire'],\n Icon: 'icon-car-hire',\n Code: 'CARHIRE'\n },\n Parking: {\n CrossSellType: crossSellTypeByCrossSellKey['Parking'],\n ProductType: productTypeByCrossSellKey['Parking'],\n Icon: 'icon-parking',\n Code: 'PARKING'\n },\n Transfer: {\n CrossSellType: crossSellTypeByCrossSellKey['Transfer'],\n ProductType: productTypeByCrossSellKey['Transfer'],\n Icon: 'icon-transfers',\n Code: 'TRANSFERS'\n }\n };\n\n getBookingCrossSell(bookingId: string): ng.IPromise {\n let crossSellUrl = this.baseUrl + 'bookingcrosssell/';\n if (this.currentUser.get() && this.currentUser.get().AnonSignedIn) {\n crossSellUrl = this.baseUrl + 'bookingcrosssell/linked/';\n }\n return this.$http.get(crossSellUrl\n + this.sourceId + '/'\n + bookingId + '/'\n + TRPCONFIG.Domain.DomainId,\n { ignoreErrors: true }).catch(_.noop);\n }\n\n private _trackCrossSell(bookingId: string, productType: ProductType): ng.IPromise {\n return this.$http.get(this.baseUrl\n + 'trackcrosssell/'\n + this.sourceId + '/'\n + bookingId + '/'\n + TRPCONFIG.Domain.DomainId + '/'\n + productType,\n { ignoreErrors: true });\n }\n\n getBasketCrossSell(basketId: string): ng.IPromise {\n return this.$http.get(this.baseUrl\n + 'basketcrosssells/'\n + TRPCONFIG.Domain.DomainId + '/'\n + TRPCONFIG.ApplicationType + '/'\n + basketId,\n { ignoreErrors: true }\n ).then((res: any): ng.IPromise => {\n return res.data.Predictions;\n });\n }\n\n getTripCrossSell(tr, getBookingCrossSell) {\n var isCurrent = this.dateUtil.compareDates(tr.EndDate, this.dateUtil.todayPlus(-1, 0, true)) === 1;\n if (TRPCONFIG.Domain.DashboardCrossSellEnabled &&\n isCurrent &&\n tr.Bookings) {\n\n if (this.crossSellsCache[tr.TripId]) {\n return this.$q.when(this.crossSellsCache[tr.TripId]);\n }\n var booking: IBooking = _.find(tr.Bookings, (b: IBooking) => b.Status !== BookingStatus.Canceled);\n if (booking && booking.BookingId && getBookingCrossSell) {\n return getBookingCrossSell(booking.BookingId).then(cs => {\n this.crossSellsCache[tr.TripId] = cs;\n return cs;\n });\n }\n return this.$q.when();\n }\n return this.$q.when();\n }\n\n startCrossSellJourney(bookingId, crossSellProduct): void {\n this._trackCrossSell(bookingId, crossSellProduct.ProductType);\n switch (crossSellProduct.CrossSellType) {\n case CrossSellType.Transfers:\n var direction;\n if (crossSellProduct.ReturnDate && crossSellProduct.ArrivalDate) {\n direction = 1;\n }\n else if (crossSellProduct.ArrivalDate) {\n direction = 2;\n }\n else if (crossSellProduct.ReturnDate) {\n direction = 3;\n }\n this.searchUnitService.setDirection(direction);\n\n let transferIndex = this.searchUnitService.transfer;\n this.searchUnitService.endDate(transferIndex, crossSellProduct.ReturnDate || null);\n this.searchUnitService.startDate(transferIndex, crossSellProduct.ArrivalDate || null);\n\n this.searchUnitService.setDestinationAirport({\n Title: crossSellProduct.AirportName,\n Code: crossSellProduct.AirportCode\n });\n\n this.searchUnitService.setResort({\n Type: 5, // transfer resort\n Code: crossSellProduct.ResortLocationId,\n Description: crossSellProduct.DestinationResort\n });\n this.occupancyService.setOccupancy([{\n Adults: crossSellProduct.Adults,\n ChildAges: crossSellProduct.ChildAges\n }]);\n this.$location.path('transfers').search('source', 'MYB cross-sell');\n\n break;\n case CrossSellType.CarHire:\n this.$window.location = TRPCONFIG.Domain.CarHireCrossSellUrl + '/book?' + $.param({\n pickupDateTime: crossSellProduct.PickUpDate,\n returnDateTime: crossSellProduct.DropOffDate,\n pickupIATACode: crossSellProduct.AirportCode,\n returnIATACode: crossSellProduct.AirportCode,\n age: crossSellProduct.DriverAge,\n residencyId: this.$locale.id.split('-')[1]\n });\n\n break;\n case CrossSellType.Attractions:\n this.$window.location = TRPCONFIG.DesktopUrlRoot\n + '/Attractions/ProductView.aspx?PIV='\n + crossSellProduct.ProductViewId;\n\n break;\n case CrossSellType.Hotels:\n const hotelIndex = this.searchUnitService.hotel;\n this.searchUnitService.endDate(hotelIndex, crossSellProduct.CheckOutDate || null);\n this.searchUnitService.startDate(hotelIndex, crossSellProduct.CheckInDate || null);\n //We should not go to the availability page directly, take the user to the landing page.\n this.$location.path(crossSellProduct.Url).search('source', 'MYB cross-sell');\n\n break;\n case CrossSellType.Parking:\n let promise = this.searchUnitService.getAirport(crossSellProduct.AirportCode);\n\n let parkingIndex = this.searchUnitService.parking;\n this.searchUnitService.startDate(parkingIndex, crossSellProduct.DepartureDate || null);\n this.searchUnitService.endDate(parkingIndex, crossSellProduct.ReturnDate || null);\n this.occupancyService.setPassengerCount(crossSellProduct.PassengerCount);\n\n promise.then(airport => {\n this.searchUnitService.setDepartureAirports(airport);\n this.$location.path('parking').search('source', 'MYB cross-sell');\n });\n }\n }\n\t}\n\n\tangular\n\t\t.module('core')\n\t\t.service('crossSellCommonService', CrossSellCommonService);\n}\n","'use strict';\n\nnamespace Core.Customer {\n\n import CrossSellType = Core.Booking.CrossSellType;\n import BookedTrip = Core.ManageBooking.BookedTrip;\n import TripStage = Core.ManageBooking.TripStage;\n import DestinationContentCard = Core.Destinations.DestinationContentCard;\n\n angular\n .module('core')\n .service('customerDashboardService', CustomerDashboardService);\n\n export interface CustomerDashboardService {\n rehydrateHotelForHotelCard(estabId: number): ng.IPromise;\n getRecentSearches(max: number): ng.IPromise;\n getLastViewedHotel(): ng.IPromise;\n getAllCrossSellOptions(bookingId: number): ng.IPromise;\n getTemplateForDashboard(trip: BookedTrip|null): string;\n getTemplateForPlaceholder(type: DashboardTileType): string;\n trackDashboardLoad(trip: BookedTrip|null, tiles: any): void;\n trackDashboardClick(position: number, type: DashboardTileType): void;\n getDestinationExcludingSearch(search: any, destinations: DestinationContentCard[]): DestinationContentCard;\n }\n\n function CustomerDashboardService (\n $http: ng.IHttpService,\n $q: ng.IQService,\n $interpolate: ng.IInterpolateService,\n $rootScope: any,\n flightSearch: any,\n hotelService: any,\n imageService: any,\n destinationService: any,\n crossSellCommonService: any,\n flightExtrasService: any,\n bookingActionLink: any,\n hotelRehydrator: any,\n savedSearchService: any,\n searchTypesService: any,\n recentHotels: any,\n bookingsManagerService: ManageBooking.BookingsManagerService,\n analytics: any\n ) : CustomerDashboardService {\n\n const service: CustomerDashboardService = {\n rehydrateHotelForHotelCard,\n getRecentSearches,\n getLastViewedHotel,\n getAllCrossSellOptions,\n getTemplateForDashboard,\n getTemplateForPlaceholder,\n trackDashboardLoad,\n trackDashboardClick,\n getDestinationExcludingSearch\n };\n\n function getAllCrossSellOptions(bookingId: number): ng.IPromise {\n let promises: ng.IPromise[] = [];\n\n promises.push(crossSellCommonService.getBookingCrossSell(bookingId));\n promises.push(flightExtrasService.getExtrasCrossSell(bookingId));\n\n let crossSellOptions: CrossSellOption[] = [];\n let hotelPromise: ng.IPromise = $q.when();\n\n return $q.all(promises).then(([crossSells, flightExtras]) => {\n\n if (crossSells && crossSells.data) {\n\n _.forOwn(crossSells.data, (product: any, key: string) => {\n\n if (product && (key !== 'Priorities')) {\n\n // build cross sell option\n let type: CrossSellType = crossSellTypeByCrossSellKey[key],\n minPrice: number = 0,\n imageUrl: string = '',\n title: string = '';\n\n // this is the original product (required for onward journey to remain compatible with MYB)\n product.CrossSellType = type;\n\n if (type === CrossSellType.CarHire ||\n type === CrossSellType.Parking ||\n type === CrossSellType.Transfers) {\n // use cheapest option\n minPrice = _.minBy(product.CrossSells, (cs: any) => cs.Price.Value).Price.Value;\n }\n\n if (type === CrossSellType.Attractions) {\n // use first attraction option\n const cs: any = _.head(product.CrossSells);\n minPrice = cs.AdultPrice.Value;\n imageUrl = `/attractions/Handlers/crosssellimage.ashx?acsid=${cs.Id}`;\n title = cs.Title;\n }\n\n if (type === CrossSellType.Hotels) {\n // use first hotel option\n const cs: any = _.head(product.CrossSells);\n // we need to get additional hotel info before we return the cross sells\n hotelPromise = rehydrateHotelForHotelCard(cs.EstabId);\n return; //we will add this in after the promise completes as it is a different structure\n }\n\n crossSellOptions.push(\n new CrossSellProductOption(\n bookingId,\n type,\n product.CrossSellType === CrossSellType.Transfers\n || product.CrossSellType === CrossSellType.Attractions,\n minPrice,\n imageUrl,\n product,\n title\n )\n );\n }\n });\n\n // build cross sell options for flight extras\n _.forEach(flightExtras, extra => {\n crossSellOptions.push(\n new CrossSellFlightExtraOption (\n bookingId,\n extra.CrossSellType,\n true,\n extra.Price.Value,\n $interpolate(bookingActionLink.get()[extra.Name])(_.pick(extra, 'BookingId'))\n )\n );\n });\n\n return hotelPromise.then((hotel: Hotels.StaticHotel) => {\n if (hotel) {\n const product = crossSells.data.Hotels;\n const cs :any = _.find(product.CrossSells, { 'EstabId' : hotel.Id });\n\n product.Url = cs.Url; // use hotel landing page Url\n\n crossSellOptions.push(\n new CrossSellHotelOption(\n bookingId,\n CrossSellType.Hotels,\n false,\n cs.Price.Value,\n '',\n product,\n hotel.Title,\n hotel\n )\n );\n\n }\n return crossSellOptions;\n });\n\n }\n\n });\n\n }\n\n function getRecentSearches(max: number): ng.IPromise {\n // Restrict search types to Hotels/Holidays/Flights\n const searchTypes = [\n searchTypesService.searchType.Flight,\n searchTypesService.searchType.Hotels,\n searchTypesService.searchType.Holidays\n ];\n return savedSearchService.getSavedSearches(searchTypes).then(searches => {\n return _.take(searches, max);\n });\n }\n\n function getLastViewedHotel(): ng.IPromise {\n return recentHotels.getIds().then((ids: number[]) => {\n return ids.length > 0 ? rehydrateHotelForHotelCard(ids[0]) : $q.when();\n });\n }\n\n function rehydrateHotelForHotelCard(estabId: number): ng.IPromise {\n return hotelRehydrator.hotels([estabId], {\n fields: [\n 'Id',\n 'Title',\n 'Province',\n 'Country',\n 'StarRating',\n 'CustomerRating',\n 'CustomerRatingTitle',\n 'CustomerRatingCount',\n 'Url',\n 'IndicativeMinPrice'\n ],\n imageWidth: TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize,\n imageHeight: TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize\n }).then((hotels: Hotels.StaticHotel[]) => {\n return hotels[0];\n });\n }\n\n function getTemplateForDashboard(trip: BookedTrip|null): string {\n const templateSuffix = trip\n ? TripStage[trip.TripStage]\n : 'NoTrip';\n return `partials/customer/CustomerDashboard${templateSuffix}`;\n }\n\n function getTemplateForPlaceholder(type: DashboardTileType): string {\n return `partials/customer/Placeholder${DashboardTileType[type]}`;\n }\n\n function trackDashboardLoad(trip: BookedTrip|null, tiles: any): void {\n const tripData = trip\n ? {\n MainBookingId: trip.MainBookingId,\n TripStage: TripStage[trip.TripStage],\n HasFlight: trip.FlightBooking ? true : false,\n HasHotel: trip.HotelBooking ? true : false,\n HasTransfer: trip.TransferBooking ? true : false,\n HasCarHire: trip.CarHireBooking ? true : false,\n HasAttractions: trip.AttractionsBooking ? true : false,\n HasParking: trip.AirportParkingBooking ? true : false,\n HasInsurance: trip.InsuranceBooking ? true : false\n }\n : null;\n const data = {\n SignedIn: $rootScope.user.SignedIn,\n Trip: tripData,\n Tiles: _.mapValues(tiles, (type: DashboardTileType) => {\n return DashboardTileType[type];\n })\n };\n analytics.track(\n 'mixpanel',\n 'CustomerDashboardLoad',\n data\n );\n }\n\n function trackDashboardClick(position: number, type: DashboardTileType): void {\n const data = {\n position: position,\n type: DashboardTileType[type]\n };\n analytics.track(\n 'mixpanel',\n 'CustomerDashboardClick',\n data\n );\n\n }\n\n function getDestinationExcludingSearch(\n search: any,\n destinations: DestinationContentCard[]\n ): DestinationContentCard {\n let searchDestination: any = _.get(search, 'DisplayDetails.Destinations[0]');\n if (!searchDestination && destinations) {\n return destinations[0];\n }\n // return the first destination which doesn't match the destination of the search\n return _.find(destinations, (dest: DestinationContentCard) => {\n return dest.Id !== searchDestination.Id && dest.Type !== searchDestination.Type;\n });\n }\n\n return service;\n }\n}\n","namespace Core {\n angular\n .module('core')\n .config(($provide, $httpProvider) => {\n\n $provide.factory('domainIdHeaderInterceptor', () => ({\n request(config) {\n if(config && config.headers) {\n config.headers['x-domain-id'] = TRPCONFIG.Domain.DomainId;\n }\n return config;\n }\n }));\n\n if ($httpProvider.interceptors.indexOf('domainIdHeaderInterceptor') < 0) {\n $httpProvider.interceptors.push('domainIdHeaderInterceptor');\n }\n });\n}\n","namespace Core {\n export interface IFidParser {\n parse(): number | null;\n }\n\n function fidParser ($location) : IFidParser {\n return {\n parse : () => {\n let fid = $location.search().fid;\n if (!fid && (TRPCONFIG.Domain.UseIdBasedUrls)) {\n let path = ($location.path() || '').match(/(?:\\d+-\\d+-\\d+-)(\\d+)/);\n if (path && path[1]) {\n fid = path[1];\n }\n }\n\n fid = fid === '0' || fid === 0 ? null : fid;\n return fid == null ? null : _.toNumber(fid);\n }\n };\n }\n\n angular\n .module('core')\n .service('fidParser', fidParser);\n\n}\n","namespace Core {\n export 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\n export interface FieldGroupService {\n getFieldGroup(...args: FieldType[]);\n getFieldTypes();\n }\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .factory('funcUtil', funcUtil);\n\nfunction funcUtil($timeout, $q, $rootScope) {\n const service = {\n memoize,\n debounce,\n waitForValue,\n compose\n };\n\n function has(obj, key) {\n return obj != null && obj.hasOwnProperty(key);\n }\n\n function memoize(func, hasher) {\n const m = function(...args) {\n const key = args[0];\n const cache = m.cache;\n const address = `${hasher ? hasher(...args) : key}`;\n if (!has(cache, address)) {\n cache[address] = func(...args);\n }\n return cache[address];\n };\n m.cache = {};\n return m;\n }\n\n function compose(...args) {\n return function(x) {\n let retVal = x;\n for (let i = args.length - 1; i >= 0; i--) {\n retVal = args[i](retVal);\n }\n return retVal;\n };\n }\n\n /* This is a little bit tricksy in that you call debounce and it *returns* you the function\n that you want to debounce. */\n function debounce(fn, delay) {\n let timer;\n return function(...args) {\n if (timer != null) {\n $timeout.cancel(timer);\n }\n timer = $timeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n }\n\n\n function waitForValue(factory) {\n const initalValue = factory();\n if (initalValue) {\n return $q.when(initalValue);\n }\n const defered = $q.defer();\n const watch = $rootScope.$watch(factory, val => {\n if (val) {\n watch();\n defered.resolve(val);\n }\n });\n return defered.promise;\n }\n\n return service;\n}\n})();\n","'use strict';\n\nnamespace Core.Hotels {\n\n /*\n Describes services for a single hotel e.g. hotel information and reviews\n */\n angular\n .module('core')\n .service('hotelService', hotelService);\n\n export interface HotelService {\n //TODO - temporarily we will return HotelWithRooms but really this should be split into two\n //separate functions I think. Not even sure that it is right to extend StaticHotel with rooms\n //rather than just have a separate HotelAvailability interface?\n getHotel(searchId : string|null|undefined,\n estabId : number,\n tripId? :string): ng.IPromise;\n getHotelDetails(req : DetailsRequest): ng.IPromise
            ;\n rehydrate(detailsId: string): ng.IPromise;\n getUrl(): string;\n trackHotelClick(estabId: number,\n hotelIndex: number,\n boostReason: BoostReason,\n sortCriterion: number,\n searchId?: string): void;\n getPaginationMode(destinationId: string): boolean;\n getSimilarHotels(estabId : number): Promise;\n }\n\n function hotelService(hotelFromSession: HotelFromSessionService,\n $filter,\n $http : IHttpService,\n $q : ng.IQService,\n imageService,\n broker: Broker,\n $cacheFactory : ng.ICacheFactoryService,\n tripService: TripService,\n $routeParams,\n fieldGroupService : FieldGroupService,\n cmsService) {\n\n const domain = TRPCONFIG.Domain;\n const url: string = '/api/hotels/';\n const hotelInfoCache = $cacheFactory('hotelInfoCache');\n const promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\n\n const service : HotelService = {\n getUrl,\n getHotelDetails,\n //This is used to rehydrate the basket's hotel product\n rehydrate,\n getHotel,\n trackHotelClick,\n getPaginationMode,\n getSimilarHotels\n };\n\n const fieldFlags = fieldGroupService.getFieldGroup(\n FieldType.Global,\n FieldType.Titles,\n FieldType.IndicativePrice,\n FieldType.ReviewSnippets,\n FieldType.Description,\n FieldType.Url,\n FieldType.Summary,\n FieldType.Characteristics,\n FieldType.Distances,\n FieldType.Facilities,\n FieldType.RoomDetails,\n FieldType.LegacyFacilities,\n FieldType.Recommendations,\n FieldType.EstabGroupIds,\n FieldType.Airports,\n FieldType.AltTitles,\n FieldType.HotelAwards\n );\n\n const fieldTypes = fieldGroupService.getFieldGroup(\n FieldType.Global,\n FieldType.Titles,\n FieldType.Url,\n FieldType.EstabGroupIds,\n );\n\n function getUrl(): string {\n return url;\n }\n\n function getHotelDetails(req : DetailsRequest): ng.IPromise
            {\n return $http.post
            (url +'details/getdetails', req, {\n customErrCallback() {\n broker.publish('hotelDetailCallFailed', req);\n return true;\n }\n }).then(function (res) {\n return res.data;\n });\n }\n\n function rehydrate(detailsId: string): ng.IPromise {\n if (!promiseCache.get>(detailsId)) {\n promiseCache.put(detailsId,\n $http.post
            (url + 'details/getdetailsbyid', {DetailsId: detailsId})\n .then(function (res) {\n return service.getHotel(null, res.data.Itinerary.EstabId, $routeParams.tripId)\n .then((h: HotelWithRooms) => {\n return angular.extend({}, h, res.data);\n });\n }));\n }\n return promiseCache.get>(detailsId);\n }\n\n function getHotel(searchId : string|null|undefined, estabId : number, tripId? :string)\n : ng.IPromise {\n const promises : ng.IPromise[] = [];\n\n if (searchId && tripId) {\n promises.push(hotelFromSession.getHotel(searchId, estabId, tripId));\n } else {\n promises.push(\n hotelInfoCache.get(String(estabId)) ||\n $http.get(url+ 'static/gethotel', {\n params: {\n fieldsX: 'MinCost,OriginalCost',\n Id: estabId,\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId,\n FieldFlags: fieldFlags\n },\n cache: true\n })\n );\n }\n\n promises.push(tripId ? tripService.getCurrency(tripId) : $q.when());\n\n if (TRPCONFIG.Domain.OverrideHotelInformationFromCms) {\n promises.push(cmsService.getHotelInformation(estabId));\n }\n\n return $q.all(promises)\n .then(function (results) {\n const hotel = _.assign({}, results[0].data || results[0]);\n const currency = results[1] || TRPCONFIG.Domain.CurrencyCode;\n const cmsHotelInformation = results[2];\n hotelInfoCache.put(String(estabId), hotel);\n hotel.ImageUrl = imageService.getMainImageUrl(estabId,\n TRPCONFIG.DeviceSettings.HotelDetailImageSize,\n TRPCONFIG.DeviceSettings.HotelDetailImageSize,\n true);\n hotel.ObjectTypeId = 1;\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice, currency);\n hotel.HasReviewSnippets = !_.isEmpty(hotel.ReviewSnippets);\n\n if (cmsHotelInformation) {\n hotel.HotelName = cmsHotelInformation.HotelName;\n hotel.Address = cmsHotelInformation.Address;\n let imageList: any[]|null = _.get(cmsHotelInformation, 'ImageUrls', []);\n if(imageList && imageList.length > 0){\n imageList = imageList.filter((e) => {\n if (e != null) {\n return e;\n }\n });\n }\n hotel.CmsImageUrls = imageList && imageList.length > 0 ? imageList : null;\n hotel.Description = cmsHotelInformation.ReplaceDefaultDescription ?\n cmsHotelInformation.Description :\n hotel.Description + cmsHotelInformation.Description;\n hotel.IsPlatinumHotel = cmsHotelInformation.IsPlatinumHotel;\n hotel.HideFacilitiesList = cmsHotelInformation.HideFacilitiesList;\n hotel.HideRoomFacilitiesList = cmsHotelInformation.HideRoomFacilitiesList;\n hotel.IsBoutiqueHotel = cmsHotelInformation.IsBoutiqueHotel;\n hotel.IsDsfHotel = cmsHotelInformation.IsDsfHotel;\n }\n\n //various other bits of code assume that the rooms array will always exist\n if(hotel.Rooms == null) {\n hotel.Rooms = [];\n }\n\n return hotel;\n });\n }\n\n function trackHotelClick(\n estabId: number,\n hotelIndex: number,\n boostReason: BoostReason,\n sortCriterion: number,\n searchId: string): void\n {\n $http.post('/api/useractions/selections', {\n Type: 2,\n EstabId: estabId,\n DomainId: _.get(TRPCONFIG, 'Domain.DomainId'),\n SearchResultsIndex: hotelIndex,\n SortCriterion: sortCriterion,\n BoostReason: boostReason,\n SearchId: searchId\n }, {ignoreErrors: true});\n }\n\n async function getSimilarHotels(estabId: number): Promise {\n const config = {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n EstabId: estabId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n Radius: 10,\n ResultsToTakeFromNearestHotels: 3,\n ResultsToTakeFromSeoRanking: 3,\n FieldFlags: fieldTypes,\n FilterCriteria: {\n Stars: [3, 4, 5],\n MinNumberOfRatings: 1,\n OnlyShowAvailable: true\n },\n PageStrand: 1\n })\n };\n const response = await fetch('/api/hotels/static/gethotelalternatives', config);\n\n if (!response.ok) {\n throw Error(response.statusText);\n }\n\n const data = await response.json();\n\n return data || [];\n }\n\n\n function getPaginationMode(destinationId: string): boolean {\n if (domain.PagingDisabled) {\n return domain.PagingDisabledForDestinations.find( id => id === destinationId );\n }\n return false;\n }\n\n return service;\n }\n}\n","'use strict';\n\nnamespace Core.Hotels {\n\n angular.module('core')\n .service('hotelFromSession', hotelFromSession);\n\n type FieldType = Core.FieldType;\n type IHttpService = Core.IHttpService;\n type FieldGroupService = Core.FieldGroupService;\n type ILoggingService = Core.ILoggingService;\n\n export interface HotelFromSessionService {\n getHotel(searchId: string, estabId: number, tripId: string): ng.IPromise;\n getRoomTypes(estabId: number, searchId: string, boardTypeFilter: BoardType[]);\n }\n\n//this is an internal representation of the hotel withrooms that is returned by the api\n//to the extent that we care about the types. Mostly this is required to gloss over the\n//flattening of the rooms structure\n interface ApiHotelWithRooms {\n RequestedRooms: RequestedRoom[];\n }\n\n interface RequestedRoom {\n BoardTypeMinPrices: BoardTypeMinPriceFull[];\n Availability: ApiRoomAvailability[];\n }\n /*\n This exists to retrieve a single hotel's availability results from the cache.\n It is used by the map directive for showing information windows and is also used\n by the hotel page when in search mode. Calls are cached for the duration of a user's\n session\n */\n function hotelFromSession($filter,\n $location: ng.ILocationService,\n $http: IHttpService,\n $cacheFactory: ng.ICacheFactoryService,\n $q: ng.IQService,\n imageService,\n $injector,\n $timeout: ng.ITimeoutService,\n tripService: TripService,\n fieldGroupService: FieldGroupService,\n loggingService: ILoggingService,\n occupancyService: Core.OccupancyService) {\n const cache = $cacheFactory('hotelfromSessionCache');\n\n const service: HotelFromSessionService = {\n getHotel,\n getRoomTypes\n };\n\n const fieldFlags = fieldGroupService.getFieldGroup(\n FieldType.Global,\n FieldType.Titles,\n FieldType.IndicativePrice,\n FieldType.ReviewSnippets,\n FieldType.Description,\n FieldType.Url,\n FieldType.Summary,\n FieldType.Characteristics,\n FieldType.Distances,\n FieldType.Facilities,\n FieldType.LegacyFacilities,\n FieldType.RoomDetails,\n FieldType.Pricing,\n FieldType.RoomAvailability,\n FieldType.Recommendations,\n FieldType.EstabGroupIds,\n FieldType.Airports,\n FieldType.HotelAwards\n );\n\n function getSkywardsTier() {\n const SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\n const Tier = (SkywardsLoginUser && SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\n SkywardsLoginUser.data.Contact.Tier : null;\n return Tier;\n }\n\n function getHotel(searchId: string, estabId: number, tripId: string): ng.IPromise {\n return _getHotelFromSession(searchId, estabId, tripId);\n }\n\n function getRoomTypes(estabId: number, searchId: string, boardTypeFilter: BoardType[]) {\n const url = '/api/hotels/availability/gethotel';\n const flags = fieldGroupService.getFieldGroup(\n FieldType.RoomAvailability, FieldType.RoomDetails, FieldType.LegacyFacilities\n );\n let request: any = {\n Id: estabId,\n AvailabilitySearchId: searchId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n FieldFlags: flags\n };\n\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\n request.LoyaltyInfo = {\n SkywardsTier: getSkywardsTier()\n };\n }\n\n return $http.post(url, request)\n .then(res => res.data)\n .then(res => {\n if (!res || !res.RequestedRooms) {\n return [];\n }\n return res.RequestedRooms[0].Availability.map(r => {\n _.assignIn(r, {\n RoomDetails: _.find(res.RoomDetails, rd => rd.MasterId === r.MasterId)\n });\n\n const uniqBoardTypes = {};\n r.BoardOptions.forEach(bt => {\n const current = uniqBoardTypes[bt.BoardType];\n // is the unique cheapest boardType\n // is in the filtered boardtypes if defined\n if ((!current || current.Cost > bt.Cost) &&\n (!boardTypeFilter.length || boardTypeFilter.indexOf(bt.BoardType) > -1)) {\n uniqBoardTypes[bt.BoardType] = bt;\n }\n });\n\n r.BoardOptions = _.values(uniqBoardTypes);\n\n return r;\n }).filter(r => r.BoardOptions.length > 0);\n });\n }\n\n function _createCacheKey({DiscountCode, Id, AvailabilitySearchId, BoardTypesFilter}) {\n return `${DiscountCode},${Id}, ${AvailabilitySearchId}, ${BoardTypesFilter.sort().join('')}`;\n }\n\n function _getHotelFromSession(searchId: string,\n estabId: number,\n tripId: string): ng.IPromise {\n const hs = $injector.get('hotelSearch'); //this is absolutely fine. Not dodgy at all.\n const url = '/api/hotels/availability/gethotel';\n let request: any = {\n Id: estabId,\n AvailabilitySearchId: searchId,\n CultureCode: TRPCONFIG.Domain.OverrideAPIHotelsCulture ?\n TRPCONFIG.Domain.DefaultPosCultureCode : TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n BoardTypesFilter: hs.getFilter().BoardTypes,\n FieldFlags: fieldFlags,\n DiscountCode: TRPCONFIG.DiscountCode,\n TripId: tripId\n };\n\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\n request.LoyaltyInfo = {\n SkywardsTier: getSkywardsTier()\n };\n }\n\n const cacheKey = _createCacheKey(request);\n const cachedHotel = cache.get(cacheKey);\n if (cachedHotel && TRPCONFIG.Domain.DefaultHotelDates) {\n return $q.when(cachedHotel);\n } else {\n // Updated AvailabilitySearchID after adjust Dates (Nights Allocation)\n tripService.getTrip(tripId).then(function(trip) {\n trip && trip.HotelsRequest ? request.AvailabilitySearchId =\n trip.HotelsRequest.AvailabilitySearchId : '';\n });\n }\n\n const d = $q.defer();\n const start = new Date().getTime();\n const interval = 1000;\n const timeout = 60000;\n let goneResponses = 0;\n return $q.all([\n tripService.getCurrency(tripId),\n tripService.getHotelsRequestNumberOfNights(tripId),\n tripService.getTripOccupancy(tripId),\n tripService.isKidsFree(tripId)\n ]).then(([c, n, o, k]) => {\n request.CurrencyCode = c || TRPCONFIG.Domain.CurrencyCode;\n $http.get('/api/hotels/boardtypes/inclusions').then(\n res => {\n sessionStorage.setItem('incExcList', JSON.stringify(res.data));\n getResult(c, n, o, k);\n }, err => {\n sessionStorage.setItem('incExcList', JSON.stringify([]));\n getResult(c, n, o, k);\n }\n );\n\n $http.get('/api/hotels/boardtypes/get').then(\n res => {\n let formatedData:any = [];\n for (let i = 0; i < res.data.length; i ++) {\n let data = res.data[i];\n let title = res.data[i].Title;\n\n if (title) {\n data.Title = title.toLowerCase();\n formatedData.push(data);\n }\n }\n\n sessionStorage.setItem('boardList', JSON.stringify(formatedData));\n TRPCONFIG.Domain.BoardTypes = JSON.stringify(formatedData);\n }, err => {\n sessionStorage.setItem('boardList', JSON.stringify([]));\n }\n );\n return d.promise;\n });\n\n function getResult(currency: string, nights: number, occupancy: any, isKidsFree: boolean = false) {\n $http.post(url, request, {ignoreErrors: true})\n .then(_processHotelFactory(d, estabId, cacheKey, currency, nights, occupancy, isKidsFree),\n _handleErrors);\n }\n\n function _handleErrors(res): void | ng.IPromise {\n switch (res.status) {\n case 404:\n return _notFound();\n case 410:\n return _gone();\n }\n return $q.when();\n }\n\n function logMissing(code) {\n tripService.getHotelsRequest(tripId).then(req => {\n loggingService.logWarn(\n `${code} received getting hotel from session for request:\n ${req ? JSON.stringify(req) : null}`);\n });\n }\n\n function _notFound(): void | ng.IPromise {\n const now = new Date().getTime();\n if (now - start < timeout) {\n $timeout(getResult, interval); //recurse\n return $q.reject();\n }\n //resolve even in case of no results!\n logMissing('404');\n return d.resolve();\n }\n\n function _gone() {\n if (goneResponses === 0) {\n goneResponses += 1;\n $timeout(getResult, interval); //recurse\n return $q.reject();\n }\n logMissing('410');\n d.reject();\n $location.path('hotels/notfound');\n }\n }\n\n function _processHotelFactory(d: ng.IDeferred,\n estabId: number,\n cacheKey: string,\n currency: string,\n nights: number,\n occupancy: any,\n isKidsFree: boolean = false) {\n return (result: ng.IHttpPromiseCallbackArg) => {\n let hotel: HotelWithRooms;\n\n if (result.data != null) {\n const dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\n const numPeoplePaying = isKidsFree\n ? occupancyService.getOnlyPayingIndividuals()\n : occupancyService.getNumberOfNonInfantPassengers();\n\n hotel = _formatHotelData(result.data, occupancy);\n hotel.ImageUrl = imageService.getMainImageUrl(estabId, dim, dim);\n hotel.MinCostStr = $filter('roundedCurrency')(hotel.MinCost, currency);\n hotel.OriginalCostStr = $filter('roundedCurrency')(hotel.OriginalCost, currency);\n\n hotel.MinCostPerNight = hotel.MinCost / nights;\n hotel.MinCostPerPerson = hotel.MinCost / (numPeoplePaying || 1);\n hotel.MinCostPerPersonPerNight = hotel.MinCostPerPerson / nights;\n\n hotel.OriginalCostPerNight = hotel.OriginalCost / nights;\n hotel.OriginalCostPerPerson = hotel.OriginalCost / (numPeoplePaying || 1);\n hotel.OriginalCostPerPersonPerNight = hotel.OriginalCostPerPerson / nights;\n\n hotel.MinCostStr =\n $filter('roundedCurrency')(hotel.MinCost, currency);\n hotel.MinCostPerNightStr =\n $filter('roundedCurrency')(hotel.MinCostPerNight, currency);\n hotel.MinCostPerPersonPerNightStr =\n $filter('roundedCurrency')(hotel.MinCostPerPersonPerNight, currency);\n\n hotel.OriginalCostStr =\n $filter('roundedCurrency')(hotel.OriginalCost, currency);\n hotel.OriginalCostPerNightStr =\n $filter('roundedCurrency')(hotel.OriginalCostPerNight, currency);\n hotel.OriginalCostPerPersonPerNightStr =\n $filter('roundedCurrency')(hotel.OriginalCostPerPersonPerNight, currency);\n\n hotel.LowDepositValue = 0;\n hotel.IsPayAtHotelOnly = true;\n\n hotel.Rooms.filter(rr => !_.isEmpty(rr.Availability))\n .forEach((rr: HotelRoom, i) => {\n let minRoomDeposit = 0;\n let cheapest: RoomAvailability | undefined;\n _.forEach(rr.Availability, (room: RoomAvailability) => {\n room.CostPerNight = room.Cost / nights;\n room.OriginalCostPerNight = room.OriginalCost / nights;\n if (hotel.IsPayAtHotelOnly && room.IsPayAtHotel === false) {\n hotel.IsPayAtHotelOnly = false;\n }\n if (room.LowDepositValue\n && (!minRoomDeposit || room.LowDepositValue < minRoomDeposit)) {\n minRoomDeposit = room.LowDepositValue;\n }\n if (!cheapest || cheapest.Cost > room.Cost) {\n cheapest = room;\n }\n });\n\n if (cheapest !== undefined) {\n cheapest.IsCheapest = true;\n }\n\n if (minRoomDeposit) {\n hotel.LowDepositValue = hotel.LowDepositValue + minRoomDeposit;\n }\n });\n\n cache.put(cacheKey, hotel);\n d.resolve(hotel);\n return hotel;\n }\n d.resolve();\n return null;\n };\n }\n\n function _formatHotelData(data: ApiHotelWithRooms, occupancy: any): HotelWithRooms {\n // Convert room data in response to flat list\n let hotel = _.assign({}, data);\n const incExcList = JSON.parse(sessionStorage.getItem('incExcList') || '[]');\n hotel.Rooms = _.map(data.RequestedRooms, (rr, i) => {\n const availableRoomsList: RoomAvailability[] = [];\n\n function boardOptionMapping(option, incExcList) {\n option.map(boardOption => {\n const item = incExcList\n .find(item => {\n if (item.Id === boardOption.InclusionId) {\n boardOption.Title =\n item.Title.replace('{0}', boardOption.ReplacementText || '');\n }\n });\n return boardOption;\n });\n }\n\n rr.Availability.forEach(room => {\n room.BoardOptions.forEach(option => {\n if (incExcList && incExcList.length > 0) {\n if (option.BTInclusions && option.BTInclusions.length > 0) {\n boardOptionMapping(option.BTInclusions, incExcList);\n }\n if (option.BTExclusions && option.BTExclusions.length > 0) {\n boardOptionMapping(option.BTExclusions, incExcList);\n }\n }\n\n const ra: RoomAvailability =\n _.omit(room, 'BoardOption');\n availableRoomsList.push(\n _.assign(\n {},\n option,\n ra)\n );\n });\n });\n\n return {\n Title: occupancyService.getOccupancyStringForRoom(i, occupancy),\n Availability: availableRoomsList\n };\n });\n\n return hotel;\n }\n\n return service;\n }\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .factory('paymentsService', PaymentsService);\n\nfunction PaymentsService($http,\n $q,\n $routeParams,\n tokeniser,\n tripService) {\n const _clientServerCardsMap = {};\n const _cardsUrl = '/api2/payments/cards';\n const _userCardUrl = '/api2/payments/cards/customer/';\n const _enbdCardUrl = '/api2/bookings/';\n const payPalResponses = {\n cancel: 'PAYPALCANCELLED',\n fail: 'PAYPALFAILED'\n };\n const enbdOptionId = TRPCONFIG.Domain2.EnbdPaymentOptionId;\n\n const service = {\n checkCardNumber,\n checkCardNumberV2,\n getScheme,\n getCardFromId,\n getCardTitle,\n getLogosList,\n addCardDetails,\n removeCard,\n generateTokens,\n getSavedBookingCards,\n getEmptyPaymentDetails,\n getPayPalResponseMessage,\n cpgValidation,\n resendOtpConfirmation,\n verifyOtp\n };\n\n function getCardFromId(paymentOptions, cardId) {\n for (let i = 0, ii = paymentOptions.length; i < ii; i++) {\n //CardTypeId has been renamed to Id in new API.\n if (paymentOptions[i].CardTypeId === cardId || paymentOptions[i].Id === cardId) {\n return paymentOptions[i];\n }\n }\n }\n\n function getScheme(cardNumber) {\n return $http.get(\n `${_cardsUrl}/getscheme?cardNumber=${cardNumber}`,\n { cache: true, ignoreErrors: true }\n );\n }\n\n function getLogosList(paymentOptions) {\n //Removing getpaymentoptions as it became obsolete\n const logos = {\n amex: ['american express'],\n bitcoin: ['bitcoin'],\n dankort: ['dankort'],\n diners: ['diners card'],\n discover: ['discover'],\n maestro: ['maestro'],\n mastercard: ['mastercard'],\n paypal: ['paypal'],\n visa: ['visa', 'connect'],\n external: ['offline']\n };\n\n return _.filter(Object.keys(logos), key => _.some(logos[key], cardName => _.some(paymentOptions,\n option => _.includes(_.toLower(option.Title || option.Name), cardName))));\n }\n\n function checkCardNumberV2(paymentOptions, cardNumber, cardType) {\n //To support new payment option structure, not changing the old one\n if (cardNumber != null) {\n cardNumber = cardNumber.replace(/ /g, '').replace(/-/g, '');\n }\n\n if (TRPCONFIG.Domain.CardNumberCheckEnabled) {\n for (let i = 0, ii = paymentOptions.length; i < ii; i++) {\n //Check with master card type\n if (paymentOptions[i].CardType === cardType) {\n if (paymentOptions[i].FeePercent > 0 || paymentOptions[i].FeeAmount > 0) {\n return $q.when();\n }\n }\n }\n }\n\n const result = getScheme(cardNumber);\n\n return result.then(function(res) {\n const actualType = res.data;\n if (actualType !== parseInt(cardType)) {\n return $q.reject(actualType);\n }\n }, function() {\n return cardType;\n });\n }\n\n function checkCardNumber(paymentOptions, cardNumber, selectedCardId) {\n if (cardNumber != null) {\n cardNumber = cardNumber.replace(/ /g, '').replace(/-/g, '');\n }\n\n const result = $q.all([\n _mapPaymentsType(paymentOptions),\n $http.get(\n `${_cardsUrl}/getscheme?cardNumber=${cardNumber}`,\n { cache: true, ignoreErrors: true }\n )\n ]);\n\n return result.then(function _numberChecker(res) {\n const verifiedClientId = _clientServerCardsMap[res[1].data];\n if (!verifiedClientId) { return; }\n\n if (verifiedClientId !== parseInt(selectedCardId)) {\n return $q.reject(verifiedClientId);\n } else if (verifiedClientId === parseInt(selectedCardId)) {\n return $q.resolve(verifiedClientId);\n }\n }, function() {\n return selectedCardId;\n });\n }\n\n function getCardTitle(paymentOptions, cardTypeId) {\n //TODO: CardTypeId, Title needs to be removed once after booking page started using new booking options API.\n for (let i = 0, ii = paymentOptions.length; i < ii; i++) {\n //CardTypeId has been renamed to Id in new API.\n const cardType = paymentOptions[i].CardTypeId || paymentOptions[i].Id;\n if (cardType === cardTypeId) {\n //Title has been renamed to Name in new API.\n return paymentOptions[i].Title || paymentOptions[i].Name;\n }\n }\n }\n\n function _mapPaymentsType(cp) {\n return tripService.getCurrency($routeParams.tripId).then(cur => {\n const url = `${_cardsUrl}/gettypes` +\n `?domainId=${TRPCONFIG.Domain.DomainId\n }¤cyCode=${cur || TRPCONFIG.Domain.CurrencyCode}`;\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function _mergePaymentClientServer(res) {\n const sp = res.data;\n for (let i = 0, ii = sp.length; i < ii; i++) {\n const clientCard = _compareTitle(cp, sp[i].Title);\n if (clientCard) {\n _clientServerCardsMap[sp[i].CardType] = clientCard.CardTypeId;\n }\n }\n });\n });\n }\n\n function _compareTitle(paymentOptions, title) {\n for (let j = 0, jj = paymentOptions.length; j < jj; j++) {\n if (paymentOptions[j].Title === title) {\n return paymentOptions[j];\n }\n }\n }\n\n\n function addCardDetails(card, savedFrom) {\n const cardRequest = {\n MasterCardTypeId: card.paymentType,\n Number: card.CardNumber,\n MaskedCardNumber: card.MaskedCardNumber,\n ExpiryMonth: card.ExpiryDate.Month,\n ExpiryYear: card.ExpiryDate.Year,\n SavedFrom: savedFrom\n };\n\n return $http.post(`${_userCardUrl}set`, cardRequest, { ignoreErrors: true });\n }\n\n function removeCard(cardId) {\n return $http.post(`${_userCardUrl}remove`, { CardId: cardId });\n }\n\n function getSavedBookingCards(allowedCards) {\n const allBookingTypes = 0;\n return $http.post(`${_userCardUrl}getSavedBookingCards`, {\n domainId: TRPCONFIG.Domain.DomainId,\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\n bookingTypeId: allBookingTypes// 0 to get cards for all types of booking\n }, { ignoreErrors: true }).then(function(result) {\n let savedCards = result.data;\n\n if (savedCards.length > 0) {\n const filteredCardList = _.filter(savedCards, function(c) {\n return allowedCards[c.CardTypeId] !== undefined;\n });\n savedCards = _.map(filteredCardList, function(c) {\n c.Title = allowedCards[c.CardTypeId].Title;\n return c;\n });\n }\n return savedCards;\n }, function() {\n return null;\n });\n }\n\n function getEmptyPaymentDetails() {\n return {\n PaypalDetails: {\n //Not part of UserData contract in create booking\n IsPaypalPayment: false\n },\n CardDetails: {\n PaymentTypeId: 0,\n CardType: 0,\n CardNumber: null,\n StartDate: {\n Month: null,\n Year: null\n },\n ExpiryDate: {\n Month: null,\n Year: null\n },\n SecurityCode: null,\n IssueNumber: null,\n CardId: null,\n IsExpired: false\n },\n SaveThisCard: false\n };\n }\n\n function getPayPalResponseMessage(key) {\n return payPalResponses[key] || '';\n }\n\n function generateTokens(expiryMonth, expiryYear, saveCard) {\n //figure out if we need to generate tokens and if there should be an expiry\n //if pci compliant\n const requireTokens = TRPCONFIG.Domain.PCICompliant;\n\n const expiryDate = saveCard && expiryMonth !== 0 && expiryYear !== 0 ? new Date(expiryYear, expiryMonth) : null;\n\n if (saveCard && !expiryDate) {\n return $q.when(); //no point tokenising because the form is not valid\n }\n\n if (requireTokens) {\n return tokeniser.execute(expiryDate ? expiryDate.toISOString() : null);\n }\n return $q.when();\n }\n\n function cpgValidation(params) {\n const validationRequest = {\n CardNumber: params.cardNumber,\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n CardTypeId: enbdOptionId\n };\n return $http.post(`${_enbdCardUrl}validateenbdcardnumber`, validationRequest);\n }\n\n function resendOtpConfirmation(params) {\n const requestParams = {\n SessionToken: params.SessionToken,\n TransactionId: params.TransactionId,\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: params.domainId,\n CardTypeId: enbdOptionId\n };\n return $http.post(`${_enbdCardUrl}resendotp`, requestParams);\n }\n\n function verifyOtp(params) {\n const requestParams = {\n CardNumber: params.cardNumber,\n ClientCurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: params.domainId,\n CardTypeId: enbdOptionId,\n SessionToken: params.SessionToken,\n TransactionId: params.TransactionId,\n OTP: params.OTP\n };\n\n return $http.post(`${_enbdCardUrl}verifyotp`, requestParams);\n }\n\n\n return service;\n}\n})();\n","namespace Core {\n export interface BookingPaymentOption {\n AdminOverride: boolean;\n CardTypeId: number;\n DataCashScheme: string; //NOT USED\n FeeAmount: number;\n FeeCap: number;\n FeePercent: number;\n FullDetails: boolean;\n ImageUrl: string;\n IsBankPayment: boolean; //NOT USED\n IsExternalFop: boolean;\n IsPayPalPayment: boolean;\n PaymentTypeId: number;\n PreAuthorisationToken: string; //NOT USED\n Title: string;\n Type: string;\n }\n\n export interface BookingSavedCardOption {\n CardId: string;\n CardName: string;\n CardTypeId: number;\n ExpiryMonth: number;\n ExpiryYear: number;\n IsExpired: boolean;\n LogoName: string;\n MaskedNumber: string;\n MasterCardTypeId: number;\n }\n\n interface BookingCardDetails {\n CardId: string;\n CardNumber: string | null;\n CardType: number | null;\n ExpiryDate: {Month: number, Year: number};\n IssueNumber: string | null;\n MaskedCardNumber: string;\n PaymentTypeId: number;\n SecurityCode: string | null;\n StartDate: {Month: number, Year: number};\n }\n\n export interface BookingPaymentDetails {\n CardDetails: BookingCardDetails;\n SaveThisCard: boolean;\n }\n\n export interface MybPaymentOption {\n AdminOverride: boolean;\n CardType: number;\n FeeAmount: number;\n FeePercent: number;\n Id: number;\n IsExternalFop: boolean;\n Name: string;\n PaymentType: number;\n PreAuthorisationToken: string; //NOT USED\n }\n\n export interface MybSavedCardOption {\n CardId: string;\n CardName: string;\n ExpiryMonth: number;\n ExpiryYear: number;\n FullDetailsRequired: boolean;\n IsExpired: boolean;\n LogoName: string;\n MaskedNumber: string;\n MasterCardTypeId: number;\n }\n\n //Our final payment option shape\n enum PaymentType {\n CreditCard = 1,\n DebitCard = 2,\n PayPal = 14\n }\n\n export interface PaymentOption {\n AdminOverride: boolean;\n CardTypeId: number;\n FeeAmount: number;\n FeePercent: number;\n FullDetailsRequired: boolean;\n Id: number;\n Name: string;\n PaymentType: PaymentType;\n Title: string;\n IsExternalFop: boolean;\n IsPayPal: boolean;\n }\n\n export interface SavedCardOption {\n CardId: string;\n CardName: string;\n CardType: number;\n ExpiryMonth: number;\n ExpiryYear: number;\n FeeAmount: number;\n FeePercent: number;\n FullDetailsRequired: boolean;\n IsExpired: boolean;\n LogoName: string;\n MaskedNumber: string;\n MasterCardTypeId: number;\n PaymentTypeId: number;\n }\n\n //Our model that we populate using the directive\n interface CardDate {\n month: number;\n year: number;\n }\n\n interface CardDetail {\n cardNumber: string | undefined; //undefined to deal with PCI field setting this\n cardTypeId: number | undefined;\n expiryDate: CardDate;\n issueNumber: string;\n maskedNumber: string;\n paymentOptionId: number; //used in MYB land\n paymentTypeId: number;\n securityCode: string | undefined; //undefined to deal with PCI field setting this\n startDate: CardDate;\n isSavedCard: boolean;\n savedCardId: string;\n }\n\n export interface ExternalFopDetail {\n authorisationCode: string;\n note: string;\n }\n\n export interface PaymentModel {\n cardDetail: CardDetail;\n externalFop: ExternalFopDetail | undefined;\n fee: number;\n isPayPalPayment: boolean;\n saveCard: boolean;\n }\n\n export interface FinaliseOptionsRequest {\n BookingId: number;\n AmendBookingOptionsId: string;\n PaymentId: number;\n PaRes: string;\n MD: string;\n DomainId: number;\n CultureCode: string;\n };\n\n export interface PaymentsUtilService {\n createEmptyPaymentModel(): PaymentModel;\n createEmptyExternalFop(): ExternalFopDetail;\n convertBookingPaymentOptions(options: BookingPaymentOption[]): PaymentOption[];\n convertBookingSavedCards(savedOptions: BookingSavedCardOption[],\n paymentOptions: BookingPaymentOption[]): SavedCardOption[];\n convertMybPaymentOptions(options: MybPaymentOption[]): PaymentOption[];\n convertMybSavedCards(savedOptions: MybSavedCardOption[],\n paymentOptions: MybPaymentOption[]): SavedCardOption[];\n addPaymentDetailsToClearRequest(source: PaymentModel, target: any): void;\n copyCardDetailsToUserData(source: PaymentModel, target: BookingPaymentDetails): void;\n }\n}\n","(function() {\n'use strict';\n\nconst inTestingEnvironment = typeof __karma__ !== 'undefined';\n\nfunction decorate(service, $provide, $injector) {\n if (!$injector.has(service)) {\n return;\n }\n\n $provide.decorator(service, ['$delegate', '$q', function($delegate, $q) {\n const newService = inTestingEnvironment ? $delegate : Object.assign({}, $delegate);\n for (const fnName in $delegate) {\n const fn = $delegate[fnName];\n newService[fnName] = function(...args) {\n const res = fn(...args);\n return !inTestingEnvironment && res instanceof Promise ? $q.when(res) : res;\n };\n }\n return newService;\n }]);\n}\n\nangular\n .module('TR')\n .config(['$provide', '$injector', function($provide, $injector) {\n [\n 'agentModeService',\n 'animationUtil',\n 'basketCrossSellService',\n 'cmsService',\n 'destinationAirport',\n 'discountsService',\n 'flightDetail',\n 'flightSeatPlanService',\n 'flightStaticService',\n 'globalisationService',\n 'googleStaticMap',\n 'hotelStaticMapService',\n 'languageService',\n 'localStorageProvider',\n 'loggingService',\n 'postcodeService',\n 'primaryNavigationService',\n 'productService',\n 'publicityService',\n 'scrollService',\n 'urgencyMessaging'\n ].forEach(service => decorate(service, $provide, $injector));\n }]);\n\nangular\n .module('core')\n .config(['$provide', '$injector', function($provide, $injector) {\n [\n 'adHocService',\n 'flightsTerminalService'\n ].forEach(service => decorate(service, $provide, $injector));\n }]);\n})();\n","namespace Quote {\n\n type QuoteProductType = Quote.QuoteProductType;\n type IQuoteProductHotel = Quote.IQuoteProductHotel;\n type IQuoteProductFlight = Quote.IQuoteProductFlight;\n type IQuoteProductTransfer = Quote.IQuoteProductTransfer;\n type IQuoteProductCarHire = Quote.IQuoteProductCarHire;\n type IQuoteSearch = Quote.IQuoteSearch;\n type IQuotePriceDifference = Quote.IQuotePriceDifference;\n\n export class QuoteService {\n private domain: any;\n private url: string = '/api2/quotes/';\n\n private basketQuote: any = {};\n private cachedQuoteSearch: IQuoteSearch | null = null;\n\n constructor(\n private $http: ng.IHttpService,\n private $window: ng.IWindowService,\n private broker: Core.Broker,\n private $q: ng.IQService,\n private dateUtil: any,\n private basketStore,\n private brandedFareTypesService: ekh.BrandedFareTypesService,\n private localStorageProvider: any\n ) {\n this.domain = $window.TRPCONFIG.Domain;\n }\n\n setTrackingTag(tag: string) : ng.IPromise {\n return this.localStorageProvider.setItem('trackingTag', tag);\n }\n\n getTrackingTag(cb) : () => string | null | Error {\n return this.localStorageProvider.getItem('trackingTag', (error, value) => cb(value));\n }\n\n removeTrackingTag() : ng.IPromise {\n return this.localStorageProvider.removeItem('trackingTag');\n }\n\n getQuoteByReference(quoteRef: string): ng.IPromise {\n return this.$http.get(this.url + 'getbyreference'+'?reference=' + quoteRef + '&domainId=' +\n this.domain.DomainId + '&allowMultipleProductTypes=false', { ignoreErrors: true }).then((res) => {\n return res.data;\n });\n }\n\n public async getCancellationDetails() {\n let cancellation = await this.brandedFareTypesService.getCancellationCharges(TRPCONFIG.BasketId);\n TRPCONFIG.Domain.BrandedFareCancellations = cancellation;\n return cancellation;\n }\n\n refreshQuote(quoteId: string , productIds: string[] ): ng.IPromise {\n return this.$http.post(this.url + 'refreshproducts',\n { QuoteId: quoteId, ProductIds: productIds },\n { ignoreErrors: true }\n ).then((res) => {\n this.basketStore.destroyBasket();\n TRPCONFIG.BasketId = res.data.BasketId;\n if (sessionStorage.getItem('storeSelectedFlight') !== null) {\n this.getCancellationDetails();\n }\n this.broker.publish('quoteLoadedToBasket');\n return res.data;\n }, (res) => {\n return {Error: res.data};\n });\n }\n\n createQuote(basketId:string, sharedUseFlag, cache: boolean = true): ng.IPromise {\n if(this.basketQuote[basketId]) {\n return this.basketQuote[basketId];\n }\n return this.$q((res, rej) => {\n this.getTrackingTag(value => {\n let params: IQuoteCreateRequest = {\n BasketId: basketId,\n SharedUse: sharedUseFlag,\n QuoteId: '',\n TrackingTag: value\n };\n res(this.create(params, cache));\n });\n });\n }\n\n create(params: IQuoteCreateRequest, cache: boolean = true): ng.IPromise{\n params.DomainId = params.DomainId || this.domain.DomainId;\n params.CultureCode = params.CultureCode || this.domain.CultureCode;\n\n this.basketQuote[params.BasketId || ''] = this.$http.post(this.url + 'create', params, {\n cache,\n ignoreErrors: true\n }).then((res) => {\n this.removeTrackingTag();\n return res.data;\n }, (res) => {\n return {Error: res.data};\n });\n\n return this.basketQuote[params.BasketId || ''];\n }\n\n get(quoteId: string): ng.IPromise {\n return this.$http.get(this.url + 'get' + '?quoteId=' + quoteId,\n {cache: true, ignoreErrors : true}).then((res) => {\n return res.data;\n });\n }\n\n replaceProduct(quoteId: string, productId: string, replacementId): ng.IPromise {\n return this.$http.post(this.url+'replaceproduct', {\n QuoteId: quoteId,\n ProductId: productId,\n ReplacementId: replacementId\n }, { ignoreErrors: true }).then((res) => {\n return res.data;\n });\n }\n\n addBookings(quoteId: string, bookingIds: number[]): ng.IPromise{\n return this.$http.post(this.url+'addbookings', {\n QuoteId: quoteId,\n BookingIds: bookingIds\n }, { ignoreErrors: true }).then((res) => {\n return res.data;\n }, () => {\n return true;\n });\n }\n\n linkQuote(bookingReferences: string[], quoteId: string): ng.IPromise {\n if(quoteId){\n let bookingIds: number[] = bookingReferences.map(function(ref: string){\n return parseInt(ref.replace(/[^0-9]/gi, ''), 10);\n });\n return this.addBookings(quoteId, bookingIds);\n } else {\n return this.$q.when({});\n }\n }\n\n addNote(quoteId: string, noteText: string): ng.IPromise {\n return this.$http.post(this.url + 'addnote',\n { QuoteId: quoteId, NoteText: noteText },\n { ignoreErrors: true })\n .then((res) => {\n return res.data;\n }, () => {\n return this.$q.when({});\n });\n }\n\n private validateSearchModel(model: IQuoteSearchModel): boolean {\n const empty = v => !_.toString(v);\n\n const today = this.dateUtil.todayPlus(0, 0, true);\n\n const isDatesAreInRange = (start, end) =>\n !empty(start) && !empty(end) && this.dateUtil.dayDiff(start, end) <= 30;\n\n const isQuotedByDatesAreInRange = (start, end) =>\n (!empty(start) && this.dateUtil.dayDiff(start, today) <= 30)\n || isDatesAreInRange(start, end);\n\n return empty(model.quoteRef)\n && !isQuotedByDatesAreInRange(model.from,model.to)\n && empty(model.quotedById)\n && empty(model.userId)\n && empty(model.destination)\n && empty(model.externalAgentId)\n && empty(model.hotelName);\n }\n\n search(request: IQuoteSearchModel): ng.IPromise {\n this.cachedQuoteSearch = null;\n return this.validateSearchModel(request)\n ? this.$q.reject({ status: 400 })\n : this.$http.get(this.url + 'search?' + $.param(request),\n { ignoreErrors: true }).then((res: any) => {\n this.cachedQuoteSearch = {\n searchModel: request,\n searchResponse: res.data\n };\n return res.data;\n });\n }\n\n getCachedSearch():IQuoteSearch | null {\n return this.cachedQuoteSearch;\n }\n\n getTravelAgentNameForQuote(quote: Quote.IQuoteSearchResult): string | null {\n if (quote && (quote.TravelAgentFirstName || quote.TravelAgentLastName)) {\n return [quote.TravelAgentTitle, quote.TravelAgentFirstName, quote.TravelAgentLastName]\n .filter(i => null != i).join(' ');\n }\n return null;\n }\n\n getCustomerNameForQuote(quote: Quote.IQuoteSearchResult, contact:any): string | null {\n if (contact) {\n return `${contact.Title} ${contact.FirstName} ${contact.LastName}`;\n } else if (quote && quote.CustomerFirstName && quote.CustomerLastName) {\n return `${quote.CustomerFirstName} ${quote.CustomerLastName}`;\n }\n return null;\n }\n\n getCustomerEmailForQuote(quote: Quote.IQuoteSearchResult, contact: any): string | null {\n if (contact && contact.Email) {\n return contact.Email;\n } else if (quote && quote.CustomerEmailAddress) {\n return quote.CustomerEmailAddress;\n }\n return null;\n }\n\n getCustomerPhoneNumberForQuote(contact: any): string | null {\n return contact && (contact.MobileTel || contact.HomeTel || contact.Phone || contact.CustomerPhoneNumber);\n }\n\n getCustomerSkywardNumberForQuote(data: any): string | null {\n if (data && (data.CustomerLoyaltyNumber || data.LoyaltyId)) {\n return data.CustomerLoyaltyNumber || data.LoyaltyId;\n }\n return null;\n }\n\n public getPriceDifference(products): IQuotePriceDifference {\n let totalBaseCost = 0;\n let priceDifferenceAbs = 0;\n products.forEach((product) => {\n totalBaseCost += product.QuotedCost;\n priceDifferenceAbs += (product.CurrentCost - product.QuotedCost);\n });\n const priceDifferencePercentage = (priceDifferenceAbs / totalBaseCost) * 100;\n return {\n priceDifferenceAbs,\n priceDifferencePercentage\n };\n }\n\n private getEarliestDate(earliestDate: string, date: string): string {\n const emptyValue: string = '';\n const compareDatesResult: boolean = this.dateUtil.compareDates(date, earliestDate) === -1;\n return (earliestDate === emptyValue) || compareDatesResult ? date : earliestDate;\n }\n\n private extractEarliestDate(products: any): string {\n const emptyValue: string = '';\n\n return _.reduce(products, (acc: string, p: any) => {\n let startDate: string;\n switch (p.TypeId) {\n case QuoteProductType.Accommodation:\n startDate = (p).CheckInDate;\n break;\n case QuoteProductType.Flight:\n startDate = (p).OutboundLeg.Segments[0].DepartureDate;\n break;\n case QuoteProductType.Transfer:\n startDate = (p).OutboundDate || emptyValue;\n break;\n case QuoteProductType.CarHire:\n startDate = (p).PickUpDate;\n break;\n default:\n startDate = emptyValue;\n break;\n }\n return this.getEarliestDate(acc, startDate);\n }, emptyValue);\n }\n\n public validForDays(refreshedQuoteProducts) {\n const validForDaysLength = 30;\n const earliestDate = this.extractEarliestDate(refreshedQuoteProducts);\n\n if (earliestDate.length > 0) {\n const days = this.dateUtil.getDifferenceInDays(new Date(), this.dateUtil.parseDate(earliestDate));\n if (days < validForDaysLength) {\n return days;\n }\n }\n\n return validForDaysLength;\n }\n\n }\n\n angular\n .module('TR')\n .service('quoteService', QuoteService);\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .config(($provide, $httpProvider) => {\n const codesToRetry = [500, 503, 12152, 12002, 12031, 12029, 12030, 12041, 12019, 444];\n\n $provide.factory('retryInterceptor', ($injector, $q) => ({\n responseError(resp) {\n if (codesToRetry.indexOf(resp.status) >= 0 &&\n resp.config.headers['x-auto-retry'] == null) {\n resp.config.headers['x-auto-retry'] = resp.status;\n const $http = $injector.get('$http');\n return $http(resp.config);\n }\n\n return $q.reject(resp);\n }\n }));\n\n if ($httpProvider.interceptors.indexOf('retryInterceptor') < 0) {\n $httpProvider.interceptors.push('retryInterceptor');\n }\n});\n})();\n","namespace Core {\n enum PassengerType {\n Adult = 1,\n Child = 2\n }\n\n type Tax = {\n TotalAmount: number;\n CurrencyCode: string;\n EstabId: number;\n };\n\n type TaxList = Tax[];\n\n const ApiUrl: string = '/api/taxation/getCityTax';\n\n export interface TaxationService {\n getCityTax(tripId: string, basketId: string):ng.IPromise;\n getCityTaxes(tripId: string, Estabs: object):ng.IPromise;\n }\n\n export class TaxationService implements TaxationService {\n constructor(\n private $q: ng.IQService,\n private $http: ng.IHttpService,\n private basketStore: any,\n private tripService\n ) {\n }\n\n\n getCityTax(tripId: string, basketId: string) {\n if(TRPCONFIG.Domain.EnableCityTax) {\n let EstabId;\n return this.$q.all([\n this.basketStore.hotel(basketId),\n this.basketStore.hotelCost(basketId)\n ]).then(results => {\n const [hotelFromBasket, hotelCost] = results;\n if(hotelFromBasket) {\n EstabId = hotelFromBasket.Details.Itinerary.EstabId;\n const Estabs = [\n {\n EstabId,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n TotalCost: hotelCost\n }\n ];\n return this.getCityTaxes(tripId, Estabs);\n } else {\n return this.$q.when();\n }\n }).then(res => _.find(\n res,\n (t:Tax) => t.EstabId === EstabId\n ));\n }\n else {\n return this.$q.when();\n }\n }\n\n getCityTaxes(tripId, Estabs) {\n if(TRPCONFIG.Domain.EnableCityTax) {\n return this.$q.all([\n this.tripService.getHotelsRequestCheckInDate(tripId, true),\n this.tripService.getHotelsRequestCheckOutDate(tripId, true),\n this.tripService.getTripOccupancy(tripId)\n ]).then(([ CheckInDate, CheckOutDate, occupancy ]) => {\n return this.$http.post(\n ApiUrl, {\n CheckInDate,\n CheckOutDate,\n Estabs,\n Rooms: this.roomsFromOccupancy(occupancy)\n }, {ignoreErrors: true}\n );\n }).then(res => res.data);\n } else {\n return this.$q.when();\n }\n }\n\n private roomsFromOccupancy(occupancy:Core.Occupancy[]) {\n const defaultAdultAge = TRPCONFIG.Domain.MaximumChildAge + 1;\n return _.map(occupancy, (r:Core.Occupancy, i:number) => {\n let room:any = {};\n room.RoomId = i+1; //A random roomId\n let adults = _.fill(Array(r.Adults), {PassengerType: PassengerType.Adult, Age: defaultAdultAge});\n let children = _.map(r.ChildAges ? r.ChildAges : [], a => {\n return {\n PassengerType: PassengerType.Child,\n Age: a\n };\n });\n room.Passengers = _.concat(adults, children);\n return room;\n });\n }\n\n }\n angular.module('TR').service('taxationService', TaxationService);\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .config(configure);\n\nfunction configure($provide, $httpProvider) {\n $provide.factory('timerInterceptor', timerInterceptor);\n\n function timerInterceptor() {\n const COMMON_THRESHOLD = 20;\n\n return {\n request(config) {\n try {\n config.headers['x-timer'] = new Date().getTime();\n } catch (e) {}\n return config;\n },\n\n response(data) {\n try {\n const timeElapsed = (new Date().getTime() - data.config.headers['x-timer']) / 1000;\n const threshold = data.config.headers['x-threshold'] || COMMON_THRESHOLD;\n\n if (timeElapsed > threshold) {\n const utm = JSON.parse($('body').attr('user')).UtmId;\n const msg = `OVERTHRESHOLD | ${\n timeElapsed}s | ${\n data.config.url} | ${\n utm} | ${\n window.navigator.userAgent}`;\n const r = new XMLHttpRequest();\n\n r.open('POST', 'website/logging/log', true);\n r.setRequestHeader('content-type', 'application/json');\n r.send(JSON.stringify({ LogLevel: 'Warn', Message: msg }));\n }\n } catch (e) {}\n return data;\n }\n };\n }\n\n if ($httpProvider.interceptors.indexOf('timerInterceptor') < 0) {\n $httpProvider.interceptors.push('timerInterceptor');\n }\n}\n})();\n","namespace Core {\n 'use strict';\n type TripState = Core.Trip.TripState;\n type Destination = Core.Trip.Destination;\n type HotelsRequest = Core.Trip.HotelsRequest;\n type FlightsRequest = Core.Trip.FlightsRequest;\n type MultiFlightsRequest = Core.Trip.MultiFlightsRequest;\n type TransfersRequest = Core.Trip.TransfersRequest;\n type MarhabaRequest = Core.Trip.MarhabaRequest;\n type InsuranceRequest = Core.Trip.InsuranceRequest;\n type CarHireRequest = Core.Trip.CarHireRequest;\n type ParkingRequest = Core.Trip.ParkingRequest;\n type AttractionRequest = Core.Trip.AttractionRequest;\n type Flight = Core.Flights.Flight;\n type Airport = Core.Trip.Airport;\n type Occupancy = Core.Trip.Occupancy;\n type TripFromQuoteRequest = Core.Trip.TripFromQuoteRequest;\n type TripFromQuoteResponse = Core.Trip.TripFromQuoteResponse;\n type TripFromDealResponse = Core.Trip.TripFromDealResponse;\n\n angular\n .module('TR')\n .service('tripService', tripService);\n\n export interface TripService {\n tripTypes: any; //TODO check that this actually works\n persist(tripId: string, trip: TripState) : ng.IPromise;\n getTrip(tripId: string): ng.IPromise;\n getTripDestination(tripId: string): ng.IPromise;\n getCurrency(tripId: string): ng.IPromise;\n isKidsFree(tripId: string): ng.IPromise;\n recordHotelSearch(tripId: string, search: HotelsRequest): ng.IPromise;\n recordFlightSearch(tripId: string, search: FlightsRequest): ng.IPromise;\n recordMultiFlightSearch(tripId: string, search: MultiFlightsRequest): ng.IPromise;\n recordTransferSearch(tripId: string, search: TransfersRequest): ng.IPromise;\n recordMarhabaSearch(tripId: string, search: MarhabaRequest): ng.IPromise;\n recordInsuranceSearch(tripId: string, search: InsuranceRequest): ng.IPromise;\n recordCarHireSearch(tripId: string, search: CarHireRequest): ng.IPromise;\n recordParkingSearch(tripId: string, search: ParkingRequest): ng.IPromise;\n recordAttractionSearch(tripId: string, search: AttractionRequest): ng.IPromise;\n clearOptionalExtras(tripId: string): ng.IPromise;\n changeTripType(tripId: string, typeId: number): ng.IPromise;\n setBookingId(tripId: string, bookingId: string): ng.IPromise;\n setBasketId(tripId: string, basketId: string): ng.IPromise;\n setQuoteId(tripId: string, quoteId: string): ng.IPromise;\n setKidsFree(tripId: string, isKidsFree: boolean): ng.IPromise;\n setDirectToHotel(tripId: string, direct: boolean): ng.IPromise;\n setSelectedFlight(tripId: string, flight: Flight, opts): ng.IPromise;\n restoreSearchUnit(tripId: string): ng.IPromise;\n getHotelsRequest(tripId: string):ng.IPromise;\n getHotelsRequestCheckInDate(tripId: string, serialised: boolean): ng.IPromise;\n getHotelsRequestCheckOutDate(tripId: string, serialised: boolean): ng.IPromise;\n getFlightsRequestDepartureDate(tripId: string, serialised: boolean): ng.IPromise;\n getSelectedDepartureAirport(tripId: string): ng.IPromise;\n getDepartureAirports(tripId: string): ng.IPromise;\n getParkingAirport(tripId: string): ng.IPromise;\n getSelectedDestinationAirport(tripId: string): ng.IPromise;\n getDestinationAirports(tripId: string): ng.IPromise;\n getFlightCabin(tripId: string): ng.IPromise;\n getParkingDropOffDate(tripId: string, serialised: boolean): ng.IPromise;\n getParkingPickUpDate(tripId: string, serialised: boolean): ng.IPromise;\n getTripNumberOfNights(mode: number, tripId: string): ng.IPromise;\n getDurationSummary(mode: number, tripId: string): ng.IPromise;\n isOneWayFlightEnabled(tripId: string): ng.IPromise;\n getTripOccupancy(tripId: string): ng.IPromise;\n getTripReducedOccupancy(tripId: string): ng.IPromise;\n getTransferDestinationAirport(tripId: string): ng.IPromise;\n getTransfersRequestSummary(tripId: string): ng.IPromise;\n getParkingRequestSummary(tripId: string): ng.IPromise;\n getHotelsRequestNumberOfNights(tripId: string): ng.IPromise;\n getTripFromQuote(quote): ng.IPromise;\n supportsTransfers(trip: TripState): boolean;\n getTripIdForDeal(deal: any, originPath: string): ng.IPromise;\n getTripIdForHolidayDeal(deal, occupancy): ng.IPromise;\n getFlightsRequestReturnDate(tripId: string, serialised:boolean): ng.IPromise;\n usePackageRates(tripId?: string): ng.IPromise;\n getFlightsRequest(tripId: string): ng.IPromise;\n getTransfersRequest(tripId: string): ng.IPromise;\n getInsuranceRequestSummary(tripId: string): ng.IPromise;\n }\n\n type TripRequest =\n HotelsRequest\n | FlightsRequest\n | MultiFlightsRequest\n | TransfersRequest\n | MarhabaRequest\n | InsuranceRequest\n | CarHireRequest\n | ParkingRequest;\n\n function tripService(loggingService : ILoggingService,\n $q: ng.IQService,\n dateUtil,\n $http: IHttpService,\n searchUnitService: SearchUnitService,\n broker: Broker,\n occupancyService: OccupancyService,\n $routeParams,\n $location,\n destinationService) : TripService {\n const url: string = '/api2/tripstate/';\n const promiseCache: {[id:string]:ng.IPromise} = {};\n const tripTypes = {\n None: 0,\n Flight: 1,\n Hotel: 2,\n Transfer: 3,\n Holiday: 4,\n Marhaba: 5,\n Parking: 6,\n Attractions: 7,\n DynamicPackage: 8,\n Insurance: 9,\n MultiDestHoliday: 10\n };\n const defaultOpts = {\n bags: 0\n };\n let tripQueue: ng.IPromise = $q.when();\n\n const service: TripService = {\n tripTypes,\n persist,\n getTrip,\n getTripDestination,\n recordHotelSearch,\n recordFlightSearch,\n recordMultiFlightSearch,\n recordTransferSearch,\n recordMarhabaSearch,\n recordInsuranceSearch,\n recordCarHireSearch,\n recordParkingSearch,\n recordAttractionSearch,\n clearOptionalExtras,\n changeTripType,\n setBookingId,\n setBasketId,\n setQuoteId,\n setKidsFree,\n setSelectedFlight,\n supportsTransfers,\n setDirectToHotel,\n restoreSearchUnit,\n getCurrency,\n isKidsFree,\n getTripIdForDeal,\n getTripIdForHolidayDeal,\n getHotelsRequest,\n getHotelsRequestCheckInDate,\n getHotelsRequestCheckOutDate,\n getHotelsRequestNumberOfNights,\n getFlightsRequest,\n getFlightsRequestDepartureDate,\n getFlightsRequestReturnDate,\n getParkingDropOffDate,\n getParkingPickUpDate,\n getSelectedDepartureAirport,\n getDepartureAirports,\n getSelectedDestinationAirport,\n getDestinationAirports,\n getFlightCabin,\n getParkingAirport,\n isOneWayFlightEnabled,\n getTripNumberOfNights,\n getDurationSummary,\n getTripOccupancy,\n getTripReducedOccupancy,\n getTransfersRequestSummary,\n getTransferDestinationAirport,\n getParkingRequestSummary,\n getTripFromQuote,\n usePackageRates,\n getInsuranceRequestSummary,\n getTransfersRequest\n };\n\n function _updateTrip(tripId: string, fn: (TripState) => TripState ): ng.IPromise {\n return service.getTrip(tripId).then(trip => {\n service.persist(tripId, fn(trip));\n return $q.when(trip);\n });\n }\n\n\n function _recordSearch(tripId: string,\n search: TripRequest,\n name: string) {\n return _updateTrip(tripId, trip => {\n trip[name] = search;\n return trip;\n });\n }\n\n function persist(tripId: string, trip: TripState) : ng.IPromise {\n promiseCache[tripId] = $http.post(`${url}updatetripstate`, {\n TripId: tripId,\n TripState: trip\n }).then(() => {\n const tripCopy = angular.copy(trip);\n broker.publish('tripUpdated', tripCopy);\n return tripCopy;\n });\n return promiseCache[tripId];\n }\n\n function supportsTransfers(trip: TripState): boolean {\n return trip.TripType !== Core.Trip.TripType.Flight;\n }\n\n function getTrip(tripId: string): ng.IPromise {\n if (!tripId) {\n return $q.when();\n }\n\n if (promiseCache[tripId] === undefined) {\n const validateUser = Boolean(TRPCONFIG.Domain.ValidateUserForTripstate);\n promiseCache[tripId] = $http.get(\n `${url}gettripstate?tripId=${tripId}&validateUser=${validateUser}`\n ).then(res => {\n if(res.data.TripId !== $routeParams.tripId) {\n //load new trip and basket clone\n $location.path($location.path().replace($routeParams.tripId, res.data.TripId));\n }\n return _enrichTripDestination(res.data);\n });\n }\n\n tripQueue = tripQueue.then(() => {\n return promiseCache[tripId].then(trip => {\n return angular.copy(trip);\n });\n });\n\n return tripQueue;\n\n function _enrichTripDestination(trip: TripState): ng.IPromise {\n const detailsPromise: ng.IPromise[] = [];\n\n detailsPromise.push(trip.FlightsRequest && trip.FlightsRequest.Destination\n ? destinationService.getDetails(trip.FlightsRequest.Destination)\n : $q.when());\n\n detailsPromise.push(trip.HotelsRequest\n && trip.HotelsRequest.Destination\n ? destinationService.getDetails(trip.HotelsRequest.Destination)\n : $q.when());\n\n return $q.all(detailsPromise).then(([flightDest, hotelDest]) => {\n if (flightDest && trip.FlightsRequest) {\n trip.FlightsRequest.Destination = flightDest;\n }\n if (hotelDest && trip.HotelsRequest) {\n trip.HotelsRequest.Destination = hotelDest;\n }\n return trip;\n }, () => {\n loggingService.logInfo(`Get Details is failing for ${trip.TripId}`);\n return trip;\n });\n }\n }\n\n function getTripDestination(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n if (trip) {\n const flightDest = trip.FlightsRequest && trip.FlightsRequest.Destination;\n const hotelsDest = trip.HotelsRequest && trip.HotelsRequest.Destination;\n return flightDest || hotelsDest || null;\n }\n return null;\n }, () => { tripQueue = $q.when(); });\n }\n\n function getCurrency(tripId: string): ng.IPromise {\n if (tripId == null) {\n return $q.when();\n }\n return getTrip(tripId).then(trip => {\n if (trip.HotelsRequest != null) {\n return trip.HotelsRequest.CurrencyCode;\n }\n });\n }\n\n function isKidsFree(tripId: string): ng.IPromise {\n if (tripId == null) {\n return $q.when(false);\n }\n return getTrip(tripId).then(trip => {\n return !!trip.IsKidsFree;\n });\n }\n\n function getTripIdForHolidayDeal(deal, occupancy): ng.IPromise {\n let tripId;\n const params = _.assignIn({}, deal, {\n DomainId: TRPCONFIG.Domain.DomainId,\n Occupancy: _.first(occupancy)\n });\n return $http.post(\n `${url}createtripfromholidaydeal`, params, {ignoreErrors: true})\n .then(\n res => tripId = res.data.TripId,\n res => $q.reject(res)\n )\n .then(() => _updateTrip(tripId, trip => {\n trip.HotelsRequest.DirectToHotel = false;\n return trip;\n }))\n .then(() => tripId);\n }\n\n function getTripIdForDeal(deal: any, originPath: string): ng.IPromise {\n return $http.post(`${url}createtripfromdeal`, {\n AvailabilitySearchId: deal.AvailabilitySearchId,\n EstablishmentId: deal.EstablishmentId,\n Deal: deal,\n OriginPath: originPath,\n DomainId: TRPCONFIG.Domain.DomainId\n }, {ignoreErrors: true}).then(res => res.data.TripId, res => {\n if (res.status === 404) {\n loggingService.logWarn(\n `Unable to create a trip for deal ${deal.Id} with availabilityId ${deal.AvailabilitySearchId}`);\n }\n return $q.reject(res);\n });\n }\n\n function recordHotelSearch(tripId: string, search: HotelsRequest): ng.IPromise {\n search.DirectToHotel = true;\n return _recordSearch(tripId, search, 'HotelsRequest');\n }\n\n function recordFlightSearch(tripId: string, search: FlightsRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'FlightsRequest');\n }\n\n function recordMultiFlightSearch(tripId: string, search: MultiFlightsRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'MultiFlightsRequest');\n }\n\n function recordTransferSearch(tripId: string, search: TransfersRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'TransfersRequest');\n }\n\n function recordMarhabaSearch(tripId: string, search: MarhabaRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'MarhabaRequest');\n }\n\n function recordInsuranceSearch(tripId: string, search: InsuranceRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'InsuranceRequest');\n }\n\n function recordCarHireSearch(tripId: string, search: CarHireRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'CarHireRequest');\n }\n\n function recordParkingSearch(tripId: string, search: ParkingRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'ParkingRequest');\n }\n\n function recordAttractionSearch(tripId: string, search: AttractionRequest): ng.IPromise {\n return _recordSearch(tripId, search, 'AttractionRequest');\n }\n\n function clearOptionalExtras(tripId: string): ng.IPromise {\n return _updateTrip(tripId, trip => {\n trip.TransfersRequest = undefined;\n trip.InsuranceRequest = undefined;\n trip.CarHireRequest = undefined;\n trip.ParkingRequest = undefined;\n trip.AttractionRequest = undefined;\n\n //TODO - set other optional extra requests to undefined\n return trip;\n });\n }\n\n function changeTripType(tripId: string, typeId: number): ng.IPromise {\n return _updateTrip(tripId, trip => {\n trip.TripType = typeId;\n return trip;\n });\n }\n\n function setBookingId(tripId: string, bookingId: string): ng.IPromise {\n return _updateTrip(tripId, trip => {\n trip.BookingId = bookingId;\n return trip;\n });\n }\n\n function setKidsFree(tripId: string, isKidsFree: boolean): ng.IPromise {\n return _updateTrip(tripId, (trip:TripState) => {\n trip.IsKidsFree = isKidsFree;\n return trip;\n });\n }\n\n function setBasketId(tripId: string, basketId: string): ng.IPromise {\n return _updateTrip(tripId, trip => {\n trip.BasketId = basketId;\n return trip;\n });\n }\n\n function setQuoteId(tripId: string, quoteId: string): ng.IPromise {\n return _updateTrip(tripId, trip => {\n trip.QuoteId = quoteId;\n return trip;\n });\n }\n\n function setDirectToHotel(tripId: string, direct: boolean): ng.IPromise {\n return service.getTrip(tripId).then(function (trip) {\n if (trip.HotelsRequest && trip.HotelsRequest.DirectToHotel !== direct) {\n return _updateTrip(tripId, function (trip) {\n if (trip.HotelsRequest) {\n trip.HotelsRequest.DirectToHotel = direct;\n }\n return trip;\n });\n }\n return trip;\n });\n }\n\n function setSelectedFlight(tripId: string, flight: Flight, opts): ng.IPromise {\n opts = opts || defaultOpts;\n return _updateTrip(tripId, trip => {\n if (trip.FlightsRequest) {\n trip.FlightsRequest.SelectedFlight = {\n FlightId: flight.FlightId,\n DetailsId: flight.DetailsId,\n LeadAdultPrice: flight.LeadAdultPrice,\n LeadAdultTax: flight.LeadAdultTax,\n LeadBaggagePrice: flight.LeadBaggagePrice,\n AllBagsOrNone: flight.AllBagsOrNone,\n BaggageCount: opts.bags\n };\n }\n return trip;\n });\n }\n\n function restoreSearchUnit(tripId: string): ng.IPromise {\n if (!tripId) {\n return $q.when();\n }\n return service.getTrip(tripId).then(trip =>\n $q.all([\n searchUnitService.restoreFlightSearch(trip),\n searchUnitService.restoreMultiFlightSearch(trip),\n searchUnitService.restoreTransferSearch(trip),\n searchUnitService.restoreMarhabaSearch(trip),\n searchUnitService.restoreHotelSearch(trip),\n searchUnitService.restoreParkingSearch(trip),\n searchUnitService.restoreInsuranceSearch(trip)\n ])\n .then(function () {\n return trip;\n })\n );\n }\n\n function getHotelsRequest(tripId: string):ng.IPromise {\n return service.getTrip(tripId).then(trip => trip.HotelsRequest);\n }\n\n function getTransfersRequest(tripId: string):ng.IPromise {\n return service.getTrip(tripId).then(trip => trip.TransfersRequest);\n }\n\n function _getTripDate(tripId: string, requestType: string, dateType: string, serialised: boolean)\n : ng.IPromise {\n return service.getTrip(tripId).then(trip =>\n trip && trip[requestType] && trip[requestType][dateType] ?\n (serialised ? dateUtil.serialiseDate : dateUtil.parseDate)(trip[requestType][dateType])\n : null);\n }\n\n function getHotelsRequestCheckInDate(tripId: string, serialised: boolean = false)\n : ng.IPromise {\n return _getTripDate(tripId, 'HotelsRequest', 'CheckInDate', serialised);\n }\n\n function getHotelsRequestCheckOutDate(tripId: string, serialised: boolean = false)\n : ng.IPromise {\n return _getTripDate(tripId, 'HotelsRequest', 'CheckOutDate', serialised);\n }\n\n function getFlightsRequestDepartureDate(tripId: string, serialised: boolean = false)\n : ng.IPromise {\n return _getTripDate(tripId, 'FlightsRequest', 'DepartureDate', serialised);\n }\n\n function getFlightsRequestReturnDate(tripId: string, serialised:boolean = false)\n : ng.IPromise {\n return _getTripDate(tripId, 'FlightsRequest', 'ReturnDate', serialised);\n }\n\n function getSelectedDepartureAirport(tripId: string): ng.IPromise {\n return service.getTrip(tripId).then(trip =>\n trip && trip.FlightsRequest ? trip.FlightsRequest.SelectedDepartureAirport : null);\n }\n\n //TODO - this needs investigating because DepartureAirports does not exist on the FlightsRequest\n function getDepartureAirports(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip =>\n trip && trip.FlightsRequest ? trip.FlightsRequest.DepartureAirports : []);\n }\n\n function getParkingAirport(tripId: string): ng.IPromise {\n return service.getTrip(tripId).then(trip =>\n trip && trip.ParkingRequest ? _.omit(trip.ParkingRequest.Airport, 'ShortTitle') : {});\n }\n\n //TODO - this return type mayes no sense because SelectedDestinationAirport is not an array\n function getSelectedDestinationAirport(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip =>\n trip && trip.FlightsRequest ? trip.FlightsRequest.SelectedDestinationAirport : []);\n }\n\n //TODO - this needs investigating because DestinationAirports does not exist on the FlightsRequest\n function getDestinationAirports(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip =>\n trip && trip.FlightsRequest ? trip.FlightsRequest.DestinationAirports : []);\n }\n\n function getFlightCabin(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip =>\n trip && trip.FlightsRequest ? trip.FlightsRequest.Cabin : null);\n }\n\n function getParkingDropOffDate(tripId: string, serialised: boolean = false): ng.IPromise {\n return _getTripDate(tripId, 'ParkingRequest', 'DepartureDate', serialised);\n }\n\n function getParkingPickUpDate(tripId: string, serialised: boolean = false): ng.IPromise {\n return _getTripDate(tripId, 'ParkingRequest', 'ReturnDate', serialised);\n }\n\n function _parseTripDates(tripId: string): ng.IPromise {\n const dates = [\n new dateUtil.DateRange(),\n new dateUtil.DateRange(),\n new dateUtil.DateRange(),\n new dateUtil.DateRange()\n ];\n return getTrip(tripId).then(trip => {\n if (trip) {\n if (trip.HotelsRequest) {\n if (trip.HotelsRequest.CheckInDate) {\n setStartDate(searchUnitService.hotel, trip.HotelsRequest.CheckInDate);\n }\n if (trip.HotelsRequest.CheckOutDate) {\n setEndDate(searchUnitService.hotel, trip.HotelsRequest.CheckOutDate);\n }\n }\n if (trip.FlightsRequest) {\n if (trip.FlightsRequest.DepartureDate) {\n setStartDate(searchUnitService.flight, trip.FlightsRequest.DepartureDate);\n }\n if (trip.FlightsRequest.ReturnDate) {\n setEndDate(searchUnitService.flight, trip.FlightsRequest.ReturnDate);\n }\n }\n if (trip.TransfersRequest) {\n if (trip.TransfersRequest.ArrivalDate) {\n setStartDate(searchUnitService.transfer, trip.TransfersRequest.ArrivalDate);\n }\n if (trip.TransfersRequest.ReturnDate) {\n setEndDate(searchUnitService.transfer, trip.TransfersRequest.ReturnDate);\n }\n }\n if (trip.MarhabaRequest && trip.MarhabaRequest.DateAndTime) {\n setStartDate(searchUnitService.marhaba, trip.MarhabaRequest.DateAndTime);\n }\n }\n\n return dates;\n });\n\n function setStartDate(mode: number, date: string) {\n dates[mode].setStart(date);\n }\n\n function setEndDate(mode: number, date: string) {\n dates[mode].setEnd(date);\n }\n }\n\n function getTripNumberOfNights(mode: number, tripId: string): ng.IPromise {\n return (!tripId || null == mode)\n ? $q.when()\n : _parseTripDates(tripId)\n .then(dates => dates && dates[mode] && dates[mode].numberOfNights());\n }\n\n function getDurationSummary(mode: number, tripId: string): ng.IPromise {\n if (!tripId) {\n return $q.when('');\n }\n return _parseTripDates(tripId).then(dates =>\n (mode === searchUnitService.flight)\n ? isOneWayFlightEnabled(tripId)\n .then(oneWay =>\n oneWay ? dateUtil.format(dates[mode].start) : dates[mode].getDurationSummary())\n : dates[mode].getDurationSummary());\n }\n\n function isOneWayFlightEnabled(tripId: string): ng.IPromise {\n return getTrip(tripId)\n .then(trip => trip && trip.FlightsRequest && trip.FlightsRequest.OneWayOnly);\n }\n\n function getTripOccupancy(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n if (!trip) {\n return null;\n }\n const req = trip.HotelsRequest\n || trip.FlightsRequest\n || trip.TransfersRequest\n || trip.MarhabaRequest\n || trip.InsuranceRequest;\n\n if (!req) {\n if (trip.ParkingRequest) {\n return trip.ParkingRequest.PassengerCount;\n }\n return null;\n }\n return req.Rooms || [_.pick(req.Occupancy || req, 'Adults', 'ChildAges')];\n });\n }\n\n function getTripReducedOccupancy(tripId: string): ng.IPromise {\n return getTripOccupancy(tripId).then(occupancy =>\n occupancy &&\n occupancy.map(o => o.ChildAges ? o : _.set(o, 'ChildAges', []))\n .reduce((o1, o2) => ({\n Adults: o1.Adults + o2.Adults,\n ChildAges: (o1.ChildAges||[]).concat(o2.ChildAges||[])\n }))\n );\n }\n\n function getTransferDestinationAirport(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip =>\n trip && trip.TransfersRequest ? trip.TransfersRequest.DestinationAirport : null);\n }\n\n function getTransfersRequestSummary(tripId: string): ng.IPromise {\n function getTransferNumericDirection(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n if (trip && trip.TransfersRequest && trip.TransfersRequest) {\n const {ArrivalDate, ReturnDate} = trip.TransfersRequest;\n if (ArrivalDate && ReturnDate) {\n return 1;\n }\n if (ArrivalDate) {\n return 2;\n }\n if (ReturnDate) {\n return 3;\n }\n return null;\n }\n });\n }\n\n function getTransferDestination(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n if (trip && trip.TransfersRequest && trip.TransfersRequest.LocationId) {\n return destinationService.getDetails({\n LocationId: trip.TransfersRequest.LocationId\n });\n }\n });\n }\n\n function _getTransferPickupPoint(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n return _.get(trip, 'TransfersRequest.Route.PickUpPoint.Description');\n });\n }\n\n function _getTransferDropOffPoint(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n return _.get(trip, 'TransfersRequest.Route.DropOffPoint.Description');\n });\n }\n\n return $q.all([\n getTransferDestinationAirport(tripId),\n _getTripDate(tripId, 'TransfersRequest', 'ArrivalDate', true),\n _getTripDate(tripId, 'TransfersRequest', 'ReturnDate', true),\n service.getTripOccupancy(tripId),\n getTransferNumericDirection(tripId),\n getTransferDestination(tripId),\n _getTransferPickupPoint(tripId),\n _getTransferDropOffPoint(tripId)\n ]).then(([\n DestinationAirport,\n StartDate,\n EndDate,\n occupancy,\n NumericDirection,\n Destination,\n PickUpPointTitle,\n DropOffPointTitle]) => {\n return {\n StartDate,\n EndDate,\n OccupancyString: occupancyService.getOccupancyString(occupancy),\n NumericDirection,\n DestinationTitle: (Destination && Destination.ShortTitle)\n || (DestinationAirport && DestinationAirport.Title),\n PickUpPointTitle,\n DropOffPointTitle,\n TransferType: searchUnitService.getTransferType()\n };\n });\n }\n\n function getInsuranceRequestSummary(tripId: string): ng.IPromise {\n return getTrip(tripId).then(trip => {\n const insuranceReq = (trip && trip.InsuranceRequest) || {};\n return {\n PolicyType: insuranceReq.TripType,\n StartDate: dateUtil.serialiseDate(insuranceReq.StartDate),\n EndDate: dateUtil.serialiseDate(insuranceReq.EndDate),\n Destination: insuranceReq.TravelDestination\n };\n });\n }\n\n function getParkingRequestSummary(tripId: string): ng.IPromise {\n return getTrip(tripId)\n .then(trip => {\n const parkingReq = (trip && trip.ParkingRequest) || {};\n return {\n Airport: parkingReq.Airport.ShortTitle,\n DepartureDate: dateUtil.serialiseDate(parkingReq.DepartureDate),\n ReturnDate: dateUtil.serialiseDate(parkingReq.ReturnDate),\n PassengerCount: parkingReq.PassengerCount\n };\n });\n }\n\n function getHotelsRequestNumberOfNights(tripId: string): ng.IPromise {\n if (!tripId) {\n return $q.when(0);\n }\n return $q.all([\n service.getHotelsRequestCheckInDate(tripId, false),\n service.getHotelsRequestCheckOutDate(tripId, false)\n ]).then(dates => dateUtil.numberOfNights(...dates));\n }\n\n function getTripFromQuote(quote): ng.IPromise {\n //create request object\n const tripFromQuoteRequest: TripFromQuoteRequest = {\n QuoteId: quote.Id,\n BasketId: quote.BasketId,\n ForHoliday: quote.ForHoliday\n };\n quote.Products.reduce((req, {AvailabilityId, Type}) => {\n switch (Type) {\n case 'Accommodation':\n req.HotelsRequestId = AvailabilityId;\n break;\n case 'Airport Parking':\n req.ParkingRequestId = AvailabilityId;\n break;\n case 'Attraction Ticket':\n req.AttractionsRequestId = AvailabilityId;\n break;\n case 'Car Hire':\n req.CarHireRequestId = AvailabilityId;\n break;\n case 'Flight':\n req.FlightsRequestId = AvailabilityId;\n break;\n case 'Insurance':\n req.InsuranceRequestId = AvailabilityId;\n break;\n case 'Marhaba':\n req.MarhabaRequestId = AvailabilityId;\n break;\n case 'Transfer':\n req.TransfersRequestId = AvailabilityId;\n break;\n }\n return req;\n }, tripFromQuoteRequest);\n\n return $http.post(`${url}createtripfromquote`,\n tripFromQuoteRequest,\n {ignoreErrors: true}).then(res => res.data);\n }\n\n function usePackageRates(tripId = $routeParams && $routeParams.tripId): ng.IPromise {\n return getTrip(tripId)\n .then(trip =>\n trip && trip.TripType === tripTypes.Holiday && (TRPCONFIG.Domain.PackagePrice || trip.PackageId)\n )\n .then(result => !!result);\n }\n\n function getPackageId(tripId = $routeParams && $routeParams.tripId): ng.IPromise {\n return getTrip(tripId).then(trip => trip && trip.PackageId);\n }\n\n function getFlightsRequest(tripId: string): ng.IPromise {\n return service.getTrip(tripId).then(trip => trip && trip.FlightsRequest);\n }\n\n\n return service;\n }\n}\n","'use strict';\nnamespace Core.Collections {\n\n export class Dictionary {\n\n private _items:{ [index:string]:T } = {};\n private _count:number = 0;\n\n public add(key:string, value:T) {\n if (this.containsKey(key)) {\n throw new TypeError('Key already exists');\n }\n this._items[key] = value;\n this._count++;\n }\n\n public containsKey(key:string):boolean {\n return this._items.hasOwnProperty(key);\n }\n\n public count():number {\n return this._count;\n }\n\n public item(key:string):T {\n return this._items[key];\n }\n\n public values():T[] {\n let v:T[] = [];\n\n for (let p in this._items) {\n if (this._items.hasOwnProperty(p)) {\n v.push(this._items[p]);\n }\n }\n return v;\n }\n }\n\n}\n\n","(function() {\n 'use strict';\n\n let isPrerender = /prerender/i.test(navigator.userAgent);\n if (!isPrerender) {\n return;\n }\n\n let core = angular.module('core');\n\n let apiCallLog = [];\n\n //This is to record what api requests are made, so to track down what is going wrong with the prerender.\n core.decorator('$http', function($delegate) {\n let $http = $delegate;\n let oldGet = $http.get;\n $http.get = (...args) => {\n let log = {\n url: args[0],\n time: new Date()\n };\n apiCallLog.push(log);\n return oldGet.apply($http, args)\n .then(response => {\n log.status = `${response.status} ${response.statusText}`;\n return response;\n })\n .catch(error => {\n log.error = `${error.status} ${error.statusText}`;\n throw error;\n })\n .finally(() => {\n log.time = new Date() - log.time;\n });\n };\n return $delegate;\n });\n\n core.directive('prerenderLogging', () => ({\n restrict: 'E',\n template: '{{apiCallLog|json:false}}',\n link: scope => scope.apiCallLog = apiCallLog\n }));\n\n if (console) {\n let oldError = console.error;\n console.error = (...args) => {\n apiCallLog.push({\n jsError: args\n });\n oldError && oldError.apply(console, args);\n };\n }\n})();\n","namespace Dashboard {\n class DashboardHome {\n private alerts: INotification[];\n constructor(\n private dashboardNotificationService: IDashboardNotificationService,\n private $interpolate: ng.IInterpolateService,\n private $location: ng.ILocationService) {\n this.dashboardNotificationService.getNotifications()\n .then((data) => { this.alerts = data; });\n }\n\n private notificationClicked = (n) => {\n this.dashboardNotificationService.notificationClicked(n);\n }\n\n private formatNotification = (n) => this.dashboardNotificationService.formatNotification(n);\n }\n\n angular\n .module('dashboard')\n .controller('Dashboard', DashboardHome);\n}\n","namespace Dashboard {\n class Notifications {\n private alerts: INotification[];\n constructor(\n private dashboardNotificationService: IDashboardNotificationService,\n private $interpolate: ng.IInterpolateService,\n private $location: ng.ILocationService) {\n this.dashboardNotificationService.getNotifications()\n .then((data) => { this.alerts = data; });\n }\n\n private notificationClicked = (n) => {\n this.dashboardNotificationService.notificationClicked(n);\n }\n\n private formatNotification = (n) => this.dashboardNotificationService.formatNotification(n);\n }\n\n angular\n .module('dashboard')\n .controller('Notifications', Notifications);\n}\n","namespace Dashboard {\n\n export interface DocumentType {\n id: number;\n label();\n }\n\n class AddAPI {\n\n bookingId: number;\n bk;\n passengers: PassengerInfo[];\n documentTypes;\n busy: boolean;\n apiSubmitted: boolean = false;\n\n countries: any[];\n\n constructor(protected $routeParams,\n protected dashboardBookingService,\n protected bookingsManagerService,\n protected addAPIService: IAddAPIService,\n protected globalisationService,\n private $scope : ng.IScope,\n private resourceService : Core.ResourceService,\n private broker\n ) {\n\n this.bookingId = parseInt($routeParams.bookingId, 10);\n\n addAPIService.getPassengerInfo(this.bookingId).then(passengers =>{\n this.apiSubmitted = _.some(passengers, (p: PassengerInfo) => p.DetailsSubmitted);\n this.passengers = passengers;\n });\n\n globalisationService.getCountries().then(countries => this.countries = countries);\n this.documentTypes = addAPIService.getDocumentTypes();\n }\n\n submitAPI(){\n this.busy = true;\n this.addAPIService.addAPI(this.$routeParams.bookingId, this.passengers).then(() => {\n this.apiSubmitted = true;\n this.busy = false;\n this.broker.publish('apiAdded');\n }, () => {\n this.$scope.$broadcast('flash:error', this.resourceService.get('ADDAPIFAILURE'));\n this.busy = false;\n });\n }\n\n getDocumentTypeLabel(id) {\n const docType = _.find(this.documentTypes, (type: DocumentType) => type.id === id);\n return docType ? docType.label() : '';\n }\n\n getCountryName(id) {\n const country = _.find(this.countries, country => country.CountryCodeIso3 === id);\n return country ? country.Name : '';\n }\n }\n\n\n angular\n .module('dashboard')\n .controller('AddAPI', AddAPI);\n\n}\n","namespace Dashboard {\n\n import PaymentOption = Core.PaymentOption;\n import SavedCardOption = Core.SavedCardOption;\n import PaymentModel = Core.PaymentModel;\n\n export interface AddOptionConfig {\n completeUrl: string;\n optionsType: string;\n availableOptionsBinding: string;\n selectedOptionsBinding: string;\n selectedOptionsRequest: string;\n analyticsTag: string;\n pageUrl: string;\n }\n\n interface AddOptionsToBookingResponse {\n AcsRedirectRequired: boolean;\n AcsUrl: string | null;\n AllowThreeDSecureBypass: boolean;\n Amount: number;\n CardFeeAmount: number;\n CurrencyCode: string | null;\n MD: string | null;\n PaReq: string | null;\n PaymentId: number;\n PaymentMessage: string | null;\n PostPayment: boolean;\n ReasonCode: string | null;\n Success: boolean;\n }\n\n interface AddOptionsRequest {\n BookingId: number;\n AmendBookingOptionsId: string;\n PaymentRequest: {\n BookingId: number;\n DomainId: number;\n CurrencyCode: string,\n Amount: number;\n CultureCode: string;\n PayPalCallbackUrl: string;\n PayPalCancellationUrl: string;\n };\n SelectedOptions?: {\n ChosenQuantity: number;\n OptionId: string;\n }[];\n SelectedSeats?: {\n SeatNumber: string;\n PassengerID: number;\n LegId: string;\n SegmentHash: number;\n };\n }\n\n export abstract class AddOption {\n protected bookingId : number;\n protected threedsRedirecting : boolean;\n protected options;\n protected selectedOptions;\n protected ThreeDSecure;\n protected amendBookingOptionsId : string;\n protected handBaggageInformation;\n protected paymentTab : number;\n protected paymentMethodText: string[] = ['New Card', 'PayPal', 'Saved Card'];\n protected supplierIds: number[];\n\n protected dataLoaded: boolean;\n protected selectedOptionsTotalPrice: number = 0;\n protected isPartOfHoliday: boolean;\n protected paymentOptions: PaymentOption[];\n protected paymentModel: PaymentModel;\n protected savedCards: SavedCardOption[];\n\n constructor(\n protected $location: ng.ILocationService,\n protected $q: ng.IQService,\n protected $routeParams,\n protected $scope: ng.IScope,\n protected $window, // unable to assign to $window.location if its type is declared\n protected broker: Core.Broker,\n protected customCurrencyFilter,\n protected dashboardBookingService,\n protected flightExtrasService,\n protected mybTrack,\n protected paymentDetailsService,\n protected paymentsService,\n protected paymentsUtilService: Core.PaymentsUtilService,\n protected resourceService: Core.ResourceService,\n protected rootPath: Core.RootPath,\n protected urlUtils,\n protected dateUtil,\n protected currentUser\n ) {\n const flightBookingType = 1;\n this.bookingId = parseInt(this.$routeParams.bookingId, 10);\n\n const getOptions = this.paymentDetailsService.getPaymentOptions(flightBookingType,\n this.bookingId,\n TRPCONFIG.Domain.CurrencyCode);\n const getCards = this.paymentDetailsService.getSavedPaymentCards(flightBookingType,\n this.bookingId,\n TRPCONFIG.Domain.CurrencyCode);\n\n this.$q.all([getOptions, getCards])\n .then(results => {\n this.paymentOptions = this.paymentsUtilService.convertMybPaymentOptions(results[0]);\n\n if (results[1]) {\n this.savedCards = this.paymentsUtilService.convertMybSavedCards(results[1], results[0]);\n }\n }\n );\n\n this.paymentModel = this.paymentsUtilService.createEmptyPaymentModel();\n\n this.flightExtrasService.getOptionsData(this.bookingId).then((optionsData) => {\n if (!optionsData || !this.canAddOption(optionsData) || !optionsData[this.getConfig().optionsType]) {\n $location.path(`dashboard/bookings/reference/${this.bookingId}`);\n return;\n }\n\n this[this.getConfig().availableOptionsBinding] = optionsData[this.getConfig().optionsType];\n this.amendBookingOptionsId = optionsData.AmendBookingOptionsId;\n this.handBaggageInformation = optionsData.HandBaggageInformation;\n if (this.$routeParams.ppResp) {\n this.showError(this.resourceService.get(this.paymentsService.getPayPalResponseMessage(\n this.$routeParams.ppResp)));\n }\n }, () => this.$location.path(`dashboard/bookings/reference/${this.bookingId}`));\n\n this.$scope.$on('3DSValidationComplete', (ev, data) => {\n this.finaliseOptions(data);\n });\n\n this.dashboardBookingService.getFlightBooking(this.$routeParams.bookingId).then(r => {\n this.supplierIds = r.data.SupplierIds;\n this.mybTrack.track(this.getConfig().analyticsTag, {\n Source: this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\n SupplierId: this.supplierIds,\n BookingId: this.bookingId\n });\n });\n\n this.dashboardBookingService.isPartOfHoliday(this.$routeParams.bookingId)\n .then(r => this.isPartOfHoliday = r);\n\n this.dataLoaded = true;\n }\n\n private generateTokens() {\n return this.paymentsService.generateTokens(\n this.paymentModel.cardDetail.expiryDate.month,\n this.paymentModel.cardDetail.expiryDate.year,\n this.paymentModel.saveCard\n );\n }\n\n protected abstract analyticsTrackOpenOption();\n protected abstract getConfig() : AddOptionConfig;\n protected abstract canAddOption(optionsData) : boolean;\n\n private makePayment() {\n this.analyticsTrackOpenOption();\n\n const expires = this.paymentModel.cardDetail.expiryDate;\n const today = this.dateUtil.todayPlus();\n if (expires &&\n expires.year\n && expires.month\n && expires.year <= today.getFullYear()\n && expires.month < (today.getMonth() + 1)) {\n\n this.showError(this.resourceService.get('CARDHASEXPIRED'));\n return;\n }\n\n this.block(true);\n\n const requireValidation = this.paymentModel.cardDetail.isSavedCard === false\n && !this.paymentModel.isPayPalPayment;\n\n this.flightExtrasService.addOptionsToBooking(this.formatClearRequestPayload(), requireValidation)\n .then((result: AddOptionsToBookingResponse) => {\n if (result.Success) {\n if (result.AcsRedirectRequired) {\n if (this.paymentModel.isPayPalPayment) {\n //Paypal redirection\n this.$window.location = result.AcsUrl;\n } else {\n //3ds redirection\n this.redirectTo3dSecurePayment(result);\n }\n } else {\n //Show complete page\n this.$location.path(String.format(this.getConfig().completeUrl, this.bookingId));\n }\n } else {\n if (result.PostPayment) {\n this.handlePaymentSuccessOptionsError();\n return;\n }\n const message = result.ReasonCode ?\n this.paymentDetailsService.getcardFailureReasonMessage(result.ReasonCode)\n : result.PaymentMessage;\n this.handleFailurePayment(message);\n }\n }, () => {\n this.showError(this.resourceService.get('PAYBALANCEERROR'));\n });\n }\n\n private formatClearRequestPayload(): AddOptionsRequest {\n const root = this.urlUtils.getOrigin() + this.rootPath.getRootPath();\n const payPalCallbackUrl =\n '{0}addoptionspaypalcallback?paymentId={1}&bookingId={2}&ppResp={3}' +\n '&amendBookingOptionsId={4}&pageUrl={5}';\n\n let request: AddOptionsRequest = {\n BookingId: this.bookingId,\n AmendBookingOptionsId: this.amendBookingOptionsId, //Default, As it is not existing payment.\n PaymentRequest: {\n BookingId: this.bookingId,\n DomainId: TRPCONFIG.Domain.DomainId,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n Amount: this.selectedOptionsTotalPrice,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n PayPalCallbackUrl: String.format(payPalCallbackUrl, root, '$PaymentId', this.bookingId, 'success',\n this.amendBookingOptionsId, this.getConfig().pageUrl),\n PayPalCancellationUrl: String.format(payPalCallbackUrl, root, 0, this.bookingId, 'cancel',\n this.amendBookingOptionsId, this.getConfig().pageUrl)\n },\n [this.getConfig().selectedOptionsRequest]: this[this.getConfig().selectedOptionsBinding]\n };\n\n this.paymentsUtilService.addPaymentDetailsToClearRequest(this.paymentModel, request.PaymentRequest);\n\n return request;\n }\n\n private finaliseOptions(data): void {\n this.block(true);\n this.flightExtrasService.finaliseOptions(this.formatFinaliseOptionsRequestPayload(data))\n .then((result: AddOptionsToBookingResponse) => {\n this.$scope.$broadcast('3DSValidationFinished', result.Success);\n\n if (result.Success) {\n this.$location.path(String.format(this.getConfig().completeUrl, this.bookingId));\n } else {\n if (result.PostPayment) {\n this.handlePaymentSuccessOptionsError();\n return;\n }\n this.handleFailurePayment(result.PaymentMessage);\n }\n }, () => {\n this.showError(this.resourceService.get('AUTHORISEEERROR'));\n });\n\n this.$scope.$apply(() => {\n this.threedsRedirecting = false;\n });\n }\n\n private formatFinaliseOptionsRequestPayload(data): Core.FinaliseOptionsRequest {\n return {\n BookingId: this.bookingId,\n AmendBookingOptionsId: this.amendBookingOptionsId,\n PaymentId: data.prePaymentId,\n PaRes: decodeURIComponent(data.paRes),\n MD: data.md,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode\n };\n }\n\n private showError(msg): void {\n this.$scope.$broadcast('flash:error', msg);\n }\n\n private block(completing) {\n this.$scope.$emit('block', {\n title: this.resourceService.get(completing ? 'COMPLETINGPAYMENT' : 'PREPARINGPAYMENT'),\n loadingScreenStyle: 'default-addBaggage'\n });\n }\n\n private redirectTo3dSecurePayment(result): void {\n const root = this.urlUtils.getOrigin() + this.rootPath.getRootPath();\n //Create threeDSecure object\n this.ThreeDSecure = {\n PaReq: result.PaReq,\n MD: result.MD,\n TermUrl: String.format('{0}threedsecure?prePaymentID={1}', root, result.PaymentId),\n AcsUrl: result.AcsUrl,\n CanByPass: result.AllowThreeDSecureBypass,\n PrePaymentID: result.PaymentId\n };\n this.$scope.$broadcast('request3DSValidation', this.ThreeDSecure, {\n Journey: 'AddOptions',\n BookingID: this.bookingId,\n SignedIn: this.currentUser.get().SignedIn\n });\n this.threedsRedirecting = true;\n this.broker.publish('unblock');\n this.$scope.$emit('unblock');\n }\n\n private handleFailurePayment(msg): void {\n const messages = [this.resourceService.get('PAYMENTFAILED') + msg,\n String.format(this.resourceService.get('PAYMENTASSISTENCE'),\n this.resourceService.get('TELEPHONENUMBER'))];\n this.showErrorMessages(messages);\n }\n\n private handlePaymentSuccessOptionsError(): void {\n const message = String.format(this.resourceService.get('AMENDMENTERRORMSG'),\n this.resourceService.get('TELEPHONENUMBER'));\n this.showErrorMessages(message);\n }\n\n private showErrorMessages(messages): void {\n this.showError(messages);\n this.broker.publish('unblock');\n this.$scope.$emit('unblock');\n }\n }\n}\n","///\n\nnamespace Dashboard {\n\n class AddBaggage extends AddOption {\n private buttonLabel : string;\n\n constructor(\n protected $location: ng.ILocationService,\n protected $q: ng.IQService,\n protected $routeParams,\n protected $scope: ng.IScope,\n protected $window: ng.IWindowService,\n protected broker: Core.Broker,\n protected customCurrencyFilter,\n protected dashboardBookingService,\n protected flightExtrasService,\n protected mybTrack,\n protected paymentDetailsService,\n protected paymentsService,\n protected paymentsUtilService: Core.PaymentsUtilService,\n protected resourceService: Core.ResourceService,\n protected rootPath: Core.RootPath,\n protected urlUtils,\n protected dateUtil,\n protected currentUser\n ) {\n\n super($location,\n $q,\n $routeParams,\n $scope,\n $window,\n broker,\n customCurrencyFilter,\n dashboardBookingService,\n flightExtrasService,\n mybTrack,\n paymentDetailsService,\n paymentsService,\n paymentsUtilService,\n resourceService,\n rootPath,\n urlUtils,\n dateUtil,\n currentUser);\n this.$scope.$watch('cm.selectedOptions', () => this.updateButtonLabel());\n this.$scope.$watch('cm.paymentModel.fee', () => this.updateButtonLabel());\n }\n\n private updateButtonLabel(): void {\n this.buttonLabel = this.getButtonLabel();\n }\n\n private getButtonLabel() : string {\n if (this.selectedOptions && this.selectedOptions.length === 1) {\n return String.format(this.resourceService.get('PAYFORONEBAG'),\n this.customCurrencyFilter(this.selectedOptionsTotalPrice + this.paymentModel.fee));\n }\n if (this.selectedOptions && this.selectedOptions.length > 1) {\n return String.format(this.resourceService.get('PAYFORBAGS'),\n this.customCurrencyFilter(this.selectedOptionsTotalPrice + this.paymentModel.fee),\n this.selectedOptions.length);\n }\n return this.resourceService.get('ADDBAGSTOPAY');\n }\n\n protected analyticsTrackOpenOption() : void {\n this.mybTrack.track('MYB - Add Bag Payment', {\n NumberOfHoldBags: this.selectedOptions.length || 0,\n NumberOfHandBags: this.handBaggageInformation &&\n this.handBaggageInformation.PiecesAllowed,\n PaymentMethod: this.paymentMethodText[this.paymentTab] || '',\n Source: this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\n SuplierIds: this.supplierIds\n });\n }\n\n protected getConfig() : AddOptionConfig {\n return {\n completeUrl: 'dashboard/add-baggage/complete/{0}',\n optionsType: 'BagOptions',\n availableOptionsBinding: 'bagOptions',\n selectedOptionsBinding: 'selectedOptions',\n selectedOptionsRequest: 'SelectedOptions',\n analyticsTag: 'MYB - Open Add Bag',\n pageUrl: 'dashboard/add-baggage'\n };\n }\n\n protected canAddOption(optionsData) : boolean {\n return !!(optionsData && optionsData.CanAddBags);\n }\n }\n\n angular\n .module('dashboard')\n .controller('AddBaggage', AddBaggage);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('ContactDetail', ContactDetail);\n\nfunction ContactDetail($routeParams, $rootScope, $location, $q, dashboardBookingService, deliveryAddressService, resourceService, mybTrack) {\n const cm = this;\n cm.updateDeliveryAddressWithlLeadContact = true;\n cm.bookingId = $routeParams.bookingId ? parseInt($routeParams.bookingId) : 0;\n cm.user = $rootScope.user;\n cm.isContactSaved = false;\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\n cm.cancelContactChange = cancelContactChange;\n\n mybTrack.track('MYB - Open Contact Details');\n\n cm.updateContactDetails = function() {\n const putContact = dashboardBookingService.putContact(cm.bookingId, cm.ContactDetails, cm.updateRelatedBooking);\n const putDeliveryAddress = cm.requireDeliverAddress ? deliveryAddressService.put(cm.bookingId, cm.updateDeliveryAddressWithlLeadContact ? cm.ContactDetails : cm.DeliveryAddress) : null;\n\n $q.all([putContact, putDeliveryAddress]).then(function() {\n cm.isContactSaved = true;\n }, function() {\n $rootScope.$broadcast('flash:error', resourceService.get('CONTACTSAVEDERROR'));\n cm.isContactSaved = false;\n });\n };\n\n dashboardBookingService.getContact(cm.bookingId).then(function(contactDetail) {\n cm.ContactDetails = contactDetail.data;\n });\n\n function _processDeliveryAddress(bookingType) {\n if (bookingType === cm.bookingType.attraction) {\n //Require delivery address only for attractions\n cm.requireDeliverAddress = true;\n\n deliveryAddressService.get(cm.bookingId).then(function(deliveryAddress) {\n cm.DeliveryAddress = deliveryAddress.data;\n //Setting this to true, only if on load, delivery address is matched with contact address.\n cm.updateDeliveryAddressWithlLeadContact = _.isMatch(cm.ContactDetails, cm.DeliveryAddress);\n });\n }\n }\n\n dashboardBookingService.getOutstandingTrips(null, $routeParams.bookingId).then(function(trips) {\n const trip = trips && trips.length > 0 ? trips[0] : null;\n cm.hasLinkedBookings = trip.Bookings.length > 1;\n const bookingInfo = cm.hasLinkedBookings ? _.find(trip.Bookings, b => b.BookingId === cm.bookingId) : trip.Bookings.length > 0 ? trip.Bookings[0] : null;\n _processDeliveryAddress(bookingInfo.Type);\n\n cm.bk = bookingInfo;\n cm.leadPassenegr = { FirstName: bookingInfo.LeadPassengerFirstName, LastName: bookingInfo.LeadPassengerLastName };\n });\n\n function cancelContactChange() {\n $location.path(`dashboard/bookings/reference/${cm.bookingId}`);\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('Csr', Csr);\n\nfunction Csr($routeParams,\n $location,\n $timeout,\n dashboardCsrService,\n dashboardBookingService,\n bookingsManagerService,\n resourceService,\n broker,\n mybTrack) {\n const cm = this;\n\n cm.bookingId = $routeParams.bookingId;\n cm.getCSRStatus = dashboardCsrService.getCSRStatus;\n cm.getResourceValue = resource => resourceService.get(resource);\n cm.next = next;\n cm.previous = previous;\n cm.createCsr = createCsr;\n cm.currentStep = 2;\n cm.view = view;\n cm.resetCsrForm = resetCsrForm;\n cm.goToCreateCsr = goToCreateCsr;\n cm.CsrFaqCheckEnabled = TRPCONFIG.Domain.CsrFaqCheckEnabled;\n cm.csrCategoryChanged = csrCategoryChanged;\n cm.returnUrl = `/dashboard/csr/${cm.bookingId}`;\n cm.baseUrl = '/dashboard';\n cm.disableFaq = TRPCONFIG.Domain.DisableFAQs;\n cm.isInProgress = false;\n\n mybTrack.track('MYB - Open CSR');\n\n function _linkCSR(csrs) {\n cm.csr = csrs;\n cm.allCsr = [...csrs.pending, ...csrs.completed];\n }\n\n function _rejectCSR() {\n $location.path('dashboard/bookings/current');\n }\n\n dashboardCsrService.getCSRSummary(cm.bookingId).then(_linkCSR, _rejectCSR);\n\n dashboardBookingService.getBookingInfo(cm.bookingId).then(function(booking) {\n cm.bk = booking;\n dashboardCsrService.getCsrCategories(booking.Type, cm.bookingId).then(function(categories) {\n cm.csrCategories = categories;\n if (TRPCONFIG.Domain.HideCancelCSRForAutoCancellableBooking) {\n let csrCancelId = TRPCONFIG.Domain.CancelCSRId || 3;\n bookingsManagerService.getCancellationOptions(booking.BookingId).then(booking => {\n if (booking.CanAutoCancel) {\n $timeout(() => {\n cm.csrCategories = _.filter(categories, c => {\n return c.Id !== csrCancelId;\n });\n });\n }\n });\n }\n\n if ($routeParams.id) {\n cm.newCsr.Category = _.find(cm.csrCategories, c => c.Id === parseInt($routeParams.id));\n csrCategoryChanged();\n }\n });\n cm.newCsr = {};\n cm.newCsr.TextAlerts = TRPCONFIG.Domain.CsrTextAlertsEnabled;\n\n cm.childActions = dashboardBookingService.getChildActions(booking.BookingOptions.Actions, 'CSR');\n });\n\n dashboardBookingService.getContact(cm.bookingId).then(function(contactDetail) {\n cm.ContactDetails = contactDetail.data;\n });\n\n\n function resetCsrForm() {\n cm.newCsr = {};\n cm.newCsr.TextAlerts = TRPCONFIG.Domain.CsrTextAlertsEnabled;\n }\n\n function next() {\n cm.currentStep++;\n }\n\n function previous() {\n cm.currentStep--;\n }\n\n function createCsr() {\n cm.isInProgress = true;\n const csrTrackingData = {\n CategoryId: cm.newCsr.Category.Id,\n CategoryText: cm.newCsr.Category.Text,\n TextAlert: !!cm.newCsr.TextAlerts\n };\n mybTrack.track('MYB - CSR', csrTrackingData);\n dashboardCsrService.createCsr(cm.newCsr, cm.bookingId, cm.ContactDetails.MobileTel).then(function(data) {\n //if text alert is selected // update contact details.\n if (cm.newCsr.TextAlerts) {\n dashboardBookingService.putContact(cm.bookingId, cm.ContactDetails).then(() => cm.isInProgress = false);\n } else {\n cm.isInProgress = false;\n }\n cm.newCsr.csrId = data.Id;\n next();\n broker.publish('csrRaised');\n cm.csrCreated = true;\n });\n }\n\n function view(csr) {\n $location.path(`${cm.baseUrl}/csr-details/${csr.BookingId}/${csr.CsrId}`);\n }\n\n function goToCreateCsr(couldNotFindAnswer) {\n if (cm.CsrFaqCheckEnabled && !couldNotFindAnswer) {\n return false;\n }\n $location.path(`dashboard/create-csr/${cm.bookingId}`);\n }\n\n function csrCategoryChanged() {\n cm.newCsr.Subject = cm.newCsr.Category.Text;\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('CsrDetails', CsrDetails);\n\nfunction CsrDetails($routeParams,\n dashboardCsrService) {\n const cm = this;\n\n cm.getCSRStatus = status => dashboardCsrService.getCSRStatus(status);\n cm.bookingId = $routeParams.bookingId;\n cm.getCsrStatusClass = status => dashboardCsrService.getCsrStatusClass(status);\n\n cm.returnUrl = `/dashboard/csr/${cm.bookingId}`;\n\n dashboardCsrService.getCSRDetail($routeParams.csrId).then(function(res) {\n cm.csrDetails = res;\n });\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('DashboardBookings', DashboardBookings);\n\nfunction DashboardBookings(\n currentUser,\n $location,\n $interpolate,\n dashboardBookingService,\n $routeParams,\n resourceService,\n dateUtil,\n crossSellService,\n onlineCheckinService,\n preferences,\n dashboardBookingsErrorMessage,\n dashboardNotificationService,\n scrollService,\n $q,\n imageService,\n mybTrack,\n dashboardCsrService,\n enumService) {\n if (!$routeParams.bookingId && $routeParams.bookingPeriod !== 'current' && $routeParams.bookingPeriod !== 'previous') {\n $location.path('dashboard/bookings/current');\n }\n\n const cm = this;\n\n if ($routeParams.selectBooking) {\n cm.selectBooking = true;\n cm.bookingSelected = bookingSelected;\n cm.redirectUrlPostBookingSelect = $routeParams.redirectUrlPostBookingSelect;\n cm.previousBookings = `dashboard/bookings/previous/selectbooking/${cm.redirectUrlPostBookingSelect}`;\n cm.currentBookings = `dashboard/bookings/current/selectbooking/${cm.redirectUrlPostBookingSelect}`;\n } else {\n cm.previousBookings = 'dashboard/bookings/previous';\n cm.currentBookings = 'dashboard/bookings/current';\n }\n\n cm.user = currentUser.get();\n cm.translateActionLink = translateActionLink;\n\n cm.limitBooking = dashboardBookingService.getLimitBooking();\n cm.next = next;\n cm.actionLink = dashboardBookingService.getActionLinks();\n cm.getResourceValue = resource => resourceService.get(resource);\n cm.setExpandedTrip = setExpandedTrip;\n cm.addDays = dateUtil.todayPlus;\n cm.bookCrossSell = bookCrossSell;\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\n cm.formatBookingMessage = dashboardBookingService.formatBookingMessage;\n cm.getCrossSellTeaserText = getCrossSellTeaserText;\n cm.getCrossSellStartingFromText = getCrossSellStartingFromText;\n cm.getTripTitle = dashboardBookingService.getTripTitle;\n cm.getCrossSellTitle = getCrossSellTitle;\n cm.getTripDateText = dashboardBookingService.getTripDateText;\n cm.actionClick = dashboardBookingService.actionClick;\n cm.getFuturePayments = dashboardBookingService.getFuturePayments;\n\n const pageSize = 10;\n cm.bookingStatus = dashboardBookingService.getBookingStatus();\n\n cm.loadingBooking = true;\n\n const trackEvent = {\n current: 'MYB - Current Booking',\n previous: 'MYB - Previous Booking'\n };\n if (trackEvent[$routeParams.bookingPeriod]) {\n mybTrack.track(trackEvent[$routeParams.bookingPeriod]);\n }\n\n $q.all([\n preferences.get('canceledBooking'),\n dashboardBookingService.getOutstandingTrips($routeParams.bookingPeriod, $routeParams.bookingId, true)\n ]).then(function(results) {\n const showCanceledBookings = results[0];\n cm.loadingBooking = false;\n cm.trips = results[1];\n if (showCanceledBookings === false) {\n cm.trips = dashboardBookingService.removeCanceledBookings(cm.trips);\n }\n if (TRPCONFIG.Domain.FlightCheckinEnabled && $routeParams.bookingPeriod === 'current') {\n onlineCheckinService.addCheckinData(cm.trips);\n }\n cm.bookingNotYoursId = dashboardBookingsErrorMessage.getMessage();\n if (cm.bookingNotYoursId) {\n cm.bookingNotYours = true;\n }\n\n bookingConfirmed();\n\n dashboardCsrService.addCsrToBooking(cm.trips);\n });\n\n //Notifications\n cm.notificationClicked = notification => dashboardNotificationService.notificationClicked(notification);\n cm.formatNotification = notification => dashboardNotificationService.formatNotification(notification);\n //End notifications\n\n function translateActionLink(link, booking) {\n return link ? $interpolate(link)(booking) : '';\n }\n\n function next() {\n cm.limitBooking += pageSize;\n dashboardBookingService.setLimitBooking(cm.limitBooking);\n }\n\n function setExpandedTrip(tr, $event) {\n if (!tr.isExpanded) {\n tr.isExpanded = true;\n cm.trips.forEach(function(t) {\n t.isExpanded = (t.TripId === tr.TripId);\n });\n scrollService.scrollTo($event.target, { animate: true });\n\n const flightBooking = _.find(tr.Bookings, b => b.Type === 1);\n crossSellService.addExtrasAndCrossSells(tr);\n if (flightBooking && !flightBooking.ObjectId) {\n dashboardBookingService.getObjectFromBooking(flightBooking.BookingId).then(obj =>\n flightBooking.ImageUrl = imageService.getDestinationImage(obj, 300, 190)\n );\n }\n }\n }\n\n function bookCrossSell(trip, crossSell) {\n if (crossSell) {\n mybTrack.track('MYB - Cross Sell Click', {\n ProductType: crossSell.Code\n });\n }\n if (crossSell.CrossSellType === enumService.CrossSellType.Seats ||\n crossSell.CrossSellType === enumService.CrossSellType.Baggage) {\n if (cm.actionLink) {\n const path = cm.translateActionLink(cm.actionLink[crossSell.Name], { BookingId: crossSell.BookingId });\n $location.url(path);\n }\n } else {\n crossSellService.startCrossSellJourney(trip.Bookings[0].BookingId, crossSell);\n }\n }\n\n function bookingConfirmed() {\n let isConfirmed = false;\n if (cm.trips.length > 0 && cm.trips[0].Bookings.length > 0) {\n isConfirmed = cm.trips[0].Bookings[0].Status === 1;\n }\n mybTrack.track('MYB - Booking Dashboard', {\n Reciepted: isConfirmed\n });\n }\n\n function bookingSelected(bookingId) {\n $location.path(`dashboard/${cm.redirectUrlPostBookingSelect}/${bookingId}`);\n }\n\n function getCrossSellTeaserText(productType) {\n return resourceService.get(`${productType.toUpperCase()}_CROSSSELL_TEASER`);\n }\n\n function getCrossSellStartingFromText(productType) {\n return resourceService.get(`${productType.toUpperCase()}_CROSSSELL_STARTING_FROM`);\n }\n\n function getCrossSellTitle(productType) {\n return resourceService.get(`${productType.toUpperCase()}_CROSSSELL_TITLE`);\n }\n}\n})();\n","namespace Dashboard {\n\n export class DashboardBookingDetails {\n\n bookingId: number;\n bookingTypeMap: {[key:string]:number};\n bookingInfoItemType: {[key:string]:number};\n\n isAtolProtectedBooking: boolean;\n displaySupplierRef: boolean;\n childActions: any;\n bookedItems: any;\n packageCost: any;\n template: any;\n booking: any;\n pah: {Amount: number, CurrencyCode: string};\n bk: any;\n leadPassengerEmail: string;\n emailSent: boolean;\n holidayDestination: string;\n holidayDestinationEnGb: string;\n daysToGo: number;\n nights: any;\n ActiveTab: string = 'Holiday';\n numberOfRooms: number;\n totalPackagePrice: any;\n Adults: any;\n Children: any;\n Infants: any;\n hotelsRooms: string[] = [];\n hotelsRoomsEnGb: any[] = [];\n holidayStartDate: any;\n holidayReturnDate: any;\n accessBooking: boolean = true;\n fallbackEn: boolean = false;\n\n constructor(\n private $routeParams:ng.route.IRouteParamsService,\n private dashboardBookingService,\n private imageService,\n private dateUtil,\n private resourceService:Core.ResourceService,\n private paymentsService,\n private mybTrack,\n private authService\n ) {\n this.bookingId = parseInt($routeParams['bookingId'], 10);\n this.bookingTypeMap = dashboardBookingService.getBookingTypeMap();\n this.bookingInfoItemType = dashboardBookingService.getBookingInfoItemType();\n if (TRPCONFIG.Domain.CultureCode !== TRPCONFIG.Domain.MYBDefaultCultureCode) {\n this.getFallbackEnGbData();\n }\n this.getBookingInfo();\n this.getBookingDetail();\n }\n\n getBookingInfo():void {\n this.dashboardBookingService.getBookingInfo(this.bookingId)\n .then((booking:any) => {\n this.booking = booking;\n this.pah = this.dashboardBookingService.getPahFromNotifications(booking.Notifications);\n this.accessBooking = this.canAccessBooking(booking);\n if (booking.BookingOptions && booking.BookingOptions.Actions) {\n this.childActions = this.dashboardBookingService\n .getChildActions(booking.BookingOptions.Actions, 'VIEWBOOKINGDETAILS');\n }\n });\n }\n\n canAccessBooking(bnd) {\n let access = true;\n // Checks bundle has a BookingUIStatus of 'OK'\n if (bnd.Status !== 1) {\n access = false;\n }\n return access;\n }\n\n resendEmailToLead(): void {\n this.dashboardBookingService.sendConfirmationEmail([this.leadPassengerEmail], this.bookingId).then(res => {\n this.emailSent = true;\n this.mybTrack.track('MYB - Resend Email');\n });;\n }\n\n getBookingDetail():void {\n this.dashboardBookingService.getBookingDetail(this.bookingId, true)\n .then((data:any) => {\n this.bk = data;\n this.leadPassengerEmail = data.LeadPassenger.Email;\n this.hotelsRooms = [];\n let holidayDestinationsArr: string[] = [];\n let EstabTitle: string = '';\n let roomText: any = {};\n const finalTripItineraries = this.dashboardBookingService.filterFinalBookings(data.TripItineraries);\n finalTripItineraries.forEach((t) => {\n t.Itineraries.forEach((i) => {\n /* look for the earliest date in all booked products */\n if (this.holidayStartDate) {\n if (this.dateUtil.compareDates(this.holidayStartDate, i.StartDate) === 1) {\n this.holidayStartDate = i.StartDate;\n }\n } else {\n this.holidayStartDate = i.StartDate;\n }\n /* look for the last date in all booked products */\n if (this.holidayReturnDate) {\n if (this.dateUtil.compareDates(i.EndDate, this.holidayReturnDate) === 1) {\n this.holidayReturnDate = i.EndDate;\n }\n } else {\n this.holidayReturnDate = i.EndDate;\n }\n });\n });\n for (let i=0; i< data.TripItineraries.length; i++) {\n if(data.TripItineraries[i].BookingType === 8 && data.TripItineraries[i].BookingStatus === 2) {\n if (holidayDestinationsArr.indexOf(data.TripItineraries[i].Itineraries[0].Province) === -1\n && data.TripItineraries[i].Itineraries[0].Province){\n holidayDestinationsArr.push(data.TripItineraries[i].Itineraries[0].Province);\n }\n EstabTitle = data.TripItineraries[i].Itineraries[0].EstabTitle;\n roomText = {\n numberOfRooms : data.TripItineraries[i].Itineraries.length,\n EstabTitle : EstabTitle,\n EstabId : data.TripItineraries[i].Itineraries[0].EstabId\n };\n if (!EstabTitle) {\n this.fallbackEn = true;\n }\n this.hotelsRooms.push(roomText);\n }\n }\n this.holidayDestination = holidayDestinationsArr.toString();\n this.holidayDestination = this.holidayDestination.length > 1 ?\n this.holidayDestination.split(',').join(', ') : this.holidayDestination;\n this.Adults = [];\n this.Children = [];\n this.Infants = [];\n data.Passengers.forEach((Pass)=>{\n if (Pass.TypeId === 1) {\n this.Adults.push(Pass);\n } else if (Pass.TypeId === 2) {\n this.Children.push(Pass);\n } else if (Pass.TypeId === 3) {\n this.Infants.push(Pass);\n }\n });\n if (this.holidayStartDate) {\n this.daysToGo = this.dateUtil.numberOfNights(new Date(), this.holidayStartDate);\n }\n if (this.holidayStartDate && this.holidayReturnDate) {\n this.nights = this.dateUtil.numberOfNights(this.holidayStartDate, this.holidayReturnDate);\n }\n\n this.template = data.Itineraries ?\n `partials/dashboard/ItineraryTemplate?Type=${data.Booking.LongType.template}` : null;\n\n this.displaySupplierRef = data.BalanceDueInfo ?\n !(data.Booking.Type === 1 && data.BalanceDueInfo.BalanceDueAmount >\n TRPCONFIG.Domain.SupplierRefBalanceThreshold) : true;\n\n if (data.BookedItemAndPackageCost) {\n this.packageCost = (TRPCONFIG.Domain.PackagePrice || data.PackageId)\n && data.BookedItemAndPackageCost.PackageCost;\n this.isAtolProtectedBooking = data.BookedItemAndPackageCost.IsAtolProtected;\n this.bookedItems = data.BookedItemAndPackageCost.BookedItems;\n this.totalPackagePrice = this.sumCosts(this.bookedItems);\n }\n\n this.mybTrack.track('MYB - View Booking Details', {\n PaidInFull: this.bk.BalanceDueInfo === null ? true : false\n });\n\n _.forEach(this.bk.ClearedPayments, (p:any) => {\n p.LogoName = _.first(this.paymentsService.getLogosList([{ Title: p.CardTypeTitle }])) || 'external';\n });\n });\n }\n\n getFallbackEnGbData ():void {\n this.dashboardBookingService.getBookingDetail(this.bookingId, true, 'en-gb')\n .then((data:any) => {\n if(TRPCONFIG.Domain.MYBDefaultCultureCodeEnable) {\n this.fallbackEn = true;\n }\n this.bk = data;\n const hotelData = this.getHotelsData(data);\n this.hotelsRoomsEnGb = hotelData[1];\n this.holidayDestinationEnGb = hotelData[0].toString();\n this.holidayDestinationEnGb = this.holidayDestinationEnGb.length > 1 ?\n this.holidayDestinationEnGb.split(',').join(', ') : this.holidayDestinationEnGb;\n });\n }\n\n getHotelsData(data) {\n let holidayDestinationsArr: string[] = [];\n let hotelsRooms: any[] = [];\n let roomText: any = {};\n for (let i=0; i< data.TripItineraries.length; i++) {\n if(data.TripItineraries[i].BookingType === 8 && data.TripItineraries[i].BookingStatus === 2) {\n if (holidayDestinationsArr.indexOf(data.TripItineraries[i].Itineraries[0].Province) === -1\n && data.TripItineraries[i].Itineraries[0].Province){\n holidayDestinationsArr.push(data.TripItineraries[i].Itineraries[0].Province);\n }\n roomText[data.TripItineraries[i].Itineraries[0].EstabId] = {\n numberOfRooms : data.TripItineraries[i].Itineraries.length,\n EstabTitle : data.TripItineraries[i].Itineraries[0].EstabTitle,\n Address : data.TripItineraries[i].Itineraries[0].Address\n };\n hotelsRooms.push(roomText);\n }\n }\n return [holidayDestinationsArr, hotelsRooms];\n }\n\n getTitle(id) {\n if (this.hotelsRoomsEnGb && this.hotelsRoomsEnGb[0][id] && this.hotelsRoomsEnGb[0][id].EstabTitle) {\n return this.hotelsRoomsEnGb[0][id].EstabTitle;\n }\n }\n\n actionClick(action:{[key:string]:any}, bk:{[key:string]:any}):void {\n this.dashboardBookingService.actionClick(action, bk);\n }\n\n getResourceValue(resource:string):string {\n return this.resourceService.get(resource);\n }\n\n getPaymentTitle(payment){\n return `${payment.CardTypeTitle != null ?\n payment.CardTypeTitle : payment.Title != null ? payment.Title : ''}`;\n }\n\n sumCosts(costs) {\n return (costs || []).reduce((sum, cost) => {\n sum.total += (cost.Quantity * cost.UnitAmount);\n sum.netTotal += (cost.Quantity * cost.NetUnitAmount);\n sum.totalTravelAgentCommission += (cost.Quantity * cost.TravelAgentCommission);\n return sum;\n }, { total: 0, netTotal: 0, totalTravelAgentCommission: 0 });\n }\n\n signOut() {\n this.authService.signOut();\n }\n }\n\n angular\n .module('dashboard')\n .controller('DashboardBookingDetails', DashboardBookingDetails);\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('ResendVoucher', ResendVoucher);\n\nfunction ResendVoucher(dashboardBookingService, $routeParams, $rootScope, resourceService) {\n const cm = this;\n const bookingId = $routeParams.bookingId;\n\n cm.sendConfirmationEmail = sendConfirmationEmail;\n\n const validEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n dashboardBookingService.getContact(bookingId).then(function(contactDetail) {\n cm.Emails = contactDetail.data.Email;\n });\n\n dashboardBookingService.getBookingInfo(bookingId).then(function(booking) {\n cm.bk = booking;\n });\n\n function sendConfirmationEmail() {\n const emailsArray = cm.Emails.split(',');\n for (let i = emailsArray.length - 1; i >= 0; i--) {\n const email = emailsArray[i].trim();\n if (!validEmail.test(email)) {\n $rootScope.$broadcast('flash:error', String.format(resourceService.get('VOUCHERINVALID'), email));\n return;\n }\n }\n\n\n dashboardBookingService.sendConfirmationEmail(emailsArray, bookingId).then(function() {\n //$rootScope.$broadcast('flash:success', resourceService.get('VOUCHERSENT'));\n cm.isEmailSent = true;\n }, function() {\n $rootScope.$broadcast('flash:error', resourceService.get('VOUCHERSENTERROR'));\n });\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('DashboardReview', DashboardReview);\n\nfunction DashboardReview($q,\n $location,\n $routeParams,\n dashboardService,\n dashboardReviewService,\n dashboardBookingService,\n preferences,\n dateUtil,\n imageService,\n reviewService,\n scrollService,\n broker,\n action,\n resourceService,\n mybTrack,\n currentUser\n) {\n const cm = this;\n cm.bookingReviewStatus = {\n CannotLeaveReview: 0,\n CanLeaveReview: 1,\n HasLeftReview: 2\n };\n cm.showMoreReviews = showMoreReviews;\n cm.getRatingTitleText = getRatingTitleText;\n cm.saveReview = saveReview;\n cm.editReview = dashboardReviewService.editReview;\n cm.ratingRange = dashboardReviewService.ratingRange;\n cm.sutabilityAnswers = dashboardReviewService.sutabilityAnswers;\n cm.recommendTRPAnswers = dashboardReviewService.recommendTRPAnswers;\n cm.recommendTRPChange = dashboardReviewService.recommendTRPChange;\n cm.reviewLater = reviewLater;\n cm.reviews = [];\n cm.limitToNumber = 10;\n cm.reviewsPage = 0; //--for client pagination\n cm.loadingReviews = true;\n cm.loadingHotelReviews = true;\n cm.reviewsVisibleCount = 0;\n cm.sortOptions = dashboardReviewService.getReviewSortCriteria();\n cm.getResourceValue = resource => resourceService.get(resource);\n cm.showBookingBreadcrumb = 'review-hotel' === action;\n cm.bookingType = dashboardBookingService.getBookingTypeMap();\n cm.hideHotelHeader = true;\n\n if (action !== 'review-submitted') {\n mybTrack.track('MYB - My Reviews');\n let urlSource = $location.search().source ? $location.search().source : 'MYB';\n if (!($routeParams.userId && $routeParams.token && urlSource === 'MYB')) {\n // the extra condition is a work around, because url from email reloads the page twice,\n // so to ignore the tracking in second reload, using this condition, Will remove the condition when the reloading issue is fixed\n mybTrack.track('HotelReviewForm Landing', { source: urlSource });\n }\n }\n\n $q.all([dashboardReviewService.getRatingTitles(), dashboardReviewService.getStatements()]).then(function() {\n cm.reviewEnable = true;\n let objectId = $routeParams.objectId;\n\n if (action === 'review-hotel') {\n //not great but we want to follow a slightly different path if we are doing a non authenticated booking\n\n if ($routeParams.bookingId && $routeParams.userId && $routeParams.token) {\n //we need to have a booking id, user id and token\n _checkEnterReviewPage($routeParams.bookingId, $routeParams.token, $routeParams.userId);\n $location.search({});\n cm.showBookingBreadcrumb = false;\n } else {\n _checkEnterReviewPage($routeParams.bookingId, null, null);\n }\n } else if (action === 'review-submitted' && !objectId) {\n dashboardBookingService.getBookingInfo($routeParams.bookingId).then(function(bk) {\n if (bk.Type === cm.bookingType.accommodation) {\n _reviewPageFactory(bk.ObjectId, $routeParams.bookingId, null, null);\n } else {\n cm.reviewStatus = cm.bookingReviewStatus.CannotLeaveReview;\n cm.notHotelBooking = true;\n }\n });\n } else {\n _reviewPageFactory(objectId, $routeParams.bookingId, null, null);\n }\n });\n\n //for default sort by likes\n cm.sortoption = cm.sortOptions[1].val;\n cm.showUnreviewedHotels = true;\n cm.reviewNow = reviewNow;\n cm.cancelReview = cancelReview;\n cm.selectVisitedHotel = selectVisitedHotel;\n\n function _reviewPageFactory(objectId, bookingId) {\n let user = currentUser.get();\n if (action === 'review-submitted') {\n _prepareReviewCompletePage(bookingId, objectId);\n } else if (user && user.HardSignedIn) {\n _processDashboardAggregateData();\n } else {\n _errorCallback();\n }\n }\n\n function _errorCallback() {\n cm.loadingReviews = false;\n cm.reviewsLoadError = true;\n }\n\n function _checkEnterReviewPage(bookingId, token, userId) {\n const dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\n\n let processData = data => {\n //do some checks to make sure the review hasn't already been submitted / they can leave a review\n\n let getSelectedHotelInfo = reviewData => {\n let estabId = reviewData.EstabId;\n\n return dashboardService.getHotelsById([estabId]).then(hotels => {\n return {\n EstablishmentDetail: hotels[0],\n ImageUrl: imageService.getMainImageUrl(estabId, dim, dim),\n BookingDetail: {\n StartDate: reviewData.CheckInDate,\n BookingRef: reviewData.BookingRef,\n BookingId: bookingId,\n LeadPassengerContact: {\n Title: reviewData.LeadContact.Title,\n FirstName: reviewData.LeadContact.FirstName,\n Surname: reviewData.LeadContact.LastName\n }\n },\n reviewSaved: false\n };\n });\n };\n\n let status = data.ReviewStatus;\n if (status === reviewService.reviewStatus.CanLeaveReview) {\n getSelectedHotelInfo(data).then(selectedHotel => {\n cm.selectedHotel = selectedHotel;\n cm.feedback = dashboardReviewService.getBookingFeedback();\n cm.hideHotelHeader = false;\n });\n } else if (status === reviewService.reviewStatus.HasLeftReview) {\n let user = currentUser.get();\n if (user && user.SignedIn) {\n $q.all([\n dashboardReviewService.getReview(bookingId),\n getSelectedHotelInfo(data)\n ]).then(results => {\n cm.existingReview = results[0];\n cm.selectedHotel = results[1];\n cm.hideHotelHeader = false;\n });\n }\n }\n cm.reviewStatus = status;\n };\n\n //we need to make different calls depending on what params we have\n if (token && userId) {\n reviewService.getReviewDetailsUsingToken(bookingId, token, userId).then(d => processData(d));\n } else {\n reviewService.getReviewDetails(bookingId).then(d => processData(d));\n }\n }\n\n function _prepareReviewHeader(bookingId, objectId) {\n dashboardReviewService.getReviewHeaderData(bookingId, objectId).then(function(result) {\n cm.loadingReviewHeader = false;\n cm.selectedHotel = result;\n if (!cm.selectedHotel.EstablishmentDetail) {\n $location.path('dashboard/reviews');\n }\n });\n }\n\n function _processDashboardAggregateData() {\n dashboardService.getAggregate().then(function(result) {\n _splitByReviewed(result);\n cm.reviewsVisibleCount = ((cm.reviews.length / cm.limitToNumber) > 1 ? cm.limitToNumber : cm.reviews.length);\n _prepareMyReviewPageData(cm.unreviewedHotels[0]);\n }, _errorCallback);\n }\n\n function _prepareMyReviewPageData(unreviewedHotel) {\n if (unreviewedHotel) {\n _canShowUnreviewedHotels().then(result => {\n cm.loadingReviews = false;\n cm.showUnreviewedHotels = result;\n cm.selectedHotel = unreviewedHotel;\n cm.selectedHotel.BookingDetail.BookingRef = `${cm.selectedHotel.BookingDetail.BookingType}/${cm.selectedHotel.BookingDetail.BookingId}`;\n cm.feedback = dashboardReviewService.getBookingFeedback();\n cm.selectedHotelIndex = 0;\n cm.reviewStatus = cm.bookingReviewStatus.CanLeaveReview;\n cm.reviewLaterEnable = true;\n cm.hideHotelHeader = false;\n }, _errorCallback);\n } else {\n cm.loadingReviews = false;\n }\n }\n\n function _prepareReviewCompletePage(bookingId, objectId) {\n if (bookingId) {\n //get review site details\n dashboardReviewService.getReviewSiteDetails(bookingId).then(function(result) {\n cm.reviewSiteDetails = result;\n cm.reviewSiteDetails.Image = `/build/img/otherlogo${result.Image.substr(result.Image.lastIndexOf('/'))}`;\n });\n\n if (objectId) {\n _prepareReviewHeader(bookingId, objectId);\n\n reviewService.getReviews({ Id: objectId }, 0).then(function(result) {\n cm.hotelReviews = result.reviews;\n cm.loadingHotelReviews = false;\n });\n }\n }\n }\n\n function saveReview() {\n dashboardReviewService.saveReview(cm.selectedHotel, cm.feedback, $routeParams.token, $routeParams.userId)\n .then(function(result) {\n if (result) {\n broker.publish('reviewEntered');\n mybTrack.track('MYB - Review submitted', { UserRating: cm.feedback.rating });\n //goto submitted review page\n $location.path(`dashboard/reviews/submitted/${cm.selectedHotel.BookingDetail.BookingId}/${cm.selectedHotel.EstablishmentDetail.Id}`);\n } else {\n scrollService.scrollTo('#reviews-container');\n }\n });\n }\n\n function _splitByReviewed(aggregate) {\n //Reviewed Hotels\n cm.reviews = aggregate.reviews;\n cm.ReviewAggregates = {\n TotalReviews: cm.reviews.length,\n TotalLikeCount: countLikes()\n };\n\n //Unreviewed Hotels\n aggregate.estabs.UnreviewedHotels.sort(_dateSortReview);\n cm.unreviewedHotels = angular.copy(aggregate.estabs.UnreviewedHotels);\n cm.reviewedHotels = angular.copy(aggregate.estabs.ReviewedHotels);\n }\n\n function _dateSortReview(a, b) {\n const aDate = new Date(a.BookingDetail.EndDate);\n const bDate = new Date(b.BookingDetail.EndDate);\n\n return aDate >= bDate ? -1 : aDate < bDate ? 1 : 0;\n }\n\n function countLikes() {\n let likeCount = 0;\n angular.forEach(cm.reviews, function(review) {\n likeCount += review.LikeCount;\n });\n return likeCount;\n }\n\n function showMoreReviews() {\n cm.reviewsPage += 1;\n const count = cm.limitToNumber * (cm.reviewsPage + 1);\n cm.reviewsVisibleCount = ((cm.reviews.length / count) > 1 ? (count) : cm.reviews.length);\n }\n\n function getRatingTitleText(n) {\n return dashboardReviewService.getRatingTitleText(n);\n }\n\n function _canShowUnreviewedHotels() {\n return preferences.get('reviewReminder').then(function(reminderDate) {\n return !(reminderDate && dateUtil.parseDate(reminderDate) > new Date());\n });\n }\n\n function reviewLater() {\n cm.showUnreviewedHotels = false;\n const dt = dateUtil.todayPlus(0, TRPCONFIG.Domain.ReviewReminderHours, true);\n preferences.set('reviewReminder', dt);\n scrollService.scrollTo('#reviews-container');\n }\n\n function reviewNow() {\n $location.path(`review-hotel/${cm.selectedHotel.BookingDetail.BookingId}`);\n }\n\n function cancelReview() {\n $location.path('dashboard/reviews');\n }\n\n function selectVisitedHotel(index) {\n cm.selectedHotel = cm.unreviewedHotels[index];\n cm.selectedHotelIndex = index;\n }\n}\n})();\n","namespace Dashboard {\n\n class DashboardSeatSelection extends Dashboard.AddOption {\n\n private selectedSeats;\n\n constructor(\n protected $location: ng.ILocationService,\n protected $q: ng.IQService,\n protected $routeParams,\n protected $scope: ng.IScope,\n protected $window: ng.IWindowService,\n protected broker: Core.Broker,\n protected customCurrencyFilter,\n protected dashboardBookingService,\n protected flightExtrasService,\n protected mybTrack,\n protected paymentDetailsService,\n protected paymentsService,\n protected paymentsUtilService: Core.PaymentsUtilService,\n protected resourceService: Core.ResourceService,\n protected rootPath: Core.RootPath,\n protected urlUtils,\n protected dateUtil,\n protected currentUser\n ) {\n super($location,\n $q,\n $routeParams,\n $scope,\n $window,\n broker,\n customCurrencyFilter,\n dashboardBookingService,\n flightExtrasService,\n mybTrack,\n paymentDetailsService,\n paymentsService,\n paymentsUtilService,\n resourceService,\n rootPath,\n urlUtils,\n dateUtil,\n currentUser);\n }\n\n selectSeats (seats, seatsPostAdd) {\n this.selectedSeats = seatsPostAdd;\n }\n\n getSelectedSeats() {\n return [];\n }\n\n protected analyticsTrackOpenOption() {\n this.mybTrack.track('MYB - Add Seats Payment', {\n PaymentMethod: this.paymentMethodText[this.paymentTab] || '',\n Source: this.$routeParams.source === 'noneml' ? 'email' : 'cross-Sell',\n SuplierIds: this.supplierIds\n });\n }\n\n protected getConfig() {\n return {\n completeUrl: 'dashboard/seat-selection/complete/{0}',\n optionsType: 'SeatPlan',\n availableOptionsBinding: 'seatPlan',\n selectedOptionsBinding: 'selectedSeats',\n selectedOptionsRequest: 'SelectedSeats',\n analyticsTag: 'MYB - Open Add Seats',\n pageUrl: 'dashboard/seat-selection'\n };\n }\n\n protected canAddOption(optionsData) : boolean {\n return !!(optionsData && optionsData.CanAddSeats);\n }\n }\n\n\n angular\n .module('dashboard')\n .controller('DashboardSeatSelection', DashboardSeatSelection);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('DashboardSettings', Settings);\n\nfunction Settings($rootScope,\n $scope,\n userSettingsService,\n preferences,\n currentUser,\n authService,\n resourceService,\n arrayUtil,\n broker,\n paymentDetailsService,\n paymentsService,\n tokeniser,\n $timeout,\n $q,\n mybTrack) {\n const cm = this;\n const thisYear = new Date().getFullYear();\n let confirmed = false;\n\n cm.starRatings = userSettingsService.getStarRatings();\n cm.smokingRoom = userSettingsService.getSmokingRoomOptions();\n cm.footerToolbar = userSettingsService.getFooterToolbarOptions();\n cm.flightClass = userSettingsService.getFlightClassOptions();\n cm.hotelSortOrder = userSettingsService.getHotelCriteria();\n cm.flightSortOrder = userSettingsService.getFlightCriteria();\n cm.priceMode = userSettingsService.getPricMode();\n cm.titles = userSettingsService.getAdultTitles();\n cm.canceledBooking = userSettingsService.getCanceledBookingOprions();\n\n\n cm.savePreferences = saveUserPreferences;\n cm.cancelPreferences = cancelPreferences;\n cm.openChangePasswordPanel = openChangePasswordPanel;\n cm.closeChangePassword = closeChangePassword;\n cm.openChangeEmailPanel = openChangeEmailPanel;\n cm.changeContactDetails = changeContactDetails;\n cm.openEditContact = openEditContact;\n cm.changeEmail = changeEmail;\n cm.closeChangeEmail = closeChangeEmail;\n cm.changePassword = changePassword;\n cm.confirmRemoveCard = confirmRemoveCard;\n cm.closeEditRemoveCard = closeEditRemoveCard;\n cm.addCardDetails = addCardDetails;\n cm.addNewCard = addNewCard;\n cm.removeCard = removeCard;\n cm.cancelLoginDetailsChange = cancelLoginDetailsChange;\n\n cm.user = $rootScope.user;\n\n cm.months = arrayUtil.numberArray(1, 12);\n cm.years = arrayUtil.numberArray(thisYear, thisYear + 20);\n cm.deleteAccount = deleteAccount;\n\n cm.deleteButton = resourceService.getDeferred('DELETEACCOUNT');\n cm.deleteAccountConfirmed = deleteAccountConfirmed;\n cm.closeConfirmDeleteAccount = closeConfirmDeleteAccount;\n cm.showConfirmDeleteAccount = showConfirmDeleteAccount;\n cm.padZero = padZero;\n cm.getResourceValue = resource => resourceService.get(resource);\n\n const prefrenceOptionsMap = {\n starRatings: cm.starRatings,\n flightSortOrder: cm.flightSortOrder,\n hotelSortOrder: cm.hotelSortOrder,\n smokingRoom: cm.smokingRoom,\n priceMode: cm.priceMode,\n footerToolbar: cm.footerToolbar,\n flightClass: cm.flightClass,\n canceledBooking: cm.canceledBooking\n };\n\n const savedFrom = {\n SettingsTab: 1,\n BookingForm: 2\n };\n\n let userPreferenceBeforeChange = null;\n\n mybTrack.track('MYB - My Settings');\n\n function getPreferences() {\n let prefs = {};\n prefs.starRatings = cm.starRatings[0];\n prefs.flightSortOrder = cm.flightSortOrder[0];\n prefs.hotelSortOrder = cm.hotelSortOrder[0];\n prefs.smokingRoom = cm.smokingRoom[0];\n prefs.footerToolbar = cm.footerToolbar[1];\n prefs.priceMode = cm.priceMode[0];\n prefs.flightClass = cm.flightClass[0];\n prefs.canceledBooking = cm.smokingRoom[1];\n return preferences.getAllPreferences(cm.user).then(function(result) {\n prefs = organiseUserPreferenceData(prefs, result);\n userPreferenceBeforeChange = angular.copy(prefs);\n return prefs;\n });\n }\n\n getPreferences().then(p => { cm.userPreferences = p; });\n\n function savePreferences(prefs) {\n const prefsToBeSaved = {};\n angular.forEach(prefs, function(v, k) {\n prefsToBeSaved[k] = v.val instanceof Array ? v.val[0] : v.val;\n });\n\n preferences.setAllPreferences(prefsToBeSaved, cm.user).then(function() {\n cm.userPreferences = organiseUserPreferenceData(cm.userPreferences, prefsToBeSaved);\n userPreferenceBeforeChange = angular.copy(cm.userPreferences);\n cm.editHotelPref = false;\n cm.editFlightPref = false;\n cm.editSitePref = false;\n });\n }\n\n function saveUserPreferences() {\n if (cm.userPreferences.footerToolbar !== userPreferenceBeforeChange.footerToolbar) {\n broker.publish('footerToolbarChanged', cm.userPreferences.footerToolbar.val);\n }\n savePreferences(cm.userPreferences);\n }\n\n function cancelPreferences() {\n angular.forEach((userPreferenceBeforeChange), function(value, key) {\n const arrayToLook = prefrenceOptionsMap[key];\n const index = arrayUtil.indexOf(arrayToLook, function(item) {\n const itemVal = item.val instanceof Array ? item.val[0] : item.val;\n const valueVal = value.val instanceof Array ? value.val[0] : value.val;\n return itemVal === valueVal;\n });\n cm.userPreferences[key] = arrayToLook[index];\n });\n cm.editHotelPref = false;\n cm.editFlightPref = false;\n cm.editSitePref = false;\n }\n\n function organiseUserPreferenceData(prefs, userPreferences) {\n for (const key in prefs) {\n setModelForPreference(key, prefs, userPreferences);\n }\n return prefs;\n }\n\n function setModelForPreference(key, prefs, userPreferences) {\n const arrayToLook = prefrenceOptionsMap[key];\n if (arrayToLook && userPreferences[key] !== undefined) {\n for (let i = 0; i < arrayToLook.length; i++) {\n const checkVal = arrayToLook[i].val instanceof Array ? arrayToLook[i].val[0] : arrayToLook[i].val;\n if (userPreferences[key].toString() === checkVal.toString()) {\n prefs[key] = arrayToLook[i];\n break;\n }\n }\n } else if (arrayToLook) {\n prefs[key] = arrayToLook[0];\n }\n }\n\n function openChangePasswordPanel() {\n cm.showChangePassword = true;\n }\n\n function closeChangePassword() {\n cm.showChangePassword = false;\n }\n\n function openChangeEmailPanel() {\n cm.userEdit = angular.copy(cm.user);\n cm.showChangeEmail = true;\n }\n\n function closeChangeEmail() {\n cm.showChangeEmail = false;\n }\n\n function changeContactDetails() {\n authService.changeContactDetails(cm.userEdit).then(function() {\n cm.editContact = false;\n currentUser.set(cm.userEdit);\n $rootScope.user = currentUser.get();\n cm.user = $rootScope.user;\n });\n }\n\n function openEditContact() {\n cm.editContact = true;\n cm.userEdit = angular.copy(cm.user);\n }\n\n function changeEmail(model) {\n authService.changeEmail({\n Password: model.currentPassword,\n NewEmail: model.email\n }).then(function(res) {\n if (res.Result !== 0) {\n $scope.$broadcast('flash:error', resourceService.get('CHANGEEMAILFAILURE'));\n }\n });\n }\n\n function changePassword(model) {\n authService.changePassword({\n Password: model.currentPassword,\n NewPassword: model.newPassword\n }).then(function(res) {\n if (res.Result === 0) {\n $scope.$broadcast('flash:success', resourceService.get('CHANGEPASSWORDSUCCESS'));\n closeChangePassword();\n } else {\n $scope.$broadcast('flash:error', resourceService.get('CHANGEPASSWORDFAILURE'));\n }\n });\n }\n\n function cancelLoginDetailsChange() {\n cm.showChangeEmail = false;\n cm.showChangePassword = false;\n cm.changeEmailModel = null;\n cm.changePasswordModel = null;\n $scope.$broadcast('flash:hide');\n }\n\n broker.subscribe('dashboardSettingsCtrl', 'footerToolbarChanged', function(ev) {\n cm.userPreferences.footerToolbar = ev.data ? cm.footerToolbar[0] : cm.footerToolbar[1];\n });\n\n $scope.$on('$destroy', function() {\n broker.unsubscribe('dashboardSettingsCtrl', 'footerToolbarChanged');\n });\n\n function confirmRemoveCard(card) {\n card.showConfirmRemoveCard = true;\n }\n\n function closeEditRemoveCard(card) {\n card.showConfirmRemoveCard = false;\n }\n\n function _refreshPaymentCards() {\n paymentDetailsService.getPaymentCards().then(function(result) {\n cm.paymentCards = result;\n });\n }\n\n function addNewCard() {\n cm.addCard = true;\n cm.cardChangedTo = undefined;\n cm.paymentSuccess = false;\n }\n\n function addCardDetails(card) {\n const today = new Date();\n if (card.ExpiryDate.Year === today.getFullYear() && card.ExpiryDate.Month < today.getMonth() + 1) {\n cm.CardHasExpired = true;\n } else {\n cm.addingCard = true;\n cm.CardHasExpired = false;\n paymentsService.addCardDetails(card, savedFrom.SettingsTab).then(function() {\n cm.addCard = false;\n cm.newCard = null;\n cm.addingCard = false;\n _refreshPaymentCards();\n cm.paymentSuccess = true;\n $timeout(function() {\n cm.paymentSuccess = false;\n }, 5000);\n });\n }\n }\n\n function removeCard(card) {\n paymentsService.removeCard(card.CardId).then(function() {\n _refreshPaymentCards();\n closeEditRemoveCard(card);\n });\n }\n\n if (TRPCONFIG.Domain.SavedCardsEnabled) {\n const uniqueMasterCards = true; // if uniqueMasterCards is requested. return unique types with respect to MasterdCardId.\n paymentDetailsService.getPaymentTypes(uniqueMasterCards).then(function(result) {\n cm.paymentTypes = result;\n });\n\n paymentDetailsService.getPaymentTypes().then(function(result) {\n cm.allPaymentTypes = result;\n });\n _refreshPaymentCards();\n }\n\n cm.generateTokens = () => {\n //figure out if we need to generate tokens and if there should be an expiry\n //if pci compliant\n const requireTokens = TRPCONFIG.Domain.PCICompliant;\n const newCard = cm.newCard || { ExpiryDate: {} };\n const month = newCard.ExpiryDate ? newCard.ExpiryDate.Month : null;\n const year = newCard.ExpiryDate ? newCard.ExpiryDate.Year : null;\n const expiryDate = month != null && year != null ? new Date(year, month) : null;\n\n if (!expiryDate) {\n return $q.when(); //no point tokenising because the form is not valid\n }\n\n if (requireTokens) {\n return tokeniser.execute(expiryDate ? expiryDate.toISOString() : null);\n }\n return $q.when();\n };\n\n cm.checkCreditCardNumber = function(cardNumber) {\n cm.cardChangedTo = undefined;\n if (!cardNumber) { return; }\n\n paymentsService\n .checkCardNumber(cm.allPaymentTypes, cardNumber, cm.newCard.paymentType)\n .then(undefined, function setCorrectCard(correctId) {\n for (let i = 0; i < cm.allPaymentTypes.length; i++) {\n if (cm.allPaymentTypes[i].CardTypeId === correctId && cm.newCard.paymentType !== cm.allPaymentTypes[i].MasterCardTypeId) {\n cm.newCard.paymentType = cm.allPaymentTypes[i].MasterCardTypeId;\n cm.cardChangedTo =\n paymentsService.getCardTitle(cm.allPaymentTypes, correctId);\n break;\n }\n }\n });\n };\n\n cm.updateCardType = function() {\n cm.newCard.CardNumber = undefined;\n cm.cardChangedTo = undefined;\n };\n\n function deleteAccount(password) {\n if (!confirmed) {\n cm.deleteButton = resourceService.getDeferred('CONFIRMDELETE');\n confirmed = true;\n return;\n }\n authService.deleteAccount({\n Password: password\n }).then(function(resp) {\n if (!resp.Success) {\n cm.deleteButton = resourceService.getDeferred('DELETEACCOUNT');\n confirmed = false;\n cm.showconfirmDeleteAccount = false;\n $scope.$broadcast('flash:error', resourceService.get('DELETEACCOUNTFAILURE'));\n }\n });\n }\n\n function deleteAccountConfirmed(password) {\n confirmed = true;\n deleteAccount(password);\n }\n\n function showConfirmDeleteAccount() {\n cm.showconfirmDeleteAccount = true;\n $scope.$broadcast('flash:hide');\n }\n\n function closeConfirmDeleteAccount() {\n cm.showconfirmDeleteAccount = false;\n confirmed = false;\n }\n\n function padZero(n) {\n return (n < 10) ? (`0${n}`) : n;\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('MemberDetails', MemberDetails);\n\nfunction MemberDetails($rootScope, dashboardNotificationService) {\n const md = this;\n md.user = $rootScope.user;\n\n //Notifications\n md.notificationClicked = notification => dashboardNotificationService.notificationClicked(notification);\n md.formatNotification = notification => dashboardNotificationService.formatNotification(notification);\n\n dashboardNotificationService.getNotifications().then(data => md.alerts = data);\n}\n})();\n","(function() {\n'use strict';\n\nangular.module('dashboard').controller('OnlineCheckin', OnlineCheckin);\n\nfunction OnlineCheckin(onlineCheckinService, arrayUtil, $routeParams, $scope, resourceService, $rootScope, dashboardBookingService) {\n const cm = this;\n cm.legs = [];\n cm.SupplierConditionsList = [];\n cm.bookingId = $routeParams.bookingId;\n cm.checkinSelected = false;\n cm.loadingCheckinOptions = true;\n cm.checkinInProgress = false;\n cm.checkinError = false;\n cm.showProceedBtn = false;\n cm.checkedInLegs = 0;\n cm.legCheckinAllSelected = legCheckinAllSelected;\n cm.printBoardingPass = printBoardingPass;\n cm.doCheckin = doCheckin;\n\n $rootScope.lockScreen($scope, {\n title: resourceService.get('ONLINECHECKIN_FETCHINGCHECKININFO'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-onlineCheckinCtrl'\n });\n\n dashboardBookingService.getBookingInfo($routeParams.bookingId).then(function(booking) {\n cm.booking = booking;\n });\n\n onlineCheckinService.getOnlineCheckinOptions(cm.bookingId).then(function(result) {\n cm.loadingCheckinOptions = false;\n $rootScope.unlockScreen($scope);\n cm.bookingRef = result.BookingRef;\n cm.leadPassengerLastname = result.LeadPassengerLastName;\n angular.forEach(result.Legs, function(leg) {\n leg.checkinAll = false;\n leg.showSeatWarning = false;\n if (leg.CheckinState === 'Available') {\n cm.showProceedBtn = true;\n leg.checkinAll = true;\n if (leg.SupplierConditions) {\n _formatSupplierConditions(leg.SupplierConditions, leg.LegType);\n }\n } else if (leg.CheckinState === 'CheckedIn') {\n cm.checkedInLegs++;\n }\n angular.forEach(leg.Passengers, function(passenger) {\n if (passenger.OptionalCharges) {\n passenger.OptionalCharges[0].Quantity = null;\n const maxQuantity = passenger.OptionalCharges[0].MaximumQuantity;\n if (maxQuantity > 0) {\n passenger.showBaggageSelection = true;\n passenger.maxBags = arrayUtil.numberArray(0, passenger.OptionalCharges[0].MaximumQuantity);\n }\n }\n if (passenger.SeatSelections) {\n passenger.seats = passenger.SeatSelections.join(', ');\n } else {\n leg.showSeatWarning = true;\n }\n });\n cm.checkinSelected = cm.checkinSelected || leg.checkinAll;\n });\n if (result.Legs) {\n cm.legs = result.Legs;\n }\n });\n\n function _formatSupplierConditions(conditions, legType) {\n const supplierConditions = { header: '', text: [] };\n supplierConditions.header = legType.toLowerCase();\n if (conditions.indexOf('\\n') !== -1) {\n supplierConditions.text = conditions.split('\\n');\n supplierConditions.text.pop();\n } else {\n supplierConditions.text[0] = conditions;\n }\n cm.SupplierConditionsList.push(supplierConditions);\n }\n cm.showBagsError = false;\n function doCheckin() {\n if (!cm.checkinSelected) {\n return false;\n }\n const legsToCheckin = arrayUtil.filter(cm.legs, function(leg) {\n return leg.checkinAll;\n });\n angular.forEach(legsToCheckin, function(leg) {\n angular.forEach(leg.Passengers, function(passenger) {\n if (passenger.OptionalCharges) {\n if (passenger.OptionalCharges[0].Quantity === null) {\n cm.showBagsError = true;\n }\n }\n });\n });\n if (cm.showBagsError) {\n return false;\n }\n cm.checkinInProgress = true;\n onlineCheckinService.doCheckin(cm.bookingId, legsToCheckin).then(function(data) {\n cm.checkinInProgress = false;\n if (data.Result === 'Success') {\n angular.forEach(legsToCheckin, function(leg) {\n leg.CheckinState = 'CheckedIn';\n onlineCheckinService.getCheckinType(leg);\n leg.checkinAll = false;\n legCheckinAllSelected();\n });\n } else {\n cm.checkinError = true;\n }\n });\n }\n\n function legCheckinAllSelected() {\n cm.showBagsError = false;\n cm.checkinSelected = false;\n angular.forEach(cm.legs, function(leg) {\n cm.checkinSelected = cm.checkinSelected || leg.checkinAll;\n });\n }\n\n function printBoardingPass(leg) {\n window.open(`/api2/flightscheckin/boardingpass?bookingId=${cm.bookingId}&leg=${leg.LegType}`, '', 'width=768, height=700, location=no');\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('PayBalance', PayBalance);\n\nfunction PayBalance(\n $scope,\n $q,\n $routeParams,\n $location,\n $timeout,\n broker,\n rootPath,\n dashboardBookingService,\n paymentDetailsService,\n paymentsService,\n paymentsUtilService,\n resourceService,\n urlUtils,\n mybTrack,\n currentUser) {\n const cm = this;\n let threeDSecure = null;\n\n const root = urlUtils.getOrigin() + rootPath.getRootPath();\n const completeUrl = 'dashboard/pay-balance/complete/{0}';\n const bookingReferenceUrl = 'dashboard/bookings/reference/{0}';\n const payPalCallbackUrl = '{0}paybalancepaypalcallback?paymentId={1}&bookingId={2}&ppResp={3}';\n const cpgStatusApiEnabled = TRPCONFIG.Domain.CpgStatusApiEnabled;\n const cpgStatusStartPollingDelay = TRPCONFIG.Domain.CpgStatusStartPollingDelay;\n\n cm.bookingId = parseInt($routeParams.bookingId);\n cm.threedsRedirecting = false;\n cm.payFull = true;\n\n mybTrack.track('MYB - Open Pay Balance', {\n ReferralMethod: $routeParams.ReferralMethod\n });\n\n cm.paymentModel = paymentsUtilService.createEmptyPaymentModel();\n\n dashboardBookingService.getBookingInfo(cm.bookingId).then(function(booking) {\n cm.bk = booking;\n });\n\n //Get booking detail for the common ManageHeader\n dashboardBookingService.getBookingDetail(cm.bookingId).then(function(data) {\n _processBalanceDue(data.BalanceDueInfo);\n cm.isPartOfHoliday = data.IsPartOfHoliday;\n\n //getsavedbookingcards is obsolete now. So calling get and joining with PaymentOptions\n const getOptions = paymentDetailsService.getPaymentOptions(data.Booking.Type, cm.bookingId, data.BalanceDueInfo.ClientCurrencyCode);\n const getCards = TRPCONFIG.Domain.SavedCardsEnabled && $scope.user.HardSignedIn ? paymentDetailsService.getPaymentCards() : null;\n\n $q.all([getOptions, getCards]).then(function(results) {\n cm.paymentOptions = paymentsUtilService.convertMybPaymentOptions(results[0]);\n if (results[1]) {\n cm.savedCards = paymentsUtilService.convertMybSavedCards(results[1], results[0]);\n }\n\n cm.dataLoaded = true;\n });\n\n if ($routeParams.ppResp) {\n _showError(resourceService.get(paymentsService.getPayPalResponseMessage([$routeParams.ppResp])));\n }\n });\n cm.preBookCommands = [];\n\n cm.addPreBookCommand = command => {\n if (!cm.preBookCommands.includes(command)) {\n cm.preBookCommands.push(command);\n }\n };\n\n cm.generateTokens = () => {\n return paymentsService.generateTokens(\n cm.paymentModel.cardDetail.expiryDate.month,\n cm.paymentModel.cardDetail.expiryDate.year,\n cm.paymentModel.saveCard\n );\n };\n\n cm.addPreBookCommand(cm.generateTokens);\n\n cm.executePrebookCommands = () => {\n return Promise.all(cm.preBookCommands.map(preBookCommand => preBookCommand()));\n };\n\n cm.makePayment = function() {\n const expires = cm.paymentModel.cardDetail.expiryDate;\n const today = new Date();\n\n if (expires &&\n expires.year\n && expires.month\n && expires.year <= today.getFullYear()\n && expires.month < (today.getMonth() + 1)) {\n _showError(resourceService.get('CARDHASEXPIRED'));\n return;\n }\n\n _block(true);\n const requireValidation = cm.paymentModel.cardDetail.isSavedCard === false\n && cm.paymentModel.isPayPalPayment === false\n && cm.paymentModel.externalFop === undefined;\n\n paymentDetailsService.clearPayment(_formatClearRequestPayload(), requireValidation).then(function(result) {\n if (result.Success) {\n if (result.AcsRedirectRequired) {\n if (cm.paymentModel.isPayPalPayment) {\n //Paypal redirection\n window.location = result.AcsUrl;\n } else {\n //3ds redirection\n if (cpgStatusApiEnabled) {\n $timeout(() => {\n cpgValidationComplete(cm.bookingId, result.PaymentId);\n }, cpgStatusStartPollingDelay);\n }\n _redirectTo3dSecurePayment(result);\n }\n } else {\n //Show complete page\n $location.path(String.format(completeUrl, cm.bookingId));\n }\n } else {\n const message = result.ReasonCode ? paymentDetailsService.getcardFailureReasonMessage(result.ReasonCode) : result.PaymentMessage;\n _handleFailurePayment(message);\n }\n }, function() {\n _showError(resourceService.get('PAYBALANCEERROR'));\n });\n\n mybTrack.track('MYB - Pay Balance', {\n PaymentType: cm.paymentModel.isPayPalPayment ? 'PayPal' : 'Card',\n PartPayment: !cm.payFull\n });\n };\n\n cm.updateDfReferenceId = dfReferenceId => {\n cm.DfReferenceId = dfReferenceId;\n return cm.DfReferenceId;\n };\n\n cm.bypassThreeDS = function() {\n const data = {\n paRes: '',\n md: '',\n prePaymentId: threeDSecure.PrePaymentID\n };\n _authorisePayment(data, false);\n };\n\n function cpgValidationComplete(BookingId, PaymentId) {\n if (BookingId && PaymentId) {\n paymentDetailsService.getCpgStatus(BookingId, PaymentId).then(data => {\n if (data && data.error) {\n _handleFailurePayment(data.error);\n }\n });\n }\n }\n\n //Watches\n $scope.$on('3DSValidationComplete', function(ev, data) {\n _authorisePayment(data, true);\n });\n\n $scope.$watch('cm.paymentAmount', function(val) {\n val = val && !isNaN(val) ? val : 0;\n cm.paymentAmountDecimal = parseFloat(val);\n _updateBlanceDueDetail();\n });\n\n $scope.$watch('cm.paymentModel.fee', () => {\n _updateBlanceDueDetail();\n });\n\n //Private methods\n function _formatClearRequestPayload() {\n let request = {\n BookingId: cm.bookingId,\n PaymentId: 0, //Default, As it is not existing payment.\n CurrencyCode: cm.currencyCode,\n Amount: cm.totalPaymentAmount,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n PayPalCallbackUrl: String.format(payPalCallbackUrl, root, '$PaymentId', cm.bookingId, 'success'),\n PayPalCancellationUrl: String.format(payPalCallbackUrl, root, 0, cm.bookingId, 'cancel'),\n ApplicationType: TRPCONFIG.ApplicationType,\n DfReferenceId: cm.DfReferenceId,\n ReturnUrl: String.format('{0}threedsecure?prePaymentID=', root),\n };\n\n //add in our payment details\n paymentsUtilService.addPaymentDetailsToClearRequest(cm.paymentModel, request);\n\n return request;\n }\n\n function _formatAuthoriseRequestPayload(data) {\n return {\n PaymentId: data.paymentId && data.paymentId.length ? data.paymentId : data.prePaymentId,\n PaRes: decodeURIComponent(data.paRes),\n MD: data.md,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode\n };\n }\n\n function _authorisePayment(data, threeDSecure = false) {\n _block(true);\n paymentDetailsService.authorisePayment(_formatAuthoriseRequestPayload(data)).then(function(result) {\n if (threeDSecure) {\n $scope.$broadcast('3DSValidationFinished', result.Success);\n }\n\n if (result.Success) {\n $location.path(String.format(completeUrl, cm.bookingId));\n } else {\n _handleFailurePayment(result.PaymentMessage);\n }\n }, function() {\n _showError(resourceService.get('AUTHORISEEERROR'));\n });\n\n $scope.$apply(function() {\n cm.threedsRedirecting = false;\n });\n }\n\n function _redirectTo3dSecurePayment(result) {\n //Create threeDSecure object\n threeDSecure = {\n PaReq: result.PaReq,\n MD: result.MD,\n TermUrl: String.format('{0}threedsecure?prePaymentID={1}', root, result.PaymentId),\n AcsUrl: result.AcsUrl,\n CanByPass: result.AllowThreeDSecureBypass,\n PrePaymentID: result.PaymentId\n };\n $scope.$broadcast('request3DSValidation', threeDSecure, {\n Journey: 'PostBooking',\n BookingID: cm.bookingId,\n SignedIn: currentUser.get().SignedIn\n });\n cm.threedsRedirecting = true;\n cm.ThreeDSecure = threeDSecure;\n broker.publish('unblock');\n $scope.$emit('unblock');\n }\n\n function _handleFailurePayment(msg) {\n const messages = [resourceService.get('PAYMENTFAILED') + msg, String.format(resourceService.get('PAYMENTASSISTENCE'), resourceService.get('TELEPHONENUMBER'))];\n _showError(messages);\n broker.publish('unblock');\n $scope.$emit('unblock');\n }\n\n function _showError(msg) {\n $scope.$broadcast('flash:error', msg);\n }\n\n function _block(completing) {\n $scope.$emit('block', {\n title: resourceService.get(completing ? 'COMPLETINGPAYMENT' : 'PREPARINGPAYMENT'),\n loadingScreenStyle: 'default-payBalance'\n });\n }\n\n function _processBalanceDue(balanceDue) {\n _initDueDetails(balanceDue);\n _updateBlanceDueDetail();\n cm.BalanceDueDate = balanceDue.DueDate;\n }\n\n function _updateBlanceDueDetail() {\n cm.totalPaymentAmount = cm.paymentAmountDecimal + cm.paymentModel.fee;\n cm.balanceDueAfterPayment = cm.balanceDue - cm.paymentAmountDecimal;\n }\n\n function _initDueDetails(dueDetail) {\n if (!dueDetail) {\n //If there is no due amount redirect to booking reference page.\n $location.path(String.format(bookingReferenceUrl, cm.bookingId));\n } else {\n cm.balanceDue = dueDetail.BalanceDueAmount - dueDetail.PendingElvPayments;\n //cm.balanceDue = cm.balanceDue.toFixed(2);\n cm.currencyCode = dueDetail.ClientCurrencyCode;\n cm.paymentAmount = cm.balanceDue.toFixed(2);\n cm.paymentAmountDecimal = parseFloat(cm.paymentAmount);\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .controller('PayBalanceComplete', PayBalanceComplete);\n\nfunction PayBalanceComplete(\n $scope,\n $routeParams,\n broker,\n dashboardBookingService,\n resourceService) {\n const cm = this;\n cm.bookingId = parseInt($routeParams.bookingId);\n cm.bookingActions = dashboardBookingService.getBookingActions();\n cm.getResourceValue = resource => resourceService.get(resource);\n\n broker.publish('paymentComplete');\n\n dashboardBookingService.getBookingDetail(cm.bookingId).then(function(data) {\n if (data) {\n const paymentData = _.last(data.Payments.filter(p => p.Status === 1));\n const dueDetail = data.BalanceDueInfo;\n cm.amountPaid = paymentData.Amount;\n cm.currencyCode = paymentData.ClientCurrencyCode;\n if (dueDetail) {\n cm.balanceDueAfterPayment = dueDetail.BalanceDueAmount - dueDetail.PendingElvPayments;\n cm.BalanceDueDate = dueDetail.DueDate;\n }\n }\n });\n\n //dashboardBookingService.getBookingInfo(cm.bookingId).then(function (booking) {\n // cm.bk = booking;\n //});\n\n broker.publish('unblock');\n $scope.$emit('unblock');\n}\n})();\n","namespace Dashboard {\n class AmendBookingPreviousSummary {\n constructor(\n private $scope: ng.IScope,\n private hotelService: Core.Hotels.HotelService,\n private dashboardBookingService\n ) {\n dashboardBookingService.getMybBooking()\n .then(booking => {\n $scope.booking = booking;\n let estabId: any = _.get(booking, 'Itinerary.Stays[0].Hotel.EstabId');\n return hotelService.getHotel(undefined, estabId, undefined);\n })\n .then(hotel => {\n $scope.hotel = hotel;\n hotel.BookingRef = $scope.booking.BookingCore.BookingRef;\n });\n }\n }\n\n angular\n .module('dashboard')\n .directive('amendBookingPreviousSummary', (): ng.IDirective => ({\n restrict: 'E',\n controller: AmendBookingPreviousSummary,\n scope: {},\n templateUrl: 'partials/home/directivetemplate?type=amendBookingPreviousSummary'\n }));\n}\n","'use strict';\n\nmodule Dashboard {\n\n class DashboardBookingItinerary {\n template: string;\n bookingTitle: string;\n itineraries: any;\n bookingType: number;\n bookingTypes: any;\n hotelData: any;\n insuranceProvider: string;\n itineraryType: {[key:string]:number};\n expandable: boolean;\n fallbackEn: boolean;\n\n templateMap:{[key:number]:string} = {\n 1: 'flight',\n 2: 'tickets',\n 4: 'car-hire',\n 8: 'accommodation',\n 9: 'holiday',\n 16: 'parking',\n 32: 'transfer',\n 64: 'insurance',\n 128: 'package-holidays',\n 256: 'marhaba',\n 1024: 'bundle',\n 2048: 'adhoc'\n };\n\n productsMap:{[key:number]:string} = {\n 1: 'Flight',\n 8: 'Accommodation',\n 32: 'Transfer',\n 256: 'Ground Handling',\n 2048: 'Adhoc'\n };\n isMobile: boolean;\n\n constructor(\n private imageService,\n private dashboardBookingService,\n private dateUtil,\n private resourceService: Core.ResourceService,\n private brandedFareTypesService: ekh.BrandedFareTypesService,\n ) {\n this.isMobile = TRPCONFIG.IsMobileDevice;\n this.template = this.templateMap[this.bookingType];\n this.bookingTypes = dashboardBookingService.getBookingTypeMap();\n this.itineraryType = dashboardBookingService.getItineraryType();\n this.expandable = TRPCONFIG.Domain.MYBProductsDetailsExpanded;\n\n if (this.bookingType === this.bookingTypes.travelInsurance) {\n this.insuranceProvider = this.bookingTitle.split(':')[0];\n }\n }\n\n getResourceValue(resource:string):string {\n return this.resourceService.get(resource);\n }\n\n filterTransfer(itinerary:any):boolean {\n return itinerary.Type === this.itineraryType['TransferArrival'] ||\n itinerary.Type === this.itineraryType['TransferReturn'];\n }\n\n getImage(estabId:number):string {\n return this.imageService.getImageUrl(estabId, 180, 180, 1);\n }\n\n getAcommImage(estabId:number):string {\n return this.imageService.getMainImageUrl(estabId, 370, 370);\n }\n\n getContentUrl() {\n return 'partials/dashboard/ItineraryTemplate?Type=' + this.template;\n }\n\n getNights(start, end) {\n return this.dateUtil.numberOfNights(start, end);\n }\n\n public getBookingClassName(fc) {\n return this.brandedFareTypesService.getBookingClassName(fc);\n }\n\n public getClassName(fc) {\n const fareName = this.brandedFareTypesService.getClassName(fc);\n const type = this.brandedFareTypesService._getTransformedType(fareName);\n return this.brandedFareTypesService._setClassName(type);\n }\n\n getTitle(id) {\n if (this.hotelData && this.hotelData[0][id] && this.hotelData[0][id].EstabTitle) {\n return this.hotelData[0][id].EstabTitle;\n }\n }\n\n getAddress(id) {\n if (this.hotelData && this.hotelData[0][id] && this.hotelData[0][id].Address) {\n return this.hotelData[0][id].Address;\n }\n }\n }\n\n angular\n .module('dashboard')\n .component('dashboardBookingItinerary', {\n bindings: {\n bookingTitle: '=',\n itineraries: '=',\n bookingType: '=',\n hotelData: '=',\n fallbackEn: '='\n },\n controller: DashboardBookingItinerary,\n controllerAs: 'bi',\n template: '' +\n '
            ' + '
            ' +\n '
            '\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .directive('dashboardBookingSummary', dashboardBookingSummary);\n\nfunction dashboardBookingSummary(dashboardBookingService, resourceService, authService) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/dashboard/bookingsummary',\n scope: {\n bk: '=',\n bnd: '=',\n currentUser: '=',\n passenger: '=',\n showTripDate: '@',\n bookingMessage: '@',\n showActions: '@'\n },\n link(scope) {\n scope.bookingType = dashboardBookingService.getBookingTypeMap();\n const stopWatch = scope.$watch('bk', function(val) {\n if (val) {\n dashboardBookingService.formatTitle(val);\n stopWatch();\n }\n });\n scope.showTripDate = scope.showTripDate === 'true';\n scope.getResourceValue = resource => resourceService.get(resource);\n scope.formatBookingMessage = dashboardBookingService.formatBookingMessage;\n scope.bookingMessage = scope.bookingMessage === 'true';\n scope.showActions = scope.showActions === 'true';\n scope.actionRedirect = dashboardBookingService.actionRedirect;\n scope.actionClick = dashboardBookingService.actionClick;\n\n scope.signOut = function() {\n authService.signOut();\n };\n\n function revealOptions(bk) {\n bk.showOptions = true;\n }\n function hideOptions(bk) {\n bk.showOptions = false;\n }\n scope.toggleOptions = function(bk) {\n if (bk.showOptions) {\n hideOptions(bk);\n } else {\n revealOptions(bk);\n }\n };\n\n function canAccessBooking(bnd) {\n let access = true;\n // Checks bundle has a BookingUIStatus of 'OK'\n let type = _.get(bnd, '[0].Status');\n if (type !== 1) {\n return false;\n }\n // Checks bundle components are not BookingUIStatus of 'Pending'\n access = _.every(bnd, item => {\n return item.Status !== 2;\n });\n return access;\n }\n\n if (scope.bnd !== undefined) {\n scope.canAccessBooking = canAccessBooking(scope.bnd);\n }\n\n }\n };\n}\n})();\n","namespace Dashboard {\n\n class DashboardBreadcrumb {\n private crumbs;\n private bookingId;\n private pages;\n constructor(\n private dashboardBreadCrumbDetails,\n private dashboardBookingService,\n private $routeParams) {\n this.bookingId = parseInt(this.$routeParams.bookingId, 10);\n this.dashboardBookingService.getBookingInfo(this.bookingId).then((booking) => {\n this.crumbs = this.dashboardBreadCrumbDetails.get(this.pages, booking);\n });\n }\n }\n\n angular\n .module('dashboard')\n .directive('dashboardBreadcrumb', (): ng.IDirective => {\n\n return {\n restrict: 'E',\n bindToController: {\n pages: '@'\n },\n controller: DashboardBreadcrumb,\n controllerAs: 'dbc',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=DashboardBreadcrumb'\n };\n\n });\n}\n\n","namespace Dashboard {\n\n class DashboardCarousel {\n itemlist: any[];\n onCarouselChange: (x: {index: number}) => void;\n itemClick: (x: { item: any }) => void;\n itemPartial: string;\n formatItem: (x: { item: any }) => void;\n\n selected:number = 0;\n carousel: any;\n prev: JQuery;\n next: JQuery;\n scope: ng.IScope;\n\n init(scope: ng.IScope, carousel: any, prev: JQuery, next: JQuery) {\n this.carousel = carousel;\n this.scope = scope;\n this.prev = prev;\n this.next = next;\n }\n\n initCarousel() {\n this.carousel.slick({\n prevArrow: this.prev,\n nextArrow: this.next,\n infinite: false\n });\n this.carousel.on('beforeChange', (event, slick, currentSlide, nextSlide) =>{\n this.selected = nextSlide;\n this.onCarouselChange({index:nextSlide});\n this.scope.$apply();\n });\n this.scope.$on('$destroy', () => {\n this.carousel.off('beforeChange');\n });\n }\n\n formatedItem = (item) => this.formatItem({ item: item });\n\n onItemClick = (item)=> {this.itemClick({item:item});};\n }\n\n angular\n .module('dashboard')\n .directive('dashboardCarousel', (): ng.IDirective => {\n\n return {\n scope: {},\n bindToController: {\n itemlist: '=',\n onCarouselChange: '&',\n itemClick: '&',\n itemPartial: '=',\n formatItem: '&'\n },\n controller: DashboardCarousel,\n controllerAs: 'dc',\n templateUrl: (el : ng.IAugmentedJQuery, attrs) => {\n if (attrs.itemPartial) {\n return 'partials/dashboard/DashboardCarousel?itemPartial=' + attrs.itemPartial;\n }\n return 'partials/dashboard/DashboardCarousel';\n } ,\n\n link: (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : DashboardCarousel) => {\n controller.init(scope, $('.dashboard-carousel'), $('#arrow-prev'), $('#arrow-next'));\n }\n\n };\n\n }).directive('carouselItem', ($timeout) => {\n return {\n restrict: 'A',\n transclude: false,\n require: '^dashboardCarousel',\n link: (scope: ng.IScope, el : ng.IAugmentedJQuery, attr, controller : DashboardCarousel) => {\n // wait for the last item in the ng-repeat then call init\n if (scope.$last) {\n $timeout( ()=> {\n controller.initCarousel();\n });\n }\n }\n };\n });\n}\n","'use strict';\n\nmodule Dashboard {\n\n class DashboardCsrConversation {\n csr:any;\n isInProgress:boolean = false;\n\n constructor(private $scope,\n private dashboardCsrService,\n private $timeout) {\n\n $('.header-main').addClass('unfix');\n\n $scope.$watch('csd.csr.newMessage', ()=> this.moveConversationWithTextbox());\n\n }\n\n submitMessage = csr => {\n this.isInProgress = true;\n this.dashboardCsrService.submitMessage(csr).then(() => this.isInProgress = false);\n }\n\n getSenderTitle = conversation => this.dashboardCsrService.getSenderTitle(conversation);\n\n goToBottom() {\n this.$timeout(function () {\n scrollTo(0, document.body.scrollHeight);\n }, 2000);\n }\n\n moveConversationWithTextbox() {\n //to move the conversation are when the input are height increases.\n const el = $('.csr-conversation');\n el.css('padding-bottom', $('.csr-send-message').css('height'));\n }\n\n }\n\n angular\n .module('dashboard')\n .component('dashboardCsrConversation', {\n bindings: {\n csr: '='\n },\n controller: DashboardCsrConversation,\n controllerAs: 'csd',\n templateUrl: 'partials/dashboard/CsrConversation'\n });\n\n}\n","module Dashboard{\n class CsrSummary{\n\n responseToQuestion: string;\n returnUrl: string;\n baseUrl: string;\n csrlist: any[];\n\n constructor(\n private $scope: ng.IScope,\n private $q,\n private $routeParams,\n private scrollService,\n private $location,\n private dashboardCsrService\n ) {\n this.returnUrl = '/dashboard/csr/' + this.$routeParams.bookingId;\n this.baseUrl = '/dashboard';\n\n const killTheWatch = $scope.$watchCollection(() => this.csrlist,\n (val) => {\n if (val && val.length > 0) {\n killTheWatch();\n }\n });\n }\n\n view(csr) {\n this.$location.path(this.baseUrl + '/csr-details/' + csr.BookingId + '/' + csr.CsrId);\n }\n\n getCsrStatusClass = status => this.dashboardCsrService.getCsrStatusClass(status);\n\n }\n\n\nangular\n .module('dashboard')\n .directive('dashboardCsrSummary', (): ng.IDirective => {\n return {\n restrict: 'E',\n transclude: true,\n replace: true,\n templateUrl: 'partials/dashboard/csrSummary',\n bindToController: {\n csrlist: '='\n },\n scope: {},\n controller: CsrSummary,\n controllerAs: 'cs'\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .directive('gravatarImage',\nfunction(resourceService) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n email: '='\n },\n template: '',\n link(scope, element) {\n scope.gravatarProfile = 'https://gravatar.com/profiles/no-such-user';\n scope.$watch('email', function(email) {\n if (email) {\n scope.changeText = resourceService.get('CHANGE');\n // eslint-disable-next-line new-cap\n const hash = window.md5(email);\n const image = new Image();\n image.onload = function() {\n element.append(image);\n };\n //fallback to mysterymen avatar\n image.src = `https://www.gravatar.com/avatar/${hash}?d=mm`;\n image.alt = 'user avatar';\n scope.gravatarProfile = `https://www.gravatar.com/profiles/${hash}`;\n }\n });\n }\n };\n});\n})();\n","module Dashboard{\n angular\n .module('dashboard')\n .directive('elastic', ($timeout): ng.IDirective => {\n\n return {\n restrict: 'A',\n link($scope, element, attrs: any) {\n let initialHeight = element[0].style.height;\n const maxRows = $scope.$eval(attrs.elastic);\n const maxHeight = (element[0].clientHeight - 18) * maxRows;\n const resize = _.debounce(function () {\n element[0].style.height = initialHeight;\n element[0].style.height = (maxHeight <= element[0].scrollHeight ?\n maxHeight : element[0].scrollHeight) + 'px';\n }, 250);\n element.on('input change',resize);\n $timeout(resize, 0);\n }\n };\n\n });\n}\n","(function() {\n'use strict';\n\nconst DS = angular.module('dashboard');\nDS.directive('visitedHotelItem', function() {\n return {\n restrict: 'E',\n replace: false,\n templateUrl: 'partials/dashboard/VisitedHotelDetails',\n scope: {\n item: '='\n }\n };\n});\n})();\n","namespace Dashboard {\n\n type Passenger = Core.ManageBooking.Passenger;\n\n export interface PassengerInfo {\n PassengerId: number;\n Name: string;\n DocumentNumber: string;\n Nationality: string;\n DocumentIssuingCountry: string;\n CountryOfBirth: string;\n DocumentType: number;\n DateOfBirth: string;\n DocumentIssuedDate: string;\n DocumentExpiryDate: string;\n DetailsSubmitted: boolean;\n }\n\n export interface IAddAPIService {\n addAPI(bookingId:number, passengers: PassengerInfo[]);\n getPassengerInfo(bookingId: number): ng.IPromise;\n getDocumentTypes();\n }\n\n class AddAPIService implements IAddAPIService {\n private documentTypes = [\n {\n id: 1,\n label: this.resourceService.getDeferred('PASSPORT')\n },\n {\n id: 2,\n label: this.resourceService.getDeferred('IDENTITYCARD')\n }\n ];\n\n constructor(\n private $http: ng.IHttpService,\n private $q: ng.IQService,\n private resourceService: Core.ResourceService) {}\n\n getDocumentTypes() {\n return this.documentTypes;\n }\n\n addAPI(bookingId: number, passengers: PassengerInfo[]){\n return this.$http.post('/api/bookings/flights/apis/update', {\n BookingId: bookingId,\n PassengerInfo: passengers\n });\n }\n\n getAPI(bookingId: number): ng.IPromise{\n return this.$http.get('/api/bookings/flights/apis/get?' + $.param({\n BookingId : bookingId\n })).then(r => r.data);\n }\n\n getPassengers(bookingId: number): ng.IPromise{\n return this.$http.get(\n 'api/bookings/myb/get?' + $.param({\n bookingId : bookingId,\n fields: 'passengers'\n })\n ).then(r => r.data.Passengers);\n }\n\n getPassengerInfo(bookingId: number): ng.IPromise{\n return this.$q.all([\n this.getPassengers(bookingId),\n this.getAPI(bookingId)\n ]).then(([passengers, passengersFromAPI]) => {\n return passengers.map(p => {\n const pa = _.find(passengersFromAPI, (pa: PassengerInfo) => pa.PassengerId === p.Id);\n let passenger = {\n PassengerId: p.Id,\n Name: `${p.Title} ${p.FirstName} ${p.SurName}`\n };\n if(pa) {\n _.assign(passenger, {\n DocumentNumber: pa.DocumentNumber,\n Nationality: pa.Nationality,\n DocumentIssuingCountry: pa.DocumentIssuingCountry,\n CountryOfBirth: pa.CountryOfBirth,\n DocumentType: pa.DocumentType,\n DateOfBirth: pa.DateOfBirth,\n DocumentIssuedDate: pa.DocumentIssuedDate,\n DocumentExpiryDate: pa.DocumentExpiryDate,\n DetailsSubmitted: true\n });\n }\n\n return passenger;\n\n });\n });\n }\n }\n\n angular\n .module('dashboard')\n .service('addAPIService', AddAPIService);\n}\n","namespace Dashboard {\n export enum BookingStatus {\n Pending = 1,\n Receipted = 2,\n Ticketed = 4,\n Complete = 5,\n CancelledByCustomer = 6,\n Void = 7,\n HoldAwaitingConfirmation = 8,\n DeclinedByEstab = 9,\n ConfirmedByEstab = 10,\n CancellationConfirmedByEstab = 11,\n CancellationDeclinedByEstab = 12,\n FailedSecurityCheck = 13,\n HoldSwap = 14\n }\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('dashboardReviewService', dashboardReviewService);\n\nfunction dashboardReviewService($http, $q, dashboardService, dashboardBookingService, imageService, resourceService, authService, currentUser) {\n const reviewUrl = '/api2/users/reviews/';\n const userReviewUrl = '/api2/users/reviews/user/';\n\n const ratingRange = {\n Min: 0,\n Max: 10\n };\n\n const sutabilityAnswers = [\n {\n name: resourceService.getDeferred('YES'),\n val: true\n },\n {\n name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'),\n val: false\n },\n {\n name: resourceService.getDeferred('DASHBOARDRESOURCE_UNSURE'),\n val: 'Unsure'\n }\n ];\n\n const recommendTRPAnswers = [\n {\n name: resourceService.getDeferred('YES'),\n val: true\n },\n {\n name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'),\n val: false\n }\n ];\n\n\n const reviewCriteria = [\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_CHECKINDATE'), val: 'ReviewerCheckInDate' },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_MOSTLIKES'), val: 'LikeCount' },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_MYRATING'), val: 'Rating' },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_FEEDBACKDATE'), val: 'FeedBackDate' }\n ];\n\n let ratingTitles = null;\n let hotelSuitabilityTypes = null;\n\n const service = {\n getBookingFeedback,\n editReview,\n saveReview,\n recommendTRPChange,\n ratingRange,\n recommendTRPAnswers,\n sutabilityAnswers,\n getRatingTitles,\n getRatingTitleText,\n getStatements,\n getReviewSortCriteria,\n getReviewSiteDetails,\n getReview,\n getReviewHeaderData,\n getReviewStatus\n };\n\n\n function getStatements() {\n if (hotelSuitabilityTypes === null) {\n return $http.get(`${reviewUrl}getstatements?${$.param({\n CultureCode: TRPCONFIG.Domain.CultureCode\n })}`).then(function(result) {\n addDefaultAnswerToStatements(result.data);\n hotelSuitabilityTypes = result.data;\n return hotelSuitabilityTypes;\n });\n }\n return hotelSuitabilityTypes;\n }\n\n function addDefaultAnswerToStatements(data) {\n for (let i = 0; i < data.length; i++) {\n data[i].SelectedOpinion = sutabilityAnswers[2].val;\n }\n }\n\n function getRatingTitles() {\n if (ratingTitles === null) {\n return $http.get(`${reviewUrl}getratingcategories?${$.param({\n CultureCode: TRPCONFIG.Domain.CultureCode\n })}`).then(function(result) {\n ratingTitles = result.data;\n return ratingTitles;\n });\n }\n return $q.when(ratingTitles);\n }\n\n function BookingFeedback() {\n const feedback = {\n rating: 0,\n comments: '',\n topTip: '',\n notRecommendUsComment: '',\n statements: null\n };\n\n return feedback;\n }\n\n function getBookingFeedback() {\n const feedback = new BookingFeedback();\n feedback.statements = angular.copy(hotelSuitabilityTypes);\n feedback.recommendTRP = true;\n return feedback;\n }\n\n function editReview(hotel) {\n hotel.reviewSaved = false;\n }\n\n function saveReview(hotel, feedback, token, userId) {\n if (feedback.rating === 0) {\n hotel.submitTry = true;\n return $q.when(false);\n }\n\n return _saveReview(\n hotel.EstablishmentDetail.Id, hotel.BookingDetail.BookingId, feedback, token, userId\n ).then(function() {\n hotel.reviewSaved = true;\n dashboardService.clearAggregate();\n _setFeedbackStatements(\n hotel.BookingDetail.BookingId, hotel.EstablishmentDetail.Id, feedback.statements, token, userId);\n return true;\n });\n }\n\n function _saveReview(estabId, bookingId, reviewData, token, userId) {\n let url = '';\n\n const request = {\n BookingId: bookingId,\n ObjectId: estabId,\n RatingDecimal: reviewData.rating,\n Comments: reviewData.comments,\n TopTip: reviewData.topTip,\n RecommendTRP: reviewData.recommendTRP,\n NotRecommendUsComment: reviewData.notRecommendUsComment,\n DomainDefaultCultureCode: TRPCONFIG.Domain.CultureCode\n };\n\n if (token && userId) {\n request.VerificationToken = token;\n request.UserId = userId;\n url = `${userReviewUrl}settoken`;\n } else {\n url = `${userReviewUrl}set`;\n }\n\n return $http.post(url, request, { ignoreErrors: true });\n }\n\n function recommendTRPChange(feedback) {\n if (!feedback.recommendTRP) {\n feedback.showNotRecommendTRPComment = true;\n document.getElementById('review-content').scrollTop += 150;\n document.getElementById('notRecommendUsComment').focus();\n } else {\n feedback.showNotRecommendTRPComment = false;\n }\n }\n\n function getRatingTitleText(n) {\n if (n !== undefined) {\n let i = 0;\n if (n === 0) {\n return ratingTitles[i].Description;\n }\n for (i = 1; i < ratingTitles.length; i++) {\n if (n < ratingTitles[i].MinimumRating) {\n return ratingTitles[i - 1].Description;\n }\n }\n return ratingTitles[i - 1].Description;\n }\n return '';\n }\n\n function getReviewSortCriteria() {\n return reviewCriteria;\n }\n\n function _setFeedbackStatements(bookingId, objectId, statements, token, userId) {\n const filteredStatements = _.filter(statements, function(s) {\n delete s.Description;\n return s.SelectedOpinion !== 'Unsure';\n });\n const request = {\n BookingId: bookingId,\n ObjectId: objectId,\n Statements: filteredStatements\n };\n if (filteredStatements.length > 0) {\n let url = '';\n\n if (token && userId) {\n request.VerificationToken = token;\n request.UserId = userId;\n url = `${userReviewUrl}setstatementstoken`;\n } else {\n url = `${userReviewUrl}setstatements`;\n }\n\n return $http.post(url, request, { ignoreErrors: true });\n }\n return $q.when();\n }\n\n function getReviewSiteDetails(bookingId) {\n return $http.get(`${userReviewUrl}getreviewsite?bookingId=${bookingId}&domainId=${TRPCONFIG.Domain.DomainId}`, { ignoreErrors: true }).then(\n function(result) {\n const reviewSiteDetails = result.data;\n return reviewSiteDetails;\n });\n }\n\n function getReview(bookingId) {\n return $http.get(`${userReviewUrl}booking/${bookingId}?cultureCode=${TRPCONFIG.Domain.CultureCode}`, { ignoreErrors: true })\n .then(function(result) {\n return result.data;\n });\n }\n\n function getReviewHeaderData(bookingId, objectId) {\n const dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\n const hotelDetail = dashboardService.getHotelsById([objectId]);\n const bookingDetail = dashboardBookingService.getBookingSummary(bookingId);\n const contactDetail = dashboardBookingService.getContact(bookingId);\n\n return $q.all([hotelDetail, bookingDetail, contactDetail]).then(function(results) {\n const hotel = (results[0]) ? results[0][0] : null;\n const contact = results[2] && results[2].data;\n return {\n EstablishmentDetail: hotel,\n ImageUrl: imageService.getMainImageUrl(objectId, dim, dim),\n BookingDetail: {\n StartDate: results[1].Booking.StartDate,\n BookingRef: results[1].Booking.BookingRef,\n BookingId: bookingId,\n LeadPassengerContact: {\n Title: contact.Title,\n FirstName: contact.FirstName,\n Surname: contact.LastName\n }\n }\n };\n });\n }\n\n function getReviewStatus(bookingId) {\n const user = currentUser.get();\n return (user.AnonSignedIn ? authService.getSignedinBooking() : $.when()).then(booking => {\n if (booking && booking.Summary && booking.Summary.BookingId) {\n let url = `/api/bookings/${booking.Summary.BookingId}/trip?culturecode=${TRPCONFIG.Domain.CultureCode}`;\n return $http.get(url).then(response => {\n let bk = _.find(response.data.Bookings, function(bk) {\n return bk.BookingId === parseInt(bookingId);\n });\n return bk.ReviewStatus;\n });\n }\n });\n }\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('dashboardService', dashboardService);\n\nfunction dashboardService(\n $http,\n arrayUtil,\n imageService,\n fieldGroupService) {\n const domain = TRPCONFIG.Domain;\n let dashBoardAggPromise = null;\n const fieldTypes = fieldGroupService.getFieldTypes();\n const service = {\n getAggregate,\n clearAggregate,\n getHotelsById\n };\n\n function clearAggregate() {\n dashBoardAggPromise = null;\n }\n\n function _getDashBoardAggregates() {\n if (dashBoardAggPromise == null) {\n dashBoardAggPromise = $http.post('website/userdashboard/getestabbookings', {\n SortCriterion: 'Likes',\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId\n }, { ignoreErrors: true }).then(function(result) {\n const allEstabs = result.data.EstabBookingDetails;\n const userReviews = result.data.Reviews;\n\n const visitedEstabInfo = {\n ReviewedHotels: [],\n UnreviewedHotels: []\n };\n\n enrichData(allEstabs);\n\n angular.forEach(allEstabs, function(estab) {\n estab.EstablishmentDetail.Url = estab.EstablishmentDetail.Url.replace('/', '');\n if (estab.IsReviewedByUser) {\n visitedEstabInfo.ReviewedHotels.push(estab);\n } else {\n visitedEstabInfo.UnreviewedHotels.push(estab);\n }\n });\n\n const estabDict = arrayUtil.toDict(allEstabs, function(e) { return e.EstablishmentDetail.Id; }, function(e) {\n e.EstablishmentDetail.ImageUrl = e.ImageUrl;\n return e.EstablishmentDetail;\n });\n\n arrayUtil.map(userReviews, function(r) {\n r.Establishment = estabDict[r.EstabId];\n return r;\n });\n\n\n return {\n estabs: visitedEstabInfo,\n reviews: userReviews\n };\n });\n }\n\n return dashBoardAggPromise;\n }\n\n function enrichData(estabs) {\n angular.forEach(estabs, function(estab) {\n const dim = TRPCONFIG.DeviceSettings.LandingImageHeight;\n estab.ImageUrl = imageService.getMainImageUrl(estab.EstablishmentDetail.Id, dim, dim);\n });\n }\n\n function getHotelsById(estabIds) {\n return $http.post('/api/hotels/static/gethotelsbyid', {\n Ids: estabIds,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n FieldFlags: fieldGroupService.getFieldGroup([\n fieldTypes.Global,\n fieldTypes.Titles\n ])\n }, { ignoreErrors: true }).then(function(result) {\n return result.data;\n });\n }\n\n function getAggregate() {\n return _getDashBoardAggregates();\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('dashboardBookingService', dashboardBookingService);\n\nfunction dashboardBookingService($http,\n $q,\n $routeParams,\n resourceService,\n dateUtil,\n broker,\n $location,\n crossSellService,\n customCurrencyFilter,\n dashboardBookingsErrorMessage,\n authService,\n bookingActionLink,\n imageService,\n $interpolate,\n unadjustedDateFilter,\n mybTrack) {\n const bookingActions = {\n VIEWBOOKINGDETAILS: {\n label: 'DASHBOARDRESOURCE_VIEWDETAILS',\n icon: 'icon-menu'\n },\n CSR: {\n label: 'DASHBOARDRESOURCE_CSR',\n icon: 'icon-support'\n },\n VOUCHERACTIONS: {\n label: 'DASHBOARDRESOURCE_RESENDEMAIL',\n icon: 'icon-email',\n trackEvent: 'MYB - Resend Email'\n },\n CHANGECONTACTDETAILS: {\n label: 'DASHBOARDRESOURCE_CHANGECONTACTDETAILS',\n icon: 'icon-edit'\n },\n CANCELBOOKINGS: {\n label: 'DASHBOARDRESOURCE_CANCELBOOKINGS',\n icon: 'icon-close',\n trackEvent: 'MYB - Cancel Click'\n },\n PAYBALANCE: {\n label: 'DASHBOARDRESOURCE_PAYBALANCE',\n icon: TRPCONFIG.Domain.CurrencyCode === 'EUR' ? 'icon-symbol-eur' : 'icon-symbol-gbp' //TODO: only two currencies?\n },\n ENTERAPI: {\n label: 'DASHBOARDRESOURCE_ENTERPASSENGERDETAILS',\n icon: 'icon-passenger'\n },\n PRINTVOUCHER: {\n label: 'DASHBOARDRESOURCE_PRINTVOUCHER',\n icon: 'icon-print',\n trackEvent: 'MYB - Print Booking'\n },\n PRINTRECEIPT: {\n label: 'DASHBOARDRESOURCE_PRINTRECEIPT',\n icon: 'icon-print',\n trackEvent: 'MYB - Print Booking'\n },\n AMENDBOOKING: {\n label: 'DASHBOARDRESOURCE_AMENDBOOKING',\n icon: 'icon-edit-booking',\n trackEvent: 'MYB - Amend Click'\n },\n ENTERREVIEW: {\n label: 'DASHBOARDRESOURCE_ENTERREVIEW',\n icon: 'icon-reviews'\n },\n ADDBAGGAGE: {\n label: 'ADDBAGGAGE',\n icon: 'icon-baggage'\n },\n DERWENTLINK: {\n label: 'DASHBOARDRESOURCE_DERWENTLINK',\n icon: 'icon-menu'\n },\n PRINTINVOICE: {\n label: 'DASHBOARDRESOURCE_PRINTINVOICE',\n icon: 'icon-print'\n }\n };\n\n const bookingTypes = {\n 1: { template: 'flight', code: 'MANAGEFLIGHT', ticket: 'TICKETS', icon: 'icon-flights' },\n 2: { template: 'tickets', code: 'MANAGETICKETS', ticket: 'TICKETS', icon: 'icon-attractions', defaultImage: '/build/img/assets/product/attractions.jpg' },\n 4: { template: 'car-hire', code: 'MANAGECARHIRE', ticket: 'VOUCHERS', icon: 'icon-car-hire', defaultImage: '/build/img/assets/car_hire.jpg' },\n 8: { template: 'accommodation', code: 'MANAGEACCOMODATION', ticket: 'VOUCHERS', icon: 'icon-hotels' },\n 9: { template: 'holiday', code: 'MANAGEHOLIDAY' },\n 16: { template: 'parking', code: 'MANAGEPARKING', icon: 'icon-parking', defaultImage: '/build/img/assets/product/parking.jpg' },\n 32: { template: 'transfer', code: 'MANAGETRANSFER', icon: 'icon-transfers', defaultImage: '/build/img/assets/product/transfers.jpg' },\n 64: { template: 'insurance', code: 'MANAGEINSURANCE', icon: 'icon-insurance', defaultImage: '/build/img/assets/product/travel-insurance.jpg' },\n 128: { template: 'package-holidays', code: 'MANAGEPACKAGE' },\n 256: { template: 'marhaba', code: 'MANAGEMARHARBA', icon: 'icon-marhaba', defaultImage: '/build/img/assets/product/marhaba.jpg' },\n 1024: { template: 'bundle', code: 'MANAGEBUNDLE', icon: 'icon-stack', defaultImage: '/build/img/assets/product/bundle.jpg' },\n 2048: { template: 'adhoc', code: 'MANAGEADHOC', icon: 'icon-attractions', defaultImage: '/build/img/assets/product/adhoc.jpg' }\n };\n const bookingTypeMap = {\n accommodation: 8,\n flight: 1,\n attraction: 2,\n carhire: 4,\n transfer: 32,\n travelInsurance: 64,\n bundle: 1024\n };\n const bookingInfoItemType = {\n Generic: 1,\n CancellationCondition: 2\n };\n const baseManageUrl = '/api2/managebooking';\n const v2ManageUrl = '/api2/bookings/manage';\n const bookingStatus = {\n confirmed: 1,\n pending: 2,\n canceled: 3\n };\n let limitBooking = 10;\n const itineraryType = {\n FlightOutbound: 1,\n FlightInbound: 2,\n CarHire: 3,\n HotelRoom: 4,\n AttractionTicket: 5,\n FlightInfo: 6,\n CarParking: 7,\n TransferArrival: 8,\n TransferReturn: 9,\n Insurance: 10,\n PackageHoliday: 11,\n Marhaba: 13\n };\n let tripsPromiseCache = {};\n const destinationType = {\n None: 0,\n Establishment: 1,\n Location: 2,\n Province: 3,\n Country: 4,\n Place: 5,\n Polygon: 10,\n Universal: 12\n };\n const bookingImageWidth = 300;\n const bookingImageHeight = 190;\n\n const service = {\n getBookingDetailsForTrip,\n getOutstandingTrips,\n getBookingStatus: () => angular.copy(bookingStatus),\n getBookingTypeMap: () => angular.copy(bookingTypeMap),\n getBookingInfoItemType: () => angular.copy(bookingInfoItemType),\n getLimitBooking: () => limitBooking,\n getItineraryType: () => angular.copy(itineraryType),\n getBookingDetail,\n getFuturePayments,\n getBookingSummary,\n getConfirmationEmailInfo,\n getActionLinks: () => bookingActionLink.get(),\n formatTitle,\n sendConfirmationEmail,\n getContact,\n putContact,\n removeCanceledBookings,\n calculateType,\n formatBookingMessage,\n setLimitBooking,\n getBookingInfo,\n getObjectFromBooking,\n actionRedirect,\n actionClick,\n getChildActions,\n getPahFromNotifications,\n getBookingActions,\n translateActionLink,\n getTripTitle,\n getFlightBooking,\n isPartOfHoliday,\n getMybBooking,\n getTripDateText,\n filterFinalBookings\n };\n\n function calculateType(abbr) {\n return bookingTypes[abbr] || abbr;\n }\n\n function getBookingActions() {\n return angular.copy(bookingActions);\n }\n\n // Gets the list of trips linked to the user\n function _getTripsInformation(period, tripId) {\n return $http.post(\n 'website/dashboard/trips/information',\n {\n Period: period,\n TripId: tripId\n }\n ).then(function(res) {\n if (!res || !res.data || !res.data.Trips || (!res.data.Trips.length && tripId) || res.data.InValidOwner) {\n return _bookingOwnershipRejection(tripId);\n }\n return res.data.Trips;\n });\n }\n\n function getBookingDetailsForTrip(tripId) {\n return $http.post(`${v2ManageUrl}/getbookingdetailsfortrip`, { TripId: tripId, CultureCode: TRPCONFIG.Domain.CultureCode })\n .then(res => {\n const bookingDetails = angular\n .copy(res.data.BookingDetails)\n .filter(d => d.BookedItems && d.BookedItems.length && d.Booking && d.LeadPassenger);\n bookingDetails.forEach(detail => {\n if (detail.Booking) {\n detail.Booking.LongType = calculateType(detail.Booking.Type);\n }\n });\n return bookingDetails;\n });\n }\n\n function getOutstandingTrips(period, tripId, crossSell = false) {\n if (tripsPromiseCache[period]) {\n return tripsPromiseCache[period];\n }\n if (tripId && tripsPromiseCache.reference && tripsPromiseCache.reference[tripId]) {\n return tripsPromiseCache.reference[tripId];\n }\n\n const tripsPromise = _getTripsInformation(period, tripId)\n .then(function _parseOutstandingTrip(trips) {\n ['userSet', 'bookingComplete', 'paymentComplete', 'reviewEntered', 'csrRaised', 'apiAdded']\n .forEach(event => broker.subscribe('dashboardBookingService', event, () => tripsPromiseCache = {}));\n\n if (trips && trips.length) {\n trips[0].isExpanded = true;\n\n if (tripId && trips.length === 1) {\n trips[0].Bookings[0].showOptions = true;\n }\n\n trips.forEach(function(tr) {\n tr.Bookings.forEach(function(bk) {\n bk.LongType = calculateType(bk.Type);\n _createActionList(bk);\n _addBookingImage(bk);\n });\n _processPackageTripIfNeeded(tr);\n });\n\n const flightBooking = _.find(trips[0].Bookings, b => b.Type === 1);\n if (flightBooking && !flightBooking.ObjectId) {\n service.getObjectFromBooking(flightBooking.BookingId).then(obj =>\n flightBooking.ImageUrl = imageService.getDestinationImage(obj, bookingImageWidth, bookingImageHeight)\n );\n }\n\n if (crossSell) {\n crossSellService.addExtrasAndCrossSells(trips[0]);\n }\n }\n return trips;\n });\n\n if (period) {\n tripsPromiseCache[period] = tripsPromise;\n } else {\n if (!tripsPromiseCache.reference) {\n tripsPromiseCache.reference = {};\n }\n tripsPromiseCache.reference[tripId] = tripsPromise;\n }\n\n return tripsPromise;\n }\n\n function getTripTitle(tr) {\n return _.uniqBy(tr.Bookings, 'Type').reduce((title, bk, index) =>\n title + (index ? ' + ' : '') + resourceService.get(bk.LongType.code), '');\n }\n\n function isPartOfHoliday(bookingId) {\n return getOutstandingTrips(null, bookingId).then(trips =>\n _.every(trips, tr => _.some(tr.Bookings, bk => bk.Type === bookingTypeMap.flight)\n && _.some(tr.Bookings, bk => bk.Type === bookingTypeMap.accommodation))\n );\n }\n\n function getTripDateText(tr) {\n const bookings = angular.copy(tr.Bookings);\n const cancelled = _.remove(bookings, bk => bk.Status === bookingStatus.canceled);\n const oldBookings = _.remove(bookings, bk => dateUtil.compareDates(bk.ReturnDate, dateUtil.todayPlus(0, 0, true)) === -1);\n if (cancelled.length === tr.Bookings.length) {\n return resourceService.get('TRIPCANCELLED');\n }\n const bookingsForTrip = bookings.length ? bookings : oldBookings;\n if (bookingsForTrip.length > 0) {\n return `${resourceService.get('TRIPDATE')} ${unadjustedDateFilter(_.reduce(bookingsForTrip, (startDate, bk) =>\n (dateUtil.compareDates(bk.StartDate, startDate) === -1) ? bk.StartDate : startDate, bookingsForTrip[0].StartDate), 'dd MMM yyyy')}`;\n }\n }\n\n function _createActionList(booking) {\n booking.BookingOptions.Actions.map(a => {\n const action = bookingActions[a.Name];\n a.label = action ? action.label : a.Name;\n if (action) {\n a.icon = action.icon;\n a.trackEvent = action.trackEvent;\n }\n return a;\n });\n }\n\n function _addBookingImage(bk) {\n if (bk.Type === bookingTypeMap.accommodation) {\n bk.ImageUrl = imageService.getMainImageUrl(bk.ObjectId, bookingImageWidth, bookingImageHeight, true);\n }\n if (!bk.ImageUrl) {\n bk.ImageUrl = bookingTypes[bk.Type].defaultImage;\n }\n }\n\n function _processPackageTripIfNeeded(trip) {\n const [hotelBooking, flightBooking] = [8, 1].map(type => _.chain(trip)\n .get('Bookings')\n .find(['Type', type]));\n\n const removePayBalance = [hotelBooking, flightBooking].every(booking =>\n booking.get('PackageId').value());\n\n if (removePayBalance) {\n const messages = _.chain([flightBooking, hotelBooking])\n .map(booking => booking.pick(['BalanceDueInfo', 'BookingId']).value())\n .filter('BalanceDueInfo')\n .value();\n\n const actions = _.chain([flightBooking, hotelBooking]).flatMap(booking => {\n booking.unset('BalanceDueInfo')\n .value();\n booking.get('TopInfoTexts')\n .remove(info => info && info.type === 8)\n .value();\n return booking.get('BookingOptions.Actions')\n .remove(action => action && action.Name === 'PAYBALANCE')\n .value();\n }).value();\n\n trip.packagePaymentsData = _.zipWith(messages, actions, (message, action) => _.defaults(\n message,\n { Action: action }\n ));\n }\n }\n\n function getObjectFromBooking(bookingId) {\n const obj = {};\n return service.getFlightBooking(bookingId).then(function(result) {\n const bookedItems = result.data;\n const destinationAirportCode = _.find(bookedItems.Itineraries, i => i.ItineraryTypeId === 1).DestinationAiport;\n return $http.get(`/api2/destination/airports/getairportlocation?${$.param({\n airportCode: destinationAirportCode,\n cultureCode: TRPCONFIG.Domain.CultureCode })}`, { ignoreErrors: true }\n ).then(function(r) {\n const destination = r.data;\n obj.ObjectId = destination.LocationId !== 0 ? destination.LocationId : destination.ProvinceId;\n obj.ObjectTypeId = destination.LocationId !== 0 ? destinationType.Location : destinationType.Province;\n return obj;\n });\n });\n }\n\n function getFlightBooking(bookingId) {\n return $http.get(`/api2/flightsnew/booking/${bookingId}`, { cache: true, ignoreErrors: true });\n }\n\n function getBookingInfo(bookingId) {\n return getOutstandingTrips(null, bookingId, true).then(function(trips) {\n return _.find(trips[0].Bookings, function(bk) {\n return bk.BookingId === parseInt(bookingId);\n });\n });\n }\n\n function setLimitBooking(n) {\n limitBooking = n;\n }\n\n // This function basically redirects the login straight to the booking details.\n function actionRedirect(action, booking) {\n const actionLink = service.getActionLinks();\n const path = translateActionLink(actionLink.VIEWBOOKINGDETAILS, booking);\n $location.url(path);\n }\n\n function actionClick(action, booking) {\n const actionLink = service.getActionLinks();\n if (action.disabled) {\n return false;\n }\n\n if (TRPCONFIG.Domain2.BookingCtaRedirectEnabled) {\n const enableRedirect = ['CANCELBOOKINGS', 'CSR', 'AMENDBOOKING'].includes(action.Name);\n\n if (enableRedirect) {\n window.open(TRPCONFIG.Domain2.BookingCtaRedirectUrl, '_blank');\n return false;\n }\n }\n\n if (actionLink) {\n if (action.trackEvent) {\n mybTrack.track(action.trackEvent);\n }\n const path = translateActionLink(actionLink[action.Name], booking);\n if (action.OpenNewTab) {\n window.open(path, '_blank');\n return false;\n }\n $location.url(path);\n }\n }\n\n function translateActionLink(link, booking) {\n return link ? $interpolate(link)(booking) : '';\n }\n\n const TopInfo =\n {\n PayAtHotel: 7\n };\n\n const notificationData = {\n 3: 'BalanceDue',\n 7: 'PayAtHotel'\n };\n\n function formatBookingMessage(info, bk) {\n let resourceVal = resourceService.get(info.text);\n if (info.action.Name) {\n const actionLink = service.getActionLinks();\n const actionPath = translateActionLink(actionLink[info.action.Name], bk);\n resourceVal = String.format(resourceVal, actionPath);\n }\n switch (info.type) {\n case TopInfo.PayAtHotel: {\n const pah = getPahFromNotifications(bk.Notifications);\n return pah ? String.format(resourceVal, customCurrencyFilter(pah.Amount, pah.CurrencyCode)) : '';\n }\n }\n\n return resourceVal;\n }\n\n function getPahFromNotifications(notifications) {\n return _.reduce(notifications, (pah, n) => {\n if (TopInfo.PayAtHotel === TopInfo[notificationData[n.Type]]) {\n pah.Amount += n.Amount;\n pah.CurrencyCode = n.CurrencyCode;\n }\n return pah;\n }, { Amount: 0 });\n }\n\n function removeCanceledBookings(trips) {\n const filteredTrips = [];\n _.forEach(trips, t => {\n t.Bookings = _.filter(t.Bookings, b => b.Status !== bookingStatus.canceled);\n if (t.Bookings.length > 0) {\n filteredTrips.push(t);\n }\n });\n return filteredTrips;\n }\n\n /* This function to filter the bookings of EKH suppported products with Receipted status */\n function filterFinalBookings(TripItineraries) {\n const bookingTypeArr = [1, 8, 32, 256, 2048]; /* flight, accomodation, transfer, marhaba, adhoc */\n TripItineraries = TripItineraries.filter(t => {\n return t.BookingStatus === 2 && bookingTypeArr.indexOf(t.BookingType) !== -1;\n });\n return TripItineraries;\n }\n\n // This funciton has been created to remove duplications of passengers where one is a type of ADULT and one a type of CHILD.\n function dedupePassengers(paxData) {\n const hotelPax = paxData.filter(p => {\n return p.ItineraryId > 0;\n });\n paxData = hotelPax.length > 0 ? hotelPax : paxData;\n paxData = paxData.filter((data, index, self) =>\n index === self.findIndex(d => (\n d.FirstName === data.FirstName && d.LastName === data.LastName && (d.AgeOnReturn === data.AgeOnReturn || d.AgeOnReturn <= data.AgeOnReturn)\n ))\n );\n return paxData;\n }\n\n // Gets details regarding a booking and adds full booking type\n function getBookingDetail(bookingId, viewDetail = false, culture) {\n const cultureCode = culture === 'en-gb' ? TRPCONFIG.Domain.MYBDefaultCultureCode : TRPCONFIG.Domain.CultureCode;\n const promise = viewDetail\n ? $http.get(\n `website/bookingdetails/${bookingId}/${cultureCode}`\n ) : $http.post(\n `${v2ManageUrl}/getbookingdetailv2`,\n { BookingId: bookingId, Culture: cultureCode }\n );\n\n return promise.then(res => {\n if (res.data && res.data.Passengers) {\n res.data.Passengers = dedupePassengers(res.data.Passengers);\n }\n if (!res || !res.data) {\n return;\n }\n if (res.data.InValidOwner) {\n return _bookingOwnershipRejection(bookingId);\n }\n if (viewDetail) {\n return parseBooking(res.data);\n }\n return res.data;\n });\n }\n\n function getFuturePayments(booking) {\n if (!booking) {\n return $q.when();\n }\n return getBookingDetail(booking.BookingId, true).then(details => _.get(details, 'FuturePayments'))\n .then(fp => booking.FuturePayments = fp);\n }\n\n function parseBooking(detail) {\n const booking = detail.Booking;\n booking.LongType = calculateType(booking.Type);\n\n const passengerTitles = {\n accommodation: {\n plural: 'GUESTS',\n singular: 'LEADGUEST'\n },\n tickets: {\n plural: 'VISITORS',\n singular: 'VISITOR'\n },\n defaultTitle: {\n plural: 'PASSENGERS',\n singular: 'PASSENGER'\n }\n };\n\n const titles = passengerTitles[booking.LongType.template] || passengerTitles.defaultTitle;\n booking.PassengersTitlePlural = resourceService.get(titles.plural);\n booking.PassengersTitleSingular = resourceService.get(titles.singular);\n\n return detail;\n }\n\n // Gets booking summary\n function getBookingSummary(bookingId) {\n return $http.get(\n `${v2ManageUrl}/bookingsummary?bookingId=${bookingId}`, { ignoreErrors: true }\n ).then(function(result) {\n return result.data;\n });\n }\n\n // Gets details regarding the confirmation email\n function getConfirmationEmailInfo(bookingId) {\n const cultureCode = TRPCONFIG.Domain.CultureCode;\n return $http.post(\n `${baseManageUrl}/getconfirmationemailinfo`,\n { BookingId: bookingId, Culture: cultureCode }\n );\n }\n\n // Gets contact\n function getContact(bookingId) {\n return $http.get(\n `${v2ManageUrl}/contactdetails/${bookingId}`\n );\n }\n\n // updates contact\n function putContact(bookingId, contactDetail, updateRelatedBookings) {\n if (updateRelatedBookings) {\n contactDetail.BookingId = bookingId;\n return $http.post(\n String.format('{0}/{1}/{2}', v2ManageUrl, 'contactdetails', 'updatecontactdetailsforlinkedbookings'), contactDetail);\n }\n\n return $http.put(\n String.format('{0}/{1}/{2}', v2ManageUrl, 'contactdetails', bookingId), contactDetail);\n }\n\n // Format the Title by removing the supplier name\n function formatTitle(bk) {\n //If not Insurance booking\n if (bk.Type !== bookingTypeMap.travelInsurance && bk.Type !== bookingTypeMap.bundle && bk.Title) {\n const titleArray = bk.Title.split(':');\n bk.Title = (titleArray.length > 1) ? titleArray[1].trim() : titleArray[0];\n }\n }\n\n //Resend Email Confirmation\n function sendConfirmationEmail(emails, bookingId) {\n return $http.post(`${baseManageUrl}/sendconfirmationemail`,\n {\n BookingId: bookingId,\n Culture: TRPCONFIG.Domain.CultureCode,\n Emails: emails\n }\n );\n }\n\n function _bookingOwnershipRejection(id) {\n dashboardBookingsErrorMessage.setMessage(id);\n const user = authService.getUser();\n if (user.HardSignedIn) {\n $location.path('/dashboard/bookings/current');\n }\n const bookingId = authService.getSignedInBookingId();\n if (bookingId) {\n $location.path(`/dashboard/bookings/reference/${bookingId}`);\n }\n return $q.reject();\n }\n\n function getChildActions(actions, parent) {\n return _.filter(actions, function(a) {\n return a.ParentActionName === parent;\n });\n }\n\n function getMybBooking(BookingId = $routeParams.BookingId) {\n return $http.get('/api/bookings/myb/getbooking', {\n params: {\n BookingId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n },\n cache: true,\n })\n .then(({ data }) => data);\n }\n\n return service;\n}\n})();\n","'use strict';\nnamespace Dashboard {\n\n export class DashboardBookingsErrorMessage {\n\n private bookingNotYours : string | null;\n\n setMessage(bookingId: string): void {\n this.bookingNotYours = bookingId;\n }\n\n getMessage(): string | null {\n let bookingId = this.bookingNotYours;\n this.bookingNotYours = null;\n return bookingId;\n }\n\n }\n\n angular\n .module('dashboard')\n .service('dashboardBookingsErrorMessage', DashboardBookingsErrorMessage);\n\n}\n","module Dashboard {\n\n export interface IDashboardBreadCrumb {\n get(page:string, bk: any): Crumb[];\n }\n\n export class DashboardBreadCrumb implements IDashboardBreadCrumb{\n private extraCrumbs;\n private bookingTypes;\n\n constructor(\n private resourceService: Core.ResourceService,\n private unadjustedDateFilter,\n private dashboardBookingService,\n private currentUser,\n private $routeParams) {\n\n this.extraCrumbs = {\n MYBOOKINGS: {\n label: this.resourceService.get(\n this.currentUser.get().HardSignedIn\n ? 'DASHBOARDRESOURCE_MYBOOKINGS'\n : 'DASHBOARDRESOURCE_MYBOOKING'),\n PagePath: this.currentUser.get().HardSignedIn ?\n 'dashboard/bookings/current' : 'dashboard/bookings/reference/{{::BookingId}}'\n },\n RAISECSR: {\n label: 'DASHBOARDRESOURCE_RAISECSR',\n PagePath: 'dashboard/create-csr/{{::BookingId}}'\n },\n CSRDETAILS: {\n label: this.resourceService.get('CSRREF') + ': {{::CsrId}}',\n PagePath: 'dashboard/csr-details/{{::BookingId}}/{{::CsrId}}'\n },\n SEATSELECTION: {\n label: this.resourceService.get('SEATSELECTIONBREADCRUMB'),\n PagePath: 'dashboard/seat-selection/{{::BookingId}}'\n }\n };\n\n this.bookingTypes = dashboardBookingService.getBookingTypeMap();\n }\n\n public get(pages, bk) {\n if (bk) {\n let bookingType = this.getBookingTypeText(bk);\n let title = bk.Title ? (bk.Title + ' ') : '';\n this.extraCrumbs['VIEWBOOKINGDETAILS'] = {\n label: `${title}${bookingType} ${this.unadjustedDateFilter(bk.StartDate, 'dd MMM yyyy')}`,\n PagePath: 'dashboard/booking-details/{{::BookingId}}'\n };\n }\n\n\n let actions = _.extend(this.dashboardBookingService.getBookingActions(), this.extraCrumbs);\n if (pages) {\n let actionLinks = this.dashboardBookingService.getActionLinks();\n\n const crumbTrail = pages.split('|').map(page => ({\n Title: this.dashboardBookingService.translateActionLink(actions[page]\n && this.resourceService.get(actions[page].label), {\n BookingId: bk && bk.BookingId,\n CsrId: this.$routeParams.csrId\n }),\n PagePath:\n this.dashboardBookingService.translateActionLink(actions[page] && actions[page].PagePath\n || actionLinks[page], {\n BookingId: bk && bk.BookingId,\n CsrId: this.$routeParams.csrId\n })\n })).filter(page => page.PagePath && page.Title);\n return crumbTrail;\n\n }\n return [];\n\n }\n\n getBookingTypeText(bk) : string {\n return _.includes([\n this.bookingTypes.transfer,\n this.bookingTypes.accommodation,\n this.bookingTypes.attraction,\n ], bk.Type) ? '' : this.resourceService.get(bk.LongType.code);\n }\n }\n\n interface Crumb {\n Title: string;\n PagePath: string;\n }\n\n angular\n .module('dashboard')\n .service('dashboardBreadCrumbDetails', DashboardBreadCrumb);\n\n}\n","(function() {\n 'use strict';\n\n angular\n .module('dashboard')\n .factory('dashboardCsrService', dashboardCsrService);\n\n function dashboardCsrService($http,\n $q,\n resourceService,\n dateUtil,\n dashboardBookingService) {\n const csrStatus = {\n 1: 'CSRUNALLOCATED',\n 2: 'CSRINPROGRESS',\n 3: 'CSRSTATUSCOMPLETED',\n 4: 'CSRAWAITINGRESPONSE',\n 5: 'CSRAWAITINGACKNOWLEDGEMENT'\n };\n\n const csrStatusClass = {\n 1: 'csr-unallocated',\n 2: 'csr-inprogress',\n 3: 'csr-completed',\n 4: 'csr-awaiting-response',\n 5: 'csr-waiting-acknowledge'\n };\n\n const baseCsrUrl = '/api2/csr/customer';\n\n const service = {\n getCSRStatus,\n getCSRStatusCode,\n getCSRSummary,\n getCSRDetail,\n getCsrCategories,\n createCsr,\n getAllCSRs,\n htmlifyLineBreaks,\n getCsrStatusClass,\n getConvertationFromCsr,\n addCsrToBooking,\n getSenderTitle,\n submitMessage\n };\n\n function getAllCSRs() {\n return $http.get(`${baseCsrUrl}?domainId=${TRPCONFIG.Domain.DomainId}`,\n { ignoreErrors: true }).then(res => {\n return _.map(res.data, csr => _enrichCSR(csr));\n });\n }\n\n function getCSRStatus(id) {\n return resourceService.get(csrStatus[id]);\n }\n\n function getCSRStatusCode(id) {\n return angular.copy(csrStatus[id]);\n }\n\n function getCsrStatusClass(id) {\n return angular.copy(csrStatusClass[id]);\n }\n\n function getCSRSummary(bookingId) {\n return $http.get(`${baseCsrUrl}/booking/${bookingId}`).then(_parseCSRSummary);\n }\n\n function getCSRDetail(bookingId) {\n return $http.get(`${baseCsrUrl}/${bookingId}`).then(r => _enrichCSR(r.data));\n }\n\n function _parseCSRSummary(res) {\n const csr = {\n completed: [],\n pending: []\n };\n res.data.forEach(item => {\n _enrichCSR(item);\n if (item.Status === 3) {\n csr.completed.push(item);\n } else {\n csr.pending.push(item);\n }\n });\n csr.pending = _.orderBy(csr.pending, csr => csr.lastUpdated, 'desc');\n\n return csr;\n }\n\n function _enrichCSR(item) {\n item.conversation = getConvertationFromCsr(item);\n item.openQuestion = _.find(item.Questions, q => !q.Answer);\n item.lastUpdated = _.reduce(item.conversation, (updatedDate, c) => {\n return (dateUtil.compareDates(c.date, updatedDate) === 1) ? c.date : updatedDate;\n }, item.CreatedDate);\n item.StatusResource = getCSRStatus(item.Status);\n item.AddNoteAllowed = item.Status !== 3;\n return item;\n }\n\n function getCsrCategories(bookingType, bookingId) {\n return $http.get(`/api2/csr/categories?${$.param({\n BookingType: bookingType,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n BookingId: bookingId\n })}`).then(result => {\n return result.data;\n });\n }\n\n function createCsr(csr, bookingId, mobileTel) {\n return $http.post(baseCsrUrl,\n {\n DomainId: TRPCONFIG.Domain.DomainId,\n BookingId: bookingId,\n CategoryId: csr.Category.Id,\n TextAlerts: csr.TextAlerts,\n Subject: csr.Subject,\n Text: csr.Text,\n MobileTel: mobileTel\n }).then(res => {\n return res.data;\n });\n }\n\n function _answerToQuestion(questionId, answerText) {\n return $http.post(`${baseCsrUrl}/question/${questionId}/answer`, {\n AnswerText: answerText\n });\n }\n\n function _addLogToCsr(log, csrId) {\n return $http.post(`${baseCsrUrl}/${csrId}/log`, log);\n }\n\n function submitMessage(csr) {\n const question = _.find(csr.conversation, c => c.openQuestion);\n if (question && (question.questionId > -1)) {\n return _answerToQuestion(question.questionId, csr.newMessage).then(() => {\n csr.conversation.push({\n text: htmlifyLineBreaks(csr.newMessage),\n createdByCustomer: true\n });\n csr.newMessage = null;\n question.openQuestion = null;\n return true;\n });\n }\n\n if (csr.AddNoteAllowed) {\n return _addLogToCsr({ Text: csr.newMessage }, csr.CsrId).then(() => {\n csr.conversation.push({\n text: htmlifyLineBreaks(csr.newMessage),\n createdByCustomer: true\n });\n csr.newMessage = null;\n return true;\n });\n }\n\n return $q.when(false);\n }\n\n function htmlifyLineBreaks(text) {\n return text ? text.replace(/\\s*\\n|\\n\\s*/g, '
            ').replace(/\\n/g, '
            ') : text;\n }\n\n function getConvertationFromCsr(csr) {\n const openQuestion = _.find(csr.Questions, q => !q.Answer);\n const sortedCoversation = _.orderBy(_.concat(csr.Questions, csr.Logs), c => c.QuestionDate || c.CreatedDate);\n\n const initialText = {\n text: htmlifyLineBreaks(csr.Text),\n date: csr.CreatedDate,\n createdByCustomer: !csr.AgentName,\n agentName: csr.AgentName\n };\n\n const conversations = _.flatMap(sortedCoversation, c => {\n if (c.QuestionDate) {\n //c is a question and answer\n if (c.Answer) {\n const q = {\n text: htmlifyLineBreaks(c.QuestionText),\n date: c.QuestionDate,\n agentName: c.AgentName\n };\n const a = {\n text: htmlifyLineBreaks(c.Answer),\n date: c.AnswerDate,\n createdByCustomer: true\n };\n return [q, a];\n }\n } else {\n // c is a log\n const l = {\n text: htmlifyLineBreaks(c.Text),\n date: c.CreatedDate,\n createdByCustomer: c.CreatedByCustomer,\n agentName: c.AgentName\n };\n return l;\n }\n });\n if (openQuestion) {\n const q = {\n text: htmlifyLineBreaks(openQuestion.QuestionText),\n date: openQuestion.QuestionDate,\n questionId: openQuestion.Id,\n openQuestion: true,\n agentName: openQuestion.AgentName\n };\n conversations.push(q);\n }\n const validConversation = _.filter(conversations, c => c != null);\n if (initialText.text != null && initialText.text.length > 0) {\n validConversation.unshift(initialText);\n }\n return validConversation;\n }\n\n function getSenderTitle(conversation) {\n return conversation.createdByCustomer ?\n resourceService.get('CSRYOUASKED') :\n String.format(resourceService.get('CSRAGENTASKED'), conversation.agentName);\n }\n\n function addCsrToBooking(trips) {\n service.getAllCSRs().then(csrs => {\n const allCsrs = _.orderBy(csrs, 'lastUpdated', 'desc');\n _.each(trips, tr => {\n _.each(tr.Bookings, bk => {\n bk.csr = {\n message: _getCsrMessage(bk.BookingId, allCsrs),\n statusClass: _getCsrStatusClass(bk.BookingId, allCsrs)\n };\n });\n });\n });\n }\n\n function _getCsrMessage(bookingId, allCsrs) {\n const csr = _.find(allCsrs, ['BookingId', bookingId]);\n let resourceVal = csr ? resourceService.get(`MYB${service.getCSRStatusCode(csr.Status)}`) : '';\n const actionPath = dashboardBookingService.translateActionLink(\n 'dashboard/csr/{{BookingId}}', { BookingId: bookingId }\n );\n if (csr) {\n if (csr.Status === 4) {\n const openQuestion = _.find(csr.Questions, q => !q.Answer);\n resourceVal = String.format(decodeURI(resourceVal), openQuestion.AgentName, actionPath);\n } else {\n resourceVal = String.format(decodeURI(resourceVal), actionPath);\n }\n }\n return resourceVal;\n }\n\n function _getCsrStatusClass(bookingId, allCsrs) {\n const csr = _.find(allCsrs, ['BookingId', bookingId]);\n return csr ? service.getCsrStatusClass(csr.Status) : '';\n }\n\n return service;\n }\n})();\n","namespace Dashboard {\n enum Notification {\n CreateProfile= 0,\n TravelChange= 1,\n CsrQuestion= 2,\n DuePayment= 3,\n PassengerApi= 4,\n NewsletterSignup= 5,\n HotelReview= 6,\n PayAtHotel= 7,\n OutboundFlightCheckin= 8,\n InboundFlightCheckin= 9\n };\n\n export interface IDashboardNotificationService {\n getNotifications(): ng.IPromise;\n getNotificationLinks(): any;\n formatNotification(noti: INotification): string;\n notificationClicked(noti: INotification): void;\n }\n\n export class DashboardNotificationService implements IDashboardNotificationService {\n private _notificationTypes: any = {\n 1: () => _.identity('NOTICSRCHANGE'),\n 2: () => _.identity('NOTICSR'),\n 3: n => this._getPaymentDueString(n), //pamentDue String changes depending upon booking type and dueDate\n 4: () => _.identity('NOTIAPI'),\n 6: () => _.identity('NOTIREVIEW'),\n 10: () => _.identity('NOTICREATEPROFILE')\n\n };\n\n private _notificationActionTypes: any = {\n 1: 'NOTICSRCHANGE_ACTION',\n 2: 'NOTICSR_ACTION',\n 3: 'NOTIPAYMENT_DUE_ACTION',\n 4: 'NOTIAPI_ACTION',\n 6: 'NOTIREVIEW_ACTION',\n 10: 'NOTICREATEPROFILE_ACTION'\n };\n\n private _paymentDueType: any = {\n hotelDue: 'NOTIDUEHOTEL',\n hotelOverDue: 'NOTIOVERDUEHOTEL',\n flightDue: 'NOTIDUEFLIGHT',\n flightOverDue: 'NOTIOVERDUEFLIGHT',\n transferDue: 'NOTIDUETRANSFER',\n transferOverDue: 'NOTIOVERDUETRANSFER'\n };\n\n private _desktopUrl: string = 'desktop-url/{{SiteId}}/{{BookingId}}/{{LastName}}';\n\n getNotificationLinks: any = () => this.notificationLink.get();\n //private _notificationLinks: _.Dictionary = {1:'a'};\n\n constructor(\n private $http: ng.IHttpService,\n private $location: any,\n private $interpolate: any,\n private $filter: ng.IFilterService,\n private dateUtil: any,\n private resourceService: Core.ResourceService,\n private dashboardBookingService: any,\n private notificationLink: any) { }\n\n\n getNotifications(): ng.IPromise {\n return this.$http.post('/api2/bookings/manage/getbookingnotifications',\n {\n Culture: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId\n },\n { ignoreErrors: true }).then(result => this._postProcess(result));\n }\n\n //getNotificationLinks() {\n // return angular.copy(this._notificationLinks);\n //}\n\n notificationClicked(notification: INotification): void {\n let path = this._translateActionLink(this.getNotificationLinks()[notification.Type], notification);\n this.$location.url(path);\n }\n\n formatNotification(noti: INotification): string{\n let resourceVal:string = this.resourceService.get(noti.templateString);\n let bookingType:string =\n this.resourceService.get(this.dashboardBookingService.calculateType(noti.BookingType).code);\n\n switch (noti.Type) {\n case Notification.TravelChange:\n return String.format(resourceVal, bookingType, noti.DestinationName);\n case Notification.CsrQuestion:\n return String.format(resourceVal, noti.AgentName, bookingType, noti.DestinationName);\n case Notification.DuePayment:\n let dueDateText = this.dueDateText(noti);\n return String.format(resourceVal, this.$filter('customCurrency')(noti.Amount, noti.CurrencyCode),\n noti.DestinationName, dueDateText);\n case Notification.PassengerApi:\n return String.format(resourceVal, noti.DestinationName);\n case Notification.HotelReview:\n return String.format(resourceVal, noti.DestinationName);\n }\n\n return resourceVal;\n }\n\n dueDateText(noti: INotification): string {\n let days = this.dateUtil.dayDiff(this.dateUtil.todayPlus(0, 0, true), noti.DueDate) - 1;\n\n if (days > 1) {\n let daysWithin = this.resourceService.get('DAYSWITHIN');\n return String.format(daysWithin, days);\n }\n if (days === 1) {\n return this.resourceService.get('TOMORROW');\n }\n if (days === 0) {\n return this.resourceService.get('TODAY');\n }\n\n return '';\n }\n\n private _translateActionLink(link: string, booking:any) {\n return link ? this.$interpolate(link)(booking) : '';\n }\n\n private _getPaymentDueString(n:INotification) {\n let accommodationBooking = 8;\n let transferBooking = 32;\n let dayDiff = this.dateUtil.compareDates(this.dateUtil.todayPlus(1), n.DueDate);\n if (n.BookingType === accommodationBooking) {\n return (dayDiff === 1)\n ? this._paymentDueType.hotelOverDue : this._paymentDueType.hotelDue;\n }\n if (n.BookingType === transferBooking) {\n return (dayDiff === 1)\n ? this._paymentDueType.transferOverDue : this._paymentDueType.transferDue;\n }\n return (dayDiff === 1)\n ? this._paymentDueType.flightOverDue : this._paymentDueType.flightDue;\n }\n\n private _postProcess(result: any): INotification[] {\n let notifications = result.data.Notifications;\n let validNoti:any = [];\n _.each(notifications, (n: INotification) => {\n if (this._notificationTypes[n.Type]) {\n n.templateString = this._notificationTypes[n.Type](n);\n n.actionString = this.resourceService.get(this._notificationActionTypes[n.Type]);\n validNoti.push(n);\n }\n });\n return validNoti;\n }\n }\n\n export interface INotification {\n Type: number;\n BookingType: number;\n SiteId: string;\n BookingId: number;\n Amount: number;\n DueDate: string;\n LastName: string;\n CurrencySymbol: string;\n CurrencyCode: string;\n TaskId: number;\n AgentName: string;\n DestinationName: string;\n StartDate: string;\n HasFuturePayments: boolean;\n templateString: string;\n actionString: string;\n }\n angular\n .module('dashboard')\n .service('dashboardNotificationService', DashboardNotificationService);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('deliveryAddressService', deliveryAddressService);\n\nfunction deliveryAddressService($http) {\n const url = '/api2/attractions/deliveryaddress/';\n\n return {\n get(bookingId) {\n return $http.get(url + bookingId);\n },\n put(bookingId, deliveryAddress) {\n return $http.put(\n String.format('{0}/{1}', url, bookingId), deliveryAddress);\n }\n };\n}\n})();\n","namespace Dashboard {\n\n import PassengerType = Core.Booking.PassengerType;\n import CrossSellType = Core.Booking.CrossSellType;\n\n export interface IFlightExtrasService {\n getOptionsData(bookingId: number);\n addOptionsToBooking(request, requireCardValidation);\n finaliseOptions(request);\n }\n\n interface IExtraProduct {\n CrossSellType: CrossSellType;\n Price: {\n CurrencyCode: string;\n Value: number;\n };\n Priority: number | null;\n IsFlightExtra: boolean;\n BookingId: number;\n Name: string;\n Icon: string;\n Code: string;\n }\n\n export class FlightExtrasService implements IFlightExtrasService {\n\n public extraProperties = {\n Bags: {\n Icon: 'icon-baggage',\n Code: 'HOLDBAGS'\n },\n Seats: {\n Icon: 'icon-seating',\n Code: 'SEATS'\n }\n };\n\n private extrasCache = {};\n\n constructor(\n private $http: ng.IHttpService,\n private dateUtil,\n private paymentDetailsService,\n private flightSeatPlanService,\n private $q: ng.IQService,\n private broker: Core.Broker) {\n\n // make sure cross sells are updated after a payment\n broker.subscribe('flightExtraService', 'paymentComplete', () => this.extrasCache = {});\n }\n\n\n getOptionsData(bookingId: number) {\n return this.$http.post('/api2/bookings/flights/checkoptions', {\n BookingId: bookingId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DomainId: TRPCONFIG.Domain.DomainId\n }).then( ({data}) => {\n // multi sector seat selection not yet supported\n const legs = data && data.Flight && data.Flight.Legs;\n const numberOfInfants = _.remove(data.Passengers, (p: any) => p.Type === PassengerType.Infant).length;\n const SeatPlan : TR.FlightSeatPlan | null = legs && legs.length && legs.length <= 2\n ? {\n Segments: {\n Outbound: legs[0].Segments,\n Inbound: legs[1].Segments\n },\n Passengers: _.sortBy(data.Passengers, 'Type')\n .map((p: any, pIndex) => _.defaults({\n Id: p.Id,\n Seats: _.flatMap(legs, leg => leg.Segments.map(seg => ({\n Number: null,\n Price: 0,\n LegId: leg.LegId,\n Segement: seg.SegmentHash //intentionally misspelt\n }))),\n IsChild: p.Type === PassengerType.Child,\n HasInfant: p.Type === PassengerType.Adult && pIndex < numberOfInfants\n }, p))\n }\n : null;\n SeatPlan && this.flightSeatPlanService.addMinCostPerPerson(SeatPlan);\n return _.defaults(data, { SeatPlan });\n });\n }\n\n getExtrasCrossSell(bookingId: number) {\n if (this.extrasCache[bookingId]) {\n return this.$q.when(this.extrasCache[bookingId]);\n }\n let extras:any = [];\n return this.getOptionsData(bookingId).then((options: any) => {\n if (options && options.CanAddBags && options.BagOptions && options.BagOptions.length > 0) {\n let extraBags: IExtraProduct = {\n CrossSellType: CrossSellType.Baggage,\n Price: {\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n Value: options.BagOptions[0].UnitAmount / 2\n },\n Priority: null,\n IsFlightExtra: true,\n BookingId: bookingId,\n Name: 'ADDBAGGAGE',\n Icon: this.extraProperties.Bags.Icon,\n Code: this.extraProperties.Bags.Code\n };\n\n extraBags.Priority = extras.push(extraBags) - 1;\n }\n if (TRPCONFIG.Domain.DashboardAddSeatsEnabled && options && options.CanAddSeats) {\n let extraSeats: IExtraProduct = {\n CrossSellType: CrossSellType.Seats,\n Price: {\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n Value: options.SeatPlan.minCostPerPerson\n },\n Priority: null,\n IsFlightExtra: true,\n BookingId: bookingId,\n Name: 'ADDSEATS',\n Icon: this.extraProperties.Seats.Icon,\n Code: this.extraProperties.Seats.Code\n };\n\n extraSeats.Priority = extras.push(extraSeats) - 1;\n }\n this.extrasCache[bookingId] = extras;\n return extras;\n }, () => extras);\n }\n\n //Transaction\n addOptionsToBooking(request, requireCardValidation) {\n if (requireCardValidation) {\n const paymentRequest = request.PaymentRequest;\n const validateRequest = {\n CardNumber: TRPCONFIG.Domain.PCICompliant ?\n paymentRequest.CardNumberMasked : paymentRequest.CardNumber,\n StartDate: paymentRequest.CardStartYear && paymentRequest.CardEndMonth\n && this.dateUtil.serialiseDate(new Date(\n paymentRequest.CardStartYear,\n paymentRequest.CardStartMonth)),\n ExpiryDate: this.dateUtil.serialiseDate(\n new Date(paymentRequest.CardEndYear, paymentRequest.CardEndMonth)),\n CV2: paymentRequest.CardCvc,\n IssueNumber: paymentRequest.CardIssueNumber\n };\n\n return this.paymentDetailsService.validateCard(validateRequest).then((response: any)=> {\n if (response.Success) {\n return this._clear(request);\n }\n return this.$q.when(response);\n });\n }\n\n return this._clear(request);\n }\n\n _clear(request) {\n return this.$http.post('/api2/bookings/flights/addoptions', request).then((result:any) => result.data);\n }\n\n finaliseOptions(request) {\n return this.$http.post('/api2/bookings/flights/finaliseoptions', request).then(result => result.data);\n }\n\n }\n\n angular\n .module('dashboard')\n .service('flightExtrasService', FlightExtrasService);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('onlineCheckinService', onlineCheckinService);\n\nfunction onlineCheckinService(\n $http,\n $filter,\n resourceService) {\n const checkinURL = '/api2/flightscheckin';\n const service = {\n getOnlineCheckinOptions,\n doCheckin,\n getCheckinAvailability,\n getCheckinType,\n addCheckinData\n };\n\n const flightClass = {\n 1: resourceService.getDeferred('ECONOMYCLASS'),\n 2: resourceService.getDeferred('PREMIUMECONOMYCLASS'),\n 4: resourceService.getDeferred('FIRSTCLASS'),\n 8: resourceService.getDeferred('BUSINESSCLASS')\n };\n const checkinType = {\n Unknown: { label: resourceService.getDeferred('ONLINECHECKIN_CHECKINSTATUSUNKNOWN'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\n NotSupported: { label: resourceService.getDeferred('ONLINECHECKIN_ONLINECHECKINNOTSUPPORTED'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\n Available: { label: resourceService.getDeferred('ONLINECHECKIN_CANCHECKIN'), isEnabled: true, isSupported: true, isCheckedIn: false, apiRequired: false },\n CheckedIn: { label: resourceService.getDeferred('ONLINECHECKIN_ALREADYCHECKEDIN'), isEnabled: false, isSupported: false, isCheckedIn: true, apiRequired: false },\n ApiRequired: { label: resourceService.getDeferred('ONLINECHECKIN_PENDINGPASSENGERDETAILS'), isEnabled: false, isSupported: true, isCheckedIn: false, apiRequired: true },\n Closed: { label: resourceService.getDeferred('ONLINECHECKIN_CHECKINCLOSED'), isEnabled: false, isSupported: false, isCheckedIn: false, apiRequired: false },\n WaitingToOpen: { label: resourceService.getDeferred('ONLINECHECKIN_NOTINCHECKINWINDOW'), isEnabled: false, isSupported: true, isCheckedIn: false, apiRequired: false }\n };\n\n function getOnlineCheckinOptions(bookingId) {\n return $http.post(`${checkinURL}/options`, bookingId).then(function(result) {\n angular.forEach(result.data.Legs, function(leg) {\n getCheckinType(leg);\n leg.flightClass = flightClass[leg.FlightClass];\n angular.forEach(leg.Passengers, function(passenger) {\n passenger.passengerType = resourceService.get(passenger.Type);\n });\n });\n return result.data;\n });\n }\n\n\n function doCheckin(bookingId, legs) {\n return $http.post(`${checkinURL}/checkin`, { BookingId: bookingId, Legs: legs }).then(function(response) {\n return response.data;\n });\n }\n\n function getCheckinAvailability(bookingIds) {\n return $http.post(`${checkinURL}/availability`, { BookingIds: bookingIds }, { ignoreErrors: true }).then(function(result) {\n const data = result.data;\n angular.forEach(data, function(legs, bookingId) {\n const checkinData = {};\n let startTime;\n angular.forEach(legs, function(leg) {\n const isLegEarlier = (leg && (leg.CheckinStartTime < startTime)) || !startTime;\n startTime = leg && isLegEarlier ? leg.CheckinStartTime : startTime;\n });\n checkinData.checkinDisabled = !(startTime && (new Date() > new Date(startTime)));\n checkinData.checkinMessage = !checkinData.checkinDisabled ? resourceService.get('ONLINECHECKIN_CHECKINENABLED') : String.format(resourceService.get('ONLINECHECKIN_CHECKINSTARTFROM'), $filter('date')(startTime, 'dd MMM yyyy'), $filter('date')(startTime, 'HH:mm'));\n data[bookingId] = checkinData;\n });\n return data;\n });\n }\n\n function getCheckinType(leg) {\n leg.checkinType = checkinType[leg.CheckinState] ? checkinType[leg.CheckinState] : checkinType.Unknown;\n }\n\n function addCheckinData(trips) {\n const bookingIds = [];\n angular.forEach(trips, function(trip) {\n const booking = _.find(trip.Bookings, bk => bk.Status !== 2 && bk.DoesSupportOnlineCheckin);\n if (booking) {\n bookingIds.push(booking.BookingId);\n }\n });\n\n if (bookingIds.length > 0) {\n getCheckinAvailability(bookingIds).then(function(checkinData) {\n angular.forEach(trips, function(trip) {\n angular.forEach(trip.Bookings, function(bk) {\n if (checkinData[bk.BookingId]) {\n const checkinAction = _.find(bk.BookingOptions.Actions, function(action) {\n return action.Name === 'ONLINECHECKIN';\n });\n if (checkinAction) {\n checkinAction.disabled = checkinData[bk.BookingId].checkinDisabled;\n checkinAction.disabledInfo = checkinData[bk.BookingId].checkinMessage;\n }\n }\n });\n });\n });\n }\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('paymentDetailsService', paymentDetailsService);\n\nfunction paymentDetailsService($http, $interval, $location, $q, $rootScope, $timeout, dateUtil, resourceService, currentUser, bookingService) {\n const url = '/api2/payments/cards/customer/';\n const cardUrl = '/api2/payments/cards/';\n const transactionUrl = '/api2/payments/transactions/';\n const baseUrl = '/api2/payments/';\n const ddcTokenUrl = '/api2/payments/tokens/ddctoken';\n\n const service = {\n getPaymentTypes,\n getPaymentCards,\n getPaymentOptions,\n getSavedPaymentCards,\n clearPayment,\n authorisePayment,\n getCpgStatus,\n getcardFailureReasonCode,\n getcardFailureReasonMessage,\n getPaymentLogos,\n convertToPaymentCards,\n validateCard,\n getDeviceDataCollectionToken\n };\n\n const cardFailureReasonCode = {\n Unknown: 0,\n InvalidCardNumber: 1,\n InvalidCardNumberLength: 2,\n CardHasExpired: 3,\n CardNotYetValid: 4,\n InvalidIssueNumber: 5\n };\n\n const cardFailureReasonMessage = {\n 0: 'INVALIDCARD',\n 1: 'INVALIDCARDNUMBER',\n 2: 'INVALIDCARDNUMBERLENGTH',\n 3: 'CARDHASEXPIRED',\n 4: 'CARDNOTYETVALID',\n 5: 'INVALIDISSUENUMBER'\n };\n\n function getcardFailureReasonCode() {\n return cardFailureReasonCode;\n }\n\n function getcardFailureReasonMessage(reasonCode) {\n return resourceService.get(cardFailureReasonMessage[reasonCode]);\n }\n\n //Payment Details\n function getPaymentCards() {\n return $http.get(`${url}get`, { ignoreErrors: true }).then(function(result) {\n return result.data;\n });\n }\n\n function getPaymentTypes(uniqueMasterCards, bookingType) {\n const allTypeOfCards = 0;\n return $http.get(`${cardUrl}gettypes?${$.param({\n domainId: TRPCONFIG.Domain.DomainId,\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\n bookingTypeId: bookingType || allTypeOfCards\n })}`, { cache: true, ignoreErrors: true }).then(function(result) {\n if (uniqueMasterCards) {\n //if uniqueMasterCards is requested. return unique types with respect to MasterdCardId.\n return _uniqueMasterCards(result.data);\n }\n //else return result as it is.\n return result.data;\n });\n }\n\n\n function _uniqueMasterCards(allCards) {\n const uniqueCards = [];\n const seen = {};\n const len = allCards.length;\n let j = 0;\n for (let i = 0; i < len; i++) {\n const card = allCards[i];\n const masterId = card.MasterCardTypeId;\n if (seen[masterId] !== 1) {\n seen[masterId] = 1;\n uniqueCards[j++] = card;\n }\n }\n return uniqueCards;\n }\n //End- Payment Details\n\n function getSavedPaymentCards(bookingType, bookingId, clientCurrencyCode) {\n //getsavedbookingcards is obsolete now. So calling get and joining with PaymentOptions\n const getOptions = service.getPaymentOptions(bookingType, bookingId, clientCurrencyCode);\n const getCards = TRPCONFIG.Domain.SavedCardsEnabled && currentUser.get() && currentUser.get().HardSignedIn ? service.getPaymentCards() : null;\n\n return $q.all([getOptions, getCards]).then(function(results) {\n return convertToPaymentCards(...results);\n });\n }\n\n function convertToPaymentCards(options, cards) {\n const paymentCards = [];\n _.each(cards, card => {\n const paymentOption = _.find(options, o => o.CardType === card.MasterCardTypeId);\n if (paymentOption && !card.IsExpired) {\n card.CardTypeId = paymentOption.Id;//In payment directive PaymentOptionId is named as CardTypeId\n paymentCards.push(card);\n }\n });\n return paymentCards;\n }\n\n function getCardTypeId() {\n document.addEventListener('click', e => {\n let seEl = document.querySelectorAll('select[name=\"paymentType\"]')[0];\n if (e.target.classList.value.includes('button')) {\n let cardTypeId = seEl.value;\n if (cardTypeId !== '') {\n cardTypeId = cardTypeId.split(':');\n cardTypeId = Number(cardTypeId[1]);\n TRPCONFIG.Domain.CardTypeId = cardTypeId;\n }\n }\n }, true);\n }\n\n function getPaymentOptions(bookingType, bookingId, currencyCode) {\n getCardTypeId();\n return $http.get(`${baseUrl}getpaymentoptionsforbooking?${$.param({\n DomainId: TRPCONFIG.Domain.DomainId,\n CurrencyCode: currencyCode,\n BookingTypeId: bookingType,\n BookingId: bookingId\n })}`, { cache: true, ignoreErrors: true }).then(function(result) {\n return result.data;\n });\n }\n\n function validateCard(request) {\n return $http.post(`${cardUrl}validate`, request).then(function(result) {\n return result.data;\n });\n }\n\n function getDeviceDataCollectionToken(cardTypeId, timeout) {\n const requestParams = {\n domainId: TRPCONFIG.Domain.DomainId,\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\n cardTypeId\n };\n const networkParams = {\n ignoreErrors: true\n };\n if (timeout) {\n networkParams.timeout = timeout;\n }\n return $http.post(`${ddcTokenUrl}`, requestParams, networkParams)\n .then(result => result.data);\n }\n\n //Transaction\n function clearPayment(request, requireCardValidation) {\n if (requireCardValidation) {\n const validateRequest = {\n CardNumber: TRPCONFIG.Domain.PCICompliant ?\n request.CardNumberMasked : request.CardNumber,\n StartDate: dateUtil.serialiseDate(new Date(request.CardStartYear, request.CardStartMonth)),\n ExpiryDate: dateUtil.serialiseDate(new Date(request.CardEndYear, request.CardEndMonth)),\n CV2: request.CardCvc,\n IssueNumber: request.CardIssueNumber\n };\n\n return validateCard(validateRequest).then(function(response) {\n if (response.Success) {\n return _clear(request);\n }\n return $q.when(response);\n });\n }\n\n return _clear(request);\n }\n\n function _clear(request) {\n const updatedReq = {\n ...request,\n BrowserDetails: bookingService.browserDetails()\n };\n\n return $http.post(`${transactionUrl}clear`, updatedReq).then(function(result) {\n return result.data;\n });\n }\n\n function authorisePayment(request) {\n return $http.post(`${transactionUrl}authorise`, request).then(function(result) {\n return result.data;\n });\n }\n\n function getCpgStatus(bookingId, paymentId) {\n const pollDelayMs = TRPCONFIG.Domain.CpgStatusIntervalDelay;\n const stopApiMs = TRPCONFIG.Domain.CpgStatusTimeout;\n if (!paymentId) {\n return null;\n }\n const siteID = TRPCONFIG.Domain.DomainId;\n const cpgstatusURL = `${transactionUrl}getcpgorderstatusforpostbookingpayment?bookingId=${bookingId}&siteId=${siteID}&paymentId=${paymentId}`;\n return $q(res => {\n let interval = $interval(() => {\n $http.get(`${cpgstatusURL}`).then(result => {\n const postBookingPath = $location.path();\n\n if (result.data === 'SUCCESS') {\n const cpgStatus = result.data;\n const authCode =\n result.data && result.data;\n const paRes =\n cpgStatus === 'SUCCESS'\n ? `^${authCode}^^^AUTHORISED`\n : '';\n\n const response = {\n paRes,\n paymentId,\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (postBookingPath && !postBookingPath.includes('pay-balance')) {\n console.log('cpgStatus cancelled');\n const response = {\n paRes: '',\n paymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (result && result.status !== 200) {\n console.log('cpgStatus result.status', result.status);\n const response = {\n paRes: '',\n paymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (result.data === 'FAILED') {\n // payment failed so stop polling\n // Log an error?\n const error = 'FAILED';\n const response = {\n paRes: '',\n paymentId: '',\n error,\n };\n res(response);\n $interval.cancel(interval);\n }\n\n if (result.data === 'STOP') {\n // stop polling\n // Duplicate, log error\n console.log('stop polling');\n const response = {\n paRes: '',\n paymentId: '',\n error: '',\n };\n res(response);\n $interval.cancel(interval);\n }\n });\n }, pollDelayMs);\n\n $timeout(() => {\n $interval.cancel(interval);\n const error = 'TIMER';\n const response = {\n paRes: '',\n paymentId: '',\n error,\n };\n $rootScope.$broadcast('cpgStatusAPIError', response);\n }, stopApiMs);\n });\n }\n\n function getPaymentLogos() {\n const parameters = $.param({\n domainId: TRPCONFIG.Domain.DomainId,\n currencyCode: TRPCONFIG.Domain.CurrencyCode,\n bookingTypeId: 8\n });\n const url = `${baseUrl}getpaymentoptions?${parameters}`;\n return $http.get(url, { cache: true, ignoreErrors: true }).then(result => result.data);\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('dashboard')\n .factory('userSettingsService', userSettingsService);\n\nfunction userSettingsService(resourceService) {\n const starRatings = [\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_ANY'), val: 1 },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_2STARSANDHIGHER'), val: 2 },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_3STARSANDHIGHER'), val: 3 },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_4STARSANDHIGHER'), val: 4 },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_5STARS'), val: 5 }\n ];\n\n const smokingRoom = [\n { name: resourceService.getDeferred('NOPREFERENCE'), val: 0 },\n { name: resourceService.getDeferred('YES'), val: 1 },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'), val: 2 }\n ];\n\n const boolianOptions = [\n { name: resourceService.getDeferred('YES'), val: true },\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_NO'), val: false }\n ];\n\n const priceMode = [\n { name: resourceService.getDeferred('PERPERSON'), val: 0 },\n { name: resourceService.getDeferred('TOTALPRICE'), val: 1 }\n ];\n\n const flightClass = [\n { name: resourceService.getDeferred('DASHBOARDRESOURCE_ANY'), val: 0 },\n { name: resourceService.getDeferred('BUSINESSCLASS'), val: 8 },\n { name: resourceService.getDeferred('ECONOMYCLASS'), val: 1 },\n { name: resourceService.getDeferred('PREMIUMECONOMYCLASS'), val: 2 },\n { name: resourceService.getDeferred('FIRSTCLASS'), val: 4 }\n ];\n\n const hotelCriteria = [\n { name: resourceService.getDeferred('OURRECOMMENDATIONS'), val: 1 },\n { name: resourceService.getDeferred('CUSTOMERRATING'), val: 2 },\n { name: resourceService.getDeferred('PRICELOWTOHIGH'), val: 5 },\n { name: resourceService.getDeferred('PRICEHIGHTOLOW'), val: 6 },\n { name: resourceService.getDeferred('STARRATINGLOWTOHIGH'), val: 7 },\n { name: resourceService.getDeferred('STARRATINGHIGHTOLOW'), val: 8 }\n ];\n\n const flightCriteria = [\n { name: resourceService.getDeferred('OURRECOMMENDATIONS'), val: [10] },\n { name: resourceService.getDeferred('PRICELOWTOHIGH'), val: 1 },\n { name: resourceService.getDeferred('PRICEHIGHTOLOW'), val: 2 },\n { name: resourceService.getDeferred('DEPARTURETIMELOWTOHIGH'), val: 4 },\n { name: resourceService.getDeferred('DEPARTURETIMEHIGHTOLOW'), val: 5 },\n { name: resourceService.getDeferred('RETURNTIMELOWTOHIGH'), val: 6 },\n { name: resourceService.getDeferred('RETURNTIMEHIGHTOLOW'), val: 7 },\n { name: resourceService.getDeferred('TOTALJOURNEYTIMELOWTOHIGH'), val: 9 },\n { name: resourceService.getDeferred('TOTALJOURNEYTIMEHIGHTOLOW'), val: 8 }\n ];\n\n\n const adultTitles = resourceService.getDeferred('ADULTTITLES');\n\n const service = {\n getAdultTitles,\n getStarRatings,\n getSmokingRoomOptions,\n getPricMode,\n getFooterToolbarOptions,\n getFlightClassOptions,\n getHotelCriteria,\n getFlightCriteria,\n getCanceledBookingOprions\n };\n\n function getStarRatings() {\n return starRatings;\n }\n\n function getSmokingRoomOptions() {\n return smokingRoom;\n }\n\n function getFooterToolbarOptions() {\n return boolianOptions;\n }\n\n function getCanceledBookingOprions() {\n return boolianOptions;\n }\n\n function getPricMode() {\n return priceMode;\n }\n\n function getFlightClassOptions() {\n return flightClass;\n }\n\n function getAdultTitles() {\n return adultTitles;\n }\n\n\n function getHotelCriteria() {\n return hotelCriteria;\n }\n\n function getFlightCriteria() {\n return flightCriteria;\n }\n\n return service;\n}\n})();\n","(() => {\n 'use strict';\n angular.module('deals').directive('dealTypeCards', dealTypeCards);\n\n function dealTypeCards(\n holidayDeals\n ) {\n const imgUrl = `${TRPCONFIG.DestinationImagesClientDomain}api2/destination/images/getfromobject`;\n\n function link(scope) {\n scope.holidayDealsEnabled = TRPCONFIG.Domain.HolidayDealsEnabled;\n scope.cruiseEnabled = TRPCONFIG.Domain.HolidayDealsCruisesEnabled;\n\n if (scope.holidayDealsEnabled && !scope.cruiseEnabled) {\n bestDestination().then(dest => scope.dest = dest);\n }\n }\n\n function bestDestination() {\n const depAir = TRPCONFIG.Domain.HolidayDealsDefaultAirports;\n\n return holidayDeals.getAggregates(false, { depAir })\n .then(response => _.get(response, 'Aggregates.HotelsByChildDestination'))\n .then(destMap => _.chain(destMap)\n .mapValues((dest, key) => _.merge(dest, { id: key }))\n .values()\n .sortBy('Position')\n .first()\n .value()\n )\n .then(dest => {\n const [type, id] = _.chain(dest).get('id').split('|').value();\n const href = `holidaydeals?depAir=${depAir}&ChildDestinations=${type}|${id}`;\n return {\n title: _.get(dest, 'Title'),\n image: `${imgUrl}?${jQuery.param({\n height: 316,\n useDealsImages: true,\n type,\n id\n })}`,\n href: window.encodeURI(href),\n minPrice: _.get(dest, 'MinPrice')\n };\n });\n }\n\n return {\n restrict: 'E',\n replace: true,\n scope: true,\n templateUrl: 'partials/home/directivetemplate?type=DealTypeCards',\n link\n };\n }\n})();\n","(function() {\n'use strict';\n\nangular\n .module('ekh')\n .controller('EmiratesHome', EmiratesHome);\n\nfunction EmiratesHome(destinationService, cmsPageMapping) {\n const cm = this;\n cm.controls = { experiences: {} };\n\n cmsPageMapping.getHomePage().then(homepage => {\n const page = homepage[0];\n\n if (page) {\n destinationService.getTiles({ ControlId: page.controlid }).then(components => {\n const componentsByType = (_.groupBy(components, 'controltype'));\n _.forEach(componentsByType, component => {\n component.forEach(c => {\n destinationService.getTiles({ ControlId: c.controlid }).then(tiles => {\n if (c.controltype === 'experiences') {\n tiles.forEach(carousel => {\n destinationService.getTiles({ ControlId: carousel.controlid })\n .then(tiles =>\n cm.controls.experiences[carousel.controlid] = { title: carousel.name, tiles });\n cm.selectedTab = _.head(tiles).controlid;\n });\n } else {\n cm.controls[c.controltype] = tiles;\n }\n });\n });\n });\n }\n );\n }\n });\n}\n})();\n","(function() {\n'use strict';\n\nangular.module('ekh').controller('EmiratesOffers', EmiratesOffers);\n\nfunction EmiratesOffers(destinationService, cmsPageMapping, $routeParams, $window) {\n const cm = this;\n let route = '';\n cm.controls = {};\n cm.cmsItemsFound = true;\n\n\n cmsPageMapping.getOfferTypes().then(types => {\n const type = _.filter(types, type => {\n if ($routeParams.type != null) {\n route = $routeParams.type.replace('/', '');\n } else {\n route = $window.location.pathname.replace('?tm=1', '').substring(1);\n }\n return type.linkurl === route;\n })[0];\n\n if (type) {\n cm.controls.name = type.name;\n destinationService.getTiles({ ControlId: type.controlid }).then(components => {\n const componentsByType = (_.groupBy(components, 'controltype'));\n _.forEach(componentsByType, component => {\n component.forEach(c => {\n destinationService.getTiles({ ControlId: c.controlid }).then(tiles => {\n cm.controls[c.controltype] = tiles;\n });\n });\n });\n });\n } else {\n cm.cmsItemsFound = false;\n }\n });\n}\n})();\n","(function() {\n'use strict';\n\nangular.module('ekh').controller('EmiratesSingleOffers', EmiratesSingleOffers);\n\nfunction EmiratesSingleOffers(destinationService, cmsPageMapping, $routeParams, $anchorScroll, $window, broker, resourceService, $scope) {\n $anchorScroll(0, 0);\n\n const cm = this;\n\n broker.subscribe('EmiratesSingleOffers', 'hotelDetailCallFailed', function() {\n $scope.$emit('flash:error', resourceService.get('HOTELDETAILERROR'));\n });\n\n if (!TRPCONFIG.Domain.OverrideHotelInformationFromCms) {\n cm.controls = {};\n cm.cmsItemsFound = true;\n\n cmsPageMapping.getSingleOffers().then(types => {\n const type = _.filter(types, type => {\n if ($routeParams.estabId != null) {\n return type.estabid === $routeParams.estabId;\n }\n return type.linkurl ? type.linkurl.indexOf($window.location.pathname) > -1 : false;\n })[0];\n\n if (type) {\n cm.controls.name = type.name;\n destinationService.getTiles({ ControlId: type.controlid }).then(components => {\n const componentsByType = (_.groupBy(components, 'controltype'));\n _.forEach(componentsByType, component => {\n component.forEach(c => {\n destinationService.getTiles({ ControlId: c.controlid }).then(tiles => {\n cm.controls[c.controltype] = tiles;\n });\n });\n });\n });\n } else {\n cm.cmsItemsFound = false;\n }\n });\n }\n}\n})();\n","namespace ekh {\n\n export class NewsLetterSignUpFullForm {\n public allowUnsubscribe: boolean;\n public showExtended:boolean = false;\n public gaEventIsSent:boolean = false;\n public salutationOptions: () => string;\n\n public email: null|string;\n public firstName: null|string;\n public lastName: null|string;\n public title: string;\n protected signUpReason: string = 'Newsletter Signup Header';\n\n public subscribePrimaryButtonLabel: string = 'NEWSLETTERSIGNUPNOW';\n\n constructor(\n protected resourceService: Core.ResourceService,\n protected $location: ng.ILocationService,\n protected analytics: any,\n protected $scope: ng.IScope,\n protected $timeout: ng.ITimeoutService\n ) {\n this.salutationOptions = resourceService.getDeferred('NEWSLETTERSIGNUPSALUTATIONOPTIONS');\n this._initData();\n }\n\n protected _initData() {\n this.email = null;\n this.firstName = null;\n this.lastName = null;\n this.title = '';\n }\n\n public onEmailFocused() {\n this.showExtended = true;\n if (!this.gaEventIsSent && TRPCONFIG.Domain.TrackNewsletterSignup) {\n const page = this.$location.path();\n this.analytics.trackEvent({\n category: 'newsletterSignup',\n action: 'emailInputFocused',\n label: page,\n dimension9: 'newsletterSignup'\n });\n this.gaEventIsSent = true;\n }\n }\n\n protected _getLanguageCode() {\n let langCode;\n try {\n langCode = TRPCONFIG.Domain.CultureCode.split('-')[0];\n } catch(err) {\n langCode = '';\n }\n return langCode;\n };\n\n protected _getData() {\n return {\n Email: this.email,\n FirstName: this.firstName,\n LastName: this.lastName,\n LanguageCode: this._getLanguageCode(),\n ContextTag: 'Source:Website-Newsletter',\n Source: 'TravelRepublic',\n SignupReason: this.signUpReason,\n Title: this.title\n };\n }\n\n protected _getGaTrackData() {\n const page = this.$location.path();\n return {\n category: 'newsletterSignup',\n action: 'signedUp',\n label: page,\n dimension9: 'newsletterSignup'\n };\n }\n\n public getSubscribePrimaryButtonLabel() {\n return this.resourceService.get(this.subscribePrimaryButtonLabel);\n }\n\n public submit() {\n if (!this.showExtended) {\n this.showExtended = true;\n return false;\n }\n const data = this._getData();\n this.$scope.formState.resetSubmitResult();\n return this.$scope.formState.submit(data)\n .then(() => {\n if (TRPCONFIG.Domain.TrackNewsletterSignup) {\n this.analytics.trackEvent(this._getGaTrackData());\n }\n this.$timeout(() => {\n this.$scope.formState.resetFormState();\n this.showExtended = false;\n this._initData();\n }, 5000);\n });\n };\n }\n\n angular\n .module('ekh')\n .directive('newsletterSignUpFullForm', function(authService) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=newslettersignupfullform',\n controllerAs: 'nsu',\n bindToController: {\n allowUnsubscribe: '='\n },\n scope: {\n },\n link: ($scope) => {\n $scope.formState.setSubmitFn(data => {\n return authService\n .registerForNewsletter(data);\n });\n },\n controller: NewsLetterSignUpFullForm\n };\n });\n}\n","/// \n\nnamespace ekh {\n\n export class NewsLetterSignUpPopupForm extends ekh.NewsLetterSignUpFullForm {\n private onSuccess: () => any;\n constructor(\n protected resourceService: Core.ResourceService,\n protected $location: ng.ILocationService,\n protected analytics: any,\n protected $scope: ng.IScope,\n protected $timeout: ng.ITimeoutService\n ) {\n super(resourceService, $location, analytics, $scope, $timeout);\n this.showExtended = true;\n this.signUpReason = 'Newsletters Signup pop up';\n this.subscribePrimaryButtonLabel = 'NEWSLETTERSIGNUPPOPUPSUBSCRIBEBUTTON';\n }\n\n _getGaTrackData() {\n const page = this.$location.path();\n return {\n category: 'newsletterSignup',\n action: 'signedUp_PopUp',\n label: page,\n dimension9: 'newsletterSignup'\n }; }\n\n public submit() {\n const data = this._getData();\n this.$scope.formState.resetSubmitResult();\n return this.$scope.formState.submit(data)\n .then(() => {\n if (TRPCONFIG.Domain.TrackNewsletterSignup) {\n this.analytics.trackEvent(this._getGaTrackData());\n }\n this.onSuccess();\n });\n }\n\n }\n\n angular\n .module('ekh')\n .directive('newsletterSignUpPopupForm', function(authService) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=newslettersignupfullform',\n controllerAs: 'nsu',\n bindToController: {\n allowUnsubscribe: '=',\n onSuccess: '&',\n primaryButton: '='\n },\n scope: {\n },\n link: ($scope) => {\n $scope.formState.setSubmitFn(data => {\n return authService\n .registerForNewsletter(data);\n });\n },\n controller: NewsLetterSignUpPopupForm\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('boardTypeFilters', function(broker,\n hotelSearch) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=BoardTypeFilters',\n scope: {\n hotel: '=',\n buttonClass: '='\n },\n\n link(scope) {\n const cancel = scope.$watch('hotel.Rooms', h => {\n if (!h || _.isEmpty(h)) {\n return;\n }\n\n cancel();\n\n scope.showMenu = false;\n\n if (scope.hotel == null || scope.hotel.Rooms == null) {\n return;\n }\n\n scope.$watchCollection('filter.BoardTypes', function(v, o) {\n if (v == null || v === o) {\n return;\n }\n broker.publish('boardTypeFilterUpdated', v);\n });\n\n const boardTypes = {};\n\n scope.hotel.Rooms.forEach(function(r) {\n r.Availability.forEach(function(a) {\n if (!boardTypes[a.BoardType] || boardTypes[a.BoardType].Text.length > a.BoardDescription.length) {\n boardTypes[a.BoardType] = {\n Text: a.BoardDescription,\n Value: a.BoardType,\n Count: 0\n };\n }\n\n boardTypes[a.BoardType].Count += 1;\n });\n\n scope.showMenu = Object.keys(boardTypes).length > 1;\n\n // convert object to array for the dropdown multi select control\n scope.boardTypeOptions = [];\n _.forEach(boardTypes, function(b) {\n scope.boardTypeOptions.push(b);\n });\n });\n\n let filterBoardTypes = angular.copy(hotelSearch.getFilter().BoardTypes);\n filterBoardTypes = _.filter(filterBoardTypes, fbt =>\n _.some(scope.boardTypeOptions, option => option.Value === fbt)\n );\n scope.filter = {\n BoardTypes: filterBoardTypes\n };\n });\n }\n };\n});\n})();\n","/// \n'use strict';\n\nnamespace ekh {\n\n type Tenant = TR.ITenant;\n type Region = TR.IRegion;\n type PointOfSale = TR.IPointOfSale;\n type IGlobalisationService = TR.IGlobalisationService;\n type ITenant = TR.ITenant;\n type IQService = angular.IQService;\n type IPointOfSale = TR.IPointOfSale;\n type Language = TR.ILanguage;\n type IRegion = TR.IRegion;\n type ILanguage = TR.ILanguage;\n type IRegionalContext = TR.IRegionalContext;\n type IDomain = TR.IDomain;\n\n\n export interface ICountryPickerService {\n getDomain():Promise;\n selectRegionalContext(regionalContext:IRegionalContext):Promise;\n }\n\n export class CountryPickerService implements ICountryPickerService {\n getDomainInfo:Promise | null;\n\n constructor(private globalisationService:IGlobalisationService) {\n }\n\n getDomain():Promise {\n if (this.getDomainInfo) {\n return this.getDomainInfo;\n }\n\n this.getDomainInfo = this.globalisationService.getSelectedRegionalContext()\n .then((regionalContext:IRegionalContext) =>\n this.globalisationService.getRegions(regionalContext.TenantId, regionalContext.ParentDomainId)\n .then((regions:IRegion[]) => {\n return {\n Context: regionalContext,\n Regions: regions\n };\n }));\n\n return this.getDomainInfo;\n };\n\n selectRegionalContext(regionalContext:IRegionalContext):Promise {\n return this.globalisationService.setRegionalContext({\n ParentDomainId: regionalContext.ParentDomainId,\n PointOfSaleId: regionalContext.PointOfSale.Id,\n CountryCode: regionalContext.PointOfSale.CountryCode,\n CultureCode: regionalContext.Language ? regionalContext.Language.Code : ''\n }).then(resp => this.globalisationService.getSelectedRegionalContext());\n };\n }\n\n angular\n .module('ekh')\n .service('countryPickerService', CountryPickerService);\n}\n","/// \n'use strict';\n\nnamespace ekh {\n interface ICardBinMessage {\n imgUrl: string;\n text: string;\n }\n\n class CardBinMessagesController {\n public messages: ICardBinMessage[] = [];\n public numberOfVisible: number;\n\n constructor(\n private bookingService: any\n ) {}\n\n $onInit() {\n this.bookingService.getCardDiscountsForDomain(\n TRPCONFIG.Domain.DomainId,\n TRPCONFIG.Domain.CultureCode\n )\n .then(({DiscountDetails}) => {\n this.messages = DiscountDetails && DiscountDetails.Discount;\n this.messages = this.sortArr(this.messages);\n })\n .catch(() => {\n this.messages = [];\n });\n }\n\n public showMore() {\n this.numberOfVisible = this.messages.length;\n }\n\n private sortArr(arr) {\n return arr.sort(({Highlight: highlightA}, {Highlight: highlightB}) => {\n return highlightA > highlightB ? -1 : 1;\n });\n }\n }\n\n angular\n .module('ekh')\n .component('cardBinMessages', {\n bindings:{\n numberOfVisible: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=CardBinMessages',\n controller: CardBinMessagesController,\n controllerAs: 'ctrl'\n });\n}\n","'use strict';\n\nnamespace ekh {\n\n type TripService = Core.TripService;\n class ClearBasketAlert {\n postClearAction: () => ng.IPromise;\n cancelAction: () => void;\n\n\t\tconstructor(\n private basketStore,\n private modalService: any,\n private tripService: TripService,\n private $location: ng.ILocationService,\n private $window: ng.IWindowService,\n private $routeParams\n\t\t\t){\n this.basketStore.getProductCount().then((count) => {\n if(count > 0) {\n return this.modalService.launch('partials/home/directivetemplate?type=clearBasketAlert', {\n postClearAction: this.postClearAction,\n cancelAction: this.cancelAction\n }, true);\n }\n\n this.basketStore.createBasket()\n .then(basket => {\n if (this.$routeParams.tripId) {\n return this.tripService.setBasketId(this.$routeParams.tripId, basket.BasketId);\n }\n })\n .then(() => {\n if (this.postClearAction) {\n this.postClearAction().then(() => {\n if (_.includes(this.$location.path(), '/dp/book/')) {\n this.$location.path('');\n }\n this.$window.location.reload();\n });\n }\n });\n });\n\t\t};\n }\n\n class ClearBasketAlertModal {\n postClearAction: () => ng.IPromise;\n cancelAction: () => void;\n\n constructor(\n private basketStore,\n private modalService: any,\n private $location: ng.ILocationService,\n private $window: ng.IWindowService,\n private tripService: TripService,\n private $routeParams\n ){\n this.postClearAction = modalService.get('postClearAction');\n this.cancelAction = modalService.get('cancelAction');\n };\n\n clear (): void {\n return this.basketStore.createBasket()\n .then(basket => {\n if (this.$routeParams.tripId) {\n return this.tripService.setBasketId(this.$routeParams.tripId, basket.BasketId);\n }\n })\n .then(() => {\n if (this.postClearAction) {\n return this.postClearAction();\n }\n })\n .then(() => {\n this.modalService.close();\n if(_.includes(this.$location.path(), '/dp/book/')) {\n this.$location.path('');\n }\n this.$window.location.reload();\n });\n }\n\n cancel (): void {\n if(this.cancelAction) {\n this.cancelAction();\n }\n this.modalService.close();\n }\n }\n\n angular\n .module('ekh')\n .directive('clearBasketAlert', () => {\n return {\n restrict: 'E',\n scope: {\n 'postClearAction': '&?onClear',\n 'cancelAction': '&cancel'\n },\n bindToController : true,\n controller: ClearBasketAlert,\n controllerAs: 'cba'\n };\n });\n\n angular\n .module('ekh')\n .controller('ClearBasketAlertModal', ClearBasketAlertModal);\n}\n","/// \n'use strict';\n\nnamespace ekh {\n\n type Tenant = TR.ITenant;\n type Region = TR.IRegion & {GaEventLabel: string};\n type PointOfSale = TR.IPointOfSale;\n type Language = TR.ILanguage;\n type IGlobalisationService = TR.IGlobalisationService;\n type IRegionalContext = TR.IRegionalContext;\n type IRegionTitle = TR.IRegionTitle;\n type IDomain = TR.IDomain;\n\n class CountryPickerDropdown {\n\n tenant:Tenant;\n regions:Region[];\n pointsOfSale:PointOfSale[];\n activeContext: IRegionalContext;\n currentDomain:IDomain;\n open:boolean = false;\n template:string;\n regionTitles:IRegionTitle[];\n\n constructor(private countryPickerService:ICountryPickerService,\n private broker:any,\n private resourceService:any) {\n\n this.regionTitles = [\n {Id: 1, Title: this.resourceService.getDeferred('REGIONTITLE_AMERICA'), GaEventLabel: 'Americas'},\n {Id: 2, Title: this.resourceService.getDeferred('REGIONTITLE_EUROPE'), GaEventLabel: 'Europe'},\n {Id: 3, Title: this.resourceService.getDeferred('REGIONTITLE_MIDDLEEAST'), GaEventLabel: 'MiddleEast'},\n {Id: 4, Title: this.resourceService.getDeferred('REGIONTITLE_AFRICA'), GaEventLabel: 'Africa'},\n {Id: 5, Title: this.resourceService.getDeferred('REGIONTITLE_ASIA'), GaEventLabel: 'Asia&SouthPacific'},\n {Id: 6, Title: this.resourceService.getDeferred('REGIONTITLE_RESTOFTHEWORLD'),\n GaEventLabel: 'RestOfTheWorld'}\n ];\n\n this.countryPickerService.getDomain()\n .then((domain: IDomain) => {\n this.regions = domain.Regions.map(r => {\n const {Title, GaEventLabel} = _.find(this.regionTitles, region => region.Id === r.Id);\n r.Title = Title;\n return {\n ...r,\n Title,\n GaEventLabel\n\n };\n });\n this.currentDomain = _.cloneDeep(domain);\n this.activeContext = domain.Context;\n this.pointsOfSale = this.getPointsOfSale();\n if(this.activeContext.Inferred){\n this.confirmRegionalContext(true);\n }\n });\n }\n\n selectRegion = (id:number):void => {\n this.activeContext.Region = _.find(this.regions, (r => r.Id === id));\n this.pointsOfSale = this.getPointsOfSale();\n this.activeContext.PointOfSale = this.pointsOfSale[0];\n const languages = this.activeContext.PointOfSale.Context.Languages;\n this.activeContext.Language = languages.length > 0 ? languages[0] : null;\n }\n\n getPointsOfSale = ():PointOfSale[] => {\n const france = {\n Id: 999,\n Name: 'France',\n PosEnglishName: 'France',\n RegionId: 2,\n Context: {\n AccountingCurrency: 'EUR',\n CultureCode: 'fr-fr',\n DefaultCurrency: 'EUR',\n DomainName: 'emiratesholidays.com',\n IsAgent: false,\n Languages: [\n {Code: 'en-fr', Name: 'French'}\n ],\n LegacyDomain: 999,\n TradingGroup: 999,\n },\n Country: {\n Code: 'FR',\n LocalName: 'France',\n LocalisedNames: [\n {Name: 'France', CultureCode: 'fr-fr'}\n ],\n Name: 'France',\n },\n CountryCode: 'FR',\n CountryId: 999,\n Enabled: true\n };\n\n let activeContextPOS = this.activeContext.Region.PointsOfSale;\n\n if(this.activeContext.Region.Id === 2) {\n activeContextPOS = [france, ...activeContextPOS];\n\n }\n let pointsofsale = activeContextPOS.map(pos => {\n const names = pos.Country.LocalisedNames.find(name => {\n return name.CultureCode === _.get(this.currentDomain, 'Context.Language.Code', '');\n });\n const localisedNames = names ? [names] : pos.Country.LocalisedNames;\n return {\n ...pos,\n PosEnglishName: this.getPosEnglishName(pos),\n Country: {\n ...pos.Country,\n LocalisedNames: localisedNames,\n LocalName : localisedNames[0].Name\n }\n };\n });\n pointsofsale.sort((a, b) => {\n return (a.Country.LocalName).localeCompare(b.Country.LocalName);\n });\n return pointsofsale;\n }\n\n selectPointOfSale = (pos:PointOfSale):void => {\n if(pos){\n this.activeContext.Language = pos.Context.Languages.length > 0 ? pos.Context.Languages[0] : null;\n }\n }\n\n getPosEnglishName = (pos): string => {\n if (!pos || !pos.Country || !(pos.Country.LocalisedNames instanceof Array)) {\n return '';\n }\n const englishCountryName = pos.Country.LocalisedNames.filter( langObj => {\n return langObj.CultureCode === 'en-GB';\n });\n return englishCountryName.length ? englishCountryName[0].Name : '';\n }\n\n confirmRegionalContext(inferred):void {\n if(this.activeContext.PointOfSale.Name === 'France') {\n window.location.replace('https://www.emiratesholidays.fr/');\n } else {\n this.open = false;\n this.activeContext.Inferred = inferred;\n this.broker.publish('RegionalContextSelected', this.activeContext);\n }\n }\n }\n\n angular\n .module('ekh')\n .directive('countryPickerDropdown', () => {\n return {\n restrict: 'E',\n scope:{\n open: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=countrypickerdropdown',\n controller: CountryPickerDropdown,\n controllerAs: 'cm',\n bindToController: true\n };\n });\n\n}\n","/// \n/// \n'use strict';\n\nnamespace ekh {\n\n type Tenant = TR.ITenant;\n type Region = TR.IRegion;\n type PointOfSale = TR.IPointOfSale;\n type Language = TR.ILanguage;\n type IGlobalisationService = TR.IGlobalisationService;\n type ITenant = TR.ITenant;\n type IRegionalContext = TR.IRegionalContext;\n\n class CountryPickerPopup {\n\n activeContext: IRegionalContext;\n countryPickerPopupOpen:boolean = false;\n countryPickerHeaderMessage: string;\n countryPickerSelectionMessage: string;\n template:string;\n\n constructor(\n private $scope: ng.IScope,\n private broker:any,\n private countryPickerService:ICountryPickerService,\n private $location: ng.ILocationService,\n private resourceService:Core.ResourceService)\n {\n\n this.countryPickerSelectionMessage = this.resourceService.get('COUNTRYPICKERWESELECTEDMESSAGE');\n this.countryPickerHeaderMessage = this.resourceService.get('COUNTRYPICKERWESELECTEDHEADERMESSAGE');\n\n broker.subscribe('countryPickerPopup', 'RegionalContextSelected', ev => {\n this.activeContext = ev.data;\n this.countryPickerPopupOpen = true;\n\n this.countryPickerSelectionMessage = String.format(\n this.resourceService.get(!this.activeContext.Inferred\n ? 'COUNTRYPICKERYOUSELECTEDMESSAGE'\n : 'COUNTRYPICKERWESELECTEDMESSAGE'),\n this.activeContext.PointOfSale.Country.Name);\n\n this.countryPickerHeaderMessage = String.format(\n this.resourceService.get(!this.activeContext.Inferred\n ? 'COUNTRYPICKERYOUSELECTEDHEADERMESSAGE'\n : 'COUNTRYPICKERWESELECTEDHEADERMESSAGE'),\n this.activeContext.PointOfSale.Country.Name,\n this.activeContext.Language ? this.activeContext.Language.Name : '');\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('countryPickerPopup');\n });\n }\n\n getPointOfSaleUrl = ():string => {\n if(this.activeContext && this.activeContext.PointOfSale) {\n if(this.activeContext.PointOfSale.Id === 0){\n return '/';\n }\n let countryCode = this.activeContext.PointOfSale.CountryCode.toLowerCase();\n let languageCode = this.activeContext.Language ? this.activeContext.Language.Code.substr(0, 2) : 'en';\n\n return `/${countryCode}_${languageCode}`;\n }\n return '';\n }\n\n setPointOfSale = (e):void => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n this.countryPickerService.selectRegionalContext(this.activeContext)\n .then(regionalContext => {\n this.activeContext = regionalContext;\n this.countryPickerPopupOpen = false;\n });\n }\n }\n\n angular\n .module('ekh')\n .directive('countryPickerPopup', () => {\n return {\n restrict: 'E',\n templateUrl: 'partials/popups/countrypicker',\n controller: CountryPickerPopup,\n controllerAs: 'cpp',\n bindToController: true\n };\n });\n\n}\n","/// \n'use strict';\n\nnamespace ekh {\n interface DDCResponse {\n MessageType: string;\n SessionId: string;\n Status: boolean;\n }\n\n interface TokenResponse {\n jwtToken: string;\n statusCode: number;\n }\n\n const DEVICE_DATA_COLLECTOR_URL = '/partials/home/directivetemplate?type=DeviceDataCollector';\n\n class DDCController {\n private MESSAGE_EVENT: string = 'message';\n private TIMEOUT: number = TRPCONFIG.Domain.ThreeDS2RetryTimeout;\n private THRESHOLD: number = TRPCONFIG.Domain.ThreeDS2RetryThreshold;\n private onReceive: Function;\n private addCommand: Function;\n private cardType: string;\n private cardNumber: string;\n private form: HTMLFormElement;\n private retryCount: number = 0;\n private messageEventListener: (event: MessageEvent) => void;\n\n constructor(\n private $element: JQuery,\n private paymentDetailsService: any,\n private $window: ng.IWindowService,\n private $timeout: ng.ITimeoutService\n ) {}\n\n $onInit(): void {\n this.setUpHandlers();\n }\n\n $onDestroy(): void {\n this.$window.removeEventListener(this.MESSAGE_EVENT, this.messageEventListener);\n }\n\n public async startGetToken(): Promise {\n let jwtTokenData;\n let dfReferenceId = null;\n\n /*\n retry to get to get JWT token.\n _getDeviceData() returns promise which may be rejected\n because of network errors or because of timeout (this.TIMEOUT)\n */\n this.retryCount = 0;\n while(!jwtTokenData && this.retryCount < this.THRESHOLD) {\n jwtTokenData = await this._getDeviceData();\n this.retryCount++;\n }\n if (!jwtTokenData) {\n this.onReceive({dfReferenceId});\n return true;\n }\n\n /*\n retry to submit form with JWT token and receive ReferenceId.\n _submitForm() returns promise which may be rejected\n because of problems to load iframe from the URL or\n because of not receiving POST Message from iframe.\n */\n this.retryCount = 0;\n while(!dfReferenceId && this.retryCount < this.THRESHOLD) {\n dfReferenceId = await this._getIdReference(jwtTokenData.jwtToken);\n this.retryCount++;\n }\n this.onReceive({dfReferenceId});\n }\n\n private _reloadIframe(): Promise {\n return new Promise((resolve, reject) => {\n let reloadTimer;\n this.$element.attr('src', '');\n this.$timeout(_ => {\n this.$element[0].onload = _ => {\n this.$element[0].onload = angular.noop;\n this.$timeout.cancel(reloadTimer);\n //below block is to ensure that iframe template is loaded successfully\n //if 404 error it is not able to get form\n if (this.getForm(this.$element[0])) {\n resolve();\n } else {\n reject();\n }\n };\n this.$element.attr('src', DEVICE_DATA_COLLECTOR_URL);\n });\n /*\n Reject iframe reloadIframePromise if its not possible\n to get template because of network problems and try again\n */\n reloadTimer = this.$timeout(_ => {\n this.$element[0].onload = angular.noop;\n reject(null);\n }, this.TIMEOUT);\n });\n }\n\n private async _getIdReference(jwtToken): Promise {\n let idReference = null;\n try {\n await this._reloadIframe();\n idReference = await this._submitForm(jwtToken);\n } catch(err) {\n console.error('Error getting Id Reference', err);\n }\n return idReference;\n }\n\n private async _getDeviceData(): Promise {\n let tokenResponse;\n try {\n tokenResponse = await this.getDDCToken();\n } catch (error) {\n console.error('Error getting device data', error);\n tokenResponse = null;\n }\n return tokenResponse;\n }\n\n private _completeForm(cardNumber, jwtValue): void {\n const binValue = cardNumber && cardNumber.slice(0, 6);\n if (binValue && jwtValue) {\n this.form = this.getForm(this.$element[0]);\n this.setFieldValue(this.getField(this.form, 'bin'), binValue);\n this.setFieldValue(this.getField(this.form, 'jwt'), jwtValue);\n }\n }\n\n private setUpHandlers(): void {\n this.addCommand({ command: this.startGetToken.bind(this)});\n }\n\n private _submitForm(jwtToken): Promise {\n this._completeForm(this.cardNumber, jwtToken);\n return new Promise((resolve, reject) => {\n let getTimer;\n this._clearMessageListener();\n this.messageEventListener = (event: MessageEvent) => {\n this.$timeout.cancel(getTimer);\n console.log('Recieved event response', event);\n if (event.origin === TRPCONFIG.Domain.CardinalCommerceUrl) {\n const data: DDCResponse = JSON.parse(event.data);\n console.warn('Merchant received a message:', data);\n if (data && data.Status) {\n resolve(data.SessionId);\n } else {\n reject(null);\n }\n }\n };\n this.$window.addEventListener(this.MESSAGE_EVENT, this.messageEventListener, false);\n getTimer = this.$timeout(_ => {\n this._clearMessageListener();\n reject(null);\n }, this.TIMEOUT);\n this.form.submit();\n });\n }\n\n private _clearMessageListener() {\n if (this.messageEventListener) {\n this.$window.removeEventListener(this.MESSAGE_EVENT, this.messageEventListener);\n }\n }\n\n private async getDDCToken(): Promise {\n if (!this.cardType) {\n return Promise.reject('Card details are invalid');\n }\n return await this.paymentDetailsService.getDeviceDataCollectionToken(this.cardType, this.TIMEOUT);\n }\n\n private getForm(iframe: HTMLIFrameElement): HTMLFormElement {\n return iframe.contentWindow.document.getElementById('collectionForm');\n }\n\n private getField(form: HTMLFormElement, className: string): HTMLInputElement {\n return form.getElementsByClassName(className)[0];\n }\n\n private setFieldValue(field: HTMLInputElement, value: string): void {\n field.value = value;\n }\n }\n\n angular\n .module('ekh')\n .directive('deviceDataCollector', () => {\n return {\n replace: true,\n scope: {},\n bindToController: {\n cardNumber: '<',\n cardType: '<',\n addCommand: '&',\n onReceive: '&'\n },\n controller: DDCController,\n controllerAs: 'ddc',\n template:\n ``\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('dropdownMultiSelect', function() {\n return {\n restrict: 'E',\n replace: true,\n\n scope: {\n caption: '@',\n model: '=',\n options: '=',\n valueName: '@',\n labelName: '@',\n classes: '@',\n ulClasses: '@'\n },\n\n templateUrl: 'partials/home/directivetemplate?type=dropdownmultiselect',\n transclude: true,\n\n link(scope, el) {\n scope.open = false;\n\n scope.focusIndex = -1;\n\n scope.selectedIndexes = [];\n\n scope.toggle = function(e) {\n e.preventDefault();\n if (scope.open) {\n close();\n } else {\n open();\n }\n };\n\n function open() {\n scope.open = true;\n }\n\n function close() {\n scope.open = false;\n scope.focusIndex = -1;\n }\n\n $(document).on('click.dropdownmultiselect', function(e) {\n // close panel if the click target is not a child of the element\n const isChild = el.find(e.target).length > 0;\n if (!isChild) {\n scope.$apply(function() {\n close();\n });\n }\n });\n\n // set up watches for the model and the options\n scope.$watch('model', function(v) {\n if (v == null) {\n return;\n }\n scope.updateOnWatch();\n }, true);\n\n scope.$watch('options', function(v) {\n if (v == null) {\n return;\n }\n scope.updateOnWatch();\n }, true);\n\n scope.updateOnWatch = function() {\n // either the model or options have changed\n\n // iterate options\n _.forEach(scope.options, function(o, index) {\n // is this option in the model array?\n const match = _.find(scope.model, function(m) {\n return o[scope.valueName] === m;\n });\n\n const selectedIndex = scope.selectedIndexes.indexOf(index);\n\n if (_.isUndefined(match)) {\n // remove this index\n if (selectedIndex > -1) {\n scope.selectedIndexes.splice(selectedIndex, 1);\n }\n } else if (selectedIndex === -1) {\n // add this index\n scope.selectedIndexes.push(index);\n }\n });\n };\n\n scope.optionClick = function(index) {\n applyOption(index);\n //scope.open = false;\n el.find('a').focus();\n };\n\n function applyOption(index) {\n // get option at this index\n const value = scope.options[index][scope.valueName];\n\n // change the model\n if (scope.selectedIndexes.indexOf(index) > -1) {\n // remove this value from the model array\n scope.model = _.reject(scope.model, function(m) {\n return m === value;\n });\n } else {\n // add this value to the model array\n scope.model.push(value);\n }\n\n // set \"focus\" to this option\n scope.focusIndex = index;\n }\n\n const behaviours = {\n\n // Tab\n 9() {\n close();\n },\n\n // Escape\n 27() {\n close();\n },\n\n // Up Arrow\n 38(e) {\n e.preventDefault();\n open();\n if ((scope.focusIndex - 1) > -1) {\n scope.focusIndex -= 1;\n }\n },\n\n // Down Arrow\n 40(e) {\n e.preventDefault();\n open();\n if ((scope.focusIndex + 1) <= scope.options.length - 1) {\n scope.focusIndex += 1;\n }\n },\n\n // Return\n 13(e) {\n if (scope.focusIndex > -1) {\n e.preventDefault();\n applyOption(scope.focusIndex);\n } else {\n scope.toggle(e);\n }\n }\n\n };\n\n scope.onKeydown = function(e) {\n const fn = behaviours[e.keyCode] || angular.noop;\n fn(e);\n };\n\n scope.$on('$destroy', function() {\n $(document).off('click.dropdownmultiselect');\n });\n }\n };\n});\n})();\n","namespace ekh {\n angular\n .module('ekh')\n .directive('emailMyQuote', function($routeParams, tripService, quoteManager, resourceService, authService) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=emailmyquote',\n controllerAs: 'emq',\n bindToController: true,\n scope: {},\n link: ($scope) => {\n $scope.formState.setSubmitFn(data => {\n return quoteManager.create(data);\n });\n },\n controller($scope) {\n this.salutationOptions = resourceService.getDeferred('EMAILQUOTESALUTATIONOPTIONS');\n this.customer = {};\n this.isSkywardsUser = false;\n this.user = authService.getUser();\n this.isSendEmailToSelfEnabled = false;\n\n this.processCustomerDetails = (bindWithSkywards) => {\n if (bindWithSkywards) {\n this.customer = {\n title: this.user.Title || '',\n quoteSignupEmail: this.user.Email || '',\n firstName: this.user.FirstName || '',\n lastName: this.user.LastName || '',\n mobileTel: ''\n };\n } else {\n this.customer = {};\n }\n };\n\n this.checkSkywardsUser = () => {\n if (this.user && this.user.HardSignedIn) {\n this.isSkywardsUser = true;\n this.isSendEmailToSelfEnabled = true;\n this.processCustomerDetails(this.isSkywardsUser);\n } else {\n this.isSkywardsUser = false;\n this.isSendEmailToSelfEnabled = false;\n this.processCustomerDetails(this.isSkywardsUser);\n }\n };\n this.checkSkywardsUser();\n\n this.toggleSendEmailToSelfOption = () => {\n this.processCustomerDetails(this.isSendEmailToSelfEnabled);\n $scope.formState.resetSubmitResult();\n };\n\n this.submit = async (customer, shouldSignUp) => {\n const trip = await tripService.getTrip($routeParams.tripId);\n const request = {\n BasketId: trip.BasketId,\n QuoteId: '',\n EmailAddress: customer.quoteSignupEmail,\n EmailSignUp: shouldSignUp,\n User: {\n Title: customer.title || '',\n FirstName: customer.firstName,\n LastName: customer.lastName,\n Email: customer.quoteSignupEmail,\n MobileTel: ''\n },\n TrackingTag: null,\n SendEmail: true,\n SharedUse: true,\n SkywardsTotalMiles: (TRPCONFIG.Domain.SkywardsInfo &&\n TRPCONFIG.Domain.SkywardsInfo.length > 0 &&\n TRPCONFIG.Domain.SkywardsInfo[0].Miles > 0) ?\n TRPCONFIG.Domain.SkywardsInfo[0].Miles : null\n };\n\n $scope.formState.resetSubmitResult();\n return $scope.formState.submit(request);\n };\n }\n };\n });\n}\n","'use strict';\n\nnamespace ekh {\n\n class FooterCookies {\n show: boolean;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n )\n {\n }\n\n init (container : ng.IAugmentedJQuery) {\n this.broker.subscribe('footerCookies', 'showFooterCookies', e => {\n this.show = true;\n let header = (document.querySelectorAll('.header-wrapper') as any as HTMLElement[])[0];\n let selectionToolbar = (document.querySelectorAll('.selection-toolbar') as any as HTMLElement[])[0];\n let mainCol = (document.querySelectorAll('.main-col') as any as HTMLElement[])[0];\n header.style.zIndex = '0';\n selectionToolbar.style.zIndex = '0';\n mainCol.style.zIndex = '0';\n\n let cookieModal = document.querySelectorAll('.cookie-modal')[0];\n let close = cookieModal.querySelectorAll('.close')[0];\n\n close.addEventListener('click', function(e) {\n header.removeAttribute('style');\n selectionToolbar.removeAttribute('style');\n mainCol.removeAttribute('style');\n });\n });\n\n this.$scope.$on('$destroy', () => {\n this.broker.unsubscribe('footerCookies');\n });\n }\n\n showCookiePopup() {\n this.broker.publish('showFooterCookies');\n }\n\n }\n\n angular\n .module('core')\n .directive('footerCookies', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: FooterCookies,\n controllerAs: 'fc',\n templateUrl: 'partials/home/directivetemplate?type=FooterCookies',\n bindToController: {\n popupContent: '='\n },\n link: function (\n scope : ng.IScope,\n el : ng.IAugmentedJQuery,\n attr,\n controller : FooterCookies) {\n controller.init(el);\n }\n };\n });\n\n}\n\n","namespace ekh {\n\n class FormState {\n private successSubmitResult: boolean = false;\n private errorSubmitResult: boolean = false;\n private formSubmitted: boolean = false;\n private formOnceClicked: boolean = false;\n private _submit: (data?: any) => ng.IPromise = () => this.$q.resolve();\n private isSubmitInProcess: boolean = false;\n\n constructor(private form: ng.IFormController, private $q: ng.IQService) {\n\n }\n\n public setSubmitFn(submit) {\n this._submit = submit;\n }\n\n public isSubmitResultError(): boolean {\n return this.errorSubmitResult;\n }\n\n public isSubmitResultSuccess(): boolean {\n return this.successSubmitResult;\n }\n\n public isFormOnceClicked(): boolean {\n return this.formOnceClicked;\n }\n\n public submit(data): ng.IPromise {\n this.formOnceClicked = true;\n if (this.form.$invalid) {\n return this.$q.reject();\n }\n this.isSubmitInProcess = true;\n return this._submit(data)\n .then((res) => {\n this.successSubmitResult = true;\n this.errorSubmitResult = false;\n this.isSubmitInProcess = false;\n return this.$q.resolve(res);\n })\n .catch((err) => {\n this.successSubmitResult = false;\n this.errorSubmitResult = true;\n this.isSubmitInProcess = false;\n return this.$q.reject(err);\n });\n }\n\n public resetFormState(): void {\n this.resetSubmitResult();\n this.formOnceClicked = false;\n localStorage.setItem('subscriptionState', 'subscribed'); /*setting subscriptionState in localstorage*/\n }\n\n public resetSubmitResult(): void {\n this.successSubmitResult = false;\n this.errorSubmitResult = false;\n this.formSubmitted = false;\n this.isSubmitInProcess = false;\n }\n\n public isFormValid(): boolean {\n return this.form.$valid;\n }\n\n public showFieldError(fieldName: string): boolean {\n if (!this.form || !this.form[fieldName]) {\n return false;\n }\n const fieldObj = this.form[fieldName];\n return fieldObj.$invalid && this.formOnceClicked && !fieldObj.focused;\n }\n\n public showFieldValidatorError(fieldName: string, validationError: string): boolean {\n if (!this.form || !this.form[fieldName]) {\n return false;\n }\n const formField = this.form[fieldName];\n const fieldError = formField.$error[validationError];\n\n return fieldError && this.formOnceClicked && !formField.focused;\n }\n }\n\n angular\n .module('ekh')\n .directive('formState', ($q: ng.IQService) => {\n return {\n restrict: 'A',\n link: ($scope, $element, $attrs) => {\n $scope.formState = new FormState($scope[$attrs.name], $q);\n }\n };\n });\n}\n","(function() {\n'use strict';\n\nangular.module('ekh')\n .directive('hideSubmenuOnClick', function($window, broker) {\n const directive = {};\n\n const elements = [];\n const hsHeights = [];\n\n let isMobile = TRPCONFIG.IsMobileView;\n\n directive.link = function(scope, element, attr) {\n if (_.find(elements, element) == null) {\n elements.push(element);\n }\n\n const index = _.findIndex(elements, element);\n\n function touchedFalsify() {\n elements.forEach(el => {\n el.touched = false;\n });\n }\n\n function onMouseEnter() {\n element.addClass('hover');\n element.siblings().removeClass('hover');\n\n if (!isMobile) {\n const hs = element.find('.grid-container > div > div > :first-child');\n\n for (let i = 0; i < hs.length; i++) {\n hsHeights.push($(hs[i]).height());\n }\n\n const maxHeight = Math.max(...hsHeights);\n hs.attr('style', `height: ${maxHeight}px`);\n }\n\n // Add `keep-in-viewport-x` attribute to keep element on screen\n if ('keepInViewportX' in attr) {\n keepInViewportX(attr.keepInViewportX);\n }\n }\n\n function keepInViewportX(selector) {\n const win = $($window);\n const el = selector ? element.find(selector) : element;\n el.css('left', 0);\n\n let winRight = win.width() + win.scrollLeft() - 28; // Scrollbar\n let elRight = el.offset().left + el.width();\n let delta = elRight - winRight;\n\n if (delta > 0) {\n el.css('left', el.position().left - delta);\n }\n }\n\n element.on('click', () => {\n if ($window.TRPCONFIG.IsTouchDevice) {\n if (elements[index].touched === false || elements[index].touched == null) {\n onMouseEnter();\n touchedFalsify();\n elements[index].touched = true;\n } else if (elements[index].touched === true) {\n element.removeClass('hover');\n element.siblings().removeClass('hover');\n touchedFalsify();\n }\n }\n });\n\n element.on('mouseenter', () => {\n if (!$window.TRPCONFIG.IsTouchDevice) {\n onMouseEnter();\n }\n });\n\n element.children('.sub-menu').find('a').on('click', () => {\n element.removeClass('hover');\n });\n\n element.on('mouseleave', () => {\n element.removeClass('hover');\n });\n\n element.find('.menu-item-link').click(() => {\n broker.publish('hideNavigationDrawer');\n });\n };\n\n return directive;\n })\n .directive('slidePanelItem', function(broker, resourceService) {\n let isMobile = TRPCONFIG.IsMobileView;\n let enableSubMenu = TRPCONFIG.Domain.EnableDestinationsSubMenu;\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {\n hasChildren: '@'\n },\n link($scope, element) {\n $scope.onItemSelected = function() {\n if ($scope.hasChildren === 'true') {\n let dropdowns = document.querySelectorAll('.dropdown');\n let classes = element[0].classList.value;\n\n if (dropdowns.length) {\n dropdowns[0].classList.remove('dropdown');\n }\n\n if (!classes.includes('dropdown')) {\n element.addClass('dropdown');\n if (isMobile && enableSubMenu) {\n if (element[0].children[1].children[1].children[0].className === 'menu-item-link') {\n let items = element[0].children[1].children[1].children;\n for (let i = 0; i < items.length; i++) {\n items[i].style.display = 'block';\n }\n }\n }\n } else {\n element.removeClass('dropdown');\n if (isMobile && enableSubMenu) {\n let items = element[0].children[1].children[1].children;\n for (let i = 0; i < items.length; i++) {\n items[i].style.display = '';\n }\n }\n }\n } else {\n broker.publish('hideNavigationDrawer');\n }\n };\n if (isMobile && enableSubMenu) {\n document.addEventListener('click', function(e) {\n let target = e.target;\n let headerTypes = ['h1', 'h2', 'h3', 'h4', 'h5'];\n if (target.parentElement.firstElementChild.text === resourceService.get('DESTINATIONS')) {\n $('.menu-item-link').css('display', 'none');\n const destHeaders = target.parentElement.querySelectorAll('h1,h2,h3,h4,h5');\n let destHeadersLength = destHeaders ? destHeaders.length : 0;\n if (destHeadersLength > 0) {\n for (let i = 0; i < destHeadersLength; i++) {\n if (destHeaders[i].children[0] && destHeaders[i].classList.length === 0) {\n destHeaders[i].children[0].removeAttribute('class');\n destHeaders[i].children[0].classList.add('expand-icon', 'bg-position');\n } else {\n if (destHeaders[i].children[0] && destHeaders[i].children[0].classList.length > 0) {\n destHeaders[i].children[0].removeAttribute('class');\n }\n destHeaders[i].removeAttribute('class');\n destHeaders[i].classList.add('expand-icon', 'bg-position-one');\n }\n }\n }\n }\n\n if (target.parentElement.firstElementChild.tagName && headerTypes.includes(target.parentElement.firstElementChild.tagName.toLowerCase())) {\n $(target).parents('.menu-item')[0].classList.add('dropdown');\n let items = target.parentElement.children[1].children;\n if (items.length > 0) {\n subMenuReset(target);\n for (let i = 0; i < items.length; i++) {\n if (items[i].style.display !== 'block') {\n items[i].style.display = 'block';\n if (headerTypes.includes(target.tagName.toLowerCase())) {\n target.removeAttribute('class');\n target.classList.add('collapse-icon', 'bg-position-two');\n }\n } else {\n items[i].style.display = 'none';\n if (headerTypes.includes(target.tagName.toLowerCase())) {\n if (target.children[0] && target.children[0].classList.length > 0) {\n target.children[0].removeAttribute('class');\n }\n target.removeAttribute('class');\n target.classList.add('expand-icon', 'bg-position-one');\n }\n }\n }\n }\n } else if (target.parentElement.firstElementChild.tagName && target.parentElement.firstElementChild.tagName === 'A' &&\n (headerTypes.includes(target.parentElement.tagName.toLowerCase()))) {\n $(target).parents('.menu-item')[0].classList.add('dropdown');\n let items = target.parentElement.parentElement.children[1].children;\n if (items.length > 0) {\n subMenuReset(target);\n for (let i = 0; i < items.length; i++) {\n if (items[i].style.display !== 'block') {\n items[i].style.display = 'block';\n if (target.tagName === 'A') {\n if (target.parentElement.classList.length > 0) {\n target.parentElement.removeAttribute('class');\n }\n target.removeAttribute('class');\n target.classList.add('collapse-icon', 'bg-position-three');\n }\n } else {\n items[i].style.display = 'none';\n if (target.tagName === 'A') {\n if (target.parentElement.classList.length > 0) {\n target.parentElement.removeAttribute('class');\n }\n target.removeAttribute('class');\n target.classList.add('expand-icon', 'bg-position');\n }\n }\n }\n }\n }\n }, false);\n }\n\n function subMenuReset(target) {\n if (target.parentElement.firstElementChild.className.includes('expand-icon')) {\n $('.menu-item-link').css('display', 'none');\n const grid = $(target).parents('.grid-container');\n const destHeaders = grid[0].querySelectorAll('h1,h2,h3,h4,h5');\n let destHeadersLength = destHeaders ? destHeaders.length : 0;\n if (destHeadersLength > 0) {\n for (let i = 0; i < destHeadersLength; i++) {\n if (destHeaders[i].children[0] && destHeaders[i].classList.length === 0) {\n destHeaders[i].children[0].removeAttribute('class');\n destHeaders[i].children[0].classList.add('expand-icon', 'bg-position');\n } else {\n if (destHeaders[i].children[0] && destHeaders[i].children[0].classList.length > 0) {\n destHeaders[i].children[0].removeAttribute('class');\n }\n destHeaders[i].removeAttribute('class');\n destHeaders[i].classList.add('expand-icon', 'bg-position-one');\n }\n }\n }\n }\n }\n },\n template: '
          • '\n };\n });\n})();\n","(function() {\n'use strict';\n\nangular\n .module('ekh')\n .directive('metaOverride', metaOverride);\n\nfunction metaOverride() {\n function _linker(scope) {\n const metaInfo = scope.metaInfo;\n\n $.each({\n 'title':\n `${metaInfo.PageTitle}`,\n 'meta[name=title]':\n `<meta name=\"keywords\" content=\"${metaInfo.MetaKeywords || ''}\">`,\n 'meta[name=description]':\n `<meta name=\"description\" content=\"${metaInfo.MetaDescription || ''}\">`,\n 'meta[property=\"og:description\"]':\n `<meta property=\"og:description\" content=\"${metaInfo.MetaDescription || ''}\">`\n },\n (selector, htmlStr) => {\n $(selector).remove();\n $('head').append(htmlStr);\n }\n );\n }\n\n return {\n restrict: 'E',\n scope: {\n metaInfo: '='\n },\n link: _linker\n };\n}\n})();\n","/// <reference path=\"../../trp/services/globalisation.service.ts\"/>\n/// <reference path=\"../services/countryPicker.service.ts\"/>\n'use strict';\n\nnamespace ekh {\n\n type PointOfSale = TR.IPointOfSale;\n type Language = TR.ILanguage;\n type IGlobalisationService = TR.IGlobalisationService;\n type IRegionalContext = TR.IRegionalContext;\n let t = Date.now();\n\n class NavToolbar {\n\n activeContext: IRegionalContext;\n dropdownToggled: boolean = false;\n parentThis: any = this;\n\n constructor(\n private $scope: ng.IScope,\n private broker: any,\n private globalisationService: IGlobalisationService,\n private signUpPopupService: any\n ) {\n globalisationService.getSelectedRegionalContext().then(regionalContext => {\n this.activeContext = regionalContext;\n });\n\n broker.subscribe('navToolbar', 'RegionalContextSelected', ev => {\n return this.activeContext;\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('navToolbar');\n });\n\n this.idleLogout();\n }\n\n toggleCountryPicker(): void {\n this.dropdownToggled = !this.dropdownToggled;\n };\n\n openSignUpPopup() {\n this.signUpPopupService.showPopup();\n }\n\n idleLogout() {\n this.showPopup();\n window.onload = this.resetTimer;\n window.onmousemove = this.resetTimer;\n window.onmousedown = this.resetTimer;\n window.ontouchstart = this.resetTimer;\n window.ontouchmove = this.resetTimer;\n window.onclick = this.resetTimer;\n window.onkeydown = this.resetTimer;\n window.addEventListener('scroll', this.resetTimer, true);\n }\n\n public resetTimer() {\n t = Date.now();\n }\n\n /*this method used to show popup by calling \"resetTimer\" method. its a recursive method*/\n public showPopup() {\n let self = this;\n let d = Date.now();\n\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\n\n if ((d - t) > 10000\n && localStorage.getItem('popState') !== 'shown'\n && TRPCONFIG.searchState !== 'searching'\n && localStorage.getItem('subscriptionState') !== 'subscribed') {\n\n this.openSignUpPopup();\n localStorage.setItem('popState', 'shown');\n }\n\n setTimeout(function () {\n if (TRPCONFIG.searchState === 'searching') {\n t = Date.now();\n }\n }.bind(this), 1000);\n }\n document.addEventListener('mouseleave', (event: MouseEvent ) => {\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\n if ((event.clientY <= 0 || event.clientX <= 0 || (event.clientX >= window.innerWidth\n || event.clientY >= window.innerHeight))\n && localStorage.getItem('popState') !== 'shown'\n && TRPCONFIG.searchState !== 'searching'\n && localStorage.getItem('subscriptionState') !== 'subscribed') {\n this.openSignUpPopup();\n localStorage.setItem('popState', 'shown');\n }\n }\n });\n\n if (TRPCONFIG.Domain2.IsSubscribeModalAutoTriggerEnabled) {\n setTimeout(function () {\n self.showPopup();\n }.bind(this), 10000);\n }\n\n }\n }\n\n angular\n .module('ekh')\n .directive('navToolbar', () => {\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'partials/home/directivetemplate?type=navtoolbar',\n controller: NavToolbar,\n controllerAs: 'nt'\n };\n });\n\n}\n","namespace ekh {\n class PhoneNumberInput {\n private countryCode: string;\n private countryCodeNumber: string;\n private ngModel: string = '';\n private exportValueToModel: string;\n private $countryPickerElement: JQuery;\n\n constructor(private $scope: ng.IScope,\n private $element: JQuery\n ) {\n this.onInit();\n this.$scope.$on('$destroy', () => {\n this.onDestroy();\n });\n }\n\n onInit() {\n this.countryCode = this._getDefaultCountryCode();\n this.initCcPicker();\n\n this.$element.on('countrySelect', (e, data) => {\n this.onCountryCodeChange(data);\n });\n this.$countryPickerElement = angular.element('.cc-picker.cc-picker-code-select-enabled');\n this.$countryPickerElement.on('click', this.setTouched.bind(this));\n\n this.setCountryByCode(this.countryCode);\n this.$scope.$watch('phoneNumberCtrl.ngModel', this.updateExternalModel.bind(this));\n this.$scope.$watch('phoneNumberCtrl.exportValueToModel', this.syncExportValueModel.bind(this));\n }\n\n initCcPicker() {\n this.$element = this.$element.CcPicker({\n dataUrl: './build/country-phone-codes/data.json',\n });\n }\n\n setCountryByCode(countryCode) {\n this.$element.CcPicker('setCountryByCode', countryCode);\n }\n\n setCountryByPhoneCode(countryPhoneCode) {\n this.$element.CcPicker('setCountryByPhoneCode', countryPhoneCode);\n }\n\n setTouched() {\n this.$scope.ngModelCtrl.$setTouched();\n }\n\n onDestroy() {\n this.$element.off('countrySelect');\n this.$countryPickerElement.off('click');\n }\n\n onCountryCodeChange({code, phoneCode}) {\n this.countryCode = code;\n this.countryCodeNumber = phoneCode;\n this.updateExternalModel();\n this.$scope.$applyAsync(() => {\n this.updateBooking();\n });\n }\n\n updateExternalModel() {\n this.exportValueToModel = `${this.countryCodeNumber} ${this.ngModel}`;\n }\n\n updateBooking() {\n if (this.$scope.ngModelCtrl && this.$scope.ngModelCtrl.$touched) {\n if (this.$scope.ngModelCtrl.$updateBooking) {\n this.$scope.$evalAsync(this.$scope.ngModelCtrl.$updateBooking);\n }\n }\n }\n\n private _getDefaultCountryCode() {\n if (TRPCONFIG && TRPCONFIG.Domain && TRPCONFIG.Domain.CountryCode) {\n return TRPCONFIG.Domain.CountryCode;\n }\n return 'gb';\n }\n\n syncExportValueModel(value) {\n if (!value) {\n return false;\n }\n let [countryPhoneCode, phoneNumber] = value.split(' ');\n phoneNumber = !phoneNumber || phoneNumber === 'undefined' ? '' : phoneNumber;\n if (phoneNumber !== this.ngModel) {\n this.ngModel = phoneNumber;\n }\n if (countryPhoneCode !== this.countryCodeNumber) {\n this.countryCodeNumber = countryPhoneCode;\n this.setCountryByPhoneCode(this.countryCodeNumber);\n }\n }\n }\n\n angular\n .module('ekh')\n .directive('phoneNumberInput', () => {\n return {\n restrict: 'A',\n scope: {\n exportValueToModel: '=',\n ngModel: '='\n },\n require: ['ngModel'],\n bindToController: true,\n controller: PhoneNumberInput,\n controllerAs: 'phoneNumberCtrl',\n link: ($scope, $element, attr, ctrls) => {\n $scope.ngModelCtrl = ctrls[0];\n }\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('ekh')\n .directive('productCarousel', productCarousel);\n\nfunction productCarousel($timeout) {\n function _linker(scope, el, attr) {\n const baseOptions = {\n speed: 1000,\n slidesToShow: parseInt(attr.items) || 4,\n swipeToSlide: true,\n rtl: !!TRPCONFIG.Rtl\n };\n\n const itemOptions = {\n 4: {\n slidesToShow: 4,\n responsive: [{\n breakpoint: 500,\n settings: { slidesToShow: 1 }\n }, {\n breakpoint: 910,\n settings: { slidesToShow: 2 }\n }, {\n breakpoint: 1280,\n settings: { slidesToShow: 3 }\n }]\n },\n 9: {\n slidesToShow: 6,\n responsive: [{\n breakpoint: 480,\n settings: { slidesToShow: 2 }\n }, {\n breakpoint: 768,\n settings: { slidesToShow: 3 }\n }, {\n breakpoint: 1280,\n settings: { slidesToShow: 4 }\n }]\n },\n 1: {\n autoplay: true,\n autoplaySpeed: parseInt(attr.autoplayTimeout) || 3000,\n slidesToShow: 1\n }\n };\n\n const carouselOptions = angular.extend(baseOptions, itemOptions[attr.itemOptions]);\n if (attr.staticItems) {\n el.slick(carouselOptions);\n } else {\n $timeout(() => {\n if (scope.tiles != null && scope.tiles.length > 1) {\n el.slick(carouselOptions);\n }\n });\n }\n }\n\n return {\n restrict: 'A',\n scope: {\n tiles: '='\n },\n link: _linker\n };\n}\n})();\n","namespace Quote {\n\n import TripState = Core.Trip.TripState;\n\n interface RouteParams extends ng.route.IRouteParamsService\n {\n quoteNo :number;\n quoteRef :string;\n }\n\n export enum QuoteControllerStatus {\n Busy,\n NotFound,\n Ready,\n RefreshError,\n RefreshFailed\n }\n\n class QuotePublicController {\n\n public readonly controllerStatus = QuoteControllerStatus;\n public currentStatus :QuoteControllerStatus = QuoteControllerStatus.Busy;\n public priceDifference :number = 0;\n public priceDifferencePercentage :number = 0;\n public quote :Quote.IQuote;\n public trip :TripState;\n public validForDays :number = 30; //maybe the API should tell us this\n public hasEssentials :boolean = false;\n public productsLength :number = 0;\n public quoteStatusPromise: ng.IPromise<QuoteControllerStatus>;\n\n constructor(\n private $location :ng.ILocationService,\n private $routeParams :RouteParams,\n private analytics :any,\n private basketService :any,\n private basketStore :any,\n private bookingService :any,\n private dateUtil :any,\n private tripService :Core.TripService,\n private quoteService :QuoteService)\n {\n this.analytics.track('mixpanel', 'EmailMeLanding');\n const url = `${$routeParams.quoteRef}/${$routeParams.quoteNo}`;\n this.quoteStatusPromise = quoteService.getQuoteByReference(url)\n .then(quote => {\n if (!quote || quote.Error) {\n return this.currentStatus = QuoteControllerStatus.NotFound;\n }\n\n //get the product ids\n const productIds = _.map(quote.Products, (p :IQuoteProduct) => { return p.Id; });\n\n //seems that we can't do a single thing going forward without a trip being setup. As we are refreshing\n //the quote we might as well create a trip from the quote too. Unfortunately the trip service\n //relies on the basket and the basket is there until the refresh has happened :(\n return quoteService.refreshQuote(quote.Id, productIds).then(refreshedQuote => {\n if (refreshedQuote.Error) {\n return this.currentStatus = QuoteControllerStatus.RefreshError;\n } else {\n let restoreFailed = _.some(refreshedQuote.Products, {'RestoreFailed': true});\n this.productsLength = refreshedQuote.Products.length;\n if (restoreFailed) {\n this.quote = quote;\n return this.currentStatus = QuoteControllerStatus.RefreshFailed;\n }\n this.hasEssentials = _.some(\n refreshedQuote.Products,\n ({Ty}) => Ty === 'Transfer' || Ty === 'Car Hire' || Ty === 'Marhaba' || Ty === 'Insurance'\n );\n return tripService.getTripFromQuote(refreshedQuote).then(trip => {\n this.trip = trip;\n this.quote = refreshedQuote;\n this.validForDays = quoteService.validForDays(refreshedQuote.Products);\n this._setPriceDifference(refreshedQuote.Products);\n return this.currentStatus = QuoteControllerStatus.Ready;\n });\n }\n });\n\n });\n }\n\n private _setPriceDifference(products): void {\n const {priceDifferenceAbs, priceDifferencePercentage} = this.quoteService.getPriceDifference(products);\n this.priceDifference = priceDifferenceAbs;\n this.priceDifferencePercentage = priceDifferencePercentage;\n }\n\n\n public searchAgain() :void {\n if (this.trip) {\n this.tripService.restoreSearchUnit(this.trip.TripId).then(() => {\n this.$location.path('/holidays');\n });\n } else {\n this.$location.path('/');\n }\n };\n\n public bookQuote(position: string) :void {\n const bookingRedirectPath = 'holidays/book';\n const { BookingId, TripId } = this.trip;\n const { BasketId } = this.quote;\n\n this.basketService\n .bookBasket(TripId, BasketId);\n\n this.bookingService\n .prepareBooking(BasketId, BookingId, TripId)\n .then(() => {\n this.$location.path(`${bookingRedirectPath}/${TripId}`);\n });\n\n if(position) {\n this.analytics.track('mixpanel', 'EmailMeBookButton', {position});\n }\n }\n\n public hideLoadingScreenOverlay() :boolean {\n const { quote, currentStatus, controllerStatus } = this;\n\n return quote && (currentStatus === controllerStatus.Ready ||\n currentStatus === controllerStatus.RefreshError ||\n currentStatus === controllerStatus.RefreshFailed);\n }\n }\n\n angular\n .module('quote')\n .controller('QuotePublic', QuotePublicController);\n\n}\n","/// <reference path='../../core/contracts/quote.contracts.ts'/>\n/// <reference path='../../quote/controllers/quotePublic.controller.ts'/>\n/// <reference path='../../core/services/quote.service.ts'/>\n/// <reference path='../../core/services/resource.service.ts'/>\n/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\n/// <reference path=\"../../../../../../typings/globals/lodash/index.d.ts\" />\n\nnamespace ekh {\n\n class PublicQuoteSummaryController {\n\n public quoteStatusPromise: ng.IPromise<Quote.QuoteControllerStatus>;\n public quote: Quote.IQuote;\n public trip: Core.Trip.TripState;\n public quoteStatus: Quote.QuoteControllerStatus = Quote.QuoteControllerStatus.Busy;\n public controllerLoaded: boolean = false;\n public hotel: {[key:string]: any};\n public flight: {[key:string]: any};\n public transfer: {[key:string]: any};\n public parking: {[key:string]: any};\n public bookQuote: (position?) => void;\n public clientReadConfirm: boolean = false;\n public detailsStorageConsent: boolean = false;\n public detailsStorageMandatory: boolean = false;\n public priceDifferencePercentage: number;\n\n\n constructor(\n private basketService: any,\n private basketStore: any,\n private bookingService: any,\n private dateUtil: any,\n private tripService: Core.TripService,\n private quoteService: Quote.QuoteService,\n private flightDetail: any,\n private $q: ng.IQService,\n private $timeout: ng.ITimeoutService,\n private $rootScope: ng.IRootScopeService,\n private resourceService: Core.ResourceService,\n private $scope: ng.IScope\n ) {\n $rootScope.lockScreen($scope, {\n title: resourceService.get('PREPARINGBOOKING'),\n loadingScreenStyle: 'booking-optionsCtrl'\n });\n\n }\n\n $onInit() {\n this.quoteStatusPromise.then((status: Quote.QuoteControllerStatus) => {\n this.$timeout(_ => {\n this._checkAllProductsRefreshed(status).then((status: Quote.QuoteControllerStatus) => {\n this.quoteStatus = status;\n switch (status) {\n case Quote.QuoteControllerStatus.Ready:\n this.$timeout(_ => {\n this._init(this.quote);\n });\n break;\n default:\n this.$rootScope.unlockScreen(this.$scope);\n }\n });\n });\n })\n .catch(() => {\n this.quoteStatus = Quote.QuoteControllerStatus.RefreshError;\n });\n }\n\n private _init(quote) {\n this._setTransfer(quote);\n this._setParking(quote);\n this.$q.all([\n this.basketStore.hotel(quote.BasketId),\n this.basketStore.flight(quote.BasketId)\n ]).then(([hotel, flight]) => {\n this.$rootScope.unlockScreen(this.$scope);\n this.controllerLoaded = true;\n this.flight = flight;\n this.hotel = hotel;\n });\n }\n\n private _setTransfer(quote) {\n this.transfer = _.find(quote.Products, {TypeId: 2});\n }\n\n private _setParking(quote) {\n this.parking = _.find(quote.Products, {TypeId: 3});\n }\n\n private _checkAllProductsRefreshed(status: Quote.QuoteControllerStatus)\n : ng.IPromise<Quote.QuoteControllerStatus> {\n if (!this.trip || !this.quote) {\n return this.$q.when(Quote.QuoteControllerStatus.RefreshError);\n }\n return this.basketStore.getBasket(this.quote.BasketId)\n .then((basket) => {\n const basketProds = basket.Products.map(p => p.ProductType).sort();\n const quoteProds = this.quote.Products.map(p => p.TypeId).sort();\n return _.isEqual(basketProds, quoteProds) ? status : Quote.QuoteControllerStatus.RefreshError;\n });\n }\n\n public isHFareFlightType() {\n return this.flightDetail.isHFlightType(_.get(this.flight, 'Details.Itinerary'), false);\n };\n\n public book() {\n this.bookQuote();\n }\n\n public isBookingDisabled() {\n return !this.clientReadConfirm ||\n (this.detailsStorageMandatory && !this.detailsStorageConsent);\n }\n\n public quoteIsReady() {\n return this.quoteStatus === Quote.QuoteControllerStatus.Ready;\n }\n\n }\n\n angular\n .module('ekh')\n .directive('publicQuoteSummary', function() {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=publicquotesummary',\n controllerAs: 'qps',\n bindToController: {\n quoteStatusPromise: '=',\n trip: '=',\n quote: '=',\n bookQuote: '&',\n priceDifferencePercentage: '='\n },\n controller: PublicQuoteSummaryController\n };\n });\n}\n","/// <reference path='../../core/contracts/quote.contracts.ts'/>\n/// <reference path='../../quote/controllers/quotePublic.controller.ts'/>\n/// <reference path='../../core/services/quote.service.ts'/>\n/// <reference path='../../core/services/resource.service.ts'/>\n/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\n/// <reference path=\"../../../../../../typings/globals/lodash/index.d.ts\" />\n\nnamespace ekh {\n\n class QuoteStatusMessagesController {\n private phoneNumber: string;\n private quoteStatus: Quote.QuoteControllerStatus;\n private priceDifferencePercentage: number;\n private quoteRef: string;\n private samePriceRange: number;\n\n constructor(\n private resourceService: Core.ResourceService,\n ) {\n this.phoneNumber = this.resourceService.get('TELEPHONENUMBER');\n const priceRange = parseFloat(TRPCONFIG.Domain2.QuoteSamePricePercentRange);\n this.samePriceRange = !isNaN(priceRange) ? priceRange : 0;\n }\n\n public getTitle(messType) {\n switch(messType) {\n case 'EXPIRED':\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_EXPIRED_TITLE'), this.quoteRef);\n default:\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_TITLE'), this.quoteRef);\n }\n }\n\n public getMessageText(messType) {\n switch(messType) {\n case 'EXPIRED':\n return String.format(this.resourceService.get('QUOTE_STATUS_MESSAGE_EXPIRED_TEXT'),\n `<b>${this.phoneNumber}</b>`);\n case 'PRICE_DECREASED':\n return this.resourceService.get('QUOTE_STATUS_MESSAGE_PRICE_DECREASED_TEXT');\n case 'PRICE_INCREASED':\n return this.resourceService.get('QUOTE_STATUS_MESSAGE_PRICE_INCREASED_TEXT');\n default:\n return '';\n }\n }\n\n public isExpiredMessage() {\n return this.quoteStatus !== Quote.QuoteControllerStatus.Ready &&\n this.quoteStatus !== Quote.QuoteControllerStatus.Busy;\n }\n\n public isPriceDecreasedMessage() {\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\n return false;\n }\n return !this.isSamePriceMessage() && this.priceDifferencePercentage < 0;\n }\n\n public isPriceIncreasedMessage() {\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\n return false;\n }\n return !this.isSamePriceMessage() && this.priceDifferencePercentage > 0;\n }\n\n public isSamePriceMessage() {\n if (this.quoteStatus !== Quote.QuoteControllerStatus.Ready) {\n return false;\n }\n return Math.abs(this.priceDifferencePercentage) <= this.samePriceRange;\n }\n\n public getButtonLabel() {\n return this.resourceService.get('HOLIDAYSEARCH');\n }\n }\n\n angular\n .module('ekh')\n .directive('quoteStatusMessages', function() {\n return {\n restrict: 'E',\n replace: true,\n controllerAs: 'quoteMess',\n bindToController: {\n quoteStatus: '=',\n priceDifferencePercentage: '=',\n quoteRef: '='\n },\n controller: QuoteStatusMessagesController,\n template: `\n <div class=\"quote-status-messages\">\n\n <div class=\"message-block expired-quote\" ng-if-start=\"quoteMess.isExpiredMessage()\">\n <div class=\"quote-ref\" ng-bind-html=\"::quoteMess.getTitle('EXPIRED')\"></div>\n <div class=\"message\" ng-bind-html=\"::quoteMess.getMessageText('EXPIRED')\"></div>\n </div>\n <a href=\"./\" ng-if-end class=\"button primary\">\n {{::quoteMess.getButtonLabel()}}\n </a>\n \n <div class=\"message-block increased-price\" ng-if=\"quoteMess.isPriceIncreasedMessage()\">\n <div class=\"quote-ref\" ng-bind-html=\"::quoteMess.getTitle('PRICE_INCREASED')\"></div>\n <div class=\"message\" ng-bind-html=\"::quoteMess.getMessageText('PRICE_INCREASED')\"></div>\n </div>\n \n <div class=\"message-block decreased-price\" ng-if=\"quoteMess.isPriceDecreasedMessage()\">\n <div class=\"quote-ref\" ng-bind-html=\"::quoteMess.getTitle('PRICE_DECREASED')\"></div>\n <div class=\"message\" ng-bind-html=\"::quoteMess.getMessageText('PRICE_DECREASED')\"></div>\n </div>\n \n <div class=\"message-block same-price\" ng-if=\"quoteMess.isSamePriceMessage()\">\n <div class=\"quote-ref\" ng-bind-html=\"::quoteMess.getTitle('SAME_PRICE')\"></div>\n </div>\n \n </div>\n `,\n };\n });\n}\n","/// <reference path=\"../../../../../../typings/globals/angular/index.d.ts\" />\n\nnamespace ekh {\n\n\n class SelectedHotelController {\n public hotel: {[key: string]: any};\n public totalCost: number = 0;\n public basketId: string;\n public totalDeposit: number = 0;\n public depositAllowed: boolean = false;\n public showHotelImages: boolean = false;\n public hotelImages: {src: string}[];\n private imgWidth = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\n private imgHeight = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\n public hotelImageIndex: number = 0;\n public showCancellationsPopUp: boolean = false;\n\n\n constructor(\n private basketStore: any,\n private flightSearch: any,\n private $q: ng.IQService,\n private arrayUtil: any,\n private imageService: any\n ) {\n }\n\n $onInit() {\n this._initHotelImages();\n this.$q.all([\n this.basketStore.totalCost(this.basketId),\n this.basketStore.totalDeposit(this.basketId),\n this.basketStore.rules(this.basketId)\n ]).then(([totalCost, totalDeposit, rules]) => {\n this.totalCost = totalCost;\n this.totalDeposit = totalDeposit;\n this.depositAllowed = rules.depositAllowed;\n });\n this.findCancellationData();\n }\n\n private findCancellationData() {\n if (TRPCONFIG.Domain.BrandedFareCancellations) {\n this.showCancellationsPopUp = true;\n }\n };\n\n public showCancellationsDetails() {\n return this.flightSearch.showCancellationsDetailsModal();\n };\n\n private _initHotelImages() {\n const numberImages = this.hotel.Details.NumberOfPhotos - 1;\n const hotelId = this.hotel.Details.Id;\n this.hotelImages = this.arrayUtil.map(this.arrayUtil.numberArray(0, numberImages), i => {\n return {\n src: this.imageService.getImageUrl(hotelId, this.imgWidth, this.imgHeight, i, false)\n };\n });\n }\n\n public openImageGallery() {\n this.showHotelImages = true;\n }\n }\n\n angular\n .module('ekh')\n .directive('selectedHotel', () => {\n return {\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=selectedhotel',\n controller: SelectedHotelController,\n controllerAs: 'shCtrl',\n bindToController: {\n hotel: '=',\n basketId: '='\n }\n };\n });\n\n}\n","namespace ekh {\n\n interface MenuItem {\n name: string;\n target: string;\n offset?: number;\n value: string;\n }\n\n interface IGtmOptions {\n category?: string;\n action?: string;\n label?: string;\n }\n\n class StickyNavBar {\n\n selectedIndex: number = 0;\n menuToggled: boolean = false;\n\n title: string;\n headingType: string;\n titleHtml: string;\n\n currentTop: number = 0;\n previousTop: number = 0;\n\n isFixed: boolean = false;\n fixedYPosition: number = 0;\n yOffset: number = 0;\n\n elementHeight: number = 0;\n offsetValue: number = 0;\n paddingTop: number = 0;\n\n isAutoScrolling = false;\n\n menuItems: MenuItem[];\n\n constructor(\n private $scope: ng.IScope,\n private $element: JQuery,\n private $window: ng.IWindowService,\n private scrollService: any,\n private $interval: any ) {\n\n const menuElement = $('#navbarcont');\n if (menuElement) {\n this.yOffset = menuElement.height();\n this.offsetValue = menuElement.outerHeight();\n }\n\n $(window).on('scroll.stickynav', (() => {\n this.fix();\n }));\n\n this.fixedYPosition = this.$element.offset().top - this.offsetValue;\n\n this.paddingTop = parseInt(this.$element.next().css('paddingTop'), 10) || 0;\n\n this.titleHtml = `<${this.headingType}>${this.title}</${this.headingType}>`;\n\n $scope.$on('$destroy', () => {\n $(window).off('scroll.stickynav');\n });\n\n };\n\n selectAnchor = (index: number) => {\n this.updateSelectedIndex(index);\n if (this.menuToggled) {\n this.menuToggled = false;\n }\n }\n\n gotoAnchor = (anchor: string) => {\n if (this.menuItems[this.selectedIndex]) {\n const target = this.menuItems[this.selectedIndex].offset;\n\n let targetValue = this.yOffset + this.offsetValue + 30;\n\n if(!TRPCONFIG.IsMobileDevice) {\n const signup = $('.cms-newsletter-sign-up');\n if (signup.length > 0) {\n targetValue += signup.outerHeight();\n }\n }\n\n if (target) {\n $('body,html').animate(\n { scrollTop: target - ( targetValue )},\n {\n duration: 'slow',\n start: () => { this.isAutoScrolling = true; },\n done: () => { this.isAutoScrolling = false; }\n }\n );\n }\n }\n }\n\n toggle = () => {\n this.menuToggled = !this.menuToggled;\n }\n\n attachElements = (value) => {\n const stickyHeight = this.$element.height();\n let totalHeight = stickyHeight;\n const signup = $('.cms-newsletter-sign-up');\n if(signup.length > 0) {\n totalHeight += signup.outerHeight();\n if (value) {\n signup.css({top: this.offsetValue + stickyHeight});\n signup.addClass('fixed');\n } else {\n signup.removeClass('fixed');\n }\n }\n const siblingSection = this.$element.nextAll('section');\n if(siblingSection.length > 0 && siblingSection[0].tagName === 'SECTION') {\n const elem = $(siblingSection[0]);\n elem.css({ 'paddingTop': value ? totalHeight + 'px' : '0px' });\n }\n }\n\n fix = () => {\n this.currentTop = this.scrollService.getScrollOffsets(this.$window).y;\n if (!this.isFixed) { this.fixedYPosition = this.$element.offset().top; }\n\n if (this.currentTop > this.previousTop) {\n if (this.currentTop >= this.fixedYPosition - this.offsetValue) {\n this.$scope.$apply(() => {\n this.isFixed = true;\n if (!TRPCONFIG.IsMobileDevice) {this.attachElements(true);}\n });\n }\n } else {\n if (this.currentTop <= this.fixedYPosition - this.offsetValue) {\n this.$scope.$apply(() => {\n this.isFixed = false;\n if (!TRPCONFIG.IsMobileDevice) {this.attachElements(false);}\n });\n }\n }\n\n const index = this.findClosestTarget();\n\n if (index) { this.updateSelectedIndex(index); }\n\n this.previousTop = this.currentTop;\n }\n\n findClosestTarget() {\n if (this.isAutoScrolling) { return; }\n let index = 0;\n const height = this.$element.height();\n const headings = $('h1,h2,h3,h4,h5,h6');\n for (let i = 0; i < this.menuItems.length; i++) {\n\n const item = this.menuItems[i];\n if (item.offset) {\n const itemText = `:contains(${item.value})`;\n\n const domItem = headings.filter(itemText).first();\n\n if (domItem.length > 0) {\n item.offset = domItem.offset().top;\n if (this.currentTop + height > (item.offset - (this.yOffset + this.offsetValue + 30))) {\n index = i;\n }\n }\n\n }\n }\n\n return index;\n }\n\n updateSelectedIndex(index) {\n this.selectedIndex = index;\n }\n }\n\n angular\n .module('ekh')\n .directive('stickyNavBar', ($document, $anchorScroll, $compile) => {\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {},\n bindToController: {\n scrollOffsetElement: '@',\n contentElement: '@',\n menuOffsetElement: '@',\n title: '@',\n data: '@',\n headingType: '@'\n },\n controllerAs: 'cm',\n templateUrl: 'partials/home/directivetemplate?type=StickyNavBar',\n controller: StickyNavBar,\n link(scope, element, attrs, navBarCtrl: StickyNavBar, transcludeFn) {\n\n const items: any = [];\n\n const cloned = transcludeFn(scope, function (elements) {\n let count = 0;\n angular.forEach(elements, function (item) {\n if (item.nodeType !== 3) {\n var text = $.trim(item.textContent);\n items.push({ value: text });\n const gtmOptions = getGtmOptions(item);\n element\n .find('ul.sticky-navbar-menu-list')\n .append(createCloneElement(count, text, gtmOptions));\n element\n .find('ul.sticky-navbar-touch-menu-list')\n .append(createCloneElement(count, text, gtmOptions));\n count++;\n }\n });\n });\n\n function createCloneElement(count, text, gtmOptions: IGtmOptions = {}) {\n let eventTrackerDirective = '';\n if (Object.keys(gtmOptions).length) {\n eventTrackerDirective = `\n event-tracker\n event-category=\"${gtmOptions.category}\" \n event-action=\"${gtmOptions.action}\" \n event-label=\"${gtmOptions.label}\" \n `;\n }\n\n return $compile(\n `<li ng-class=\"{ selected : cm.selectedIndex == ${count}}\">\n <a sticky-nav-bar-item title=\"${text}\" \n target=\"${text.replace(/\\s/g, '').toLowerCase()}\" \n index=\"${count}\"\n ${eventTrackerDirective}\n >\n </a>\n </li>`)(scope, undefined, {\n transcludeControllers: {\n stickyNavBar: {\n instance: StickyNavBar\n }\n }\n });\n }\n\n var targets = document.querySelectorAll('h1,h2,h3,h4,h5,h6');\n\n angular.forEach(items, function (item) {\n var domTarget = _.filter(targets, function (target) {\n return item.value === target.textContent;\n });\n\n if (domTarget.length) { item.offset = $(domTarget).offset().top; }\n });\n\n //for each h1 , if text matches store top value for link to click on\n navBarCtrl.menuItems = items;\n\n function getGtmOptions(element): IGtmOptions | {} {\n element = $(element).find('[event-tracker]');\n\n if (element.length) {\n return {\n category: element.attr('event-category'),\n action: element.attr('event-action'),\n label: element.attr('event-label')\n };\n }\n return {};\n }\n }\n };\n });\n\n class StickyNavBarItem {\n title: string;\n index: number;\n target: string;\n\n constructor(private $scope) {\n }\n\n selectAnchor = () => {\n this.$scope.$parent.cm.selectAnchor(this.index);\n this.$scope.$parent.cm.gotoAnchor(this.target);\n }\n }\n\n angular.module('ekh')\n .directive('stickyNavBarItem', () => {\n return {\n restrict: 'A',\n replace: true,\n require: 'stickyNavBar',\n scope: {},\n bindToController: {\n title: '@',\n index: '@',\n target: '@'\n },\n controller: StickyNavBarItem,\n controllerAs: 'snbi',\n template: '<a ng-click=\"snbi.selectAnchor()\"><span>{{ snbi.title }}</span></a>'\n };\n });\n};\n","namespace ekh {\n\n class ValidateCardType {\n private paymentForm: ng.IFormController;\n private cardNumber: string | undefined;\n private paymentOptions: any;\n private cardType: any;\n\n constructor(private $scope: ng.IScope,\n private paymentsService,\n private $q: ng.IQService\n ) {\n\n $scope.$watchGroup(['validateCtrl.cardType', 'validateCtrl.maskModel'], ([valCardType, maskModel]) => {\n if (!this.paymentForm || !this.paymentForm.cardNumber) {\n return false;\n }\n\n if (!valCardType && this.cardNumber) {\n this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\n return false;\n }\n\n if (maskModel) {\n this.paymentsService.checkCardNumber(this.paymentOptions, maskModel, valCardType)\n .then(cardNumber => {\n if (!cardNumber) {\n this.cardType = null;\n return $q.reject();\n }\n })\n .then(() => {\n $scope.ngModelCardNumberCtrl.$setViewValue(maskModel);\n this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', true);\n })\n .catch(() => {\n $scope.ngModelCardNumberCtrl.$setViewValue(undefined);\n this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\n });\n } else {\n $scope.ngModelCardNumberCtrl.$setViewValue(undefined);\n this.paymentForm.cardNumber.$setValidity('wrongCreditCardNumber', false);\n }\n });\n }\n }\n\n angular.module('ekh')\n .directive('validateCardType', () => {\n return {\n restrict: 'A',\n require: 'ngModel',\n controllerAs: 'validateCtrl',\n bindToController: {\n paymentForm: '=',\n cardNumber: '=ngModel',\n paymentOptions: '=',\n maskModel: '=',\n cardType: '='\n },\n controller: ValidateCardType,\n template: '',\n link: ($scope, $element, $attrs, ngModelCtrl) => {\n $scope.ngModelCardNumberCtrl = ngModelCtrl;\n }\n };\n });\n};\n","(function() {\n'use strict';\n\n\nangular\n .module('ekh')\n .service('cmsPageMapping', cmsPageMapping);\n\nfunction cmsPageMapping(destinationService) {\n function filterPages(filterType) {\n return destinationService.getTiles({ ControlId: 222 })\n .then(tiles => _.filter(tiles[0], tile => {\n if (tile.pagetype === filterType) {\n return {\n Name: tile.name,\n ControlId: tile.controlid,\n LinkUrl: tile.linkurl\n };\n }\n }));\n }\n\n return {\n getDestinations: () => filterPages('destination'),\n getHomePage: () => filterPages('homepage'),\n getOfferTypes: () => filterPages('offer'),\n getSingleOffers: () => filterPages('singleoffer')\n };\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('insurance')\r\n .service('insuranceService', insuranceService);\r\n\r\n\r\nfunction insuranceService($http,\r\n $browser,\r\n tripService,\r\n $filter,\r\n resourceService,\r\n analytics,\r\n searchUnitService,\r\n occupancyService,\r\n $q,\r\n insuranceSearchValidator,\r\n broker,\r\n $cacheFactory,\r\n loggingService) {\r\n const domain = TRPCONFIG.Domain;\r\n const service = {\r\n getInsuranceQuotes,\r\n getInsuranceQuotesFromSession,\r\n getDocumentPaths,\r\n passengerInsuranceBand,\r\n composeOptionId,\r\n decomposeOptionId,\r\n clearSearchResults,\r\n validateSearchCriteria,\r\n search,\r\n getSearchResults,\r\n getInsuranceDetails,\r\n rehydrate,\r\n isVatMessageInclusive\r\n };\r\n let results;\r\n let inProgress;\r\n const url = '/api2/insurance/availability/';\r\n const detailsUrl = '/api2/insurance/details/';\r\n let timeout;\r\n const promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\r\n\r\n function _doRequest(r, tripId, newSearch) {\r\n return newSearch ?\r\n getInsuranceQuotes(tripId, r) :\r\n getInsuranceQuotesFromSession(r.AvailabilitySearchId);\r\n }\r\n\r\n function passengerInsuranceBand(insuranceBands, bandId, costOnly) {\r\n if (!bandId) {\r\n return costOnly ?\r\n '-'\r\n : String.format('{0} ({1}: -)', resourceService.get('INSURANCENOTREQUIRED'), resourceService.get('INSURANCECOST'));\r\n }\r\n\r\n const option = _.find(insuranceBands, { Id: bandId });\r\n\r\n let priceString = $filter('customCurrency')(option.Price);\r\n\r\n if (!option.Available) {\r\n priceString = resourceService.get('INSURANCECOSTNA');\r\n }\r\n\r\n return costOnly ?\r\n priceString\r\n : String.format('{0} ({1}: {2})', option.Label, resourceService.get('INSURANCECOST'), priceString);\r\n }\r\n\r\n function validateSearchCriteria() {\r\n return insuranceSearchValidator.validate(\r\n searchUnitService.getPolicyType(),\r\n searchUnitService.getTravelDestination(),\r\n searchUnitService.startDate(searchUnitService.insurance),\r\n searchUnitService.endDate(searchUnitService.insurance),\r\n occupancyService.reduceOccupancy());\r\n }\r\n\r\n function search(args) {\r\n if (inProgress != null && !args.newSearch) {\r\n return inProgress;\r\n }\r\n const tripId = args.tripId;\r\n let request = {\r\n AvailabilitySearchId: args.searchId,\r\n TripId: tripId\r\n };\r\n if (args.newSearch) {\r\n //request for standalone insurance search\r\n request.SearchType = 1;\r\n request.TripType = searchUnitService.getPolicyType();\r\n request.TravelDestination = searchUnitService.getTravelDestination();\r\n request.StartDate = searchUnitService.startDate(searchUnitService.insurance);\r\n request.EndDate = searchUnitService.endDate(searchUnitService.insurance);\r\n request.PolicyExtras = searchUnitService.getPolicyExtra();\r\n }\r\n inProgress = tripService.getTripReducedOccupancy(tripId).then(o => {\r\n o = o || occupancyService.reduceOccupancy();\r\n const ages = _.concat(o.AdultAges ? o.AdultAges : _.times(o.Adults, () => 21), o.ChildAges);\r\n request.Ages = ages;\r\n return _doRequest(request, tripId, args.newSearch).then(function(res) {\r\n inProgress = null;\r\n results = res;\r\n return results;\r\n }, function() {\r\n inProgress = null;\r\n results = null;\r\n });\r\n });\r\n return inProgress;\r\n }\r\n\r\n function getInsuranceQuotes(tripId, request) {\r\n const req = angular.extend({\r\n DomainId: domain.DomainId,\r\n Currency: domain.CurrencyCode,\r\n CultureCode: domain.CultureCode\r\n }, request);\r\n tripService.recordInsuranceSearch(tripId, request);\r\n analytics.startTimer('InsuranceAvailabilityRequest');\r\n return $http.post(`${url}get`, req, { ignoreErrors: true }).then(function(res) {\r\n analytics.endTimer('InsuranceAvailabilityRequest');\r\n return enrichData(res.data.Quotes);\r\n });\r\n }\r\n\r\n function getInsuranceQuotesFromSession(availabilitySearchId) {\r\n return $http.post(`${url}getfromsession`, {\r\n AvailabilitySearchId: availabilitySearchId\r\n }, { ignoreErrors: true }).then(function(res) {\r\n return enrichData(res.data.Quotes);\r\n });\r\n }\r\n\r\n function getDocumentPaths() {\r\n //these paths should probably be coming back from the service call really and\r\n //the docs be served from the service ideally.\r\n const baseRoute = `${$browser.baseHref()}build/docs/BookingConditions/`;\r\n return {\r\n PolicyWording: `${baseRoute}${TRPCONFIG.Domain.InsurancePolicyWordingDoc}`,\r\n SilverPolicyWording: `${baseRoute}${TRPCONFIG.Domain2.InsuranceSilverPolicyWordingDoc}`,\r\n Disclosure: `${baseRoute}${TRPCONFIG.Domain.StatusDisclosureDoc}`,\r\n PolicySummary: `${baseRoute}${TRPCONFIG.Domain.InsuranceKeyFactsDoc}`,\r\n InsuranceProductInformation: TRPCONFIG.Domain.InsuranceProductInformation ?\r\n `${baseRoute}${TRPCONFIG.Domain.InsuranceProductInformation}` : '',\r\n };\r\n }\r\n\r\n function enrichData(quotes) {\r\n if (TRPCONFIG.Domain.InsurancePerPersonPricing === false) {\r\n return quotes;\r\n }\r\n\r\n angular.forEach(quotes, function(quote) {\r\n quote.PerPersonPrice = quote.Price / (quote.AdultCount + quote.ChildCount + quote.InfantCount);\r\n });\r\n return quotes;\r\n }\r\n\r\n function composeOptionId(schemeId, typeId, supplierId) {\r\n return `${schemeId}|${typeId}|${supplierId}`;\r\n }\r\n\r\n function decomposeOptionId(id) {\r\n //takes a key like 1|1|208 and returns a correctly set object\r\n const parts = id.split('|');\r\n let obj = {\r\n schemeId: parseInt(parts[0]),\r\n typeId: parseInt(parts[1]),\r\n supplierId: parseInt(parts[2])\r\n };\r\n if (parts[3]) {\r\n obj.relationshipId = parseInt(parts[3]);\r\n } else {\r\n loggingService.logWarn(`RelationshipId - insurance.service.js, decomposeOptionId() warn ${id}`);\r\n }\r\n return obj;\r\n }\r\n\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n\r\n function getSearchResults(searchId, tripId) {\r\n if (results && results !== 'null') {\r\n return $q.when(_.cloneDeep(results));\r\n }\r\n return search({ searchId, tripId });\r\n }\r\n\r\n function getInsuranceDetails(params) {\r\n if (timeout != null) {\r\n timeout.resolve('CANCELLED');\r\n }\r\n timeout = $q.defer();\r\n return $http.get(`${detailsUrl}get`, {\r\n timeout: timeout.promise,\r\n params: {\r\n availabilityId: params.AvailabilityId,\r\n schemeId: params.SchemeId,\r\n tripTypeId: params.TripTypeId,\r\n supplierId: params.SupplierId,\r\n destinationId: params.DestinationId,\r\n relationshipId: params.RelationshipId\r\n },\r\n customErrCallback(args) {\r\n if (args.status) {\r\n broker.publish('insuranceRequestFailed');\r\n }\r\n return true;\r\n }\r\n }).then(function(res) {\r\n promiseCache.remove(res.data.DetailSearchId);\r\n timeout = null;\r\n return res.data;\r\n });\r\n }\r\n\r\n function rehydrate(id) {\r\n if (!promiseCache.get(id)) {\r\n promiseCache.put(id, $http.post(`${detailsUrl}getfromsession?detailSearchId=${id}`, { ignoreErrors: true }).then(function(res) {\r\n return res.data;\r\n }));\r\n }\r\n return promiseCache.get(id);\r\n }\r\n\r\n function isVatMessageInclusive(insuranceQuotes, isMultiple) {\r\n if (!isMultiple && (insuranceQuotes && insuranceQuotes.length === 1)) {\r\n return true;\r\n } else if (isMultiple && (insuranceQuotes && insuranceQuotes.length > 1)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","namespace liveChatModule {\n\n class LiveChat {\n\n public showThanks: boolean = false;\n\n constructor (\n private liveChatService: LiveChatService,\n private $timeout: ng.ITimeoutService\n )\n {\n this.showThanks = false;\n }\n\n public startChat = () => {\n if(TRPCONFIG.Domain.LiveChat.Ready) {\n this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ButtonCode);\n }\n }\n\n public rejectChat = () => {\n if(TRPCONFIG.Domain.LiveChat.Ready){\n this.liveChatService.rejectChat(TRPCONFIG.Domain.LiveChat.ButtonCode);\n }\n }\n\n public closeThanks = () => {\n this.$timeout(() => {\n this.showThanks = false;\n }, 1000);\n }\n }\n\n angular\n .module('liveChatModule')\n .directive('liveChat', (): ng.IDirective => {\n return {\n scope: {},\n replace: true,\n bindToController: {},\n controller: LiveChat,\n controllerAs: 'lc',\n templateUrl: `partials/home/liveChat`\n };\n });\n}\n","namespace liveChatModule {\n\n class LiveChatButton {\n\n public showThanks: boolean = false;\n\n constructor (\n private liveChatService: LiveChatService\n )\n {\n this.liveChatService.addReactiveButton();\n }\n\n public startChat = ():void => {\n if(TRPCONFIG.Domain.LiveChat.Ready) {\n this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ReactiveButtonCode);\n }\n }\n\n public startOfflineChat = ():void => {\n if(TRPCONFIG.Domain.LiveChat.Ready) {\n this.liveChatService.startChat(TRPCONFIG.Domain.LiveChat.ReactiveOfflineButtonCode);\n }\n }\n\n }\n\n angular\n .module('liveChatModule')\n .directive('liveChatButton', (): ng.IDirective => {\n return {\n scope: {},\n replace: true,\n bindToController: {},\n controller: LiveChatButton,\n controllerAs: 'lcb',\n templateUrl: `partials/home/liveChatButton`\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('parking')\n .controller('Parking', Parking);\n\nfunction Parking($filter,\n $routeParams,\n $scope,\n arrayUtil,\n basketService,\n basketStore,\n broker,\n extraProductsService,\n parkingDetailsService,\n scrollService,\n tripService,\n flightsTerminalService) {\n const ap = this;\n\n ap.noneParking = '-1';\n\n ap.currentParkingLimit = ap.parkingLimit = 5;\n\n ap.parkingAvailabilityBusy = true;\n\n broker.subscribe('Parking', 'parkingRequestFailed', function() {\n ap.showDetailsError = true;\n ap.parking = angular.copy(ap.noneParking);\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('Parking');\n });\n\n tripService.getTrip($routeParams.tripId).then(function(trip) {\n const basketId = trip.BasketId;\n const tripId = trip.TripId;\n let parkingSearchId = trip.ParkingRequest ? trip.ParkingRequest.AvailabilitySearchId : null;\n const onewayonly = trip.FlightsRequest.OneWayOnly;\n\n basketStore.parking(basketId, $routeParams.productId).then(function(results) {\n const parking = results ? results.Details.AirportParkingQuoteId : null;\n if (parking) {\n ap.parking = angular.copy(parking);\n } else if (TRPCONFIG.Domain.DefaultAirportParkingSelection) {\n ap.parking = ap.noneParking;\n }\n\n if (TRPCONFIG.Domain.AirportParkingEnabled && !onewayonly) {\n basketService.getParkingQuotes(parkingSearchId, basketId, tripId).then(function(parkingQuotes) {\n const setResults = function(results) {\n ap.parkingQuotes = results;\n _updateSubtitle();\n ap.parkingAvailabilityBusy = false;\n\n $scope.$watch('ap.parking', function(val) {\n if (val == null) {\n return;\n }\n _updateSubtitle();\n\n if (TRPCONFIG.Domain.EnforceParkingOptionSelection && results.length > 0) {\n $scope.$emit('sendParkingSelection', val);\n } else {\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\n }\n\n if (val !== ap.noneParking) {\n const quote = arrayUtil.first(ap.parkingQuotes, function(q) {\n return angular.equals(q.QuoteId, val);\n });\n if (quote) {\n quote.parkingBusy = !quote.Details;\n ap.showDetailsError = false;\n tripService.getTrip(tripId).then(function(t) {\n parkingSearchId = t.ParkingRequest.AvailabilitySearchId;\n basketService.selectParking(val, parkingSearchId, basketId).then(function(d) {\n ap.showDetailsError = false;\n quote.Details = d.Details;\n quote.parkingBusy = false;\n quote.viewDetails = true;\n basketService.updateBasket();\n }, function() {\n quote.parkingBusy = false;\n quote.showDetailsError = true;\n });\n });\n } else {\n ap.parking = ap.noneParking;\n }\n } else {\n basketStore.removeParking(basketId).then(basketService.updateBasket);\n }\n }, true);\n };\n\n if (parkingQuotes && parkingQuotes.length) {\n parkingQuotes = arrayUtil.sort(parkingQuotes, 'Price');\n setResults(parkingQuotes);\n } else {\n ap.parkingAvailabilityBusy = false;\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\n }\n }, function() {\n ap.parkingAvailabilityBusy = false;\n $scope.$emit('sendParkingSelection', { CarParkCode: '0', SupplierId: 0 });\n });\n }\n }).then(null, basketService.restartHolidayWorkflow);\n\n // get flight departure terminal\n basketStore.flight(trip.BasketId).then(function(flight) {\n const leg = flight.Details.Itinerary.Legs[0];\n flightsTerminalService.getTerminalForFlight(\n leg.DepartureAirport.Code,\n leg.Segments[0].FlightNumber,\n leg.DepartureDate\n )\n .then(terminal => {\n if (terminal) {\n ap.terminal = terminal;\n }\n });\n });\n\n ap.appendDetails = function(quote, $event) {\n if ($event) {\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n tripService.getTrip(tripId\n ).then(trip => parkingDetailsService.appendDetails(quote, angular.copy(trip))\n ).then(() => { ap.currentInfo = quote; });\n };\n\n ap.showMoreOrLess = function() {\n const moreParkingQuotes = ap.currentParkingLimit !== ap.parkingQuotes.length;\n const currentParkingLimit = moreParkingQuotes ? ap.parkingQuotes.length : 5;\n\n if (!moreParkingQuotes) {\n scrollService.scrollTo('#parking-product-expander', { animate: true, offset: 70 }).then(function() {\n ap.moreParkingQuotes = false;\n ap.currentParkingLimit = currentParkingLimit;\n });\n } else {\n ap.moreParkingQuotes = true;\n ap.currentParkingLimit = currentParkingLimit;\n }\n };\n\n ap.filterQuotes = extraProductsService.filterQuotes;\n\n function _updateSubtitle() {\n if (ap.parkingQuotes && ap.parking) {\n const parkingQuote = arrayUtil.first(ap.parkingQuotes, function(p) {\n return angular.equals(p.QuoteId, ap.parking);\n });\n ap.parkingQuoteDescription = parkingQuote ? `${parkingQuote.CarPark} (${$filter('customCurrency')(parkingQuote.Price)})` : null;\n }\n }\n }, basketService.bookingAlreadyDone(`parking: '${$routeParams.tripId}'`));\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('parking')\n .controller('ParkingResults', ParkingResults);\n\nfunction ParkingResults($scope,\n parkingService,\n parkingDetailsService,\n $location,\n broker,\n tripService,\n $routeParams,\n basketService) {\n const cm = this;\n const tripId = $routeParams.tripId;\n\n cm.appendDetails = appendDetails;\n\n tripService.getTrip(tripId).then(trip => {\n const parkingRq = trip && trip.ParkingRequest;\n\n if (parkingRq) {\n parkingService.getSearchResults(tripId)\n .then(data => {\n cm.parkingQuotes = data;\n broker.publish('unblock');\n $scope.$emit('unblock');\n },\n () => $location.path('parking'))\n .then(() => tripService.getParkingRequestSummary(tripId))\n .then(summary => cm.summary = summary);\n\n cm.selectParking = function(parking) {\n basketService.selectParking(\n parking.QuoteId, parkingRq.AvailabilitySearchId, trip.BasketId, tripId\n );\n cm.selectedParking = parking.QuoteId;\n };\n }\n });\n\n function appendDetails(quote) {\n tripService.getTrip(tripId).then(trip => parkingDetailsService.appendDetails(quote, angular.copy(trip)));\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('parking')\n .controller('ParkingSearchUnit', Parking);\n\nfunction Parking(searchUnitService,\n dateUtil,\n $window,\n $scope,\n resourceService,\n broker,\n basketService,\n $timeout) {\n const cm = this;\n const mode = searchUnitService.parking;\n\n $timeout(() => {\n const selectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\n if (selectedDepartureAirport && selectedDepartureAirport.Code && selectedDepartureAirport.Code.indexOf(',') > -1) {\n searchUnitService.clearDepartureAirports();\n }\n cm.summary = searchUnitService.getSummary(mode);\n });\n\n const minimumDate = dateUtil.todayPlus(1, 0, true);\n const minimumDatePlusOne = dateUtil.addDays(minimumDate, 1, true) || dateUtil.todayPlus(1, 0, true);\n let initStartPlusOne;\n\n cm.setStartDate = setStartDate;\n cm.setEndDate = setEndDate;\n cm.search = search;\n cm.startDate = searchUnitService.startDate(mode);\n cm.endDate = searchUnitService.endDate(mode);\n\n if (cm.startDate) {\n initStartPlusOne = dateUtil.addDays(cm.startDate, 1, true);\n }\n cm.minDates = {\n minimumDate,\n startPlusOne: initStartPlusOne || minimumDatePlusOne\n };\n\n function setStartDate(date, back) {\n if (date) {\n cm.minDates.startPlusOne = dateUtil.addDays(date, 1, true);\n }\n searchUnitService.startDate(mode, date);\n cm.summary = searchUnitService.getSummary(mode);\n if (back) {\n setTimeout(function() {\n $window.history.back();\n }, 0);\n }\n }\n\n function setEndDate(date, back) {\n searchUnitService.endDate(mode, date);\n cm.summary = searchUnitService.getSummary(mode);\n cm.showEndCalendar = false;\n if (back) {\n setTimeout(function() {\n $window.history.back();\n }, 0);\n }\n }\n\n const flow = basketService.parkingBooking;\n\n /*Can be moved to a directive*/\n function search() {\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGPARKING'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-parkingSearchUnit'\n });\n basketService.startWorkflow(flow).then(null, function(errors) {\n broker.publish('unblock');\n $scope.$emit('unblock');\n $scope.$emit('flash:error', errors);\n });\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('parking')\n .service('parkingService', parkingService);\n\n\nfunction parkingService($http,\n $q,\n analytics,\n dateUtil,\n guidService,\n occupancyService,\n parkingSearchValidator,\n searchUnitService,\n tripService,\n loggingService) {\n const domain = TRPCONFIG.Domain;\n const service = {\n getParkingQuotes,\n getParkingQuotesFromSession,\n validateSearchCriteria,\n clearSearchResults,\n getSearchResults\n };\n let results;\n\n function clearSearchResults() {\n results = null;\n }\n\n function getSearchResults(tripId) {\n if (results && results !== 'null') {\n return $q.when(results);\n }\n return getParkingQuotes(tripId);\n }\n\n function getParkingQuotes(tripId, request = _buildStandaloneParkingRequest()) {\n // `request` argument supplied in holiday mode i.e. basketService.getParkingQuotes()\n // Availability request format\n const availabilityReq = angular.extend({\n DomainId: domain.DomainId,\n CultureCode: domain.CultureCode\n }, request);\n\n // Trip service format\n const tripServiceReq = angular.extend({\n Airport: searchUnitService.getSelectedDepartureAirport()\n }, request);\n delete tripServiceReq.AirportCode;\n\n tripService.recordParkingSearch(tripId, tripServiceReq);\n analytics.startTimer('ParkingAvailabilityRequest');\n\n return $http.post('/api2/airportparking/availability/get', availabilityReq, { ignoreErrors: true })\n .then(res => {\n if (res.data.CarParkingQuotes.length === 0) {\n loggingService.logError(`No airport parking information found for ${tripId}, fn.getParkingQuotes`);\n }\n analytics.endTimer('ParkingAvailabilityRequest');\n return _enrichData(res.data.CarParkingQuotes, availabilityReq.DepartureDate, availabilityReq.ReturnDate);\n }, () => {\n return null;\n });\n }\n\n function getParkingQuotesFromSession(availabilitySearchId, availabilityRequest) {\n return $http.post('/api2/airportparking/availability/getfromsession',\n { AvailabilitySearchId: availabilitySearchId },\n { ignoreErrors: true }\n ).then(results => {\n if (results.data.CarParkingQuotes.length === 0) {\n loggingService.logError(`No airport parking information found for ${availabilitySearchId}, fn.getParkingQuotesFromSession`);\n }\n return _enrichData(results.data.CarParkingQuotes,\n availabilityRequest.DepartureDate,\n availabilityRequest.ReturnDate);\n }, () => {\n return null;\n });\n }\n\n function validateSearchCriteria() {\n return parkingSearchValidator.validate(\n searchUnitService.getSelectedDepartureAirport(),\n searchUnitService.startDate(searchUnitService.parking),\n searchUnitService.endDate(searchUnitService.parking)\n );\n }\n\n function _buildStandaloneParkingRequest() {\n const departureAirport = searchUnitService.getSelectedDepartureAirport();\n return {\n AvailabilitySearchId: guidService.uuid(),\n DepartureDate: searchUnitService.startDate(searchUnitService.parking),\n ReturnDate: searchUnitService.endDate(searchUnitService.parking),\n AirportCode: departureAirport && departureAirport.Code,\n PassengerCount: occupancyService.getPassengerCount()\n };\n }\n\n function _enrichData(parkings, fromDate, toDate) {\n const days = dateUtil.getDifferenceInDays(dateUtil.parseDate(fromDate), dateUtil.parseDate(toDate));\n angular.forEach(parkings, function(parking) {\n parking.PerDayPrice = parking.Price / days;\n });\n return parkings;\n }\n\n return service;\n}\n})();\n","(function() {\n 'use strict';\n\n angular\n .module('parking')\n .service('parkingDetailsService', parkingDetailsService);\n\n\n function parkingDetailsService($http, $cacheFactory, $q, broker) {\n const url = '/api2/airportparking/details/';\n let timeout;\n const promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\n\n const service = {\n getParkingDetails,\n appendDetails,\n rehydrate\n };\n\n function getParkingDetails(quote) {\n if (quote.AirportParkingQuoteId.Details) {\n return $q.when(quote.AirportParkingQuoteId.Details);\n }\n if (timeout != null) {\n timeout.resolve('CANCELLED');\n }\n const request = {\n AvailabilitySearchId: quote.AvailabilitySearchId,\n AirportParkingQuoteId: quote.AirportParkingQuoteId,\n DomainId: TRPCONFIG.Domain.DomainId\n };\n timeout = $q.defer();\n return $http.post(`${url}get`, request, {\n customErrCallback(args) {\n if (args.status) {\n broker.publish('parkingRequestFailed');\n }\n return true;\n },\n timeout: timeout.promise\n }).then(function(res) {\n promiseCache.remove(res.data.DetailsSearchId);\n timeout = null;\n return res.data;\n });\n }\n\n function appendDetails(quote, t) {\n if (!quote.Details) {\n quote.parkingBusy = true;\n const parkingSearchId = t.ParkingRequest.AvailabilitySearchId;\n service.getParkingDetails({ AvailabilitySearchId: parkingSearchId, AirportParkingQuoteId: quote.QuoteId }, true).then(function(d) {\n quote.viewDetails = true;\n quote.Details = d;\n quote.parkingBusy = false;\n quote.showDetailsError = false;\n }, function() {\n quote.parkingBusy = false;\n quote.showDetailsError = true;\n });\n } else {\n quote.viewDetails = true;\n }\n }\n\n function rehydrate(id) {\n if (!promiseCache.get(id)) {\n promiseCache.put(id, $http.post(`${url}getfromsession`, { DetailsSearchId: id }).then(function(res) {\n return res.data;\n }));\n }\n return promiseCache.get(id);\n }\n\n return service;\n }\n})();\n","(function() {\n'use strict';\n\nangular\n .module('parking')\n .service('parkingSearchValidator', parkingSearchValidator);\n\nfunction parkingSearchValidator(resourceService, dateUtil) {\n const service = {\n validate\n };\n\n function validate(departureAirport, startDate, endDate) {\n const errors = [];\n\n if (departureAirport == null) {\n errors.push(resourceService.get('SELECTDEPARTUREAIRPORT'));\n }\n\n if (startDate == null) {\n errors.push(resourceService.get('SELECTARRIVALDATE'));\n } else if (!dateUtil.atLeastOneDayInTheFuture(startDate)) {\n errors.push(resourceService.get('ARRIVALDATEMUSTBEFUTURE'));\n }\n\n if (endDate == null) {\n errors.push(resourceService.get('SELECTRETURNDATE'));\n } else if (endDate <= startDate) {\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\n }\n\n return errors;\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('quote')\n .controller('Quote', Quote);\n\nfunction Quote(quoteService,\n tripService,\n bookingService,\n hotelRehydrator,\n $routeParams,\n $location,\n $filter,\n dateUtil,\n flightDetail,\n $q) {\n const qc = this;\n qc.quoteCreationError = false;\n qc.quoteNotFound = false;\n qc.quoteRefreshEnabled = TRPCONFIG.Domain.QuoteRefreshEnabled;\n qc.quoteManager = !($routeParams.quoteRef && $routeParams.quoteNo);\n qc.quoteRefreshError = false;\n qc.validForDays = 30; //maybe the API should tell us this\n\n if (!qc.quoteManager) {\n quoteService.getQuoteByReference(`${$routeParams.quoteRef}/${$routeParams.quoteNo}`).then(function(result) {\n if (result === null) {\n qc.quoteNotFound = true;\n } else {\n qc.quote = result;\n if (!qc.quote) {\n qc.quoteNotFound = true;\n } else {\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\n enrichProducts();\n }\n }\n });\n }\n\n const productNames = {\n accommodation: 0,\n flight: 1,\n transfer: 2,\n airportparking: 3,\n attractionticket: 4,\n carhire: 5,\n marhaba: 6,\n insurance: 7\n };\n\n\n function getNumFromType(type) {\n const typeStr = type.toLowerCase().replace(/\\s/g, '');\n return productNames[typeStr] >= 0 ? productNames[typeStr] : Object.keys(productNames).length;\n }\n\n function sortProducts(products) {\n const sorted = products && products.sort(function(a, b) {\n const typeA = getNumFromType(a.Type);\n const typeB = getNumFromType(b.Type);\n\n a.TypeId = typeA;\n b.TypeId = typeB;\n\n return typeA > typeB ? 1 : -1;\n });\n\n return sorted;\n }\n\n qc.refreshQuote = function() {\n qc.refreshClicked = true;\n qc.quoteRefreshError = false;\n return quoteService.refreshQuote(qc.quote.Id, qc.quote.ProductIds).then(result => {\n qc.refreshClicked = false;\n if (result.Error) {\n qc.quoteRefreshError = true;\n } else {\n qc.quote = result;\n\n if (!qc.quote) {\n qc.quoteNotFound = true;\n qc.quoteCreationError = true;\n } else {\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\n return enrichProducts();\n }\n }\n });\n };\n\n qc.getQuoteByReference = function(quoteRef, quoteNo) {\n $location.path(`quote/manage/${quoteRef}/${quoteNo}`);\n };\n\n qc.replaceProduct = function(quoteId, productId, replacementId) {\n quoteService.replaceProduct(quoteId, productId, replacementId).then(function(result) {\n qc.quote = result;\n if (!qc.quote) {\n qc.quoteNotFound = true;\n qc.quoteCreationError = true;\n } else {\n qc.validForDays = quoteService.validForDays(qc.quote.Products);\n enrichProducts();\n }\n });\n };\n\n qc.gotoBasket = () => $location.path('dp/basket');\n\n qc.bookQuote = () => {\n //redirection url\n let bookingRedirectPath = 'holidays/book';\n if (qc.quote.Products && qc.quote.Products.length === 1) {\n if (qc.quote.Products[0].Type === 'Accommodation') {\n bookingRedirectPath = 'hotels/book';\n } else if (qc.quote.Products[0].Type === 'Transfer') {\n bookingRedirectPath = 'transfers/book';\n } else if (qc.quote.Products[0].Type === 'Marhaba') {\n bookingRedirectPath = 'marhaba/book';\n } else if (qc.quote.Products[0].Type === 'Insurance') {\n bookingRedirectPath = 'insurance/book';\n } else if (qc.quote.Products[0].Type === 'Airport Parking') {\n bookingRedirectPath = 'parking/book';\n }\n }\n //get trip\n tripService.getTripFromQuote(qc.quote).then(result => {\n qc.tripFromQuote = result;\n bookingService.prepareBooking(qc.quote.BasketId, qc.tripFromQuote.BookingId, qc.tripFromQuote.TripId)\n .then(() => {\n if (bookingRedirectPath === 'marhaba/book') {\n $location.path(`marhaba/book/${qc.tripFromQuote.TripId}/${qc.quote.Products[0].Id}`);\n } else {\n $location.path(`${bookingRedirectPath}/${qc.tripFromQuote.TripId}`);\n }\n });\n });\n };\n\n qc.searchAgain = () => {\n //select tab from search unit\n let searchRedirectPath = '/holidays';\n if (qc.quote.Products.length === 1) {\n searchRedirectPath = qc.quote.Products[0].searchRedirectPath;\n }\n //get trip id\n tripService.getTripFromQuote(qc.quote).then(function(result) {\n qc.tripFromQuote = result;\n if (qc.tripFromQuote) {\n tripService.restoreSearchUnit(qc.tripFromQuote.TripId).then(function() {\n $location.path(searchRedirectPath);\n });\n } else {\n document.location.href = '/';\n }\n });\n };\n\n function getDetailsForAllFlights(products) {\n return $q.all(products\n .map(p => {\n return p.Type === 'Flight'\n ? flightDetail.mapLegs(p)\n : $q.when(p);\n }));\n }\n\n\n function enrichProducts() {\n return getDetailsForAllFlights(qc.quote.Products)\n .then(p => {\n const products = sortProducts(p);\n qc.quote.ProductIds = [];\n qc.quote.RestoreFailed = false;\n qc.quote.totalQuotedHolidayCost = 0;\n qc.quote.totalCurrentHolidayCost = 0;\n qc.failedRestore = products && products.filter(p => p.RestoreFailed);\n\n angular.forEach(products, product => {\n qc.quote.ProductIds.push(product.Id);\n if (product.RestoreFailed) {\n qc.quote.RestoreFailed = true;\n }\n if (product.Type === 'Flight') {\n product.iconClass = 'icon-flights';\n getFlightDetails(product);\n product.searchRedirectPath = '/flights';\n } else if (product.Type === 'Accommodation') {\n product.iconClass = 'icon-hotels';\n getHotelDetails(product);\n product.searchRedirectPath = '/hotels';\n if (Array.isArray(product.SpecialOffers)) {\n product.HasSpecialOffers = product.SpecialOffers.some(so => so);\n }\n } else if (product.Type === 'Transfer') {\n product.iconClass = 'icon-transfers';\n product.searchRedirectPath = '/transfers';\n } else if (product.Type === 'Car Hire') {\n product.searchRedirectPath = '/car-hire';\n getCarHireDetails(product);\n } else if (product.Type === 'Marhaba') {\n if (product.Options.length > 0) {\n getTotalProductCost(product);\n }\n product.searchRedirectPath = '/marhaba';\n } else if (product.Type === 'Insurance') {\n product.searchRedirectPath = '/insurance';\n }\n qc.quote.totalQuotedHolidayCost += product.TotalQuotedCost ? product.TotalQuotedCost : product.QuotedCost;\n qc.quote.totalCurrentHolidayCost += product.TotalCurrentCost ? product.TotalCurrentCost : product.CurrentCost;\n });\n qc.quote.Products = products;\n });\n }\n\n function getCarHireDetails(product) {\n angular.forEach(product.Options, option => {\n if (option.OnRequest) {\n product.ShowOnRequest = true;\n }\n option.PayableLocally = (option.CurrentUnitCost === 0 && option.QuotedUnitCost === 0 && option.Quantity >= 1 && option.OnRequest === true);\n\n option.UnitCurrentAmountString = $filter('customCurrency')(option.CurrentUnitCost, option.Currency);\n option.TotalCurrentAmountString = $filter('customCurrency')((option.CurrentUnitCost * option.Quantity), option.Currency);\n });\n }\n\n function getFlightDetails(product) {\n getTotalProductCost(product);\n\n product.Options = _.filter(product.Options, function(option) {\n const title = `${parseInt(option.Title)}`;\n return option.CurrentOptionCost > 0 || option.Title !== title;\n });\n }\n\n function getHotelDetails(product) {\n hotelRehydrator.staticHotel(product.EstablishmentId).then(function(d) {\n product.extraDetails = d;\n });\n }\n\n function getTotalProductCost(product) {\n let totalQuotedProductCost = 0;\n let totalCurrentProductCost = 0;\n\n angular.forEach(product.Options, option => {\n option.CurrentOptionCost = option.Quantity * option.CurrentUnitCost;\n option.QuotedOptionCost = option.Quantity * option.QuotedUnitCost;\n\n totalQuotedProductCost += option.QuotedOptionCost;\n totalCurrentProductCost += option.CurrentOptionCost;\n\n option.UnitCurrentAmountString = $filter('customCurrency')(option.CurrentUnitCost);\n option.TotalCurrentAmountString = $filter('customCurrency')((option.CurrentUnitCost * option.Quantity));\n });\n\n product.TotalCurrentCost = product.CurrentCost + totalCurrentProductCost;\n product.TotalQuotedCost = product.QuotedCost + totalQuotedProductCost;\n }\n}\n})();\n","'use strict';\nnamespace Quote {\n\n type IQuoteSearch = Quote.IQuoteSearch;\n\n export interface IAgentIdentity {\n Id: number;\n FullName: string;\n UserName: string;\n }\n\n export interface ITravelAgentIdentity {\n Id: number;\n Name: string;\n AgencyRef: string;\n }\n\n export interface IQuoteDateLimits {\n startMaxDate?: Date;\n endMinDate?: Date;\n endMaxDate?: Date;\n }\n\n class AdvancedQuoteSearch {\n public busy:boolean = false;\n private showSearchForm: boolean;\n public toggleSearchForm:boolean = true;\n private selectedAgent: IAgentIdentity | undefined;\n private selectedTravelAgent: ITravelAgentIdentity | undefined;\n private selectedCustomer: any | undefined;\n\n private searching: boolean;\n private noPermission: boolean;\n private quoteSearch: Quote.IQuoteSearch;\n private today: Date;\n private agents: IAgentIdentity[];\n private dateLimits: IQuoteDateLimits;\n private userDetails: any;\n private travelAgentDetails: any;\n\n public hideAdvancedSearch: () => void | undefined;\n public showTravelAgencyDetail: boolean| undefined;\n public showLoyaltyNumber: boolean | undefined;\n public showLinkedBookings: boolean | undefined;\n public allowToggleAdvancedSearch: boolean | undefined;\n\n constructor(\n private quoteService: Quote.QuoteService,\n private $scope: any,\n private resourceService: any,\n private agentModeService: any,\n private dateUtil: any,\n private $location: any,\n private broker: any,\n private $q: ng.IQService,\n private localStorageProvider: any\n ) {\n this.initSearch(quoteService.getCachedSearch());\n }\n\n searchAgain(): void {\n this.searching = false;\n this.showSearchForm = true;\n this.toggleSearchForm = true;\n }\n\n private initSearch(cache: IQuoteSearch | null): void {\n this.searching = false;\n this.showSearchForm = true;\n this.allowToggleAdvancedSearch = 'function' === typeof this.hideAdvancedSearch;\n this.today = this.dateUtil.todayPlus(0, 0, true);\n this.dateLimits = {\n startMaxDate: this.today,\n endMaxDate: this.dateUtil.todayPlus(1, 0, true)\n };\n this.toggleSearchForm = true;\n this.quoteSearch = {\n searchModel: {\n domainId: TRPCONFIG.Domain.DomainId,\n page: 1,\n limit: 9,\n sortDirection: 'DESC'\n },\n searchResponse: null\n };\n if(cache != null){\n this.quoteSearch = cache;\n this.showSearchForm = false;\n this.toggleSearchForm = false;\n }\n this.agentModeService.getCoworkers().then(data => { this.agents = data; });\n }\n\n search(pgIndex: number): ng.IPromise<void> {\n this.noPermission = false;\n this.quoteSearch.searchModel.page = pgIndex;\n this.quoteSearch.searchModel.reference = this.quoteSearch.searchModel.quoteNo\n ? `QUO/${this.quoteSearch.searchModel.quoteNo}`\n : '';\n this.searching = true;\n this.showSearchForm = false;\n\n const onRequestFinished = (searchResponse) => {\n this.searching = false;\n this.toggleSearchForm = false;\n this.quoteSearch.searchResponse = searchResponse;\n };\n\n return this.quoteService.search(this.quoteSearch.searchModel).then<void>(res => {\n onRequestFinished(res);\n }, err => {\n if(err.status === 400) {\n this.showError('QUOTEADVANCESEARCH_NOTSPECIFIC');\n this.searching = false;\n this.showSearchForm = true;\n return;\n }\n onRequestFinished(null);\n this.noPermission = 401 === err.status;\n });\n }\n\n private showError(error): void {\n this.$scope.$broadcast('flash:error', this.resourceService.get(error));\n }\n\n private page = (num: number, e: any): void => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n this.search(num);\n }\n\n\n manageQuote(reference: string): void {\n this.broker.publish('quoteSelected', reference);\n this.localStorageProvider.setItem('quoteSelected', reference);\n this.$location.path('quote/manage/' + reference);\n }\n\n setStartDate(date: Date): void {\n this.quoteSearch.searchModel.from = date;\n this.dateLimits.endMinDate = date;\n }\n\n\n setEndDate(date: Date): void {\n this.quoteSearch.searchModel.to = date;\n }\n\n\n private selectAgent(agent: IAgentIdentity): void {\n if(agent) {\n this.quoteSearch.searchModel.quotedById = agent.Id;\n this.selectedAgent = agent;\n }\n }\n\n\n\t\tprivate selectCustomer(customer: any): void {\n if(customer) {\n this.selectedCustomer = customer;\n this.quoteSearch.searchModel.userId = customer.UserId;\n }\n }\n\n\n private selectTravelAgent(agent: ITravelAgentIdentity): void {\n if(agent) {\n this.selectedTravelAgent = agent;\n this.quoteSearch.searchModel.externalAgentId = agent.Id;\n }\n }\n\n\n private filterAgent(prefix: string): IAgentIdentity[] {\n return _.filter(this.agents, agent => _.includes(_.toLower(agent.FullName), _.toLower(prefix)));\n }\n\n\n private autoCompleterDeselect(prop: string): void {\n this.quoteSearch.searchModel[prop] = null;\n\n if(prop === 'externalAgentId') {\n this.selectedTravelAgent = undefined;\n }\n if(prop === 'userId') {\n this.selectedCustomer = undefined;\n }\n if(prop === 'quotedById') {\n this.selectedAgent = undefined;\n }\n }\n\n\n private getTravelAgentNameForQuote(quote: Quote.IQuoteSearchResult) {\n return this.quoteService.getTravelAgentNameForQuote(quote) || '-';\n }\n\n\n private getTravelAgentAgencyNameForQuote(quote: Quote.IQuoteSearchResult) {\n if (this.travelAgentDetails && this.travelAgentDetails[quote.TravelAgentId]) {\n return this.travelAgentDetails[quote.TravelAgentId].Name;\n }\n return '-';\n }\n\n\n private getCustomerNameForQuote(quote: Quote.IQuoteSearchResult): string {\n return this.quoteService.getCustomerNameForQuote(quote,\n this.getContactByUserId(quote.UserId)) || '-';\n }\n\n\n private getCustomerEmailForQuote(quote: Quote.IQuoteSearchResult): string {\n return this.quoteService.getCustomerEmailForQuote(quote,\n this.getContactByUserId(quote.UserId) ||\n this.getTravelAgentContactById(quote.TravelAgentId)\n ) || '-';\n }\n\n\n private getCustomerPhoneNumberForQuote(quote: Quote.IQuoteSearchResult): string {\n return this.quoteService.getCustomerPhoneNumberForQuote(\n this.getContactByUserId(quote.UserId) ||\n this.getTravelAgentContactById(quote.TravelAgentId) || quote\n ) || '-';\n }\n\n\n private getCustomerSkywardNumberForQuote(quote: Quote.IQuoteSearchResult): string {\n return this.quoteService.getCustomerSkywardNumberForQuote(\n this.getContactByUserId(quote.UserId) || quote) || '-';\n }\n\n\n private getContactByUserId(userId:string): any {\n if (userId && this.userDetails && this.userDetails[userId]) {\n return this.userDetails[userId].Contact;\n }\n return null;\n }\n\n\n private getTravelAgentContactById(agentId:number):any {\n if(agentId && this.travelAgentDetails && this.travelAgentDetails[agentId]) {\n return this.travelAgentDetails[agentId].Contact;\n }\n return null;\n }\n\n\n private hideSearch($e): void {\n $e.preventDefault();\n if (this.allowToggleAdvancedSearch) {\n this.hideAdvancedSearch();\n }\n }\n }\n\n\n angular\n .module('quote')\n .directive('advancedQuoteSearch', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n templateUrl: 'partials/quote/directivetemplate?type=advancedquotesearch',\n controller: AdvancedQuoteSearch,\n controllerAs: 'aqs',\n bindToController: {\n hideAdvancedSearch: '&?',\n showTravelAgencyDetail: '=?',\n showLoyaltyNumber: '=?',\n showLinkedBookings: '=?',\n }\n };\n });\n}\n","'use strict';\n\nnamespace Search {\n\n export class SearchOccupancy {\n Adults: number = 2;\n ChildAges: number[] = [];\n }\n\n export class OccupancyConfig {\n MaxRooms: number;\n MaxAdults: number;\n MaxChildren: number;\n MaxChildAge: number;\n MaxAdultsInAdditionalRooms: number;\n MaxChildrenInAdditionalRooms: number;\n }\n\n export class DateRange {\n start: string;\n end: string;\n }\n\n export interface Airline {\n Title: string;\n Code: string;\n IsPostfilter: boolean | undefined;\n }\n\n export class Cabin {\n public name;\n constructor(\n public resource: string,\n public value: number | undefined,\n public queryStringCode: string | undefined,\n private resourceService: Core.ResourceService\n ) {\n this.name = this.resourceService.getDeferred(resource);\n }\n }\n\n}\n","'use strict';\n\nnamespace Search {\n\n export enum UnifiedSearchType {\n Holidays = 1,\n Hotels,\n Flights,\n Transfers,\n Cruises,\n Marhaba,\n HolidayDeals,\n Insurance\n }\n\n export class UnifiedSearchModel {\n occupancy: SearchOccupancy[];\n currency: string;\n startDate: string;\n endDate: string;\n noDatesYet: boolean;\n cabin: number;\n airports: any[];\n destination: any[];\n onewayonly: boolean;\n flexibleDates: boolean;\n airlines: Airline[];\n prefilterDirectFlights: boolean;\n month: number;\n duration: number;\n domainId: number;\n }\n\n}\n","'use strict';\n\nnamespace Search {\n\n class DateRangePicker {\n // Attr\n startDate: string;\n endDate: string;\n minDate: string;\n maxDate: string;\n enabledDates: any = {};\n select: () => void;\n show: boolean;\n durations: number[] = [];\n oneWay: boolean;\n\n private elements: any;\n private datePicker: any = null;\n private nextDateToSet: string = 'start';\n private localStartDate: Date | undefined = undefined;\n private localEndDate: Date | undefined = undefined;\n private shadowStartDate: Date | undefined = undefined;\n private shadowEndDate: Date | undefined = undefined;\n private duration: Number = 0;\n private html: JQuery;\n\n constructor (\n private $scope: ng.IScope,\n private $timeout: ng.ITimeoutService,\n private dateUtil: any,\n private animationUtil: any\n ) {\n this.html = $('html');\n }\n\n init (elements): void {\n this.elements = elements;\n\n this.$scope.$watch('drp.show', (val) => {\n if (val != null) {\n if (val) {\n this.open();\n } else {\n this.close();\n }\n }\n });\n\n // set shadow dates on hover\n // (disabled for touch as it requires the user to press twice to select a date)\n if (!TRPCONFIG.IsTouchDevice) {\n this.elements.datepickerEl.on('mouseover.datetangepicker', 'td.drp-date', (event) => {\n let $cell = $(event.currentTarget),\n date = this.getDateFromCalendarCell($cell);\n\n if ($cell.hasClass('ui-datepicker-unselectable')) {\n this.resetShadowDates();\n this.$scope.$apply(() => {\n this.setDuration();\n });\n return;\n }\n\n $cell.addClass('hover hover-' + this.nextDateToSet);\n if (this.nextDateToSet === 'start') {\n this.shadowStartDate = date;\n this.shadowEndDate = undefined;\n } else {\n this.shadowEndDate = date;\n this.shadowStartDate = this.localStartDate;\n }\n if (this.shadowStartDate && this.shadowEndDate) {\n this.durations.length === 0 && this.highlightShadowDates();\n this.$scope.$apply(() => {\n this.setDuration();\n });\n }\n });\n }\n\n this.elements.datepickerEl.on('mouseleave.datetangepicker', 'td.drp-date', (event) => {\n let $cell = $(event.currentTarget);\n $cell.removeClass('hover');\n });\n\n // reset shadow dates when calendar loses hover focus\n this.elements.datepickerEl.on('mouseleave.datetangepicker', 'table.ui-datepicker-calendar', (event) => {\n this.resetShadowDates();\n this.$scope.$apply(() => {\n this.setDuration();\n });\n });\n\n // close if overlay is clicked\n this.elements.overlay.on('click.datetangepicker', (event) => {\n this.$scope.$apply(() => {\n this.closeClicked(null);\n });\n });\n\n this.elements.stage.on('click.datetangepicker', (event) => {\n event.stopPropagation();\n });\n\n this.$scope.$on('$destroy', () => {\n // unbind event listeners by namespace\n this.elements.datepickerEl.off('.datetangepicker');\n this.elements.overlay.off('.datetangepicker');\n this.elements.stage.off('.datetangepicker');\n this.html.off('.datetangepicker');\n $(window).unbind('resize');\n });\n\n }\n\n highlightShadowDates () : void {\n this.elements.datepickerEl.find('.drp-date:not(.ui-datepicker-unselectable)').each((i, val) => {\n let $cell = $(val);\n let date = this.getDateFromCalendarCell($cell);\n let isInShadow = this.shadowStartDate !== undefined\n && this.shadowEndDate !== undefined\n && (date >= this.shadowStartDate)\n && (date <= this.shadowEndDate);\n $cell.toggleClass('in-shadow-range', isInShadow);\n });\n }\n\n getDateFromCalendarCell ($td): Date {\n // get the date from the css class we set previously\n let match = $td.attr('class').match(/drp-date-\\S+/),\n date = match[0].replace('drp-date-', '');\n return this.dateUtil.parseDate(date);\n }\n\n setDuration () : void {\n let start = this.localStartDate ? this.localStartDate : this.shadowStartDate,\n end = this.localEndDate ? this.localEndDate : this.shadowEndDate;\n this.duration = start && end ? this.dateUtil.numberOfNights(start, end) : 0;\n }\n\n isStartDateEnabled (date: Date) : boolean {\n let enabled: boolean;\n if (this.enabledDates && Object.keys(this.enabledDates).length > 0) {\n const dateStr = this.dateUtil.format(date, 'yyyy-MM-dd');\n enabled = !_.isUndefined(this.enabledDates[dateStr]);\n } else {\n enabled = true;\n }\n return enabled;\n }\n\n applyDatePicker (element): void {\n\n const options = {\n numberOfMonths: 2,\n dateFormat: 'dd-M-yy',\n firstDay: 1,\n isRTL: TRPCONFIG.Rtl,\n prevText: '',\n nextText: '',\n onSelect: () => {\n this.$scope.$apply(() => {\n const selectedDate = this.datePicker('getDate');\n // a date has been selected on the calendar\n if (this.nextDateToSet === 'start') {\n this.localStartDate = selectedDate;\n // clear the end date\n this.localEndDate = undefined;\n } else if (this.nextDateToSet === 'end') {\n this.localEndDate = selectedDate;\n }\n\n this.nextDateToSet = this.oneWay || this.nextDateToSet === 'end' ? 'start' : 'end';\n if (this.nextDateToSet === 'start') {\n // a range has now been selected\n this.setRange();\n // timeout allows model to update\n this.$timeout(() => this.select());\n }\n });\n },\n beforeShowDay: date => {\n let selectable: boolean;\n\n // tag this cell with a class denoting the serialised date\n let classes: string[] = [\n 'drp-date',\n 'drp-date-' + this.dateUtil.serialiseDate(date)\n ];\n if (this.nextDateToSet === 'start') {\n // is this a permitted start date?\n selectable = this.isStartDateEnabled(date);\n } else {\n // is this a permitted end date?\n selectable = this.localStartDate !== undefined && date > this.localStartDate;\n if (selectable && this.durations.length > 0) {\n let duration = this.dateUtil.numberOfNights(this.localStartDate, date);\n selectable = _.includes(this.durations, duration);\n selectable && classes.push('valid-duration');\n }\n }\n\n // set range highlights\n let isRangeSet = this.localStartDate && this.localEndDate,\n isDateInRange = isRangeSet\n && this.localStartDate !== undefined\n && this.localEndDate !== undefined\n && (date >= this.localStartDate)\n && (date <= this.localEndDate);\n if (isDateInRange) {\n classes.push('in-range');\n }\n if (isDateInRange || (!isRangeSet && this.localStartDate)) {\n if (this.dateUtil.sameDay(date, this.localStartDate)) {\n classes.push('start-date');\n }\n }\n if (isDateInRange || (!isRangeSet && this.localEndDate)) {\n if (this.dateUtil.sameDay(date, this.localEndDate)) {\n classes.push('end-date');\n }\n }\n return [selectable, classes.join(' ')];\n }\n };\n\n element.datepicker(options);\n return element.datepicker.bind(element);\n\n }\n\n private setRange() {\n this.startDate = this.dateUtil.serialiseDate(this.localStartDate);\n this.endDate = this.dateUtil.serialiseDate(this.localEndDate);\n }\n\n open (): void {\n if (this.datePicker == null) {\n // create the datepicker if has not been previously opened\n this.datePicker = this.applyDatePicker(this.elements.datepickerEl);\n }\n // ensure the datepicker reflects our model\n this.localStartDate = this.dateUtil.parseDate(this.startDate);\n this.localEndDate = this.oneWay ? undefined : this.dateUtil.parseDate(this.endDate);\n this.nextDateToSet = 'start';\n this.datePicker('option', 'minDate', this.dateUtil.parseDate(this.minDate));\n this.datePicker('option', 'maxDate', this.dateUtil.parseDate(this.maxDate));\n\n // set the start date to invoke \"beforeShowDay\" and highlight the initial date range\n this.datePicker('setDate', this.localStartDate);\n\n this.animationUtil.lockScroll();\n this.elements.overlay.addClass('fade-in');\n\n this.html.on('keyup.datetangepicker', (event) => {\n // ESCAPE to close\n if (event.which === 27 && this.show) {\n this.$scope.$apply(() => {\n this.closeClicked(null);\n });\n }\n });\n }\n\n close (): void {\n this.animationUtil.restoreScroll();\n this.elements.overlay.removeClass('fade-in');\n this.html.off('keyup.datetangepicker');\n }\n\n closeClicked (event): void {\n if ( event ) {\n event.preventDefault();\n }\n this.show = false;\n $(window).unbind('resize');\n }\n\n private resetShadowDates(): void {\n this.shadowStartDate = undefined;\n this.shadowEndDate = undefined;\n this.highlightShadowDates();\n }\n\n public resetRange(event) {\n event.preventDefault();\n this.localStartDate = undefined;\n this.localEndDate = undefined;\n this.setRange();\n this.nextDateToSet = 'start';\n this.duration = 0;\n this.datePicker('setDate', null);\n }\n }\n\n angular\n .module('search')\n .directive('dateRangePicker', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: DateRangePicker,\n controllerAs: 'drp',\n bindToController: {\n startDate: '=',\n endDate: '=',\n minDate: '=',\n maxDate: '=',\n enabledDates: '=',\n select: '&',\n show: '=',\n durations: '=',\n oneWay: '=',\n },\n templateUrl: 'partials/search/daterangepicker',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : DateRangePicker\n ) => {\n const elements = {\n overlay: el,\n stage: el.find('.date-range-picker'),\n datepickerEl: el.find('.datepicker-parent')\n };\n controller.init(elements);\n }\n };\n });\n};\n","'use strict';\n\nnamespace Search {\n\n class DurationPicker {\n\n // Attr\n duration: number;\n select: () => void;\n show: boolean;\n\n private elements: any;\n\n private eventNamespace = 'durationpicker';\n private options: number[] = [3, 4, 7, 10, 14, 21];\n private html: JQuery;\n\n constructor (\n private $scope: ng.IScope,\n private $timeout: ng.ITimeoutService,\n private animationUtil: any\n ) {\n this.html = $('html');\n }\n\n init (elements): void {\n this.elements = elements;\n\n this.$scope.$watch('dp.show', (val) => {\n if (val != null) {\n if (val) {\n this.open();\n } else {\n this.close();\n }\n }\n });\n\n // close if overlay is clicked\n this.elements.overlay.on('click.' + this.eventNamespace, (event) => {\n this.$scope.$apply(() => {\n this.show = false;\n });\n });\n\n this.elements.durationPicker.on('click.' + this.eventNamespace, (event) => {\n event.stopPropagation();\n });\n\n this.$scope.$on('$destroy', () => {\n // unbind event listeners by namespace\n this.elements.overlay.off('.' + this.eventNamespace);\n this.elements.durationPicker.off('.' + this.eventNamespace);\n this.html.off('.' + this.eventNamespace);\n });\n\n }\n\n public selectDuration(duration: number) {\n // set the model\n this.duration = duration;\n this.$timeout(() => {\n // timeout allows model to update\n this.select();\n });\n }\n\n private open(): void {\n this.animationUtil.lockScroll();\n this.elements.overlay\n .addClass('fade-in')\n .removeClass('fade-out');\n\n this.html.on('keyup.' + this.eventNamespace, (event) => {\n // ESCAPE to close\n if (event.which === 27 && this.show) {\n this.$scope.$apply(() => {\n this.show = false;\n });\n }\n });\n }\n\n private close(): void {\n this.elements.overlay\n .addClass('fade-out')\n .removeClass('fade-in');\n this.html.off('.' + this.eventNamespace);\n }\n\n }\n\n angular\n .module('search')\n .directive('durationPicker', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: DurationPicker,\n controllerAs: 'dp',\n bindToController: {\n duration: '=',\n select: '&',\n show: '='\n },\n templateUrl: 'partials/search/durationpicker',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : DurationPicker\n ) => {\n const elements = {\n overlay: el,\n durationPicker: el.find('.duration-picker')\n };\n controller.init(elements);\n }\n };\n });\n\n\n}\n","'use strict';\n/*\n Handles focus on search unit on small screens\n*/\nnamespace TR {\n\n class ErrorFocusHandler {\n\n constructor (\n private $scope,\n private $element,\n private $window\n ) {\n $scope.$on('flash:error', (ev, msg) => {\n if (msg) {\n const header = $('#navbarcont');\n if ( header ) {\n const targetHeight = $element.offset().top - header.outerHeight();\n if ($window.scrollY > targetHeight) {\n $window.scrollTo(0, targetHeight);\n }\n }\n }\n });\n }\n\n }\n\n angular\n .module('TR')\n .directive('errorFocusHandler', (): ng.IDirective => {\n return {\n restrict: 'A',\n controller: ErrorFocusHandler,\n controllerAs: 'ef',\n };\n });\n}\n","'use strict';\n\nmodule Search {\n\n class InputWithIcon {\n\n // Attr\n iconName: string;\n addToggle: boolean;\n\n private eventNamespace = 'inputwithicon';\n private active: boolean = false;\n private wrapper: JQuery;\n\n constructor (\n private $scope: ng.IScope\n ) {\n }\n\n init (el: JQuery): void {\n\n let input = el.find('input');\n\n //this.iconName && el.addClass('icon-' + this.iconName);\n this.addToggle && el.addClass('toggle');\n\n if (this.iconName) {\n el.prepend('<span class=\"field-icon icon-' + this.iconName + '\"></span>');\n }\n\n input.on('focus.' + this.eventNamespace, () => {\n this.$scope.$apply(() => {\n el.addClass('with-focus');\n });\n }).on('blur.' + this.eventNamespace, () => {\n this.$scope.$apply(() => {\n el.removeClass('with-focus');\n });\n });\n\n this.$scope.$on('$destroy', () => {\n // unbind event listeners by namespace\n input.off('.' + this.eventNamespace);\n });\n\n }\n }\n\n angular\n .module('search')\n .directive('inputWithIcon', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n transclude: true,\n template: `<div class=\"input-with-icon\" \n ng-class=\"{'no-icon': iwi.iconName === ''}\" ng-transclude />`,\n controller: InputWithIcon,\n controllerAs: 'iwi',\n bindToController: {\n iconName: '@',\n addToggle: '='\n },\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : InputWithIcon\n ) => {\n controller.init(el);\n }\n };\n });\n\n\n}\n","/* tslint:disable:max-line-length */\n/// <reference path='../../core/services/resource.service.ts'/>\n\nnamespace Search {\n\n class IntegratedSearchTab {\n constructor(\n public searchType: UnifiedSearchType,\n public tabPanel: string,\n public titleResource: string,\n public icons: string[]\n ){\n }\n isVisible: boolean;\n href: string;\n }\n\n class IntegratedSearch {\n\n // Attr\n includedTabs: UnifiedSearchType[];\n preselectTab: string;\n hiddenQueryString: string;\n fid: string;\n trackDefaultParameters: string;\n clearFormInAgentMode: string;\n overrideAllowNoDatesYet: string;\n isFlexibleTripType: boolean;\n disableResetOptions;\n\n // Private\n tabs: IntegratedSearchTab[] = [];\n searchType: UnifiedSearchType;\n tabPanel: string;\n\n constructor (\n private $route: ng.route.IRouteService,\n private $scope,\n private $q,\n private searchUnitService: SearchUnitService\n ) {\n\n this.prepareTabs();\n // select the initial tab\n $q.when(\n this.preselectTab\n ? parseInt(this.preselectTab, 10) as UnifiedSearchType\n : this.searchUnitService.getLastSearchType()\n ).then(result => {\n this.searchType = result || UnifiedSearchType.Holidays; // todo: this should use a \"default search type\" config setting\n this.tabPanel = this.getTabPanel(this.searchType);\n //select the first supported tab by default;\n if (!this.tabPanel) {\n this.searchType = this.tabs[0].searchType;\n this.tabPanel = this.getTabPanel(this.searchType);\n }\n });\n\n if(!TRPCONFIG.Domain.NoDatesYetEnabled) {\n this.overrideAllowNoDatesYet = 'false';\n }\n };\n\n getClearForm() {\n return !!(TRPCONFIG.Domain.isAgentMode && this.clearFormInAgentMode === 'true');\n }\n\n selectTab(tab: IntegratedSearchTab): void {\n if (!tab.href) {\n this.searchType = tab.searchType;\n this.tabPanel = tab.tabPanel;\n }\n };\n\n prepareTabs(): void {\n let push = tab => {\n let isSupported = _.filter(TRPCONFIG.Domain.SupportedProductNames, t => t === UnifiedSearchType[tab.searchType]).length;\n if (isSupported) {\n tab.isVisible = !this.includedTabs || this.includedTabs.indexOf(tab.searchType) > -1;\n this.tabs.push(tab);\n }\n };\n\n push(new IntegratedSearchTab(UnifiedSearchType.Holidays, 'unified', 'SEARCHUNITTITLEHOLIDAYS', ['flights', 'hotels']));\n push(new IntegratedSearchTab(UnifiedSearchType.HolidayDeals, 'holidaydeals', 'MENUDEALS', ['sun']));\n push(new IntegratedSearchTab(UnifiedSearchType.Hotels, 'unified', 'SEARCHUNITTITLEHOTELS', ['hotels']));\n push(new IntegratedSearchTab(UnifiedSearchType.Flights, 'unified', 'SEARCHUNITTITLEFLIGHTS', ['flights']));\n push(new IntegratedSearchTab(UnifiedSearchType.Transfers, 'transfers', 'SEARCHUNITTITLETRANSFERS', ['transfers']));\n let cruiseTab = new IntegratedSearchTab(UnifiedSearchType.Cruises, 'cruises', 'SEARCHUNITTITLECRUISES', ['cruise']);\n cruiseTab.href = `${TRPCONFIG.Domain.CruiseRootUrl}/?utm_source=Cruise%20Button&utm_medium=TR%20Homepage&utm_campaign=Travel%20Republic%20Cruise%20Button`;\n push(cruiseTab);\n push(new IntegratedSearchTab(UnifiedSearchType.Marhaba, 'marhaba', 'MARHABA', ['marhaba-outline']));\n push(new IntegratedSearchTab(UnifiedSearchType.Insurance, 'insurance', 'INSURANCE', ['insurance']));\n }\n\n getTabPanel(searchType: UnifiedSearchType): string {\n let tab = _.find(this.tabs, { searchType: searchType });\n return tab && tab.tabPanel;\n }\n }\n\n angular\n .module('search')\n .directive('integratedSearch', (): ng.IDirective => {\n return {\n scope: {},\n controller: IntegratedSearch,\n controllerAs: 'is',\n bindToController: {\n preselectTab: '@',\n includedTabs: '=?',\n hiddenQueryString: '@',\n fid: '@',\n trackDefaultParameters: '@',\n clearFormInAgentMode: '@',\n overrideAllowNoDatesYet: '@',\n isFlexibleTripType: '=?',\n disableResetOptions: '@?'\n },\n templateUrl: 'partials/search/integratedsearch',\n replace: true,\n restrict: 'E'\n };\n });\n}\n","'use strict';\n\nnamespace Search {\n\n class OccupancyPicker {\n\n // bound attributes\n model: SearchOccupancy[];\n maxRooms: number;\n maxAdults: number;\n maxChildren: number;\n maxChildAge: number;\n maxAdultsInAdditionalRooms: number;\n maxChildrenInAdditionalRooms: number;\n select: () => void;\n show: boolean;\n\n // local variables\n private localModel: SearchOccupancy[];\n private children: number;\n private invalid: boolean = false;\n\n private ranges: any = {\n rooms: [],\n childAges: [],\n adults: [],\n children: [],\n adultsInAdditionalRooms: [],\n childrenInAdditionalRooms: []\n };\n\n private elements: any;\n private eventNamespace = 'occupancypicker';\n private html: JQuery;\n\n constructor (\n private $scope: ng.IScope,\n private $route: ng.route.IRouteService,\n private $timeout: ng.ITimeoutService,\n private animationUtil: any,\n private unifiedSearchService: any\n ) {\n this.html = $('html');\n }\n\n init (elements): void {\n this.elements = elements;\n\n this.$scope.$watch('op.show', (val) => {\n if (val != null) {\n if (val) {\n this.open();\n } else {\n this.close();\n }\n }\n });\n\n this.$scope.$watch('op.localModel', (val) => {\n if (val) {\n // sanity check each room and sum children\n this.children = 0;\n _.each(val, (room: SearchOccupancy, index: any) => {\n room = room || new SearchOccupancy;\n room.ChildAges = room.ChildAges || [];\n room.Adults = room.Adults || 2;\n val[index] = room;\n\n this.children += room.ChildAges.length;\n });\n // assume we are no longer invalid\n this.invalid = false;\n }\n }, true);\n\n this.$scope.$on('$destroy', () => {\n // unbind event listeners by namespace\n this.elements.overlay.off('.' + this.eventNamespace);\n this.elements.occupancyPicker.off('.' + this.eventNamespace);\n this.html.off('.' + this.eventNamespace);\n });\n\n }\n\n private open(): void {\n // ensure that numerical ranges are consistent with the current parameter attribues\n this.setRanges();\n\n // create a local copy of our model\n this.localModel = _.cloneDeep(this.model);\n\n this.checkRooms();\n\n this.animationUtil.lockScroll();\n this.elements.overlay.addClass('fade-in');\n\n this.html.on('keyup.' + this.eventNamespace, (event) => {\n // ESCAPE to close\n if (event.which === 27 && this.show) {\n this.$scope.$apply(() => {\n this.show = false;\n });\n }\n });\n\n // close if overlay is clicked\n this.elements.overlay.on('click.'+this.eventNamespace, (event) => {\n this.$scope.$apply(() => this.closeClicked(null) );\n });\n\n this.elements.stage.on('click.'+this.eventNamespace, (event) => event.stopPropagation() );\n }\n\n private checkRooms(): void {\n if (this.maxRooms === 0 && this.localModel.length > 1) {\n // we need to reduce the occupancy array to a single room, summing values therein\n let mergedRoom = new SearchOccupancy;\n mergedRoom.Adults = 0;\n mergedRoom = _.reduce(this.localModel, merge, mergedRoom);\n this.localModel = [mergedRoom];\n }\n function merge(memo: SearchOccupancy, next: SearchOccupancy) {\n memo.Adults += next.Adults;\n memo.ChildAges = memo.ChildAges.concat(next.ChildAges);\n return memo;\n }\n }\n\n private setRanges(): void {\n this.ranges.rooms = _.range(1, this.maxRooms + 1);\n this.ranges.adults = _.range(1, this.maxAdults + 1);\n this.ranges.adultsInAdditionalRooms = _.range(1, this.maxAdultsInAdditionalRooms + 1);\n this.ranges.children = _.range(0, this.maxChildren + 1);\n this.ranges.childrenInAdditionalRooms = _.range(0, this.maxChildrenInAdditionalRooms + 1);\n this.ranges.childAges = _.range(0, this.maxChildAge + 1);\n }\n\n public getAdultsPerRoom(index: number): number[] {\n return index === 0 ? this.ranges.adults : this.ranges.adultsInAdditionalRooms;\n }\n\n public getChidrenPerRoom(index: number): number[] {\n return index === 0 ? this.ranges.children : this.ranges.childrenInAdditionalRooms;\n }\n\n private close(): void {\n this.animationUtil.restoreScroll();\n this.elements.overlay.removeClass('fade-in');\n this.html.off('.' + this.eventNamespace);\n }\n\n public closeClicked (event): void {\n if ( event ) {\n event.preventDefault();\n }\n this.show = false;\n $(window).unbind('resize');\n }\n\n public done(): void {\n // validate\n if (!this.unifiedSearchService.validateOccupancy(this.localModel)) {\n this.invalid = true;\n return;\n }\n\n // apply changes from our local model to the true model\n this.model = _.cloneDeep(this.localModel);\n\n this.$timeout(() => {\n this.show = false;\n });\n }\n\n public addRoom($event): void {\n // required to prevent unexpected scrolling\n $event.stopPropagation();\n $event.preventDefault();\n this.localModel.push(new SearchOccupancy);\n }\n\n public removeRoom(index: number, $event): void {\n $event.stopPropagation();\n $event.preventDefault();\n this.localModel.splice(index, 1);\n }\n\n }\n\n angular\n .module('search')\n .directive('occupancyPicker', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: OccupancyPicker,\n controllerAs: 'op',\n bindToController: {\n model: '=',\n maxRooms: '=',\n maxAdults: '=',\n maxChildren: '=',\n maxChildAge: '=',\n maxAdultsInAdditionalRooms: '=',\n maxChildrenInAdditionalRooms: '=',\n select: '&',\n show: '='\n },\n templateUrl: 'partials/search/occupancypicker',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller : OccupancyPicker\n ) => {\n const stage = el.find('.occupancy-picker');\n const elements = {\n overlay: el,\n stage,\n occupancyPicker: stage\n };\n controller.init(elements);\n }\n };\n });\n\n\n}\n","/* tslint:disable:max-line-length */\n/// <reference path='../../core/services/resource.service.ts'/>\n/// <reference path='../../core/services/resource.service.ts'/>\n\nnamespace Search {\n class Tab {\n maxAge: number;\n multiRoomDisabled: boolean;\n constructor(\n public id: number,\n public type: UnifiedSearchType | null,\n public name: string,\n options?\n ){\n angular.extend(this, options);\n }\n }\n\n class Search {\n tab: Tab;\n tabs:any = {\n 1: new Tab(1, UnifiedSearchType.Holidays, 'holidays', { maxAge: TRPCONFIG.Domain.MaxChildAgeForHolidays }),\n 2: new Tab(2, UnifiedSearchType.Hotels, 'hotels'),\n 3: new Tab(3, UnifiedSearchType.Flights, 'flights', { maxAge: TRPCONFIG.Domain.MaxChildAgeForFlights, multiRoomDisabled: true }),\n 4: new Tab(4, null, 'transfers', ''),\n 5: new Tab(5, null, 'cruises', ''),\n 6: new Tab(6, null, 'marhaba', ''),\n 7: new Tab(7, null, 'holidayDeals', ''),\n 8: new Tab(8, null, 'insurance', '')\n };\n model: UnifiedSearchModel;\n allowNoDatesYet = true;\n overrideAllowNoDatesYet;\n currencyOptions = TRPCONFIG.Domain.CurrencyOptions.split('|');\n cabins;\n userSession: any = sessionStorage.getItem('scope.user');\n bookingRef: any = this.bookingInfo(this.userSession);\n enabledDates;\n preselectTab: string;\n showTabs: boolean;\n includedTabIds: number[];\n supportedTabIds: any;\n fid: string;\n clearFormInAgentMode: string;\n hiddenQueryString: string;\n airlines: Airline[];\n expandedOptions = false;\n trackDefaultParameters: string;\n isFlexibleTripType: boolean;\n disableResetOptions;\n searchOpened = false;\n\n constructor (\n private $route: ng.route.IRouteService,\n private $q: ng.IQService,\n private broker: Core.Broker,\n private searchUnitService: SearchUnitService,\n private unifiedSearchService: UnifiedSearchService,\n private $scope,\n private destinationService,\n private searchQueryString: SearchQueryString,\n private $timeout: ng.ITimeoutService,\n private preferences,\n private $locale: any\n ) {\n if (TRPCONFIG.Domain.PassThroughSearchToIntegratedSearch) {\n return;\n }\n\n this.checksigninstatus();\n\n this.model = this.unifiedSearchService.getDefaultModel();\n this.cabins = searchUnitService.getCabinOptions();\n\n this.updateNoDatesYet();\n this.airlines = searchQueryString.allAirlines;\n\n this.supportedTabIds = _.chain(TRPCONFIG.Domain.SupportedProductNames)\n .map(name => this.findTabId(name))\n .filter(tabId => !!tabId)\n .value();\n\n let intersection =\n this.includedTabIds ? _.intersection(this.supportedTabIds, this.includedTabIds) : this.supportedTabIds;\n this.showTabs = intersection.length > 1;\n\n let tabIdToSelect = this.getPreselectTabId();\n\n this.selectTab(tabIdToSelect);\n\n const clearForm = TRPCONFIG.Domain.isAgentMode && this.clearFormInAgentMode === 'true';\n if (!clearForm) {\n this.unifiedSearchService.getQueryStringValues(this.hiddenQueryString).then(queryStringValues => {\n this.unifiedSearchService\n .prepopulateModel(this.model, queryStringValues);\n\n this.expandedOptions = (() => {\n if (!angular.isUndefined(queryStringValues.expandedOptions)) {\n return queryStringValues.expandedOptions;\n }\n if (TRPCONFIG.Domain.PrefilterAirlineEnabled && this.model.airlines && this.model.airlines.length) {\n return true;\n }\n if (TRPCONFIG.Domain.PrefilterDirectFlightsEnabled && this.model.prefilterDirectFlights) {\n return true;\n }\n return false;\n })();\n\n if (queryStringValues.autoSearch) {\n if ( queryStringValues.sortOrder ) {\n this.preferences.setHotelSortOrder( parseInt(queryStringValues.sortOrder,10) );\n }\n this.$timeout(() => this.search(true), 1000);\n }\n });\n }\n\n this.$scope.$watchCollection(() => this.model.destination, val => {\n //Ensure that destination is always an array.\n if (val && angular.isUndefined(val.length)) {\n val = this.model.destination = [val];\n }\n\n if (val && val[0]) {\n //This call mutates the destination:\n this.destinationService.getDetails(val[0]).then(dest => {\n broker.publish('destinationChanged', dest);\n this.loadOutboundDates(this.model.airports, dest);\n });\n }\n let searchLookupType = val && val[0] && val[0].searchLookupType;\n this.updateNoDatesYet(searchLookupType);\n });\n\n this.$scope.$watchCollection(() => this.model.airports,\n val => this.loadOutboundDates(val, this.model.destination));\n\n if(!_.isEmpty(TRPCONFIG.Domain.FixedDepartureAirportOptions)) {\n this.broker.subscribe('holidaySearch', 'departureAirportsChanged', (v) => {\n\n let currentAirports = this.model.airports.reduce((acc, airport) => {\n return acc[airport.Code] = airport;\n }, {});\n let updatedAirports = v.data.Code.split(',').map(code => currentAirports[code] || ({Code: code}));\n this.model.airports = updatedAirports;\n });\n }\n\n this.broker.subscribe('holidaySearch', 'RegionalContextSelected', () => {\n //reset the preferences when switching between POS\n this.model.airports = [];\n this.unifiedSearchService.saveSearchModel(this.model);\n });\n };\n\n checksigninstatus(): any {\n let user = sessionStorage.getItem('scope.user');\n if (!user) {\n (document.querySelector('.myb-search-signout') as HTMLInputElement).style.display = 'none';\n (document.querySelector('.myb-search-signin') as HTMLInputElement).style.display = 'block';\n } else {\n (document.querySelector('.myb-search-signout') as HTMLInputElement).style.display = 'block';\n (document.querySelector('.myb-search-signin') as HTMLInputElement).style.display = 'none';\n }\n }\n\n bookingInfo(session): any {\n session = JSON.parse(session);\n if (session) {\n return session.BookingSummary.BookingRef;\n }\n }\n\n selectTab(tabId: number): void {\n this.$scope.$broadcast('flash:hide');\n this.tab = this.tabs[tabId];\n if(this.$route.current && this.$route.current['$$route']) {\n this.$route.current['$$route'].area = this.tab.name;\n }\n this.loadOutboundDates(this.model.airports, this.model.destination);\n };\n\n includeTab(tabId: number): boolean {\n const isIncluded = !this.includedTabIds || !this.includedTabIds.length || this.includedTabIds.indexOf(tabId) >= 0,\n isSupported = !this.supportedTabIds || !this.supportedTabIds.length || this.supportedTabIds.indexOf(tabId) >= 0;\n return isIncluded && isSupported;\n }\n\n private getPreselectTabId(): number {\n let tabId = this.findTabId(this.preselectTab);\n if (tabId && this.includeTab(tabId)) {\n return tabId;\n }\n return _.find(this.tabs, (t:Tab) => this.includeTab(t.id)).id;\n }\n\n private findTabId(tabNameOrNumber: string): number | undefined {\n if (!tabNameOrNumber) {\n return;\n }\n let tabId = parseInt(tabNameOrNumber, 10);\n if (tabId > 0 && this.tabs[tabId]) {\n return tabId;\n }\n tabNameOrNumber = (tabNameOrNumber + '').toLowerCase();\n let tab = _.find(this.tabs, (t: any) => t.name.toLowerCase() === tabNameOrNumber);\n if (tab) {\n return tab.id;\n }\n }\n\n private updateNoDatesYet(searchLookupType?: string) {\n if (this.overrideAllowNoDatesYet) {\n this.allowNoDatesYet = this.overrideAllowNoDatesYet === 'true';\n } else {\n this.allowNoDatesYet = !searchLookupType || searchLookupType === 'hotels';\n }\n if (!this.allowNoDatesYet) {\n this.model.noDatesYet = false;\n }\n }\n\n checkScreensize() {\n let searchPanel = document.querySelectorAll('.ekh-search-panel')[0];\n if (window.innerWidth <= 880 && this.searchOpened === false) {\n searchPanel.classList.add('panel-hide');\n } else {\n searchPanel.classList.remove('panel-hide');\n }\n }\n\n displaySearch() {\n let isMobile = TRPCONFIG.IsMobileView;\n\n if(!isMobile) {\n let t = this;\n window.addEventListener('resize', function(){\n t.checkScreensize();\n });\n }\n\n this.checkScreensize();\n }\n\n toggleSearch() {\n this.searchOpened = this.searchOpened ? false : true;\n let searchClasses = document.querySelectorAll('.ekh-search-panel')[0].classList;\n searchClasses.toggle('panel-hide');\n }\n\n convertDateToISO(date, shortMonth) {\n let d = date.split('-');\n let month;\n shortMonth.map((v, i) => {\n if (d[1] === v) {\n let m = i+1;\n if (m < 10) {\n month = `0${m}`;\n } else {\n month = m.toString();\n }\n }\n });\n let convertedDate = `${d[2]}-${month}-${d[0]}T00:00:00.000Z`;\n return convertedDate;\n }\n\n search(isAutoSearch: boolean) {\n sessionStorage.removeItem('FlightMiles');\n sessionStorage.removeItem('baseCost');\n sessionStorage.removeItem('flightFare');\n sessionStorage.removeItem('SkywardsMiles');\n sessionStorage.removeItem('SkywardsMilesFlights');\n sessionStorage.removeItem('FlightPerPersonMiles');\n sessionStorage.removeItem('BrandedFareDetailsSessionId');\n sessionStorage.removeItem('chargeDates');\n TRPCONFIG.Domain.FlightMiles = '';\n TRPCONFIG.Domain.SkywardsInfo = '';\n TRPCONFIG.Domain.SkywardsFlightMiles = '';\n TRPCONFIG.Domain.BrandedFareCancellations = '';\n TRPCONFIG.Domain.CancellationData = '';\n TRPCONFIG.Domain.TransferPrice = 0;\n\n let start = (document.getElementsByClassName('searchDates')[0] as HTMLInputElement).value;\n let end = (document.getElementsByClassName('searchDates')[1] as HTMLInputElement).value;\n let searchData = {\n ISOstartDate: start ? this.convertDateToISO(start, this.$locale.DATETIME_FORMATS.SHORTMONTH) : '',\n ISOendDate: end ? this.convertDateToISO(end, this.$locale.DATETIME_FORMATS.SHORTMONTH) : '',\n startDate: start,\n endDate: end\n };\n\n sessionStorage.setItem('searchDates', JSON.stringify(searchData));\n return this.destinationService.getDetails(this.model.destination[0]).then(dest => {\n return this.loadOutboundDates(this.model.airports, dest).then(() => dest);\n }).then(dest => {\n //creating a copy of the model to use to run a search.\n const destination = _.assign({}, this.model.destination[0], dest);\n const model = <UnifiedSearchModel>_.assign(<UnifiedSearchModel>{}, this.model, {destination: [destination]});\n\n return this.unifiedSearchService.launchSearch(model,\n this.tab.type || UnifiedSearchType.Holidays,\n this.fid,\n !isAutoSearch,\n false,\n false\n );\n });\n };\n\n loadOutboundDates(airports, destination) {\n const getRequest = () => {\n if (this.tab.id !== 1 && this.tab.id !== 3) {\n return this.$q.when(null);\n }\n if (!airports || !airports.length) {\n return this.$q.when(null);\n }\n let DepartureAirportCodes = _.map(airports, (a: any) => a.Code);\n\n destination = destination && destination[0] || destination;\n let codes = destination && (destination.Code || destination.DestinationAirports);\n let DestinationAirportCodes = codes && codes.split(',');\n if (DestinationAirportCodes && DestinationAirportCodes.length) {\n return this.$q.when({\n DepartureAirportCodes,\n DestinationAirportCodes\n });\n }\n\n return this.$q.when(null);\n };\n return getRequest()\n .then(r => this.searchUnitService.loadOutboundDates(r))\n .then(outboundDates => {\n this.enabledDates = outboundDates;\n });\n }\n\n }\n\n angular\n .module('search')\n .directive('search', (): ng.IDirective => {\n return {\n scope: {},\n controller: Search,\n controllerAs: 'search',\n bindToController: {\n moreOptions: '=',\n preselectTab: '@',\n overrideAllowNoDatesYet: '@',\n includedTabIds: '=?',\n fid: '=?',\n clearFormInAgentMode: '@',\n hiddenQueryString: '@',\n trackDefaultParameters: '@',\n resetDuration: '=?',\n isFlexibleTripType: '=?',\n disableResetOptions: '@?'\n },\n templateUrl: TRPCONFIG.Domain.PassThroughSearchToIntegratedSearch\n || new RegExp(/[a-z]{3,4}:[a-z]{3,4}/g).test(TRPCONFIG.Domain.RedirectTemplates)\n ? 'partials/search/integrated'\n : 'partials/search/search',\n replace: true,\n restrict: 'E',\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class SelectBoxItem {\n element: JQuery;\n index: number;\n value: string;\n label: string;\n disabled: boolean;\n }\n\n let selectBoxItemId: number = 0;\n\n class SelectBox {\n\n // Attrs\n private model: any;\n private labelText: string;\n private iconName: string;\n\n // elements\n private element: JQuery;\n private wrapper: JQuery;\n private button: JQuery;\n private buttonText: JQuery;\n private menu: JQuery;\n private menuItems: JQuery;\n\n // data\n private selectBoxItems: SelectBoxItem[];\n private eventNamespace = 'selectbox';\n private ids: any;\n private isOpen: boolean = false;\n private isMenuRendered: boolean = false;\n private previousFilter: string;\n private filterTimer: any;\n\n private buttonEvents = {\n 'click': (event) => {\n this.toggle(event);\n },\n 'keydown': (event) => {\n let preventDefault = true;\n switch (event.keyCode) {\n // Tab / Escape\n case 9:\n case 27:\n this.close();\n preventDefault = false;\n break;\n // Enter\n case 13:\n this.toggle(event);\n break;\n // Up\n case 38:\n if (event.altKey) {\n this.toggle(event);\n } else {\n this.move('prev', event);\n }\n break;\n // Down\n case 40:\n if (event.altKey) {\n this.toggle(event);\n } else {\n this.move('next', event);\n }\n break;\n // Home / Page Up\n case 36:\n case 33:\n this.move('first', event);\n break;\n // End / Page Down\n case 35:\n case 34:\n this.move('last', event);\n break;\n default:\n\n const prev: string = this.previousFilter || '';\n let skip: boolean = false;\n\n // Support number pad values\n let character: string = event.keyCode >= 96 && event.keyCode <= 105 ?\n (event.keyCode - 96).toString() : String.fromCharCode(event.keyCode);\n\n clearTimeout(this.filterTimer);\n\n if (character === prev) {\n skip = true;\n } else {\n character = prev + character;\n }\n\n let matching: SelectBoxItem[] = this.filterMenuItems(character);\n\n //match = skip && match.index(this.active.next()) !== -1 ?\n // this.active.nextAll( \".ui-menu-item\" ) : match;\n\n // If no matches on the current filter, reset to the last character pressed\n // to move down the menu to the first item that starts with that character\n if (!matching.length) {\n character = String.fromCharCode(event.keyCode);\n matching = this.filterMenuItems(character);\n }\n\n if (matching.length) {\n const match: SelectBoxItem = matching[0];\n this.select(match);\n this.previousFilter = character;\n\n this.filterTimer = setTimeout(() => {\n delete this.previousFilter;\n }, 1000);\n\n } else {\n delete this.previousFilter;\n }\n\n //this.menu.trigger(event);\n preventDefault = false;\n }\n preventDefault && event.preventDefault();\n }\n };\n\n private menuEvents = {\n 'mousedown': (event) => {\n // Prevent the menu from recieving focus. We want to retain focus on the button.\n event.preventDefault();\n const menuItem = $(event.currentTarget);\n this.select(menuItem.data('SelectBoxItem'));\n this.close();\n },\n 'mouseover': (event) => {\n const menuItem = $(event.currentTarget);\n this.setActiveItem(menuItem);\n }\n };\n\n constructor (\n private $scope: ng.IScope,\n private $document: ng.IAugmentedJQuery\n ) {\n }\n\n init (el, attrs): void {\n this.element = el;\n\n const id = this.element.attr('id');\n this.ids = {\n element: id,\n button: id + '-button',\n menu: id + '-menu'\n };\n\n this.drawWrapper();\n this.drawButton();\n this.drawMenu();\n\n // watch the model\n this.$scope.$watch('sb.model', (val, old) => {\n this.setButtonText();\n if (this.isMenuRendered) {\n this.setActiveItem(this.getSelectedMenuItem());\n }\n });\n\n this.$scope.$on('$destroy', () => {\n // unbind event listeners by namespace\n this.button.off('.' + this.eventNamespace);\n this.menu.off('.' + this.eventNamespace);\n });\n }\n\n private drawWrapper(): void {\n const div = $('<div>').addClass('select-box');\n this.element.wrap(div);\n this.wrapper = this.element.parent();\n }\n\n private drawButton(): void {\n // Hide the original select element\n this.element.hide();\n\n // Create new button\n this.button = $('<span>', {\n class: 'select-box-button',\n tabindex: 0,\n id: this.ids.button,\n role: 'combobox',\n 'aria-expanded': 'false',\n 'aria-autocomplete': 'list',\n 'aria-owns': this.ids.menu,\n 'aria-haspopup': 'true',\n title: this.element.attr('title')\n }).insertAfter(this.element);\n\n const label = $('<span>', {\n class: 'select-box-button-label'\n }).appendTo(this.button);\n\n // pre-text\n if (this.labelText) {\n $('<span>', {\n class: 'select-box-pre-text',\n text: this.labelText + ':'\n }).appendTo(label);\n }\n\n // dynamic text (matches selected option)\n this.buttonText = $('<span>', {\n class: 'select-box-text'\n }).appendTo(label);\n\n // // icon\n // if (this.iconName) {\n // $('<i>', {\n // class: 'select-box-icon icon-' + this.iconName\n // }).appendTo(this.button);\n // }\n\n // assign button event listeners\n _.forEach(this.buttonEvents, (handler, eventName) => {\n this.button.on(eventName + '.' + this.eventNamespace, handler);\n });\n this.button.one('focusin', () => {\n // Rendering the menu items when the button receives focus\n this.refreshMenu();\n });\n }\n\n private drawMenu(): void {\n // Create menu\n this.menu = $('<ul>', {\n 'aria-hidden': 'true',\n 'aria-labelledby': this.ids.button,\n id: this.ids.menu\n });\n\n const menuWrap = $('<div>', {\n class: 'select-box-menu'\n })\n .append(this.menu)\n .insertAfter(this.button);\n\n // assign menu event listeners\n _.forEach(this.menuEvents, (handler, eventName) => {\n this.menu.on(eventName + '.' + this.eventNamespace, '.select-box-option', handler);\n });\n }\n\n public toggle(event): void {\n if(this.isOpen) {\n this.close();\n } else {\n this.open(event);\n }\n }\n\n public open(event): void {\n this.isOpen = true;\n this.setOpen();\n\n this.setActiveItem(this.getSelectedMenuItem());\n\n // close if document is clicked\n this.$document.on('mousedown.' + this.eventNamespace, (event) => {\n if (!this.isOpen) {\n return;\n }\n if (!$(event.target).closest('.select-box-menu, #' + this.ids.button).length) {\n this.close();\n }\n });\n }\n\n public close(): void {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n this.setOpen();\n this.$document.off('.' + this.eventNamespace);\n }\n\n private refreshMenu(): void {\n this.menu.empty();\n\n // get the native select options\n const options: JQuery = this.element.find('option');\n this.parseOptions(options);\n\n this.renderMenu(this.menu, this.selectBoxItems);\n this.menuItems = this.menu.find('.select-box-option');\n\n // set the active menu item\n const menuItem = this.getSelectedMenuItem();\n this.isMenuRendered = true;\n this.setActiveItem(menuItem);\n }\n\n private renderMenu(ul: JQuery, items: SelectBoxItem[]): void {\n _.each(items, (item, index) => {\n this.renderItem(ul, item);\n });\n }\n\n private renderItem(ul: JQuery, item: SelectBoxItem): void {\n selectBoxItemId += 1; // unique id across all instances\n\n // create new menu item\n let li: JQuery = $('<li>');\n let menuItem: JQuery = $('<div>', {\n id: 'select-box-option-' + selectBoxItemId,\n role: 'option',\n class: 'select-box-option'\n });\n\n // set text\n this.setText(menuItem, item.label);\n // tag data\n menuItem.data('SelectBoxItem', item);\n // append to menu\n li.append(menuItem).appendTo(ul);\n }\n\n private parseOptions(options: JQuery): void {\n let data:any = [];\n options.each((index, item) => {\n data.push(this.parseOption($(item), index));\n });\n this.selectBoxItems = data;\n }\n\n private parseOption(option: JQuery, index: number): any {\n let item = new SelectBoxItem;\n item.element = option;\n item.index = index;\n item.value = option.val();\n item.label = option.text();\n item.disabled = option.prop('disabled');\n return item;\n }\n\n private getSelectedMenuItem(): JQuery {\n // get the menu item corresponding to the native selected option\n return this.menuItems.eq((<HTMLSelectElement>this.element[0]).selectedIndex);\n }\n\n private setOpen(): void {\n this.button.attr('aria-expanded', String(this.isOpen));\n this.menu.attr('aria-hidden', String(!this.isOpen));\n if(this.isOpen) {\n this.wrapper.addClass('select-box-open');\n } else {\n this.wrapper.removeClass('select-box-open');\n }\n }\n\n private setText(element: JQuery, value): void {\n if (value) {\n element.text(value);\n } else {\n element.html(' ');\n }\n }\n\n private move(direction: string, event): void {\n const index: number = (<HTMLSelectElement>this.element[0]).selectedIndex;\n const current: JQuery = this.menuItems.eq(index);\n const filter: string = '.select-box-option';\n\n let nextIndex: any = undefined;\n\n switch (direction) {\n case 'prev':\n nextIndex = index - 1;\n break;\n case 'next':\n nextIndex = index + 1;\n break;\n case 'first':\n nextIndex = 0;\n break;\n case 'last':\n nextIndex = this.menuItems.length - 1;\n break;\n default:\n }\n\n if (nextIndex > -1 && nextIndex < (this.menuItems.length)) {\n const menuItem = this.menuItems.eq(nextIndex);\n this.select(menuItem.data('SelectBoxItem'));\n }\n }\n\n private setActiveItem(menuItem: JQuery): void {\n // highlight this menu item\n const className = 'select-box-option-active';\n this.menuItems.filter('.' + className).removeClass(className);\n menuItem.addClass(className);\n\n // set the focus index\n let selectBoxItem = menuItem.data('SelectBoxItem');\n\n this.setAriaActive(selectBoxItem);\n }\n\n private select(item: SelectBoxItem): void {\n // Change the native select element\n (<HTMLSelectElement>this.element[0]).selectedIndex = item.index;\n // let angular know that the select box has changed programattically\n // this will trigger the model update\n this.element.trigger('change');\n }\n\n private setAriaActive(item: SelectBoxItem): void {\n const id = this.menuItems.eq(item.index).attr('id');\n this.button.attr({\n 'aria-labelledby': id,\n 'aria-activedescendant': id\n } );\n this.menu.attr('aria-activedescendant', id);\n }\n\n private filterMenuItems(character: string): SelectBoxItem[] {\n const escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&' ),\n regex = new RegExp( '^' + escapedCharacter, 'i' );\n const matching = _.filter(this.selectBoxItems, (item: SelectBoxItem) => {\n return regex.test(item.label);\n });\n return matching;\n }\n\n private setButtonText(): void {\n // get the selected item from the native control\n const selectBoxItem = this.parseOption(\n this.element.find('option:selected'),\n (<HTMLSelectElement>this.element[0]).selectedIndex\n );\n // set the button text\n this.setText(this.buttonText, selectBoxItem.label);\n }\n\n }\n\n angular\n .module('core')\n .directive('selectBox', (): ng.IDirective => {\n return {\n restrict: 'A',\n scope: {},\n replace: true,\n controller: SelectBox,\n controllerAs: 'sb',\n bindToController: {\n model: '=ngModel',\n labelText: '@labelText',\n iconName: '@iconName'\n },\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attrs: ng.IAttributes,\n controller : SelectBox\n ) => {\n controller.init(el, attrs);\n }\n };\n });\n\n}\n","'use strict';\n\nnamespace Search {\n\n class UnifiedSearch {\n // Attr\n searchType: UnifiedSearchType;\n fid: string;\n hiddenQueryString: string;\n elements;\n trackDefaultParameters: string;\n clearForm: string;\n overrideAllowNoDatesYet: string;\n isFlexibleTripType: boolean;\n disableResetOptions;\n\n // data\n private model: UnifiedSearchModel;\n private enabledStartDates: any;\n private minStartDate: string;\n private cabinOptions: Cabin[];\n private currencyOptions: string[];\n private airlineOptions: Airline[];\n private durations: number[];\n private IsRebook: boolean;\n\n private areaName: string;\n private showDatePicker: boolean = false;\n private showOccupancyPicker: boolean = false;\n //private setFocusDestination: boolean = false;\n\n private occupancyConfig: OccupancyConfig;\n private occupancyCaption: string;\n\n private destinationLabel: string;\n private destinationPlaceholder: string;\n private searchTypeName: string;\n\n constructor (\n private $route: ng.route.IRouteService,\n private $routeParams: ng.route.IRouteParamsService,\n private $q: ng.IQService,\n private $scope,\n private broker: Core.Broker,\n private searchUnitService: SearchUnitService,\n private unifiedSearchService: UnifiedSearchService,\n private searchQueryString: SearchQueryString,\n private destinationService,\n private occupancyService: Core.OccupancyService,\n private holidayDeals,\n private dateUtil,\n private animationUtil,\n private $timeout: ng.ITimeoutService,\n private $location: ng.ILocationService\n ) {\n this.cabinOptions = searchUnitService.getCabinOptions();\n this.currencyOptions = searchUnitService.getCurrencyOptions();\n this.airlineOptions = searchQueryString.allAirlines;\n this.IsRebook = !!$routeParams.BookingRef;\n };\n\n init (elements): void {\n this.elements = elements;\n\n this.model = this.unifiedSearchService.getDefaultModel();\n\n this.setSearchType();\n\n // watch search type\n this.$scope.$watch('us.searchType', (val, old) => {\n if (val !== old) {\n this.setSearchType();\n }\n });\n\n this.$scope.$watchCollection('us.model.destination', _.debounce(val => {\n // Watch is debounced because autocompleter selection is causing two updates.\n if (val && val[0]) {\n // This call mutates the destination\n this.destinationService.getDetails(val[0]).then(dest => {\n if (this.searchType !== UnifiedSearchType.Hotels) {\n this.setEnabledStartDates(this.model.destination, this.model.airports);\n }\n });\n }\n this.setEnabledDurations();\n }, 200));\n\n this.$scope.$watchCollection('us.model.airports', val => {\n if (val && val[0]) {\n this.setEnabledStartDates(this.model.destination, this.model.airports);\n }\n });\n\n this.$scope.$watchCollection('us.model.occupancy', val => {\n if (val && val[0]) {\n this.occupancyCaption = this.occupancyService.getOccupancyString(val);\n }\n });\n\n this.$scope.$watchCollection('us.model.airlines', val => {\n if (val.length > 1 ) {\n // This search unit only supports a single airline\n // selection, so just keep the first option.\n this.model.airlines.splice(1, 1);\n }\n if (val[0] == null) {\n // This is result of selecting the \"All airlines\" option from\n // the select box control - just remove it.\n this.model.airlines.splice(0, 1);\n }\n });\n\n this.$scope.$watchGroup(['us.model.startDate', 'us.model.endDate'], ([startDate, endDate]) => {\n if (startDate && !endDate) {\n let index = 1;\n switch (this.searchType) {\n case UnifiedSearchType.Hotels:\n index = 0;\n break;\n case UnifiedSearchType.Transfers:\n index = 2;\n break;\n case UnifiedSearchType.Marhaba:\n index = 3;\n break;\n }\n this.searchUnitService.endDate(index, null);\n this.searchUnitService.startDate(index, startDate);\n this.model.endDate = this.searchUnitService.endDate(index);\n }\n });\n\n if (this.clearForm !== 'true') {\n // prepopulate the model\n this.unifiedSearchService.getQueryStringValues(this.hiddenQueryString).then(result => {\n let queryStringValues = result;\n this.unifiedSearchService\n .prepopulateModel(this.model, queryStringValues, this.disableResetOptions)\n .then(model => {\n if (queryStringValues.autoSearch) {\n this.$timeout(() => {\n this.search(true);\n this.clearParams();\n }, 1000);\n }\n });\n });\n }\n }\n\n private clearParams = () => {\n //cleardown query params - as otherwise params will override values search unit values when not necessary\n this.$location.replace()\n .search('startDate', null)\n .search('endDate', null)\n .search('depAir', null)\n .search('occ', null)\n .search('autoSearch', null)\n .search('cabin', null);\n }\n\n private setSearchType(): void {\n this.$scope.$broadcast('flash:hide');\n\n // get \"area\" associated with this search type\n this.areaName = this.unifiedSearchService.getAreaName(this.searchType);\n\n // get occupancy parameters\n this.occupancyConfig = this.searchUnitService.getOccupancyConfig(this.areaName);\n\n // get min start date for date range picker\n this.minStartDate = this.searchUnitService.getMinStartDate(this.areaName);\n\n if(this.$route.current && this.$route.current['$$route']) {\n this.$route.current['$$route'].area = this.areaName;\n }\n\n // set labels\n this.setLabels();\n\n this.setEnabledStartDates(this.model.destination, this.model.airports);\n }\n\n private setEnabledStartDates(destination: any[], departureAirports: any[]): ng.IPromise<any> {\n if (this.flightIncluded() && departureAirports[0] && destination[0]) {\n // get enabled dates\n let dest = destination[0];\n let DestinationAirportCodes = (dest.Code || dest.DestinationAirports || '').split(',');\n if (DestinationAirportCodes && DestinationAirportCodes.length) {\n let request = {\n DepartureAirportCodes: _.map(departureAirports, 'Code'),\n DestinationAirportCodes\n };\n return this.searchUnitService.loadOutboundDates(request)\n .then(dates => {\n this.enabledStartDates = dates;\n return dates;\n });\n }\n }\n this.enabledStartDates = undefined;\n return this.$q.when(null);\n }\n\n private setEnabledDurations(): void {\n // if (!this.model.destination[0]) {\n // // limit to holiday deal durations\n // this.durations = _.clone(this.holidayDeals.DURATIONS);\n // } else {\n // this.durations.length = 0;\n //}\n this.durations = [];\n }\n\n private setDuration(): void {\n let start = this.model.startDate,\n end = this.model.endDate;\n this.model.duration = start && end ? this.dateUtil.numberOfNights(start, end) : 0;\n }\n\n private setEndDate(): void {\n const d = this.model.duration;\n if (this.model.startDate && d && d > 0) {\n const start = this.dateUtil.parseDate(this.model.startDate);\n this.model.endDate = this.dateUtil.addDays(start, d, true);\n }\n }\n\n private setLabels(): void {\n this.destinationLabel = this.hotelIncluded() ?\n 'UNIFIEDSEARCHDESTINATIONLABEL' : 'UNIFIEDSEARCHDESTINATIONAIRPORTLABEL';\n\n this.destinationPlaceholder = this.hotelIncluded() ?\n 'UNIFIEDSEARCHDESTINATIONPLACEHOLDER' : 'UNIFIEDSEARCHDESTINATIONAIRPORTPLACEHOLDER';\n\n this.searchTypeName = this.unifiedSearchService.getAreaName(this.searchType);\n }\n\n public getHotelSearchButtonLabel(): string {\n return this.searchType === UnifiedSearchType.Hotels && this.model.noDatesYet ?\n 'FINDHOTELS' : 'SEARCHBUTTONTEXT';\n }\n\n public search(isAutoSearch?, isFlexibleTripType?): void {\n let dest;\n return this.destinationService.getDetails(this.model.destination[0])\n .then(d => {\n dest = d;\n if (this.searchType !== UnifiedSearchType.Hotels) {\n return this.setEnabledStartDates([dest], this.model.airports);\n }\n })\n .then(() => {\n //creating a copy of the model to use to run a search.\n const destination = _.assign({}, this.model.destination[0], dest);\n let modelCopy = <UnifiedSearchModel>_.assign(<UnifiedSearchModel>{}, this.model, {\n destination: [destination]\n });\n modelCopy.onewayonly = this.oneWayFlightIncluded() && this.model.onewayonly;\n this.unifiedSearchService.launchSearch(\n modelCopy,\n this.searchType,\n this.fid,\n !isAutoSearch,\n false,\n isFlexibleTripType\n );\n });\n }\n\n public reset(): void {\n // reset the search unit\n this.model = this.unifiedSearchService.getDefaultModel();\n }\n\n public selectDestination() {\n }\n\n public selectDateRange() {\n this.setDuration();\n this.showDatePicker = false;\n }\n\n public openDatePicker(event): void {\n this.showDatePicker = true;\n this.openPicker(event, $('.date-range-picker'), 12, 0);\n }\n public openOccupancyPicker(event): void {\n this.showOccupancyPicker = true;\n this.openPicker(event, $('.occupancy-picker'), -47, -(2*event.target.getBoundingClientRect().height)-15);\n }\n\n // common function for occupancyPicjer and DatePicker\n public openPicker(event, picker, adjust, pixelsForHeightExpand): void {\n\n if ( this.hotelOnly() ) {\n picker.addClass('hotelOnlyCalendar');\n } else {\n picker.removeClass('hotelOnlyCalendar');\n }\n picker.css( {\n 'opacity': '0'\n });\n\n setTimeout( function() {\n const winHeight = $(window).height();\n const evTop = event.target.getBoundingClientRect().top;\n const eventHeight = event.target.getBoundingClientRect().height;\n const evTopPlusWin = evTop + picker.outerHeight() + eventHeight +\n Math.abs(pixelsForHeightExpand);\n\n if ( evTopPlusWin > winHeight ) {\n let scrollAdjust = 0;\n if ( window.innerHeight > picker.outerHeight() ) {\n scrollAdjust = window.innerHeight - picker.outerHeight() -\n $('.integrated-search-unit').height();\n }\n scrollAdjust += pixelsForHeightExpand;\n\n $('html,body').animate(\n {'scrollTop': $('.integrated-search-unit').offset().top-scrollAdjust + 'px'},\n {'complete': function() {\n picker.css( {\n 'top': adjust + event.target.getBoundingClientRect().top + 'px',\n 'opacity': '1'\n });\n }\n }\n );\n\n } else {\n picker.css( {\n 'top': adjust + event.target.getBoundingClientRect().top + 'px',\n 'opacity': '1'\n });\n }\n }, 50 );\n\n $(window).resize( function() {\n picker.css( {\n 'top': adjust + event.target.getBoundingClientRect().top + 'px'\n });\n });\n\n }\n\n public resetDestination() {\n this.searchUnitService.setDestination(null, null, null);\n this.searchUnitService.setDestinationAirport(null);\n this.model.destination = [];\n }\n\n public oneWayFlightIncluded(): boolean {\n return TRPCONFIG.Domain.OneWayFlightsEnabled && this.searchType === UnifiedSearchType.Flights;\n }\n\n public flightIncluded(): boolean {\n return this.searchType === UnifiedSearchType.Flights || this.searchType === UnifiedSearchType.Holidays;\n }\n\n public hotelIncluded(): boolean {\n return this.searchType === UnifiedSearchType.Hotels || this.searchType === UnifiedSearchType.Holidays;\n }\n\n public hotelOnly(): boolean {\n return this.searchType === UnifiedSearchType.Hotels;\n }\n\n public flexibleDatesDisabled(): boolean {\n return TRPCONFIG.Domain2.FlexibleDatesFlowsDisabled.indexOf(UnifiedSearchType[this.searchType]) !== -1;\n }\n }\n\n angular\n .module('search')\n .directive('unifiedSearch', (): ng.IDirective => {\n return {\n scope: {},\n controller: UnifiedSearch,\n controllerAs: 'us',\n bindToController: {\n searchType: '=',\n fid: '=?',\n hiddenQueryString: '@',\n trackDefaultParameters: '@',\n clearForm: '@',\n overrideAllowNoDatesYet: '@',\n isFlexibleTripType: '=?',\n disableResetOptions: '@?'\n },\n templateUrl: 'partials/search/unifiedSearch',\n replace: true,\n restrict: 'E',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller: UnifiedSearch\n ) => {\n const elements = {\n container: el\n };\n controller.init(elements);\n }\n };\n });\n}\n","'use strict';\n\nnamespace Search {\n\n export class SearchQueryString {\n\n allAirlines: Airline[] = _.map((TRPCONFIG.Domain.PrefilterAirlines || '').split('|').filter(val => val !== ''),\n (a: string) => {\n const parts = a.split(',');\n return {\n Title: parts[0],\n Code: parts[1],\n IsPostfilter: parts[2] === '1'\n };\n });\n\n constructor (\n private $location: ng.ILocationService,\n private $q,\n private dateUtil,\n private occupancyService: Core.OccupancyService,\n private searchUnitService: Search.SearchUnitService,\n private destinationService,\n private autocompleter\n ) {\n }\n\n getQueryStringValues(paramsOptional: any = {}): ng.IPromise<string> {\n const params = this.getCompleteParamsObj(paramsOptional);\n const {startDate, endDate} = this.applyDatesOffset(\n params.startdate,\n params.enddate,\n params.startoffset,\n params.duration\n );\n\n return this.$q.all({\n startDate: this.dateUtil.parseDate(startDate),\n endDate: this.dateUtil.parseDate(endDate),\n occupancy: this.occupancyService.parseOccupancyString(params.occ),\n airports: params.depair && params.depair.indexOf(',') > -1\n ? this.getAirportCodes(params.depair) : this.lookupAirports(params.depair),\n destination: this.getDestination(params),\n cabin: ('cabin' in params) ? this.lookupCabin(params.cabin) : undefined,\n prefilterDirectFlights: params.direct === '1' ? true : params.direct === '0' ? false : undefined,\n autoSearch: params.autosearch === '1',\n expandedOptions: ('expandedoptions' in params) ? params.expandedoptions === '1' : undefined,\n airlines: ('airlines' in params) ? this.lookupAirlines(params.airlines) : undefined,\n prefilterAirlines: ('airlines' in params) ? this.prefilterAirlines(params.airlines) : undefined,\n resetForm: params.resetform === '1' ? true : params.resetform === '0' ? false : undefined,\n sortOrder: parseInt( params.sortorder,10) > 0 ? parseInt( params.sortorder,10) : 0,\n dealsOnly: params.dealsonly,\n currency: params.currency && params.currency.toUpperCase(),\n });\n }\n\n lookupDestination(query: string): ng.IPromise<string>|undefined {\n if (query) {\n const destObj = this.parseDestinationParam(query);\n return this.destinationService.getDetails(destObj)\n .then(d => d ? [d] : undefined);\n }\n }\n\n getAirportCodes(query:string): ng.IPromise<string> {\n const airports = query.split(',').map(prefix => {\n return { Code: prefix };\n });\n return this.$q.when(airports);\n }\n\n lookupAirports(query: string): ng.IPromise<string>|undefined {\n if (query) {\n return this.autocompleter.lookup('flights', query).then(response => {\n let firstItem = response.data && response.data[0];\n let codes = firstItem && response.data[0].Code && response.data[0].Code.split(',');\n if (codes) {\n if(codes.length === 1){\n return [firstItem];\n }\n return _.map(codes, c => ({ Code: c }));\n }\n });\n }\n }\n\n lookupAirlines(query: string) {\n query = query || '';\n const airlineQueryArray: Airline[] =\n _.map(query.split(','), q => ({Title: q, Code: q, IsPostfilter: undefined}));\n return this.verifyAirlineModels(airlineQueryArray);\n }\n\n prefilterAirlines(query: string) {\n query = query || '';\n const prefilterAirlinesArray = _.map(query.split(','), q => (q));\n return prefilterAirlinesArray;\n }\n\n lookupCabin(query: string) {\n let result = _.find(this.searchUnitService.getCabinOptions(), (c: Cabin) => c.queryStringCode === query);\n return result ? result.value : undefined;\n }\n\n verifyAirlineModels(airlineQueryArray: Airline[]) {\n airlineQueryArray = _.map(airlineQueryArray, (q: Airline) => ({\n Title: (q.Title || '').toUpperCase(),\n Code: (q.Code || '').toUpperCase(),\n IsPostfilter: q.IsPostfilter\n }));\n\n let isInQuery = airline => {\n return _.some(airlineQueryArray, q =>\n airline.Title.toUpperCase() === q.Title || airline.Code === q.Code\n );\n };\n\n return _.filter(this.allAirlines, isInQuery);\n }\n\n\n private getCompleteParamsObj(params) {\n const searchParams = this.$location.search();\n if (searchParams.dealsOnly) {\n params.dealsOnly = 1;\n } else {\n params = angular.merge(params, searchParams);\n }\n params = _.mapKeys(params, (value: any,key: string)=> {\n return key.toLowerCase();\n });\n return params;\n }\n\n private parseDestinationParam(dest) {\n let parts = dest.split('-');\n return {\n Type: parts[0],\n Id: parts[1],\n };\n }\n\n private getAirportListCodes(depair: string): string[] {\n const depAirpts = depair && depair.split(',') || [];\n return depAirpts.map((depAirpt) => {\n return depAirpt.toUpperCase().trim();\n });\n }\n\n private getDestination(params) {\n return this.$q.all({\n destAir: this.lookupAirports(params.destair),\n dest: this.lookupDestination(params.dest)\n })\n .then(({ destAir, dest }) => destAir || dest);\n }\n\n private getValue(str, val) {\n let ls = JSON.parse(str);\n return ls[val];\n }\n\n private applyDatesOffset(startDate, endDate, startOffset, duration) {\n if(startOffset !== undefined && startOffset !== undefined) {\n let dateData = {\n startOffset: startOffset,\n duration: duration\n };\n sessionStorage.setItem('deeplinkData', JSON.stringify(dateData));\n }\n\n let deeplinkData = sessionStorage.getItem('deeplinkData');\n if(deeplinkData !== null) {\n startOffset = this.getValue(deeplinkData, 'startOffset');\n duration = this.getValue(deeplinkData, 'duration');\n }\n\n if(startOffset && duration) {\n let startDate = this.dateUtil.format(this.dateUtil.todayPlus(parseInt(startOffset, 10)),\n 'yyyy-MM-dd');\n let endDate = this.dateUtil.format(this.dateUtil.addDays(startDate, parseInt(duration, 10)),\n 'yyyy-MM-dd');\n\n let dates = {\n startDate: startDate,\n endDate: endDate\n };\n return dates;\n }\n return {startDate, endDate};\n }\n\n getDeepLinkQSParams() {\n const params = this.getCompleteParamsObj({});\n const {startDate, endDate} = this.applyDatesOffset(\n params.startdate,\n params.enddate,\n params.startoffset,\n params.duration\n );\n\n return {\n TenantId: TRPCONFIG.Domain.TenantId,\n DepartureAirports: this.getAirportListCodes(params.depair),\n Cabin: this.lookupCabin(params.cabin),\n CountryCode: TRPCONFIG.Domain.CountryCode.toUpperCase(),\n CultureCode: TRPCONFIG.Domain.CultureCode.toUpperCase(),\n StartDate: startDate,\n EndDate: endDate,\n Rooms: this.occupancyService.parseOccupancyString(params.occ),\n Destination: this.parseDestinationParam(params.dest)\n };\n }\n }\n\n angular\n .module('search')\n .service('searchQueryString', SearchQueryString);\n}\n","'use strict';\n\nnamespace Search {\n\n type DepartureDatesResponse = Core.Flights.DepartureDatesResponse;\n type ILoggingService = Core.ILoggingService;\n type TripState = Core.Trip.TripState;\n\n export class SearchUnitService {\n\n public hotelDateRange;\n public flightHolidayDateRange;\n public dates: any = [];\n public url = '/api2/flights/static/';\n private webUrl = 'website/flights/';\n public defaultCabin = TRPCONFIG.Domain.DefaultCabin;\n public pointType = {\n Unknown: 0,\n Airport: 1,\n Location: 2,\n Point: 3,\n Estab: 4,\n Resort: 5\n };\n public transferTypes = {\n AirportTransfer: 0,\n ResortToResort: 1\n };\n\n public airlines;\n searchArea;\n destination;\n destinationAirport;\n departureAirports;\n locationId;\n resort;\n direction = 1;\n selectedDepartureAirport;\n outboundDates;\n availableDepartureAirports;\n allAirports;\n availableResorts;\n directionStrings;\n availableTerminals;\n terminal;\n staffRates;\n marhabaAirport;\n cabin;\n currency;\n flightType;\n oneWayFlightEnabled;\n flexibleDatesEnabled;\n currencyOptions = (TRPCONFIG.Domain.CurrencyOptions || 'GBP|EUR|USD').split('|');\n transferTypeStrings;\n transferPickUpPoint;\n transferDropOffPoint;\n flightRoutes = [];\n legs = null;\n isMultiSector = false;\n isMultiReturning = true;\n transferType;\n policyTypes;\n travelDestinations;\n policyExtras;\n policyType;\n travelDestination;\n policyExtra;\n dealsFlexibility?: number;\n\n constructor(\n private destinationService: any,\n private occupancyService: Core.OccupancyService,\n private dateUtil: any,\n private arrayUtil: ArrayUtil,\n private resourceService: Core.ResourceService,\n private loggingService: ILoggingService,\n private $http: ng.IHttpService,\n private $q: ng.IQService,\n private broker: Core.Broker,\n private $timeout: ng.ITimeoutService,\n private geo: any,\n private unadjustedDateFilter: any,\n private currentUser: any,\n private preferences: any,\n private $location: ng.ILocationService\n ) {\n this.hotelDateRange = new dateUtil.DateRange(null, null, false);\n this.flightHolidayDateRange = TRPCONFIG.Domain.DeviceType === 'Mobile' ?\n new dateUtil.DateRange(null, null, false) :\n this.hotelDateRange;\n this.dates = [\n this.hotelDateRange,\n this.flightHolidayDateRange,\n new dateUtil.DateRange(null, null, true), //transfer\n new dateUtil.DateRange(null, null, true), // marhaba\n new dateUtil.DateRange(null, null, true), // parking\n new dateUtil.DateRange(null, null, false), // attractions\n new dateUtil.DateRange(null, null, false) // insurance\n ];\n this.transferType = this.transferTypes.AirportTransfer;\n }\n\n public hotel = 0;\n public flight = 1;\n public transfer = 2;\n public marhaba = 3;\n public parking = 4;\n public attractions = 5;\n public insurance = 6;\n\n public setDefaultCabin = () => {\n this.cabin = this.defaultCabin;\n }\n\n public setDefaultCurrency = () => {\n this.currency = TRPCONFIG.Domain.CurrencyCode;\n }\n\n public getDurationOptions = () => {\n const options:any = [];\n const mp = TRPCONFIG.Domain.SearchUnitDurationMostPopular;\n for (let n = 0; n < mp.length; n++) {\n options.push({\n index: options.length,\n value: mp[n],\n label: mp[n] + ' ' + this.resourceService.get('SEARCHNIGHTS'),\n group: this.resourceService.get('SEARCHMOSTPOPULAR')\n });\n }\n const nn = TRPCONFIG.Domain.SearchUnitDurationNoOfNights;\n for (let p = 0; p < nn.length; p++) {\n options.push({\n index: options.length,\n value: nn[p],\n label: nn[p] + ' ' + this.resourceService.get('SEARCHNIGHTS'),\n group: this.resourceService.get('SEARCHNOOFNIGHTS')\n });\n }\n return options;\n }\n\n private _translateDirection = d => {\n return this.getDirectionStrings()[d];\n }\n\n private _loadDepartureAirports = () => {\n const domain = TRPCONFIG.Domain;\n this.clearDepartureAirports();\n this.availableDepartureAirports = this.$http.post(this.url + 'getdepartureairports', {\n CultureCode: domain.CultureCode,\n DepartureCountryCode: domain.CountryCode,\n Destination: this.destination\n }).then((result: any) => {\n return result.data.Airports;\n });\n }\n\n private _loadResorts = a => {\n this.resort = null;\n const domain = TRPCONFIG.Domain;\n if (!a) {\n return this.$q.reject(this.resourceService.get('MUSTSELECTAIRPORTFIRST'));\n }\n return this.$http.get('/api3/transfers/resorts/getbyairport?' + jQuery.param({\n CultureCode: domain.CultureCode,\n AirportCode: a.Code,\n DomainId: domain.DomainId,\n IncludeHotels: domain.IncludeHotelsInTransfersAutocompleter\n }), {\n ignoreErrors: true\n }).then((result: any) => {\n return result.data;\n }, angular.noop);\n }\n\n public startDate = (index, val?, defaultTime?) => {\n let searchDates = JSON.parse(sessionStorage.getItem('searchDates') || '[]');\n index = index || 0;\n if (val !== undefined) {\n this.dates[index].setStart(val, defaultTime);\n }\n\n let start = this.dates[index].start;\n if (searchDates && searchDates.ISOstartDate && searchDates.ISOstartDate !== start) {\n start = searchDates.ISOstartDate;\n }\n return start;\n }\n\n public endDate = (index, val?) => {\n index = index || 0;\n if (val !== undefined) {\n this.dates[index].setEnd(val);\n }\n return this.dates[index].end;\n }\n\n public isStartTimeApprovedByCustomer = (index, val) => {\n index = index || 0;\n if (val) {\n this.dates[index].isStartTimeApprovedByCustomer = true;\n }\n return this.dates[index].isStartTimeApprovedByCustomer;\n }\n\n public isEndTimeApprovedByCustomer = (index, val) => {\n index = index || 0;\n if (val) {\n this.dates[index].isEndTimeApprovedByCustomer = true;\n }\n return this.dates[index].isEndTimeApprovedByCustomer;\n }\n\n public duration = (index, val?) => {\n index = index || 0;\n if (val !== undefined) {\n this.dates[index].duration = val;\n }\n return this.dates[index].duration;\n }\n\n public getAirport = airportCode => {\n const domain = TRPCONFIG.Domain;\n return this.$http.post(this.url + 'getairport', {\n CultureCode: domain.CultureCode,\n AirportCode: airportCode\n }).then((result: any) => {\n return result.data.Airport;\n });\n }\n\n public getAirports = () => {\n if (this.allAirports) {\n this.$q.when(this.allAirports);\n }\n const domain = TRPCONFIG.Domain;\n return this.$http.post('/api3/transfers/airports/get', {\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId\n }).then((result: any) => {\n this.allAirports = result.data.Airports;\n return this.allAirports;\n });\n }\n\n public getTerminals = () => {\n if (this.availableTerminals) {\n this.$q.when(this.availableTerminals);\n }\n\n return this.$http.get(`/api2/marhaba/terminals/get?cultureCode=${TRPCONFIG.Domain.CultureCode}`)\n .then((res: any) => res.data.Terminals);\n }\n\n public setTerminal = t => {\n this.terminal = t;\n }\n\n public setCabin = c => {\n this.cabin = c;\n }\n\n public setCurrency = c => {\n this.currency = c;\n }\n\n public getCabin = () => {\n return this.cabin || this.defaultCabin;\n }\n\n public getCurrency = () => {\n return this.currency || TRPCONFIG.Domain.CurrencyCode;\n }\n\n public getTerminal = () => {\n return this.terminal || { Id: 0, Name: this.resourceService.get('SELECTTERMINAL') };\n }\n\n public getFlightTypes = () => {\n return [\n { Id: 1, Name: this.resourceService.get('ARRIVAL'), Label: this.resourceService.get('ORIGIN') },\n { Id: 2, Name: this.resourceService.get('DEPARTURE'), Label: this.resourceService.get('DESTINATION') }\n ];\n }\n\n public getMarhabaFlightType = type => {\n switch (type) {\n case 1:\n return 'ARRIVAL';\n case 2:\n return 'DEPARTURE';\n }\n }\n\n public setFlightType = f => {\n this.flightType = f;\n }\n\n public setOneWayFlightEnabled = v => {\n this.oneWayFlightEnabled = v;\n }\n\n public isOneWayFlightEnabled = () => {\n return this.oneWayFlightEnabled;\n }\n\n public setStaffRates = v => {\n this.staffRates = v;\n }\n\n public getStaffRates = () => {\n return this.staffRates;\n }\n\n public setMarhabaAirport = v => {\n this.marhabaAirport = v;\n }\n\n public getMarhabaAirport = () => {\n return this.marhabaAirport;\n }\n\n public getFlightType = () => {\n return this.flightType || this.getFlightTypes()[0];\n }\n\n public setDestinationAirport = (a, lr = false) => {\n this.destinationAirport = a;\n this.availableResorts = this.resort = null;\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\n this.setTransferPickUpPoint(a ? {\n Type: this.pointType.Airport,\n Code: a.Code,\n Description: a.Title\n } : null);\n }\n\n if (lr) {\n this.availableResorts = this._loadResorts(a);\n return this.availableResorts;\n }\n return this.$q.when();\n }\n\n public getDestinationAirport = () => {\n return this.destinationAirport;\n }\n\n public getOutboundDates = mode => {\n return mode === this.flight ? this.outboundDates : {};\n }\n\n private serialiseDatesRequest(req) {\n const destQs = req.DestinationAirportCodes.reduce((qs, c) => `${qs}dest=${c}&`, '');\n const depAndDestQs = req.DepartureAirportCodes.reduce((qs, c) => `${qs}dep=${c}&`, destQs);\n return depAndDestQs.slice(0, -1);\n }\n\n //Only used by searches:\n public loadOutboundDates = request => {\n if (!request) {\n return this.$q.when();\n }\n return this.$http.get<DepartureDatesResponse>(\n `${this.webUrl}departuredates?${this.serialiseDatesRequest(request)}`, {cache:true})\n .then(res => {\n return this.outboundDates = this.arrayUtil.toDict(res.data.DepartureDates, x => x, x => true);\n });\n }\n\n public getDestination = () => {\n return angular.copy(this.destination);\n }\n\n public getArrivalAirports() {\n const airports = this.$location.search()['arrAir'];\n if (airports) {\n return airports.split(',');\n }\n return;\n }\n\n public requiresStartDate = () => {\n return this.direction === 1 || this.direction === 2;\n }\n\n public requiresEndDate = () => {\n return this.direction === 1 || this.direction === 3;\n }\n\n public getSearchArea = () => {\n return this.searchArea;\n }\n\n public updateSearchArea = () => {\n if (this.searchArea) {\n return this.geo.getSearchArea().then((sa) => {\n return this.setSearchArea(sa);\n });\n }\n return this.$q.when();\n }\n\n public setSearchArea = sa => {\n this.searchArea = sa;\n\n //can either have searchArea set or destination, not both\n if (sa != null) {\n this.destination = null;\n }\n }\n\n public setDestination = (d, departureAirportsRequired, enrich) => {\n this.destination = d;\n if (d != null) {\n this.searchArea = null;\n }\n if (departureAirportsRequired) {\n this._loadDepartureAirports();\n }\n if (enrich) {\n return this.destinationService.getDetails(d).then((dest) => {\n this.destination = dest;\n this.broker.publish('destinationChanged', dest);\n return this.destination;\n });\n }\n return this.$q.when(this.destination);\n }\n\n public getDestinationAirports = (dest?) => {\n const get = (d: any) => {\n if (d) {\n if (d[0]) {\n d = d[0];\n }\n const code = d.DestinationAirports || d.Code;\n if (code) {\n return code.split(',');\n }\n }\n };\n return get(dest) || get(this.getDestinationAirport());\n }\n\n public getDepartureAirports = () => {\n return this.departureAirports;\n }\n\n public clearDepartureAirports = () => {\n this.outboundDates = {};\n this.departureAirports = [];\n this.selectedDepartureAirport = null;\n }\n\n public getAvailableResorts = () => {\n if (this.destinationAirport\n && this.destinationAirport.Code\n && this.destinationAirport.Code.indexOf(',') > -1) {\n return this.setDestinationAirport(null, false);\n }\n if (this.availableResorts == null) {\n this.availableResorts = this._loadResorts(this.destinationAirport);\n }\n return this.availableResorts;\n }\n\n public getAvailableDepartureAirports = () => {\n const d = this.$q.defer();\n if (this.availableDepartureAirports == null) {\n if (this.destination == null) {\n this.$timeout(() => {\n d.reject(this.resourceService.get('MUSTSELECTDESTINATIONFIRST'));\n }, 0);\n } else {\n this._loadDepartureAirports();\n return this.availableDepartureAirports;\n }\n } else {\n return this.availableDepartureAirports;\n }\n return d.promise;\n }\n\n public setMultipleDepartureAirports = airports => {\n if (airports && airports.length) {\n if (_.isString(airports[0])) {\n airports = _.map(airports, a => ({ Code: a, Title: a }));\n }\n let strMulti = this.resourceService.get('MULTIPLEAIRPORTS'); // '{0} + {1} more'\n strMulti = String.format(strMulti, airports[0].Code, airports.length - 1);\n this.setDepartureAirports(\n // Single entry is unchanged (no initial value arg)\n airports.reduce((prev, curr) => ({\n Code: prev.Code + ',' + curr.Code,\n Title: strMulti\n }))\n );\n }\n }\n\n public setDepartureAirports = airport => {\n if (airport.Code) {\n this.departureAirports = airport.Code.split(',');\n this.selectedDepartureAirport = this._setShortTitle(airport);\n this.broker.publish('departureAirportsChanged', airport);\n } else {\n this.loggingService.logError('airport.Code: ' +\n airport.Code + ' | ' + window.location.href);\n }\n }\n\n public getSelectedDepartureAirport = () => {\n return this.selectedDepartureAirport;\n }\n\n private _setShortTitle = o => {\n if (o.Title) {\n o.ShortTitle = o.Title.split(',')[0];\n }\n return o;\n }\n\n public getDirection = () => {\n return this.direction;\n }\n\n public getDirectionStrings = () => {\n if (!this.directionStrings) {\n this.directionStrings = {\n 1: this.resourceService.get('RETURN'),\n 2: this.resourceService.get('AIRPORTTORESORT'),\n 3: this.resourceService.get('RESORTTOAIRPORT')\n };\n }\n return this.directionStrings;\n }\n\n public setDirection = d => {\n this.direction = d;\n if (this.direction === 3) {\n this.startDate(this.transfer, null);\n return;\n }\n if (this.direction === 2) {\n this.endDate(this.transfer, null);\n }\n }\n\n public setResort = r => {\n this.resort = r;\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\n this.setTransferDropOffPoint(r);\n }\n }\n\n public getResort = () => {\n return this.resort;\n }\n\n public getRoute = () => {\n const airport = this.getDestinationAirport();\n const resort = this.getResort();\n if (!airport || !resort) {\n return null;\n }\n return {\n PickUpPoint: {\n Type: 1, // Airport\n Code: airport.Code,\n Description: airport.Title\n },\n DropOffPoint: resort\n };\n }\n\n public setLocationId = l => {\n this.locationId = l;\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\n this.setTransferDropOffPoint(l ? {\n Type: this.pointType.Location,\n Code: l\n } : null);\n }\n }\n\n public getLocationId = () => {\n return this.locationId;\n }\n\n public getSummary = mode => {\n return {\n Destination: this.destination && this.destination.Searchable ?\n this.destination.Title : null,\n DestinationAirport: (mode === this.marhaba) ?\n (this.marhabaAirport ?\n this.marhabaAirport.Title : null) :\n (this.destinationAirport ?\n this.destinationAirport.Title : null),\n Resort: this.resort ?\n this.resort.Description : null,\n Departure: this.selectedDepartureAirport ?\n this.selectedDepartureAirport.Title : null,\n Direction: this._translateDirection(this.direction),\n StartDate: this.dates[mode].start ?\n this.unadjustedDateFilter(this.dates[mode].start,\n this.dates[mode].timeSupport ?\n 'dd MMM yyyy HH:mm' :\n 'dd MMM yyyy') : null,\n StartMonth:\n this.dates[mode].start ?\n this.unadjustedDateFilter(this.dates[mode].start, 'MMM yyyy') : null,\n EndDate: this.dates[mode].end ?\n this.unadjustedDateFilter(this.dates[mode].end,\n this.dates[mode].timeSupport ?\n 'dd MMM yyyy HH:mm' :\n 'dd MMM yyyy') : null,\n OccupancyString: this.occupancyService.getOccupancyString(),\n PassengerCount: this.occupancyService.getPassengerCount(),\n OutboundDates: this.outboundDates || {},\n HolidayEnabled: this.destination ?\n this.destination.HolidayEnabled :\n true,\n NumericDirection: this.direction,\n Terminal: this.getTerminal().Name,\n FlightType: this.getFlightType().Name,\n Airlines: _.map(this.airlines, (a: any) => a.Title).join(', '),\n MarhabaAirport: this.marhabaAirport ?\n this.marhabaAirport.Title : null,\n PolicyType: this.policyType ? this.policyType.Name : null,\n TravelDestination: this.travelDestination ? this.travelDestination.Name : null\n };\n }\n\n public getUrl = () => {\n return this.url;\n }\n\n public setLegs = (l) => {\n this.legs = l;\n }\n\n public getLegs = () => {\n return this.legs;\n }\n\n public setFlightRoutes = routes => {\n this.flightRoutes = routes.map(route => ({\n DepartureAirport: { Code: route.DepartureAirport, Title: route.DepartureAirport },\n DepartureDate: route.DepartureDate,\n DestinationAirport: { Code: route.DestinationAirport, Title: route.DestinationAirport }\n }));\n }\n\n public getFlightRoutes = () => {\n return this.flightRoutes;\n }\n\n public setIsMultiSector = isMS => {\n this.isMultiSector = isMS;\n }\n\n public getIsMultiSector = () => {\n return this.isMultiSector;\n }\n\n public setIsMultiReturning = isMR => {\n this.isMultiReturning = isMR;\n }\n\n public getIsMultiReturning = () => {\n return this.isMultiReturning;\n }\n\n public restoreHotelSearch = (trip: TripState) => {\n if (trip && trip.HotelsRequest) {\n this.startDate(this.hotel, trip.HotelsRequest.CheckInDate);\n this.endDate(this.hotel, trip.HotelsRequest.CheckOutDate);\n this.occupancyService.setOccupancy(trip.HotelsRequest.Rooms);\n this.setCurrency(trip.HotelsRequest.CurrencyCode);\n if (trip.HotelsRequest.Destination != null) {\n return this.setDestination(trip.HotelsRequest.Destination, false, true);\n }\n this.setSearchArea(trip.HotelsRequest.SearchArea);\n }\n return this.$q.when();\n }\n\n public restoreFlightSearch = (trip: TripState) => {\n if (trip && trip.FlightsRequest) {\n this.startDate(this.flight, trip.FlightsRequest.DepartureDate);\n this.endDate(this.flight,\n trip.FlightsRequest.OneWayOnly ?\n null :\n trip.FlightsRequest.ReturnDate);\n this.occupancyService.setOccupancy([{\n Adults: trip.FlightsRequest.Adults,\n ChildAges: trip.FlightsRequest.ChildAges\n }]);\n this.setMultipleDepartureAirports([trip.FlightsRequest.SelectedDepartureAirport]);\n this.setDestinationAirport(trip.FlightsRequest.SelectedDestinationAirport);\n this.setOneWayFlightEnabled(trip.FlightsRequest.OneWayOnly);\n this.setCabin(trip.FlightsRequest.Cabin);\n }\n return this.$q.when();\n }\n\n public restoreMultiFlightSearch = (trip: TripState) => {\n if (trip && trip.MultiFlightsRequest) {\n this.occupancyService.setOccupancy([{\n Adults: trip.MultiFlightsRequest.Adults,\n ChildAges: trip.MultiFlightsRequest.ChildAges\n }]);\n this.setCabin(trip.MultiFlightsRequest.Cabin);\n this.setFlightRoutes(trip.MultiFlightsRequest.FlightRoutes);\n this.setIsMultiSector(true);\n }\n return this.$q.when();\n }\n\n public restoreTransferSearch = (trip: TripState) => {\n if (trip && trip.TransfersRequest) {\n this.startDate(this.transfer, trip.TransfersRequest.ArrivalDate);\n this.endDate(this.transfer, trip.TransfersRequest.ReturnDate);\n this.occupancyService.setOccupancy([{\n Adults: trip.TransfersRequest.Adults,\n ChildAges: trip.TransfersRequest.ChildAges\n }]);\n this.setDestinationAirport(trip.TransfersRequest.DestinationAirport);\n this.setResort({\n ResortId: trip.TransfersRequest.ResortId,\n Name: trip.TransfersRequest.ResortTitle\n });\n this.setLocationId(trip.TransfersRequest.LocationId);\n }\n return this.$q.when();\n }\n\n public restoreMarhabaSearch = (trip: TripState) => {\n if (trip && trip.MarhabaRequest) {\n this.startDate(this.marhaba, trip.MarhabaRequest.DateAndTime);\n this.setTerminal(trip.MarhabaRequest.Terminal);\n this.setMarhabaAirport(trip.MarhabaRequest.Airport);\n this.occupancyService.setOccupancy([trip.MarhabaRequest.Occupancy]);\n const ft = this.getFlightTypes()[trip.MarhabaRequest.FlightType - 1];\n this.setFlightType(ft);\n }\n return this.$q.when();\n }\n\n public restoreParkingSearch = (trip: TripState) => {\n if (trip && trip.ParkingRequest) {\n this.setDepartureAirports(trip.ParkingRequest.Airport);\n this.startDate(this.parking, trip.ParkingRequest.DepartureDate);\n this.endDate(this.parking, trip.ParkingRequest.ReturnDate);\n this.occupancyService.setPassengerCount(trip.ParkingRequest.PassengerCount);\n }\n return this.$q.when();\n }\n\n public restoreInsuranceSearch = (trip: TripState) => {\n if (trip && trip.InsuranceRequest) {\n this.startDate(this.insurance, trip.InsuranceRequest.StartDate);\n this.endDate(this.insurance, trip.InsuranceRequest.EndDate);\n this.setPolicyExtra(trip.InsuranceRequest.PolicyExtras);\n this.setPolicyType(trip.InsuranceRequest.PolicyType);\n this.setTravelDestination(trip.InsuranceRequest.TravelDestination);\n }\n return this.$q.when();\n }\n\n public getCabinOptions = () => {\n const cabins = [];\n const defaultCabinList = ['ECONOMYCLASS', 'PREMIUMECONOMYCLASS', 'BUSINESSCLASS', 'FIRSTCLASS'];\n const approvedCabinList = TRPCONFIG.Domain.ValidFlightClasses || defaultCabinList;\n return approvedCabinList.map(approvedCabin => {\n let value: number | undefined = undefined;\n let code: string | undefined = undefined;\n switch (approvedCabin) {\n case 'ECONOMYCLASS':\n value = 1;\n code = 'e';\n break;\n case 'PREMIUMECONOMYCLASS':\n value = 2;\n code = 'p';\n break;\n case 'BUSINESSCLASS':\n value = 8;\n code = 'b';\n break;\n case 'FIRSTCLASS':\n value = 4;\n code = 'f';\n break;\n case 'FLIGHTCLASS':\n value = -1;\n code = 'x';\n break;\n }\n\n return new Cabin(approvedCabin, value, code, this.resourceService);\n });\n }\n\n public getCurrencyOptions = () => {\n return angular.copy(this.currencyOptions);\n }\n\n public chooseSeachUnitModel = (target, source, service, queryString) => {\n return queryString || service || source || target;\n }\n\n public getTransferTypeStrings = () => {\n if (!this.transferTypeStrings) {\n this.transferTypeStrings = {\n 0: this.resourceService.get('TRANSFERTYPE_AIRPORTTORESORT'),\n 1: this.resourceService.get('TRANSFERTYPE_RESORTTORESORT')\n };\n }\n return this.transferTypeStrings;\n }\n\n public getTransferType = () => {\n return this.transferType;\n }\n\n public setTransferType = t => {\n this.transferType = t;\n }\n\n public setTransferPickUpPoint = p => {\n this.transferPickUpPoint = p;\n }\n\n public getTransferPickUpPoint = () => {\n return this.transferPickUpPoint;\n }\n\n public setTransferDropOffPoint = d => {\n this.transferDropOffPoint = d;\n }\n\n public getTransferDropOffPoint = () => {\n return this.transferDropOffPoint;\n }\n\n public getMinStartDate = areaName => {\n let startDate;\n if (areaName && areaName === 'hotels') {\n // HOTELS\n // determine offset\n let offSetDays = TRPCONFIG.Domain.HotelSearchOffsetDate;\n if (offSetDays === 0 &&\n (new Date()).getUTCHours() >= TRPCONFIG.Domain.TimeCutoffForSameDayHotelSearch) {\n // If we have no offset and the current time exceeds the same day search cutoff,\n // set min date to next day.\n offSetDays = 1;\n }\n startDate = this.dateUtil.todayPlus(offSetDays, 0, true);\n } else if (areaName && (areaName === 'holidays' || areaName === 'flights')) {\n // HOLIDAYS or FLIGHTS\n startDate = this.dateUtil.todayPlus(this.getHolidaysSearchOffsetDate(), 0, true);\n let minimumOverride = new Date(TRPCONFIG.Domain.HolidaySearchOverrideMinimum);\n if (minimumOverride && minimumOverride > new Date(startDate)) {\n startDate = minimumOverride;\n }\n } else {\n // default to today\n startDate = this.dateUtil.zeroTime(new Date());\n }\n return startDate;\n }\n\n public getMinEndDate = (startDate, areaName) => {\n return this.dateUtil.addDays(startDate, 1, true);\n }\n\n public getHolidaysSearchOffsetDate = () => {\n return this.currentUser.Agent ? 1 : TRPCONFIG.Domain.HolidaysSearchOffsetDate;\n }\n\n public getOccupancyConfig(areaName: string): OccupancyConfig {\n let config = new OccupancyConfig;\n const limits = TRPCONFIG.Domain.OccupancyLimits[areaName];\n const includesHotel: boolean = (areaName === 'holidays' || areaName === 'hotels');\n\n config.MaxAdults = limits.maxAdults;\n config.MaxChildren = limits.maxChildren;\n config.MaxRooms = includesHotel ? TRPCONFIG.Domain.MaxRoomsForOccupancy : 0;\n config.MaxAdultsInAdditionalRooms = includesHotel ? TRPCONFIG.Domain.MaxAdultsInAdditionalRooms : 0;\n config.MaxChildrenInAdditionalRooms = includesHotel ? TRPCONFIG.Domain.MaxChildrenInAdditionalRooms : 0;\n\n switch (areaName) {\n case 'holidays':\n config.MaxChildAge = TRPCONFIG.Domain.MaxChildAgeForHolidays;\n break;\n case 'flights':\n config.MaxChildAge = TRPCONFIG.Domain.MaxChildAgeForFlights;\n break;\n default:\n config.MaxChildAge = TRPCONFIG.Domain.MaximumChildAge;\n }\n\n return config;\n }\n\n public getTravelDestinations = () => {\n if (this.travelDestinations) {\n return this.travelDestinations;\n }\n const urlqs = `cultureCode=${TRPCONFIG.Domain.CultureCode}&domainId=${TRPCONFIG.Domain.DomainId}`;\n this.travelDestinations = this.$http.get(`/api2/insurance/static/gettraveldestination?${urlqs}`)\n .then((res: any) => res.data);\n\n return this.travelDestinations;\n }\n\n public setTravelDestination = t => {\n this.travelDestination = t;\n }\n\n public getTravelDestination = () => {\n return this.travelDestination;\n }\n\n public getPolicyTypes = () => {\n if (this.policyTypes) {\n return this.policyTypes;\n }\n let cc = TRPCONFIG.Domain.CultureCode;\n let id = TRPCONFIG.Domain.DomainId;\n let policyUrl = `/api2/insurance/static/getpolicytype?cultureCode=${cc}&domainId=${id}`;\n this.policyTypes = this.$http.get(policyUrl).then((res: any) => res.data);\n\n return this.policyTypes;\n }\n\n public setPolicyType = p => {\n this.policyType = p;\n }\n\n public getPolicyType = () => {\n return this.policyType;\n }\n\n public getPolicyExtras = () => {\n if (this.policyExtras) {\n return this.policyExtras;\n }\n const urlqs = `cultureCode=${TRPCONFIG.Domain.CultureCode}&domainId=${TRPCONFIG.Domain.DomainId}`;\n this.policyExtras = this.$http.get(`/api2/insurance/static/getextras?${urlqs}`)\n .then((res: any) => res.data);\n\n return this.policyExtras;\n }\n\n public setPolicyExtra = e => {\n this.policyExtra = e;\n }\n\n public getPolicyExtra = () => {\n return this.policyExtra;\n }\n\n public getLastSearchType(): ng.IPromise<UnifiedSearchType> {\n return this.preferences.get('searchType').then();\n }\n\n public capitalize = (str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n }\n\n angular\n .module('search')\n .service('searchUnitService', SearchUnitService);\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .controller('SharedSearchUnit', SharedSearchUnit);\n\nfunction SharedSearchUnit(sharedSearchUnitService) {\n const su = this;\n su.showErrors = errors => sharedSearchUnitService.showErrors(errors);\n su.lockScreen = searchMsg => sharedSearchUnitService.lockScreen(searchMsg);\n su.unlockScreen = () => sharedSearchUnitService.unlockScreen();\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('datesSearchUnit', datesSearchUnit);\n\nfunction datesSearchUnit(searchUnitService, sharedSearchUnitService, dateUtil, $window, $route) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n startDate: '=',\n endDate: '=?',\n startDateLabel: '@',\n endDateLabel: '@',\n isStartTimeApprovedByCustomer: '=?',\n isEndTimeApprovedByCustomer: '=?',\n requiresTimeApproval: '=?',\n enabledDates: '=',\n oneWay: '=',\n outboundOnly: '=',\n returnOnly: '=',\n showTime: '=',\n defaultTime: '=',\n templateOverride: '@',\n areaOverride: '@',\n select: '&',\n resetDuration: '=?'\n },\n templateUrl: (tElement, tAttrs) => `partials/${tAttrs.templateOverride || 'searchunit/dates'}`,\n controller: 'SharedSearchUnit',\n link: _linker\n };\n\n function _linker(scope) {\n let currentArea;\n const dateLimits = {};\n const halt = scope.$watch('startDate', function(val) {\n if (val === undefined) { return; }\n updateMinDates();\n halt();\n });\n\n updateCurrentArea(getAreaOverride());\n scope.$watch(getAreaOverride, updateCurrentArea);\n\n scope.setStartDate = setStartDate;\n scope.setEndDate = setEndDate;\n scope.dateLimits = dateLimits;\n\n scope.$watch('oneWay', function(value, old) {\n if (value == null || value === old) {\n return;\n }\n searchUnitService.setOneWayFlightEnabled(value);\n });\n\n scope.$watch('isStartTimeApprovedByCustomer', value => searchUnitService.isStartTimeApprovedByCustomer(currentArea.mode, value));\n scope.$watch('isEndTimeApprovedByCustomer', value => searchUnitService.isEndTimeApprovedByCustomer(currentArea.mode, value));\n\n function getAreaOverride() {\n return scope.areaOverride || scope.$parent.areaOverride ||\n ($route.current && $route.current.$$route && $route.current.$$route.area);\n }\n\n function updateCurrentArea(areaOverride) {\n // observation: if areaOverride = 'holidayDeals' then currentArea does not change\n // 'holidayDeals' is not described as an area in area.factory.ts\n currentArea = sharedSearchUnitService.getAreaInfo(areaOverride);\n updateMinDates();\n }\n\n function updateMinDates() {\n const areaName = currentArea && currentArea.name;\n dateLimits.startDateMin = searchUnitService.getMinStartDate(areaName);\n dateLimits.endDateMin = searchUnitService.getMinEndDate(scope.startDate || dateLimits.startDateMin, areaName);\n }\n\n function setStartDate(date) {\n if (!date || !currentArea) { return; }\n\n searchUnitService.startDate(currentArea.mode, date, scope.defaultTime);\n searchUnitService.isStartTimeApprovedByCustomer(currentArea.mode, scope.isStartTimeApprovedByCustomer);\n scope.startDate = date;\n\n dateLimits.endDateMin = searchUnitService.getMinEndDate(date, currentArea.name);\n\n if (TRPCONFIG.Domain.DurationEnable || scope.resetDuration === true) {\n const duration = searchUnitService.duration(currentArea.mode);\n const endDateOffset = duration ? duration.value : null;\n\n scope.endDate = dateUtil.addDays(scope.startDate, endDateOffset || TRPCONFIG.Domain.HolidaysSearchEndOffsetDate, true);\n searchUnitService.endDate(currentArea.mode, scope.endDate);\n\n let searchDates = sessionStorage.getItem('searchDates');\n if (searchDates) {\n let searchDatesInfo = JSON.parse(searchDates);\n scope.endDate = searchDatesInfo.ISOendDate;\n searchUnitService.endDate(currentArea.mode, scope.endDate);\n\n let startStamp = Date.parse(date);\n let endStamp = Date.parse(scope.endDate);\n\n if (startStamp > endStamp) {\n scope.endDate = dateUtil.addDays(scope.startDate, endDateOffset || TRPCONFIG.Domain.HolidaysSearchEndOffsetDate, true);\n searchUnitService.endDate(currentArea.mode, scope.endDate);\n }\n }\n\n } else {\n //need to refresh the end date because it is possible it has been adjusted\n scope.endDate = searchUnitService.endDate(currentArea.mode);\n }\n }\n\n function setEndDate(date) {\n if (!date) { return; }\n\n searchUnitService.endDate(currentArea.mode, date);\n searchUnitService.isEndTimeApprovedByCustomer(currentArea.mode, scope.isEndTimeApprovedByCustomer);\n scope.endDate = date;\n }\n\n function initDurationInput() {\n scope.options = searchUnitService.getDurationOptions();\n\n scope.$watch('duration', function() {\n if (scope.duration) {\n // changed : console.log('$watch CHANGED scope.duration ', scope.duration);\n searchUnitService.duration(currentArea.mode, scope.duration);\n scope.endDate = dateUtil.addDays(scope.startDate, searchUnitService.duration(currentArea.mode).value, true);\n searchUnitService.endDate(currentArea.mode, scope.endDate);\n } else if (searchUnitService.duration(currentArea.mode)) {\n // retrieve : console.log('$watch RETRIEVE resourceService.SearchUnitDuration ', searchUnitService.duration(currentArea.mode));\n scope.duration = scope.options[searchUnitService.duration(currentArea.mode).index];\n } else {\n // init : console.log('$watch INIT scope.duration ', scope.duration);\n scope.duration = scope.options[0];\n }\n });\n }\n\n if (TRPCONFIG.Domain.DurationEnable) {\n initDurationInput();\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('flightSearchUnit', flightSearchUnit);\n\nfunction flightSearchUnit(searchUnitService, sharedSearchUnitService, occupancyService, preferences, dateUtil, $q) {\n // Configuration part, mandatory in every searchunit directive with delayed linker\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'flightSearchUnit');\n\n return {\n restrict: 'E',\n replace: true,\n scope: {\n moreOptions: '@',\n areaOverride: '@'\n },\n templateUrl: 'partials/searchunit/flight',\n controller: 'SharedSearchUnit',\n link(scope, el, attr, controller) {\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'flightSearchUnit');\n }\n };\n\n function _delayedLinker(scope, $element, attr, ssu) {\n scope.destinationAirportSelect = destinationAirportSelect;\n scope.destinationAirportDeselect = destinationAirportDeselect;\n scope.search = search;\n scope.getMultiSectorMinDate = getMultiSectorMinDate;\n scope.selectLegDate = selectLegDate;\n scope.selectLegAirport = selectLegAirport;\n scope.addLeg = addLeg;\n scope.rmLeg = rmLeg;\n scope.onSearchModeChange = onSearchModeChange;\n scope.onReturningToggle = onReturningToggle;\n scope.searchMode = searchUnitService.isOneWayFlightEnabled() ? 'oneway' : 'return';\n scope.onewayonly = searchUnitService.isOneWayFlightEnabled() || false;\n scope.isMultiSector = false;\n scope.isMultiReturning = true;\n scope.legs = [{\n DepartureDate: null,\n DepartureAirport: null,\n DestinationAirport: null,\n Cabin: TRPCONFIG.Domain.DefaultCabin\n }];\n\n scope.toggleOptions = () => {\n scope.expandedOptions = !scope.expandedOptions;\n };\n scope.airportSelect = items => {\n searchUnitService.setMultipleDepartureAirports(items);\n loadOutboundDates();\n };\n scope.airportDeselect = () => {\n searchUnitService.clearDepartureAirports();\n };\n\n if (scope.moreOptions === 'true') {\n scope.updateCabin = updateCabin;\n scope.cabins = searchUnitService.getCabinOptions();\n } else {\n searchUnitService.setDefaultCabin();\n }\n\n _restoreSearchCriteria();\n\n function loadOutboundDates() {\n function getRequest() {\n const DepartureAirportCodes = searchUnitService.getDepartureAirports();\n if (!DepartureAirportCodes || !DepartureAirportCodes.length) {\n return null;\n }\n const destinationAirport = searchUnitService.getDestinationAirport();\n if (!destinationAirport || !destinationAirport.Code) {\n return null;\n }\n const DestinationAirportCodes = destinationAirport.Code.split(',');\n if (!DestinationAirportCodes.length) {\n return null;\n }\n return {\n DepartureAirportCodes,\n DestinationAirportCodes\n };\n }\n\n const request = getRequest();\n searchUnitService.loadOutboundDates(request).then(outboundDates => scope.enabledDates = outboundDates);\n }\n\n function destinationAirportSelect(item) {\n const availableResorts = searchUnitService.setDestinationAirport(item, false);\n loadOutboundDates();\n return availableResorts;\n }\n\n function destinationAirportDeselect() {\n const availableResorts = searchUnitService.setDestinationAirport(null, false);\n scope.enabledDates = {};\n return availableResorts;\n }\n\n function search() {\n ssu.lockScreen('SEARCHINGFLIGHTS');\n const flightSearch = {};\n mapSearchTerms(flightSearch);\n preferences.set('flightSearch', flightSearch);\n\n sharedSearchUnitService.search(\n undefined,\n ssu.showErrors,\n scope.isMultiSector\n ? { multi: true, legs: scope.legs, areaOverride: scope.areaOverride }\n : { onewayonly: scope.onewayonly, areaOverride: scope.areaOverride }\n );\n }\n\n function updateCabin(cabin) {\n searchUnitService.setCabin(cabin);\n }\n\n function getMultiSectorMinDate(legIndex) {\n return legIndex === 0\n ? dateUtil.todayPlus(1, 0, true)\n : dateUtil.addDays(scope.legs[legIndex - 1].DepartureDate, 1, true);\n }\n\n function selectLegDate(leg, date) {\n leg.DepartureDate = date;\n }\n\n function selectLegAirport(leg, airport, type) {\n leg[type] = airport;\n\n if (!scope.isMultiReturning) {\n return;\n }\n\n const i = scope.legs.indexOf(leg);\n\n if (i === 0 && scope.legs.length > 1 && type === 'DepartureAirport') {\n scope.legs[scope.legs.length - 1].DestinationAirport = airport;\n } else if (i > 0 && i === scope.legs.length - 1 && type === 'DestinationAirport') {\n scope.legs[0].DepartureAirport = airport;\n }\n }\n\n function addLeg() {\n const prevLeg = scope.legs[scope.legs.length - 1];\n\n if (scope.isMultiReturning && scope.legs.length > 1) {\n prevLeg.DestinationAirport = null;\n }\n\n scope.legs.push({\n DepartureDate: dateUtil.addDays(prevLeg.DepartureDate, 7, true),\n DepartureAirport: null,\n DestinationAirport: scope.isMultiReturning ? scope.legs[0].DepartureAirport : null,\n Cabin: prevLeg.Cabin\n });\n }\n\n function rmLeg(leg) {\n const { legs } = scope;\n const i = legs.indexOf(leg);\n legs.splice(i, 1);\n\n if (legs.length > 1 && scope.isMultiReturning) {\n if (i === 0) {\n legs[0].DepartureAirport = legs[legs.length - 1].DestinationAirport;\n } else if (i === legs.length) {\n legs[legs.length - 1].DestinationAirport = legs[0].DepartureAirport;\n }\n }\n }\n\n function onSearchModeChange() {\n scope.onewayonly = scope.searchMode === 'oneway';\n scope.isMultiSector = scope.searchMode === 'multisector';\n }\n\n function onReturningToggle() {\n if (scope.isMultiReturning && scope.legs.length > 1) {\n scope.legs[scope.legs.length - 1].DestinationAirport = scope.legs[0].DepartureAirport;\n }\n searchUnitService.setIsMultiReturning(scope.isMultiReturning);\n }\n\n function mapSearchTerms(target, source) {\n if (!target) {\n return;\n }\n if (!source) {\n source = {};\n }\n\n let selectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\n if (selectedDepartureAirport) {\n selectedDepartureAirport = [selectedDepartureAirport];\n } else {\n selectedDepartureAirport = searchUnitService.getDepartureAirports();\n }\n target.airports = searchUnitService.chooseSeachUnitModel(target.airports, source.airports, selectedDepartureAirport);\n target.destinationAirport = searchUnitService.chooseSeachUnitModel(target.destinationAirport, source.destinationAirport, searchUnitService.getDestinationAirport());\n target.startDate = searchUnitService.chooseSeachUnitModel(target.startDate, source.startDate, searchUnitService.startDate(searchUnitService.flight));\n target.endDate = searchUnitService.chooseSeachUnitModel(target.endDate, source.endDate, searchUnitService.endDate(searchUnitService.flight));\n const occupancy = target.occupancy || source.occupancy || occupancyService.getOccupancy();\n target.occupancy = [occupancy.reduce((a, b) => {\n return {\n Adults: a.Adults + b.Adults,\n ChildAges: a.ChildAges.concat(b.ChildAges)\n };\n })];\n target.cabin = target.cabin || source.cabin || searchUnitService.getCabin();\n target.onewayonly = _.isBoolean(source.onewayonly) ? source.onewayonly : scope.onewayonly;\n target.isMultiSector = searchUnitService.getIsMultiSector() || scope.isMultiSector;\n target.searchMode = target.isMultiSector ? 'multisector' : target.onewayonly ? 'oneway' : 'return';\n target.isMultiReturning = searchUnitService.getIsMultiReturning();\n target.legs = searchUnitService.getLegs() || scope.legs;\n\n target.airports && searchUnitService.setMultipleDepartureAirports(target.airports);\n target.destinationAirport && searchUnitService.setDestinationAirport(target.destinationAirport);\n target.startDate && searchUnitService.startDate(searchUnitService.flight, target.startDate);\n target.endDate && searchUnitService.endDate(searchUnitService.flight, target.endDate);\n target.occupancy && occupancyService.setOccupancy(target.occupancy);\n target.cabin && searchUnitService.setCabin(target.cabin < 0 ? 1 : target.cabin); /// -1 caused API to return unhandled exception\n searchUnitService.setIsMultiSector(scope.isMultiSector);\n searchUnitService.setLegs(target.legs);\n }\n\n function _restoreSearchCriteria() {\n const promise = TRPCONFIG.Domain.isAgentMode ? $q.when() : preferences.get('flightSearch');\n promise.then(flightSearch => {\n mapSearchTerms(scope, flightSearch);\n });\n\n // Airports may be changed by other multi search forms\n scope.$watch(\n () => searchUnitService.getSelectedDepartureAirport(),\n v => {\n scope.airports = v;\n scope.airportsCount = _getAirportsCount(v);\n }\n );\n }\n\n function _getAirportsCount(airports) {\n if (airports && airports.Code) {\n return airports.Code.split(',').length;\n }\n return 0;\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular.module('TR')\n.directive('marhabaSearchUnit', function() {\n return {\n templateUrl: 'partials/searchunit/marhaba',\n controller: 'MarhabaSearchUnitCtrl',\n controllerAs: 'msu',\n replace: true,\n scope: {\n areaOverride: '@'\n },\n restrict: 'E',\n link() {\n // do nothing\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('parkingSearchUnit', parkingSearchUnit);\n\nfunction parkingSearchUnit(searchUnitService, sharedSearchUnitService, occupancyService) {\n // Configuration part, mandatory in every searchunit directive with delayed linker\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'parkingSearchUnit');\n\n return {\n restrict: 'E',\n replace: true,\n scope: {\n areaOverride: '@'\n },\n templateUrl: 'partials/searchunit/parking',\n controller: 'SharedSearchUnit',\n link(scope, el, attr, controller) {\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'parkingSearchUnit');\n }\n };\n\n function _delayedLinker(scope, el, attr, ssu) {\n const currentArea = sharedSearchUnitService.getAreaInfo(scope.areaOverride);\n const mode = currentArea.mode;\n const minPassengers = 1;\n const maxPassengers = occupancyService.adultRange(currentArea.name).max || 7;\n\n // Props on scope\n scope.passengerRange = _.range(minPassengers, maxPassengers + 1);\n\n // Methods on scope\n scope.departureAirportSelect = searchUnitService.setDepartureAirports;\n scope.departureAirportDeselect = departureAirportDeselect;\n scope.passengerSelect = passengerSelect;\n scope.search = search;\n\n // Initialise form\n _restoreSearchCriteria();\n\n\n function _restoreSearchCriteria() {\n scope.passengerCount = occupancyService.getPassengerCount() || 1;\n scope.departureAirport = searchUnitService.getSelectedDepartureAirport();\n scope.startDate = searchUnitService.startDate(mode);\n scope.endDate = searchUnitService.endDate(mode);\n passengerSelect();\n }\n\n function departureAirportDeselect() {\n return searchUnitService.clearDepartureAirports();\n }\n\n function passengerSelect() {\n occupancyService.setPassengerCount(scope.passengerCount);\n }\n\n function search() {\n ssu.lockScreen('SEARCHINGPARKING');\n sharedSearchUnitService.search(undefined, ssu.showErrors);\n }\n }\n}\n})();\n","(function() {\n/*\n Injects an input field for filtering resorts based on `destinationAirport`.\n HTML for results is not injected to allow any UI implementation using `scope.resorts`.\n*/\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('resortField', function(searchUnitService, $filter, $rootScope, $timeout) {\n return {\n restrict: 'E',\n scope: {\n select: '&',\n deselect: '&',\n loadOnce: '=',\n currentValue: '=',\n placeholder: '@'\n },\n transclude: true,\n replace: true,\n templateUrl: 'partials/searchunit/resortfield',\n link(scope, el) {\n let currDest;\n const loadingClass = 'small-spinner';\n const inputField = el.find('.resort-input');\n\n // Props on scope\n scope.resorts = undefined;\n scope.allResorts = undefined;\n scope.resortInput = inputField;\n\n // Methods on scope\n scope.setResort = function(r) {\n scope.resortTerm = r.Description;\n scope.select({ item: r });\n };\n\n init(scope.loadOnce);\n\n\n function init(once) {\n // Set any existing field value\n const unwatchCurrent = scope.$watch('currentValue', v => {\n if (v) {\n if (!scope.resortTerm) {\n scope.resortTerm = v.Description;\n }\n // Remove watch when value is found\n unwatchCurrent();\n }\n });\n\n // Filter resorts\n scope.$watch('resortTerm', function(v) {\n scope.resorts = filterResorts(v);\n\n // If user cleared field that contained a value\n if (!v && inputField.hasClass('ng-touched')) {\n scope.deselect();\n }\n });\n\n if (once) {\n // Load resorts once only i.e. Mobile\n // Timer ensures view has initialised\n $timeout(updateResorts);\n } else {\n // Watch destination airport for changes\n scope.$watch(\n '$parent.destinationAirport',\n v => { // Can't use `oldVal` because it doesn't refresh each `init()`\n if (!v) { // No airport\n scope.allResorts =\n scope.resorts =\n scope.resortTerm =\n currDest = undefined;\n } else if (!currDest || v.Title !== currDest.Title) {\n updateResorts();\n currDest = v;\n }\n }\n );\n }\n }\n\n function updateResorts() {\n inputField.addClass(loadingClass);\n fetchResorts().then(() => {\n inputField.removeClass(loadingClass);\n });\n }\n\n function fetchResorts() {\n scope.allResorts =\n scope.resorts = undefined;\n\n return searchUnitService.getAvailableResorts()\n .then(res => {\n let resMatch;\n const currTerm = scope.resortTerm;\n\n scope.allResorts = // Keep a copy of all resorts\n scope.resorts = res; // This will change to filtered results\n\n // Re-select term if it exists in results\n if (currTerm && _.some(res, o => {\n if (o.Description.toLowerCase() === currTerm.toLowerCase()) {\n resMatch = o;\n return true; // Quits at first match\n }\n })) {\n scope.setResort(resMatch);\n } else {\n scope.resortTerm = undefined;\n }\n }, msg => {\n $rootScope.$broadcast('flash:error', msg);\n });\n }\n\n function filterResorts(str) {\n // Equivalent to 'allResorts|filter:str|limitTo:30'\n return $filter('limitTo')(\n $filter('filter')(scope.allResorts, str),\n 30);\n }\n }\n };\n });\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('roomSearchUnit', roomSearchUnit);\n\nfunction roomSearchUnit(\n $routeParams,\n broker,\n searchUnitService,\n sharedSearchUnitService,\n occupancyService,\n scrollService) {\n // Configuration part, mandatory in every searchunit directive with delayed linker\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'roomSearchUnit');\n\n return {\n restrict: 'E',\n replace: true,\n scope: {\n landing: '@'\n },\n templateUrl: 'partials/searchunit/room',\n controller: 'SharedSearchUnit',\n link(scope, el, attr, controller) {\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'roomSearchUnit');\n }\n };\n\n function _delayedLinker(scope, $element, attr, ssu) {\n\n const currentArea = sharedSearchUnitService.getAreaInfo();\n\n scope.dateRangeMetadata = {\n minStartDate: searchUnitService.getMinStartDate(currentArea.name),\n enabledStartDates: {},\n durations: {},\n showDatePicker: false,\n selectDateRange: () => {\n searchUnitService.startDate(currentArea.mode, scope.startDate);\n searchUnitService.endDate(currentArea.mode, scope.endDate);\n scope.dateRangeMetadata.showDatePicker = false;\n }\n };\n\n scope.occupancyMetadata = searchUnitService.getOccupancyConfig(currentArea.name);\n scope.occupancyMetadata.showOccupancyPicker = false;\n scope.$watchCollection('occupancy', val => {\n if (val && val[0]) {\n scope.occupancyMetadata.occupancyCaption = occupancyService.getOccupancyString(val);\n occupancyService.setOccupancy(val);\n }\n });\n\n _restoreSearchCriteria();\n\n scope.updateCurrency = updateCurrency;\n scope.currencyOptions = searchUnitService.getCurrencyOptions();\n scope.toggleOptions = () => { scope.expandedOptions = !scope.expandedOptions; };\n scope.searchRooms = searchRooms;\n scope.searching = false;\n\n function searchRooms() {\n scope.searching = true;\n broker.publish('roomSearchStarted');\n scope.$emit('flash:error', null);\n if (scope.landing) { ssu.lockScreen('SEARCHINGFORROOMSPROMPT'); }\n scrollService.setScrollTarget('#roomsPanel');\n sharedSearchUnitService.search(null, _showRoomErrors, {\n roomSearch: true,\n estabId: $routeParams.estabId\n });\n }\n\n function _showRoomErrors(errors) {\n scope.searching = false;\n broker.publish('roomSearchEnded');\n scope.$emit('flash:error', errors);\n ssu.unlockScreen();\n }\n\n function _restoreSearchCriteria() {\n scope.startDate = searchUnitService.startDate(currentArea.mode);\n scope.endDate = searchUnitService.endDate(currentArea.mode);\n scope.occupancy = occupancyService.getOccupancy();\n scope.currency = searchUnitService.getCurrency();\n }\n\n function updateCurrency() {\n searchUnitService.setCurrency(scope.currency);\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .directive('transferSearchUnit', transferSearchUnit);\n\nfunction transferSearchUnit(\n $location,\n searchUnitService,\n sharedSearchUnitService,\n occupancyService,\n autocompleter,\n $rootScope,\n transferSearch\n) {\n // Configuration part, mandatory in every searchunit directive with delayed linker\n sharedSearchUnitService.addDelayedLinker(_delayedLinker, 'transferSearchUnit');\n\n return {\n restrict: 'E',\n replace: true,\n scope: {\n areaOverride: '@'\n },\n templateUrl: 'partials/searchunit/transfer',\n controller: 'SharedSearchUnit',\n link(scope, el, attr, controller) {\n return sharedSearchUnitService.initializeArea(scope, el, attr, controller, 'transferSearchUnit');\n }\n };\n\n function _delayedLinker(scope, el, attr, ssu) {\n const mode = sharedSearchUnitService.getAreaInfo(scope.areaOverride).mode;\n scope.model = {};\n scope.$watch(() => transferSearch.getTransfersTimeApprovalRequired(TRPCONFIG.Domain.EnableTransfersTimeApproval), value => {\n scope.requiresTimeApproval = value;\n });\n\n // ab-test code:\n // var $root = angular.element(document.body).scope().$root;\n // $root.transferDirectionStyle = 'radio';\n // $root.$evalAsync();\n scope.transferDirectionStyle = () => $rootScope.transferDirectionStyle || TRPCONFIG.Domain.TransferDirectionStyle;\n\n // Props on scope\n scope.directionOps = _.mapValues(\n // Numbers are required by `searchUnitService` but numeric keys are always strings\n // Swap key/value and coerce to number\n _.invert(searchUnitService.getDirectionStrings()), v => v * 1\n );\n scope.transferTypes = _.mapValues(\n _.invert(searchUnitService.getTransferTypeStrings()), v => v * 1\n );\n const destinationTypePointTypeMap = {\n 0: searchUnitService.pointType.Unknown,\n 1: searchUnitService.pointType.Estab,\n 2: searchUnitService.pointType.Location,\n 3: searchUnitService.pointType.Unknown,\n 4: searchUnitService.pointType.Unknown,\n 5: searchUnitService.pointType.Unknown,\n 10: searchUnitService.pointType.Unknown\n };\n const pointTypeDestinationTypeMap = {\n [searchUnitService.pointType.Unknown]: 0,\n [searchUnitService.pointType.Estab]: 1,\n [searchUnitService.pointType.Location]: 2\n };\n\n // Methods on scope\n scope.destinationAirportSelect = destinationAirportSelect;\n scope.destinationAirportDeselect = destinationAirportDeselect;\n scope.resortSelect = searchUnitService.setResort;\n scope.resortDeselect = resortDeselect;\n scope.directionSelect = directionSelect;\n scope.search = search;\n scope.transferTypeSelect = transferTypeSelect;\n scope.dropOffPointDeselect = dropOffPointDeselect;\n scope.pickUpPointDeselect = pickUpPointDeselect;\n scope.pickUpPointSelect = pickUpPointSelect;\n scope.dropOffPointSelect = dropOffPointSelect;\n scope.pointToPointOneWay = pointToPointOneWay;\n\n // Initialise form\n _restoreSearchCriteria();\n\n function _restoreSearchCriteria() {\n const destination = searchUnitService.getDestinationAirport() || {};\n const airportCode = destination.Code || destination.DestinationAirports || $location.search().air || '';\n if (airportCode && airportCode.indexOf(',') === -1) {\n autocompleter.lookup('transfers', airportCode).then(response => {\n destinationAirportSelect(_.filter(response.data, { Code: airportCode })[0]);\n });\n }\n scope.resort = searchUnitService.getResort();\n scope.model.direction = searchUnitService.getDirection();\n scope.startDate = searchUnitService.startDate(mode);\n scope.endDate = searchUnitService.endDate(mode);\n scope.isStartTimeApprovedByCustomer = searchUnitService.isStartTimeApprovedByCustomer(mode);\n scope.isEndTimeApprovedByCustomer = searchUnitService.isEndTimeApprovedByCustomer(mode);\n scope.occupancy = [occupancyService.reduceOccupancy()];\n directionSelect();\n scope.transferType = searchUnitService.getTransferType();\n transferTypeSelect();\n if (TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\n const pickUpPoint = searchUnitService.getTransferPickUpPoint();\n const dropOffPoint = searchUnitService.getTransferDropOffPoint();\n if (pickUpPoint) {\n pickUpPoint.Type = pointTypeDestinationTypeMap[pickUpPoint.Type];\n }\n if (dropOffPoint) {\n dropOffPoint.Type = pointTypeDestinationTypeMap[dropOffPoint.Type];\n }\n pickUpPointSelect(pickUpPoint);\n dropOffPointSelect(dropOffPoint);\n }\n }\n\n function destinationAirportSelect(a) {\n scope.destinationAirport = a;\n searchUnitService.setDestinationAirport(a, true);\n }\n\n function destinationAirportDeselect() {\n scope.destinationAirport = null;\n return searchUnitService.setDestinationAirport(null);\n }\n\n function resortDeselect() {\n searchUnitService.setResort(null);\n }\n\n function directionSelect() {\n const dir = scope.model.direction;\n\n if (dir != null) {\n scope.isOneWay = (dir === 2); // Airport to resort only\n scope.isReturnOnly = (dir === 3); // Resort to airport only\n\n // Restore any existing search dates\n // `setDirection()` below may have set them to `null`\n restoreDates();\n\n // Update search\n searchUnitService.setDirection(dir);\n }\n }\n\n function restoreDates() {\n if (!scope.isReturnOnly && scope.startDate) {\n searchUnitService.startDate(mode, scope.startDate);\n }\n if (!scope.isOneWay && scope.endDate) {\n searchUnitService.endDate(mode, scope.endDate);\n }\n }\n\n function search() {\n occupancyService.setOccupancy(scope.occupancy);\n ssu.lockScreen('SEARCHINGTRANSFERS');\n sharedSearchUnitService.search(undefined, ssu.showErrors, {\n areaOverride: scope.areaOverride,\n enableTransfersTimeApproval: TRPCONFIG.Domain.EnableTransfersTimeApproval\n });\n }\n\n function transferTypeSelect() {\n scope.isAirportTransfer = (scope.transferType === searchUnitService.transferTypes.AirportTransfer);\n searchUnitService.setTransferType(scope.transferType);\n }\n\n function pickUpPointDeselect() {\n scope.pickUpPoint = null;\n searchUnitService.setTransferPickUpPoint(null);\n }\n\n function dropOffPointDeselect() {\n scope.dropOffPoint = null;\n searchUnitService.setTransferDropOffPoint(null);\n }\n\n function pickUpPointSelect(p) {\n scope.pickUpPoint = p;\n if (p) {\n searchUnitService.setTransferPickUpPoint({\n Type: destinationTypePointTypeMap[p.Type],\n Code: p.Code,\n Description: p.Description || p.Title\n });\n }\n }\n\n function dropOffPointSelect(d) {\n scope.dropOffPoint = d;\n if (d) {\n searchUnitService.setTransferDropOffPoint({\n Type: destinationTypePointTypeMap[d.Type],\n Code: d.Code,\n Description: d.Description || d.Title\n });\n }\n }\n\n function pointToPointOneWay() {\n if (scope.isPointToPointOneWay) {\n scope.model.direction = 2;\n scope.isOneWay = true;\n } else {\n scope.model.direction = 1;\n scope.isOneWay = false;\n }\n searchUnitService.setDirection(scope.model.direction);\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('searchUnit')\n .factory('sharedSearchUnitService', sharedSearchUnitService);\n\nfunction sharedSearchUnitService(\n $route,\n $routeParams,\n $q,\n tripService,\n basketService,\n Area,\n broker,\n $rootScope,\n resourceService) {\n const delayedLinkers = {};\n const areasInfo = Area;\n\n const service = {\n addDelayedLinker,\n getAreaInfo,\n initializeArea,\n search,\n showErrors,\n lockScreen,\n unlockScreen\n };\n\n function addDelayedLinker(linkerFn, key) {\n delayedLinkers[key] = linkerFn;\n }\n\n function getAreaInfo(areaOverride) {\n return areasInfo[(areaOverride || ($route.current && $route.current.$$route ? $route.current.$$route.area : ''))];\n }\n\n function initializeArea(scope, el, attr, controller, key) {\n const tripId = $routeParams.tripId;\n const areaPromise = tripId ? tripService.getTrip(tripId) : $q.when();\n\n areaPromise.then(function loadCriteriaWrapper() {\n _loadCriteria(scope, el, attr, controller, key);\n });\n }\n\n function search(getSearchResultsFn, showErrorsFn, options, searchModel, isFlexibleTripType) {\n if (!options) { options = {}; }\n\n const params = {\n multi: options.multi || false,\n legs: options.legs || null,\n samePage: options.samePage,\n oneWayOnly: options.onewayonly,\n estabId: options.estabId,\n defaultFilters: options.defaultFilters,\n roomSearch: options.roomSearch,\n fid: options.fid,\n fbt: options.fbt,\n fstr: options.fstr,\n hpr: options.hpr,\n flexibleDates: options.flexibleDates,\n prefilterAirlines: options.prefilterAirlines,\n prefilterDirectFlights: options.prefilterDirectFlights,\n enableTransfersTimeApproval: options.enableTransfersTimeApproval,\n postfilterAirlines: options.postfilterAirlines,\n searchModel,\n isFlexibleTripType\n };\n\n basketService.startWorkflow(getAreaInfo(options.areaOverride).flow, params)\n .then(getSearchResultsFn, showErrorsFn);\n }\n\n function _loadCriteria(scope, el, attr, controller, key) {\n function _delayedLinkerWrapper() {\n delayedLinkers[key].call(undefined, scope, el, attr, controller);\n }\n\n _delayedLinkerWrapper();\n }\n\n function showErrors(errors) {\n broker.publish('unblock');\n $rootScope.$emit('unblock');\n $rootScope.$broadcast('flash:error', errors);\n }\n\n function lockScreen(searchMsg, loadingScreenStyle) {\n $rootScope.$emit('block', {\n title: resourceService.get(searchMsg),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle\n });\n\n $rootScope.$broadcast('flash:hide');\n }\n\n function unlockScreen() {\n $rootScope.unlockScreen($rootScope);\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .controller('Resorts', Resorts);\n\nfunction Resorts(searchUnitService, $window) {\n this.setResort = function(item) {\n searchUnitService.setResort(item);\n\n // Timer avoids infinite digest loops\n setTimeout(() => {\n $window.history.back();\n }, 0);\n };\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .controller('TransferAirports', TransferAirports);\n\nfunction TransferAirports(\n searchUnitService,\n destinationService,\n $location,\n $route\n) {\n const cm = this;\n\n cm.setDestinationAirport = setDestinationAirport;\n cm.setDestinations = setDestinations;\n\n searchUnitService.getAirports().then(function(airports) {\n cm.airports = airports;\n });\n\n function setDestinationAirport(airport) {\n searchUnitService.setDestinationAirport(airport, $route.current.area === 'transfers');\n $location.path($route.current.area);\n }\n\n function setDestinations(airport) {\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled) {\n destinationService.getDetails(airport).then(destination => {\n searchUnitService.setDestination(destination);\n setDestinationAirport(destination);\n });\n } else {\n setDestinationAirport(airport);\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .controller('TransferDirection', TransferDirection);\n\nfunction TransferDirection($scope, searchUnitService, $location, $route, resourceService) {\n const cm = this;\n\n cm.directions = [\n { val: 1, name: resourceService.get('RETURN') },\n { val: 2, name: resourceService.get('AIRPORTTORESORT') },\n { val: 3, name: resourceService.get('RESORTTOAIRPORT') }\n ];\n\n cm.transfer = {\n direction: searchUnitService.getDirection()\n };\n\n $scope.$on('radio-clicked', function() {\n searchUnitService.setDirection(cm.transfer.direction);\n $location.path($route.current.area);\n });\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .controller('TransferSearch', TransferSearch);\n\nfunction TransferSearch($scope, $location, transferSearch, $routeParams, basketService, tripService, resourceService, broker, occupancyService, analytics) {\n const cm = this;\n\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGTRANSFERS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-transferSearchCtrl'\n });\n\n tripService.getTrip($routeParams.tripId).then(function(trip) {\n const transferRq = trip && trip.TransfersRequest;\n\n if (transferRq) {\n const searchId = transferRq.AvailabilitySearchId;\n\n transferSearch.getSearchResults(searchId, trip.TripId).then(function(data) {\n cm.transfers = data;\n broker.publish('unblock');\n $scope.$emit('unblock');\n }, function() {\n $location.path('transfers');\n });\n\n tripService.getTransfersRequestSummary($routeParams.tripId)\n .then(summary => cm.summary = summary);\n\n cm.getPricePP = function(totalPrice) {\n const numPassengers = occupancyService.getNumberOfNonInfantPassengers() || 1;\n return totalPrice / numPassengers;\n };\n\n analytics.track('mixpanel', 'TransferPage');\n\n cm.selectTransfer = function(transfer) {\n const data = {\n Title: transfer.Type,\n CostPP: transfer.PerPersonPrice,\n CostTotal: transfer.TotalPrice,\n TotalOptions: cm.transfers.length,\n MinOptionCostTotal: _.first(cm.transfers).TotalPrice,\n MaxOptionCostTotal: _.last(cm.transfers).TotalPrice,\n SupplierName: transfer.SupplierName\n };\n analytics.track('mixpanel', 'OptionsTransferSelected', data);\n basketService.selectTransfer(transfer.TransferId, searchId, trip.BasketId, trip.TripId);\n cm.selectedTransfer = transfer.TransferId;\n };\n\n }\n });\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .service('transferDetail', transferDetail);\n\nfunction transferDetail($http, $cacheFactory, $q, broker) {\n const url = '/api3/transfers/details/';\n let timeout;\n const promiseCache = $cacheFactory.get('detailPromiseCache') || $cacheFactory('detailPromiseCache');\n\n const service = {\n getTransferDetails,\n rehydrate\n };\n\n function getTransferDetails(request) {\n if (timeout != null) {\n timeout.resolve('CANCELLED');\n }\n timeout = $q.defer();\n return $http.post(`${url}get`, request, {\n timeout: timeout.promise,\n customErrCallback(args) {\n if (args.status && args.status !== -1) {\n broker.publish('transferRequestFailed');\n }\n return true;\n }\n\n }).then(function(res) {\n promiseCache.remove(res.data.DetailsSessionId);\n timeout = null;\n return res.data;\n });\n }\n\n function rehydrate(id) {\n if (!promiseCache.get(id)) {\n promiseCache.put(id, $http.post(`${url}getfromsession`, { DetailsSessionId: id }, { ignoreErrors: true }).then(function(res) {\n return res.data;\n }));\n }\n return promiseCache.get(id);\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .service('transferSearch', transferSearch);\n\nfunction transferSearch($http, occupancyService, transferSearchValidator, searchUnitService, $q, tripService, analytics) {\n const domain = TRPCONFIG.Domain;\n const req = {\n CultureCode: domain.CultureCode,\n CurrencyCode: domain.CurrencyCode,\n DomainId: domain.DomainId,\n TradingGroupId: domain.TradingGroup\n };\n let results;\n let inProgress;\n const url = '/api3/transfers/availability/';\n\n const service = {\n validateSearchCriteria,\n clearSearchResults,\n getSearchResults,\n search,\n getAvailabilityRequest,\n getUrl,\n getTransfersTimeApprovalRequired\n };\n\n function _doRequest(r, newSearch) {\n return newSearch ?\n $http.post(`${url}get`, r) :\n $http.post(`${url}getfromsession`, { AvailabilitySearchId: r.AvailabilitySearchId }, { ignoreErrors: true });\n }\n\n function validateSearchCriteria(options) {\n options = options || {};\n let start = searchUnitService.startDate(searchUnitService.transfer);\n let end = searchUnitService.endDate(searchUnitService.transfer);\n const transfersTimeApprovalRequired = getTransfersTimeApprovalRequired(options.enableTransfersTimeApproval);\n if (transfersTimeApprovalRequired) {\n if (!searchUnitService.isStartTimeApprovedByCustomer(searchUnitService.transfer)) {\n start = null;\n }\n if (!searchUnitService.isEndTimeApprovedByCustomer(searchUnitService.transfer)) {\n end = null;\n }\n }\n return transferSearchValidator.validate(\n searchUnitService.getDestinationAirport(),\n searchUnitService.getResort(),\n searchUnitService.getDirection(),\n start,\n end,\n occupancyService.reduceOccupancy(),\n searchUnitService.getLocationId(),\n searchUnitService.getTransferType(),\n searchUnitService.getTransferPickUpPoint(),\n searchUnitService.getTransferDropOffPoint());\n }\n\n function clearSearchResults() {\n results = null;\n }\n\n function getSearchResults(searchId, tripId) {\n if (results && results !== 'null') {\n return $q.when(_.cloneDeep(results));\n }\n return search({ searchId, tripId });\n }\n\n function search(args) {\n if (inProgress != null && !args.newSearch) {\n return inProgress;\n }\n req.AvailabilitySearchId = args.searchId;\n req.TripId = args.tripId;\n if (args.newSearch) {\n const transferType = searchUnitService.getTransferType();\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled && transferType === searchUnitService.transferTypes.AirportTransfer) {\n req.DestinationAirport = searchUnitService.getDestinationAirport();\n req.AirportCode = req.DestinationAirport.Code;\n const route = searchUnitService.getRoute();\n if (route) {\n req.Route = route;\n } else {\n const location = searchUnitService.getLocationId();\n req.LocationId = location || 0;\n }\n } else {\n const pickUpPoint = searchUnitService.getTransferPickUpPoint();\n const dropOffPoint = searchUnitService.getTransferDropOffPoint();\n req.Route = {\n PickUpPoint: pickUpPoint,\n DropOffPoint: dropOffPoint\n };\n }\n\n req.IsFlightPlus = args.isFlightPlus;\n\n //Note we are deliberately cocking up the dates because we have to\n req.ArrivalDate = searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.transfer) : null;\n req.ReturnDate = searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.transfer) : null;\n req.BalanceDueDateOverride = args.BalanceDueDateOverride;\n } else if (args.searchId === '00000000-0000-0000-0000-000000000000') {\n //we get an empty guid back from the availability call when there are no results.\n //This means that there will be nothing in the session so we can just return an empty array\n return $q.when([]);\n }\n analytics.startTimer('TransfersAvailabilityRequest');\n inProgress = tripService.getTripReducedOccupancy(req.TripId).then(occ => {\n occ = occ || occupancyService.reduceOccupancy();\n req.Adults = occ.Adults;\n req.ChildAges = occ.ChildAges;\n const pax = req.Adults + req.ChildAges.length;\n if (args.newSearch) {\n tripService.recordTransferSearch(args.tripId, req);\n }\n return _doRequest(req, args.newSearch)\n .then(function(res) {\n analytics.endTimer('TransfersAvailabilityRequest');\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\n results = res.data.Transfers;\n inProgress = null;\n enrichData(results, pax);\n return _.cloneDeep(results);\n }, function() {\n inProgress = null;\n results = null;\n });\n });\n return inProgress;\n }\n\n function getAvailabilityRequest() {\n return req;\n }\n\n function getUrl() {\n return url;\n }\n\n function enrichData(transfers, totalPax) {\n angular.forEach(transfers, function(transfer) {\n transfer.PerPersonPrice = transfer.TotalPrice / totalPax;\n });\n }\n\n function getTransfersTimeApprovalRequired(enableTransfersTimeApproval) {\n return enableTransfersTimeApproval && TRPCONFIG.Domain.DeviceType !== 'Mobile';\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('transfers')\n .service('transferSearchValidator', transferSearchValidator);\n\nfunction transferSearchValidator(resourceService, dateUtil, occupancyService) {\n const service = {\n validate\n };\n\n function validate(destinationAirport, resort, direction, arrivalDate, returnDate, occupancy, locationId, transferType, pickUpPoint, dropOffPoint) {\n const errors = [];\n const airportToResort = 2;\n const resortToAirport = 3;\n const airportTransferType = 0;\n\n if (occupancyService.moreInfantsThanAdults()) {\n errors.push(resourceService.get('TOOMANYINFANTS'));\n }\n if (!occupancyService.childAgesPopulated()) {\n errors.push(resourceService.get('CHILDAGESERROR'));\n }\n\n if (transferType && transferType !== airportTransferType) {\n if (pickUpPoint == null) {\n errors.push(resourceService.get('SELECTPICKUPPOINT'));\n }\n if (dropOffPoint == null) {\n errors.push(resourceService.get('SELECTDROPOFFPOINT'));\n }\n } else {\n if (destinationAirport == null) {\n errors.push(resourceService.get('SELECTDESTINATIONAIRPORT'));\n }\n if (resort == null && locationId == null) {\n errors.push(resourceService.get('SELECTRESORT'));\n }\n }\n\n if (direction !== resortToAirport) {\n if (arrivalDate == null) {\n errors.push(resourceService.get('SELECTARRIVALDATETIME'));\n } else if (!dateUtil.atLeastOneDayInTheFuture(arrivalDate)) {\n errors.push(resourceService.get('ARRIVALDATEMUSTBEFUTURE'));\n }\n }\n\n if (direction !== airportToResort) {\n if (returnDate == null) {\n errors.push(resourceService.get('SELECTRETURNDATETIME'));\n } else if (direction !== airportToResort && returnDate <= arrivalDate) {\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\n }\n }\n return errors;\n }\n\n return service;\n}\n})();\n","namespace TR {\n 'use strict';\n\n class Review {\n author: string;\n date: string;\n rating: number;\n comment: string;\n }\n\n class AppPromo {\n benefits: { icon:string, title:string }[];\n why: string[];\n androidReviews: Review[];\n IOSReviews: Review[];\n overlay: { image: string, text: string };\n\n constructor(\n private analytics: any\n ) {\n this.analytics.track('mixpanel', 'AppPromoLanding');\n this.benefits = _.map(\n TRPCONFIG.Domain.AppPromoBenefits,\n (b:string) => {\n const [icon, title] = _.split(b, '|');\n return { icon, title };\n });\n\n this.why = TRPCONFIG.Domain.AppPromoWhy;\n this.androidReviews = _.map(TRPCONFIG.Domain.AppPromoAndroidReviews, this._parseReview);\n this.IOSReviews = _.map(TRPCONFIG.Domain.AppPromoIOSReviews, this._parseReview);\n this.overlay = {\n image: `url(\"${TRPCONFIG.Domain.AppPromoOverlayImage}\")`,\n text: TRPCONFIG.Domain.AppPromoOverlayText\n };\n\n $.each({\n 'title':\n `<title>${TRPCONFIG.Domain.AppPromoMetaTitle}`,\n 'meta[name=title]':\n ``,\n 'meta[name=description]':\n ``\n },\n (selector, htmlStr) => {\n $(selector).remove();\n $('head').append(htmlStr);\n }\n );\n }\n\n trackClick(appStore) {\n this.analytics.track('mixpanel', 'AppPromoClick', { appStore });\n }\n\n private _parseReview(review:string) : Review {\n const [ author, date, rating, comment ] = _.split(review, '|');\n return {\n author,\n date,\n rating: parseInt(rating, 10),\n comment\n };\n }\n }\n\n angular\n .module('TR')\n .controller('AppPromo', AppPromo);\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('Home', Home);\r\n\r\nfunction Home(\r\n $route,\r\n broker,\r\n occupancyService,\r\n publicityService,\r\n criteoService\r\n ) {\r\n const cm = this;\r\n const area = $route.current.area;\r\n\r\n publicityService.getStats({\r\n StatisticTypes: 'All'\r\n }).then(data => {\r\n cm.stats = {\r\n numberOfAirlines: data.AirlineCount.Value,\r\n numberOfHotels: data.EstabCount.Value\r\n };\r\n });\r\n\r\n occupancyService.enforceAreaLimits(area);\r\n\r\n // if we arrive at this route we must cancel any outstanding searches\r\n broker.publish('homePageHit');\r\n\r\n criteoService.enqueue({}, 'home', area === 'holidays' ? 4 : 2);\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('LandingPage', LandingPage);\n\nfunction LandingPage(\n $injector,\n resourceService,\n imageService,\n $rootScope,\n $timeout,\n pageStrand,\n loggingService,\n holidayDeals,\n filtering,\n $location,\n $scope,\n recentHotels,\n hotelService,\n $route,\n $filter,\n $routeParams,\n destinationService,\n searchUnitService,\n currentDestination,\n $q,\n broker,\n supportedProducts,\n analytics,\n occupancyService,\n tripService,\n objectTypeService,\n fidParser) {\n const lp = this;\n const seoData = {};\n let destination;\n\n $rootScope.lockScreen($scope, {\n loadingScreenStyle: 'default-landingPageCtrl'\n });\n\n $scope.landingPageV2Loaded = () => {\n if ($location.search().autoSearch !== '1') {\n broker.publish('landingPageV2Loaded');\n loadDeals();\n }\n };\n\n delete $route.current.$$route.area;\n\n function loadDeals() {\n $q.all([\n holidayDeals.find({ pageSize: 8, destination, saveToUrl: false, includeCruises: false }),\n filtering.getFilters(holidayDeals.getDefaultFilters(), pageStrand.get('Holiday'))\n ]).then(([deals, filters]) => {\n _.forEach(deals.Products, deal => deal.ImageUrl = deal.CroppedImage);\n $scope.deals = {\n Products: deals.Products,\n Aggregates: deals.Aggregates,\n Filters: filters\n };\n });\n }\n\n $scope.goToDeal = deal => {\n let selected = deal.HolidayDeals[0];\n let estabId = deal.Id;\n let occupancy = occupancyService.getOccupancy();\n $scope.$emit('block', {\n title: resourceService.get('LOADINGHOTELS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-landingPageCtrl-selectRecommendation'\n });\n tripService\n .getTripIdForHolidayDeal(selected, occupancy)\n .then(tripId => $location.path(`/holidays/${tripId}/${estabId}`));\n };\n\n currentDestination.getCurrentDestination()\n .then(updateDest)\n .then(updateNoIndexFollow)\n .then(getSeoData)\n .then(setDOMContent)\n .then(() => {\n if ($location.search().autoSearch !== '1') {\n broker.publish('unblock');\n }\n });\n\n function updateDest(dest) {\n if (dest == null) {\n loggingService.logWarn(`failed to look up destination for friendly url ${$routeParams.landingPage}`);\n $rootScope.unlockScreen($scope);\n $location.replace();\n $location.path('pagenotfound');\n return dest;\n }\n\n lp.destination = dest;\n\n //if this is a hotel it's always going to have pagestrand 1 so we need to customer for the tm=1 qs param\n if (destinationService.destinationIsEstab(dest)) {\n analytics.track('mixpanel', dest.PageStrand === 1 ? 'HotelLandingPage' : 'HolidayLandingPage');\n analytics.incrementPeopleEvent(dest.PageStrand === 1 ? 'HotelLandingPage visit' : 'HolidayLandingPage visit');\n }\n\n\n function supportedProduct() {\n if (dest.PageStrand === 1) {\n return supportedProducts.isProductSupported(supportedProducts.products.hotels);\n }\n return supportedProducts.isProductSupported(supportedProducts.products.holidays);\n }\n\n if (!supportedProduct()) {\n $location.replace();\n $location.path('/');\n $rootScope.unlockScreen($scope);\n $q.reject();\n return;\n }\n\n\n destination = { Type: dest.Type, Id: dest.Id };\n\n $route.current.$$route.area = pageStrand.toRoute(dest.PageStrand);\n\n //we might be coming back here from selecting a new destination from the autocompleter in mobile\n //so we need to check whether destination is already and we are just changing it in the search unit\n const currentDest = searchUnitService.getDestination();\n if (currentDest == null || !currentDest.changed) {\n return searchUnitService.setDestination(dest, false, true).then(setTemplate);\n }\n return setTemplate(dest);\n }\n\n function getSeoData(dest) {\n // Get available SEO data once `setTemplate` has run\n if (dest == null) { return; }\n\n const subscriberName = 'landingPageCtrl';\n\n // Get resource strings\n seoData.inOrNearStr = resourceService.get(\n dest.IsPOI ? 'NearDestination' : 'InDestination'\n );\n\n // Hotel\n if ($scope.hotel) {\n return dest; // No extra data needed\n } else if (destinationService.destinationIsCountry(dest)) { // Country\n // Get lowest price when data is ready\n analytics.track('mixpanel', 'CountryLandingPage');\n analytics.incrementPeopleEvent('CountryLandingPage visit');\n return $q(resolve => {\n broker.subscribeOnce(subscriberName, 'landingPageV2Loaded', () => {\n resolve(dest);\n });\n broker.subscribeOnce(subscriberName, 'destTopChildrenRetrieved', results => {\n seoData.price = getLowestPrice(\n results && results.data, 'MinHotelPrice'\n );\n resolve(dest);\n });\n });\n }\n // Not Hotel or Country\n // Get lowest price when data is ready\n return $q(resolve => {\n broker.subscribeOnce(subscriberName, 'landingPageV2Loaded', () => {\n resolve(dest);\n });\n broker.subscribeOnce(subscriberName, 'hotelResultsModified', results => {\n const data = results && results.data;\n seoData.price = getLowestPrice(\n data && data.Hotels, 'IndicativeMinPrice'\n );\n resolve(dest);\n });\n });\n }\n\n function setDOMContent(dest) {\n if (dest == null) { return; }\n\n const dataPoints = [\n // `alt` is resource name to use if transformed string exceeds `max` length\n { name: 'MetaTitle', max: 59, alt: 'AltMetaTitle' },\n { name: 'MetaDescription', max: 159, alt: 'AltMetaDescription' },\n { name: 'PageTitle' },\n { name: 'PageHeading' }\n ];\n const hotel = $scope.hotel;\n dest.IsPreview = ($routeParams.ispreview !== undefined && $routeParams.ispreview.toLowerCase() === 'true');\n // Create content from string templates\n destinationService.getText(dest)\n .then(templStrings => {\n // Get values from available data\n const varMap = getVarMap(hotel, dest);\n const descStrings = {};\n\n // Replace {vars} in `templStrings`\n dataPoints.forEach(dataPoint => {\n const dataName = dataPoint.name;\n const maxChars = dataPoint.max;\n const templStr = templStrings[dataName] || '{name}';\n let transformedStr = String.supplant(templStr, varMap) || '';\n\n // If `max` chars specified, use `alt` template if it exists\n if (maxChars && transformedStr.length > maxChars) {\n const altTemplStr = templStrings[dataPoint.alt];\n if (altTemplStr) {\n transformedStr = String.supplant(altTemplStr, varMap);\n }\n }\n descStrings[dataName] = transformedStr;\n });\n\n // Add HotelSummary if available\n descStrings.HotelSummary = hotel && hotel.Summary || undefined;\n descStrings.MetaRobots = templStrings.MetaRobots || undefined;\n // Image url i.e. `og:image`\n descStrings.imageURL = imageService.getLandingPageImage(dest);\n\n // Update HTML elements\n updateDOM(descStrings);\n });\n }\n\n function getAbParam() {\n let qs = $location.search();\n const fid = fidParser.parse();\n if (fid || qs.fbt || qs.fstr || qs.hpr) {\n return 1;\n }\n return qs.ab || TRPCONFIG.Domain.LandingPagesV2Control || 1;\n }\n\n function getTemplate(dest, ab) {\n const strand = pageStrand.toRoute(dest.PageStrand);\n let params = objectTypeService.getObjectTypeAndId(dest);\n params.ab = ab;\n\n switch (destinationService.getDestinationType(dest)) {\n case destinationService.country:\n return $q.when(`partials/${strand}/country?${$.param(params)}`);\n case destinationService.estab:\n recentHotels.set(dest.EstablishmentId);\n\n return hotelService.getHotel(null, dest.EstablishmentId).then(function(hotel) {\n broker.publish('hotelCacheReady', hotel);\n delete hotel.Rooms;\n $scope.hotel = hotel;\n return `partials/${strand}/hotellanding?landing=true`;\n });\n\n default:\n params.landing = true;\n return $q.when(`partials/${strand}/hotelsearch?${$.param(params)}`);\n }\n }\n\n function setTemplate(dest) {\n let ab = getAbParam(dest);\n return getTemplate(dest, ab).then(function(template) {\n lp.template = template;\n return dest;\n });\n }\n\n function getLowestPrice(hotels, priceProp) {\n const prices = [];\n if (Array.isArray(hotels)) {\n hotels.forEach(hotel => {\n const price = hotel && hotel[priceProp];\n if (price) {\n prices.push(price);\n }\n });\n }\n return _.min(prices) || undefined;\n }\n\n function getVarMap(hotel, dest) {\n // Variable mapping in string templates i.e. {name}\n // Also supports legacy numeric vars i.e. {0}\n const getBcTitle = destinationService.getBreadcrumbTitle;\n\n // If hotel data exists\n if (hotel) {\n return {\n 0: hotel.Title,\n 1: seoData.inOrNearStr,\n 2: `${hotel.Province}, ${hotel.Country}`,\n name: hotel.Title,\n in: seoData.inOrNearStr,\n price: $filter('roundedCurrency')(hotel.IndicativeMinPrice),\n province: hotel.Province,\n country: hotel.Country,\n location: hotel.Location\n };\n }\n\n // Else get destination data\n return {\n 0: dest.Title,\n 1: seoData.inOrNearStr,\n name: dest.ShortTitle,\n in: seoData.inOrNearStr,\n price: $filter('roundedCurrency')(seoData.price),\n country: getBcTitle(dest, bc => bc.ObjectId === dest.CountryId),\n province: getBcTitle(dest, bc => bc.ObjectId === dest.ProvinceId),\n number: `${dest.HotelCount}` // String for continuity\n };\n }\n\n function updateDOM(descStrings) {\n // Update page title\n document.title = descStrings.PageTitle;\n\n // Replace or create DOM elements: {selector: htmlStr, ...}\n $.each({\n 'meta[name=title]':\n ``,\n 'meta[name=description]':\n ``,\n 'meta[property=\"og:title\"]':\n ``,\n 'meta[property=\"og:description\"]':\n ``\n },\n (selector, htmlStr) => {\n $(selector).remove();\n $('head').append(htmlStr);\n }\n );\n //Update meta robots\n if (_.get(descStrings, 'MetaRobots.length') > 0) {\n const robots = $('meta[name=\"robots\"]');\n if (robots.length > 0) {\n robots.attr('content', descStrings.MetaRobots);\n } else {\n $('head').append(``);\n }\n }\n // Update or create og:image\n // If present replace the standard site logo, otherwise add the 'og:image' tag from scratch\n const ogImage = $('meta[name=\"og:image\"]');\n if (ogImage) {\n ogImage.attr('content', descStrings.imageURL);\n } else {\n $('head').append(``);\n }\n }\n\n function updateNoIndexFollow(dest) {\n if (dest && dest.HotelCount === 1) {\n const destinationType = destinationService.getDestinationType(dest);\n if (destinationType !== destinationService.estab) {\n broker.publish('ISNOINDEXFOLLOW', { isNoIndexFollow: true });\n }\n }\n return dest;\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('LoadingScreen', LoadingScreen);\n\nfunction LoadingScreen($scope, resourceService, publicityService, searchUnitService, currentDestination, broker, tripService, $route, funcUtil, $timeout, $rootScope, analytics) {\n const cm = this;\n const properties = { name: resourceService.getDeferred('PROPERTIES'), icon: 'icon-hotels' };\n const reviews = { name: resourceService.getDeferred('HOTELREVIEWS'), icon: 'icon-reviews' };\n const airlines = { name: resourceService.getDeferred('AIRLINES'), icon: 'icon-flights' };\n\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\n publicityService.getStats({\n CultureCode: TRPCONFIG.Domain.CultureCode,\n StatisticTypes: 'All',\n SearchDate: searchUnitService.startDate(searchUnitService.flight) || searchUnitService.startDate(searchUnitService.hotel)\n }).then(function(data) {\n cm.stats = data;\n properties.count = data.EstabCount;\n reviews.count = data.ReviewCount;\n airlines.count = data.AirlineCount;\n });\n }\n\n $scope.$watch('searching', function(v) {\n if (v) {\n currentDestination.getCurrentDestination().then(function(dest) {\n cm.destination = dest;\n TRPCONFIG.searchState = 'searching';\n });\n }\n TRPCONFIG.searchState = 'resultloaded';\n });\n\n broker.subscribe('LoadingScreen', 'tripUpdated', function(trip) {\n (trip.data.TripId ? tripService.getTripDestination(trip.data.TripId)\n : currentDestination.getCurrentDestination())\n .then(dest => cm.destination = dest);\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('LoadingScreen');\n });\n\n cm.chooseStyles = loadingScreenStyle => {\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\n if (window.logLoadingScreenStyle) {\n console.log('loadingScreenStyle: ', loadingScreenStyle);\n }\n\n const strippedloadingScreenStyle = (loadingScreenStyle || '').split('-')[0];\n\n switch (strippedloadingScreenStyle) {\n case 'booking':\n cm.showBookMessage = true;\n cm.scalemessages = [];\n if (!cm.usp) {\n cm.usp = ['USPHOLIDAYDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\n }\n break;\n case 'hotels':\n cm.showBookMessage = false;\n cm.scalemessages = [properties, reviews];\n cm.usp = ['USPDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\n break;\n case 'flights':\n cm.showBookMessage = false;\n cm.scalemessages = [airlines];\n cm.usp = ['USPLOWESTPRICES'];\n break;\n default:\n cm.showBookMessage = false;\n cm.scalemessages = [properties, reviews, airlines];\n cm.usp = ['USPHOLIDAYDEPOSIT', 'USPFLEXIBLEPAYMENT', 'USPLOWESTPRICES'];\n break;\n }\n }\n };\n\n $timeout(() => {\n const area = $route.current && $route.current.$$route && $route.current.$$route.area;\n cm.chooseStyles(`${area}-loadingScreenCtrl`);\n });\n\n let windowPrerenderReadyTrue = _.debounce(() => window.prerenderReady = true, 1000);\n let key = 'timer';\n let scrollTimeout;\n\n $rootScope.$on('block', function(ev, data) {\n window.prerenderReady = false;\n analytics.endTimer(key);\n scrollTimeout = $timeout(function() {\n // This will be cancelled if unblock runs immediately\n // Avoids scroll during form validation\n scrollTo(0, 0);\n });\n $scope.title = data.title;\n $scope.subtitle = data.subtitle;\n $rootScope.searching = true;\n $scope.searching = true;\n if ($scope.cm && $scope.cm.chooseStyles) {\n $scope.cm.chooseStyles(data.loadingScreenStyle);\n }\n key = $scope.title || 'timer';\n analytics.startTimer(key);\n });\n\n function unblock() {\n windowPrerenderReadyTrue();\n $rootScope.searching = false;\n $scope.searching = false;\n $timeout.cancel(scrollTimeout);\n analytics.endTimer(key);\n }\n $rootScope.$on('unblock', unblock);\n broker.subscribe('LoadingScreenDirective', 'unblock', unblock);\n $scope.$on('$destroy', () => broker.unsubscribe('LoadingScreenDirective'));\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('NotFound', NotFound);\n\nfunction NotFound(basketService,\n analytics,\n broker,\n occupancyService,\n $scope,\n $location,\n $route,\n savedSearchService) {\n broker.publish('unblock');\n const cm = this;\n const type = {\n 3: basketService.holidayBooking,\n 2: basketService.hotelBooking,\n 4: basketService.transferBooking\n };\n cm.area = $route.current.area;\n\n savedSearchService.getSavedSearches().then(function(searches) {\n cm.mostRecent = _.head(searches);\n if (cm.mostRecent) {\n cm.mostRecent.occupancyStr = occupancyService.getOccupancyString(cm.mostRecent.Rooms);\n }\n });\n\n cm.restore = function() {\n if (cm.mostRecent == null) {\n $location.path(`/${cm.area}`);\n } else {\n $scope.$emit('block', {\n title: null,\n loadingScreenStyle: 'default-notFoundCtrl'\n });\n savedSearchService.restoreSearch(cm.mostRecent).then(function() {\n basketService.startWorkflow(type[cm.mostRecent.SearchType]);\n analytics.trackEvent({ label: 'rescued from trip 404' });\n });\n }\n };\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('Occupancy', Occupancy);\r\n\r\nfunction Occupancy($window, occupancyService, arrayUtil, $route) {\r\n const cm = this;\r\n const area = $route.current.area;\r\n\r\n cm.adultRange = occupancyService.adultRange(area);\r\n cm.ages = occupancyService.ages;\r\n cm.applyOccupancy = occupancyService.applyOccupancy;\r\n cm.childRange = occupancyService.childRange(area);\r\n cm.childrenChanged = childrenChanged;\r\n cm.maxAge = area === 'marhaba' ? 12 : 17;\r\n cm.occupancyAgeConfig = {\r\n Min: 0,\r\n Max: cm.maxAge\r\n };\r\n\r\n cm.addRoom = addRoom;\r\n cm.removeRoom = removeRoom;\r\n cm.showRoom = showRoom;\r\n cm.isActive = isActive;\r\n cm.occupancy = occupancyService.getOccupancy();\r\n cm.passengerCount = occupancyService.getPassengerCount();\r\n\r\n //if this is transfers / marhaba / insurance occupancy then rooms don't make sense and we need to merge the occupancy into one room\r\n if (area === 'transfers' || area === 'marhaba' || area === 'insurance' || area === 'flights') {\r\n cm.occupancy = [occupancyService.reduceOccupancy()];\r\n }\r\n\r\n cm.currentRoom = cm.occupancy[0];\r\n\r\n _countChildren();\r\n\r\n occupancyService.onApplyOccupancy(function() {\r\n setTimeout(function() {\r\n occupancyService.setOccupancy(cm.occupancy);\r\n occupancyService.setPassengerCount(cm.passengerCount);\r\n $window.history.back();\r\n }, 0);\r\n });\r\n\r\n function isActive(room) {\r\n return room === cm.currentRoom ? 'active' : '';\r\n }\r\n\r\n function childrenChanged() {\r\n arrayUtil.addOrRemove(cm.currentRoom.ChildAges, cm.currentRoom.numChildren, function() {\r\n // Default child age\r\n return 8;\r\n });\r\n }\r\n\r\n function addRoom() {\r\n cm.occupancy = occupancyService.addRoom();\r\n cm.currentRoom = cm.occupancy[cm.occupancy.length - 1];\r\n _countChildren();\r\n }\r\n\r\n function removeRoom(index) {\r\n cm.occupancy = occupancyService.removeRoom(index);\r\n cm.currentRoom = cm.occupancy[cm.occupancy.length - 1];\r\n }\r\n\r\n function showRoom(index) {\r\n cm.currentRoom = cm.occupancy[index];\r\n }\r\n\r\n function _countChildren() {\r\n cm.occupancy.forEach(function(o) {\r\n o.numChildren = (o.ChildAges || []).length;\r\n });\r\n }\r\n}\r\n})();\r\n","'use strict';\nnamespace TR {\n\n class PromotionTermsPageConfig {\n imgUrl: string;\n subTitle1: string;\n subTitle2: string;\n title: string;\n titleText: string;\n }\n\n class PromotionTerm {\n Name: string;\n Text: string;\n }\n\n class PromotionTerms {\n word: string;\n promotionTermsPageConfig: PromotionTermsPageConfig;\n isLoading: boolean;\n promotionsTermsList: PromotionTerm[];\n\n constructor(\n private hotelSearch: any\n ) {\n this.promotionTermsPageConfig = TRPCONFIG.Domain.PromotionTermsPageConfig;\n this.hotelSearch.getPromotionTerms().then(res => {\n this.promotionsTermsList = res;\n })\n .catch(function () { return false; });\n }\n }\n\n angular\n .module('TR')\n .controller('PromotionTerms', PromotionTerms);\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('RootController', RootController);\r\n\r\nfunction RootController($rootScope,\r\n $scope,\r\n $location,\r\n $route,\r\n $interval,\r\n bootstrapper,\r\n publicityService,\r\n locationService,\r\n imageService,\r\n modalService,\r\n currentDestination,\r\n agentModeService,\r\n broker,\r\n globalisationService,\r\n analytics) {\r\n const rc = this;\r\n let sidebarMenuOpen = false;\r\n\r\n bootstrapper.init();\r\n\r\n $scope.$on('$routeChangeStart', function(scope, next) {\r\n rc.hideDistractionLinks = !!next.hideDistractionLinks;\r\n rc.hideTravelAgentLinks = !!next.hideTravelAgentLinks;\r\n rc.hideSiteFooter = !!next.hideSiteFooter;\r\n rc.hideFooterToolbar = !!next.hideFooterToolbar;\r\n rc.inTransactionalFlow = !!next.inTransactionalFlow;\r\n rc.bodyUncontained = !!next.bodyUncontained;\r\n rc.minimalHeader = false;\r\n rc.closeModal();\r\n rc.hideSiteMailingSignUp();\r\n rc.showSfChat = !!next.pathParams.tripId;\r\n });\r\n\r\n broker.subscribe('RootController', 'hideFooter', () => rc.hideSiteFooter = true);\r\n broker.subscribe('RootController', 'stripHeader', () => rc.minimalHeader = true);\r\n\r\n rc.showPopup = false;\r\n rc.popupUrl = '';\r\n rc.impersonatedUserName = false;\r\n rc.preventPopupClose = true;\r\n rc.hideHeaderBar = false;\r\n rc.modalParams = null;\r\n rc.agentModeEnabled = TRPCONFIG.Domain.isAgentMode;\r\n rc.DomainHostName = TRPCONFIG.Domain.HostName;\r\n rc.hideFooterToolBar = TRPCONFIG.Domain2.FooterToolBarABTest;\r\n\r\n $scope.$on('$routeChangeSuccess', function() {\r\n const regEx = /.*\\/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}[0-9a-fA-F]{0,1}[/]*?/;\r\n let abtesttUrl = ($location.$$path.match(regEx) || $location.$$path.match(/attractions/));\r\n const abtesttUrlMatched = abtesttUrl && abtesttUrl.input;\r\n if (abtesttUrlMatched) {\r\n rc.hideMinimalHeader = window.TRPCONFIG.Domain2.HideMinimalHeader;\r\n } else {\r\n rc.hideMinimalHeader = false;\r\n }\r\n\r\n // this is needed to poll for when the googletag api is ready and then we force a refresh\r\n let googletagPoll;\r\n if ((TRPCONFIG.Domain2.Platform195EnabledPages.includes('home') ||\r\n TRPCONFIG.Domain2.Platform195MobileEnabledPages.includes('home')) &&\r\n window.googletag &&\r\n $location.path() === '/'\r\n ) {\r\n googletagPoll = $interval(() => {\r\n if (window.googletag && window.googletag.apiReady) {\r\n const slots = document.querySelectorAll('.platform-195-slot');\r\n let refreshSlots = 0;\r\n slots.forEach(({ innerHTML }) => {\r\n if (/googletag\\.cmd\\.push/.test(innerHTML) && (!/google_ads_iframe/.test(innerHTML))) {\r\n refreshSlots++;\r\n }\r\n });\r\n if (refreshSlots > 0) {\r\n window.googletag.pubads().refresh();\r\n }\r\n $interval.cancel(googletagPoll);\r\n }\r\n }, 10);\r\n }\r\n });\r\n\r\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.ShowAgentOfficeSelector) {\r\n agentModeService.getAgentInformation().then(function(data) {\r\n if (data) {\r\n const officeLocations = data.OfficeLocations;\r\n if (officeLocations && officeLocations.length > 0) {\r\n rc.enableOfficeChange = officeLocations.length > 1;\r\n officeLocations.forEach(loc => {\r\n if (loc.Id === data.CurrentOfficeLocation) {\r\n rc.selectedOfficeLocation = loc.Name;\r\n }\r\n });\r\n }\r\n const permittedDomains = data.PermittedDomains;\r\n let permittedRegions;\r\n if (permittedDomains) {\r\n globalisationService.getAllDomains().then(allDomains => {\r\n const currentDomain = allDomains.filter(d => d.Id === TRPCONFIG.Domain.DomainId)[0];\r\n const parentDomainId = currentDomain.ParentId ? currentDomain.ParentId : TRPCONFIG.Domain.DomainId;\r\n const parentSubDomains = allDomains.filter(d => d.ParentId === parentDomainId);\r\n if (permittedDomains.length === 0) {\r\n permittedRegions = parentSubDomains;\r\n } else {\r\n permittedRegions = parentSubDomains.filter(d => permittedDomains.indexOf(d.Id) !== -1);\r\n }\r\n rc.enableDomainChange = permittedRegions.length > 1;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n rc.queryString = () => {\r\n return location.search.replace('?', '');\r\n };\r\n\r\n rc.filmCampaignTrack = (event, channel) => {\r\n const Page = $location.path().match('[^/]+$')[0];\r\n const data = { Page };\r\n if (channel) {\r\n data.Channel = channel;\r\n }\r\n analytics.track('mixpanel', event, data);\r\n };\r\n\r\n modalService.onLaunch(function(val, preventClose, hideHeaderBar) {\r\n rc.modal(val, preventClose, hideHeaderBar);\r\n });\r\n\r\n modalService.onClose(function() {\r\n rc.closeModal();\r\n });\r\n\r\n rc.modal = function(path, preventClose, hideHeaderBar, modalParams) {\r\n rc.preventPopupClose = preventClose;\r\n rc.popupUrl = path;\r\n rc.showPopup = true;\r\n rc.hideHeaderBar = hideHeaderBar;\r\n rc.modalParams = modalParams;\r\n };\r\n\r\n rc.enableHotelSearchResultsPageDesignChangeABTest = function() {\r\n return window.TRPCONFIG.Domain2.EnableHotelSearchResultsPageDesignChange;\r\n };\r\n\r\n rc.closeModal = function() {\r\n rc.popupUrl = '';\r\n rc.showPopup = false;\r\n };\r\n\r\n if (TRPCONFIG.DeviceSettings.PublicityMessagingEnabled) {\r\n publicityService.getStats({\r\n StatisticTypes: 'All'\r\n }).then(function(stats) {\r\n rc.stats = stats;\r\n });\r\n }\r\n\r\n rc.home = () => {\r\n locationService.home();\r\n };\r\n\r\n rc.go = function(path) {\r\n $location.path(path);\r\n };\r\n\r\n rc.menuClicked = function(e) {\r\n sidebarMenuOpen = !sidebarMenuOpen;\r\n $scope.$broadcast('menuClicked');\r\n if (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n rc.hideOverflow = function() {\r\n return sidebarMenuOpen ? 'hide-overflow' : '';\r\n };\r\n\r\n rc.hideSiteMailingSignUp = function() {\r\n let url = $location.path();\r\n if (!url.match(/prefetch/gi)) {\r\n if (TRPCONFIG.IsMobileDevice) {\r\n rc.hideSiteMailingListSignUp = url === '/' || !!url.match(TRPCONFIG.Domain.HideSiteMailingSignUpMobile, 'gi');\r\n } else {\r\n rc.hideSiteMailingListSignUp = url === '/' || !!url.match(TRPCONFIG.Domain.HideSiteMailingSignUpDesktop, 'gi');\r\n }\r\n }\r\n };\r\n\r\n broker.subscribe('RootController', 'hideNavigationDrawer', function() {\r\n sidebarMenuOpen = false;\r\n });\r\n\r\n broker.subscribe('RootController', 'userExtended', function(extendedUser) {\r\n if (!extendedUser || !extendedUser.data) {\r\n return;\r\n }\r\n\r\n const customer = extendedUser.data;\r\n\r\n if (customer.FirstName && customer.LastName) {\r\n rc.impersonatedUserName = `${customer.FirstName} ${customer.LastName}`;\r\n }\r\n\r\n if (customer.Contact && customer.Contact.FirstName && customer.Contact.LastName) {\r\n return rc.impersonatedUserName = `${customer.Contact.FirstName} ${customer.Contact.LastName}`;\r\n }\r\n });\r\n\r\n broker.subscribe('RootController', 'userDeimpersonated', function() {\r\n rc.impersonatedUserName = false;\r\n });\r\n\r\n rc.brokerPublish = function(key, val) {\r\n broker.publish(key, val);\r\n };\r\n\r\n $(window).on('resize', _.debounce(function() {\r\n /*this doesn't do anything but it appears to trigger a digest on\r\n windows resize which is what we want.*/\r\n }, 100));\r\n\r\n\r\n broker.subscribe('RootController', 'destinationChanged', _updateShowCaseStyle);\r\n\r\n function _updateShowCaseStyle() {\r\n currentDestination.getCurrentDestination().then(function(dest) {\r\n let url = imageService.getLandingPageImage(dest);\r\n rc.showcaseStyle = url ? { 'background-image': `url(${url})` } : undefined; //prevent bindonce from giving up until we have a value\r\n\r\n const hero = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.MobileDestinationOverlay.ImageSrc');\r\n rc.promoOverlayStyle = hero && dest ? { 'background-image': `url(${hero})` } : { display: 'none' };\r\n\r\n rc.destination = dest;\r\n\r\n const mobileBannerImage = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.MobileBanner.ImageSrc');\r\n\r\n rc.sale = mobileBannerImage && !rc.destination;\r\n url = url || mobileBannerImage;\r\n if (url) {\r\n rc.heroStyle = { 'background-image': `url(${url})` };\r\n }\r\n rc.heroStyleSkip = rc.destination == null ? { 'background-image': 'url(build/img/beach-background.png)' } : rc.heroStyle;\r\n });\r\n }\r\n\r\n _updateShowCaseStyle();\r\n\r\n rc.backgroundStyle = function() {\r\n const loadingScreenBackground = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.ResponsiveInterstitialBackground.ImageSrc');\r\n //if get image from cms enabled then return null\r\n if (TRPCONFIG.Domain.CMSInterstitialImagesEnabled) {\r\n return null;\r\n }\r\n return loadingScreenBackground ? { 'background-image': `url(${loadingScreenBackground})` } : { 'background-image': 'url(build/img/beach-background.png)' };\r\n };\r\n\r\n rc.bannerStyle = function() {\r\n const loadingScreenBanner = _.get(TRPCONFIG, 'Domain.SaleBannerUrls.ResponsiveInterstitialBanner.ImageSrc');\r\n return loadingScreenBanner ? { 'background-image': `url(${loadingScreenBanner})` } : '';\r\n };\r\n\r\n $rootScope.lockScreen = function(scope, data) {\r\n scope.$emit('block', data || {});\r\n };\r\n\r\n $rootScope.unlockScreen = function(sc) {\r\n broker.publish('unblock');\r\n sc.$emit('unblock');\r\n };\r\n\r\n $rootScope.$on('$routeChangeStart', function(_, next) {\r\n rc.showStrapLine = _getStrapLine($location.$$path, next.strapLine);\r\n });\r\n\r\n /*\r\n * Return logic only for all page except \"/pages/terms\"\r\n * @param path\r\n * @param strapLine\r\n * @returns {boolean}\r\n * @private\r\n */\r\n function _getStrapLine(path, strapLine) {\r\n return path === '/pages/terms' ? null : !!strapLine;\r\n }\r\n\r\n $scope.$on('$destroy', () => {\r\n broker.unsubscribe('RootController');\r\n });\r\n\r\n rc.signout = function() {\r\n agentModeService.signout().then(function() {\r\n window.location.href = $location.search().Dest || '/';\r\n });\r\n };\r\n\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('SearchUnit', SearchUnit);\r\n\r\nfunction SearchUnit(\r\n pageStrand,\r\n $timeout,\r\n $scope,\r\n resourceService,\r\n searchUnitService,\r\n $route,\r\n $location,\r\n dateUtil,\r\n $window,\r\n basketService,\r\n broker,\r\n geo,\r\n analytics,\r\n currentDestination,\r\n occupancyService,\r\n holidayDeals,\r\n searchQueryString,\r\n destinationService\r\n) {\r\n const cm = this;\r\n\r\n cm.showTabs = !TRPCONFIG.Domain.CompactMobileTabs || _.includes(['hotels', 'holidays'], $route.current.area);\r\n\r\n const searchMsgs = ['SEARCHINGFLIGHTS', 'SEARCHINGHOTELS', 'SEARCHINGTRANSFERS', 'MARHABASEARCHING', 'SEARCHINGFLIGHTS', 'SEARCHINGINSURANCE'];\r\n\r\n let minimumDate = dateUtil.todayPlus(1, 0, true);\r\n\r\n //none of this needs be done if we're already in the availability path\r\n //because we will not be displaying the search unit\r\n if (cm.hotel && cm.hotel.Rooms != null) {\r\n return;\r\n }\r\n cm.supportsGeo = geo.supported();\r\n\r\n cm.autoCompleterSelect = autoCompleterSelect;\r\n cm.getEndDate = getEndDate;\r\n cm.getStartDate = getStartDate;\r\n cm.setStartDate = setStartDate;\r\n cm.setEndDate = setEndDate;\r\n cm.showStartDate = showStartDate;\r\n cm.showEndDate = showEndDate;\r\n cm.flexibleDates = searchUnitService.flexibleDates === undefined ? true : searchUnitService.flexibleDates;\r\n cm.searchType = $route.current.area;\r\n cm.onewayonly = false;\r\n cm.productToggle = productToggle;\r\n cm.nearby = nearby;\r\n cm.search = search;\r\n\r\n let mode = searchUnitService.flight;\r\n let flow = basketService.holidayBooking;\r\n switch ($route.current.area) {\r\n case 'hotels':\r\n minimumDate = dateUtil.todayPlus(TRPCONFIG.Domain.HotelSearchOffsetDate, 0, true);\r\n if ((new Date()).getUTCHours() >= TRPCONFIG.Domain.TimeCutoffForSameDayHotelSearch) {\r\n //if current time exceeds same day search cutoff, set min date to next day for hotel searches\r\n minimumDate = dateUtil.todayPlus(1, 0, true);\r\n }\r\n mode = searchUnitService.hotel;\r\n flow = basketService.hotelBooking;\r\n break;\r\n case 'transfers':\r\n if (searchUnitService.getDirection() === 3) {\r\n minimumDate = null;\r\n }\r\n mode = searchUnitService.transfer;\r\n flow = basketService.transferBooking;\r\n break;\r\n case 'marhaba':\r\n minimumDate = dateUtil.todayPlus(2, 0, true);\r\n mode = searchUnitService.marhaba;\r\n flow = basketService.marhabaBooking;\r\n break;\r\n case 'flights':\r\n mode = searchUnitService.flight;\r\n flow = basketService.flightBooking;\r\n break;\r\n case 'insurance':\r\n mode = searchUnitService.insurance;\r\n flow = basketService.insuranceBooking;\r\n break;\r\n }\r\n const minimumDatePlusOne = dateUtil.addDays(minimumDate, 1, true) || dateUtil.todayPlus(1, 0, true);\r\n\r\n cm.durations = holidayDeals.DURATIONS.map(d => ({\r\n name: `${d} ${resourceService.get('NIGHTS')}`,\r\n value: d\r\n }));\r\n cm.duration = searchUnitService.duration(mode);\r\n cm.updateDuration = () => {\r\n searchUnitService.duration(mode, cm.duration);\r\n };\r\n cm.focusOnDuration = () => {\r\n $('.duration select[name=\"duration\"]').focus();\r\n };\r\n\r\n // Cabin\r\n cm.cabin = searchUnitService.getCabin();\r\n cm.cabinOptions = searchUnitService.getCabinOptions();\r\n cm.updateCabin = () => {\r\n searchUnitService.setCabin(cm.cabin);\r\n };\r\n\r\n broker.subscribe('SearchUnit', 'savedSearchRestored', function() {\r\n cm.summary = searchUnitService.getSummary(mode);\r\n });\r\n\r\n cm.deselectAllAirlines = () => {\r\n delete searchUnitService.airlines;\r\n $location.search('airlines', null);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n };\r\n\r\n $scope.$on('$destroy', () => {\r\n broker.unsubscribe('SearchUnit');\r\n });\r\n\r\n let waiting = false;\r\n\r\n cm.startDate = searchUnitService.startDate(mode);\r\n cm.endDate = searchUnitService.endDate(mode);\r\n cm.dealsFlexibility = searchUnitService.dealsFlexibility;\r\n cm.outboundDates = searchUnitService.getOutboundDates(mode);\r\n if (cm.startDate) {\r\n cm.startPlusOne = dateUtil.addDays(cm.startDate, 1, true);\r\n }\r\n cm.minDates = {\r\n minimumDate,\r\n startPlusOne: cm.startPlusOne || minimumDatePlusOne\r\n };\r\n\r\n cm.flexibleDatesDisabled = function() {\r\n return TRPCONFIG.Domain2.FlexibleDatesFlowsDisabled.indexOf(searchUnitService.capitalize(cm.searchType)) !== -1;\r\n };\r\n\r\n $scope.$watch('cm.startDate', val => {\r\n if (val) {\r\n cm.showStartCalendar = false;\r\n cm.setStartDate(val);\r\n }\r\n });\r\n $scope.$watch('cm.dealsFlexibility', val => searchUnitService.dealsFlexibility = val);\r\n\r\n loadNearestAirports();\r\n\r\n let clearParams = () => {\r\n //cleardown query params - as otherwise params will override values search unit values when not necessary\r\n $location.replace()\r\n .search('startDate', null)\r\n .search('endDate', null)\r\n .search('depAir', null)\r\n .search('occ', null)\r\n .search('autoSearch', null)\r\n .search('cabin', null);\r\n };\r\n\r\n searchQueryString.getQueryStringValues().then(queryString => {\r\n searchUnitService.airlines = queryString.airlines;\r\n\r\n if (queryString.startDate != null) {\r\n cm.setStartDate(queryString.startDate, false);\r\n }\r\n if (queryString.endDate != null) {\r\n cm.setEndDate(queryString.endDate, false);\r\n }\r\n if (cm.startDate) {\r\n cm.startPlusOne = dateUtil.addDays(cm.startDate, 1, true);\r\n }\r\n if (queryString.airports) {\r\n if (queryString.airports.length === 1) {\r\n searchUnitService.setDepartureAirports(queryString.airports[0]);\r\n } else {\r\n searchUnitService.setDepartureAirports(queryString.airports);\r\n }\r\n }\r\n if (queryString.occupancy != null) {\r\n occupancyService.setOccupancy(queryString.occupancy);\r\n }\r\n if (queryString.autoSearch) {\r\n //set the current destination to run the search against\r\n currentDestination.getCurrentDestination().then(dest => {\r\n if (dest != null) {\r\n cm.autoCompleterSelect(dest, false);\r\n } else if (queryString.destination) {\r\n destinationService.getDetails(queryString.destination[0]).then(destination => {\r\n if (destination != null) {\r\n searchUnitService.setDestination(destination);\r\n searchUnitService.setDestinationAirport(destination);\r\n }\r\n });\r\n searchUnitService.setDestinationAirport(queryString.destination[0]);\r\n }\r\n $timeout(() => {\r\n cm.search();\r\n clearParams();\r\n }, 1000);\r\n });\r\n } else {\r\n clearParams();\r\n }\r\n\r\n cm.summary = searchUnitService.getSummary(mode);\r\n });\r\n\r\n $timeout(function() {\r\n if ($route.current.area === 'transfers') {\r\n const destinationAirports = searchUnitService.getDestinationAirports();\r\n if (destinationAirports && destinationAirports.length > 1) {\r\n searchUnitService.setDestinationAirport();\r\n }\r\n }\r\n\r\n currentDestination.getCurrentDestination().then(function(dest) {\r\n if (dest && !dest.HolidayEnabled && flow === basketService.holidayBooking) {\r\n $scope.$emit('flash:error', String.format(resourceService.get('NOTHOLIDAYENABLED'), dest.Title));\r\n }\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.flightType = searchUnitService.getFlightType().Label;\r\n if (TRPCONFIG.Domain.DurationEnable) {\r\n initDurationInput();\r\n }\r\n });\r\n }, 0);\r\n\r\n function autoCompleterSelect(item, back = true) {\r\n if (!waiting) {\r\n waiting = true;\r\n return searchUnitService.setDestination(item, false, true).then(function(d) {\r\n waiting = false;\r\n d.changed = true;\r\n if (back) {\r\n //this has to go in a setTimeout so that it does not take place in the context of a call to\r\n //$apply. If it does it causes infinite digest loops in some phones\r\n setTimeout(function() {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }); //yuck yak\r\n }\r\n }\r\n\r\n function getStartDate() {\r\n return searchUnitService.startDate(mode);\r\n }\r\n\r\n function getEndDate() {\r\n return searchUnitService.endDate(mode);\r\n }\r\n\r\n function setEndUsingDuration(durationLength) {\r\n let duration = searchUnitService.duration(mode, durationLength);\r\n duration = duration && duration.value || TRPCONFIG.Domain.SearchUnitDurationDefault;\r\n\r\n const endDate = dateUtil.addDays(getStartDate(), duration, true);\r\n setEndDate(endDate, null);\r\n }\r\n\r\n function setStartDate(date, back) {\r\n if (date) {\r\n cm.minDates.startPlusOne = dateUtil.addDays(date, 1, true);\r\n }\r\n searchUnitService.startDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.showStartCalendar = false;\r\n\r\n if (TRPCONFIG.Domain.DurationEnable) {\r\n setEndUsingDuration();\r\n }\r\n\r\n if (back) {\r\n setTimeout(function() {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n\r\n function setEndDate(date, back) {\r\n searchUnitService.endDate(mode, date);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.showEndCalendar = false;\r\n if (back) {\r\n setTimeout(function() {\r\n $window.history.back();\r\n }, 0);\r\n }\r\n }\r\n\r\n function initDurationInput() {\r\n cm.options = searchUnitService.getDurationOptions();\r\n\r\n $scope.$watch('cm.duration', function() {\r\n if (cm.duration) {\r\n setEndUsingDuration(cm.duration || TRPCONFIG.Domain.SearchUnitDurationDefault);\r\n } else if (searchUnitService.duration(mode)) {\r\n cm.duration = cm.options[searchUnitService.duration(mode).index];\r\n } else {\r\n cm.duration = cm.options[0];\r\n }\r\n });\r\n }\r\n\r\n function showStartDate() {\r\n return $route.current.area !== 'transfers' || searchUnitService.requiresStartDate();\r\n }\r\n\r\n function showEndDate() {\r\n return $route.current.area !== 'transfers' || searchUnitService.requiresEndDate();\r\n }\r\n\r\n function productToggle(r) {\r\n if ($route.current.landing) {\r\n let currentStrand = pageStrand.fromRoute();\r\n const strand = pageStrand.opposite(currentStrand);\r\n $location.url(pageStrand.adjustUrl($location.url(), strand));\r\n $route.reload();\r\n } else {\r\n $location.path(r);\r\n }\r\n }\r\n\r\n function nearby(e) {\r\n e.stopPropagation();\r\n cm.gettingLocation = true;\r\n $scope.$emit('flash:error');\r\n geo.getSearchArea().then(function(sa) {\r\n analytics.trackEvent({ label: 'search nearby' });\r\n searchUnitService.setSearchArea(sa);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n cm.gettingLocation = false;\r\n }, function() {\r\n cm.gettingLocation = false;\r\n $scope.$emit('flash:error', resourceService.get('POSITIONUNAVAILABLE'));\r\n });\r\n }\r\n\r\n function search() {\r\n\r\n $scope.$emit('block', {\r\n title: resourceService.get(searchMsgs[flow]),\r\n subtitle: resourceService.get('THISMAYTAKE'),\r\n loadingScreenStyle: 'default-searchUnitCtrl'\r\n });\r\n\r\n searchUnitService.flexibleDates = TRPCONFIG.Domain.FlexibleDatesEnabled ? cm.flexibleDates : true;\r\n searchUnitService.onewayonly = TRPCONFIG.Domain.OneWayFlightsEnabled ? cm.onewayonly : false;\r\n\r\n const isAirlinesPrefilter = !_.some(searchUnitService.airlines, a => a.IsPostfilter);\r\n const params = {\r\n flexibleDates: searchUnitService.flexibleDates,\r\n oneWayOnly: searchUnitService.onewayonly,\r\n prefilterAirlines: isAirlinesPrefilter ? _.map(searchUnitService.airlines, a => a.Code) : [],\r\n postfilterAirlines: !isAirlinesPrefilter ? _.map(searchUnitService.airlines, a => a.Title) : []\r\n };\r\n basketService.startWorkflow(flow, params).then(null, function(errors) {\r\n broker.publish('unblock');\r\n $scope.$emit('unblock');\r\n $scope.$emit('flash:error', errors);\r\n });\r\n }\r\n\r\n function loadNearestAirports() {\r\n const departureAirports = searchUnitService.getDepartureAirports();\r\n if (!departureAirports || !departureAirports.length) {\r\n geo.getNearestAirports().then(airports => {\r\n // Check a second time to not overwrite a departure airport\r\n // that could have been selected before this promise resolved.\r\n const departureAirports = searchUnitService.getDepartureAirports();\r\n if (!departureAirports || !departureAirports.length) {\r\n searchUnitService.setMultipleDepartureAirports(airports);\r\n cm.summary = searchUnitService.getSummary(mode);\r\n }\r\n });\r\n }\r\n }\r\n}\r\n})();\r\n","'use strict';\n\nnamespace TR {\n class SelectDomain {\n\n permittedRegions;\n lightbox: boolean = false;\n officeLocations;\n\n constructor(\n private cookieService,\n private $location: ng.ILocationService,\n private agentModeService,\n private globalisationService,\n private dateUtil\n ) {\n this.lightbox = true;\n\n this.agentModeService.getAgentInformation().then(data => {\n const permittedDomains = data.PermittedDomains;\n this.officeLocations = data.OfficeLocations;\n this.globalisationService.getAllDomains().then(allDomains => {\n const currentDomain = allDomains.filter(d => d.Id === TRPCONFIG.Domain.DomainId)[0];\n const parentDomainId = currentDomain.ParentId ? currentDomain.ParentId : TRPCONFIG.Domain.DomainId;\n const parentSubDomains = allDomains.filter(d => d.ParentId === parentDomainId);\n if (permittedDomains.length === 0) {\n this.permittedRegions = parentSubDomains;\n }\n else {\n this.permittedRegions = parentSubDomains.filter(d => permittedDomains.indexOf(d.Id) !== -1);\n if (this.permittedRegions.length === 1) {\n this.setSelectedDomain(this.permittedRegions[0].Id);\n }\n }\n });\n });\n }\n\n setSelectedDomain(selectedDomain) {\n this.cookieService.set('SubDomainID', selectedDomain, this.dateUtil.addDays(new Date(), 365));\n if (this.officeLocations.length === 1) {\n this.agentModeService.setOfficeLocation(this.officeLocations[0].Id).then(() => {\n window.location.href = this.$location.absUrl().replace('selectdomain', '');\n });\n } else {\n this.$location.path('selectoffice');\n }\n }\n\n }\n\n angular\n .module('TR')\n .controller('SelectDomain', SelectDomain);\n}\n","'use strict';\n\nnamespace TR {\n class SelectOffice {\n\n lightbox: boolean = false;\n OfficeLocations;\n selectedOffice;\n\n constructor(\n private agentModeService,\n private $location: ng.ILocationService\n ) {\n this.lightbox = true;\n this.agentModeService.getAgentInformation().then(data => {\n this.OfficeLocations = data.OfficeLocations;\n this.selectedOffice = data.CurrentOfficeLocation;\n if (this.OfficeLocations.length === 1) {\n this.setSelectedOffice(this.OfficeLocations[0].Id);\n }\n });\n }\n\n setSelectedOffice(office) {\n this.agentModeService.setOfficeLocation(office).then(() => {\n window.location.href = this.$location.absUrl().replace('selectoffice', '');\n });\n }\n\n }\n\n angular\n .module('TR')\n .controller('SelectOffice', SelectOffice);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('TestDestination', TestDestination);\n\nfunction TestDestination() {\n const cm = this;\n\n cm.LocationName = 'Alcatraz';\n\n\n //cm.activeTabId = 'cakes';\n\n\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('TestHome', TestHome);\n\nfunction TestHome() {\n const cm = this;\n\n cm.activeTabId = 'aaa';\n\n\n cm.dialogOpen = false;\n\n cm.dialogTwoOpen = false;\n\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('TestPage', TestPage);\n\nfunction TestPage() {\n const cm = this;\n\n\n cm.fruits = [];\n\n\n cm.selectedMammals = [];\n\n cm.activeTabId = 'cakes';\n\n cm.mammals = [\n {\n Value: 1,\n Text: 'Bear'\n },\n {\n Value: 2,\n Text: 'Marmot'\n },\n {\n Value: 3,\n Text: 'Porcupine'\n }\n ];\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n class CountBadge {\n\n count: number;\n private output: string;\n\n constructor (\n private $scope: ng.IScope\n ) {\n this.$scope.$watch('cb.count', (val) => {\n if (val) {\n this.output = val < 10\n ? val.toString()\n : '9+';\n }\n });\n }\n }\n\n angular\n .module('core')\n .directive('countBadge', (): ng.IDirective => {\n return {\n scope: {},\n controller: CountBadge,\n controllerAs: 'cb',\n bindToController: {\n count: '='\n },\n template: `{{cb.output}}`,\n replace: true\n };\n\n });\n\n}\n","'use strict';\nclass FilterAllButton {\n clearFilter(filter) {\n filter.splice(0, filter.length);\n }\n}\n\nangular\n .module('TR')\n .directive('filterAllButton', (): ng.IDirective => {\n return {\n controller: FilterAllButton,\n controllerAs: 'fab',\n bindToController: {\n model: '='\n },\n replace: true,\n template: `\n \n
            \n
            {{'FILTERALLBUTTON'|resource}}
            \n `\n };\n });\n","'use strict';\n\nnamespace Attractions {\n\n class Overlay {\n\n isActive: boolean = false;\n el: JQuery;\n elParent: JQuery;\n\n constructor (clickFn: Function) {\n let className = 'attractions-calendar-overlay';\n this.el = $(`.${className}`);\n\n if (!this.el.length) {\n this.el = $(`
            `)\n .appendTo('body')\n .click(clickFn);\n }\n this.elParent = this.el.parent();\n }\n\n show (): void {\n this.isActive = true;\n this.el.show();\n }\n\n resize (winWidth: number): void {\n // Sets width to window unless window is smaller than parent\n this.el.css({\n width: Math.max(this.elParent.width(), winWidth)\n });\n }\n\n hide (): void {\n this.isActive = false;\n this.el.hide();\n }\n }\n\n class AttractionsCalendar {\n\n win: JQuery;\n html: JQuery;\n datepicker: any;\n datepickerEl: any;\n overlay: Overlay;\n parentForm: any;\n legend: any[] = [];\n debouncedOnRender: () => void;\n debouncedSetLayout: () => void;\n dpPosFn: () => any;\n eventNs: string = '.ac';\n htmlCss: any = {};\n\n // Attr\n select: Function;\n minDate: string;\n maxDate: string;\n enabledDates: any = {};\n renderedDates: any = {};\n currentDate: string;\n activeDateFrom: string;\n placeholder: string;\n\n selectedDate: Date | any = this.dateUtil.parseDate(this.currentDate);\n\n\n constructor (\n private $scope,\n private $filter,\n private $window,\n private $q,\n private dateUtil,\n private attractionService,\n private resourceService: Core.ResourceService\n ) {\n $(() => {\n if (!$.datepicker._updateDatepicker_original) {\n // Add `afterShow` event to jquery datepicker\n // https://bugs.jqueryui.com/ticket/6885\n $.datepicker._updateDatepicker_original = $.datepicker._updateDatepicker;\n $.datepicker._updateDatepicker = function(inst) {\n $.datepicker._updateDatepicker_original(inst);\n var afterShow = this._get(inst, 'afterShow');\n if (afterShow) {\n afterShow.apply((inst.input ? inst.input[0] : null));\n }\n };\n }\n this.win = $($window);\n this.html = $('html');\n this.debouncedOnRender = _.debounce(() => this.onRender(), 100);\n this.debouncedSetLayout = _.debounce(() => this.setLayout(), 100);\n this.overlay = new Overlay(() => this.datepicker('hide'));\n });\n }\n\n init (inputEl: JQuery): void {\n this.$q.when(this.selectedDate || this.getFirstPopulatedDate(0))\n .then(date => this.selectedDate = date)\n .then(() => this._init(inputEl));\n }\n\n _init (inputEl: JQuery): void {\n let currDate = new Date();\n\n // Initialise jQuery datepicker http://api.jqueryui.com/datepicker/\n inputEl.datepicker({\n numberOfMonths: 1,\n dateFormat: 'dd-M-yy',\n firstDay: 1,\n defaultDate: this.selectedDate,\n minDate: this.dateUtil.parseDate(this.minDate),\n maxDate: this.dateUtil.parseDate(this.maxDate),\n beforeShowDay: date => this.filterDate(date),\n beforeShow: () => {\n this.enabledDates = {};\n this.datepickerEl.addClass('attractions-calendar');\n this.suppressPositioning();\n this.lockScroll();\n this.getAvailability(\n this.selectedDate ||\n this.activeDateFrom ||\n new Date(currDate.getFullYear(), currDate.getMonth())\n );\n this.overlay.show();\n\n return !inputEl.lastDisplay ||\n (new Date().getTime() - inputEl.lastDisplay > 100);\n },\n afterShow: () => {\n if (this.overlay.isActive) {\n inputEl.blur(); // IE fix cursor showing through overlay\n this.createHeader();\n this.debouncedOnRender();\n this.win.on('resize' + this.eventNs, () => this.debouncedSetLayout());\n }\n },\n onChangeMonthYear: (y, m) => {\n if (this.overlay.isActive) {\n this.getAvailability(new Date(y, m - 1)); // Month is 0 based\n }\n },\n onSelect: () => {\n this.selectDate();\n // http://www.objectpartners.com/2012/06/18/jquery-ui-datepicker-ie-focus-fix/\n inputEl.lastDisplay = new Date().getTime();\n inputEl.blur();\n },\n onClose: () => {\n this.win.off(this.eventNs);\n this.overlay.hide();\n this.renderedDates = {};\n this.datepickerEl.removeClass('active');\n this.restoreScroll();\n\n // This deals with anything typed into the field that changed the value\n let dpDate = this.datepicker('getDate') || '',\n expected = this.selectedDate || '';\n if (dpDate.toString() !== expected.toString()) {\n this.selectDate();\n }\n else {\n this.syncField();\n }\n // Put back positioning for any other datepickers\n this.restorePositioning();\n },\n isRTL: TRPCONFIG.Rtl\n });\n\n if (TRPCONFIG.IsTouchDevice) {\n inputEl.attr('readonly', 'true');\n }\n\n this.datepicker = inputEl.datepicker.bind(inputEl);\n this.datepickerEl = $('#ui-datepicker-div');\n this.watchDateAttr('minDate', 'maxDate');\n\n this.$scope.$watch('ac.parentForm.formModel.date', (value) => {\n if (value == null) {\n this.clearDate();\n }\n });\n }\n\n getFirstPopulatedDate(monthsFromToday: number) {\n if (monthsFromToday > 12) {\n return null;\n }\n let date = this.dateUtil.todayPlus( { months: monthsFromToday} );\n return this.attractionService.getAvailability(\n this.parentForm.productId,\n angular.extend({}, this.parentForm.formModel, { date: date })\n )\n .then(res => {\n const dateIdx = this.getFirstAvailableDateWithTicketsIdx(res);\n const firstDateWithTickets = _.get(res, `Dates[${dateIdx}].Date`);\n\n let firstDate = _.get(res, 'Dates[0].Date');\n\n if (this.activeDateFrom) {\n if (this.dateUtil.compareDates(this.activeDateFrom, firstDateWithTickets) === -1) {\n firstDate = firstDateWithTickets;\n } else {\n firstDate = this.activeDateFrom;\n }\n }\n if (firstDate) {\n return this.dateUtil.parseDate(firstDate);\n } else {\n return this.getFirstPopulatedDate(monthsFromToday + 1);\n }\n });\n }\n\n getFirstAvailableDateWithTicketsIdx (res) {\n return _.findIndex(res.Dates, (obj: any) => {\n return obj.Tickets && obj.Tickets.length > 0;\n });\n }\n\n getDateKey (date) {\n return this.dateUtil.format(date, 'yyyy-MM-dd');\n }\n\n filterDate (date) {\n let isEnabled = true; // Default to allowing date\n if (this.enabledDates) {\n if (!this.enabledDates[this.getDateKey(date)]) {\n isEnabled = false;\n }\n if (this.activeDateFrom && this.dateUtil.compareDates(this.activeDateFrom, date) === 1\n && this.dateUtil.compareDates(date, this.dateUtil.addDays(this.minDate, -1, null)) === 1) {\n return [isEnabled, 'ui-datepicker-inactive', ''];\n }\n }\n return [isEnabled, '', ''];\n }\n\n watchDateAttr (...attr): void {\n this.$scope.$watchGroup(attr.map(k => 'ac.' + k), vals => {\n vals.forEach((v, i) => {\n if (this.datepicker && v != null) {\n this.datepicker('option', attr[i], this.dateUtil.parseDate(v));\n }\n });\n });\n }\n\n showLoading (delay: number): number {\n let spinnerHtml = '
            ',\n i = 8;\n while (i--) {\n spinnerHtml += `
            `;\n }\n return setTimeout(() => {\n $(spinnerHtml + '
            ').hide().fadeIn(1000)\n .appendTo(this.datepickerEl);\n }, delay);\n }\n\n hideLoading (): void {\n this.datepickerEl.find('.preloader').hide();\n }\n\n lockScroll (): void {\n this.htmlCss = {\n overflowY: this.html.css('overflowY'),\n width: 'auto'\n };\n this.html.css({\n overflowY: 'hidden',\n width: $('body').outerWidth()\n });\n }\n\n restoreScroll (): void {\n this.html.css(this.htmlCss);\n }\n\n setLayout (): void {\n let winWidth = this.win.width(),\n winHeight = TRPCONFIG.Domain.DeviceType === 'Mobile' ?\n screen.height : // ios fix\n this.win.height();\n\n // Allow for mobile fixed header\n let header = $('.header-main'),\n headerOffset = header.css('position') === 'fixed' ?\n header.outerHeight() : 0;\n\n this.overlay.resize(winWidth);\n this.win.scrollLeft(0); // input focus can cause window to scroll away\n this.datepickerEl.css({\n left: winWidth / 2,\n top: $(document).scrollTop() - headerOffset,\n 'max-width': winWidth,\n 'max-height': winHeight\n });\n }\n\n onRender (): void {\n // For new months this may run both before and after `getAvailability()`\n this.datepickerEl.addClass('active');\n this.populateDates();\n this.setLayout();\n }\n\n getAvailability (date: Date): void {\n // `renderedDates` suppresses re-rendering a month until calendar is closed\n let dateKey = this.getDateKey(date);\n\n if (!this.renderedDates[dateKey]) {\n let spinnerTimer = this.showLoading(300);\n\n return this.attractionService.getAvailability(\n this.parentForm.productId,\n angular.extend({}, this.parentForm.formModel, {date: date})\n )\n .then(res => {\n let dates = res.Dates;\n clearTimeout(spinnerTimer);\n\n if (res.error) {\n this.hideLoading();\n }\n else {\n this.legend = _.filter(res.Legend, (o: any) => o.Abbreviation);\n dates.forEach(o => {\n let dateStr = this.getDateKey(o.Date);\n if (dateStr && _.get(o, 'Tickets.length', 0) > 0) {\n this.enabledDates[dateStr] = this.sortTickets(\n o.Tickets,\n this.legend.reduce(\n (o, l, i) => (o[l.Label] = i+1) && o, {}\n )\n );\n }\n });\n this.renderedDates[dateKey] = true;\n this.datepicker('refresh'); // Destroys spinner\n }\n });\n }\n }\n\n sortTickets (tickets, order) {\n return tickets.sort((a, b): number =>\n order[a.Label] < order[b.Label] ? -1 :\n order[a.Label] > order[b.Label] ? 1 : 0\n );\n }\n\n syncField (): void {\n // Ensure field contains current value\n this.datepicker('setDate', this.selectedDate);\n }\n\n getLegendChar (key: string): string {\n return (_.find(this.legend, {\n Key: key\n }) || {}).Abbreviation || '';\n }\n\n getPriceHtml (key: string) {\n let htmlStr = '',\n enabledDates = this.enabledDates[key];\n\n if (enabledDates) {\n if (enabledDates.length < 3) {\n // Placeholder for spacing\n htmlStr += '

            ';\n }\n htmlStr += enabledDates.reduce((str, ticket) =>\n `${str}
            ${\n this.getLegendChar(ticket.Key)\n }
            ${\n this.$filter('roundedCurrency')(ticket.Price)\n }

            `, '');\n }\n return htmlStr;\n }\n\n zeroPad (n) {\n n += '';\n return ('00' + n).substr(n.length);\n }\n\n populateDates (): void {\n // Populate data on active calendar DOM elements (only)\n $('.attractions-calendar [data-month]').each((i, el) => {\n let $el = $(el),\n key = $el.attr('data-year') + '-' +\n this.zeroPad(Number($el.attr('data-month')) + 1) + '-' + // Month is 1 based\n this.zeroPad($el.text()); // Seems jQuery datepicker is designed this way `_selectDay()`\n\n // NOTE:
            required even if there's no price data\n $el.append(`
            \n
            ${this.getPriceHtml(key)}
            \n
            `);\n });\n }\n\n createHeader (): void {\n let closeBtn = $(`
            `)\n .click(() => this.datepicker('hide'));\n\n let legendArea = !this.legend.length ? '' :\n `
              ${\n this.legend.reduce((str, o) => `${str}\n
            • ${o.Abbreviation}${o.Label}
            • \n `, '')\n }
            `;\n\n let headerArea = $(`\n
            \n
            ${this.resourceService.get('ATTRACTIONSCALENDARHEADER')}
            \n
            \n ${this.resourceService.get('ATTRACTIONBOOKINGNOTE')}\n
            \n
            `);\n let legendAreaConainer = $(`\n
            \n ${legendArea}\n
            \n `);\n this.datepickerEl.append(legendAreaConainer);\n headerArea.append(closeBtn);\n this.datepickerEl.prepend(headerArea);\n }\n\n clearDate (): void {\n this.selectedDate = null;\n this.syncField();\n this.selectDate();\n }\n\n selectDate (): void {\n let dateOb;\n this.selectedDate = this.datepicker('getDate') || this.selectedDate;\n\n if (this.dateUtil.isValid(this.selectedDate)) {\n dateOb = new Date(\n this.selectedDate.getFullYear(),\n this.selectedDate.getMonth(),\n this.selectedDate.getDate()\n );\n }\n\n this.$scope.$evalAsync(() => {\n if (this.selectedDate == null) {\n this.select({ date: null });\n }\n else {\n // Add price data to parent form for displaying total\n let dateData = this.enabledDates[this.getDateKey(this.selectedDate)];\n if (dateData) {\n dateData.forEach(d => {\n this.parentForm.setPriceData(d.Key, d.Price);\n });\n }\n this.select({\n date: this.dateUtil.serialiseDate(dateOb)\n });\n }\n this.syncField();\n });\n }\n\n suppressPositioning (): void {\n // Suppress datepicker absolute positioning\n this.dpPosFn = $.datepicker._checkOffset;\n $.datepicker._checkOffset = () => ({left:'', top:''});\n }\n\n restorePositioning (): void {\n $.datepicker._checkOffset = this.dpPosFn;\n }\n\n deregister (): void {\n // Clear class for any other datepickers\n this.datepickerEl.removeClass('attractions-calendar');\n this.win.off(this.eventNs);\n $.datepicker._updateDatepicker = $.datepicker._updateDatepicker_original;\n delete $.datepicker._updateDatepicker_original;\n }\n\n }\n\n angular\n .module('TR')\n .directive('attractionsCalendar', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: AttractionsCalendar,\n controllerAs: 'ac',\n bindToController: {\n select: '&',\n minDate: '=',\n maxDate: '=',\n currentDate: '=',\n activeDateFrom: '=',\n placeholder: '@'\n },\n require: '^attractionsProductForm',\n template: `
            \n
            \n \n \n
            \n
            `,\n link: (\n scope: any,\n el: JQuery,\n attr: ng.IAttributes,\n attractionsProductForm: any\n ) => {\n scope.ac.parentForm = attractionsProductForm;\n scope.ac.init(el.find('input'));\n scope.$on('$destroy', () => scope.ac.deregister());\n }\n };\n });\n};\n","(function() {\n'use strict';\n\nangular.module('TR')\n .directive('acceptCookiesBanner', ($timeout, cookieService) => ({\n restrict: 'E',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=acceptcookiesbanner',\n controllerAs: 'ac',\n controller($rootScope) {\n const cookiesAccepted = cookieService.get('CookiesAccepted') || false;\n\n this.hide = cookiesAccepted;\n this.if = !cookiesAccepted;\n\n this.acceptCookies = function() {\n cookieService.set('CookiesAccepted', true, Infinity);\n this.if = false;\n $timeout(() => this.if = false, 1000);\n $rootScope.$emit('cookiesAccepted');\n };\n }\n }));\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\n\nTR.directive('accountMenu', function($rootScope,\n $location,\n authService,\n urlUtils,\n dateUtil,\n cookieService,\n languageService,\n modalService,\n dashboardNotificationService,\n $route,\n accountMenuService,\n broker,\n postBookingLookup,\n resourceService,\n $window,\n $document) {\n return {\n restrict: 'E',\n replace: true,\n priority: 200,\n templateUrl: (el, attrs) => `partials/home/directivetemplate?type=accountmenu${attrs.forNavigationDrawer === 'true' ? 'sidebar' : ''}`,\n link(scope, el, attrs) {\n let menuOpen = false;\n\n scope.forNavigationDrawer = (attrs.forNavigationDrawer === 'true');\n scope.IsTouchDevice = $window.TRPCONFIG.IsTouchDevice;\n\n scope.selectedLanguage = cookieService.get('LANG') || 'en-GB';\n scope.limitAlerts = 2;\n scope.formatNotification = noti => dashboardNotificationService.formatNotification(noti);\n scope.showDashboardMenu = false;\n scope.showNotifications = false;\n scope.showDashboardMenuSidebar = true;\n scope.setLanguage = setLanguage;\n scope.setLanguagePreference = setLanguagePreference;\n scope.sidebarClass = function() { return menuOpen ? 'open' : ''; };\n scope.signOut = signOut;\n scope.user = authService.getUser();\n scope.userName = userName;\n scope.launchNotification = launchNotification;\n scope.launchContactForm = launchContactForm;\n scope.notificationClicked = notificationClicked;\n scope.toggleDashboardMenuSidebar = () => scope.showDashboardMenuSidebar = !scope.showDashboardMenuSidebar;\n scope.toggleNotification = () => {\n scope.showNotifications = !scope.showNotifications;\n scope.showDashboardMenu = false;\n };\n scope.toManage = toManage;\n scope.getResourceValue = resource => resourceService.get(resource);\n scope.formatNotification = notification => dashboardNotificationService.formatNotification(notification);\n\n //For EKH agent website\n scope.launchUserProfileSearch = launchUserProfileSearch;\n scope.launchUserProfileView = launchUserProfileView;\n scope.launchUserProfileCreate = launchUserProfileCreate;\n scope.bookingName = bookingName;\n scope.customerName = customerName;\n scope.manageBooking = manageBooking;\n scope.showSignOutAlert = false;\n\n // Skywards variables\n scope.skywardsDropPanel = skywardsDropPanel;\n scope.skywardsClosePanel = skywardsClosePanel;\n if (authService.getSkywardsUserDetails()) {\n scope.skywardsTitle = authService.getSkywardsUserDetails().data.Contact.Title;\n scope.skywardsFirstName = authService.getSkywardsUserDetails().data.Contact.FirstName;\n scope.skywardsLastName = authService.getSkywardsUserDetails().data.Contact.LastName;\n scope.skywardsLoyaltyId = authService.getSkywardsUserDetails().data.Contact.LoyaltyId;\n scope.skywardsTier = authService.getSkywardsUserDetails().data.Contact.Tier;\n scope.skywardsLoyaltyId = Number(scope.skywardsLoyaltyId).toString();\n let regex = /^(\\d{3})(\\d{3})(\\d{3}).*/;\n scope.skywardsLoyaltyId = scope.skywardsLoyaltyId.replace(regex, '$1 $2 $3');\n }\n\n scope.$on('auth:signin', function() {\n resetNotifications();\n scope.user = authService.getUser();\n sessionStorage.setItem('scope.user', JSON.stringify(scope.user));\n });\n\n scope.$on('auth:signout', function() {\n menuOpen = false;\n $rootScope.alerts = null;\n scope.user = authService.getUser();\n sessionStorage.removeItem('scope.user');\n checksigninstatus();\n });\n\n scope.$on('menuClicked', function() {\n menuOpen = !menuOpen;\n if (menuOpen) {\n resetNotifications();\n }\n });\n\n resetNotifications();\n\n function checksigninstatus() {\n let user = sessionStorage.getItem('scope.user');\n if (!user) {\n document.querySelector('.myb-search-signout').style.display = 'none';\n document.querySelector('.myb-search-signin').style.display = 'block';\n } else {\n document.querySelector('.myb-search-signout').style.display = 'block';\n document.querySelector('.myb-search-signin').style.display = 'none';\n }\n }\n\n function setLanguagePreference(lang, id) {\n languageService.setLanguage(lang, id)\n .then(() => {\n if (TRPCONFIG.Domain.RedirectLanguageChangeToHomepage) {\n window.location.href = '/?rl=1';\n } else {\n //window.location.href = this.$location.absUrl();\n this.$route.reload();\n }\n });\n }\n\n function setLanguage() {\n cookieService.set('LANG', scope.selectedLanguage, dateUtil.addDays(new Date(), 365));\n window.location.href = $location.absUrl();\n }\n\n function launchUserProfileSearch() {\n modalService.launch('partials/userprofile/Search', { promptUserSelection: false });\n }\n\n function launchUserProfileView() {\n modalService.launch('partials/userprofile/UpdateUserProfileModal');\n }\n\n function launchUserProfileCreate() {\n modalService.launch('partials/userprofile/CreateUserProfileModal');\n }\n\n function launchNotification() {\n accountMenuService.launchNotification(scope.alerts);\n scope.closeMenu();\n }\n\n function launchContactForm() {\n accountMenuService.launchContactForm(scope.alerts);\n scope.closeMenu();\n }\n\n function userName() {\n if (!scope.user) {\n return '';\n }\n if (scope.user.FirstName && scope.user.LastName) {\n return `${scope.user.FirstName} ${scope.user.LastName}`;\n }\n let bookingId = authService.getSignedInBookingId();\n if (bookingId && scope.user.Contact && scope.user.Contact.SiteId) {\n return `${scope.user.Contact.SiteId}/${bookingId}`;\n }\n return scope.user.Email;\n }\n\n function bookingName() {\n let bookingId = authService.getSignedInBookingId();\n if (bookingId) {\n return `${this.user.Contact.SiteId}/${bookingId}`;\n }\n }\n\n function customerName() {\n if (scope.user.SignedIn && scope.user.LastName) {\n return `${scope.user.FirstName} ${scope.user.LastName}`;\n }\n }\n\n function manageBooking() {\n if (scope.user.AnonSignedIn) {\n return postBookingLookup.redirect();\n }\n }\n\n function resetNotifications() {\n const user = authService.getUser();\n if (TRPCONFIG.Domain.DashboardBookingEnabled && TRPCONFIG.Domain.SideBarNotificationEnabled && (user.AnonSignedIn || user.HardSignedIn)) {\n dashboardNotificationService.getNotifications()\n .then(data => $rootScope.alerts = data);\n }\n }\n\n function notificationClicked(noti) {\n scope.closeMenu();\n\n scope.showDashboardMenu = false;\n scope.showNotifications = false;\n\n dashboardNotificationService.notificationClicked(noti);\n }\n\n function signOut() {\n return authService.signOut().then(() => {\n broker.publish('hideNavigationDrawer');\n scope.showDashboardMenu = false;\n });\n }\n\n function toManage() {\n let user = sessionStorage.getItem('scope.user');\n if (!user) {\n sessionStorage.setItem('scope.user', JSON.stringify(scope.user));\n }\n\n scope.closeMenu();\n const cookieName = authService.createCookieName();\n authService.doesHttpOnlyCookieExist(cookieName);\n scope.showDashboardMenu = false;\n scope.showNotifications = false;\n\n if (scope.user.AnonSignedIn && !scope.user.SignedIn) {\n return postBookingLookup.redirect();\n }\n if (!scope.user.AnonSignedIn && scope.user.SignedIn) {\n return $location.path('dashboard/bookings/current');\n }\n return accountMenuService.launchOption('bookingsignin');\n }\n\n scope.subMenuTriggerMouseenter = function(e, booleanName) {\n // open on mouseenter for non-touch only\n if (!scope.forNavigationDrawer && !scope.IsTouchDevice) {\n scope[booleanName] = true;\n }\n };\n\n scope.subMenuTriggerMouseleave = function(e, booleanName) {\n // close on mouseleave for non-touch only\n if (!scope.forNavigationDrawer && !scope.IsTouchDevice) {\n scope[booleanName] = false;\n }\n };\n\n scope.subMenuTriggerClick = function(e, booleanName) {\n // toggle on click for touch devices only\n if (!scope.forNavigationDrawer && scope.IsTouchDevice) {\n scope[booleanName] = !scope[booleanName];\n if (scope[booleanName]) {\n e.stopPropagation();\n // close sub menu when anything else is clicked\n $document.one('click.accountMenu', () => {\n scope.$apply(scope[booleanName] = false);\n });\n }\n }\n };\n\n scope.dashboardLinkClick = function() {\n broker.publish('hideNavigationDrawer');\n scope.showDashboardMenu = false;\n };\n\n scope.hideSignOutAlert = function() {\n scope.showSignOutAlert = false;\n };\n\n scope.signOutAlert = function() {\n scope.showSignOutAlert = true;\n };\n\n scope.closeMenu = () => {\n menuOpen = false;\n broker.publish('hideNavigationDrawer');\n };\n\n function skywardsDropPanel(skywardsFirstName, skywardsLastName, skywardsLoyaltyId, skywardsTier) {\n if (skywardsFirstName && skywardsLastName && skywardsLoyaltyId && skywardsTier) {\n let element = document.querySelector('.skywards-sub-menu');\n element.classList.toggle('open');\n }\n }\n\n function skywardsClosePanel() {\n let element = document.querySelector('.skywards-sub-menu');\n if (element.classList.contains('open')) {\n element.classList.remove('open');\n }\n }\n }\n };\n});\n})();\n","'use strict';\n\nnamespace TR {\n\n class AccountSignIn {\n\n path: string;\n postSignIn: Function;\n\n private noBufferUrls: string[] = ['signin', 'signup', 'bookingsignin'];\n private options: Object; //options that are passed down to the modal\n\n constructor(\n private $location: ng.ILocationService,\n private $route: any,\n private accountMenuService: any,\n private authService: any,\n private urlUtils: any\n )\n { }\n\n public popupSignIn = (event) => {\n event.preventDefault();\n\n const parsedUrl = this.urlUtils.parse(this.$location.url());\n parsedUrl.url = this.urlUtils.stripLeadingSlash(parsedUrl.url);\n parsedUrl.qs.pb = 1;\n\n const cookieName = this.authService.createCookieName();\n this.authService.doesHttpOnlyCookieExist(cookieName);\n\n const bufferRedirect = this.noBufferUrls.every(bUrl => parsedUrl.url.indexOf(bUrl) < 0)\n && this.noBufferUrls.some(bUrl => this.path.indexOf(bUrl) > -1);\n\n const redirect = this.urlUtils.format(parsedUrl);\n\n const currentRoute = this.$route && this.$route.current && this.$route.current.$$route;\n\n this.authService.bufferRoute(redirect);\n\n this.authService.bufferRoute(bufferRedirect\n && currentRoute\n && !currentRoute.requiresAnonAuth\n && !currentRoute.requiresHardAuth\n ? redirect : '/');\n\n //redirect here is only used in the mobile version of accountMenuService\n this.accountMenuService.launchOption(this.path, this.options, redirect);\n\n if (this.postSignIn) {\n this.postSignIn();\n }\n }\n }\n\n\n angular\n .module('TR')\n .directive('accountSignIn', () => {\n return {\n scope: {},\n bindToController: {\n path: '@',\n postSignIn: '&',\n options: '='\n },\n controller: AccountSignIn,\n controllerAs: 'as',\n restrict: 'E',\n replace: true,\n template: '',\n transclude: true\n };\n });\n}\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('advert', function(advertService) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n dest: '=', //use :: in the view to stop this reloading all the time\n onPopulate: '&',\n maxToDisplay: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=Advert',\n link(scope, el, attr) {\n const pos = parseInt(attr.position) || 1;\n\n scope.$watch('dest', function(v) {\n if (v == null) {\n return;\n }\n init(v);\n });\n\n function init(dest) {\n advertService.getAdvertsForPosition(pos, dest).then(function(adverts) {\n let selection = null;\n if (scope.maxToDisplay && adverts.length > scope.maxToDisplay) {\n //randomly return the number requested\n selection = [];\n while (selection.length < scope.maxToDisplay) {\n selection.push(adverts.splice(Math.floor(Math.random() * adverts.length), 1)[0]);\n }\n }\n scope.adverts = selection || adverts;\n scope.serviceUrl = advertService.getUrl();\n if (scope.adverts.length) {\n scope.onPopulate();\n }\n });\n }\n }\n };\n});\n})();\n","'use strict';\nnamespace TR {\n\n interface Attraction {\n Details: AttractionDetails;\n }\n\n interface AttractionDetails {\n AttractionRequests: AttractionRequestMap;\n }\n\n interface AttractionRequestMap {\n [ProductId: string] : {Adult: number, Child: number, Infant: number};\n }\n\n interface AttractionModel {\n CaptureDate: boolean;\n PreferredDate: Date;\n ProductDescription: string;\n ProductId: string;\n ProductTitle: string;\n }\n\n class AttractionSelection {\n\n private attractions: Attraction[];\n private bookingLoaded: boolean;\n\n public model: AttractionModel[];\n public productPeopleCountMap: AttractionRequestMap = {};\n public dateCaptureRequired: boolean;\n public show: boolean;\n\n constructor(private $scope: ng.IScope)\n {\n const wait = $scope.$watch('as.bookingLoaded', b => {\n if(b) {\n this.init();\n wait();\n }\n });\n }\n\n private init() {\n\n if (this.attractions.length > 0) {\n this.show = true;\n\n //set up map of product Id and number of tickets per passenger type\n _.each(this.attractions, (a) => {_.assign(this.productPeopleCountMap, a.Details.AttractionRequests);});\n\n this.dateCaptureRequired = _.some(this.model, {'CaptureDate': true, 'PreferredDate' : !null });\n }\n }\n\n }\n\n angular\n .module('TR')\n .directive('attractionSelection', () => {\n return {\n bindToController: true,\n controller: AttractionSelection,\n controllerAs: 'as',\n restrict: 'E',\n replace: true,\n scope: {\n bookingLoaded: '=',\n attractions: '=',\n maxDate: '=',\n minDate: '=',\n model: '=',\n rootForm: '=',\n },\n templateUrl: (element,attr) => {\n if(attr.templateVersion) {\n return 'partials/booking/template?name=AttractionSelection&version='\n + attr.templateVersion;\n } else {\n return 'partials/home/directivetemplate?type=AttractionSelection';\n }\n }\n };\n });\n};\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('basketBar', function($q, tripService, $filter, $routeParams, basketStore, broker, customCurrencyFilter, bookingService, arrayUtil, currencyService) {\n return {\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=BasketBar',\n scope: {\n hideButton: '=',\n buttonHandler: '&',\n buttonDisabler: '&',\n isDeposit: '=?'\n },\n link(scope) {\n if ($routeParams.pb) {\n return;\n }\n scope.isMobileDevice = TRPCONFIG.IsMobileDevice;\n scope.costBreakdowns = [];\n scope.priceExcludesTax = TRPCONFIG.Domain.PriceExcludesTax || false;\n scope.roundedPrice = function(amount, symbol) {\n let final = $filter('roundedCurrency')(amount, symbol);\n return final.replace(symbol, '');\n };\n\n broker.subscribe('basketBarDirective', 'feesUpdated', _setPaymentTotalPlusFees);\n\n function _setPaymentTotalPlusFees(fees) {\n const cardFee = (fees && fees.data && fees.data.CardHandlingFee) || 0;\n //creating clean data object\n scope.fees = fees && fees.data ? { data: angular.copy(fees.data) } : null;\n scope.totalDepositWithCardFee = (scope.deposit || 0) + cardFee;\n }\n\n function isScrolledIntoView(el) {\n let rect = el.getBoundingClientRect();\n let elemTop = rect.top;\n let elemBottom = rect.bottom;\n let isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);\n return isVisible;\n }\n\n scope.openHolidayInfo = function() {\n let infoModal = document.getElementById('holidayInfoModal');\n let editSearchModal = document.getElementById('editSearchModal');\n let priceElement = document.getElementById('price-section');\n let editElement = document.getElementById('edit-section');\n priceElement.classList.toggle('active');\n\n document.addEventListener('scroll', function() {\n let topOfPage = document.getElementById('top-of-page');\n let isAtTop = isScrolledIntoView(topOfPage);\n if (isAtTop) {\n priceElement.classList.remove('active');\n editElement.classList.remove('active');\n infoModal.style.display = 'none';\n editSearchModal.style.display = 'none';\n }\n }, true);\n\n if (editElement.classList.contains('active')) {\n editElement.classList.remove('active');\n }\n if (infoModal.style.display === 'block') {\n infoModal.style.display = 'none';\n } else {\n editSearchModal.style.display = 'none';\n infoModal.style.display = 'block';\n }\n };\n\n scope.editSearch = function() {\n let infoModal = document.getElementById('holidayInfoModal');\n let editSearchModal = document.getElementById('editSearchModal');\n let priceElement = document.getElementById('price-section');\n let editElement = document.getElementById('edit-section');\n let searchPanel = document.querySelectorAll('.ekh-search-panel')[0];\n let searchPanel2 = document.querySelectorAll('.ekh-search-panel')[1];\n if (searchPanel2 && searchPanel2 !== undefined) {\n searchPanel2.classList.add('ekh-top-margin');\n } else if (!searchPanel2 && searchPanel2 === undefined) {\n searchPanel.classList.add('ekh-top-margin');\n }\n\n document.addEventListener('scroll', function() {\n let topOfPage = document.getElementById('top-of-page');\n let isAtTop = isScrolledIntoView(topOfPage);\n if (isAtTop) {\n priceElement.classList.remove('active');\n editElement.classList.remove('active');\n infoModal.style.display = 'none';\n editSearchModal.style.display = 'none';\n }\n }, true);\n\n if (searchPanel && searchPanel.classList.contains('panel-hide')) {\n searchPanel.classList.remove('panel-hide');\n }\n editElement.classList.toggle('active');\n if (priceElement.classList.contains('active')) {\n priceElement.classList.remove('active');\n }\n if (editSearchModal.style.display === 'block') {\n editSearchModal.style.display = 'none';\n } else {\n infoModal.style.display = 'none';\n editSearchModal.style.display = 'block';\n }\n };\n\n tripService.getTrip($routeParams.tripId).then(function(trip) {\n function getCostbreakdowns() {\n const reqs = [basketStore.totalDeposit(trip.BasketId, $routeParams.productId),\n basketStore.costBreakdownGrouped(trip.BasketId),\n basketStore.getTaxAdjustmentValue(trip.BasketId),\n basketStore._costByProduct(1, trip.BasketId),\n basketStore._costByProduct(6, trip.BasketId)];\n if (trip.BookingId) {\n reqs.push(bookingService.getBooking(trip.BookingId));\n }\n\n $q.all(reqs).then(function([totalDeposit, costBreakdownGrouped, taxAdjustments, flightCost, marhabaCost, booking]) {\n\n const costType = {\n Unknown: 0,\n Accommodation: 1,\n Discount: 20,\n AccommodationCancellationProtection: 21,\n AccommodationLocalFeesAndTaxes: 22,\n AccommodationExtraTransfer: 23,\n AccommodationExtraEvent: 24,\n AccommodationExtraAttraction: 25,\n AccommodationExtra: 26,\n };\n\n if (!costBreakdownGrouped.isPackage && (trip.TripType === tripService.tripTypes.Hotel)) {\n\n const { costBreakdown = [] } = costBreakdownGrouped[0] || {};\n\n const extraCostItems = costBreakdown.filter(cost => {\n const match = _.get(cost, 'ParentId') && _.get(cost, 'TypeId') ===\n (costType.AccommodationExtraTransfer || costType.AccommodationExtraEvent\n || costType.AccommodationExtraAttraction || costType.AccommodationExtra || costType.AccommodationExtra || costType.AccommodationLocalFeesAndTaxes || costType.AccommodationCancellationProtection || costType.Discount);\n return match;\n\n }).filter(extra => extra);\n\n const roomCostItems = costBreakdown.filter(cost => !_.get(cost, 'ParentId')\n && _.get(cost, 'TypeId') === costType.Accommodation).map((room, LinkId) => {\n return { ...room, LinkId };\n });\n\n if (extraCostItems && extraCostItems.length > 0 && roomCostItems && roomCostItems.length > 0) {\n\n const updatedRoomCostItems = roomCostItems.map(room => {\n return { RoomId: room.Id, RoomDescription: room.Description };\n });\n\n const enhancedExtras = extraCostItems.map(extras => {\n return { ...extras, ...updatedRoomCostItems.find(acc => acc.RoomId === extras.ParentId) };\n });\n\n const updatedExtrasCostItems = enhancedExtras.map((extra, LinkId) => {\n const splitDescription = _.get(extra, 'RoomDescription').split('(');\n\n const Description = splitDescription[1] ? `${extra.Description} (${splitDescription[1]}` : extra.Description;\n return {\n ...extra,\n Description,\n LinkId,\n };\n });\n\n const updatedCostBreakdown = [...roomCostItems, ...updatedExtrasCostItems];\n const costsSortedById = updatedCostBreakdown.sort((a, b) => (a.LinkId >= b.LinkId) ? 1 : -1);\n\n costBreakdownGrouped[0].costBreakdown = costsSortedById;\n }\n }\n scope.costBreakdowns = costBreakdownGrouped;\n if (window.location.pathname.includes('book') || window.location.pathname.includes('options')) {\n priceUpdate();\n } else {\n setTimeout(priceUpdate(), 500);\n }\n function currencySymbol(total) {\n let price = scope.roundedPrice(total, '');\n let currencyCode = TRPCONFIG.Domain.CurrencyCode;\n let newPrice;\n\n if (currencyCode.match(/GIP|EUR/g)) {\n newPrice = scope.roundedPrice(total, '');\n } else if (currencyCode.match(/USD/g)) {\n price = price.replace(/£/g, '');\n newPrice = `$${price}`;\n } else {\n price = price.replace(/[^0-9,.]/g, '');\n newPrice = `${TRPCONFIG.Domain.CurrencyCode}${price}`;\n }\n\n return newPrice;\n }\n\n function getPriceFromString(str) {\n str = str.replace(/[^0-9]/g, '');\n let num = Number(str);\n return num;\n }\n\n function checkSummaryPrice() {\n let target = document.querySelector('.sticky-panel-hidden');\n let observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (target || mutation === 'characterData') {\n let summaryTotal = document.querySelector('.teaser-price .price-value');\n let bannerTotal = document.querySelector('.sticky-panel-hidden .price.total');\n if (summaryTotal) {\n let bannerText = bannerTotal.innerText;\n let summaryText = summaryTotal.innerText;\n\n let bannerNum = getPriceFromString(bannerText);\n let summaryNum = getPriceFromString(summaryText);\n\n if (bannerNum !== summaryNum && summaryNum !== 0) {\n summaryTotal.innerHTML = bannerText;\n }\n }\n }\n });\n });\n let config = {\n subtree: true,\n attributes: false,\n childList: false,\n characterData: true\n };\n observer.observe(target, config);\n }\n function priceUpdate() {\n scope.hotelCost = 0;\n let hotelData = JSON.parse(sessionStorage.getItem('hotelData'));\n let hotelSelected = {};\n const searchHotelData = JSON.parse(sessionStorage.getItem('hotelSearchResults'));\n if (hotelData && searchHotelData) {\n hotelSelected = searchHotelData.filter(function(hData) {\n return hData.Id === hotelData.Id;\n });\n }\n if (window.location.pathname.includes('book') || window.location.pathname.includes('options') ||\n window.location.pathname.includes('flights')) {\n scope.total = costBreakdownGrouped.total;\n if (costBreakdownGrouped[0].group === 1) {\n scope.hotelCost = costBreakdownGrouped[0].total;\n }\n let deposit = totalDeposit;\n let bannerTotal = document.querySelector('.sticky-panel-hidden .price.total');\n if (bannerTotal) {\n bannerTotal.innerHTML = currencySymbol(scope.total);\n }\n\n if (booking) {\n deposit += booking.UserData.PaymentDetails.DepositAmount;\n let roundedTotal = currencySymbol(costBreakdownGrouped.total);\n let roundedDeposit = currencySymbol(deposit);\n\n document.addEventListener('click', e => {\n let attributes = Array.from(e.target.attributes);\n if (attributes[0].value === 'radio') {\n let parents = e.target.parentNode.parentNode;\n let classes = parents.classList.value;\n if (classes.includes('total')) {\n document.querySelector('.sticky-panel-hidden .price.deposit').innerHTML = roundedTotal;\n document.querySelector('.mobile-view .deposit').innerHTML = roundedTotal;\n } else if (classes.includes('deposit')) {\n document.querySelector('.sticky-panel-hidden .price.deposit').innerHTML = roundedDeposit;\n document.querySelector('.mobile-view .deposit').innerHTML = roundedDeposit;\n }\n }\n });\n }\n scope.deposit = deposit;\n } else {\n scope.total = flightCost + marhabaCost;\n if (hotelData && hotelData.MinCost) {\n scope.total = flightCost + marhabaCost + hotelData.MinCost;\n scope.hotelCost = hotelData.MinCost;\n }\n scope.deposit = (hotelSelected[0] && hotelSelected[0].HolidayDeposit) ? hotelSelected[0].HolidayDeposit : scope.total;\n }\n scope.taxAdjustment = taxAdjustments;\n scope.isPackage = costBreakdownGrouped.isPackage;\n\n checkSummaryPrice();\n }\n if (scope.binRangeDiscount != null) {\n scope.total -= scope.binRangeDiscount.DiscountValue;\n if (!scope.isDeposit) {\n scope.deposit -= scope.binRangeDiscount.DiscountValue;\n }\n }\n tripService.getCurrency($routeParams.tripId).then(currency => {\n scope.currency = currency;\n scope.symbol = currencyService.getSymbol(currency);\n\n scope.totalDeposit = customCurrencyFilter(scope.deposit, currency);\n _setPaymentTotalPlusFees(scope.fees);\n });\n });\n\n // persist any open content panel\n const i = arrayUtil.indexOf(scope.costBreakdowns, function(cb) {\n return cb.open;\n });\n if (i >= 0) {\n scope.costBreakdowns[i].open = true;\n }\n }\n\n getCostbreakdowns();\n\n broker.subscribe('basketBarDirective', 'basketUpdated', _.debounce(getCostbreakdowns, 100));\n broker.subscribe('basketBarDirective', 'paymentDataUpdated', _.debounce(getCostbreakdowns, 100));\n\n broker.subscribe('basketBarDirective', 'discountUpdated', _setBinRangeDiscount);\n broker.subscribe('basketBarDirective', 'boardPriceSelectionsUpdate', _setBoardTypePriceUpdates);\n\n function _setBinRangeDiscount(discount) {\n if (discount.data != null) {\n scope.binRangeDiscount = discount.data[0];\n } else {\n scope.binRangeDiscount = null;\n }\n getCostbreakdowns();\n }\n\n function _setBoardTypePriceUpdates(price) {\n scope.total = price.data;\n let hotelData = JSON.parse(sessionStorage.getItem('hotelData'));\n let hotelSelected = {};\n const searchHotelData = JSON.parse(sessionStorage.getItem('hotelSearchResults'));\n if (hotelData && searchHotelData) {\n hotelSelected = searchHotelData.filter(function(hData) {\n return hData.Id === hotelData.Id;\n });\n }\n if (hotelSelected && !hotelSelected[0].HolidayDeposit) {\n scope.deposit = price.data;\n }\n }\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('basketBarDirective');\n });\n });\n\n scope.sectionClass = function(index) {\n return scope.costBreakdowns[index].open ? 'expanded' : '';\n };\n\n scope.toggleSection = function(index) {\n scope.costBreakdowns.forEach(function(cb, i) {\n if (i !== index) {\n cb.open = false;\n }\n });\n\n scope.costBreakdowns[index].open = !scope.costBreakdowns[index].open;\n };\n }\n };\n }\n);\n})();\n","'use strict';\n(() => {\n class BasketToolbar {\n hide: boolean = false;\n basketTotal: number = 0;\n basketCount: number = 0;\n constructor(\n private $scope: ng.IScope,\n private attractionService,\n private basketStore,\n private broker)\n {\n basketStore.getAttractionsBasket()\n \t.then(res => this.updateAttractionsBasket(res.LineItems));\n broker.subscribe('basketToolbarDirective', 'attractionsBasketUpdated',\n e => this.updateAttractionsBasket(e.data && e.data.Basket && e.data.Basket.LineItems));\n broker.subscribe('basketToolbarDirective', 'basketCleared',\n () => this.updateAttractionsBasket());\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('basketToolbarDirective');\n });\n }\n\n updateAttractionsBasket(lineItems?: any) : void {\n const totals = this.attractionService.getProductTotals(lineItems);\n this.basketTotal = totals.price;\n this.basketCount = totals.count;\n }\n }\n\n angular.module('TR')\n .directive('basketToolbar', ($rootScope: ng.IRootScopeService, broker: any): ng.IDirective => {\n return {\n restrict: 'E',\n controller: BasketToolbar,\n controllerAs: 'bt',\n replace: true,\n templateUrl: 'partials/home/directivetemplate?type=BasketToolbar',\n link: (scope: ng.IScope, el:JQuery, attr:ng.IAttributes, ctrl:BasketToolbar): void => {\n $rootScope.$on('$routeChangeSuccess', function (_, next) {\n ctrl.hide = !!next.hideDistractionLinks;\n });\n }\n };\n });\n})();\n","namespace TR {\n\n interface RouteParams extends ng.route.IRouteParamsService\n {\n ref :string;\n source :string;\n tripId :string;\n version :number;\n }\n\n export interface TrackingPixel {\n trackingLabel :string;\n url :string;\n }\n\n class BookingCompleteTracking {\n\n public pixels :string[];\n public pixelsWithTracking : TrackingPixel[] = [];\n\n constructor (\n private $scope: ng.IScope,\n private $routeParams: RouteParams,\n private $location: ng.ILocationService,\n private analytics: any,\n private authService: any,\n private basketService: any,\n private bookingCompleteTrackingService: Core.BookingCompleteTrackingService,\n private trackingPixelsService: any,\n private tripService: Core.TripService\n ) {\n this.initTracking();\n }\n\n public onPixelLoad(name :string) :void {\n this.trackingPixelsService.report('load', name);\n }\n\n public onPixelLoadError(name :string) :void {\n this.trackingPixelsService.report('error', name);\n }\n\n private initTracking() {\n const bookingRef = this.$routeParams.ref.split('|')[0]; //for multi bookings 1st id is good enough\n\n const setTrackingUrls = (bookingRef, basket?) => {\n // some pixels require additional information sourced form basket, we will pass it as options object\n const options = {};\n if (basket) {\n let cancellationPrefix = 'canxp_';\n let offer = basket.h || basket.f;\n options['cancellationProtectionRef'] = _.chain(offer.Options)\n .filter(item => item.OptionId.indexOf(cancellationPrefix) > -1)\n .head()\n .get('OptionId')\n .replace(cancellationPrefix, '')\n .value();\n }\n\n //we have two sets of pixels doing slightly different things ones where we track\n //if they have loaded or errored and others where we do not track this\n const pixels = this.trackingPixelsService.getAllProviderUrls(bookingRef, options);\n this.pixels = _.map(_.filter(pixels, (p) => { return p.trackingLabel.length === 0; }), 'url');\n this.pixelsWithTracking = _.filter(pixels, (p) => { return p.trackingLabel.length > 0;});\n };\n\n //if we have come back from PayPal we need to do a little extra work recording conversion values etc...\n //ref: the full booking reference string e.g. TRN/1234567%7CEUF/11488101%7CPRK/123456%7CACM/123656\n const tripId = this.$routeParams.tripId || this.$location.search().tripId;\n\n if (tripId) {\n const bookingRefs = this.$routeParams.ref.split('|');\n\n return this.tripService.getTrip(tripId).then(trip => {\n const user = this.authService.getUser();\n return this.bookingCompleteTrackingService.trackConversion(\n trip,\n bookingRefs,\n this.$routeParams.source,\n user.Email,\n null\n ).then(() => this.basketService.completeWorkflow(bookingRefs, trip.BasketId))\n .then(([basket]) => basket);\n })\n .then((basket) => {\n let basketHasContent = _.reduce(basket.all, (bool, elem) => {\n if(elem != null){\n if((elem instanceof Array && elem.length > 0) || !(elem instanceof Array)){\n return true;\n }\n }\n return bool;\n }, false);\n\n if(basketHasContent){\n //by this point setData on tracking pixel service would have been called\n //so we can get the urls now.\n setTrackingUrls(bookingRef, basket);\n }\n });\n }\n else\n {\n if (!TRPCONFIG.Domain2.NewTransactionTracking) {\n this.analytics.trackConversion();\n }\n setTrackingUrls(bookingRef);\n }\n }\n }\n\n angular.module('TR')\n .directive('bookingCompleteTracking',\n function() {\n return {\n restrict: 'E',\n replace: false,\n scope: true,\n template: `\n `,\n controller: BookingCompleteTracking,\n controllerAs: 'bct'\n };\n });\n}\n","'use strict';\n\nnamespace TR {\n\n class BookingLookup {\n tooltip: string;\n\n constructor(\n private accountMenuService: any,\n private authService: any,\n private resourceService: Core.ResourceService\n )\n {\n this.tooltip = this.resourceService.get('MANAGEMYBOOKINGTOOLTIP');\n }\n\n\n public popupSignIn = (event) => {\n event.preventDefault();\n\n this.authService.bufferRoute(null);\n\n //redirect here is only used in the mobile version of accountMenuService\n this.accountMenuService.launchOption('bookingsignin');\n\n }\n }\n\n\n angular\n .module('TR')\n .directive('bookingLookup', () => {\n return {\n scope: {},\n controller: BookingLookup,\n controllerAs: 'as',\n restrict: 'E',\n replace: true,\n template: `\n `,\n transclude: true\n };\n });\n}\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('bookingTracker', function(bookingService) {\r\n //booking may be on an ancester scope\r\n function findBooking(s) {\r\n if (s.cm) {\r\n if (s.cm.booking) {\r\n return s.cm.booking;\r\n }\r\n }\r\n return s.$parent ? findBooking(s.$parent) : null;\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link(scope, el, attr, c) {\r\n const update = _.debounce(function() {\r\n const b = findBooking(scope);\r\n if (b) {\r\n bookingService.updateBooking(b, `${attr.bookingDescription} changed to: ${c.$modelValue}`);\r\n }\r\n }, 1000);\r\n\r\n if (c != null) {\r\n c.$viewChangeListeners.push(update);\r\n c.$updateBooking = update;\r\n } else {\r\n const bw = scope.$watch('cm.booking', function(b, oldB) {\r\n if (b != null && !angular.equals(b, oldB)) {\r\n bw();\r\n return;\r\n }\r\n scope.$watch(attr.bookingTracker, _.debounce(function(val, prev) {\r\n if (!angular.equals(val, prev) && !!b) {\r\n bookingService.updateBooking(scope.cm.booking, `${attr.bookingDescription} changed to: ${val}`);\r\n }\r\n }, 1000), true);\r\n }, true);\r\n }\r\n }\r\n };\r\n});\r\n})();\r\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\n\nTR.directive('breadcrumb', function(\n broker,\n $route,\n $routeParams,\n basketService,\n analytics,\n breadcrumbDetailsService,\n $timeout) {\n let text;\n if (breadcrumbDetailsService.getText) {\n text = breadcrumbDetailsService.getText();\n }\n\n //let's optionally get the breadcrumb from the scope so that we can override the route if necessary\n return {\n restrict: 'E',\n replace: true,\n scope: {\n useText: '=',\n showBreadcrumb: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=Breadcrumb',\n link(scope, element) {\n let bc = $route.current.$$route.breadcrumb;\n if (bc && bc.crumb === 10 && TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\n bc.crumb = 25;\n }\n\n const { tripId } = $routeParams;\n\n if (tripId) {\n basketService.getArea().then(function(a) {\n const area = scope.area = a;\n\n scope.baseAreaUrl = `${TRPCONFIG.Domain.SearchUnitHomePath}${area}`;\n\n scope.click = function clickBreadcrumb(c) {\n /*\n The number 10 is used to select a flight, and the number 25 is used to change the flight,\n the names for the crumbs are different, but the functionality is the same,\n so if the flight was previously chosen, we must use the name of crumbs 25 and the functionality of crumbs 10.\n This expression was added to avoid code duplication\n */\n bc.crumb = basketService.isFlightPreselected() && bc.crumb === 10 ? 25 : bc.crumb;\n if (c < bc.crumb || (c === bc.crumb)) {\n analytics.trackEvent({ label: 'breadcrumb nav', value: c });\n basketService.changeJourneyUrl(c);\n }\n };\n broker.subscribe('breadcrumb', 'ChangeWorkflowState', function(ev) {\n basketService.changeJourneyUrl(ev.data);\n });\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('breadcrumb');\n });\n });\n }\n\n scope.show = bc != null;\n\n if (bc != null) {\n breadcrumbDetailsService.getCrumbs(scope.useText).then(function(crumbs) {\n scope.crumbs = crumbs;\n scope.width = function() {\n return { width: `${100 / scope.crumbs.length}%` };\n };\n });\n scope.class = breadcrumbDetailsService.getClasses(bc, scope.useText);\n if (text) {\n scope.text = function(c) {\n return text[c];\n };\n }\n }\n\n scope.shortText = function(crumb) {\n return breadcrumbDetailsService.getTextShort()[crumb];\n };\n\n $timeout(() => {\n const wrapperClass = 'breadcrumb-wrapper';\n const wrapper = element.hasClass(wrapperClass) ? element : element.find(`.${wrapperClass}`);\n const activeCrumb = element.find('.is-active');\n const wrapperOffsetLeft = _.get(wrapper, '[0].offsetLeft');\n const crumbsOffsetLeft = _.get(activeCrumb, '[0].offsetLeft');\n const offsetPosition = crumbsOffsetLeft - wrapperOffsetLeft;\n\n if (crumbsOffsetLeft && offsetPosition) {\n wrapper[0].scrollLeft = offsetPosition;\n }\n }, 1000);\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('cardCvv', function(paymentsService) {\n return {\n restrict: 'E',\n replace: false,\n scope: {\n modal: '=',\n cardType: '=',\n paymentOptions: '='\n },\n templateUrl: (element, attr) => {\n if (attr.templateVersion) {\n return `partials/booking/template?name=CardCvv&version=${attr.templateVersion}`;\n }\n return 'partials/home/directivetemplate?type=CardCvv';\n },\n link(scope) {\n const reAmex = /American\\sExpress/i;\n\n scope.$watch('cardType', function(cardTypeId) {\n scope.isAmex = null; //Hides all messages\n\n //Amex message shows if card name matches regex\n //Otherwise, default message shows whenever `cardTypeId` is truthy\n //Message is hidden if `cardTypeId` is falsy\n if (cardTypeId) {\n const paymentOptions = scope.paymentOptions;\n const cardSpec = paymentOptions && paymentsService.getCardFromId(paymentOptions, cardTypeId);\n //Title has been renamed to Name in new API.\n scope.isAmex = reAmex.test(cardSpec && (cardSpec.Title || cardSpec.Name));\n }\n });\n }\n };\n});\n})();\n","///\n\n'use strict';\nnamespace TR {\n\n import Dictionary = Core.Collections.Dictionary;\n import DriverType = Core.Booking.DriverType;\n\n interface UserData {\n Rooms: Room[];\n }\n\n interface Room {\n Guests: Guest[];\n }\n\n interface Guest {\n DriverType: DriverType;\n FirstName: string;\n Id: number;\n Label: string;\n LastName: string;\n Title: string;\n Type: number;\n }\n\n interface CarHireDriver {\n name: string;\n id: number;\n }\n\n interface DriverTypeModel {\n title: string;\n type: DriverType;\n driverId: number;\n ineligible: boolean;\n }\n\n interface RequestedItemsCosting {\n CurrencyCode: string;\n Total: number;\n }\n\n class CarHireSelection {\n\n private bookingLoaded: boolean;\n private userData: UserData;\n\n public additionalDrivers: number;\n public captureDrivers: boolean;\n public carhire: any;\n public drivers = new Dictionary();\n public driverTypeModels: DriverTypeModel[];\n public requestedItemsCosts: RequestedItemsCosting;\n\n constructor(\n private $scope: ng.IScope,\n private resourceService: Core.ResourceService\n )\n {\n const wait = $scope.$watch('chs.bookingLoaded', b => {\n if(b) {\n this.init();\n wait();\n }\n });\n\n $scope.$watch('chs.userData.Rooms', (u: Room[]) => {\n if(u) {\n this.updateDriverTitles(this.drivers, u);\n }\n }, true);\n }\n\n public updateDriverType(value: DriverType, newDriverId: number, oldDriverId: number) {\n //find the new and old driver ids and update our user data accordingly\n this.findAndUpdateDriverType(this.userData.Rooms, oldDriverId, DriverType.NotADriver);\n this.findAndUpdateDriverType(this.userData.Rooms, newDriverId, value);\n }\n\n private init() {\n if (this.captureDrivers) {\n this.updateDriverTitles(this.drivers, this.userData.Rooms);\n\n if (this.drivers.count() === 0) {\n this.captureDrivers = false;\n return;\n }\n\n const guests = this.getGuestList(this.userData.Rooms);\n\n this.driverTypeModels = [\n {\n title: this.resourceService.get('MAINDRIVER'),\n type: DriverType.MainDriver,\n driverId: this.getGuestIdForDriverType(guests, DriverType.MainDriver),\n ineligible: false\n }\n ];\n if (this.additionalDrivers > 0 && guests.length >= 1) {\n const adults = guests.filter(g => { return g.Type === 1; });\n this.driverTypeModels.push({\n title: this.resourceService.get('ADDITIONALDRIVER'),\n type: DriverType.AdditionalDriver,\n driverId: this.getGuestIdForDriverType(guests, DriverType.AdditionalDriver),\n ineligible: adults.length === 1\n });\n }\n }\n }\n\n private findAndUpdateDriverType(rooms: Room[], guestId: number, driverType: DriverType): void {\n _.each(rooms, r => {\n let keepGoing: boolean = true;\n _.each(r.Guests, g => {\n if (g.Id === guestId-1) {\n g.DriverType = driverType;\n keepGoing = false;\n return keepGoing;\n }\n });\n return keepGoing;\n });\n\n //check the same driver is not assigned to another driver type\n //clear it if he is\n if (driverType !== DriverType.NotADriver) {\n let models = _.filter(this.driverTypeModels, { 'driverId': guestId});\n if (models.length > 1) {\n _.find(models, d => { return d.type !== driverType; }).driverId = 0;\n }\n }\n }\n\n private getGuestIdForDriverType(guests: Guest[], type: DriverType): number {\n //get the guest id for the given type\n //NOTE ids start at 0 but this is not what we want as 0 is counted as a blank/unset value so bump the\n //guest Id to be something we can work with\n const g = _.find(guests, {'Type': 1, 'Age': 21, 'DriverType': type});\n if (g) {\n return g.Id + 1;\n }\n return 0;\n }\n\n private updateDriverTitles(dict: Dictionary, rooms: Room[]): void {\n //update the driver titles we have stored\n _.each(rooms, room => {\n _.each(_.filter(room.Guests, {'Type': 1, 'Age': 21}), guest => {\n const name = (guest.Title && guest.FirstName && guest.LastName) ?\n `${guest.Title} ${guest.FirstName} ${guest.LastName}` :\n guest.Label;\n\n const id = guest.Id + 1;\n if (dict.containsKey(id.toString())) {\n let driver = dict.item(id.toString());\n if (driver.name !== name) {\n driver.name = name;\n }\n } else {\n dict.add( id.toString(), { name: name, id: id });\n }\n });\n });\n }\n\n private getGuestList(rooms: Room[]) :Guest[] {\n return _.reduce(rooms, (result, room) => {\n return result.concat(room.Guests);\n }, []);\n }\n }\n\n\n angular\n .module('TR')\n .directive('carhireSelection', () => {\n return {\n bindToController: true,\n controller: CarHireSelection,\n controllerAs: 'chs',\n restrict: 'E',\n replace: true,\n scope: {\n additionalDrivers: '=',\n bookingLoaded: '=',\n captureDrivers: '=',\n carhire: '=',\n requestedItemsCosts: '=',\n rootForm: '=',\n userData: '=',\n templateVersion: '@'\n },\n templateUrl: (element, attr) => {\n if(attr.templateVersion) {\n return 'partials/booking/template?name=CarHireSelection&version='\n + attr.templateVersion;\n } else {\n return 'partials/home/directivetemplate?type=CarHireSelection';\n }\n }\n };\n });\n}\n","namespace TR {\n\n function Carousel(\n funcUtil,\n $timeout: ng.ITimeoutService\n )\n\n {\n return {\n scope: {\n data : '=',\n autoplay : '=',\n autoplaySpeed : '=',\n slidesToShow : '=',\n slidesToScroll : '=',\n arrows : '=',\n dots : '=',\n infinite : '=',\n asNavFor: '@',\n fade: '@',\n speed: '@',\n responsive: '=',\n variableWidth: '=',\n centerMode: '='\n },\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=CarouselDirective',\n transclude: true,\n replace: true,\n link\n };\n\n function link($scope, $e) {\n\n $scope.fade = $scope.fade === 'true';\n $scope.speed = angular.isUndefined($scope.speed) ? undefined : parseInt($scope.speed, 10);\n\n const carousel:any = $e.find('.carousel-content');\n $scope.show = false;\n const DEFAULT_OPTIONS = {\n arrows: true,\n dots: false,\n autoplay: true,\n autoplaySpeed: 3000,\n pauseOnHover: true,\n rtl: TRPCONFIG.Rtl,\n slidesToShow: 4,\n slidesToScroll: 1,\n asNavFor: undefined,\n fade: undefined,\n speed: undefined,\n infinite: true,\n variableWidth: false,\n centerMode: false\n };\n\n // HEADSUP this has been set up to support 4 cards on TR\n const DEFAULT_RESPONSIVE = [\n {\n breakpoint: 1023,\n settings: { slidesToShow: 3, slidesToScroll: 3 }\n },\n {\n breakpoint: 769,\n settings: { slidesToShow: 2, slidesToScroll: 2 }\n }\n ];\n\n const options:any = _.assignWith(\n _.pick($scope, _.keys(DEFAULT_OPTIONS)),\n DEFAULT_OPTIONS,\n (opt, def) => _.isUndefined(opt) ? def : opt\n );\n\n options.autoplay = false;\n\n options.responsive = !$scope.responsive && parseInt(options.slidesToShow, 10) === 4\n ? DEFAULT_RESPONSIVE\n : $scope.responsive;\n\n funcUtil.waitForValue(() => !_.isEmpty(carousel[0].children) && carousel.is(':visible'))\n .then(() => $timeout(() => {\n $scope.show = true;\n carousel.slick(options);\n $scope.$on('$destroy', () => carousel.slick('unslick'));\n }));\n }\n }\n\n angular\n .module('TR')\n .directive('carousel', Carousel);\n}\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('checkbox', function(arrayUtil, $timeout) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n model: '=',\r\n name: '@?',\r\n val: '=',\r\n disabled: '=',\r\n onToggle: '&', // Runs during init\r\n onClick: '&', // Runs only on click\r\n onInit: '&?', // Handles initialization logic\r\n templateVersion: '=',\r\n mandatory: ' {\r\n if (attr.templateVersion) {\r\n return `partials/booking/template?name=checkbox&version=${attr.templateVersion}`;\r\n }\r\n return 'partials/home/checkbox';\r\n },\r\n link(scope) {\r\n scope.toggle = function() {\r\n if (scope.disabled) { return; }\r\n if (Array.isArray(scope.model)) {\r\n const index = indexOfVal(scope.model);\r\n if (index > -1) {\r\n scope.model.splice(index, 1);\r\n } else {\r\n scope.model.push(scope.val);\r\n }\r\n } else {\r\n scope.model = !scope.model;\r\n }\r\n $timeout(scope.onClick); // `model` not updated in parent context without $timeout\r\n };\r\n\r\n scope.$watchCollection('model', function(model) {\r\n if (model !== undefined) {\r\n scope.checked = Array.isArray(model) ? indexOfVal(model) > -1 : model;\r\n scope.onToggle();\r\n }\r\n });\r\n\r\n if (scope.onInit) {\r\n scope.onInit();\r\n }\r\n\r\n function indexOfVal(array) {\r\n return arrayUtil.indexOf(array, function(i) {\r\n // Need angular.equals to compare { OptionId: \"4\":, Quantity: 1 } with { OptionId: \"4\":, Quantity: 1 }\r\n return scope.val === String(i) || angular.equals(scope.val, i);\r\n });\r\n }\r\n }\r\n };\r\n});\r\n})();\r\n\r\n\r\n\r\n\r\n","'use strict';\n\nnamespace Core {\n class CheckboxAll {\n // Attr\n list: any[];\n\n constructor (\n private $scope: ng.IScope\n ) {\n }\n\n init(el): void {\n const checkbox: ng.IAugmentedJQuery = el;\n\n // watch checkbox changes\n checkbox.change(() => {\n // empty the list\n this.$scope.$apply(() => this.list.splice(0, this.list.length));\n });\n\n // watch the list\n this.$scope.$watchCollection('ca.list', (list) => {\n if (list) {\n // if list has items then check and disable the checkbox\n const checked = (this.list.length === 0);\n checkbox.prop('checked', checked);\n checkbox.prop('disabled', checked);\n }\n });\n }\n\n }\n angular\n .module('core')\n .directive('checkboxAll', (): ng.IDirective => {\n return {\n restrict: 'A',\n controller: CheckboxAll,\n controllerAs: 'ca',\n bindToController: {\n list: '=checkboxAll'\n },\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attrs: ng.IAttributes,\n controller : CheckboxAll\n ) => {\n controller.init(el);\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n class CheckboxArray {\n // Attr\n list: any[];\n value: any;\n\n constructor (\n private $scope: ng.IScope\n ) {\n }\n\n init(el): void {\n\n const checkbox: ng.IAugmentedJQuery = el;\n\n // watch checkbox changes\n checkbox.change(() => {\n const index = this.indexOfVal(this.list, this.value);\n // modify the list\n let action: () => any = index > -1\n ? () => this.list.splice(index, 1)\n : () => this.list.push(this.value);\n this.$scope.$apply(action());\n });\n\n // watch the list\n this.$scope.$watchCollection('ca.list', (list) => {\n // sync checkbox state to the list\n if (list) {\n const checked = this.indexOfVal(list, this.value) > -1;\n checkbox.prop('checked', checked);\n }\n });\n\n }\n\n private indexOfVal(array, value) {\n return _.findIndex(array, (i) => {\n return value === String(i) || _.isEqual(value, i);\n });\n }\n\n }\n angular\n .module('core')\n .directive('checkboxArray', (): ng.IDirective => {\n return {\n restrict: 'A',\n controller: CheckboxArray,\n controllerAs: 'ca',\n bindToController: {\n list: '=checkboxArray',\n value: '='\n },\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attrs: ng.IAttributes,\n controller : CheckboxArray\n ) => {\n controller.init(el);\n }\n };\n });\n}\n","'use strict';\n\nnamespace Core {\n\n class ClickPublisher {\n\n private eventNamespace: string = 'clickpublisher';\n\n constructor (\n private $scope: ng.IScope,\n private broker: any\n ) {\n }\n\n init (element : ng.IAugmentedJQuery, eventName : string) {\n\n element.on(`click.${this.eventNamespace}`, (e) => {\n e.preventDefault();\n this.broker.publish(eventName);\n });\n\n this.$scope.$on('$destroy', () => {\n element.off(`click.${this.eventNamespace}`);\n });\n }\n\n }\n\n angular\n .module('core')\n .directive('clickPublisher', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'A',\n controller: ClickPublisher,\n controllerAs: 'cp',\n bindToController: {\n toggleEvent: '='\n },\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attr: ng.IAttributes,\n controller: ClickPublisher\n ) => {\n controller.init(el, attr['clickPublisher']);\n }\n };\n\n });\n\n}\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('combobox', function($document) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n priority: 1,\r\n scope: {\r\n term: '=',\r\n listData: '=',\r\n textProperty: '@',\r\n click: '&',\r\n placeholder: '@',\r\n triggerLabel: '@',\r\n triggerClick: '&',\r\n inputClass: '@',\r\n enableAutocomplete: '@',\r\n rootForm: '=',\r\n lookupEnabled: '='\r\n },\r\n transclude: true,\r\n controller: _controller,\r\n templateUrl: (element, attr) => {\r\n let base = 'partials';\r\n if (attr.templateVersion) {\r\n return `${base}/booking/template?name=Combobox&version=${attr.templateVersion}`;\r\n }\r\n return `${base}/home/directivetemplate?type=ComboBox`;\r\n },\r\n link: _linker\r\n };\r\n\r\n function _controller($scope, $element) {\r\n this.element = $element;\r\n }\r\n\r\n function _linker(scope, e) {\r\n scope.autocomplete = !TRPCONFIG.Domain.isAgentMode && scope.enableAutocomplete || 'off';\r\n\r\n function toggleMenu(val) {\r\n scope.$evalAsync(() => {\r\n scope.menu = val;\r\n });\r\n }\r\n\r\n e.on('focusin', function() {\r\n if (scope.listData && scope.listData.length > 0) {\r\n toggleMenu(true);\r\n }\r\n });\r\n\r\n function mousedown(e) {\r\n if ($(e.target).closest('.cmb-menu').length === 0) {\r\n toggleMenu(false);\r\n }\r\n }\r\n\r\n // This is needed to hide the menu on a sort of focus-out event\r\n // (basically if the user does not click on the menu-list this will hide it)\r\n $document.on('mousedown', mousedown);\r\n\r\n scope.$on('$destroy', function() {\r\n e.off('focusin');\r\n $document.off('mousedown', mousedown);\r\n });\r\n\r\n scope.clickHandler = function(d) {\r\n scope.click({ item: d });\r\n scope.loading = true;\r\n };\r\n\r\n scope.$watch('term', () => {\r\n scope.listData = [];\r\n });\r\n\r\n scope.triggerClickHandler = () => {\r\n scope.submitted = true;\r\n scope.triggerClick({ term: scope.term });\r\n e.find('input').focus();\r\n };\r\n\r\n // If the listData has changed (mainly due to a new filter being\r\n // applied) this will make it visible\r\n scope.$watch('listData', function(value) {\r\n scope.loading = false;\r\n if (!value || value.length === 0) {\r\n scope.menu = false;\r\n } else {\r\n scope.menu = true;\r\n }\r\n });\r\n }\r\n});\r\n})();\r\n","'use strict';\nnamespace TR {\n export class ContactFormPopUp {\n iframeUrl: string;\n buttonText: string;\n\n constructor(\n private accountMenuService: any,\n private authService: any,\n private resourceService: Core.ResourceService\n )\n {}\n\n public isUrl() {\n let regexp = new RegExp('^http'),\n test = regexp.test(this.iframeUrl);\n return test;\n }\n\n public popupSignIn = (event) => {\n event.preventDefault();\n this.authService.bufferRoute(null);\n this.accountMenuService.launchContactForm('contactformpopup');\n }\n }\n\n angular\n .module('TR')\n .directive('contactFormpopup', (): ng.IDirective => {\n return {\n bindToController: {\n iframeUrl: '@',\n buttonText: '@'\n },\n controller: ContactFormPopUp,\n controllerAs: 'cfpu',\n restrict: 'E',\n replace: true,\n template: `\n {{::cfpu.buttonText}}`,\n transclude: false\n };\n });\n}\n","'use strict';\nnamespace TR {\n angular\n .module('TR')\n .component('crossSellAttractions', {\n bindings: {\n isHotelJourney: '<',\n hotel: ' = this.$q.when();\n private searchId :string|null;\n private readonly tripId :string;\n\n public driverAge :number = 30;\n public driverAges :number[] = [];\n public dropOffDate :string;\n public items :CarHireItem[] = [];\n public fromPrice :number = 0;\n public readonly noneSelection :CarHireItem = new CarHireItem('-1');\n public pickUpDate :string;\n public selectedItem :CarHireItem;\n public showError :boolean;\n public totalCost :number;\n public payNowCost :number;\n public payLocallyCosts :RequestedItemCost[] = [];\n public carInsuranceInfo :any;\n public duration: number;\n\n //properties used to control the UI state\n public isBusy :boolean = true;\n public showResults :boolean;\n public showInsurance :boolean;\n public showExplained :boolean;\n public readonly viewMode = ViewMode; //so we can use it in the template\n public view :ViewMode = ViewMode.Results;\n public carsAvailabilityBusy :boolean = true;\n\n constructor(private $q :ng.IQService,\n private $routeParams :RouteParams,\n private $scope: IScope,\n private analytics :any,\n private arrayUtil :ArrayUtil,\n private basketService :any,\n private basketStore :any,\n private dateUtil: any,\n private tripService :Core.TripService) {\n\n this.driverAges = arrayUtil.createRange(90, 21);\n this.selectedItem = this.noneSelection;\n this.tripId = $routeParams.tripId;\n\n tripService.getTrip(this.tripId)\n .then((trip :Core.Trip.TripState) => {\n\n this.basketId = trip.BasketId;\n\n if (trip.CarHireRequest) {\n this.setLocalPropertiesFromRequest(trip.CarHireRequest);\n this.searchId = trip.CarHireRequest.AvailabilitySearchId;\n }\n\n $q.all([\n basketStore.carHire(this.basketId),\n basketStore.carHireOptions(this.basketId, $routeParams),\n this.retrieveQuotes(this.searchId, this.basketId, this.tripId, this.driverAge)\n ]).then((results) => {\n\n let selected = results[0];\n this.setResults(results[2]); //set this.items\n\n //find the car hire item from our quotes so that we can select it\n if (selected) {\n const item = this.findCarHireItem(this.items, selected.Details.CarHireId.CarHireCode);\n item.details = selected.Details;\n item.selectedOptions = results[1];\n this.selectedItem = item;\n this.updateTotalCost();\n }\n\n if(!this.searchId) {\n tripService.getTrip(this.tripId)\n .then(trip => {\n this.setLocalPropertiesFromRequest(trip.CarHireRequest);\n this.searchId = trip.CarHireRequest.AvailabilitySearchId;\n });\n }\n\n // Watch the additional options collection and update the basket when this changes\n $scope.$watchCollection ('$ctrl.selectedItem.selectedOptions', (val, old) => {\n if (this.selectedItem.carHireCode === '-1') {\n // no car selected\n return;\n }\n if (val !== old) {\n this.updateOptions();\n }\n });\n\n\n }).finally(() => {\n this.isBusy = false;\n this.carsAvailabilityBusy = false;\n });\n\n }, this.basketService.bookingAlreadyDone(`crosssellCarHire: '${this.tripId}'`));\n }\n\n private retrieveQuotes(searchId :string | null,\n basketId :string,\n tripId :string,\n age :number\n ) :ng.IPromise {\n\n const mapQuotes = (quotes :Core.CarHire.Quote[]) => {\n return _.map(\n _.sortBy(quotes, 'Price'),\n (q :Core.CarHire.Quote) => CarHireItem.createItemFromQuote(q)\n );\n };\n\n if (searchId != null) {\n return this.basketService.getCarQuotesFromSession(searchId, 0)\n .then((quotes :Core.CarHire.Quote[]) => mapQuotes(quotes));\n } else {\n return this.basketService.getCarQuotes(basketId, tripId, age)\n .then((quotes :Core.CarHire.Quote[]) => mapQuotes(quotes));\n }\n }\n\n private findCarHireItem(list :CarHireItem[], carCode :string) :CarHireItem {\n return _.find(list, {'carHireCode': carCode});\n }\n\n private setResults(list :CarHireItem[]) :void {\n this.items = list;\n this.carsAvailabilityBusy = false;\n\n //this should really be done service side not a problem for now as long as we do not show more than\n // one page worth of results\n this.fromPrice = this.items.length ? _.minBy(this.items, 'quote.Price').quote.Price : 0;\n\n }\n\n private setLocalPropertiesFromRequest(request :Core.Trip.CarHireRequest) {\n this.driverAge = request.DriverAge;\n this.dropOffDate = request.DropOffDate;\n this.pickUpDate = request.PickUpDate;\n }\n\n //CHECKOUT-47 : extra param just to do some mixpanel tracking\n //will be removed once the test is finished\n public showModal(show, logMixPanelEvent) :void {\n this.showResults = show;\n\n if (show === false) {\n this.view = ViewMode.Results;\n this.showError = false;\n }\n\n if (logMixPanelEvent === true) {\n this.analytics.track('mixpanel', 'OptionsCarHireChooseClick');\n }\n }\n\n public previousView($event) :void {\n $event.preventDefault();\n $event.stopPropagation();\n this.view -= 1;\n }\n\n public displayTerms($event) :void {\n $event.preventDefault();\n $event.stopPropagation();\n this.view = ViewMode.Terms;\n }\n\n public selectCar(carHireCode) :void {\n\n this.isBusy = true;\n this.showError = false;\n\n if (this.selectedItem.carHireCode === carHireCode) {\n //we already have it selected move the user along to the next page\n this.view = ViewMode.Options;\n this.isBusy = false;\n this.getCarInsuranceInfo(this.selectedItem.details.AdditionalOptions);\n this.duration = this.getDuration(this.selectedItem.details.HireDetails);\n } else {\n\n //find the quote from our list and select it\n const item = this.findCarHireItem(this.items, carHireCode);\n item.selectedOptions = []; //clear it out, may have been previously selected\n\n this.basketService.selectCar(item.quote, this.searchId, this.basketId)\n .then(carDetails => {\n item.details = carDetails.Details;\n this.selectedItem = item;\n this.isBusy = false;\n this.view = ViewMode.Options;\n this.getCarInsuranceInfo(this.selectedItem.details.AdditionalOptions);\n this.duration = this.getDuration(this.selectedItem.details.HireDetails);\n })\n .then(() => this.updateTotalCost())\n .catch(() => {\n this.selectedItem = this.noneSelection;\n this.showError = true;\n this.isBusy = false;\n });\n }\n }\n\n public removeCar() :ng.IPromise {\n return this.basketStore.removeCar(this.basketId)\n .then(() => {\n this.selectedItem = this.noneSelection;\n this.view = ViewMode.Results;\n })\n .then(() => this.basketService.updateBasket());\n }\n\n private updateOptions() {\n this.optionsPromise = this.optionsPromise\n .then(() => this.updateBasketOptions(\n this.selectedItem.selectedOptions,\n this.selectedItem.details.DetailsSearchId\n )\n ).then(\n () => this.updateTotalCost()\n );\n }\n\n private updateBasketOptions(options :string[], detailsSearchId: string) {\n\n return this.basketStore.carHireOptions(this.basketId).then( basketOptions => {\n\n const _createBasketOption = (id: string, quantity :number) => {\n return { OptionId : id, ChosenQuantity : quantity};\n };\n\n const optionsToRemove = _.map(this.arrayUtil.difference(basketOptions, options),\n o => _createBasketOption(o,1) );\n const optionsToAdd = _.map(this.arrayUtil.difference(options, basketOptions),\n o => _createBasketOption(o, 1) );\n\n return this.basketStore.removeOptions(this.basketStore.productType.CarHire,\n detailsSearchId,\n optionsToRemove,\n this.basketId)\n .then(() => this.basketStore.addOptions(this.basketStore.productType.CarHire,\n detailsSearchId,\n optionsToAdd,\n this.basketId))\n .then(() => this.basketService.updateBasket());\n });\n }\n\n private updateTotalCost() :void {\n this.$q.all([\n this.basketStore.carHireCost(this.basketId),\n this.basketStore.carHireRequestedItemsCosts(this.basketId)\n ])\n .then(results => {\n this.payNowCost = results[0];\n this.payLocallyCosts = results[1];\n //this is ok currently as car hire extras are in the same currency as the original request\n this.totalCost = _.reduce(this.payLocallyCosts, (s,n)=> { return s + n.Total; }, this.payNowCost);\n });\n }\n\n public driverAgeChanged() :void {\n\n this.isBusy = true;\n this.searchId = null;\n\n //remove any existing selection and get the new list and new search id\n this.$q.all([\n this.removeCar(),\n this.retrieveQuotes(this.searchId, this.basketId, this.tripId, this.driverAge)\n ]).then(results => {\n\n this.setResults(results[1]); //set this.items\n\n this.tripService.getTrip(this.tripId)\n .then(trip => {\n this.searchId = trip.CarHireRequest.AvailabilitySearchId;\n this.isBusy = false;\n });\n });\n }\n\n public getCarInsuranceInfo(options) :void {\n // get insurance information data from option where it`s declared\n if(options) {\n options = options.filter((item) => item.Price.PayableLocally === false);\n this.carInsuranceInfo = options[0].InsuranceInformation;\n };\n }\n\n public showInsuranceExplained(show) :void {\n // open insurance explained modal and close insurance info modal\n this.showExplained = show;\n this.removeFlashing();\n if (!show) {\n this.showModal(true, true);\n this.view = ViewMode.Options;\n } else {\n const docName = '/build/docs/BookingConditions/IPID-DocumentCarTrawlerDamageRefund.pdf';\n this.showModal(false, null);\n this.carInsuranceInfo.DemageRefundDoc = docName;\n }\n }\n\n public viewTerms() :void {\n // close insurance explained modal and go to open car hire terms modal\n this.showExplained = false;\n this.removeFlashing();\n this.showModal(true, true);\n this.view = ViewMode.Terms;\n }\n\n public removeFlashing() :void {\n // hack to remove flashing of background when switching to another popup\n $('.modal-overlay').stop().fadeOut();\n }\n\n public getDuration(hireDetails) {\n let parsedDateFrom = this.dateUtil.parseDate(hireDetails.PickUpTime);\n let parsedDateTo = this.dateUtil.parseDate(hireDetails.DropOffTime);\n return this.dateUtil.getDifferenceInDays(parsedDateFrom, parsedDateTo);\n }\n }\n\n angular\n .module('TR')\n .component('crossSellCarHire', {\n bindings: {},\n controller: CrossSellCarHire,\n templateUrl: 'partials/home/directivetemplate?type=CrossSellCarHire'\n });\n}\n","'use strict';\nnamespace TR {\n\n import IScope = angular.IScope;\n import ResourceService = Core.ResourceService;\n import TripService = Core.TripService;\n\n interface RouteParams extends ng.route.IRouteService {\n tripId: string;\n productId: string;\n }\n\n class CrossSellInsurance {\n\n noneInsurance: Core.Insurance.SelectedInsurance = { QuoteId: '-1' };\n insuranceAvailabilityBusy = false;\n insuranceQuoteDescription : string | null;\n documentPaths = {};\n insurance: Core.Insurance.SelectedInsurance;\n viewInfo: (quoteId: string, $event: Event) => void;\n insuranceQuotes: Core.Insurance.InsuranceQuote[];\n hasPpPrices: boolean;\n currentInfoId: string;\n isHotelJourney: boolean;\n dates: {\n arrivalDate: Date | string;\n departureDate: Date | string;\n };\n showTotal = false;\n showFrom = true;\n priceTotal: number;\n showCoverDetails = false;\n noSuperQuotes = false;\n onUpdate:Function;\n singleVat = false;\n multipleVat = false;\n\n constructor($filter,\n $routeParams: RouteParams,\n $scope: IScope,\n arrayUtil,\n basketService,\n basketStore,\n insuranceService,\n broker: Core.Broker,\n resourceService: ResourceService,\n tripService: TripService) {\n\n broker.subscribe('crossSellInsurance', 'ShowInsuranceTotalPrice', () => {\n this.showTotal = true;\n });\n\n broker.subscribe('crossSellInsurance', 'ShowInsuranceCoverDetails', () => {\n this.showCoverDetails = true;\n });\n\n broker.subscribe('crossSellInsurance', 'HideInsuranceSuperQuote', () => {\n this.noSuperQuotes = true;\n this._removeSuperQuotes();\n });\n\n tripService.getTrip($routeParams.tripId).then((trip: Core.Trip.TripState) => {\n const basketId = trip.BasketId;\n const tripId = trip.TripId;\n let insuranceSearchId = trip.InsuranceRequest ? trip.InsuranceRequest.AvailabilitySearchId : null;\n\n basketStore.insurance(basketId, $routeParams.productId).then(results => {\n const insurance = results || this.noneInsurance;\n this.insurance = angular.copy(insurance);\n\n const _updateSubtitle = () => {\n if (this.insuranceQuotes && _.get(this, 'insurance.QuoteId', false)) {\n const insuranceQuote = arrayUtil.first(this.insuranceQuotes, i => {\n return angular.equals(i.QuoteId, this.insurance.QuoteId);\n });\n this.insuranceQuoteDescription = insuranceQuote ?\n `${insuranceQuote.AdultCount + insuranceQuote.ChildCount + insuranceQuote.InfantCount\n } x ${insuranceQuote.QuoteType.Destination} - ${insuranceQuote.QuoteType.Scheme\n } ${insuranceQuote.QuoteType.Type\n } (${resourceService.get('FROM')} ${$filter('customCurrency')(insuranceQuote[\n TRPCONFIG.Domain.InsurancePerPersonPricing ?\n 'PerPersonPrice' :\n 'Price'\n ])} ${resourceService.get('PERPERSON_ABBREVIATION')})`\n : null;\n }\n };\n\n if (TRPCONFIG.Domain.CrossSellInsuranceEnabled) {\n\n const getInsurance = (insuranceSearchId, params) => {\n this.insuranceAvailabilityBusy = true;\n return basketService.getInsuranceQuotes(insuranceSearchId, basketId, tripId, params)\n .then(insuranceQuotes => {\n if (insuranceQuotes != null && insuranceQuotes.length > 0) {\n this.insuranceQuotes = insuranceQuotes;\n this.hasPpPrices = !!insuranceQuotes[0].PerPersonPrice;\n if (insuranceQuotes && insurance.Options) {\n const key = insuranceService\n .decomposeOptionId(insurance.Options[0].OptionId);\n this.insurance = angular.copy(arrayUtil.first(this.insuranceQuotes, i => {\n return i.SupplierId === key.supplierId\n && i.QuoteType.TypeId === key.typeId\n && i.QuoteType.SchemeId === key.schemeId\n && (i.QuoteType.RelationshipId === key.relationshipId\n || key.relationshipId === 0);\n }));\n }\n if (this.noSuperQuotes) {\n this._removeSuperQuotes();\n }\n }\n this.singleVat = insuranceService\n .isVatMessageInclusive(this.insuranceQuotes, false);\n this.multipleVat = insuranceService\n .isVatMessageInclusive(this.insuranceQuotes, true);\n _updateSubtitle();\n this.insuranceAvailabilityBusy = false;\n },\n error => {\n this.insuranceAvailabilityBusy = false;\n this.insuranceQuotes = [];\n }\n );\n };\n\n if (this.isHotelJourney) {\n basketStore.hotel(basketId)\n .then(hotel => {\n this.dates = {\n arrivalDate: _.get(hotel, 'Details.Itinerary.CheckInDate'),\n departureDate: _.get(hotel, 'Details.Itinerary.CheckOutDate')\n };\n getInsurance(null, {\n airport: _.get(hotel, 'Details.LinkedAirports[0]'),\n dates: this.dates\n });\n });\n }\n\n if (insuranceSearchId || !this.isHotelJourney) {\n getInsurance(insuranceSearchId, {});\n }\n\n //get the document paths\n this.documentPaths = insuranceService.getDocumentPaths();\n\n $scope.$watch('ins.insurance.QuoteId', (val, old) => {\n if (val == null || old === undefined) {\n if (val || val === -1) {\n this.onUpdate({ value: true, type: 'insurance' });\n };\n return;\n }\n _updateSubtitle();\n if (val !== this.noneInsurance.QuoteId) {\n const quote = arrayUtil.first(this.insuranceQuotes, i => {\n return i.QuoteId === val;\n });\n\n //we need to re-check the trip here in case we have just generated the search id\n tripService.getTrip(tripId).then(t => {\n insuranceSearchId = t.InsuranceRequest.AvailabilitySearchId;\n this.onUpdate({ value: false, type: 'insurance'});\n return basketService.selectInsurance(quote, insuranceSearchId, basketId)\n .then(() => {\n basketService.updateBasket();\n this.onUpdate({value: true, type : 'insurance'});\n }\n );\n });\n } else {\n this.onUpdate({ value: false, type: 'insurance'});\n basketStore.removeInsurance(basketId).then(\n () => {\n basketService.updateBasket();\n this.onUpdate({ value: true, type: 'insurance'});\n });\n }\n });\n }\n }).then(null, basketService.restartHolidayWorkflow);\n\n this.viewInfo = (quoteId, $event) => {\n $event.preventDefault();\n $event.stopPropagation();\n\n this.currentInfoId = quoteId;\n };\n }, basketService.bookingAlreadyDone(`insurance: '${$routeParams.tripId}'`));\n\n }\n\n private _removeSuperQuotes() {\n this.insuranceQuotes = [ _.find(this.insuranceQuotes, ['QuoteType.SchemeId', 1]) ];\n }\n }\n\n angular\n .module('TR')\n .component('crossSellInsurance', {\n bindings: {\n isHotelJourney: '<',\n onUpdate : '&'\n },\n controller: CrossSellInsurance,\n controllerAs: 'ins',\n templateUrl: 'partials/home/directivetemplate?type=CrossSellInsurance'\n });\n}\n","'use strict';\nnamespace TR {\n\n interface RouteParams extends ng.route.IRouteService {\n tripId: string;\n }\n\n class CrossSellParking {\n\n private basketId :string;\n private searchId :string|null;\n private readonly tripId :string;\n\n public airportTitle :string;\n public isBusyAvailability :boolean = true;\n public isBusySelection :boolean;\n public items :Core.Parking.Quote[] = [];\n public readonly noneSelectionId :Core.Parking.Id = {CarParkCode: '-1', SupplierId: -1};\n public selectedItemId :Core.Parking.Id;\n public show :boolean;\n public terminalTitle :string;\n\n constructor(private $q :ng.IQService,\n private $routeParams :RouteParams,\n private $scope :ng.IScope,\n private basketService :any,\n private basketStore :any,\n private flightsTerminalService :Core.FlightsTerminalService,\n private resourceService :Core.ResourceService,\n private tripService :Core.TripService) {\n\n this.selectedItemId = this.noneSelectionId;\n this.tripId = $routeParams.tripId;\n\n tripService.getTrip(this.tripId)\n .then((trip :Core.Trip.TripState) => {\n\n this.basketId = trip.BasketId;\n const isOneWay = trip.FlightsRequest && trip.FlightsRequest.OneWayOnly;\n\n if (isOneWay) {\n this.show = false;\n return;\n }\n\n if (trip.ParkingRequest) {\n this.searchId = trip.ParkingRequest.AvailabilitySearchId;\n }\n\n $q.all([\n basketStore.parking(this.basketId),\n this.retrieveQuotes(this.searchId, this.basketId, this.tripId),\n basketStore.flight(trip.BasketId)\n ]).then((results) => {\n\n let selected = results[0];\n this.items = results[1];\n const leg = results[2].Details.Itinerary.Legs[0];\n\n this.airportTitle = leg.DepartureAirport.Title;\n\n flightsTerminalService.getTerminalForFlight( leg.DepartureAirport.Code,\n leg.Segments[0].FlightNumber,\n leg.DepartureDate\n ).then(terminal => {\n if (terminal) {\n this.terminalTitle = terminal.Title;\n }\n });\n\n //find the parking item from our quotes so that we can select it\n if (selected) {\n const item = this.findParkingItem(this.items, selected.Details.Quote.QuoteId);\n this.selectedItemId = item.QuoteId;\n }\n\n if(!this.searchId) {\n tripService.getTrip(this.tripId)\n .then(trip => {\n return this.searchId = trip && trip.ParkingRequest\n && trip.ParkingRequest.AvailabilitySearchId;\n });\n }\n\n $scope.$watch('$ctrl.selectedItemId', (n, o) => {\n if (n && !angular.equals(n,o)) {\n this.selectParking();\n }\n });\n\n }).finally(() => this.isBusyAvailability = false);\n\n }, this.basketService.bookingAlreadyDone(`crossSellParking: '${this.tripId}'`));\n }\n\n private retrieveQuotes(searchId :string | null,\n basketId :string,\n tripId :string\n ) :ng.IPromise {\n\n return this.basketService.getParkingQuotes(searchId, basketId, tripId)\n .then((quotes :Core.Parking.Quote[]) => {\n let bestQuotes :Core.Parking.Quote[] = [];\n\n bestQuotes = this.addBestQuote(bestQuotes, quotes, false, false); // off airport\n bestQuotes = this.addBestQuote(bestQuotes, quotes, false, true); // on airport\n bestQuotes = this.addBestQuote(bestQuotes, quotes, true, null); // meet and greet\n\n return bestQuotes;\n });\n }\n\n private findParkingItem(list :Core.Parking.Quote[],\n quoteId :Core.Parking.Id\n ) :Core.Parking.Quote {\n\n return _.find(list, (i) => i.QuoteId.CarParkCode === quoteId.CarParkCode);\n }\n\n private addBestQuote(bestQuotes: Core.Parking.Quote[],\n quotes :Core.Parking.Quote[],\n meetAndGreet :boolean,\n onAirport :boolean|null\n ) :Core.Parking.Quote[] {\n\n const best = _.maxBy(\n _.filter(quotes, (quote :Core.Parking.Quote) => {\n return quote.Facilities.MeetAndGreet === meetAndGreet &&\n (onAirport == null || quote.Facilities.OnAirport === onAirport);\n })\n , 'Ranking'\n );\n\n if (best) {\n return [...bestQuotes, best];\n }\n return [...bestQuotes];\n }\n\n public selectParking() :void {\n\n this.isBusySelection = true;\n\n if (this.selectedItemId === this.noneSelectionId) {\n\n this.removeParking().finally(() => this.isBusySelection = false); //remove it\n\n } else {\n\n this.basketService.selectParking(this.selectedItemId, this.searchId, this.basketId)\n .then(angular.noop, () => this.selectedItemId = this.noneSelectionId)\n .finally(() => this.isBusySelection = false);\n }\n }\n\n public removeParking() :ng.IPromise {\n return this.basketStore.removeParking(this.basketId)\n .then(() => this.basketService.updateBasket());\n }\n\n public getFrequencyText(frequencyInfo :Core.Parking.TransferInformation) :string {\n let description = '';\n\n if (frequencyInfo && (frequencyInfo.Duration || frequencyInfo.Frequency) ) {\n if (frequencyInfo.Duration === '0'){\n description = this.resourceService.get('OPTIONSPARKINGDURATIONONAIRPORT');\n } else {\n description = String.format(this.resourceService.get('OPTIONSPARKINGDURATIONTOAIRPORT'),\n frequencyInfo.Duration);\n }\n\n if (frequencyInfo.Frequency) {\n const frequencyText = String.format(this.resourceService.get('OPTIONSPARKINGFREQUENCY'),\n frequencyInfo.Frequency);\n if (frequencyInfo.Duration !== '0') {\n description = String.format('{0} ({1})', description, frequencyText);\n } else if (!frequencyInfo.Duration){\n description = String.format('{0} {1}', description, frequencyText);\n }\n }\n }\n\n return description;\n }\n }\n\n angular\n .module('TR')\n .component('crossSellParking', {\n bindings: {\n show: '='\n },\n controller: CrossSellParking,\n templateUrl: 'partials/home/directivetemplate?type=CrossSellParking'\n });\n}\n","'use strict';\n\nnamespace TR {\n\n import IScope = angular.IScope;\n import ResourceService = Core.ResourceService;\n import TransferQuote = Core.Transfers.TransferQuote;\n import AvailableExtrasPerRoom = Core.Transfers.AvailableExtrasPerRoom;\n import SelectedTransfer = Core.Transfers.SelectedTransfer;\n import BrandedFareTypesService = ekh.BrandedFareTypesService;\n\n interface RouteParams extends ng.route.IRouteService {\n tripId: string;\n productId: string;\n }\n\n class CrossSellTransfers {\n transfersEnabled: boolean;\n\n private isHotelJourney: boolean;\n\n readonly emptyTransfer: SelectedTransfer;\n readonly noneTransfer: SelectedTransfer;\n nullTransferText: () => string;\n showNoTransferOption: boolean = true;\n showMandatoryExtrasTransfer: boolean = false;\n showInitialMessage: boolean = false;\n transfersAvailabilityBusy: boolean = true;\n transfersSelectionBusy: boolean = true;\n qtys: any = sessionStorage.getItem('priceQtys');\n trip: any = this.tripService.getTrip(this.$routeParams.tripId).then(t => {\n return t;\n });\n\n transfer: SelectedTransfer;\n private transfers: TransferQuote[];\n rankedResults: TransferQuote[];\n private maldivesTransfers: AvailableExtrasPerRoom;\n\n total: number = 0;\n\n showDetailsError: boolean;\n\n private basketId: undefined | string;\n // TODO remove code related to var isTransferMandatory it is old functionality\n isTransferMandatory: boolean;\n mandatoryExtrasEnabled: boolean = false;\n isMandatoryExtra: boolean = false;\n private mandatoryTransfer: any;\n private bookedMandatoryOptions: any;\n hotelName: string;\n isAvailableTransfer: boolean;\n private transferQuoteDescription: string;\n private hotelData: any;\n private roomsWithMandatoryTransfer: any;\n private hotelExtrasSelectedTransfer: any;\n private hotelExtrasMandatoryTransfers: any[];\n private hotelProductId: string;\n private OptionId: string;\n selectedTransfer: any;\n defaultMandatoryTransfer: boolean = false;\n\n constructor(\n private $q :ng.IQService,\n private $routeParams :RouteParams,\n private $scope: IScope,\n private analytics,\n private basketService,\n private basketStore,\n private hotelFromSession,\n private broker: Core.Broker,\n private customCurrencyFilter,\n private resourceService: Core.ResourceService,\n private tripService: Core.TripService,\n private mandatoryTransferService,\n private hotelRoomService,\n private brandedFareTypesService: ekh.BrandedFareTypesService) {\n this.noneTransfer = { Details: { TransferId: '-1' } };\n this.emptyTransfer = { Details: { TransferId: null } };\n this.mandatoryExtrasEnabled = TRPCONFIG.Domain.MandatoryExtrasEnabled;\n this.mandatoryTransfer = [];\n if (this.isHotelJourney) {\n this.showInitialMessage = true;\n this.transfersAvailabilityBusy = false;\n }\n broker.subscribe('Transfers', 'ProductHotelReceivedFromBasket', e => {\n this.basketId = e.data.basketId;\n this.hotelProductId = e.data.productId;\n });\n\n $scope.$watch('tran.hotelExtrasSelectedTransfer', (val: any) => {\n if(val && this.hotelProductId && this.basketId) {\n this.OptionId = this.mandatoryTransferService\n .generateOptionId(undefined, val.HotelExtraId, val.HotelExtraOptionId);\n const type = 2;\n basketStore.addOption(type, this.hotelProductId, this.OptionId, this.basketId)\n .then(()=>{\n const hemt = this.hotelExtrasMandatoryTransfers;\n const hest = this.hotelExtrasSelectedTransfer;\n const options = this._getExpiredOptions(hemt, hest);\n basketStore.removeOptions(type, this.hotelProductId, options, this.basketId).then(() => {\n basketService.updateBasket();\n });\n });\n }\n });\n\n broker.subscribe('Transfers', 'transferRequestFailed', () => {\n this.showDetailsError = true;\n if (!this.isTransferMandatory) {\n this.transfer = angular.copy(this.noneTransfer);\n }\n });\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('Transfers');\n });\n\n tripService.getTrip($routeParams.tripId).then((trip: Core.Trip.TripState) => {\n this.basketId = trip.BasketId;\n const tripId = trip.TripId;\n const domain = TRPCONFIG.Domain;\n let transferSearchId: string = _.get(trip, 'TransfersRequest.AvailabilitySearchId');\n\n $q.all([\n basketStore.transfer(this.basketId, $routeParams.productId),\n basketStore.hotel(this.basketId, $routeParams.productId),\n basketStore.all(this.basketId, $routeParams.productId)\n ]).then(results => {\n this.defaultMandatoryTransfer = domain.IncludeMandatoryExtrasBookedItem &&\n domain.IncludeMandatoryExtrasInHolidaysPrice;\n const includedExtras = JSON.parse(sessionStorage.getItem('IncludedExtras') || '{}');\n this.selectedTransfer = includedExtras;\n this.isMaldives(results);\n let transfer;\n if (this.showMandatoryExtrasTransfer && !results[0] && results[2].h.CostBreakdown) {\n let extra;\n results[2].h.CostBreakdown.forEach( cb =>{\n extra = cb.ExtraReference ? cb.ExtraReference : '';\n });\n const id = extra ? extra.split('|')[extra.split('|').length - 1] : '-1';\n transfer = { Details: { TransferId: id } };\n } else {\n transfer = results[0] || this.noneTransfer;\n }\n\n $scope.$emit('sendTransferSelection', transfer);\n this.transfer = angular.copy(transfer);\n\n const hotel = results[1];\n\n if (hotel.Details.AvailableExtrasPerRoom[0] &&\n hotel.Details.AvailableExtrasPerRoom[0].length > 0) {\n this.maldivesTransfers = hotel.Details.AvailableExtrasPerRoom[0][0];\n }\n\n if (this.mandatoryExtrasEnabled && hotel) {\n this.hotelFromSession.getHotel(hotel.AvailabilitySearchId, hotel.Details.Id, tripId)\n .then(res => {\n this.hotelData = angular.copy(res);\n if (this.hotelData){\n this._initMandatoryTransfers(hotel, trip);\n }\n });\n }\n\n this.transfersEnabled = _([this.tripService.tripTypes.Holiday,\n this.tripService.tripTypes.Hotel])\n .includes(trip.TripType) && hotel && !hotel.isVilla;\n\n\n const getTransfers = (transferSearchId: null | string, params) => {\n basketService.getTransfers(transferSearchId, this.basketId, tripId, params).then((r) => {\n if (r && r.length > 0 && this.isTransferMandatory) {\n this.transfer.Details.TransferId = r[0].TransferId;\n }\n this.setResults(r, hotel);\n });\n };\n\n\n if (this.isHotelJourney) {\n broker.subscribe('Transfers', 'flightDataUpdated', e => {\n this.transfersAvailabilityBusy = true;\n this.transfer = angular.copy(this.noneTransfer);\n getTransfers(null, e && e.data);\n });\n }\n\n if (transferSearchId || !this.isHotelJourney) {\n getTransfers(transferSearchId, {});\n }\n\n if (hotel && trip.FlightsRequest && trip.FlightsRequest.Destination) {\n this._checkIstransferMandatory(trip.FlightsRequest);\n }\n\n this._setTransfersWatcher(trip, tripId, transferSearchId);\n\n }).then(angular.noop, basketService.restartHolidayWorkflow);\n }, basketService.bookingAlreadyDone);\n\n }\n\n _getExpiredOptions(transfers, currentTransfer) {\n let expiredOptionsIds = Array();\n if(currentTransfer && transfers.length && transfers.length > 0) {\n let expiredTransfers = transfers.filter(t => {\n return t.HotelExtraId === currentTransfer.HotelExtraId\n && t.HotelExtraOptionId !== currentTransfer.HotelExtraOptionId;\n });\n expiredTransfers.forEach(et => {\n let OptionId = this.mandatoryTransferService\n .generateOptionId(undefined, et.HotelExtraId, et.HotelExtraOptionId);\n expiredOptionsIds.push({OptionId});\n });\n }\n return expiredOptionsIds;\n }\n\n private transferQuoteDescriptionWithPrice: string;\n\n // This function checks for whether a destination requires a transfer.\n // e.g. the Maldives is required to select a transfer so the 'no transfer' option is hidden.\n isMaldives(results) {\n const MandatroyTransferAirportCodes = TRPCONFIG.Domain2.MandatoryTransferAirportCodes;\n const MandatoryTransferEnabled = TRPCONFIG.Domain2.MandatoryTransferEnabled;\n const flight = results[2].f;\n let airportCodes : string[] = [];\n const itinerary = flight.Details.Itinerary;\n const legs = itinerary.Legs;\n\n legs.map(leg => {\n airportCodes.push(leg.ArrivalAirport.Code);\n });\n\n const OutboundAirportCode = airportCodes[0];\n let showNoTransferOption = this.showNoTransferOption;\n\n MandatroyTransferAirportCodes.map(code => {\n if (code === OutboundAirportCode) {\n showNoTransferOption = false;\n }\n });\n\n MandatoryTransferEnabled.map(code => {\n if (code === OutboundAirportCode) {\n this.showMandatoryExtrasTransfer = true;\n }\n });\n\n this.showNoTransferOption = showNoTransferOption;\n }\n\n setResults(r, hotel) {\n\n if (this.showMandatoryExtrasTransfer && hotel.Details.AvailableExtrasPerRoom[0] &&\n hotel.Details.AvailableExtrasPerRoom[0].length > 0) {\n let CombinedRoomsCost = {};\n let extras = hotel.Details.AvailableExtrasPerRoom;\n this.transfers = _.sortBy(\n hotel.Details.AvailableExtrasPerRoom[0][0].Options, 'GrossCost');\n if (extras.length > 1) {\n for (let j = 0; j < this.transfers.length; j++) {\n for (let i = 0; i < extras.length; i++) {\n if (CombinedRoomsCost[extras[i][0].Options[j].HotelExtraOptionId]) {\n let cost = CombinedRoomsCost[extras[i][0].Options[j].HotelExtraOptionId];\n CombinedRoomsCost[extras[i][0].Options[j].HotelExtraOptionId] =\n cost + extras[i][0].Options[j].GrossCost;\n } else {\n CombinedRoomsCost[extras[i][0].Options[j].HotelExtraOptionId] =\n extras[i][0].Options[j].GrossCost;\n }\n }\n }\n extras[0][0].Options.forEach(\n option => {\n option.GrossCost = CombinedRoomsCost[option.HotelExtraOptionId];\n }\n );\n this.transfers = _.sortBy(\n extras[0][0].Options, 'GrossCost');\n }\n } else {\n if (r != null) {\n this.transfers = _.sortBy(r, 'TotalPrice');\n this._updateSubtitle();\n //so that we can test both versions of the page\n // we need to create a secondary limited list of transfers to use on the new design\n this.rankedResults = _.sortBy(_.take(r, 3), 'TotalPrice');\n this.isAvailableTransfer = (this.rankedResults && this.rankedResults.length > 0) ||\n this.showInitialMessage;\n }\n }\n\n if (hotel != null) {\n const hotelDetails = _.get(hotel, 'Details');\n const bookedItems = _.get(hotelDetails, 'BookedItems');\n const mandatoryTransfers = _.get(bookedItems[0], 'mandatoryTransfers');\n\n if (mandatoryTransfers) {\n this.isAvailableTransfer = true;\n }\n }\n\n if (TRPCONFIG.Domain.EnforceTransferOptionSelection && this.isNoneTransfer(this.transfer)) {\n this.transfer = angular.copy(this.emptyTransfer);\n }\n\n this.transfersAvailabilityBusy = false;\n\n //tracking\n if (r != null && r.length > 0) {\n this._trackingTransferSelection(this.transfer.Details.TransferId);\n } else {\n this.analytics.track('mixpanel', 'OptionsTransferNoAvailability');\n }\n\n }\n\n isNoneTransfer(transfer :SelectedTransfer) :boolean {\n return angular.equals(transfer, this.noneTransfer);\n }\n\n _setMandatoryTransferWatcher(trip, hotel) {\n if (this.tripService.supportsTransfers(trip)) {\n this.$scope.$watchCollection('tran.mandatoryTransfer', () => {\n const transfersWrapper = {transfers: this.mandatoryTransfer};\n const options = this.mandatoryTransferService\n .generateOptionsForMultiRooms(transfersWrapper,\n this.roomsWithMandatoryTransfer);\n this._changeMandatoryTransfer(options, hotel);\n });\n }\n }\n\n _setTransfersWatcher(trip, tripId, transferSearchId) {\n if (this.tripService.supportsTransfers(trip)) {\n this.$scope.$watch('tran.transfer.Details.TransferId', (val) => {\n let isObject = typeof val === 'object' && val !== null;\n\n if (TRPCONFIG.Domain.EnforceTransferOptionSelection) {\n if (this.transfers && this.transfers.length > 0) {\n this.$scope.$emit('sendTransferSelection', val);\n let transferSelected: any = val;\n let transferType;\n if(transferSelected){\n if(isObject) {\n transferType = this.transfers.filter(\n trans => trans.TransferId.TransferCode === transferSelected.TransferCode\n );\n } else {\n if (val === -1) {\n transferType = this.transfers.filter(\n trans => trans.TransferId.TransferCode === transferSelected.TransferCode\n );\n } else if (val !== -1) {\n transferType = this.transfers.filter(\n trans => trans.HotelExtraOptionId === transferSelected\n );\n }\n }\n } else {\n transferType = [];\n }\n this.selectedTransfer.ExtraOptionId = transferType.length > 0 &&\n transferType[0].HotelExtraOptionId ? transferType[0].HotelExtraOptionId : null;\n this.selectedTransfer.ClientPrice = transferType.length > 0 &&\n transferType[0].GrossCost ? transferType[0].GrossCost : null;\n sessionStorage.setItem('Transfer', JSON.stringify(\n transferType[0] ? transferType[0] : null\n ));\n }\n else {\n this.$scope.$emit('sendTransferSelection', this.noneTransfer);\n }\n }\n\n if (val == null) {\n return;\n }\n this.$scope.$emit('flash:hide');\n this.transfersSelectionBusy = true;\n if (this.transfers && this.transfers.length > 0) {\n this._trackingTransferSelection(val);\n }\n this._updateSubtitle();\n\n if (val !== this.noneTransfer.Details.TransferId) {\n //we need to re-check the trip here in case we have just generated the search id\n this.tripService.getTrip(tripId).then((t) => {\n transferSearchId = _.get(t, 'TransfersRequest.AvailabilitySearchId');\n if (this.showMandatoryExtrasTransfer && this.maldivesTransfers &&\n this.maldivesTransfers.Options){\n //Expected in this format: HotelExtra|||\n val = `HotelExtra|0|${this.maldivesTransfers.HotelExtraId}|${val}`;\n }\n this.basketService.selectTransfer(val, transferSearchId, this.basketId, tripId)\n .then(async () => {\n this.basketService.updateBasket();\n this.showDetailsError = false;\n this.transfersSelectionBusy = false;\n if (sessionStorage.getItem('storeSelectedFlight') !== null ||\n sessionStorage.getItem('DefaultFlight') !== null && isObject) {\n TRPCONFIG.Domain.BrandedFareCancellations =\n await this.brandedFareTypesService\n .getCancellationCharges(this.basketId);\n sessionStorage.setItem('BrandedFareCancellations',\n JSON.stringify(TRPCONFIG.Domain.BrandedFareCancellations));\n }\n });\n });\n } else {\n this.basketStore.removeTransfer(this.basketId).then(this.basketService.updateBasket)\n .then(async () => {\n if (sessionStorage.getItem('storeSelectedFlight') !== null ||\n sessionStorage.getItem('DefaultFlight') !== null && isObject) {\n TRPCONFIG.Domain.BrandedFareCancellations =\n await this.brandedFareTypesService\n .getCancellationCharges(this.basketId);\n sessionStorage.setItem('BrandedFareCancellations',\n JSON.stringify(TRPCONFIG.Domain.BrandedFareCancellations));\n }\n });\n this.transfersSelectionBusy = false;\n }\n });\n\n this.nullTransferText = this.resourceService.getDeferred('NOTRANSFERREQUIRED');\n }\n }\n\n async _trackingTransferSelection(transferId) {\n let min,max;\n if (this.showMandatoryExtrasTransfer && this.transfers && this.transfers.length > 0 &&\n this.transfers[0].GrossCost) {\n min = _.first(this.transfers).GrossCost;\n max = _.last(this.transfers).GrossCost;\n } else {\n min = _.first(this.transfers).TotalPrice;\n max = _.last(this.transfers).TotalPrice;\n }\n const data: any = {\n Title: null,\n CostPP: null,\n CostTotal: null,\n OptionIndex: null,\n TotalOptions: this.transfers.length + 1, //+1 for 'no transfer' options\n MinOptionCostTotal: min,\n MaxOptionCostTotal: max,\n HotelAndFlightCost: null,\n SupplierName: null\n };\n\n TRPCONFIG.Domain.TransferPrice = 0;\n\n if (transferId == null) {\n data.Title = 'Nothing selected';\n TRPCONFIG.Domain.TransferPrice = 0;\n } else if (transferId !== '-1') {\n let index = 0;\n const quote = _.find(this.transfers, (t, i) => {\n index = i;\n return angular.equals(t.TransferId, transferId);\n });\n\n if (quote && quote.Type) {\n data.Title = quote.Type;\n data.CostPP = quote.PerPersonPrice;\n data.CostTotal = quote.TotalPrice;\n data.OptionIndex = index + 1; //0-based index will confuse end user\n data.SupplierName = quote.SupplierName;\n let transferPrice = data.CostTotal;\n TRPCONFIG.Domain.TransferPrice = transferPrice;\n }\n\n } else if (transferId === '-1') {\n data.Title = 'No Transfer';\n TRPCONFIG.Domain.TransferPrice = 0;\n }\n\n\n this.$q.all([\n this.basketStore.hotelCost(this.basketId),\n this.basketStore.flightCost(this.basketId)\n ]).then(res => {\n data.HotelAndFlightCost += res[0] + res[1];\n this.analytics.track('mixpanel', 'OptionsTransferSelected', data);\n });\n\n let trip = await this.trip;\n\n let selectedFlight = JSON.parse(sessionStorage.getItem('storeSelectedFlight') || '{}');\n let flightFare = JSON.parse(sessionStorage.getItem('flightFare') ||' {}');\n let fare = TRPCONFIG.Domain.FlightFare || flightFare;\n let legs = fare.Legs || selectedFlight.Legs;\n let hotel = JSON.parse(sessionStorage.getItem('hotelData') || '{}');\n\n let baseCost = Number(sessionStorage.getItem('baseCost')) || this.basketStore.baseCostTotal();\n let qtys = JSON.parse(this.qtys);\n\n let totalFares = this.brandedFareTypesService.calculateTotalFares(fare, qtys);\n let totalTaxes = this.brandedFareTypesService.calculateTotalTaxes(fare, qtys);\n\n let packageCost = baseCost + totalFares + TRPCONFIG.Domain.TransferPrice;\n\n if (packageCost) {\n let accruedMiles =\n await this.brandedFareTypesService.payloadEntry(null, trip, legs, hotel, packageCost);\n TRPCONFIG.Domain.SkywardsInfo = accruedMiles;\n }\n }\n\n _updateSubtitle() {\n if (this.transfers && this.transfer.Details.TransferId) {\n const transferQuote = _.find(this.transfers, (t) => {\n return angular.equals(t.TransferId, this.transfer.Details.TransferId);\n });\n this.total = transferQuote ? transferQuote.TotalPrice : 0;\n this.transferQuoteDescription = transferQuote\n ? `${transferQuote.Quantity} x ${transferQuote.Type}`\n : '';\n this.transferQuoteDescriptionWithPrice = transferQuote\n ? `${this.transferQuoteDescription} (${this.customCurrencyFilter(this.total)})`\n : '';\n }\n }\n\n _checkIstransferMandatory(flight) {\n const destinationAiports = flight.DestinationAirports ? flight.DestinationAirports\n : flight.Destination.DestinationAirports.split(',');\n this.isTransferMandatory = destinationAiports.includes(...TRPCONFIG.Domain.IsTransferMandatory);\n }\n\n _initMandatoryTransfers(hotel, trip) {\n this.roomsWithMandatoryTransfer = this.mandatoryTransferService\n .getHolidayRoomsWithTransfers(hotel.Details) || [];\n this.roomsWithMandatoryTransfer.length > 0 ? this.transfersSelectionBusy = false : null;\n this.bookedMandatoryOptions = [];\n for(let i = 0; i < this.roomsWithMandatoryTransfer.length; i++) {\n this.bookedMandatoryOptions = this.mandatoryTransferService\n .getSelectedTransfers(hotel, this.roomsWithMandatoryTransfer);\n this.mandatoryTransfer[i] = this.bookedMandatoryOptions[i]\n || this.roomsWithMandatoryTransfer[i].mandatoryTransfers[0];\n }\n if (this.mandatoryTransfer.length > 0 || this.roomsWithMandatoryTransfer.length > 0) {\n this.isAvailableTransfer = true;\n }\n if (this.bookedMandatoryOptions && this.bookedMandatoryOptions.length > 0) {\n this.bookedMandatoryOptions = this.mandatoryTransferService\n .generateOptionsForMultiRooms({transfers: this.bookedMandatoryOptions},\n this.roomsWithMandatoryTransfer);\n }\n }\n _changeMandatoryTransfer(options, hotel) {\n if (options.length > 0 && JSON.stringify(this.bookedMandatoryOptions) !== JSON.stringify(options)) {\n const productType = this.basketStore.productType.Transfer;\n const productId = hotel.ProductId;\n this.basketStore.removeOptions(productType, productId, this.bookedMandatoryOptions, this.basketId)\n .then(() => {\n this.bookedMandatoryOptions = options;\n this.basketStore.addOptions(productType, productId, options, this.basketId)\n .then(() => this.basketService.updateBasket());\n });\n }\n }\n }\n\n angular\n .module('TR')\n .component('crossSellTransfers', {\n bindings: {\n isHotelJourney: '<',\n isTransferMandatory: '=?',\n isAvailableTransfer: '=?',\n isMandatoryExtra: '@'\n },\n controller: CrossSellTransfers,\n controllerAs: 'tran',\n templateUrl: 'partials/home/directivetemplate?type=CrossSellTransfers'\n });\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .directive('datePicker', datepicker);\r\n\r\nfunction datepicker(resourceService, $timeout, dateUtil) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: (element, attr) => {\r\n let base = 'partials';\r\n if (attr.templateVersion) {\r\n return `${base}/booking/template?name=DatePicker&version=${attr.templateVersion}`;\r\n }\r\n return `${base}/home/directivetemplate?type=DatePicker`;\r\n },\r\n scope: {\r\n select: '&',\r\n minDate: '=',\r\n maxDate: '=',\r\n defaultTime: '=',\r\n currentDate: '=',\r\n dates: '=',\r\n showApplyButton: '=',\r\n showTime: '=',\r\n isTimeApprovedByCustomer: '=?',\r\n requiresTimeApproval: '=',\r\n timeLabelKey: '@',\r\n timeErrorMsg: '@',\r\n placeholder: '@',\r\n noInitialDate: '@',\r\n numberOfMonths: '@',\r\n datepickerClass: '=',\r\n focusTracker: '@',\r\n isDisabled: '=?',\r\n isDisabledPlaceholder: '@',\r\n isRequired: '=?',\r\n isReadonly: '=?'\r\n },\r\n link: _linker,\r\n controller: _controller,\r\n transclude: true\r\n };\r\n\r\n function _controller($scope, $element) {\r\n this.dateEl = $element.find('.datepicker-wrapper');\r\n }\r\n\r\n function _linker(scope, el, attr) {\r\n let selectedDate = parseCurrentDate();\r\n const dateEl = el.find('.datepicker-wrapper');\r\n\r\n if (TRPCONFIG.IsTouchDevice) {\r\n dateEl.attr('readonly', 'true');\r\n }\r\n\r\n // Used as `ng-model` primarily to enable `ng-invalid` etc. on field\r\n scope.fieldVals = {\r\n date: {}\r\n };\r\n\r\n // Re-wire 'focus-tracker' attr to input field\r\n if (scope.focusTracker && scope.$parent.ft) {\r\n scope.$parent.ft.init(dateEl);\r\n }\r\n\r\n // `required` attr has no value\r\n if (attr.hasOwnProperty('required')) {\r\n scope.isRequired = true;\r\n }\r\n\r\n scope.timeValue = {};\r\n\r\n const dp = dateEl.datepicker({\r\n numberOfMonths: parseInt(scope.numberOfMonths) || 1,\r\n dateFormat: 'dd-M-yy',\r\n firstDay: 1,\r\n\r\n minDate: parseMinDate(scope.minDate), // `true` for current date\r\n maxDate: dateUtil.parseDate(scope.maxDate),\r\n beforeShowDay,\r\n\r\n // http://www.objectpartners.com/2012/06/18/jquery-ui-datepicker-ie-focus-fix/\r\n // http://bugs.jqueryui.com/ticket/9125 is not important enough apparently\r\n lastDisplay: null,\r\n\r\n onSelect() {\r\n selectDate();\r\n this.lastDisplay = new Date().getTime();\r\n this.blur();\r\n },\r\n onClose() {\r\n // This deals with anything typed into the field that changed the value\r\n const dpDate = dp.datepicker('getDate') || '';\r\n const expected = selectedDate || '';\r\n if (dpDate.toString() !== expected.toString()) {\r\n selectDate();\r\n } else {\r\n syncField();\r\n }\r\n },\r\n beforeShow() {\r\n return !this.lastDisplay || (new Date().getTime()) - this.lastDisplay > 100;\r\n },\r\n prevText: '',\r\n nextText: '',\r\n isRTL: TRPCONFIG.Rtl\r\n });\r\n\r\n function selectDate() {\r\n selectedDate = dp.datepicker('getDate');\r\n\r\n // $apply avoiding $digest errors\r\n scope.$evalAsync(() => {\r\n if (selectedDate == null) {\r\n scope.select({ date: null });\r\n } else if (!scope.showTime) {\r\n scope.select({ date: dateUtil.serialiseDate(selectedDate) });\r\n } else if (!scope.showApplyButton) {\r\n scope.setDepartureDateAndTime();\r\n }\r\n syncField();\r\n });\r\n }\r\n\r\n if (scope.showTime && !scope.showApplyButton) {\r\n scope.$watchGroup(\r\n ['tp.hours', 'tp.minutes'], vals => {\r\n if (vals[0] && vals[1]) {\r\n // Timer ensures field is ready\r\n $timeout(selectDate);\r\n }\r\n }\r\n );\r\n }\r\n\r\n // terrible hack to prevent the default behaviour of jQuery datepicker\r\n // so we can have no selected and highlighted date\r\n $timeout(function() {\r\n const currDate = parseCurrentDate();\r\n if (scope.noInitialDate === 'true') {\r\n scope.$apply(function() {\r\n if (!scope.currentDate || !dateUtil.isValid(currDate)) {\r\n dp.datepicker('setDate', null);\r\n $(el).find('td.ui-datepicker-current-day').removeClass('ui-datepicker-current-day');\r\n } else {\r\n dp.datepicker('setDate', currDate);\r\n scope.currentDate = dateUtil.serialiseDate(currDate);\r\n }\r\n });\r\n } else {\r\n let searchDates = JSON.parse(sessionStorage.getItem('searchDates'));\r\n if (searchDates) {\r\n document.getElementsByClassName('searchDates')[0].value = searchDates.startDate;\r\n }\r\n dp.datepicker('setDate', currDate);\r\n }\r\n });\r\n\r\n scope.$watch('minDate', function(val) {\r\n if (val != null) {\r\n dateEl.datepicker('option', 'minDate', parseMinDate(val));\r\n\r\n // If select date is called on mobile then the datepicker freezes up.\r\n if (TRPCONFIG.Domain.DeviceType === 'Desktop') {\r\n selectDate();\r\n }\r\n }\r\n });\r\n\r\n scope.$watch('maxDate', function(val) {\r\n if (val != null) {\r\n dateEl.datepicker('option', 'maxDate', dateUtil.parseDate(val));\r\n }\r\n });\r\n\r\n scope.setDepartureDateAndTime = function() {\r\n let dateOb = null;\r\n\r\n if (scope.tp && (!scope.tp.hours || !scope.tp.minutes)) {\r\n scope.$emit('flash:error', resourceService.get(scope.timeErrorMsg));\r\n }\r\n if (dateUtil.isValid(selectedDate)) {\r\n let hours = scope.tp && scope.tp.hours ? scope.tp.hours : selectedDate.getHours();\r\n let minutes = scope.tp && scope.tp.minutes ? scope.tp.minutes : selectedDate.getMinutes();\r\n dateOb = new Date(\r\n selectedDate.getFullYear(),\r\n selectedDate.getMonth(),\r\n selectedDate.getDate(),\r\n hours,\r\n minutes\r\n );\r\n }\r\n const serialisedDate = dateUtil.serialiseDate(dateOb);\r\n\r\n if (_.isFunction(scope.select)) {\r\n scope.select({ date: serialisedDate, back: true });\r\n } else {\r\n scope.select = serialisedDate;\r\n }\r\n };\r\n\r\n if (scope.showTime) {\r\n //this is sort of a nextTick hack\r\n $timeout(function() {\r\n el.find('button').text(resourceService.get('APPLYDATEANDTIME'));\r\n }, 0);\r\n }\r\n\r\n function syncField() {\r\n // Ensure field contains current value\r\n dp.datepicker('setDate', selectedDate);\r\n dateEl.trigger('input');\r\n }\r\n\r\n function parseCurrentDate() {\r\n return dateUtil.parseDate(scope.currentDate);\r\n }\r\n\r\n function parseMinDate(val) {\r\n return val === true ?\r\n dateUtil.zeroTime(new Date()) :\r\n dateUtil.parseDate(val);\r\n }\r\n\r\n function beforeShowDay(date) {\r\n let allowed = true;\r\n if (scope.dates && Object.keys(scope.dates).length > 0) {\r\n const dateStr = dateUtil.format(date, 'yyyy-MM-dd');\r\n allowed = scope.dates[dateStr] !== undefined;\r\n }\r\n return [allowed, '', ''];\r\n }\r\n }\r\n}\r\n})();\r\n","(function() {\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('destination', function(searchUnitService) {\r\n return {\r\n restrict: 'A',\r\n link(scope, el, attr) {\r\n if (attr.destination != null) {\r\n searchUnitService.setDestination(angular.extend({ landing: true }, JSON.parse(attr.destination)));\r\n }\r\n }\r\n };\r\n});\n})();\n","(function() {\n'use strict';\n\nconst FILTERLINKCONTENTTYPE = 11;\n\nconst TR = angular.module('TR');\n\nTR.directive('destinationContent', function(broker, destinationContent, currentDestination, urlUtils, fidParser) {\n return {\n restrict: 'E',\n replace: false,\n scope: {\n containerClass: '@',\n sitemapLink: '='\n },\n templateUrl: 'partials/home/directivetemplate?type=DestinationContent',\n link(scope) {\n currentDestination.getCurrentDestination().then(function(dest) {\n if (dest != null) {\n init(dest);\n }\n });\n\n function init(dest) {\n destinationContent.get(dest).then(function(contents) {\n contents = _.sortBy(contents, contentOrderRank);\n contents.forEach(function(content, index) {\n if (Array.isArray(content.Items)) {\n content.Items.forEach(function(item, name) {\n if (!_.isNull(item.Url) && !_.isUndefined(item.Url)) {\n contents[index].Items[name].Url = urlUtils.stripLeadingSlash(item.Url);\n }\n });\n }\n });\n\n // if the url we are being hit with matches one of the seo\n // content urls, The fid is considered canonical. Fire off\n //a message to update the canonical tag.\n const currentFid = fidParser.parse();\n\n if (currentFid) {\n const matchedSeoItem = _.find(contents, function(ci) {\n if (ci.ContentType !== FILTERLINKCONTENTTYPE) {\n return false;\n }\n\n return _.find(ci.Items, function(i) {\n const parsedUrl = urlUtils.parse(i.Url);\n\n // no query string object or parameters, exist early.\n if (!parsedUrl.qs || parsedUrl.qs.length === 0) {\n return false;\n }\n\n return currentFid === _.toNumber(parsedUrl.qs.fid);\n });\n });\n\n if (!_.isUndefined(matchedSeoItem)) {\n broker.publish('seoCanonicalDetected', {\n fid: currentFid\n });\n }\n }\n\n // Don't render filter link content.\n scope.items = _.filter(contents, function(ci) {\n return ci.ContentType !== FILTERLINKCONTENTTYPE;\n });\n\n broker.publish('seoContentLoaded');\n });\n }\n\n function contentOrderRank(content) {\n // The order should be:\n // First: SEO Content Types, in alphabetical order\n // Then: The other content types, in id order.\n if (content.ContentType > 7) {\n return `0${content.Title}`;\n }\n return `1${content.ContentType}`;\n }\n }\n };\n});\n})();\n","class DestinationPromoMessage {\n\n className: string;\n text: string[];\n price: string;\n\n constructor (private currentDestination,\n private $interpolate) {\n currentDestination.getCurrentDestination().then(dest => {\n let text = dest.PromoText;\n let matches = text && text.match(/\\S*\\d+\\S*/);\n this.price = matches && matches[0];\n this.text = this.price && text.split(this.price);\n });\n }\n}\n\nangular\n .module('TR')\n .directive('destinationPromoMessage', (): ng.IDirective => {\n\n return {\n controller: DestinationPromoMessage,\n controllerAs: 'dpm',\n bindToController: {\n className: '='\n },\n replace: true,\n template: `

            \n {{dpm.text[0]}} {{dpm.price}}{{dpm.text[1]}}\n

            `\n };\n });\n","/// \n/**\n * Created by bdickson on 22/01/2016.\n */\n\nnamespace core {\n type Broker = Core.Broker;\n\n class NavigationDrawer {\n\n open:boolean;\n\n constructor() {\n }\n\n init(scope:ng.IScope, broker:Broker) {\n\n this.open = false;\n\n // subscribe to toggle request from external source (e.g. a button in the site header)\n broker.subscribe('NavigationDrawer', 'toggleNavigationDrawer', ()=> {\n this.open = !this.open;\n });\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('NavigationDrawer');\n });\n\n }\n }\n\n angular\n .module('core')\n .directive('navigationDrawer', (broker:Broker) => {\n\n let config = {\n controller: NavigationDrawer,\n controllerAs: 'nd',\n bindToController: true,\n transclude: TRPCONFIG.Domain.ResponsiveNavDrawer\n };\n\n let templateUrl = TRPCONFIG.Domain.ResponsiveNavDrawer ? '
            '\n : 'partials/home/directivetemplate?type=NavigationDrawer';\n\n let directive = TRPCONFIG.Domain.ResponsiveNavDrawer\n ? angular.merge(config, {template: templateUrl})\n : angular.merge(config, {templateUrl: templateUrl});\n\n directive.link = function (scope:ng.IScope, el:ng.IAugmentedJQuery, attr, controller:NavigationDrawer) {\n controller.init(scope, broker);\n };\n\n return directive;\n }\n )\n ;\n\n}\n","///\n'use strict';\n/*\n Creates an airport multi select field.\n Selectable options are exposed as `ac.data`.\n*/\nnamespace Autocompleter {\n\n class AirportMultiSelectUnified extends AutocompleterField {\n\n private available: any[] = [];\n private selectAttrFn: (item: any) => void;\n private isCodeSelected: (code: string) => boolean =\n (code: string) => _.find(this.currentValue, v => code === v.Code);\n\n prefilled: string;\n notActive: boolean;\n _placeholder: string;\n\n constructor (\n public $scope: any,\n public $route: ng.route.IRouteService,\n public autocompleter: any,\n public resourceService: Core.ResourceService,\n public $q: ng.IQService,\n public $timeout: ng.ITimeoutService,\n private destinationService: any\n ) {\n super();\n if (_.isEmpty(this.areaOverride)) {\n \tthis.areaOverride = 'flights';\n }\n this.$scope.$watch('ac.currentValue', v => {\n if (v) {\n this._refreshData();\n }\n });\n\n // Wrap `select` attribute fn\n this.selectAttrFn = this.select;\n this.select = (item) => {\n this.selectItem(item);\n this.selectAttrFn({items: this.currentValue});\n };\n\n if(this.prefilled != null && this.prefilled !== '') {\n this.prefill(this.prefilled);\n } else if (this.getArea() === 'flights-departure') {\n this.autocompleter.initialDepartureAirports().then(result => this.update(result));\n }\n }\n\n private prefill(data) {\n let prefill = data.split(/\\s*,\\s*/);\n this.prefix = data;\n this.fetch().then(() => {\n prefill.forEach(code => {\n this.available.forEach(item => {\n if(item.Code === code) {\n this.select(item);\n }\n });\n });\n });\n }\n\n set placeholder(placeholder) {\n if(!this.notActive) {\n this._placeholder = placeholder;\n } else {\n this._placeholder = this.resourceService.get('DEFAULTAIRPORT');\n }\n }\n\n get placeholder() {\n return this._placeholder;\n }\n\n update (result: any): void {\n // Called by super._fetch() with autocompleter.lookup result\n this.available = result.data;\n this._refreshData();\n\n if (_.isEmpty(this.data) && !this.notActive) {\n this.data = null;\n this.$scope.$emit('flash:error', this.resourceService.get('NOMATCHES'));\n }\n }\n\n selectItem (item: any): void {\n if (item && item.Code) {\n // Add codes which are not already selected\n let codes = item.Code.split(',');\n _.forEach(codes, (code: string) => {\n if(!this.isCodeSelected(code)) {\n if(!this.currentValue) {\n this.currentValue = [];\n }\n this.currentValue.push({Code: code, Title: item.Title});\n }\n });\n this.prefix = '';\n this._refreshData();\n }\n }\n\n removeItem (item: any): void {\n if (!item) { return; }\n this.currentValue.splice(this.currentValue.indexOf(item), 1);\n\n if (!this.currentValue.length) {\n this.deselect();\n }\n else {\n this.selectAttrFn({items: this.currentValue});\n }\n this._refreshData();\n }\n\n blur () {\n this.$timeout(() => {\n if (this.prefix) {\n var firstItem = _.find(this.data || [], d => !d.header);\n if (firstItem) {\n this.select(firstItem);\n }\n }\n }, 200);\n }\n\n firstTitle() {\n if (!this.$scope.extraFocusTrackerFocused) {\n if (this.currentValue && this.currentValue[0]) {\n return this.getTitle(this.currentValue[0]);\n }\n }\n }\n titleCache = {};\n getTitle(airport) {\n if (airport.Code in this.titleCache) {\n return this.titleCache[airport.Code];\n }\n if (airport.Title) {\n return this.titleCache[airport.Code] = this.formatTitle(airport.Title);\n }\n this.destinationService\n .getAirport(airport.Code)\n .then(airport => this.titleCache[airport.Code] = this.formatTitle(airport.Title));\n return this.titleCache[airport.Code] = ' ';\n }\n\n formatTitle(title) {\n return (title || '').split('(')[0].split(',')[0];\n }\n\n private _refreshData (): void {\n this.data = this.addHeader(this._getAvailable(), 'AIRPORTS');\n }\n\n private _getAvailable () : any[] {\n // Filters out items where all codes are already selected\n return _.reject(\n this.available,\n item => _.every(\n item.Code.split(','),\n this.isCodeSelected\n )\n );\n }\n }\n\n angular\n .module('TR')\n .directive('airportMultiSelectUnified', (): ng.IDirective => {\n return {\n restrict: 'E',\n replace: false,\n scope: {},\n controllerAs: 'ac',\n bindToController: {\n placeholder: '@',\n select: '&',\n deselect: '&',\n currentValue: '=',\n focusTracker: '=',\n minPrefix: '@',\n notActive: '=',\n prefilled: '@',\n disabled: '@',\n areaOverride: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=AirportMultiSelectUnified',\n controller: AirportMultiSelectUnified,\n transclude: true,\n link: (\n scope: any,\n el: JQuery\n ) => {\n scope.ac.inputField = el.find('input');\n }\n };\n });\n}\n","'use strict';\nnamespace Core {\n\n import BookingType = Core.ManageBooking.BookingType;\n import CrossSellType = Core.Booking.CrossSellType;\n import CustomerDashboardService = Core.Customer.CustomerDashboardService;\n import FlightBooking = Core.ManageBooking.FlightBooking;\n\n type CrossSellOption = Core.Customer.CrossSellOption;\n\n interface RouteParams extends ng.route.IRouteParamsService\n {\n ref :string;\n source :string;\n tripId :string;\n version :number;\n }\n\n interface ProductBreakdown\n {\n cardFee :{ total :number; currencyCode :string; };\n items :ProductBreakdownItem[];\n packageTotal :number;\n }\n\n interface ProductBreakdownItem\n {\n name :string;\n breakdown :{ title :string; quantity :number; total :number; supplierRef :string; typeId :number; }[];\n isPackageProduct :boolean;\n }\n\n class BookingConfirmationCtrl {\n\n public adults :number;\n public authModalOptions :Object;\n public carTrawlerUrl :string;\n public children :number;\n public crossSells :CrossSellOption[] = [];\n public defaultColSizePromo :string = 'col-m-9 col-l-9';\n public defaultColSizeCrossSell :string = 'col-m-3 col-l-3';\n public destinationImageUrl :string;\n public destinationTitle :string;\n public infants :number;\n public isAgentMode :boolean;\n public isSignedIn :boolean;\n public loadingCrossSells :boolean = true;\n public manageBookingUrl :string;\n public showBreakdown :boolean = false;\n public showCarTrawlerWidget :boolean = false;\n public showEmailInformation :boolean = false;\n public usersFirstName :string;\n\n public attraction :Core.ManageBooking.AttractionsBooking;\n public carhire :Core.ManageBooking.CarHireBooking;\n public flight :Core.ManageBooking.FlightBooking;\n public hotel :Core.ManageBooking.Hotel;\n public insurance :Core.ManageBooking.TravelInsuranceBooking;\n public parking :Core.ManageBooking.AirportParkingBooking;\n public transfer :Core.ManageBooking.TransferBooking;\n public paymentDetails :Core.ManageBooking.PaymentDetails;\n public breakdown :ProductBreakdown;\n\n private readonly bookingTypeProductLabelMap : {[id: number]: () => string} = {};\n\n constructor(\n private $location :ng.ILocationService,\n private $routeParams :RouteParams,\n private $scope :ng.IScope,\n private $window :ng.IWindowService,\n private analytics : any,\n private authService :any,\n private bookingsManagerService :ManageBooking.BookingsManagerService,\n private customerDashboardService :Core.Customer.CustomerDashboardService,\n private dateUtil :any,\n private resourceService :ResourceService,\n private costBreakdownCodes :Core.CostBreakdownCodes\n ) {\n this.$scope.$emit('block', {\n title: 'Booking Completed',\n loadingScreenStyle: 'booking'\n });\n\n if (TRPCONFIG.Domain.HideBookingRefOnConfirmation) {\n this.$location.replace();\n this.$location.url('booking/complete');\n }\n\n this.trackEvent('ConfPageLanding', null);\n\n this.analytics.track('Facebook', 'BookingComplete');\n\n this.isAgentMode = TRPCONFIG.Domain.isAgentMode;\n\n //set up our labels that might be needed\n const addProperty = (obj :{[id: number]: () => string}, id :BookingType, resourceKey :string) => {\n obj[id] = this.resourceService.getDeferred(resourceKey);\n };\n\n addProperty(this.bookingTypeProductLabelMap, BookingType.Accommodation, 'CONFIRMATION_HOTEL');\n addProperty(this.bookingTypeProductLabelMap, BookingType.AdHoc, 'CONFIRMATION_ADHOC');\n addProperty(this.bookingTypeProductLabelMap, BookingType.AttractionTickets, 'CONFIRMATION_ATTRACTIONS');\n addProperty(this.bookingTypeProductLabelMap, BookingType.CarHire, 'CONFIRMATION_CARHIRE');\n addProperty(this.bookingTypeProductLabelMap, BookingType.Flight, 'CONFIRMATION_FLIGHT');\n addProperty(this.bookingTypeProductLabelMap, BookingType.Parking, 'CONFIRMATION_PARKING');\n addProperty(this.bookingTypeProductLabelMap, BookingType.Transfer, 'CONFIRMATION_TRANSFER');\n addProperty(this.bookingTypeProductLabelMap, BookingType.TravelInsurance, 'CONFIRMATION_INSURANCE');\n\n\n //a bit of a nasty hack to deal with encoding and users signing in on the booking complete page. The\n //ref param gets encoded twice if they sign in on the complete page so we need to handle this.\n //This fix is not ideal, but until I can check that we can change the URL structure st that the booking refs\n //are QS parameters this will do the trick\n const bookingRefs = decodeURIComponent(this.$routeParams.ref).split('|'); // ACM/123456|EUF/123456|...\n\n let bookingId = Number(bookingRefs[0].split('/')[1]);\n\n bookingsManagerService.getTrip(bookingId).then(trip => {\n if (trip.Destination) {\n this.destinationImageUrl = trip.Destination.ImageUrl;\n this.destinationTitle = trip.Destination.Title;\n }\n\n this.adults = trip.Adults;\n this.children = trip.Children;\n this.infants = trip.Infants;\n\n this.attraction = trip.AttractionsBooking;\n this.carhire = trip.CarHireBooking;\n this.hotel = trip.HotelBooking;\n this.flight = trip.FlightBooking;\n this.insurance = trip.InsuranceBooking;\n this.parking = trip.AirportParkingBooking;\n this.transfer = trip.TransferBooking;\n this.paymentDetails = trip.PaymentDetails;\n\n //for the purposes of cross sell always make sure the booking Id is that of the flight (if available)\n bookingId = this.flight && this.flight.BookingId || bookingId;\n\n this.customerDashboardService.getAllCrossSellOptions(bookingId)\n .then(crossSells => {\n //we want to remove any car hire crosssells as we are doing this via the widget\n _.remove(crossSells, (c :CrossSellOption) => c.CrossSellType === CrossSellType.CarHire);\n const orderedCrossSells = this.orderCrosssells(trip, crossSells);\n this.crossSells = _.take(orderedCrossSells, 1);\n }).finally( () => {\n //based on the length of the cross sell options we might want the app promo / carTrawler widget\n //to take the full width\n let colSize = 12;\n let colSizeCrossSell = 0;\n\n if (this.crossSells.length > 0) {\n colSize = 12 - (this.crossSells.length * 3);\n colSizeCrossSell = (12 - colSize) / this.crossSells.length;\n }\n this.defaultColSizeCrossSell = `col-m-${colSizeCrossSell} col-l-${colSizeCrossSell}`;\n this.defaultColSizePromo = `col-m-${colSize} col-l-${colSize}`;\n this.loadingCrossSells = false;\n });\n\n //restructure our price breakdown lines so there is less typing for us to do in the template as these\n //are all grouped together\n this.breakdown = this.groupProductBreakdowns(trip);\n\n //flag which item we want to show, the app promo or the cartrawler widget\n this.showCarTrawlerWidget = trip.FlightBooking && !trip.TransferBooking && !trip.CarHireBooking;\n if (this.showCarTrawlerWidget) {\n this.carTrawlerUrl = this.buildCarTrawlerUrl(trip.FlightBooking,\n trip.Adults + trip.Children + trip.Infants);\n }\n\n this.trackEvent('ConfPageCarWidget', { ShowWidget: this.showCarTrawlerWidget, Url: this.carTrawlerUrl});\n\n }).finally( () => {\n this.$scope.$emit('unblock');\n });\n\n const user = authService.getUser();\n this.isSignedIn = user.HardSignedIn;\n this.usersFirstName = user.FirstName;\n this.authModalOptions = { email: user.Email };\n this.manageBookingUrl = `dashboard/bookings/reference/${bookingId}`;\n }\n\n public showModal(show :boolean, event :JQueryEventObject) :void {\n if (event) {\n event.preventDefault();\n }\n if (show === true) {\n this.trackEvent('ConfPagePriceClick', null);\n }\n this.showBreakdown = show;\n }\n\n public showEmailInformationModal(show :boolean, event :JQueryEventObject) :void {\n if (event) {\n event.preventDefault();\n }\n if (show === true) {\n this.trackEvent('ConfPageInfoClick', null);\n }\n this.showEmailInformation = show;\n }\n\n public printPage() :void {\n this.trackEvent('ConfPagePrintClick', null);\n this.$window.print();\n }\n\n public trackEvent(eventName, data) :void {\n this.analytics.track('mixpanel', eventName, data);\n }\n\n public trackCrossSellClick(model) :void {\n let data = {\n Type : CrossSellType[model.CrossSellType]\n };\n this.analytics.track('mixpanel', 'ConfPageCrossSellClick', data);\n }\n\n public getProductLabelForBookingType(bookingType :BookingType) :() => string {\n //we only need to handle a couple of cases for now, but have left\n //this general enough to apply to others\n return this.bookingTypeProductLabelMap[bookingType];\n }\n\n private buildCarTrawlerUrl(flight :FlightBooking, passengerCount :number) :string {\n\n //build up the cartrawler url NOVERSION param is so that we don't add cache busting to it\n const outLeg = _.last(_.filter(flight.Legs, {'IsOutbound':true}));\n const inLeg = _.first(_.filter(flight.Legs, {'IsOutbound':false}));\n\n const amendDate = (date :string, hourOffset :number) => {\n return this.dateUtil.format(\n this.dateUtil.roundedToStartOfHour(this.dateUtil.addHours(date, hourOffset), true),\n 'yyyyMMddHHmm'\n );\n };\n\n const pickUp = amendDate(outLeg.ArrivalTime, TRPCONFIG.CarHireFlightDepartureOffset);\n const dropOff = amendDate(inLeg.DepartureTime, TRPCONFIG.CarHireFlightReturnOffset);\n\n //not pretty, but multiline string adds carriage returns in the output (which we do not want)\n const base = `https://cars.cartrawler.com/travelrepublic/widget?type=html&clientId=740760&NOVERSION=-1&` +\n `num=3&locCode={0}&curr={1}&residencyId={2}&pkDateTime={3}&rtDateTime={4}&passengers={5}&` +\n `airline={6}&airlineNum={7}`;\n\n return String.format(\n base,\n outLeg.ArrivalAirport.Code,\n TRPCONFIG.Domain.CurrencyCode,\n TRPCONFIG.Domain.CountryCode,\n pickUp,\n dropOff,\n passengerCount,\n outLeg.Carrier,\n outLeg.FlightNo.slice(-4) //last 4 should be the flight number\n );\n }\n\n private orderCrosssells(trip :ManageBooking.BookedTrip, crossSells :CrossSellOption[]) :CrossSellOption[] {\n let orderedList = new Array();\n\n const orderPreference = {\n Holiday: [ CrossSellType.Transfers,\n CrossSellType.CarHire,\n CrossSellType.Baggage,\n CrossSellType.Seats,\n CrossSellType.Attractions\n ],\n Hotel: [\n CrossSellType.Transfers,\n CrossSellType.CarHire,\n CrossSellType.Attractions,\n CrossSellType.Parking\n ],\n Flight: [\n CrossSellType.Hotels,\n CrossSellType.Baggage,\n CrossSellType.Seats,\n CrossSellType.CarHire,\n CrossSellType.Parking,\n CrossSellType.Attractions ]\n };\n\n let preference :CrossSellType[]|null = null;\n if (trip.HotelBooking) {\n preference = trip.FlightBooking ? orderPreference.Holiday : orderPreference.Hotel;\n } else if(trip.FlightBooking) {\n preference = orderPreference.Flight;\n } else {\n return orderedList;\n }\n\n //make an object from our preference array to make sorting a little easier\n const sortMap = preference.reduce(function(acc, val, idx) {\n acc[val] = idx;\n return acc;\n }, {});\n\n orderedList = _.sortBy(crossSells, c => sortMap[c.CrossSellType]);\n\n return orderedList;\n }\n\n private groupProductBreakdowns(trip :ManageBooking.BookedTrip) :ProductBreakdown {\n let breakdown = {\n cardFee: {\n total: 0, currencyCode: ''\n },\n items: [],\n packageTotal: 0,\n discount: 0\n };\n\n const createBreakdownItem =\n (title: string, quantity :number, total :number, currencyCode :string, isPriceHidden: boolean,\n supplierRef: string, typeId: number) => {\n return { currencyCode, quantity, title, total, isPriceHidden, supplierRef, typeId };\n };\n\n _.each(\n [trip.FlightBooking, trip.HotelBooking, trip.AirportParkingBooking, trip.AttractionsBooking,\n trip.CarHireBooking, trip.InsuranceBooking, trip.TransferBooking],\n (p :ManageBooking.ProductBooking) => {\n if (p) {\n _.each(\n _.filter(p.PriceBreakdown, {'IsPaymentFee' : true}),\n b => {\n breakdown.cardFee.total += b.UnitAmount;\n breakdown.cardFee.currencyCode = b.CurrencyCode;\n }\n );\n\n const item = {\n name: this.getProductLabelForBookingType(p.BookingType)(),\n breakdown: _.map(\n _.filter(p.PriceBreakdown, {'IsPaymentFee' : false}),\n b => createBreakdownItem(b.Description,\n b.Quantity,\n b.UnitAmount * b.Quantity,\n b.CurrencyCode,\n b.IsPriceHidden,\n b.SupplierRef || '',\n b.TypeId)\n ),\n isPackageProduct: !!p.PackageId,\n discount: 0\n };\n\n // Sum discounts\n item.breakdown.forEach((value) =>{\n if(value.typeId === 20){ // Where id 20 is discounts\n item.discount += (value.total * value.quantity);\n }\n });\n\n // Sum invisible price with hotel\n item.breakdown = item.breakdown.map(breakdown => {\n if(breakdown.typeId === 1){ // Where id 1 is id of the hotel\n item.breakdown.forEach( invisible => {\n // Where id 0 is id of the invisible price\n if(invisible.typeId === 0 && invisible.isPriceHidden){\n breakdown.total += invisible.total;\n }\n });\n }\n\n return breakdown;\n });\n\n if(item.isPackageProduct) {\n breakdown.packageTotal =\n _.reduce(item.breakdown, (r, b) =>\n r + (b.typeId === 0 && b.isPriceHidden ? 0 : b.total),\n breakdown.packageTotal);\n }\n breakdown.items.push(item);\n\n breakdown.discount += item.discount;\n }\n }\n );\n\n return breakdown;\n }\n }\n\n angular\n .module('core')\n .controller('BookingConfirmation', BookingConfirmationCtrl);\n}\n","'use strict';\nnamespace TR {\n\n import BoardType = Core.Hotels.BoardType;\n\n interface LastMinuteDealsConfig {\n findOptionsPageSize: number;\n findOptionsFlexibility: number;\n smallBatchTake: number;\n halfBatchTake: number;\n halfBatchChunkSize: number;\n }\n\n interface LastMinuteDealsDestination {\n TypeId: string;\n Type: number;\n Id: number;\n Title: string;\n deals?: any;\n }\n\n interface FlightsDeal {\n AdultFare: number;\n AdultTax: number;\n CurrencyCode: string;\n DestinationAirport: string;\n DestinationAirportTitle: string;\n FlightId: string;\n InboundArrivalDate: string;\n InboundDepartureDate: string;\n InboundDuration: number;\n InboundStops: number;\n OriginAirport: string;\n OriginAirportTitle: string;\n OutboundArrivalDate: string;\n OutboundDepartureDate: string;\n OutboundDuration: number;\n OutboundStops: number;\n Price: number;\n ReturnArrivalAirport: string;\n ReturnArrivalAirportTitle: string;\n SearchId: string;\n SearchIds: string[];\n }\n\n interface BoardTypeMinPrices {\n BoardType: BoardType;\n MinPrice: number;\n WasPrice: number;\n }\n\n interface HotelDeal {\n AvailabilitySearchId: string;\n BoardType: BoardType;\n BoardTypeMinPrices: BoardTypeMinPrices[];\n CheckInDate: string;\n CheckOutDate: string;\n EstabId: number;\n NonRefundable: boolean;\n PayAtHotelAvailable: boolean;\n Price: number;\n RefundableCutOffDate: string;\n WasPrice: number;\n }\n\n interface HolidayDeals {\n FlightsDeal: FlightsDeal;\n HotelDeal: HotelDeal;\n }\n\n interface LinkedAirports {\n Code: string;\n DistanceKm: number;\n Latitude: number;\n Longitude: number;\n ShortTitle: string;\n Title: string;\n }\n\n interface TransferTimes {\n Airport: string;\n Minutes: number;\n }\n\n interface Weather {\n Month: number;\n Temperature: number;\n }\n\n interface Deal {\n AcomType: string;\n AcomTypeId: number;\n Address: string;\n Airports: string[];\n BoardType: string;\n CallToBookBehaviour: number;\n Country: string;\n CountryId: number;\n CroppedImage: string;\n CurrentViews: number;\n CustomerRating: number;\n CustomerRatingCount: number;\n CustomerRatingTitle: string;\n DealMinPrice: number;\n DealWasPrice: number;\n Description: string;\n DiscountPercentage: number;\n DisplayIndex: number;\n Duration: number;\n HolidayDeals: HolidayDeals[];\n Id: number;\n ImageUrl: string;\n IndicativeMinPrice: number;\n IsVilla: boolean;\n Latitude: number;\n LinkedAirports: LinkedAirports[];\n Location: string;\n LocationId: number;\n Longitude: number;\n MinCost: number;\n MinPricePerson: number;\n NonRefundable: boolean;\n NumberOfPhotos: number;\n OriginalCost: number;\n PayAtHotelAvailable: boolean;\n Postcode: string;\n PropertyTypeFrom: string;\n Province: string;\n ProvinceId: number;\n Recommended: boolean;\n RoomNightsBooked: number;\n ShortTitle: string;\n StarRating: number;\n StarRatingTitle: string;\n StarRatingV2: number;\n Summary: string;\n Title: string;\n TransferTimes: TransferTimes[];\n Url: string;\n WasPricePerPerson: number;\n Weather: Weather[];\n }\n\n interface DealChunks {\n SmallBatch: Deal[][];\n FirstHalfBatch: Deal[][];\n SecondHalfBatch: Deal[][];\n }\n\n let startDateInitialised = TRPCONFIG.Domain.DeviceType !== 'Mobile';\n\n class SeasonalDeals {\n\n summary: any;\n blocks: any;\n destinations: any;\n unblockOnce: ()=>void;\n showMore: boolean;\n isLoading: boolean = true;\n hasDeals: boolean = false;\n hasSpecialDeals: boolean = false;\n counter = 0;\n config: LastMinuteDealsConfig;\n priceMode = 0;\n showDiscount: boolean = TRPCONFIG.Domain.SeasonalDeals && TRPCONFIG.Domain.SeasonalDeals.isPillVisible;\n specialDeals: DealChunks | undefined;\n dealConfigs: any;\n isAprilCampaign: boolean = TRPCONFIG.Domain.AprilCampaignRoutes.indexOf(this.$location.path().substr(1)) > -1;\n aprilCampaignConfig: any;\n\n constructor(\n private $q: ng.IQService,\n private $location: ng.ILocationService,\n private $timeout: ng.ITimeoutService,\n private $scope: any,\n private $rootScope: any,\n private $route: any,\n private $http: any,\n private tripService: any,\n private filtering: any,\n private preferences: any,\n private pageStrand: any,\n private analytics: any,\n private broker: Core.Broker,\n private holidayDeals: any,\n private holidayDealsGrouped: TR.HolidayDealsGrouped,\n private holidayDealsPromoService: any,\n private hotelFromSession: any,\n private geo: any,\n private dateUtil: any,\n private dealsBoxService: any,\n private occupancyService: Core.OccupancyService,\n private searchUnitService: Search.SearchUnitService,\n private scrollService: any,\n private funcUtil: any,\n private resourceService: Core.ResourceService,\n private destinationService: any\n ) {\n this.dealConfigs = _.find(TRPCONFIG.Domain.ActiveSeasonalDeals, d=> d.Url === $location.path());\n TRPCONFIG.Domain.FlightDetailsExpanded = true;\n if (this.isAprilCampaign) {\n this.dealConfigs = _.find(TRPCONFIG.Domain.ActiveSeasonalDeals, d=> d.Url === '/aprilcampaign');\n this.aprilCampaignConfig = TRPCONFIG.Domain.AprilCampaignRoutesConfig[$location.path().substr(1)];\n this.dealConfigs.DealType = this.aprilCampaignConfig.dealType;\n }\n preferences.set('priceMode', 0);\n $scope.navigatorUserAgent = '|' + navigator.userAgent + '|' + /prerender/i.test(navigator.userAgent) + '|';\n this.watchForPageRedirection();\n\n analytics.track('mixpanel', 'SeasonalDealsPageView', {\n Name: this.dealConfigs && this.dealConfigs.Name\n });\n\n if (!startDateInitialised) {\n let startDate = this.dateUtil.getNextSaturday(TRPCONFIG.Domain.HolidayDealsDefaultWeeks);\n searchUnitService.startDate(1, startDate);\n startDateInitialised = true;\n }\n\n this.config = ((): LastMinuteDealsConfig => {\n let configs = {\n Default: {\n findOptionsPageSize: 32,\n smallBatchTake: 12,\n halfBatchTake: 4,\n halfBatchChunkSize: 4,\n slidesToScroll: 4,\n slidesToShow: 4\n },\n Phone: {\n findOptionsPageSize: 16,\n smallBatchTake: 4,\n halfBatchTake: 8,\n halfBatchChunkSize: 1,\n slidesToScroll: 1,\n slidesToShow: 1\n },\n Tablet: {\n findOptionsPageSize: 24,\n smallBatchTake: 6,\n halfBatchChunkSize: 3\n }\n };\n _.merge(configs, TRPCONFIG.Domain.LastMinuteDealsConfig);\n return _.merge(configs.Default, configs[TRPCONFIG.DeviceCategory]);\n })();\n\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGDEALS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-lastMinuteDeals'\n });\n this.unblockOnce = _.once(() => this.$scope.$emit('unblock'));\n\n this.$rootScope.hideFooterToolbar = true;\n\n this.geo.getNearestAirports()\n .then(airposts => this.$http.post(TRPCONFIG.Domain.SeasonalDealApiUrl, {\n //'/api/deals/seasonal'\n //http://pp.hotelsapi2.services.travelrepublic.local/api/deals/topdeals\n DealType: this.dealConfigs.DealType,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n DepartureAirports: _.map(airposts, (a: any) => a.Code),\n DealsPerDestination: 8,\n FieldFlags: 2166987,\n }))\n .then(({data}) => data)\n .then(destinations => {\n this.destinations = _(destinations)\n .map(d => {\n let a = _.take(d.Hotels, 8);\n _.forEach(a, a => this.holidayDeals.enrichHotel(a, { Duration: 7 }));\n let b: {}[] = [];\n if (TRPCONFIG.DeviceCategory !== 'Phone') {\n b = a.splice(4);\n }\n return {\n Title: d.Destination.Title,\n chunks: [a, b],\n };\n })\n .value();\n this.unblockOnce();\n this.hasDeals = !!_.find(this.destinations, d => _.get(d, 'chunks[0].length'));\n this.isLoading = false;\n });\n }\n\n goToDeal(deal: Deal, DealCategory: string): void {\n this.analytics.track('mixpanel', 'SeasonalDealsCardClick', {\n CardDestination: `${deal.Country}, ${deal.Province}`,\n CardRank: deal.DisplayIndex + 1,\n EstabId: deal.Id,\n OverlayShown: this.showDiscount,\n OverlayValue: `${deal.DiscountPercentage}%`,\n DealCategory,\n Name: this.dealConfigs && this.dealConfigs.Name\n });\n\n let occupancy = { Adults: 2, ChildAges: [] };\n let selected = deal.HolidayDeals[0];\n selected.HotelDeal.EstabId = deal.Id;\n\n this.$scope.$emit('block', {\n title: this.resourceService.get('LOADINGHOTELS'),\n subtitle: this.resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-seasonalDeals-select'\n });\n\n this.tripService\n .getTripIdForHolidayDeal(selected, occupancy)\n .then(tripId => {\n this.$location.path(`/holidays/hotels/${tripId}`);\n this.$location.search('bfd', deal.Id);\n });\n }\n\n showMoreClick(ShowMoreDestination: string) {\n this.showMore = true;\n this.analytics.track('mixpanel', 'WasNowShowMore', { ShowMoreDestination });\n }\n\n watchForPageRedirection() {\n //This function protects against a bug which happens when clicking on a link in the menu.\n //e.g. \n //When this happens the page must reload and start fresh.\n let wasPopulated = false;\n this.$scope.$watch(() => Object.keys(this.$location.search()).length > 2, isPopulated => {\n if (wasPopulated && !isPopulated) {\n this.$route.reload();\n }\n wasPopulated = wasPopulated || isPopulated;\n });\n }\n }\n\n angular\n .module('TR')\n .controller('seasonalDeals', SeasonalDeals);\n}\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\n\nTR.directive('destinationTitle', function(\n resourceService,\n pageStrand,\n loggingService,\n destinationService) {\n return {\n restrict: 'E',\n replace: true,\n template: '{{ title }}',\n scope: {\n title: '@?',\n dest: '=',\n allowEstab: '=' // Required on estab page because search pages display parent dest\n },\n link(scope) {\n const strandResources = {\n 1: resourceService.getDeferred('HOTELSIN'),\n 2: resourceService.getDeferred('HOLIDAYSIN')\n };\n const reVarStr = /{/;\n let strand;\n let countryId;\n let bc;\n\n // Destination object receives async updates\n scope.$watch('dest', init, true);\n\n function _destTitleFallback(dest) {\n scope.title = `${(strandResources[strand] || strandResources[1])()} ${dest.Title}`;\n return true;\n }\n\n function init(dest) {\n if (!dest || !dest.BreadcrumbTrail) {\n return;\n }\n strand = pageStrand.fromRoute(dest);\n\n // Values may be removed by `getParentDestination()`\n bc = dest.BreadcrumbTrail;\n countryId = dest.CountryId;\n\n if (!scope.allowEstab) {\n // Display estab parent destination by default\n // i.e. 'choose a different hotel' results\n dest = getParentDestination(dest);\n }\n dest.PageStrand = strand;\n\n destinationService.getText(dest, {\n customErrCallback: {\n 404() {\n _destTitleFallback(dest);\n },\n 400() {\n _destTitleFallback(dest);\n }\n }\n }).then(function(result) {\n // `PageHeading` template should exist ideally\n const titleStr = String.supplant(\n // Non-estab: fall back to PageTitle, Estab: fall back to hotel name\n result.PageHeading || (!scope.allowEstab && result.PageTitle) || '{name}',\n getVarMap(dest)\n );\n if (reVarStr.test(titleStr)) {\n // Error if any vars are not transformed\n const logMsg = `Untransformed template: ${titleStr\n } | ${window.location.href\n } | getText: ${angular.toJson(result)}`;\n loggingService.logError(logMsg);\n } else {\n scope.title = titleStr;\n }\n });\n }\n\n function getParentDestination(dest) {\n //if the destination is an estab, walk back one level up the breadcrumb and the return the parent destination\n const pDest = (dest.EstablishmentId && bc && bc.length > 1) ? bc[bc.length - 2] : dest;\n // Add properties required by `getVarMap()` (returns a new object)\n return angular.extend({\n ShortTitle: pDest.Title,\n SummaryTitle: pDest.Title\n }, pDest);\n }\n\n function getVarMap(dest) {\n // Variable mapping in string templates i.e. {name}\n // Also supports legacy numeric vars i.e. {0}\n const inResource = resourceService.get(\n dest.IsPOI ? 'NearDestination' : 'InDestination'\n );\n\n return {\n 0: dest.Title,\n 1: inResource,\n name: dest.ShortTitle,\n in: inResource,\n location: dest.SummaryTitle,\n country: destinationService.getBreadcrumbTitle(dest, bc => bc.ObjectId === countryId)\n };\n }\n }\n };\n});\n})();\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('dobPicker', function(dateUtil, arrayUtil, $locale, broker) {\r\n const days = arrayUtil.numberArray(1, 31);\r\n const months = arrayUtil.map($locale.DATETIME_FORMATS.SHORTMONTH, function(m, i) {\r\n return { index: i, label: m };\r\n });\r\n\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: (element, attr) => {\r\n let base = 'partials';\r\n if (attr.templateVersion) {\r\n return `${base}/booking/template?name=DobPicker&version=${attr.templateVersion}`;\r\n }\r\n return `${base}/home/directivetemplate?type=DobPicker`;\r\n },\r\n link(scope, el, attr, c) {\r\n if (!c) { return; }\r\n scope.dobField = attr.field;\r\n\r\n let thisYear = new Date().getFullYear();\r\n const minAge = parseInt(scope.$eval(attr.minAge));\r\n const age = parseInt(scope.$eval(attr.age));\r\n const maxAge = attr.maxAge ? parseInt(scope.$eval(attr.maxAge)) : 100;\r\n\r\n if (attr.ageCheck != null) {\r\n let d = scope.$eval(attr.ageCheck);\r\n d = d.split('-');\r\n d = parseInt(d[0]);\r\n thisYear = d;\r\n }\r\n\r\n scope.days = days;\r\n scope.months = months;\r\n scope.years = arrayUtil.numberArray(thisYear - (age >= 0 ? age : minAge), age >= 0 ? thisYear - age - 1 : thisYear - maxAge);\r\n\r\n c.$formatters.unshift(function(val) {\r\n if (val == null) { return val; }\r\n const d = dateUtil.parseDate(val);\r\n if (dateUtil.isValid(d)) {\r\n scope.dob = scope.dob || {};\r\n scope.dob = {\r\n year: d.getFullYear(),\r\n month: d.getMonth(),\r\n day: d.getDate()\r\n };\r\n }\r\n return val;\r\n });\r\n\r\n function parse(val) {\r\n if (val == null || val.day == null || val.month == null || val.year == null) { return null; }\r\n const d = dateUtil.zeroTime(`${val.year}-${padZero(val.month + 1)}-${padZero(val.day)}`, false);\r\n return (dateUtil.isValid(d)) ? dateUtil.serialiseDate(d) : null;\r\n }\r\n\r\n function padZero(n) {\r\n return (n < 10) ? (`0${n}`) : n;\r\n }\r\n\r\n scope.$watch('dob', function(val) {\r\n if (val == null) { return; }\r\n c.$setViewValue(parse(val));\r\n broker.publish('dobUpdated', val);\r\n }, true);\r\n }\r\n };\r\n});\r\n})();\r\n","'use strict';\n\nnamespace Core {\n\n class DropdownCheckboxList {\n\n // Attrs\n model: any[];\n options: any[];\n caption: string;\n valueProperty: string;\n labelProperty: string;\n singularLabel: string;\n pluralLabel: string;\n\n private element: ng.IAugmentedJQuery;\n private isOpen: boolean = false;\n private eventNamespace = 'dropdowncheckboxlist';\n private ids: any;\n private selection: string;\n\n constructor (\n private $scope: ng.IScope,\n private $document: ng.IAugmentedJQuery,\n private resourceService: any\n ) {\n }\n\n init (el, attrs): void {\n this.element = el;\n\n const id = this.element.attr('id');\n this.ids = {\n button: id + '-button',\n menu: id + '-menu'\n };\n\n this.$scope.$watchCollection('dcl.model', val => {\n if (val) {\n this.setButtonText();\n }\n });\n\n this.$scope.$watchCollection('dcl.options', val => {\n if (val) {\n this.setButtonText();\n }\n });\n }\n\n public toggle(event): void {\n this.isOpen ? this.close() : this.open(event);\n }\n\n public keydown(event): void {\n switch (event.keyCode) {\n // Escape\n case 27:\n this.close();\n break;\n // Enter\n case 13:\n this.toggle(event);\n break;\n default:\n }\n }\n\n\n private setButtonText(): void {\n let label: string;\n\n if (!this.model || !this.options) {\n return;\n }\n\n if (this.model.length === this.options.length || this.model.length === 0) {\n label = this.resourceService.getDeferred('ANY')();\n } else if (this.model.length === 1) {\n let match = _.find(this.options, (o) => {\n return o[this.valueProperty] === this.model[0];\n });\n label = String(match[this.labelProperty]);\n } else {\n label = `${this.model.length} ${this.pluralLabel}`;\n }\n this.selection = label;\n\n }\n\n private close(): void {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n this.$document.off('.' + this.eventNamespace);\n }\n\n private open(event): void {\n this.isOpen = true;\n\n // close if background is clicked\n this.$document.on('mousedown.' + this.eventNamespace, (event) => {\n if (!this.isOpen) {\n return;\n }\n // close if click target isn't the menu or the button\n if (!$(event.target).closest(`#${this.ids.menu}, #${this.ids.button}`).length) {\n this.$scope.$apply(() => {\n this.close();\n });\n }\n });\n }\n\n }\n\n angular\n .module('core')\n .directive('dropdownCheckboxList', (): ng.IDirective => {\n return {\n restrict: 'E',\n scope: {},\n replace: true,\n controller: DropdownCheckboxList,\n controllerAs: 'dcl',\n bindToController: {\n model: '=',\n options: '=',\n caption: '@',\n valueProperty: '@',\n labelProperty: '@',\n singularLabel: '@',\n pluralLabel: '@'\n\n },\n templateUrl: 'partials/home/directivetemplate?type=dropdowncheckboxlist',\n link: (\n scope: ng.IScope,\n el: ng.IAugmentedJQuery,\n attrs: ng.IAttributes,\n controller : DropdownCheckboxList\n ) => {\n controller.init(el, attrs);\n }\n };\n });\n\n}\n","'use strict';\n/*\n Check whether the tenants email address is valid in the booking form\n */\nnamespace TR {\n type BookingService = Core.Booking.BookingService;\n class EmailAllowed {\n\n constructor(private $q,\n private bookingService : BookingService) {}\n\n init(scope: any, el: any, attr: any, ctrl: any) {\n ctrl.$asyncValidators.emailAllowed = (modelValue) => {\n if (ctrl.$isEmpty(modelValue)) {\n return this.$q.resolve();\n }\n //do fetch from some service here\n return this.bookingService.checkValidEmail(modelValue);\n };\n }\n }\n\n angular\n .module('TR')\n .directive('emailAllowed', (): ng.IDirective => {\n return {\n restrict: 'A',\n controller: EmailAllowed,\n controllerAs: 'ea',\n require: 'ngModel',\n link: (scope: any, el: any, attr: any, ctrl: any) => {\n return scope.ea.init(scope, el, attr, ctrl);\n }\n };\n });\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .directive('eventTracker', eventTracker);\n\nfunction eventTracker(analytics, $parse) {\n return {\n restrict: 'A',\n link: _linker\n };\n\n function _linker(scope, elem, attr) {\n let label = null;\n const category = attr.eventCategory;\n const type = attr.eventType;\n\n function _fireEvent() {\n const eventData = {\n label,\n category,\n value: 1\n };\n if (attr.eventAction) {\n eventData.action = attr.eventAction;\n }\n analytics.trackEvent(eventData);\n }\n\n function _destroyHandlers(events) {\n scope.$on('destroy', function() {\n elem.off(events);\n });\n }\n\n if (type !== 'textbox') {\n elem.on('click', function(e) {\n // only register left clicks\n if (e && e.button !== 0) {\n return;\n }\n const attrLabel = $parse(attr.eventLabel)(scope);\n const attrTag = attr.eventTag ? `${attr.eventTag}: ` : '';\n label = attrLabel ? (`${attrTag}${attrLabel}`) : attr.eventTag;\n _fireEvent();\n });\n\n _destroyHandlers('click');\n } else {\n elem.on('keypress keydown', _.debounce(function() {\n label = $parse(attr.eventLabel)(scope);\n _fireEvent();\n }, 1500));\n\n _destroyHandlers('keypress keydown');\n }\n }\n}\n})();\n","namespace Core {\n\n class FareRulesLink {\n text:string;\n details:string;\n\n constructor(private modalService:any) {\n }\n\n showFareRules () {\n const fareRulesText = this.details || '';\n if(fareRulesText){\n this.modalService.launch('partials/popups/farerules', { fareRulesText });\n }\n };\n }\n angular\n .module('TR')\n .directive('fareRulesLink', function(modalService) {\n return {\n restrict: 'E',\n bindToController: {\n text: '@',\n details: '='\n },\n controllerAs: 'fr',\n controller: FareRulesLink,\n template: ''\n };\n });\n}\n","namespace TR {\n class FareRulesText {\n text:string;\n constructor(private modalService:any){\n this.text = this.modalService.get('fareRulesText');\n }\n }\n angular\n .module('TR')\n .directive('fareRulesText', function(modalService) {\n return {\n restrict: 'E',\n controllerAs: 'frt',\n controller: FareRulesText,\n template: '
            '\n };\n });\n\n}\n","(function() {\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('filterCriterion', function() {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n close: '&',\r\n show: '='\r\n },\r\n templateUrl: 'partials/home/directivetemplate?type=FilterCriterion'\r\n };\r\n});\n})();\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('flashMessage', function($timeout, $filter, resourceService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: (element, attr) => {\r\n if (attr.templateVersion) {\r\n return `partials/booking/template?name=FlashMessage&version=${attr.templateVersion}`;\r\n }\r\n const templateName = attr.templateName || 'FlashMessage';\r\n return `partials/home/directivetemplate?type=${templateName}`;\r\n },\r\n link(scope) {\r\n let err = null;\r\n let success = null;\r\n let info = null;\r\n\r\n const tryStopPropagation = function(ev) {\r\n if (typeof ev.stopPropagation === 'function') {\r\n ev.stopPropagation();\r\n }\r\n };\r\n\r\n scope.visible = false;\r\n\r\n scope.getClass = function() {\r\n return (err ? 'error-message' : (success ? 'success-message' : (info ? 'info-message' : 'closed')));\r\n };\r\n\r\n scope.$on('flash:error', function(ev, msg) {\r\n err = success = info = null;\r\n if (msg == null) {\r\n return;\r\n }\r\n scope.visible = true;\r\n if (!(msg instanceof Array)) {\r\n msg = [msg];\r\n }\r\n err = msg;\r\n scope.message = msg.map(function(m) {\r\n if (_.isObject(m)) {\r\n //Escape the unexpected backend error:\r\n let backendError = $('
            ').text($filter('json')(m)).html();\r\n let errorMessage = resourceService.get('UNEXPECTEDSEARCHERROR');\r\n m = `${errorMessage} ${backendError}`;\r\n }\r\n return `
          • ${m}
          • `;\r\n }).join('');\r\n tryStopPropagation(ev);\r\n });\r\n\r\n scope.$on('flash:success', function(ev, msg) {\r\n scope.message = success = msg;\r\n scope.visible = true;\r\n err = info = null;\r\n $timeout(function() {\r\n scope.message = success = null;\r\n }, 3000);\r\n tryStopPropagation(ev);\r\n });\r\n\r\n scope.$on('flash:info', function(ev, msg) {\r\n scope.message = info = msg;\r\n scope.visible = true;\r\n err = success = null;\r\n tryStopPropagation(ev);\r\n });\r\n\r\n scope.$on('flash:hide', function() {\r\n scope.visible = false;\r\n });\r\n }\r\n };\r\n});\r\n})();\r\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('footerCarousel', function($timeout, $q) {\n return {\n restrict: 'A',\n transclude: true,\n link(scope, element, attributes, controller, $transclude) {\n const $element = $(element);\n let carousel = false;\n\n function processItem(item) {\n const deferred = $q.defer();\n\n $transclude(function(clone, scope) {\n scope.item = item;\n deferred.resolve($element.append(clone));\n });\n\n return deferred.promise;\n }\n\n scope.$watchCollection(attributes.footerCarousel, function(elem) {\n //ensure this only runs when the section is open\n if (!elem.open) {\n return;\n }\n\n if (carousel) {\n $element.slick('unslick');\n carousel = false;\n }\n $element.empty();\n\n const filteredThings = elem.things.filter(hotel => !hotel.deleted);\n\n if (!filteredThings.length) {\n return;\n }\n\n $q.all(filteredThings.map(processItem)).then(function() {\n $timeout(function() {\n $element.slick({\n rtl: TRPCONFIG.Rtl,\n prevArrow: $element.siblings('.slick-prev'),\n nextArrow: $element.siblings('.slick-next'),\n infinite: false,\n slidesToShow: 5,\n slidesToScroll: 1,\n swipeToSlide: true,\n variableWidth: true,\n responsive: [{\n breakpoint: 1760,\n settings: {\n slidesToShow: 4\n }\n }, {\n breakpoint: 1425,\n settings: {\n slidesToShow: 3\n }\n }, {\n breakpoint: 1000,\n settings: {\n slidesToShow: 2\n }\n }]\n });\n carousel = true;\n\n //turn off all new flags to reveal added element\n filteredThings.forEach(thing => thing.new = false);\n scope.$apply();\n }, 200);\n });\n });\n }\n };\n});\n})();\n","(function() {\n'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('footerToolbar', function(\n urlUtils,\n $rootScope,\n preferences,\n imageService,\n $timeout,\n arrayUtil,\n hotelRehydrator,\n broker,\n $q,\n recentHotels,\n shortlistService,\n resourceService,\n savedSearchService,\n basketService,\n analytics,\n attractionService,\n basketStore\n ) {\n return {\n restrict: 'E',\n templateUrl: 'partials/home/directivetemplate?type=FooterToolbar',\n link(scope) {\n scope.open = false;\n scope.$on('auth:signout', fetch);\n scope.$on('auth:signin', fetch);\n scope.stripLeadingSlash = urlUtils.stripLeadingSlash;\n\n let initialised = false;\n let busy = false;\n const icons = {\n 1: 'icon-flight',\n 3: 'icon-holidays',\n 2: 'icon-hotel',\n 4: 'icon-transfer',\n 6: 'icon-parking'\n };\n const sectionIndex = {\n recentHotels: 0,\n shortlist: 1,\n savedSearches: 2\n };\n\n $rootScope.$on('$routeChangeSuccess', function(event, current) {\n scope.hide = current.hideDistractionLinks;\n if (initialised) {\n closeAllSections();\n } else if (!scope.hide) {\n init();\n }\n });\n\n if (!scope.rc.hideDistractionLinks) {\n init();\n }\n\n function addHotelToSection(section, hotel) {\n if (section == null || section.things == null) {\n return;\n }\n\n //make sure this hotel is not already in the list\n if (arrayUtil.any(section.things, function(t) {\n return t.Id === hotel.Id && !t.deleted;\n }) || arrayUtil.any(section.estabIds, function(estabId) {\n return estabId === hotel.Id;\n })) {\n return;\n }\n\n if (hotel.Name == null) {\n hotel.Name = hotel.Title;\n }\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, 80, 80);\n\n hotel.hide = true;\n hotel.deleted = false;\n hotel.new = true;\n section.things.unshift(hotel);\n $timeout(function() {\n hotel.hide = false;\n section.count += 1;\n }, 0);\n }\n\n function removeHotelFromSection(section, hotel) {\n for (let i = 0, l = section.things.length; i < l; i++) {\n if (section.things[i].Id === hotel.Id) {\n section.count -= 1;\n section.things[i].hide = true;\n section.things[i].deleted = true;\n break;\n }\n }\n }\n\n function setToolbarOpen(isOpen) {\n scope.open = isOpen;\n preferences.set('footerToolbar', scope.open);\n }\n\n function deleteSearch(s, ev) {\n ev.preventDefault();\n ev.stopPropagation();\n savedSearchService.removeSavedSearch(s.SavedSearchId);\n scope.sections[2].count -= 1;\n removeSearch(s);\n }\n\n function removeSearch(search) {\n search.hide = true;\n search.deleted = true;\n }\n\n function addSearch(section, s) {\n //force close of search on add as element has no layout\n if (scope.sections[2].open) {\n scope.sections[2].open = false;\n }\n\n //make sure this search is not already in the list\n let isSearchInTheList = arrayUtil.any(section.things, t => t.SavedSearchId === s.SavedSearchId && !t.deleted);\n if (isSearchInTheList) {\n return;\n }\n\n s.hide = true;\n s.deleted = false;\n s.new = true;\n extendSearch(s);\n\n section.things.unshift(s);\n $timeout(function() {\n s.hide = false;\n section.count += 1;\n }, 0);\n }\n\n function restoreSearch(s, ev) {\n ev.preventDefault();\n if (!busy) {\n busy = true;\n savedSearchService.restoreSearch(s).then(function() {\n basketService.startWorkflow(basketService.workflowType[s.SearchType]).then(function() {\n busy = false;\n removeSearch(s);\n });\n analytics.trackEvent({ label: 'restore saved search' });\n }, function() {\n busy = false;\n });\n }\n }\n\n function rehydrateIfNecessaryAndThen(section, then, hotel) {\n if (section.needsHydrating) {\n rehydrate(section).then(function() {\n then(section, hotel);\n });\n } else {\n then(section, hotel);\n }\n }\n\n function setupSubscriptions() {\n broker.subscribe('footerToolbarDirective', 'hotelAddedToShortlist', function(ev) {\n const hotel = angular.copy(ev.data);\n hotel.onDelete = deleteFromShortlist;\n rehydrateIfNecessaryAndThen(scope.sections[1], addHotelToSection, hotel);\n });\n broker.subscribe('footerToolbarDirective', 'hotelRemovedFromShortlist', function(ev) {\n const hotel = ev.data;\n hotel.inShortlist = false;\n scope.$emit('hotelShortlistStatusUpdated', hotel);\n rehydrateIfNecessaryAndThen(scope.sections[1], removeHotelFromSection, hotel);\n });\n broker.subscribe('footerToolbarDirective', 'recentHotelAdded', function(ev) {\n rehydrateIfNecessaryAndThen(scope.sections[0], function(section, hotel) {\n rehydrateHotel(section, hotel).then(function(hotel) {\n addHotelToSection(section, hotel);\n });\n }, ev.data);\n });\n broker.subscribe('footerToolbarDirective', 'recentHotelRemoved', function(ev) {\n rehydrateIfNecessaryAndThen(scope.sections[0], function(section, hotel) {\n removeHotelFromSection(section, hotel);\n }, { Id: ev.data });\n });\n broker.subscribe('footerToolbarDirective', 'savedSearchAdded', function(ev) {\n addSearch(scope.sections[2], angular.copy(ev.data));\n });\n broker.subscribe('footerToolbarDirective', 'footerToolbarChanged', function(ev) {\n scope.open = ev.data;\n });\n broker.subscribe('footerToolbarDirective', 'attractionsBasketUpdated', e => {\n const basket = e && e.data && e.data.Basket;\n updateAttractionsBasket(basket && basket.LineItems);\n });\n broker.subscribe('footerToolbarDirective', 'basketCleared', () => updateAttractionsBasket());\n }\n\n function closeAllSections() {\n if (scope.sections) {\n scope.sections.forEach(s => s.open = false);\n }\n }\n\n\n function section(identifier, title, estabIds, things, emptyPrompt, icon, template, needsRehydrating, index, showCount, onDelete) {\n return {\n identifier,\n title,\n things: things || [],\n estabIds: estabIds || [],\n emptyPrompt,\n count: estabIds.length || things.length || 0,\n needsHydrating: needsRehydrating,\n icon,\n template,\n index,\n showCount,\n onDelete\n };\n }\n\n function deleteFromShortlist(hotel, ev) {\n ev.preventDefault();\n ev.stopPropagation();\n shortlistService.removeFromShortlist(hotel);\n }\n\n function shortlistSection(hotels) {\n return section(\n 'shortlist',\n resourceService.get('SHORTLIST'),\n hotels,\n [],\n resourceService.get('NOSHORTLISTEDHOTELS'),\n 'favourite',\n 'partials/footertoolbar/toolbarhotel',\n true,\n sectionIndex.shortlist,\n true,\n deleteFromShortlist\n );\n }\n\n function deleteFromRecent({ Id }, ev) {\n ev.preventDefault();\n ev.stopPropagation();\n recentHotels.remove(Id);\n }\n\n function recentHotelsSection(hotels) {\n return section(\n 'recent',\n resourceService.get('RECENTHOTELS'),\n hotels,\n [],\n resourceService.get('NORECENTHOTELS'),\n 'timer',\n 'partials/footertoolbar/toolbarhotel',\n true,\n sectionIndex.recentHotels,\n true,\n deleteFromRecent\n );\n }\n\n function savedSearchesSection(searches) {\n return section(\n 'searches',\n resourceService.get('RECENTSEARCHES'),\n [],\n arrayUtil.map(searches, extendSearch),\n resourceService.get('NORECENTSEARCHES'),\n 'search',\n 'partials/footertoolbar/toolbarsearch',\n false,\n sectionIndex.savedSearches,\n false\n );\n }\n\n function extendSearch(s) {\n return angular.extend(s, {\n icon: icons[s.SearchType],\n onClick: restoreSearch,\n onDelete: deleteSearch\n });\n }\n\n async function fetch() {\n initialised = true;\n const [\n recentHotelIds,\n shortlistEstabIds,\n savedSearches,\n footerToolbarPreferences\n ] = await $q.all([\n recentHotels.getIds(),\n shortlistService.getShortlistEstabIds(),\n savedSearchService.getSavedSearches(),\n preferences.get('footerToolbar')\n ]);\n scope.sections = [\n recentHotelsSection(recentHotelIds),\n shortlistSection(shortlistEstabIds),\n savedSearchesSection(savedSearches)\n ];\n return footerToolbarPreferences;\n }\n\n function initAttractionsBasket() {\n basketStore.getAttractionsBasket()\n .then(res => updateAttractionsBasket(res.LineItems));\n }\n\n function updateAttractionsBasket(lineItems) {\n const totals = attractionService.getProductTotals(lineItems);\n scope.attractionsBasketTotal = totals.price;\n scope.attractionsBasketCount = totals.count;\n if (totals.count) {\n setToolbarOpen(true);\n }\n }\n\n function rehydrate(section) {\n return hotelRehydrator.hotels(section.estabIds, {\n fields: [\n 'Id', 'Title', 'Location', 'StarRating', 'CustomerRating', 'CustomerRatingTitle', 'Url'\n ]\n }).then(function(hotels) {\n for (let i = 0, l = hotels.length; i < l; i++) {\n section.things[i] = hotels[i];\n section.things[i].onDelete = section.onDelete;\n }\n\n section.needsHydrating = false;\n });\n }\n\n function rehydrateHotel(section, id) {\n return hotelRehydrator.hotels([id], {\n fields: [\n 'Id', 'Title', 'Location', 'StarRating', 'CustomerRating', 'CustomerRatingTitle', 'Url'\n ]\n }).then(function(hotels) {\n const hotel = hotels[0];\n hotel.onDelete = section.onDelete;\n return hotel;\n });\n }\n\n function init() {\n fetch().then(open => {\n scope.open = open;\n setupSubscriptions();\n initAttractionsBasket();\n });\n }\n\n scope.select = function(index) {\n scope.sections[index].open = false;\n };\n\n scope.sectionClass = function(index) {\n return scope.sections[index].open ? 'expanded' : '';\n };\n\n scope.toggleBar = () => setToolbarOpen(!scope.open);\n\n scope.toggleSection = function(index) {\n scope.sections.forEach(function(s, i) {\n if (i !== index) {\n s.open = false;\n }\n });\n\n if (!scope.sections[index].open && scope.sections[index].needsHydrating) {\n rehydrate(scope.sections[index]).then(function() {\n scope.sections[index].open = true;\n });\n } else {\n scope.sections[index].open = !scope.sections[index].open;\n }\n };\n\n scope.$watch('open', function(v, o) {\n if (v == null || v === o) {\n return;\n }\n broker.publish('footerToolbarChanged', scope.open);\n });\n\n scope.$on('$destroy', function() {\n broker.unsubscribe('footerToolbarDirective');\n });\n }\n };\n }\n);\n})();\n","(function() {\n 'use strict';\n\nconst TR = angular.module('TR');\nTR.directive('globalWaiverText', GlobalWaiverText);\n\nfunction GlobalWaiverText() {\n return {\n restrict: 'E',\n scope: {\n waiverText: '=',\n },\n controllerAs: 'cm',\n templateUrl: 'partials/home/directivetemplate?type=GlobalWaiverText',\n link($scope, $element) {\n if (!$scope.waiverText || $scope.waiverText == null) {\n return;\n }\n\n $scope.showImportantInfo = false;\n\n async function fetchWaiverText() {\n const response = await $scope.waiverText;\n return response;\n }\n\n async function waiverTextReady() {\n\n const getWaiverText = await fetchWaiverText();\n\n if (!getWaiverText.length) { return; }\n\n const el = $element[0];\n const globalWaiverTerms = el.querySelector('.globalWaiverTerms');\n\n function attachLightbox(e) {\n e.preventDefault();\n $scope.selectedImportantInfo = '';\n $scope.showImportantInfo = true;\n $scope.$apply();\n }\n\n globalWaiverTerms.addEventListener('click', attachLightbox);\n\n $scope.$on('$destroy', function() {\n globalWaiverTerms.removeEventListener('click', attachLightbox);\n });\n }\n waiverTextReady();\n }\n };\n}\n\n})();\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('googleMap', function($window, $timeout, searchUnitService) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n key: '@',\r\n model: '='\r\n },\r\n template: '
            ',\r\n link(scope, el) {\r\n const headerHeight = 95;\r\n const throttle = 100;\r\n const pos = searchUnitService.getSearchArea();\r\n let map;\r\n let initialised = false;\r\n let centre;\r\n let promise = null;\r\n\r\n scope.$on('mapTabSelected', function() {\r\n if (!$window.google || !$window.google.maps) {\r\n $(``);\n }\n }, 1500);\n }\n };\n });\n}\n","'use strict';\nnamespace TR {\n class USP {\n private list: any;\n private useBreakpoint: boolean;\n private breakpoint: number = 1025;\n private classFirst: string ='slick-first';\n private classLast: string = 'slick-last';\n private settings: any = {\n mobileFirst: true,\n rtl: TRPCONFIG.Rtl,\n slidesToShow: 1,\n infinite: false,\n dots: false,\n speed: 250\n };\n private breakpointSettings = {\n responsive: [\n {\n breakpoint: this.breakpoint,\n settings: 'unslick'\n }\n ]\n };\n\n setup(el:any):void {\n this.list = el.find('.slick-usps:first');\n this.initSlick();\n if(this.useBreakpoint) {\n this.onResize();\n }\n }\n\n initSlick(): void {\n this.destroy();\n const count = this.list.find('.usps-item').length;\n if (count > 1) {\n this.list.addClass(this.classFirst).removeClass(this.classLast);\n this.list.slick(this.useBreakpoint\n ? _.extend({},this.settings, this.breakpointSettings) : this.settings);\n this.list.on('afterChange', (e, slick, current) => {\n if (0 === current) {\n this.list.addClass(this.classFirst);\n } else if (slick.slideCount - 1 === current) {\n this.list.addClass(this.classLast);\n } else {\n this.list.removeClass(`${this.classFirst} ${this.classLast}`);\n }\n });\n }\n }\n\n onResize(): void {\n $(window).resize(_.debounce(() => {\n const w = $('body').innerWidth();\n if (!this.list.hasClass('slick-initialized') && w < this.breakpoint) {\n this.initSlick();\n }\n }, 300));\n }\n\n destroy(): void {\n if(this.list.hasClass('slick-initialized')) {\n this.list.slick('unslick');\n }\n }\n }\n\n angular.module('TR')\n .directive('uniqueSellingPoints', (): ng.IDirective => {\n return {\n restrict: 'E',\n controllerAs : 'usp',\n controller: USP,\n scope: {},\n bindToController : {\n useBreakpoint: '@'\n },\n link: (scope: any, el: any, attr: ng.IAttributes, controller: USP) => {\n controller.setup(el);\n scope.$on('$destroy', () => {\n controller.destroy();\n });\n }\n };\n });\n}\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('urgencyMessages', function(urgencyMessaging, arrayUtil, $interval, $timeout) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n estabId: '='\r\n },\r\n template: '

            ',\r\n link(scope, el) {\n const fade = 500;\r\n const cycle = 5000;\r\n const p = el.find('p:first');\r\n let msgs;\r\n let i = 0;\r\n let loop;\r\n\r\n function showMsg() {\r\n i += 1;\r\n p.addClass('faded');\r\n $timeout(function() {\r\n p.text(msgs[i % msgs.length]);\r\n p.removeClass('faded');\r\n }, fade);\r\n }\r\n\r\n urgencyMessaging.get(scope.estabId).then(function(stats) {\r\n if (stats != null) {\r\n msgs = arrayUtil.filter([stats.CurrentViewsText, stats.LastBookedDateText, stats.ShortlistCountText], function(msg) {\r\n return msg != null;\r\n });\r\n if (msgs.length > 0) {\r\n p.text(msgs[i]);\r\n if (msgs.length > 1) {\r\n loop = $interval(showMsg, cycle);\r\n }\r\n }\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function() {\r\n $interval.cancel(loop);\r\n });\r\n }\r\n };\r\n});\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('user', function($rootScope, authService, agentModeService) {\r\n return {\r\n restrict: 'A',\r\n link(scope, el, attr) {\r\n if (attr.user && attr.user.length > 0) {\r\n $rootScope.user = JSON.parse(attr.user);\r\n authService.setUser($rootScope.user);\r\n ($rootScope.user.AnonSignedIn ? authService.getSignedinBooking() : $.when()).then(booking => {\r\n if (booking) {\r\n $rootScope.user.Contact = booking.Contact;\r\n $rootScope.user.BookingSummary = booking.Summary;\r\n }\r\n });\r\n\r\n if ($rootScope.user.Agent && !$rootScope.agent) {\r\n agentModeService\r\n .getAgentInformation()\r\n .then(function setAgent(data) {\r\n $rootScope.agent = data;\r\n });\r\n }\r\n }\r\n }\r\n };\r\n }\r\n);\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nconst lettersOnly = /^[À-ÿa-zA-Z_\\-'. ]*$/;\r\nconst alphaNumericTenDigits = /^[A-Za-z0-9]{10}$/;\r\nconst numericFiveDigits = /^[0-9]{5}$/;\r\nconst numericNineDigits = /^[0-9]{9}$/;\r\nconst notEnglishLetter = /[À-ÿĀ-ſƀ-ɏɐ-ʯΑ-ϿЀ-ӿԀ-ԯԱ-ևא-ת؀-ۿႠ-ჿ]/;\r\nconst multiLangLetters = /^[A-Za-zẞßÀ-ÿĀ-ſƀ-ɏɐ-ʯΑ-ϿЀ-ӿԀ-ԯԱ-ևא-ת؀-ۿႠ-ჿ-.,' ]*$/;\r\nconst numbersOnly = /^(\\d+\\.?\\d{0,2}|\\.\\d{1,2})$/;\r\nconst numbersSymbols = /[0-9!#$%&@*+/=?^_`{|}~\\\\[\\]]/;\r\nconst phoneNum = /^[()0-9 -]+$/;\r\nconst flightNumber = /^(([A-Za-z]{2,3})|([A-Za-z]\\d)|(\\d[A-Za-z]))(\\d{1,})([A-Za-z]?)$/;\r\nconst email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\nconst postcodes = {\r\n Default: /^[A-Za-z\\d\\s]{1,}$/,\r\n GB: /^[A-Za-z\\d\\s]{5,8}$/,\r\n IE: /^[A-Za-z\\d\\s]{2,}$/\r\n};\r\nconst requiredLengthRangeRegExp = /^\\[?(\\d+)(?:,(\\d+))?]?$/;\r\nfunction nullOrEmpty(val) {\r\n return val == null || val.length === 0;\r\n}\r\n\r\nfunction validator(name, watches, failTest, deep, isPureValidator, isObserved) {\r\n return function(...args) {\r\n return {\r\n require: 'ngModel',\r\n link(scope, el, attr, c) {\r\n if (!c) { return; }\r\n if (isPureValidator || attr.pureValidator !== undefined) {\r\n c.$validators[name] = () => {\r\n return !failTest(scope, el, attr, c, c.$viewValue, args);\r\n };\r\n } else {\r\n angular.forEach(watches, function(watch) {\r\n scope.$watch(attr[watch], function() {\r\n c.$setValidity(name, !failTest(scope, el, attr, c, c.$viewValue, args));\r\n }, deep);\r\n });\r\n }\r\n if (isObserved) {\r\n attr.$observe(name, function() {\r\n c.$setValidity(name, !failTest(scope, el, attr, c, c.$viewValue, args));\r\n });\r\n }\r\n }\r\n };\r\n };\r\n}\r\n\r\nfunction objectValidator(name, failTest) {\r\n return function() {\r\n return {\r\n require: 'ngModel',\r\n link(scope, el, attr, c) {\r\n function validate(value) {\r\n return !failTest(scope, el, attr, c, value);\r\n }\r\n\r\n //For DOM -> model validation\r\n c.$parsers.unshift(function(value) {\r\n const valid = validate(value);\r\n c.$setValidity(name, valid);\r\n return valid ? value : undefined;\r\n });\r\n\r\n //For model -> DOM validation\r\n c.$formatters.unshift(function(value) {\r\n c.$setValidity(name, validate(value));\r\n return value;\r\n });\r\n }\r\n };\r\n };\r\n}\r\n\r\nTR.directive('emailAddress', [validator('emailAddress', ['ngModel'], function(scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !email.test(value);\r\n})]);\r\n\r\nTR.directive('requiredGuest', [objectValidator('requiredGuest', function(scope, el, attr, c, value) {\r\n return attr.requiredGuest && scope.$eval(attr.requiredGuest) && (nullOrEmpty(value) || nullOrEmpty(value.Title) || nullOrEmpty(value.FirstName) || nullOrEmpty(value.LastName));\r\n})]);\r\n\r\nTR.directive('lettersOnly', [validator('lettersOnly', ['ngModel'], function(scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !lettersOnly.test(value);\r\n})]);\r\n\r\nTR.directive('requiredDate', ['dateUtil', validator('requiredDate', ['ngModel'], function(scope, el, attr, c, value, dependencies) {\r\n return !dependencies[0].isValid(value);\r\n})]);\r\n\r\nTR.directive('oneMainDriver', [validator('oneMainDriver', ['ngModel'], function(scope, el, attr, c, value) {\r\n if (attr.oneMainDriver && !scope.$eval(attr.oneMainDriver)) {\r\n return false;\r\n }\r\n\r\n if (value) {\r\n let mainDrivers = 0;\r\n angular.forEach(value, function(room) {\r\n angular.forEach(room.Guests, function(guest) {\r\n if (guest.DriverType === 1) {\r\n mainDrivers += 1;\r\n }\r\n });\r\n });\r\n return mainDrivers !== 1;\r\n }\r\n return true;\r\n}, true)]);\r\n\r\nTR.directive('numberOfAdditionalDrivers', [validator('numberOfAdditionalDrivers', ['ngModel'], function(scope, el, attr, c, value) {\r\n if (attr.numberOfAdditionalDrivers && !scope.$eval(attr.numberOfAdditionalDrivers)) {\r\n return false;\r\n }\r\n\r\n if (value) {\r\n let additionalDrivers = 0;\r\n angular.forEach(value, function(room) {\r\n angular.forEach(room.Guests, function(guest) {\r\n if (guest.DriverType === 2) {\r\n additionalDrivers++;\r\n }\r\n });\r\n });\r\n return additionalDrivers !== value.additionalDrivers;\r\n }\r\n return true;\r\n}, true)]);\r\nTR.directive('dobCheck', ['dateUtil', validator('dobcheck', ['ngModel'], function(scope, el, attr, c, value) {\r\n if (value == null) { return false; }\r\n value = value.slice(0, 10);\r\n let today = new Date().getTime();\r\n let checkFutureDate = value.split('-');\r\n checkFutureDate = new Date(checkFutureDate[0], checkFutureDate[1] - 1, checkFutureDate[2]).getTime();\r\n return (today - checkFutureDate) < 0;\r\n})]);\r\nTR.directive('ageCheck', ['dateUtil', validator('ageCheck', ['ngModel'], function(scope, el, attr, c, value, dependencies) {\r\n if (value == null) { return false; }\r\n if (scope.$eval(attr.validateAge) || scope.guest.Type !== 1) {\r\n return dependencies[0].getAge(value, dependencies[0].zeroTime(new Date(`${scope.$eval(attr.ageCheck)}Z`))) !== scope.guest.Age;\r\n }\r\n return false;\r\n})]);\r\n\r\nTR.directive('expiryCheck', [validator('expiryCheck', ['ngModel'], function(scope, el, attr, c, value) {\r\n const today = new Date();\r\n if (value.year && value.month) {\r\n if (value.year > today.getFullYear()) {\r\n return false;\r\n } else if (value.year === today.getFullYear()) {\r\n return value.month < (today.getMonth() + 1);\r\n }\r\n }\r\n return true;\r\n})]);\r\n\r\nTR.directive('notDefaultMonthYearIf', [validator('notDefaultMonthYearIf', ['notDefaultMonthYearIf', 'ngModel'], function(scope, el, attr, c, value) {\r\n if (scope.$eval(attr.notDefaultMonthYearIf)) {\r\n return !value.year && !value.year > 0 && !value.month && !value.month > 0;\r\n }\r\n return false;\r\n})]);\r\n\r\nTR.directive('notDefault', [validator('notDefault', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$modelValue || parseInt(c.$modelValue) === 0;\r\n})]);\r\n\r\nTR.directive('mustCheck', [validator('mustCheck', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$modelValue;\r\n})]);\r\n\r\nTR.directive('notDefaultIf', [validator('notDefaultIf', ['notDefaultIf', 'ngModel'], function(scope, el, attr, c) {\r\n return attr.notDefaultIf && scope.$eval(attr.notDefaultIf) && (c.$modelValue == null || c.$modelValue === 0);\r\n})]);\r\n\r\nTR.directive('numbersOnly', [function() {\r\n return (validator('numbersOnly', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numbersOnly.test(c.$modelValue);\r\n })());\r\n}]);\r\n\r\nTR.directive('alphaNumericTenDigits', [function() {\r\n return (validator('alphaNumericTenDigits', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !alphaNumericTenDigits.test(c.$modelValue);\r\n })());\r\n}]);\r\n\r\nTR.directive('numericFiveDigits', [function() {\r\n return (validator('numericFiveDigits', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numericFiveDigits.test(c.$modelValue);\r\n })());\r\n}]);\r\n\r\nTR.directive('numericNineDigits', [function() {\r\n return (validator('numericNineDigits', ['ngModel'], function(scope, el, attr, c) {\r\n return !c.$isEmpty(c.$modelValue) && !numericNineDigits.test(c.$modelValue);\r\n })());\r\n}]);\r\n\r\nTR.directive('phoneNum', [validator('phoneNum', ['ngModel'], function(scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !phoneNum.test(value);\r\n})]);\r\n\r\nTR.directive('postcodeIf', [validator('postcodeIf', ['postcodeIf', 'ngModel'], function(scope, el, attr, c, value) {\r\n if (scope.$eval(attr.postcodeIf)) {\r\n let exp = _.get(postcodes, scope.$eval(attr.postcodeCountry), postcodes.Default);\r\n return !exp.test(value);\r\n }\r\n return false;\r\n})]);\r\n\r\nTR.directive('flightNumber', [validator('flightNumber', ['ngModel'], function(scope, el, attr, c, value) {\r\n return !c.$isEmpty(value) && !flightNumber.test(value);\r\n})]);\r\n\r\nTR.directive('requiredIf', [validator('requiredIf', ['requiredIf', 'ngModel'], function(scope, el, attr, c, value) {\r\n return attr.requiredIf && scope.$eval(attr.requiredIf) && c.$isEmpty(value);\r\n})]);\r\n\r\nTR.directive('mustPassCreditCheck', [validator('mustPassCreditCheck', ['mustPassCreditCheck', 'ngModel'], function(scope, el, attr) {\r\n return scope.$eval(attr.mustPassCreditCheck) !== 'green';\r\n})]);\r\n\r\nTR.directive('sameAs', [validator('sameAs', ['sameAs', 'ngModel'], function(scope, el, attr, c, value) {\r\n return attr.sameAs && scope.$eval(attr.sameAs) !== value;\r\n})]);\r\n\r\nTR.directive('minValue', [validator('minValue', ['minValue', 'ngModel'], function(scope, el, attr, c) {\r\n return !!attr.minValue && (Number(attr.minValue).toFixed(2)) > Number(c.$modelValue);\r\n})]);\r\n\r\nTR.directive('maxValue', [validator('maxValue', ['maxValue', 'ngModel'], function(scope, el, attr, c) {\r\n return !!attr.maxValue && (Number(attr.maxValue)).toFixed(2) < Number(c.$modelValue);\r\n}, false, false, true)]);\r\n\r\n//required-length=[minValue, maxValue] or required-length=exactValue\r\n//required-length=[3 ,5] means 3<=length<=5\r\n//required-length=5 means length = 5\r\nTR.directive('requiredLength', [validator('requiredLength', ['ngModel'], function(scope, el, { requiredLength }, c, value) {\r\n if (c.$isEmpty(value)) {\r\n value = '';\r\n }\r\n\r\n if (c.$isEmpty(requiredLength)) {\r\n throw new Error('For \"required-length\" directive it is not specifed value for length. Must be either \"=[minValue, maxValue]\" or =\"exactValue\"');\r\n }\r\n requiredLength = requiredLength.toString().replace(/\\s/g, '');\r\n const rangeArray = (new RegExp(requiredLengthRangeRegExp)).exec(requiredLength);\r\n\r\n //if no any correctly parsed values - validation failing function returns always false, meaning no impact just as validation is absent\r\n if (!rangeArray || rangeArray.length < 3) {\r\n return false;\r\n }\r\n //for exact value, we have only one parsed value, which is minValue and maxValue at once;\r\n if (rangeArray[2] === undefined) {\r\n rangeArray[2] = rangeArray[1];\r\n }\r\n const [, minValue, maxValue] = rangeArray;\r\n return value.length < minValue || value.length > maxValue;\r\n}, false, true)]);\r\n\r\nTR.directive('nameValidation', [validator('nameValidation', ['ngModel'], function(scope, el, attr, c, value) {\r\n if (c.$isEmpty(value)) {\r\n return true;\r\n }\r\n const regExpPattern = new RegExp(/^[a-zA-Z ',.-]{2,255}$/);\r\n return !regExpPattern.test(value);\r\n}, false, true)]);\r\n\r\n/*\r\nTR.directive('customFailIf', [validator('customFailIf', ['customFailIf', 'ngModel'], function(scope, el, attr, c, value) {\r\n let r = attr.customFailIf && scope.$eval(attr.customFailIf);\r\n console.log('customFailIf', attr.customFailIf, scope.$eval(attr.customFailIf), r);\r\n return r;\r\n})]);\r\n*/\r\n\r\nTR.directive('containsEnglishLetters', [validator('containsEnglishLetters', ['ngModel'], (scope, el, attr, c, value) => {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n const r = new RegExp(notEnglishLetter);\r\n return r.test(value);\r\n}, false, true)]);\r\n\r\nTR.directive('containsNumbersSymbols', [validator('containsNumbersSymbols', ['ngModel'], (scope, el, attr, c, value) => {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n const r = new RegExp(numbersSymbols);\r\n return r.test(value);\r\n}, false, true)]);\r\n\r\nTR.directive('onlyMultilangLetters', [validator('onlyMultilangLetters', ['ngModel'], (scope, el, attr, c, value) => {\r\n if (c.$isEmpty(value)) {\r\n return false;\r\n }\r\n const r = new RegExp(multiLangLetters);\r\n return !r.test(value);\r\n}, false, true)]);\r\n\r\nTR.directive('currencyInput', ['numberFilter', '$locale', function(numberFilter, $locale) {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n priority: 1,\r\n link(scope, el, attra, c) {\r\n c.$parsers.unshift(parseCurrency);\r\n\r\n c.$formatters.unshift(formatCurrency);\r\n\r\n el.blur(function() {\r\n const v = formatCurrency(parseCurrency(c.$viewValue));\r\n c.$setViewValue(v);\r\n el.val(v);\r\n });\r\n\r\n el.keypress(function(e) {\r\n const code = e.keyCode || e.which;\r\n\r\n if ($.inArray(code, [9, 13, 27]) !== -1) {\r\n el.blur();\r\n return;\r\n }\r\n if (code >= 48 && code <= 57 ||\r\n code === $locale.NUMBER_FORMATS.GROUP_SEP.charCodeAt(0) ||\r\n $locale.NUMBER_FORMATS.DECIMAL_SEP.charCodeAt(0) === code && e.key !== 'Del' && c.$viewValue.indexOf($locale.NUMBER_FORMATS.DECIMAL_SEP) === -1 ||\r\n\r\n //backspace & delete\r\n code === 8 || code === 46 && e.key === 'Del' ||\r\n\r\n //Ctrl+A\r\n code === 65 && e.ctrlKey === true ||\r\n\r\n // home, end, left, right\r\n code >= 35 && code <= 39) {\r\n return;\r\n }\r\n e.preventDefault();\r\n });\r\n\r\n scope.$on('$destroy', function() {\r\n el.off('keydown');\r\n el.off('blur');\r\n });\r\n\r\n function parseCurrency(value) {\r\n if (!value) { return ''; }\r\n const index = value.lastIndexOf($locale.NUMBER_FORMATS.DECIMAL_SEP);\r\n if (index !== -1) {\r\n const first = value.substr(0, index);\r\n const second = value.substr(index + 1);\r\n return parseFloat(`${first.replace(/\\D/g, '')}.${second.replace(/\\D/g, '')}`).toFixed(2);\r\n }\r\n return parseFloat(value.replace(/\\D/g, '')).toFixed(2);\r\n }\r\n\r\n function formatCurrency(value) {\r\n if (value) {\r\n return numberFilter(parseFloat(value), 2);\r\n }\r\n }\r\n }\r\n };\r\n}]);\r\n\r\n // Allow only 9 numeric characters as input for Skywards ID and restrict other characters\r\n TR.directive('skywardsId', function() {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link(scope, element, attrs, ngModel) {\r\n if (!ngModel) {\r\n return;\r\n }\r\n ngModel.$parsers.unshift(function(inputValue) {\r\n let digits = inputValue.split('').filter(function(s) { return (!isNaN(s) && s !== ' '); }).join('');\r\n if (digits.length > 9) {\r\n digits = digits.substr(0, 9);\r\n }\r\n ngModel.$viewValue = digits;\r\n ngModel.$render();\r\n return digits;\r\n });\r\n }\r\n };\r\n });\r\n TR.directive('skywardsNumericNineDigits', ['$http', function($http) {\r\n return (validator('skywardsNumericNineDigits', ['ngModel'], (scope, el, attr, c) => {\r\n const rawSkywardsValue = scope.$eval(attr.skywardsNumericNineDigits);\r\n const invalidDigits = !c.$isEmpty(rawSkywardsValue) && !numericNineDigits.test(rawSkywardsValue);\r\n if (invalidDigits) {\r\n return true;\r\n } else if (!c.$isEmpty(rawSkywardsValue)) {\r\n const skywardsUrl = '/api/skywards/Validation/';\r\n return $http.get(`${skywardsUrl}${rawSkywardsValue}`).then(res => {\r\n if (res.data) {\r\n c.$setValidity('skywardsNumericNineDigits', true);\r\n }\r\n return !res.data;\r\n });\r\n }\r\n if (c.$isEmpty(rawSkywardsValue)) {\r\n return false;\r\n }\r\n return true;\r\n })());\r\n }]);\r\n})();\r\n","(function() {\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.directive('validPassword', function() {\r\n let total = 0;\r\n const upperCase = new RegExp('[A-Z]');\r\n const lowerCase = new RegExp('[a-z]');\r\n const numbers = new RegExp('[0-9]');\r\n const specialchars = new RegExp('([!,%,&,@,#,$,^,*,?,_,-,~,+])');\r\n const twoOrMoreUpperCase = new RegExp('[A-Z]', 'g');\r\n const twoOrMoreNumbers = new RegExp('[0-9]', 'g');\r\n const twoOrMoreNumbersSpecialchars = new RegExp('([!,%,&,@,#,$,^,*,?,_,-,~,+])', 'g');\r\n\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link(scope, el, a, c) {\r\n c.$parsers.unshift(function(value) {\r\n checkStrength(value);\r\n return value;\r\n });\r\n\r\n scope.strength = function() {\r\n if (total <= 0) {\r\n return 'EMPTY';\r\n } else if (total === 1) {\r\n return 'POOR';\r\n } else if (total === 2) {\r\n return 'VERYWEAK';\r\n } else if (total === 3) {\r\n return 'WEAK';\r\n } else if (total === 4) {\r\n return 'MEDIUM';\r\n } else if (total === 5) {\r\n return 'GOOD';\r\n } else if (total > 5) {\r\n return 'STRONG';\r\n }\r\n };\r\n\r\n function boolToInt(b) {\r\n return b ? 1 : 0;\r\n }\r\n\r\n function checkStrength(val) {\r\n total = 0;\r\n if (val !== null && val !== undefined) {\r\n total = boolToInt(val.length >= 8) +\r\n boolToInt(val.match(upperCase)) +\r\n boolToInt(val.match(lowerCase)) +\r\n boolToInt(val.match(numbers)) +\r\n boolToInt(val.match(specialchars)) +\r\n boolToInt((val.match(twoOrMoreUpperCase) || []).length > 1) +\r\n boolToInt((val.match(twoOrMoreNumbers) || []).length > 1) +\r\n boolToInt((val.match(twoOrMoreNumbersSpecialchars) || []).length > 1);\r\n }\r\n scope.$emit('passwordStrength', { strength: total, label: scope.strength() });\r\n }\r\n }\r\n };\r\n});\n})();\n","(function() {\n'use strict';\r\n\r\nconst TR = angular.module('TR');\r\nTR.filter('relativeCurrency', function($filter) {\r\n return function(amount, relativeTo) {\r\n const diff = amount - relativeTo;\r\n return $filter('roundedCurrency')(diff);\r\n };\r\n});\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('actionTemplateService', actionTemplateService);\r\n\r\nfunction actionTemplateService(dateUtil, $http, $rootScope, resourceService) {\n const validEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n const actionUtils = {\r\n PAYBALANCE: {\r\n format: String.format,\r\n addDays: (function() {\r\n const today = new Date();\r\n return function(days) {\r\n return dateUtil\r\n .addDays(today, days)\r\n .toDateString();\r\n };\r\n })()\r\n },\r\n VOUCHERACTIONS: {\r\n sendConfirmationEmail: (function() {\r\n const cultureCode = TRPCONFIG.Domain.CultureCode;\r\n\r\n return function(emails, bookingId) {\r\n const emailsArray = emails.split(',');\r\n for (let i = emailsArray.length - 1; i >= 0; i--) {\r\n const email = emailsArray[i].trim();\r\n if (!validEmail.test(email)) {\r\n $rootScope.$broadcast('flash:error', String.format(resourceService.get('VOUCHERINVALID'), email));\r\n return;\r\n }\r\n }\r\n\r\n $http.post('/api2/managebooking/sendconfirmationemail',\r\n { BookingId: bookingId, Culture: cultureCode, Emails: emailsArray });\r\n $rootScope.$broadcast('flash:success', resourceService.get('VOUCHERSENT'));\r\n };\r\n })()\r\n }\r\n };\r\n\r\n const service = {\r\n getUtils(name) { return actionUtils[name]; }\r\n };\r\n\r\n return service;\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('advertService', advertService);\n\nfunction advertService($http, pageStrand) {\n const service = {\n getAdvertsForPosition,\n getUrl\n };\n\n function getUrl() {\n return `${TRPCONFIG.AdvertImagesClientDomain}/api2/squibs/`;\n }\n\n function getAdvertsForPosition(positionId, destination) {\n return $http.get(`${TRPCONFIG.AdvertServiceClientDomain}/api2/squibs/getsquibsforposition?${$.param({\n CountryId: destination.CountryId,\n ProvinceId: destination.ProvinceId,\n LocationId: destination.LocationId,\n PlaceId: destination.PlaceId,\n EstablishmentId: destination.EstablishmentId,\n PolygonId: destination.PolygonId,\n PageStrand: pageStrand.fromRoute(destination),\n PositionId: positionId,\n DomainId: TRPCONFIG.Domain.DomainId,\n v: TRPCONFIG.CurrentVersion,\n Domain: location.host\n })}`, { cache: true, ignoreErrors: true }).then(function(res) {\n return res.data;\n });\n }\n\n return service;\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('analytics', analytics);\r\n\r\nfunction analytics(\r\n broker,\r\n $http,\r\n $timeout,\r\n $document,\r\n $location,\r\n $q,\r\n $rootScope,\r\n $route,\r\n abTest,\r\n loggingService,\r\n searchUnitService,\r\n currentUser,\r\n tripService,\r\n cookieService,\r\n unadjustedDateFilter) {\r\n let lastUrl;\r\n let lastAbs;\r\n let timer;\r\n const timers = [];\r\n const url = '/api2/analytics/';\r\n const _defer = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.setTimeout;\r\n const skipAnalytics = (/prerender/i.test(navigator.userAgent) || !TRPCONFIG.Domain.GoogleTagManagerEnabled) && !TRPCONFIG.IsUnitTestForAnalytics;\r\n const searchTypes = {\r\n 1: 'FlightSearch',\r\n 2: 'HotelSearch',\r\n 3: 'HolidaySearch',\r\n 4: 'TransferSearch',\r\n 6: 'ParkingSearch'\r\n };\r\n const service = {\r\n trackEvent,\r\n trackTiming,\r\n trackConversion,\r\n trackSearchOrigin,\r\n pageLoad,\r\n routeChange,\r\n startTimer,\r\n endTimer,\r\n track,\r\n incrementPeopleEvent,\r\n trackRequestedHotelNotAvailable,\r\n setMixpanelEmail\r\n };\r\n\r\n const noop = function() { return $q.when(); };\r\n\r\n if (skipAnalytics) {\r\n for (const func in service) {\r\n service[func] = noop;\r\n }\r\n }\r\n\r\n let utmId;\r\n let _mixPanelReady = subscribeOnceAsPromise('userSet')\r\n .then(() => {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ config: TRPCONFIG });\r\n utmId = currentUser.get() ? currentUser.get().UtmId : null;\r\n if (utmId === '') {\r\n return $q.reject();\r\n }\r\n })\r\n .then(() => {\r\n window.dataLayer.push({ utmId });\r\n return TRPCONFIG.MixPanelLoaded || subscribeOnceAsPromise('MixPanelLoaded');\r\n })\r\n .then(() => {\r\n window.mixpanel.register({ 'Device Category': TRPCONFIG.DeviceCategory, 'Platform': `${TRPCONFIG.Domain.DeviceType}Web` });\r\n window.mixpanel.register({ Domain: extractDomain() });\r\n window.mixpanel.register({ BookingLanguage: TRPCONFIG.Domain.CultureCode });\r\n let distinctId = window.mixpanel.get_distinct_id();\r\n window.mixpanel.identify(distinctId.indexOf('-') > -1 ? utmId : distinctId);\r\n TRPCONFIG.MixPanelReady = true;\r\n });\r\n\r\n function extractDomain() {\r\n let match = window.location.href.match(/([a-z]+.(com|co.uk|ru|ae)\\/*[a-z]+_[a-z0-9]+\\/)/g);\r\n if (match) { return match[0]; }\r\n match = window.location.hostname.match(/\\..+\\..+/g);\r\n if (match) { return match[0].slice(1); }\r\n return window.location.hostname;\r\n }\r\n\r\n function startTimer(key) {\r\n const opts = {\r\n action: key,\r\n category: 'performance',\r\n label: 'loading screen timeout'\r\n };\r\n\r\n if (timers[key] != null) {\r\n $timeout.cancel(timers[key][0]);\r\n }\r\n timers[key] = [\r\n $timeout(function() {\r\n trackEvent(opts);\r\n const utm = currentUser.get().UtmId;\r\n loggingService.logWarn(`customer with utm ${utm} and userAgent ${navigator.userAgent} experienced a loading screen timeout with key \"${opts.action}\"`);\r\n }, 30000), new Date().getTime()\r\n ];\r\n }\r\n\r\n function endTimer(key) {\r\n timer = timers[key];\r\n if (timer != null) {\r\n $timeout.cancel(timer[0]);\r\n\r\n const opts = {\r\n timingCategory: 'performance',\r\n timingVar: key,\r\n timingValue: new Date().getTime() - timer[1],\r\n timingLabel: 'LoadingScreen'\r\n };\r\n\r\n trackTiming(opts);\r\n delete timers[key];\r\n }\r\n }\r\n\r\n function trackTiming(opts) {\r\n opts = angular.extend({ timingCategory: 'performance', timingVar: 'timer', timingLabel: null, timingValue: null }, opts || {});\r\n _defer(function() {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({\r\n event: 'timingEvent',\r\n category: opts.timingCategory,\r\n variable: opts.timingVar || '',\r\n time: opts.timingValue,\r\n label: opts.timingLabel\r\n });\r\n });\r\n }\r\n\r\n function trackEvent(opts) {\r\n opts = angular.extend({ category: 'button', action: 'click', label: null, value: null }, opts || {});\r\n _defer(function() {\r\n window.dataLayer = window.dataLayer || [];\r\n let obj = {\r\n event: 'clickEvent',\r\n category: opts.category,\r\n action: opts.action,\r\n value: opts.value,\r\n label: opts.label\r\n };\r\n if (TRPCONFIG.Domain.TenantId === 3) {\r\n obj = angular.extend(obj, _.pick(opts, 'dimension3', 'dimension4', 'dimension5', 'dimension6', 'dimension7', 'dimension8'));\r\n }\r\n window.dataLayer.push(obj);\r\n });\r\n }\r\n\r\n function trackConversion(value) {\r\n if (TRPCONFIG.Domain.GoogleConversionId !== 0) {\r\n /* eslint-disable camelcase */\r\n const conversionObject = {\r\n google_conversion_id: TRPCONFIG.Domain.GoogleConversionId,\r\n google_conversion_language: 'en',\r\n google_conversion_color: 'ffffff',\r\n google_remarketing_only: false,\r\n google_conversion_value: value || 1,\r\n google_conversion_format: 1\r\n };\r\n\r\n if (TRPCONFIG.Domain.GoogleConversionLabel) {\r\n conversionObject.google_conversion_label = TRPCONFIG.Domain.GoogleConversionLabel;\r\n }\r\n if (TRPCONFIG.Domain.GoogleConversionFormat) {\r\n conversionObject.google_conversion_format = TRPCONFIG.Domain.GoogleConversionFormat;\r\n }\r\n\r\n if (window.google_trackConversion) {\r\n window.google_trackConversion(conversionObject);\r\n }\r\n /* eslint-enable camelcase */\r\n }\r\n\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ event: 'bookingcomplete' });\r\n }\r\n\r\n function trackSearchOrigin(tripId, requestedUrl) {\r\n if (TRPCONFIG.Domain.TrackSearchOriginEnabled) {\r\n return tripService.getTrip(tripId).then(trip => {\r\n const request = {\r\n RequestedUrl: requestedUrl,\r\n AcomSearchId: trip && trip.HotelsRequest && trip.HotelsRequest.AvailabilitySearchId,\r\n FlightSearchId: trip && trip.FlightsRequest && trip.FlightsRequest.AvailabilitySearchId\r\n };\r\n\r\n if (request.AcomSearchId || request.FlightSearchId) {\r\n return $http.post(`${url}tracksearchorigin`, request, { ignoreErrors: true });\r\n }\r\n });\r\n }\r\n }\r\n\r\n function pageLoad(pageUrl) {\r\n _defer(function() {\r\n $http.post(`${url}trackpageloadtimings`, {\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n Url: pageUrl,\r\n Timings: window.performance ? window.performance.timing : null\r\n }, { ignoreErrors: true });\r\n\r\n updateCriteoId();\r\n });\r\n\r\n const query = $location.search();\r\n updateSalesForceParameters(query);\r\n\r\n if (query.source != null && query.dlid != null) {\r\n _defer(function() {\r\n $http.post(`${url}trackdeeplink`, {\r\n DeepLinkId: query.dlid\r\n }, { ignoreErrors: true });\r\n });\r\n }\r\n }\r\n\r\n function updateSalesForceParameters(queryParams) {\r\n const hostName = window.location.hostname;\r\n const cookieDomain = hostName.slice(hostName.indexOf('.'));\r\n const params = _.pick(queryParams, ['j', 'sfmc_sub', 'l', 'u', 'jb', 'mid', 'e']);\r\n if (params.j && params.sfmc_sub && params.l && params.jb && params.mid && params.u) {\r\n const salesForceParams = _.entries(params).map(([key, value]) => {\r\n delete queryParams[key];\r\n return `${key}=${value}`;\r\n }).join('&');\r\n cookieService.set('salesforce', salesForceParams, null, cookieDomain);\r\n $location.search(queryParams);\r\n }\r\n }\r\n\r\n function updateCriteoId() {\r\n const ctoOptOut = cookieService.get('cto_optout');\r\n const optOut = ctoOptOut === '1';\r\n const criteoId = optOut ? '' : cookieService.get('cto_axid');\r\n\r\n if (optOut || criteoId) {\r\n $http.post(`${url}updatecriteoid`, {\r\n CriteoId: criteoId,\r\n OptOut: optOut\r\n }, {\r\n ignoreErrors: true\r\n });\r\n }\r\n }\r\n\r\n function routeChange(absUrl, relUrl) {\r\n //double check that the route has actually changed because we suspect that this may\r\n //get called repeatedly when we go into an infinite digest loop which we have not yet resolved.\r\n if (relUrl === lastUrl) {\r\n return;\r\n }\r\n lastUrl = relUrl;\r\n\r\n if (relUrl && relUrl === '/' || relUrl === '/v2/') {\r\n track('mixpanel', 'HomePage');\r\n _mixPanelReady.then(() => window.mixpanel.people.increment('Home Page Visit'));\r\n }\r\n\r\n _defer(function() {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({ event: 'virtualPageView', virtualPageURL: relUrl });\r\n\r\n // abTest.executeTrackingCode('body');\r\n\r\n $http.post(\r\n 'website/monkey/tennis',\r\n {\r\n Url: absUrl,\r\n ReferrerUrl: lastAbs == null ? $document[0].referrer : lastAbs\r\n },\r\n { ignoreErrors: true }\r\n ).then(function checkVersionMismatch(res) {\r\n if (res.data !== TRPCONFIG.CurrentVersion) {\r\n _inactivityTime();\r\n }\r\n });\r\n lastAbs = absUrl;\r\n });\r\n }\r\n\r\n function track(type, event, props) {\r\n switch (type) {\r\n case 'mixpanel':\r\n _mixPanelTrack(event, props);\r\n break;\r\n\r\n case 'Search':\r\n _searchCompleted(event, props);\r\n break;\r\n\r\n case 'Event':\r\n _pushTripTypeToDataLayer().then(() => window.dataLayer.push(_.assignIn({ event }, props)));\r\n break;\r\n\r\n case 'mixpanelPeople':\r\n _trackPeople(event, props);\r\n break;\r\n\r\n case 'eCommerce':\r\n _ecommerce(event, props);\r\n break;\r\n\r\n case 'eCommercePaypal':\r\n _ecommercePaypal(event, props);\r\n break;\r\n }\r\n }\r\n\r\n function _ecommerce(event, data) {\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommerceLogEnabled) {\r\n console.log('ecommerce data', _collectEcommerceData(event, data));\r\n }\r\n\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommercePushEnabled) {\r\n const ecommerceData = _collectEcommerceData(event, data);\r\n\r\n sessionStorage.setItem('eCommercePurchaseData', JSON.stringify(ecommerceData));\r\n }\r\n }\r\n\r\n function _ecommercePaypal(event, paypalData) {\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommerceLogEnabled) {\r\n console.log('ecommerce paypal data', _collectEcommercePaypalData(event, paypalData));\r\n }\r\n\r\n if (TRPCONFIG.Domain2.BookingCompleteEcommercePushEnabled) {\r\n const ecommercePaypalData = _collectEcommercePaypalData(event, paypalData);\r\n\r\n window.dataLayer.push(ecommercePaypalData);\r\n }\r\n }\r\n\r\n function _collectEcommerceData(event, data) {\r\n return {\r\n event,\r\n ecommerce: {\r\n purchase: {\r\n actionField: _collectActionData(data, ({ BookingReferences, Trip }) => ({\r\n id: BookingReferences.sort()[0],\r\n revenue: Math.round(Trip.Bookings.reduce((acc, { Balance }) => acc + Balance.ClientTotalCost, 0) * 100) / 100\r\n })),\r\n products: _collectProductData(data, ({ Trip }) => Trip.Bookings.map(({ Balance, BookingCore, Itinerary }) => {\r\n const { BookingRef } = BookingCore;\r\n const category = _getCategoryFromBookingRef(BookingRef);\r\n const name = {\r\n Accommodation: ({ Stays: [FirstStay] }) => FirstStay.Hotel.Title,\r\n Flight: ({ Flights: [OutboundFlight] }) => OutboundFlight.Segments[OutboundFlight.Segments.length - 1].ArrivalAirport.Title,\r\n Transfer: ({ Transfers }) => _getTransferName(Transfers),\r\n Insurance: ({ Description }) => Description,\r\n Car: ({ PickUpPointName, DropOffPointName }) => `${PickUpPointName} ${DropOffPointName}`,\r\n Attractions: ({ Tickets: [FirstTicket] }) => FirstTicket.Description,\r\n Parking: ({ ParkingSiteName }) => ParkingSiteName\r\n }[category](Itinerary);\r\n return {\r\n id: BookingRef,\r\n category,\r\n name,\r\n price: Balance.ClientTotalCost\r\n };\r\n }))\r\n }\r\n }\r\n };\r\n }\r\n\r\n function _collectEcommercePaypalData(event, data) {\r\n return {\r\n event,\r\n ecommerce: {\r\n purchase: {\r\n actionField: _collectActionData(data, data => {\r\n const reducedData = data.reduce((acc, { Ref, Cost }) => {\r\n acc.id.push(Ref);\r\n acc.revenue += Cost;\r\n return acc;\r\n }, {\r\n id: [],\r\n revenue: 0\r\n });\r\n return {\r\n id: reducedData.id.sort()[0],\r\n revenue: Math.round(reducedData.revenue * 100) / 100,\r\n };\r\n }),\r\n products: _collectProductData(data, data => data.map(({ Cost, Desc, Ref }) => {\r\n const category = _getCategoryFromBookingRef(Ref);\r\n return {\r\n id: Ref,\r\n category,\r\n name: Desc,\r\n price: Cost\r\n };\r\n }))\r\n }\r\n }\r\n };\r\n }\r\n\r\n function _collectActionData(data, _collectActionVariations) {\r\n const variations = _collectActionVariations(data);\r\n return {\r\n ...variations,\r\n affiliation: TRPCONFIG.Domain.DomainId,\r\n tax: '0',\r\n shipping: '',\r\n coupon: ''\r\n };\r\n }\r\n\r\n function _collectProductData(data, _collectProductVariations) {\r\n const variations = _collectProductVariations(data);\r\n const products = variations.map(variation => ({\r\n ...variation,\r\n quantity: 1\r\n }));\r\n const holidayCategories = [{ category: 'Accommodation' }, { category: 'Flight' }];\r\n const holidayComparator = (a, b) => a.category === b.category;\r\n const holidayCollection = _.intersectionWith(products, holidayCategories, holidayComparator);\r\n if (holidayCollection.length === holidayCategories.length) {\r\n const category = 'Holiday';\r\n const holidayData = holidayCollection.reduce((acc, { id, name, price }) => {\r\n acc.id.push(id);\r\n acc.name.push(name);\r\n acc.price += price;\r\n return acc;\r\n }, {\r\n id: [],\r\n name: [],\r\n price: 0,\r\n });\r\n return _.concat({\r\n id: holidayData.id.join('|'),\r\n category,\r\n name: holidayData.name.join('|'),\r\n price: Math.round(holidayData.price * 100) / 100,\r\n quantity: 1\r\n }, _.differenceWith(products, holidayCategories, holidayComparator));\r\n }\r\n return products;\r\n }\r\n\r\n function _getCategoryFromBookingRef(bookingRef) {\r\n return {\r\n ACM: 'Accommodation',\r\n SCH: 'Flight',\r\n EUF: 'Flight',\r\n TRN: 'Transfer',\r\n INS: 'Insurance',\r\n AUT: 'Car',\r\n OLF: 'Attractions',\r\n PRK: 'Parking'\r\n }[_getBookingPrefixFromBookingRef(bookingRef)];\r\n }\r\n\r\n function _getBookingPrefixFromBookingRef(bookingRef) {\r\n return bookingRef.match(/[a-zA-Z]+/g)[0];\r\n }\r\n\r\n function _getTransferName([itinerary]) {\r\n if (itinerary.DropOffPoint && itinerary.PickUpPoint) {\r\n return `${itinerary.DropOffPoint.ResortName} | Return`;\r\n }\r\n if (itinerary.DropOffPoint) {\r\n return `${itinerary.DropOffPoint.ResortName} | One way (Resort to Airport)`;\r\n }\r\n if (itinerary.PickUpPoint) {\r\n return `${itinerary.PickUpPoint.AirportName} | One way (Airport to Resort)`;\r\n }\r\n }\r\n\r\n function _pushTripTypeToDataLayer() {\r\n const tripId = $route && $route.current && $route.current.params && $route.current.params.tripId;\r\n if (tripId) {\r\n return tripService.getTrip(tripId).then(t => {\r\n if (t && t.TripType) {\r\n window.dataLayer.push({ tripType: t.TripType });\r\n }\r\n });\r\n }\r\n return $q.when();\r\n }\r\n\r\n function _searchCompleted(event, props) {\r\n const config = {\r\n event: searchTypes[event],\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n CountryCode: 'UK'\r\n };\r\n\r\n window.dataLayer.push(_.assignIn(config, props));\r\n }\r\n\r\n let mixPanelBookingInfoPropsCache = {};\r\n\r\n function _mixPanelTrack(event, props) {\r\n _mixPanelReady.then(() => {\r\n if (props == null) {\r\n window.mixpanel.track(event);\r\n } else {\r\n let formattedProps;\r\n\r\n switch (event) {\r\n case 'Search':\r\n formattedProps = _formatMixpanelSearch(props);\r\n break;\r\n case 'BookingComplete':\r\n case 'BookingForm':\r\n mixPanelBookingInfoPropsCache = formattedProps = _formatMixpanelBookingInfo(props);\r\n break;\r\n case 'FormValidation':\r\n formattedProps = _formatMixpanelFormValidation(props, mixPanelBookingInfoPropsCache);\r\n break;\r\n default:\r\n formattedProps = _flattenObject(props);\r\n }\r\n\r\n window.mixpanel.track(event, formattedProps);\r\n }\r\n });\r\n }\r\n\r\n function _flattenObject(obj) {\r\n const newObj = {};\r\n\r\n if (typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n for (const i in obj) {\r\n if (!obj.hasOwnProperty(i)) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(obj[i])) {\r\n newObj[i] = [];\r\n for (let j = 0; j < obj[i].length; j++) {\r\n newObj[i].push(_flattenObject(obj[i][j]));\r\n }\r\n } else if ((typeof obj[i]) === 'object') {\r\n const flatObject = _flattenObject(obj[i]);\r\n for (const x in flatObject) {\r\n if (!flatObject.hasOwnProperty(x)) {\r\n continue;\r\n }\r\n newObj[`${i}.${x}`] = flatObject[x];\r\n }\r\n } else {\r\n newObj[i] = obj[i];\r\n }\r\n }\r\n return newObj;\r\n }\r\n\r\n function _formatMixpanelSearch(search) {\r\n const counts = { Adults: 0, Children: 0, Rooms: 0 };\r\n const Nights = search.Nights;\r\n const DepartureAirports = search.DepartureAirports;\r\n const TypeTitle = search.TypeTitle;\r\n const Destination = _.pick(search.Destination, 'CountryId', 'LocationId', 'PlaceId', 'PolygonId', 'ProvinceId', 'EstablishmentId', 'ShortTitle');\r\n const dateTimeFormat = 'dd MMM yyyy HH:mm';\r\n const FromDate = search.FromDate ? unadjustedDateFilter(search.FromDate.Date, dateTimeFormat) : undefined;\r\n const ToDate = search.ToDate ? unadjustedDateFilter(search.ToDate.Date, dateTimeFormat) : undefined;\r\n\r\n if (search.Rooms) {\r\n search.Rooms.reduce((c, r) => {\r\n c.Adults += r.Adults;\r\n c.Children += (r.ChildAges || []).length;\r\n c.Rooms += 1;\r\n return c;\r\n }, counts);\r\n }\r\n\r\n const result = _.assignIn({\r\n Nights,\r\n TypeTitle,\r\n DepartureAirports,\r\n FromDate,\r\n ToDate,\r\n }, counts, Destination);\r\n\r\n if (search.SearchType === 3 || search.SearchType === 1) {\r\n const cabinId = search.Cabin || _.get(search, 'searchModel.cabin');\r\n result.Cabin = ({ 1: 'Economy', 2: 'PremiumEconomy', 8: 'Business', 4: 'First' })[cabinId];\r\n\r\n result.FlexibleDates = _.get(search, 'searchModel.flexibleDates');\r\n if (angular.isUndefined(result.FlexibleDates)) {\r\n result.FlexibleDates = searchUnitService.flexibleDates;\r\n }\r\n\r\n if (search.searchModel) {\r\n result.CarrierAirlines = _.map(search.searchModel.airlines, a => a.Title);\r\n result.DirectFlightsOnly = search.searchModel.prefilterDirectFlights;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function _formatMixpanelBookingInfo(data) {\r\n const result = {\r\n TotalCost: data.TotalCost,\r\n HasHotel: !!(data.Hotel && data.Hotel.ProductId),\r\n HasFlight: !!(data.Flight && data.Flight.ProductId),\r\n HasBags: !!_.get(data, 'Flight.ProductSpecificFields.OptionCounts.HoldBags'),\r\n HasSeats: !!_.get(data, 'Flight.ProductSpecificFields.OptionCounts.Seats'),\r\n HasAttraction: !!(data.Attractions && data.Attractions.length > 0),\r\n HasCarHire: !!(data.CarHire && data.CarHire.ProductId),\r\n HasInsurance: !!(data.Insurance && data.Insurance.ProductId),\r\n HasParking: !!(data.Parking && data.Parking.ProductId),\r\n HasTransfer: !!(data.Transfer && data.Transfer.ProductId),\r\n HasMarhaba: !!(data.Marhaba && data.Marhaba.ProductId),\r\n PageVersion: data.PageVersion || null, //not on BookingComplete props\r\n Source: data.Source || 'default'\r\n };\r\n\r\n if (result.HasTransfer === true) {\r\n result.TransferCostTotal = _.reduce(data.Transfer.CostBreakdown,\r\n (result, v) => result + (v.UnitAmount * v.Quantity),\r\n 0\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n function _formatMixpanelFormValidation(props, mixPanelBookingInfoPropsCache) {\r\n const result = _.merge({}, mixPanelBookingInfoPropsCache);\r\n const uniqueErrors = {};\r\n iterate(props.form, 0);\r\n result.ValidationFail = Object.keys(uniqueErrors);\r\n _.forEach(props.validationMessages, m => result.ValidationFail.push(m));\r\n return result;\r\n\r\n function iterate(element, stackDepth) {\r\n if (element && stackDepth < 5) {\r\n _.forEach(element.$error, (error, key) => {\r\n if (error === true) {\r\n key = key.replace('If', '');\r\n key = `${key} - ${element.$name}`;\r\n uniqueErrors[key] = true;\r\n } else {\r\n _.forEach(error, iterate, stackDepth + 1);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n let _inactivityTimeToken;\r\n function _inactivityTime() {\r\n if (!_inactivityTimeToken) {\r\n $(document)\r\n .on('mousemove', _resetTimer)\r\n .on('keypress', _resetTimer);\r\n $(document.body)\r\n .on('touchstart', _resetTimer)\r\n .on('touchmove', _resetTimer)\r\n .on('touchend', _resetTimer);\r\n _resetTimer();\r\n }\r\n function _reload() {\r\n document.location.reload();\r\n }\r\n function _resetTimer() {\r\n clearTimeout(_inactivityTimeToken);\r\n _inactivityTimeToken = setTimeout(_reload, 10 * 1000);\r\n }\r\n }\r\n\r\n function _trackPeople(event, props) {\r\n _mixPanelReady.then(() => {\r\n switch (event) {\r\n case 'Search':\r\n _trackPeopleSearch(props);\r\n break;\r\n case 'BookingComplete':\r\n _trackPeopleBookingCompleter(props);\r\n break;\r\n }\r\n });\r\n }\r\n\r\n function _trackPeopleSearch(props) {\r\n window.mixpanel.people.increment('Total Searches');\r\n window.mixpanel.people.set({ 'Last Search Date': new Date() });\r\n if (props.Destination) {\r\n window.mixpanel.people.append('Search terms', props.Destination.ShortTitle ? props.Destination.ShortTitle : props.Destination.Title);\r\n }\r\n }\r\n\r\n function _trackPeopleBookingCompleter(props) {\r\n window.mixpanel.people.increment('Bookings Completed');\r\n window.mixpanel.people.append('Total value per booking', props.TotalCost);\r\n window.mixpanel.people.increment('Lifetime value', props.TotalCost);\r\n }\r\n\r\n function incrementPeopleEvent(event, value = 1) {\r\n _mixPanelReady.then(() => window.mixpanel.people.increment(event, value));\r\n }\r\n\r\n function setMixpanelEmail(email) {\r\n _mixPanelReady.then(() => window.mixpanel.people.set({\r\n $email: email\r\n }));\r\n }\r\n\r\n trackRequestedHotelNotAvailable.idCache = {};\r\n function trackRequestedHotelNotAvailable(destinationEstabId) {\r\n if (!trackRequestedHotelNotAvailable.idCache[destinationEstabId]) {\r\n trackRequestedHotelNotAvailable.idCache[destinationEstabId] = true;\r\n track('mixpanel', 'RequestedHotelNotAvailable', { destinationEstabId });\r\n }\r\n }\r\n\r\n function subscribeOnceAsPromise(topic) {\r\n return $q(resolve => broker.subscribeOnce('analytics', topic, () => resolve()));\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\n// Not at all happy about hard-coding these, but the api is still outstanding: API-827\r\nconst localAirports = (function() {\r\n if (TRPCONFIG.Domain.EnableStaticDepartureAirports) {\r\n return [\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,STN' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' }\r\n ];\r\n }\r\n if (TRPCONFIG.Domain.DomainId === 2) {\r\n return [\r\n { Title: 'Belfast and Dublin - All Airports', Code: 'BFS,BHD,DUB' },\r\n { Title: 'Ireland - All Airports', Code: 'BHD,BFS,ORK,LDY,KIR,NOC,DUB,CFN,SNN' },\r\n { Title: 'Belfast City', Code: 'BHD' },\r\n { Title: 'Belfast International', Code: 'BFS' },\r\n { Title: 'Dublin', Code: 'DUB' },\r\n { Title: 'Cork', Code: 'ORK' },\r\n { Title: 'Derry', Code: 'LDY' },\r\n { Title: 'Donegal', Code: 'CFN' },\r\n { Title: 'Kerry', Code: 'KIR' },\r\n { Title: 'Knock', Code: 'NOC' },\r\n { Title: 'Shannon', Code: 'SNN' },\r\n //{ Title: 'Waterford', Code: 'WAT' },\r\n\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,LTN,SEN,STN,LCY' },\r\n { Title: 'Midlands - All Airports', Code: 'BHX,EMA' },\r\n { Title: 'North West - All Airports', Code: 'LPL,MAN' },\r\n { Title: 'North East - All Airports', Code: 'DSA,HUY,LBA,MME,NCL' },\r\n { Title: 'South East - All Airports', Code: 'LGW,LHR,SOU' },\r\n { Title: 'South West - All Airports', Code: 'BOH,BRS,CWL,EXT,NQY,SOU' },\r\n { Title: 'Scotland - All Airports', Code: 'ABZ,EDI,GLA,INV,PIK' },\r\n\r\n { Title: 'Aberdeen (ABZ)', Code: 'ABZ' },\r\n { Title: 'Belfast City George Best (BHD)', Code: 'BHD' },\r\n { Title: 'Belfast International (BFS)', Code: 'BFS' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Bournemouth (BOH)', Code: 'BOH' },\r\n { Title: 'Bristol (BRS)', Code: 'BRS' },\r\n { Title: 'Cardiff (CWL)', Code: 'CWL' },\r\n { Title: 'Derry (LDY)', Code: 'LDY' },\r\n { Title: 'Dublin (DUB)', Code: 'DUB' },\r\n { Title: 'Durham Tees Valley (MME)', Code: 'MME' },\r\n { Title: 'East Midlands (EMA)', Code: 'EMA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' },\r\n { Title: 'Exeter (EXT)', Code: 'EXT' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Glasgow Prestwick (PIK)', Code: 'PIK' },\r\n { Title: 'Guernsey (GCI)', Code: 'GCI' },\r\n { Title: 'Humberside (HUY)', Code: 'HUY' },\r\n { Title: 'Inverness (INV)', Code: 'INV' },\r\n { Title: 'Isle of Man (IOM)', Code: 'IOM' },\r\n { Title: 'Jersey (JER)', Code: 'JER' },\r\n { Title: 'Leeds (LBA)', Code: 'LBA' },\r\n { Title: 'Liverpool John Lennon (LPL)', Code: 'LPL' },\r\n { Title: 'London City (LCY)', Code: 'LCY' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Luton (LTN)', Code: 'LTN' },\r\n { Title: 'London Southend (SEN)', Code: 'SEN' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Newquay (NQY)', Code: 'NQY' },\r\n { Title: 'Norwich (NWI)', Code: 'NWI' },\r\n { Title: 'Robin Hood Airport Doncaster (DSA)', Code: 'DSA' },\r\n { Title: 'Southampton (SOU)', Code: 'SOU' }\r\n ];\r\n }\r\n return [\r\n { Title: 'London - All Airports', Code: 'LGW,LHR,LTN,SEN,STN,LCY' },\r\n { Title: 'Midlands - All Airports', Code: 'BHX,EMA' },\r\n { Title: 'North West - All Airports', Code: 'LPL,MAN' },\r\n { Title: 'North East - All Airports', Code: 'DSA,HUY,LBA,MME,NCL' },\r\n { Title: 'South East - All Airports', Code: 'LGW,LHR,SOU' },\r\n { Title: 'South West - All Airports', Code: 'BOH,BRS,CWL,EXT,NQY,SOU' },\r\n { Title: 'Scotland - All Airports', Code: 'ABZ,EDI,GLA,INV,PIK' },\r\n { Title: 'Belfast and Dublin - All Airports', Code: 'BFS,BHD,DUB' },\r\n\r\n { Title: 'Aberdeen (ABZ)', Code: 'ABZ' },\r\n { Title: 'Belfast City George Best (BHD)', Code: 'BHD' },\r\n { Title: 'Belfast International (BFS)', Code: 'BFS' },\r\n { Title: 'Birmingham (BHX)', Code: 'BHX' },\r\n { Title: 'Bournemouth (BOH)', Code: 'BOH' },\r\n { Title: 'Bristol (BRS)', Code: 'BRS' },\r\n { Title: 'Cardiff (CWL)', Code: 'CWL' },\r\n { Title: 'Derry (LDY)', Code: 'LDY' },\r\n { Title: 'Dublin (DUB)', Code: 'DUB' },\r\n { Title: 'Durham Tees Valley (MME)', Code: 'MME' },\r\n { Title: 'East Midlands (EMA)', Code: 'EMA' },\r\n { Title: 'Edinburgh (EDI)', Code: 'EDI' },\r\n { Title: 'Exeter (EXT)', Code: 'EXT' },\r\n { Title: 'Glasgow (GLA)', Code: 'GLA' },\r\n { Title: 'Glasgow Prestwick (PIK)', Code: 'PIK' },\r\n { Title: 'Guernsey (GCI)', Code: 'GCI' },\r\n { Title: 'Humberside (HUY)', Code: 'HUY' },\r\n { Title: 'Inverness (INV)', Code: 'INV' },\r\n { Title: 'Isle of Man (IOM)', Code: 'IOM' },\r\n { Title: 'Jersey (JER)', Code: 'JER' },\r\n { Title: 'Leeds (LBA)', Code: 'LBA' },\r\n { Title: 'Liverpool John Lennon (LPL)', Code: 'LPL' },\r\n { Title: 'London City (LCY)', Code: 'LCY' },\r\n { Title: 'London Gatwick (LGW)', Code: 'LGW' },\r\n { Title: 'London Heathrow (LHR)', Code: 'LHR' },\r\n { Title: 'London Luton (LTN)', Code: 'LTN' },\r\n { Title: 'London Southend (SEN)', Code: 'SEN' },\r\n { Title: 'London Stansted (STN)', Code: 'STN' },\r\n { Title: 'Manchester (MAN)', Code: 'MAN' },\r\n { Title: 'Newcastle (NCL)', Code: 'NCL' },\r\n { Title: 'Newquay (NQY)', Code: 'NQY' },\r\n { Title: 'Norwich (NWI)', Code: 'NWI' },\r\n { Title: 'Robin Hood Airport Doncaster (DSA)', Code: 'DSA' },\r\n { Title: 'Southampton (SOU)', Code: 'SOU' }\r\n ];\r\n})();\r\n\r\nangular\r\n .module('TR')\r\n .service('autocompleter', autocompleter);\r\n\r\nfunction autocompleter($http,\r\n $q,\r\n $filter,\r\n $route,\r\n globalisationService) {\r\n const domain = TRPCONFIG.Domain;\r\n const httpStatus = { BadRequest: 400 };\r\n let airports = null;\r\n\r\n const service = {\r\n lookup,\r\n initialDepartureAirports\r\n };\r\n\r\n function _filteredAirports(prefix) {\r\n if (airports) {\r\n const d = $q.defer();\r\n d.resolve({\r\n data: $filter('filter')(airports, prefix),\r\n prefix\r\n });\r\n return d.promise;\r\n }\r\n\r\n return $http.post('/api3/transfers/airports/get', {\r\n CultureCode: domain.CultureCode,\r\n DomainId: domain.DomainId\r\n }).then(function(result) {\r\n airports = result.data.Airports;\r\n return {\r\n data: $filter('filter')(airports, prefix),\r\n prefix\r\n };\r\n });\r\n }\r\n\r\n function lookup(type, prefix, filterFunction) {\r\n //Use filterFunction returned data as promise incase if it presents and ignore everything else.\r\n if (filterFunction) {\r\n return $q.when({\r\n data: filterFunction({ prefix }),\r\n prefix\r\n });\r\n }\r\n if (!type) {\r\n throw new Error('type have not been supplied');\r\n }\r\n return _lookup(type, prefix).then(result => {\r\n if (result && _.isArray(result.data)) {\r\n _.forEach(result.data, d => d.searchLookupType = type);\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n function _autoCompleterApiCall(url, prefix) {\r\n return globalisationService.getSelectedRegionalContext()\r\n .then(regionalContext => $http.get(url + $.param({\r\n TenantId: TRPCONFIG.Domain.TenantId,\r\n PointOfSaleId: regionalContext.PointOfSale.Id,\r\n CultureCode: regionalContext.Language.Code,\r\n MaxResults: 15,\r\n Term: prefix\r\n }), { ignoreErrors: true })\r\n );\r\n }\r\n\r\n function _getDepartureAirportsByPointOfSale(prefix) {\r\n return _autoCompleterApiCall('/api/flights/autocompleter/departureairports?', prefix);\r\n }\r\n\r\n function _lookup(type, prefix) {\r\n if (type === 'transfers') {\r\n return _filteredAirports(prefix);\r\n } else if (type === 'marhaba') {\r\n return $http.post('/api2/marhaba/airports/getairports', {\r\n CultureCode: domain.CultureCode,\r\n SearchTerm: prefix\r\n }).then(function(result) {\r\n return {\r\n data: result.data.Airports,\r\n prefix\r\n };\r\n });\r\n } else if (type === 'parking') {\r\n return $http\r\n .post('/api2/airportparking/airports/get')\r\n .then(result => {\r\n const filteredResult = $filter('filter')(result.data.Airports, prefix);\r\n return {\r\n data: _.map(filteredResult, a => {\r\n // Have to map `AirportCode` to `Code`\r\n if (a.AirportCode) {\r\n a.Code = a.AirportCode;\r\n delete a.AirportCode;\r\n }\r\n return a;\r\n }),\r\n prefix\r\n };\r\n });\r\n } else if (type === 'flights-departure' && TRPCONFIG.Domain.LimitDepartureAirportsToLocalOnly) {\r\n let airports = prefix ? $filter('filter')(localAirports, { Title: prefix }) : localAirports;\r\n airports = buildUpChildAirports(airports);\r\n return $q.when(mapDepartureAirports(airports, prefix));\r\n } else if (['flights-departure', 'flights-destination', 'flights'].indexOf(type) > -1) {\r\n if (TRPCONFIG.Domain.PointOfSaleAutocompleterEnabled) {\r\n return _getDepartureAirportsByPointOfSale(prefix).then(r => {\r\n return mapDepartureAirports(r.data.d.map(a => {\r\n return { Title: a.t, Code: a.v };\r\n }), prefix);\r\n });\r\n }\r\n const postData = {\r\n SearchTerm: prefix,\r\n MaxResults: 15,\r\n CultureCode: domain.CultureCode,\r\n RestrictToFlightDestinations: false\r\n };\r\n return $http\r\n .post('/api2/flights/static/getdestinationairports', postData)\r\n .then(result => mapDepartureAirports(result.data.Airports, prefix));\r\n } else if (type === 'non-grouped-airports') {\r\n return _lookup('flights', prefix).then(res => {\r\n res.data = res.data.filter(airport => airport.Code.indexOf(',') === -1);\r\n return res;\r\n });\r\n } else if (type === 'businesscustomers') {\r\n return $http\r\n .get(`${TRPCONFIG.AutocompleterClientDomain}/api2/businesscustomers/get?${$.param({\r\n DomainId: domain.DomainId,\r\n MaxResults: 400,\r\n MaxStringDistance: 4,\r\n CultureCode: domain.CultureCode,\r\n SearchTerm: prefix\r\n })}`)\r\n .then(function(result) {\r\n return {\r\n data: result.data,\r\n prefix\r\n };\r\n });\r\n } else if (type === 'travelAgents') {\r\n return $http\r\n .get(`${TRPCONFIG.AutocompleterClientDomain}/api2/travelagents/search?${$.param({\r\n tenantId: TRPCONFIG.Domain.TenantId,\r\n pageSize: 10,\r\n searchQuery: prefix\r\n })}`, { ignoreErrors: true })\r\n .then(result => {\r\n return {\r\n data: result.data.map(t => { t.Title = t.Name; return t; }),\r\n prefix\r\n };\r\n }, error => {\r\n if (error.status === httpStatus.BadRequest) {\r\n return { data: [], prefix };\r\n }\r\n });\r\n } else if ('attractions' === type) {\r\n return $http.post(`${TRPCONFIG.AutocompleterClientDomain}/api2/attractions/bookingfunnel/find`, {\r\n DestinationId: TRPCONFIG.Domain.DomainId,\r\n Fragment: prefix,\r\n TenantId: TRPCONFIG.Domain.TenantId\r\n }).then(function(result) {\r\n return {\r\n data: result.data,\r\n prefix\r\n };\r\n });\r\n } else if (type === 'resorts') {\r\n return _autoCompleterApiCall('/api/hotels/autocompleter/transferdestinations?', prefix)\r\n .then(function(result) {\r\n if (result && result.data && result.data.d) {\r\n return {\r\n data: result.data.d.map(d => {\r\n d.Title = d.t;\r\n d.Code = d.v.i;\r\n d.Type = d.v.t;\r\n return d;\r\n }),\r\n prefix\r\n };\r\n }\r\n });\r\n } else if (type === 'userAccounts') {\r\n const nameParts = prefix.split(' ');\r\n const params = {\r\n tenantId: TRPCONFIG.Domain.TenantId,\r\n pageSize: 10,\r\n firstName: nameParts[0] || '',\r\n lastName: nameParts[1] || ''\r\n };\r\n return $http\r\n .get(`${TRPCONFIG.AutocompleterClientDomain}/api2/useraccounts/search?${$.param(params)}`)\r\n .then(function(result) {\r\n if (result && result.data && result.data.Results) {\r\n return {\r\n data: result.data.Results.map(t => {\r\n t.Title = `${t.FirstName} ${t.LastName}`;\r\n return t;\r\n }),\r\n prefix\r\n };\r\n }\r\n });\r\n }\r\n\r\n return $http\r\n .get(`${TRPCONFIG.AutocompleterClientDomain}/api/destinationsautocompleter/search?${$.param({\r\n SearchTerm: prefix,\r\n MaxResults: 15,\r\n CultureCode: domain.CultureCode,\r\n HolidaySearch: type === 'holidays',\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n v: TRPCONFIG.CurrentVersion\r\n })}`, { ignoreErrors: true })\r\n .then(function(result) {\r\n return {\r\n data: result.data.Destinations,\r\n prefix\r\n };\r\n });\r\n }\r\n\r\n function mapDepartureAirports(airports, prefix) {\r\n if ($route.current.noGroup) {\r\n airports =\r\n airports.filter(function removeGroups(cv) {\r\n return cv.Code.indexOf(',') === -1;\r\n });\r\n }\r\n return {\r\n data: _.map(airports, a => {\r\n if (a.Title) {\r\n a.ShortTitle = a.Title.indexOf(',') >= 0 ? a.Title.split(',')[0] : a.Title;\r\n }\r\n a.icon = 'flights';\r\n return a;\r\n }),\r\n prefix\r\n };\r\n }\r\n\r\n function initialDepartureAirports() {\r\n const airports = buildUpChildAirports(localAirports);\r\n return $q.when(mapDepartureAirports(airports, ''));\r\n }\r\n\r\n function buildUpChildAirports(airports) {\r\n let result = [];\r\n _.forEach(airports, a => {\r\n result.push(a);\r\n const codes = a.Code.split(',');\r\n if (codes.length > 1) {\r\n a.isGroup = true;\r\n _.forEach(codes, c => {\r\n let match = _.find(localAirports, a => a.Code === c);\r\n if (match) {\r\n match = angular.copy(match);\r\n match.isChild = true;\r\n result.push(match);\r\n } else {\r\n console.log('match could not be found for ', a.Code);\r\n }\r\n });\r\n }\r\n });\r\n result = result.filter(a => {\r\n if (a.isChild || a.isGroup) {\r\n return true;\r\n }\r\n return !_.some(result, aa => aa.isChild && aa.Code === a.Code);\r\n });\r\n return result;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('baggageService', baggageService);\n\nfunction baggageService(occupancyService, tripService, basketStore) {\n const service = {\n getBaggageInfo\n };\n\n function getBaggageInfo(tripId) {\n return tripService.getTrip(tripId).then(trip => {\n if (trip == null) {\n return [];\n }\n return basketStore.flightSpecificInfo(trip.BasketId).then(flightDetail => {\n if (flightDetail) {\n return _.map(flightDetail.Sectors, sector => mapBaggageInfo(trip, sector));\n }\n return [];\n });\n });\n }\n\n function mapBaggageInfo(trip, sector) {\n const bagInfo = {\n holdBagsIncluded: false,\n holdBagCount: 0,\n passengerHoldBags: []\n };\n\n const flight = trip.FlightsRequest && trip.FlightsRequest.SelectedFlight || {};\n bagInfo.holdBagsIncluded = flight.LeadBaggagePrice === 0;\n\n if (bagInfo.holdBagsIncluded) {\n bagInfo.holdBagCount = occupancyService.getNumberOfNonInfantPassengers() || 1;\n } else {\n if (sector && sector.PassengerBagCounts) {\n bagInfo.holdBagCount = _.reduce(sector.PassengerBagCounts, (total, bags) => total + bags.Quantity, 0);\n bagInfo.passengerHoldBags = sector.PassengerBagCounts || [];\n }\n if (flight.AllBagsOrNone && bagInfo.holdBagCount > 0) {\n bagInfo.holdBagCount = occupancyService.getNumberOfNonInfantPassengers() || 1;\n }\n }\n return bagInfo;\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\n/*\n For the moment the basket service is going to fulfill the workflow role\n i.e. it will act like a state machine to control the transitions that we require\n This might turn out to be wrong but we have no better way to track that state\n at the moment.\n*/\n\nangular\n .module('TR')\n .service('basketService', basketService);\n\nfunction basketService($location,\n $q,\n $routeParams,\n $timeout,\n $rootScope,\n $filter,\n analytics,\n attractionService,\n basketStore,\n bookingService,\n broker,\n carHireService,\n changeDurationPopupService,\n cookieService,\n criteoService,\n currentDestination,\n dateUtil,\n enumService,\n flightSearch,\n flightsTerminalService,\n guidService,\n holidaySearch,\n hotelSearch,\n hotelService,\n insuranceService,\n loggingService,\n marhabaSearch,\n multiSectorSearch,\n parkingService,\n resourceService,\n savedSearchService,\n searchUnitService,\n transferSearch,\n tripService,\n urlUtils,\n windowUtil,\n $window,\n urlStoreService,\n mandatoryTransferService\n ) {\n const holidayBooking = 0;\n const hotelBooking = 1;\n const transferBooking = 2;\n const marhabaBooking = 3;\n const flightBooking = 4;\n const parkingBooking = 6;\n const attractionsBooking = 7;\n const insuranceBooking = 9;\n const autoSearch = 10;\n\n const workflowType = {\n 1: flightBooking,\n 2: hotelBooking,\n 3: holidayBooking,\n 4: transferBooking,\n 6: parkingBooking\n };\n\n let flightUnavailable = false;\n let flightIncompleteDates = false;\n let holidaySearchProgress;\n let flightChanged = true;\n let oldAndNewFlightDatesMatch = false;\n\n broker.subscribe('basketService', 'flightNotAvailable', function(e) {\n flightUnavailable = true;\n tripService.getTrip(e.data)\n .then(function(trip) {\n const holiday = trip.TripType === tripService.tripTypes.Holiday;\n const flightsRoute = holiday ? 'holidays/flights/' : 'flights/';\n trip.FlightsRequest.SelectedFlight.Unavailable = true;\n tripService.persist(trip.TripId, trip).then(() => $location.url(flightsRoute + trip.TripId));\n });\n });\n\n broker.subscribe('basketService', 'HotelOptionsAllowed', () => TRPCONFIG.DeviceSettings.HotelOptionsEnabled = true);\n\n const service = {\n createTrip,\n hotelBooking,\n holidayBooking,\n transferBooking,\n marhabaBooking,\n flightBooking,\n parkingBooking,\n attractionsBooking,\n insuranceBooking,\n autoSearch,\n workflowType,\n startWorkflow,\n startMultiDestHolidayWorkflow,\n completeWorkflow,\n redirectToComplete,\n selectTransfer,\n selectInsurance,\n selectCar,\n selectParking,\n selectMarhaba,\n prepareMarhabaBooking,\n getHotelUrl,\n selectHotel,\n restartCurrentWorkflow,\n restartHolidayWorkflow,\n getFlight,\n getHotel,\n getInsuranceQuotes,\n updateInsuranceQuote,\n changeFlight,\n getTransfers,\n getCarQuotes,\n getCarQuotesFromSession,\n getParkingQuotes,\n getAttractionQuotes,\n getMarhaba,\n bookBasket,\n bookAttractionsBasket,\n selectHotelRooms,\n selectFlight,\n changeToFlightWorkflow,\n changeToHolidayTripType,\n selectMultiFlight,\n updateBasket,\n updateFlight,\n bookingAlreadyDone,\n waitForFlight,\n changeJourneyUrl,\n getHolidaySearchProgress,\n bookHotelBasket,\n getArea,\n isFlightPreselected,\n getHotelDatesFromFlight,\n getNumberOfNightsFromFlights,\n updateBrandedFare\n };\n\n function changeJourneyUrl(breadcrumb, tripId) {\n const breadcrumbTrail = {\n 0: _changeToHome,\n 5: _changeToDeal,\n 10: _changeToFlight,\n 20: _changeToHotel,\n 21: _changeToRoom,\n 25: _changeToFlight,\n 30: _changeToTransfer,\n 35: _changeToParking,\n 40: _changeToOptions,\n 45: _changeToMarhaba,\n 50: _changeToInsurance\n };\n if (breadcrumbTrail[breadcrumb] != null) {\n return service.getArea(tripId)\n .then(area => breadcrumbTrail[breadcrumb](tripId || $routeParams.tripId || null, area))\n .then(() => handleMultiDestHolidayExit(tripId));\n }\n loggingService.logError(`changeJourneyUrl: breadcrumb: \"${breadcrumb}\" doesnt exist for tripId: \"${$routeParams.tripId}\"`);\n return null;\n }\n\n function getArea(tripId) {\n return tripService.getTrip(tripId || $routeParams.tripId)\n .then(trip => {\n switch (trip.TripType) {\n case 1: //flight\n return 'flights';\n case 2: //hotel\n return 'hotels';\n case 3: //transfer\n return 'transfers';\n case 4: //holiday\n return 'holidays';\n case 5: // marhaba\n return 'marhaba'; // ?\n case 6: // parking\n return 'parking';\n case 9: // insurance\n return 'insurance';\n default:\n return '';\n }\n });\n }\n\n function _startHotelWorkflow(tripId, parameters) {\n sessionStorage.removeItem('preselectedHotelData');\n sessionStorage.removeItem('hasbookingpagevisited');\n sessionStorage.removeItem('PreselectFlight');\n hotelSearch.clearSearchResults(parameters.defaultFilters);\n broker.publish('recommender.startSearch', { searchModel: parameters.searchModel, isHotel: true });\n const errors = hotelSearch.validateSearchCriteria();\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n let createSearchPromise;\n let hotelAvailabilityId;\n let dest;\n let estabId;\n return service.createTrip(tripId, tripService.tripTypes.Hotel)\n .then(() => searchUnitService.updateSearchArea())\n .then(() => {\n broker.publish('newSearchTriggered');\n return parameters.roomSearch ? currentDestination.getCurrentDestination() : searchUnitService.getDestination();\n })\n .then(d => {\n dest = d;\n const customRequest = { TripId: tripId, Destination: dest };\n hotelSearch.buildHotelsRequest(customRequest, searchUnitService.hotel);\n createSearchPromise = hotelSearch.createSearch().then(x => hotelAvailabilityId = x);\n return TRPCONFIG.Domain.ImmediateSearch ? undefined : createSearchPromise;\n })\n .then(() => {\n estabId = parameters.estabId || (dest && dest.EstablishmentId);\n if (parameters.nextUrl !== false) {\n let url = getHotelUrl({\n tripId,\n estabId,\n isRoomSearch: parameters.roomSearch\n });\n $location.url(optionallyAppendParam(url, 'fid', parameters.fid));\n }\n return createSearchPromise;\n })\n .then(() => {\n if (estabId) {\n hotelService.trackHotelClick(estabId, 0, undefined, undefined, hotelAvailabilityId);\n }\n return savedSearchService.saveHotelSearch(tripId);\n })\n .then(() => ({ hotelAvailabilityId, tripId }));\n }\n\n function _startAutoSearchWorkflow(tripId, parameters) {\n const isEstabSearch = _.get(parameters, 'destination[0].Type', 0) === 1;\n return isEstabSearch ? _startHotelWorkflow(tripId, parameters) : _startHolidayWorkflow(tripId, parameters);\n }\n\n function _startHolidayWorkflow(tripId, parameters) {\n return _startFlightPlusWorkflow(tripId, parameters, tripService.tripTypes.Holiday, false)\n .then(() => savedSearchService.saveHolidaySearch(tripId, parameters.searchModel));\n }\n\n function _startChangeableFlightWorkflowWithProgress(tripId, parameters, progress) {\n return _startFlightPlusWorkflow(tripId, parameters, tripService.tripTypes.Flight, true)\n .then(() => savedSearchService.saveFlightSearch(tripId, parameters.searchModel))\n .then(() => progress && progress.resolve())\n .finally(() => progress = null);\n }\n\n function _startFlightPlusWorkflow(tripId, parameters, tripType, isFlexibleTripType) {\n broker.publish('recommender.startSearch', { searchModel: parameters.searchModel, isHotel: false });\n sessionStorage.removeItem('PreselectFlight');\n sessionStorage.removeItem('preselectedHotelData');\n sessionStorage.removeItem('hasbookingpagevisited');\n sessionStorage.removeItem('storeSelectedFlight');\n sessionStorage.removeItem('DefaultFlight');\n sessionStorage.removeItem('BrandedFareCancellations');\n const errors = flightSearch.validateSearchCriteria(true);\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n if (window.location.pathname.includes('flights')) {\n $location.url('');\n }\n\n return holidaySearch.createSearch(parameters)\n .then(({ data }) => {\n const preselectFlight = (data.PreselectFlight !== undefined && data.PreselectFlight\n && data.PackageId === undefined\n && TRPCONFIG.Domain.PreselectFlight\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\n && !TRPCONFIG.Domain.isAgentMode) ||\n (data.PreselectFlight !== undefined\n && data.PreselectFlight\n && data.PackageId === undefined\n && TRPCONFIG.Domain.PreselectFlight\n && TRPCONFIG.Domain.DeviceType === 'Desktop'\n && TRPCONFIG.Domain.isAgentMode\n && TRPCONFIG.Domain.isAgentModePreselectFlightEnabled) ||\n TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled;\n sessionStorage.setItem('PreselectFlight', !!preselectFlight);\n parameters.FlightSearchId = data && data.FlightSearchId;\n return _startFlightWorkflow(\n tripId,\n tripType,\n () => {\n hotelSearch.buildHotelsRequest({\n AvailabilitySearchId: data.HotelSearchId,\n TripId: tripId,\n IsFlightPlus: true\n }, searchUnitService.flight);\n\n hotelSearch.setAirportCodeFilter(null);\n return tripService.recordHotelSearch(tripId, hotelSearch.getAvailabilityRequest())\n .then(() => tripService.setKidsFree(tripId, data.KidsGoFree));\n },\n _.defaults(parameters, { packageId: data.PackageId }),\n isFlexibleTripType\n );\n }\n );\n }\n\n function optionallyAppendParam(path, param, value) {\n const querySymbol = path.indexOf('?') >= 0 ? '&' : '?';\n return value ? `${path}${querySymbol}${param}=${value}` : path;\n }\n\n function _startFlightWorkflow(tripId, flow, hotelSearchFunc, params, isFlexibleTripType) {\n\n const isFlightType = flow === tripService.tripTypes.Flight;\n const isHolidayType = flow === tripService.tripTypes.Holiday;\n if (!isHolidayType) {\n sessionStorage.setItem('PreselectFlight', false);\n }\n let oneWayOnly = !!searchUnitService.isOneWayFlightEnabled() && isFlightType;\n\n if (params != null && params.oneWayOnly != null) {\n oneWayOnly = params.oneWayOnly;\n }\n const errors = flightSearch.validateSearchCriteria(!isFlightType, oneWayOnly);\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n flightSearch.clearSearchResults();\n hotelSearch.clearSearchResults(true);\n const isBestFit =\n (TRPCONFIG.Domain.BestFitFlightSelection || params.packageId && TRPCONFIG.Domain.DestinationBasedPackageRates) &&\n isHolidayType;\n\n return service.createTrip(tripId, flow, null, params.packageId, isFlexibleTripType).then(() => {\n broker.publish('newSearchTriggered');\n if (isBestFit) {\n $location.search('bestfitdeal170', '1');\n }\n\n // Features that are permanently enabled to all users\n const parasolEnabledFeatures = _.get(TRPCONFIG, 'Domain.ParasolEnabledFeatures');\n const includesEnabledFeature = parasolEnabledFeatures && parasolEnabledFeatures.includes('holidays');\n\n // Features that are part of a test and can only be access by authenticated users\n const parasolTestingFeatures = _.get(TRPCONFIG, 'Domain2.ParasolTestingFeatures');\n const includesTestingFeature = parasolTestingFeatures && parasolTestingFeatures.includes('holidays');\n const testUserAuthenticated = cookieService.get('x-v3') === 'true' || cookieService.get('x-v3') === _.get(TRPCONFIG, 'Domain.ParasolVWOTestId');\n\n const isV3HolidayRoute = TRPCONFIG.IsMobileView && (params.packageId === undefined) && (includesEnabledFeature || (testUserAuthenticated && includesTestingFeature));\n const promises = $q.all({\n hotelSearch: hotelSearchFunc ? hotelSearchFunc(tripId) : null,\n flightSearch: flightSearch.search({\n searchId: params.FlightSearchId || guidService.uuid(),\n tripId,\n newSearch: isFlightType,\n oneWayOnly,\n flightOnly: isFlightType,\n flexibleDates: isFlightPreselected() ? false : params.flexibleDates,\n isV3HolidayRoute,\n prefilterAirlines: params.prefilterAirlines,\n postfilterAirlines: params.postfilterAirlines,\n prefilterDirectFlights: params.prefilterDirectFlights,\n sortOrder: _getSortOrder(isBestFit, isFlightPreselected()),\n useSearchUnit: true\n })\n });\n\n return promises.then(data => {\n if (isBestFit || isFlightPreselected()) {\n if (data.flightSearch.CombinedDates.AvailableFlights.length) {\n service.selectFlight(validateNextDayFlight(data.flightSearch.CombinedDates.AvailableFlights), tripId, null, params);\n } else {\n $location.url(optionallyAppendParam(`holidays/flights/${tripId}`, 'fid', params.fid));\n }\n } else if (isHolidayType) {\n $location.url(optionallyAppendParam(`holidays/flights/${tripId}`, 'fid', params.fid));\n } else {\n $location.url(optionallyAppendParam(`flights/${tripId}`, 'fid', params.fid));\n }\n criteoService.enqueue([], 'flightlist', flow);\n });\n });\n }\n\n function _getSortOrder(isBestFit, isHotelFirst) {\n const recommendedSortId = 10;\n const lowestFirstSortId = 1;\n let sortId;\n if (isBestFit) {\n sortId = recommendedSortId;\n } else if (isHotelFirst) {\n sortId = lowestFirstSortId;\n }\n return sortId;\n }\n\n function getCheckInDateForFlight(flightArrival) {\n const landsAfterCutOff = flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff;\n const zeroTime = dateUtil.zeroTime(flightArrival, true);\n return landsAfterCutOff ? zeroTime : dateUtil.addDays(zeroTime, -1, true);\n }\n\n function getCheckOutDateForFlight(flightReturn) {\n if (TRPCONFIG.Domain.ReturnFlightCutOff < 0) {\n return dateUtil.zeroTime(flightReturn, true);\n }\n const departsBeforeCutOff = flightReturn.getHours() < TRPCONFIG.Domain.ReturnFlightCutOff;\n const zeroTime = dateUtil.zeroTime(flightReturn, true);\n return departsBeforeCutOff ? dateUtil.addDays(zeroTime, -1, true) : zeroTime;\n }\n\n function validateNextDayFlight(flights) {\n // To avoid the problem of next day flight causing hotel checkin/checkout dates to be the same\n if (dateUtil.atLeastTwoDaysInTheFuture(flights[0].DepartureDate)) {\n return flights[0];\n }\n\n const validFlight = _.find(flights, f => {\n const legs = f.Legs;\n const flightArrival = dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate);\n const flightReturn = legs.length > 1 ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\n\n return dateUtil.getDifferenceInDays(\n new Date(getCheckInDateForFlight(flightArrival)),\n new Date(getCheckOutDateForFlight(flightReturn))\n ) > 0;\n });\n\n return validFlight;\n }\n\n function _startMultiFlightWorkflow(tripId, params) {\n const errors = multiSectorSearch.validateSearchCriteria(params);\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n\n return createTrip(tripId, tripService.tripTypes.Flight)\n .then(function() {\n $location.path(`multiflights/${tripId}`);\n return multiSectorSearch.search(tripId, params);\n });\n }\n\n function _startTransferWorkflow(tripId, parameters) {\n transferSearch.clearSearchResults();\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\n searchUnitService.setLocationId(null);\n }\n const errors = transferSearch.validateSearchCriteria({ enableTransfersTimeApproval: parameters.enableTransfersTimeApproval });\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n return service.createTrip(tripId, tripService.tripTypes.Transfer).then(function() {\n $location.path(`transfers/${tripId}`);\n return transferSearch.search({ searchId: guidService.uuid(), tripId, newSearch: true, isFlightPlus: false }).then(savedSearchService.saveTransferSearch);\n });\n }\n\n function _startMarhabaWorkflow(tripId) {\n marhabaSearch.clearSearchResults();\n const errors = marhabaSearch.validateSearchCriteria();\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n return service.createTrip(tripId, tripService.tripTypes.Marhaba).then(function() {\n $location.path(`marhaba/${tripId}`);\n return marhabaSearch.search({ searchId: guidService.uuid(), tripId, newSearch: true });\n });\n }\n\n function _startParkingWorkflow(tripId) {\n parkingService.clearSearchResults();\n const errors = parkingService.validateSearchCriteria();\n\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n\n return service.createTrip(tripId, tripService.tripTypes.Parking)\n .then(() => parkingService.getParkingQuotes(tripId))\n .then(() => $location.path(`parking/${tripId}`))\n .then(() => savedSearchService.saveParkingSearch(tripId));\n }\n\n function _startAttractionsWorkflow(params) {\n return basketStore.getAttractionsBasketId()\n .then(basketId => basketStore.addAttraction(params.productId, params.productTags, basketId))\n .then(basketData => {\n if (basketData.error) { return; }\n const changeData = basketData.Change;\n let lineItems = changeData && changeData.New || [];\n if (!lineItems.length) {\n // No new items, check if a product already in the basket was modified\n lineItems = attractionService.getLineItemChanges(basketData);\n }\n return lineItems;\n });\n }\n\n function _startInsuranceWorkflow(tripId) {\n insuranceService.clearSearchResults();\n const errors = insuranceService.validateSearchCriteria();\n if (errors.length > 0) {\n return $q.reject(errors);\n }\n return service.createTrip(tripId, tripService.tripTypes.Insurance).then(function() {\n $location.path(`insurance/results/${tripId}`);\n return insuranceService.search({ searchId: guidService.uuid(), tripId, newSearch: true })\n .then(savedSearchService.saveInsuranceSearch);\n });\n }\n\n function _prepareBooking(tripId, path, v3 = false) {\n return tripService.setBookingId(tripId, guidService.uuid())\n .then(function(trip) {\n return bookingService.prepareBooking(trip.BasketId, trip.BookingId, tripId)\n .then(preparedBooking => {\n if (v3) {\n $window.location.href = `booking/summary/${tripId}?gov=3`;\n } else {\n $location.path(`${path}/${tripId}`);\n }\n return preparedBooking;\n });\n });\n }\n\n function startWorkflow(type, parameters) {\n const tripId = guidService.uuid();\n const requestedUrl = $location.url();\n const source = $routeParams.source;\n\n const result = startWorkflowInternal(type, parameters, tripId);\n\n if (result && type !== attractionsBooking) { // No trip data for attractions\n result.then(() => {\n analytics.trackSearchOrigin(tripId, requestedUrl);\n if (source) {\n $location.search('source', source);\n }\n });\n }\n return result;\n }\n\n async function startMultiDestHolidayWorkflow() {\n try {\n const query = $location.search();\n const variantKey = 'variant';\n const variant = query && variantKey in query && Number(query[variantKey]) || undefined;\n const basket = await basketStore.createBasket(true /* ForHoliday */); // Usually created in `createTrip`\n const basketId = basket.BasketId;\n const tripId = await hotelSearch.createMultiDestHolidaySearch(basketId, variant);\n\n if (basketId && tripId) {\n searchUnitService.setDestination(null);\n const trip = await tripService.getTrip(tripId);\n await tripService.persist(tripId, Object.assign({}, trip, { BasketId: basketId }));\n analytics.trackSearchOrigin(tripId, $location.url());\n $location.path(`/holidays/january-sale/${tripId}`).search(_.omit(query, variantKey));\n }\n } catch (err) {\n loggingService.logError('Multi destination holiday search failed', JSON.stringify(err));\n $location.path('/error');\n }\n }\n\n async function handleMultiDestHolidayExit(tripId = $routeParams.tripId) {\n // Change to holiday type if currently in multi destination holiday flow\n const trip = await tripService.getTrip(tripId);\n if (trip.TripType === tripService.tripTypes.MultiDestHoliday) {\n return tripService.changeTripType(tripId, tripService.tripTypes.Holiday);\n }\n }\n\n function getHolidaySearchProgress() {\n return holidaySearchProgress && holidaySearchProgress.promise || $q.when();\n }\n\n function startWorkflowInternal(type, parameters, tripId) {\n if (!parameters) {\n parameters = {};\n }\n if (type === flightBooking) {\n const flightDestinationKeys = _.keys(searchUnitService.getDestination());\n const isntFlexibleFlightDestination = flightDestinationKeys[0] === 'Title' && flightDestinationKeys.length === 1;\n\n if (parameters.multi) {\n return _startMultiFlightWorkflow(tripId, parameters);\n }\n if (isntFlexibleFlightDestination) {\n return _startFlightWorkflow(tripId, tripService.tripTypes.Flight, null, parameters, false)\n .then(() => savedSearchService.saveFlightSearch(tripId, parameters.searchModel));\n }\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled) {\n holidaySearchProgress = $q.defer();\n return _startChangeableFlightWorkflowWithProgress(tripId, parameters, holidaySearchProgress);\n }\n return _startFlightWorkflow(tripId, tripService.tripTypes.Flight, null, parameters, false)\n .then(() => savedSearchService.saveFlightSearch(tripId, parameters.searchModel));\n }\n if (type === hotelBooking) {\n hotelSearch.setAirportCodeFilter(null);\n return _startHotelWorkflow(tripId, parameters);\n }\n searchUnitService.setDefaultCurrency();\n if (type === holidayBooking) {\n holidaySearchProgress = $q.defer();\n if (parameters.isFlexibleTripType) {\n return _startChangeableFlightWorkflowWithProgress(tripId, parameters, holidaySearchProgress);\n }\n return _startHolidayWorkflow(tripId, parameters)\n .then(() => holidaySearchProgress && holidaySearchProgress.resolve())\n .finally(() => holidaySearchProgress = null);\n }\n if (type === transferBooking) {\n return _startTransferWorkflow(tripId, parameters);\n }\n if (type === marhabaBooking) {\n return _startMarhabaWorkflow(tripId, parameters);\n }\n if (type === parkingBooking) {\n return _startParkingWorkflow(tripId, parameters);\n }\n if (type === attractionsBooking) {\n return _startAttractionsWorkflow(parameters);\n }\n if (type === insuranceBooking) {\n return _startInsuranceWorkflow(tripId, parameters);\n }\n if (type === autoSearch) {\n return _startAutoSearchWorkflow(tripId, parameters);\n }\n }\n\n function createTrip(TripId, TripType, basketId, PackageId, FlexibleTripType) {\n return $q.when(\n basketId ||\n basketStore.createBasket(TripType === tripService.tripTypes.Holiday)\n .then(({ BasketId }) => BasketId)\n )\n .then(BasketId => tripService.persist(TripId, {\n BasketId,\n FlexibleTripType,\n PackageId,\n TripId,\n TripType\n }));\n }\n\n function completeWorkflow(refs, basketId) {\n return $q.all([\n basketStore.all(basketId),\n basketStore.totalCost(basketId),\n basketStore.getBasketCurrency(basketId)\n ]).then(([basket, total, currency]) => {\n broker.publish('bookingComplete', { refs, basket, total, currency });\n return basketStore.clearBasket(basketId).then(() => {\n return [basket, total, currency];\n });\n });\n }\n\n function redirectToComplete(refs, basketId, totalCost, tripId) {\n const refRoute = refs.join('|');\n let url = `/booking/complete/${refRoute}?tripId=${tripId}`;\n if (TRPCONFIG.Domain.BuyNowPayLaterEnabled && totalCost > TRPCONFIG.Domain.BuyNowPayLaterCost) {\n url = `${url}&pl=1`;\n }\n if (TRPCONFIG.Domain.ParasolBookingComplete) {\n //Leave some time for tracking to complete:\n setTimeout(() => window.location = url, 333);\n } else {\n $location.url(url);\n }\n }\n\n function _changeToHome(tripId, area) {\n $location.url(TRPCONFIG.Domain.SearchUnitHomePath + area);\n }\n\n function _changeToDeal(tripId) {\n return tripService.getTrip(tripId).then(trip => {\n if (trip && trip.Deal) {\n $location.url(urlUtils.stripLeadingSlash(trip.Deal.OriginPath));\n }\n });\n }\n\n function _changeToFlight(tripId) {\n return tripService.getTrip(tripId)\n .then(({ FlexibleTripType, TripType, HotelsRequest }) => {\n if (TripType === tripService.tripTypes.MultiDestHoliday ||\n // On the booking form, TripType changes to Holiday so test for Destinations prop\n (HotelsRequest && HotelsRequest.Destinations)) {\n return searchUnitService.setDestination(HotelsRequest.Destination)\n .then(() => startWorkflow(holidayBooking));\n }\n return $location.path(`${TripType === tripService.tripTypes.Holiday && !FlexibleTripType ? 'holidays/' : ''}flights/${tripId}`);\n });\n }\n\n function _changeToHotel(tripId, area) {\n return tripService.setDirectToHotel(tripId, false).then(function() {\n $location.path(`${area}/${area === 'holidays' ? 'hotels/' : ''}${tripId}`);\n });\n }\n\n function _changeToRoom(tripId, area) {\n return tripService.getTrip(tripId).then(function(trip) {\n basketStore.hotel(trip.BasketId).then(function(hotel) {\n $location.path(`${area}/${tripId}/${hotel.Details.Id}`);\n });\n });\n }\n\n function _changeToTransfer(tripId) {\n $location.path(`transfers/${tripId}`);\n }\n\n function _changeToParking(tripId) {\n $location.path(`parking/${tripId}`);\n }\n\n function _changeToMarhaba(tripId) {\n $location.path(`marhaba/${tripId}`);\n }\n\n function _changeToInsurance(tripId) {\n $location.path(`insurance/results/${tripId}`);\n }\n\n function _changeToOptions(tripId, area) {\n $location.path(`${area}/options/${tripId}`);\n }\n\n function getBookingPath(trip) {\n const isMeta = _.get($location.search(), 'source') === 'TV';\n const isHolidayDeal = _.get(trip, 'FromHolidayDeal');\n const isHoliday = _.get(trip, 'TripType') === 4;\n\n if (isHolidayDeal) {\n return isHoliday ? 4 : 3;\n }\n\n if (isMeta) {\n return isHoliday ? 6 : 5;\n }\n\n return isHoliday ? 2 : 1;\n }\n\n function selectTransfer(id, searchId, basketId, tripId) {\n\n let isObject = typeof id === 'object' && id !== null;\n let prodType;\n let preselectedHotelData;\n let options;\n if (isObject) {\n prodType = basketStore.productType.Transfer;\n } else {\n prodType = basketStore.productType.Accommodation;\n preselectedHotelData = JSON.parse(sessionStorage.getItem('preselectedHotelData'));\n\n options = [{ OptionId: id }];\n /* If more than One Room */\n if (options && preselectedHotelData && preselectedHotelData.d.BookedItems &&\n preselectedHotelData.d.BookedItems.length > 1) {\n let perRoomExtra = [];\n preselectedHotelData.d.BookedItems.forEach(room => {\n let roomNum = `HotelExtra|${room.RoomNumber}|`;\n let roomExtra = { OptionId: id.replace('HotelExtra|0|', roomNum) };\n perRoomExtra.push(roomExtra);\n });\n options = perRoomExtra;\n }\n }\n\n return basketStore.transfer(basketId).then(function(t) {\n if (!isObject && basketId) {\n service.updateBasket();\n return basketStore.hotel(basketId).then(function(h) {\n let extra;\n if (h && h.CostBreakdown) {\n h.CostBreakdown.forEach(cb => {\n extra = cb.ExtraReference ? cb.ExtraReference : '';\n });\n }\n if (extra.split('|')[2] !== options[options.length - 1].OptionId.split('|')[3]) {\n return basketStore.addTransfer(\n prodType, searchId, options, basketId).then(function(transfer) {\n return transfer;\n });\n }\n return h;\n });\n } else if (t == null || t.Details.TransferId !== id) {\n return basketStore.addTransfer(\n prodType, searchId, id, basketId).then(function(transfer) {\n service.updateBasket();\n return basketStore.all(basketId).then(function(products) {\n if (products.t && !products.h && !products.f) {\n _prepareBooking(tripId, 'transfers/book');\n }\n return transfer;\n });\n });\n }\n return t;\n });\n }\n\n function selectInsurance(quote, searchId, basketId, tripId) {\n return basketStore.insurance(basketId)\n .then(function() {\n return basketStore.addInsurance(searchId, quote, basketId).then(function(insurance) {\n service.updateBasket();\n return basketStore.all(basketId).then(function(products) {\n if (products.i && !products.h && !products.f) {\n _prepareBooking(tripId, 'insurance/book');\n }\n return insurance;\n });\n });\n });\n }\n\n function selectCar(quote, searchId, basketId) {\n return basketStore.addCar(searchId, quote, basketId).then(carhire => {\n service.updateBasket();\n return carhire;\n });\n }\n\n function selectParking(id, searchId, basketId, tripId) {\n let parking;\n\n return basketStore.addParking(searchId, id, basketId)\n .then(p => {\n parking = p;\n service.updateBasket();\n return basketStore.all(basketId);\n })\n .then(({ p, h, f }) => {\n // Assume standalone parking if no hotel or flight\n if (p && !h && !f) {\n _prepareBooking(tripId, 'parking/book');\n }\n return parking;\n });\n }\n\n function selectMarhaba(tripId, parameters) {\n return _startMarhabaWorkflow(tripId, parameters);\n }\n\n function prepareMarhabaBooking(tripId, productId) {\n return tripService.setBookingId(tripId, guidService.uuid())\n .then(function(trip) {\n return bookingService.prepareBooking(trip.BasketId, trip.BookingId, tripId)\n .then(preparedBooking => {\n $location.path(`marhaba/book/${tripId}/${productId}`);\n return preparedBooking;\n });\n });\n }\n\n function getHotelUrl({ tripId, hotel, flight, estabId, isRoomSearch = true, TripType }) {\n estabId = estabId || _.get(hotel, 'Id');\n let isAmmendBooking = !!$routeParams.BookingRef;\n const isHolidays = flight || TripType === tripService.tripTypes.Holiday;\n let url = isAmmendBooking ? `dashboard/amend-booking/${$routeParams.BookingRef}/${$routeParams.BookingId}` :\n isHolidays ? 'holidays' :\n 'hotels';\n\n url += `/${tripId}`;\n\n if (estabId && (TRPCONFIG.Domain.HotelSearchNoResultsPage !== 'availability' || isRoomSearch)) {\n url += `/${estabId}`;\n }\n\n let search = _.omit($location.search(), '__bd4sort');\n\n let querystring = $.param(search);\n if (querystring) {\n url += `?${querystring}`;\n }\n return url;\n }\n\n // Listen for visibility change events. This helps with detecting a new tab opening.\n document.addEventListener('visibilitychange', function() {\n // The idea here, is that we combine ALL 'lost' session storages into one local storage. This example is only for session searchDates.\n if (document.visibilityState === 'hidden') {\n // To set local storage from session storage\n const sessionItems = [\n 'PreselectFlight',\n 'storeSelectedFlight',\n 'searchDates',\n 'URLstorage',\n 'FlightDetailsId',\n 'priceQtys',\n 'hotelSearchResults',\n 'DefaultFlight',\n 'SkywardsMilesFlights'\n ];\n const excludedGAItems = ['config', 'utmId', 'tripType'];\n const gaEvents = ['gtm.js', 'gtm.dom', 'gtm.load'];\n const theSearchDates = sessionStorage.getItem('searchDates');\n\n let dataLayerItems = [];\n window.dataLayer.forEach(dl => {\n const dlKeys = Object.keys(dl);\n const commonItems = dlKeys.filter(item => excludedGAItems.includes(item));\n if (!commonItems[0]) {\n if (!gaEvents.includes(dl.event)) {\n dataLayerItems.push(dl);\n }\n }\n });\n\n let obj = Object.keys(sessionStorage).reduce(function(obj, key) {\n if (sessionItems.includes(key)) {\n obj[key] = sessionStorage.getItem(key);\n }\n return obj;\n }, {});\n if (theSearchDates && !localStorage.getItem('sessionStorageData')) {\n if (obj !== null) {\n localStorage.setItem('sessionStorageData', JSON.stringify(obj));\n localStorage.setItem('gaSession', JSON.stringify(dataLayerItems));\n }\n }\n } else {\n // To fetch local storage and set session storage in new tab\n const theSearchDates = sessionStorage.getItem('searchDates');\n if (!theSearchDates && localStorage.getItem('sessionStorageData')) {\n copyLocalToSessionStorage();\n } else {\n // when local storage not present then fetch on the storage event\n window.addEventListener('storage', function(e) {\n if (e.key === 'sessionStorageData') {\n copyLocalToSessionStorage();\n }\n });\n }\n }\n });\n\n function copyLocalToSessionStorage() {\n let gaSessionData = localStorage.getItem('gaSession');\n gaSessionData = JSON.parse(gaSessionData);\n if (gaSessionData) {\n let uniqueResult = gaSessionData.filter(function(dlNew) {\n return !window.dataLayer.some(function(dlOriginal) {\n return _.isEqual(dlOriginal, dlNew);\n });\n });\n window.dataLayer = uniqueResult ? uniqueResult.concat(window.dataLayer) : window.dataLayer;\n }\n let sessionStorageData = localStorage.getItem('sessionStorageData');\n sessionStorageData = JSON.parse(sessionStorageData);\n for (let key in sessionStorageData) {\n if (sessionStorageData.hasOwnProperty(key)) {\n sessionStorage.setItem(key, sessionStorageData[key]);\n }\n }\n if (sessionStorage.getItem('searchDates')) {\n localStorage.removeItem('sessionStorageData');\n localStorage.removeItem('gaSession');\n }\n }\n\n\n function selectHotel(tripId, hotel, basketId, area, sameWindow, newTab) {\n tripService.setDirectToHotel(tripId, false);\n basketStore.flight(basketId)\n .then(function(flight) {\n if (flightUnavailable) {\n return;\n }\n const url = getHotelUrl({ tripId, hotel, flight });\n if (newTab) {\n windowUtil.open(url);\n } else if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow && !sameWindow) {\n windowUtil.open(url);\n } else {\n $location.url(url);\n }\n });\n }\n\n function restartCurrentWorkflow(tripId) {\n tripService.getTrip(tripId)\n .then(function(trip) {\n basketStore.all(trip.BasketId)\n .then(function(products) {\n if (products.t != null) {\n $location.path('transfers');\n } else if (products.f != null) {\n $location.path('holidays');\n } else {\n $location.path('hotels');\n }\n });\n });\n }\n\n function restartHolidayWorkflow() {\n $location.path('holidays');\n }\n\n function getFlight(basketId) {\n return basketStore.flight(basketId);\n }\n\n function getHotel(basketId) {\n return basketStore.hotel(basketId);\n }\n\n function changeFlight(tripId) {\n $location.path(`holidays/flights/${tripId}`);\n }\n\n function getTransfers(searchId, basketId, tripId, params = {}) {\n if (searchId) {\n return transferSearch.getSearchResults(searchId, tripId);\n }\n\n return basketStore.all(basketId).then(function(products) {\n if (params.airport && params.dates) {\n searchUnitService.startDate(searchUnitService.transfer, _(params).get('dates.arrivalDate'));\n searchUnitService.endDate(searchUnitService.transfer, _(params).get('dates.departureDate'));\n searchUnitService.setDestinationAirport(params.airport);\n } else {\n const legs = _.get(products, 'f.Details.Itinerary.Legs', []);\n searchUnitService.startDate(searchUnitService.transfer, legs[0].ArrivalDate);\n if (legs.length > 1) {\n searchUnitService.endDate(searchUnitService.transfer, legs[legs.length - 1].DepartureDate);\n }\n searchUnitService.setDestinationAirport(legs[0].ArrivalAirport);\n }\n\n if (products.h != null) {\n searchUnitService.setLocationId(products.h.Details.LocationId);\n }\n const errors = transferSearch.validateSearchCriteria();\n if (errors.length > 0) {\n return $q.when([]);\n }\n const args = { searchId: guidService.uuid(), newSearch: true, tripId, isFlightPlus: true };\n if (products.h && products.h.FuturePayments.length) {\n args.BalanceDueDateOverride = products.h.FuturePayments[products.h.FuturePayments.length - 1].Due;\n }\n return transferSearch.search(args);\n });\n }\n\n function getInsuranceQuotes(searchId, basketId, tripId, params = {}) {\n if (searchId) {\n return insuranceService.getInsuranceQuotesFromSession(searchId);\n }\n\n return $q.all({\n flight: basketStore.flight(basketId),\n hotel: basketStore.hotel(basketId)\n }).then(({ flight, hotel }) => {\n if (flight == null && hotel == null) { return $q.when([]); }\n\n const legs = _.get(flight, 'Details.Itinerary.Legs');\n\n const search = function(ageList) {\n const request = {\n AvailabilitySearchId: guidService.uuid(),\n DestinationAirportCode: _.get(params, 'airport.Code') || legs[0].ArrivalAirport.Code,\n StartDate: _.get(params, 'dates.arrivalDate') || legs[0].DepartureDate,\n Ages: ageList\n };\n\n request.EndDate = _.get(params, 'dates.departureDate') || (params.oneWayOnly ? legs[0].ArrivalDate\n : legs[legs.length - 1].ArrivalDate);\n\n return insuranceService.getInsuranceQuotes(tripId, request);\n };\n\n if (params.ages) {\n return search(params.ages);\n }\n\n return tripService.getTripReducedOccupancy(tripId).then(o => {\n const ages = _.concat(_.times(o.Adults, () => 21), o.ChildAges);\n return search(ages);\n });\n });\n }\n\n function updateInsuranceQuote(basketId, tripId, selectedOptionId, params) {\n // tackle a scenario when quote is updated by navigating to booking form rather than user action\n // in that case do not remove it\n if (!selectedOptionId) {\n return $q.when([]);\n }\n\n if (!params.ages || params.ages.length === 0) {\n return basketStore.removeInsurance(basketId);\n }\n\n //need to update the quote we have\n // get existing quote, make a new request, find the selected option and add it to the basket\n const key = insuranceService.decomposeOptionId(selectedOptionId);\n\n //remove existing\n return basketStore.removeInsurance(basketId).then(function() {\n //get new quotes\n return getInsuranceQuotes(null, basketId, tripId, params);\n }).then(function(insuranceQuotes) {\n //find the same type\n return _.filter(insuranceQuotes, function(q) {\n return q.SupplierId === key.supplierId && q.QuoteType.SchemeId === key.schemeId && q.QuoteType.TypeId === key.typeId;\n });\n }).then(function(quotes) {\n //add it to our basket\n return tripService.getTrip(tripId).then(function(trip) {\n return selectInsurance(quotes[0], trip.InsuranceRequest.AvailabilitySearchId, basketId, tripId);\n });\n });\n }\n\n function getMarhaba(searchId, basketId, tripId, parameters) {\n if (!searchId) {\n searchId = guidService.uuid();\n }\n $location.url(`marhaba/${tripId}`);\n return marhabaSearch.search({ searchId, tripId, newSearch: true, parameters });\n }\n\n function bookBasket(tripId, basketId) {\n return basketStore.flight(basketId)\n .then(function(f) {\n if (f) {\n return _prepareBooking(tripId, 'holidays/book');\n }\n });\n }\n\n function bookAttractionsBasket(tripId = guidService.uuid()) {\n basketStore.getAttractionsBasketId()\n .then(basketId => createTrip(tripId, tripService.tripTypes.Attractions, basketId))\n .then(() => _prepareBooking(tripId, 'attractions/book'));\n }\n\n function selectHotelRooms(hotel, roomIds, tripId) {\n if (flightUnavailable) {\n return;\n }\n let selectRoomFirstTime = sessionStorage.getItem('preselectedHotelData') === null;\n $q.all({\n trip: tripService.clearOptionalExtras(tripId),\n numberOfNights: tripService.getHotelsRequestNumberOfNights(tripId),\n currency: tripService.getCurrency(tripId)\n })\n .then(({ trip, numberOfNights, currency }) => {\n if (trip && trip.HotelsRequest) {\n const bookingPath = getBookingPath(trip);\n let rebookId = $routeParams.BookingId;\n\n basketStore.addHotel(\n trip.HotelsRequest.AvailabilitySearchId,\n hotel.Id,\n roomIds,\n trip.BasketId,\n bookingPath,\n trip.PackageId,\n rebookId\n )\n .then(res => {\n basketStore.flight(trip.BasketId)\n .then(f => {\n const options = mandatoryTransferService.getOptions();\n if (TRPCONFIG.Domain.MandatoryExtrasEnabled && options) {\n basketStore.addOptions(basketStore.productType.Transfer, res.ProductId, options, trip.BasketId);\n }\n broker.publish('roomsAddedToBasket', hotel);\n service.updateBasket();\n if (f) {\n if (isFlightPreselected() && (!flightChanged || selectRoomFirstTime)) {\n $location.path(`holidays/flights/${tripId}`);\n } else {\n //Added below if else to handle case while coming from emirates.com/deeplink if we have more then 1 flight then show Choose you flight screen\n // eslint-disable-next-line no-lonely-if\n if (sessionStorage.getItem('IsDeepLinkURL')) {\n sessionStorage.removeItem('IsDeepLinkURL');\n $location.path(`holidays/flights/${tripId}`);\n } else {\n $location.path(`holidays/options/${tripId}`);\n }\n }\n } else if (\n TRPCONFIG.DeviceSettings.HotelOptionsEnabled\n && TRPCONFIG.Domain.CurrencyCode === currency\n && TRPCONFIG.Domain.HotelOptionsMinDuration\n && numberOfNights >= TRPCONFIG.Domain.HotelOptionsMinDuration\n && hotel.LinkedAirports\n && hotel.LinkedAirports.length\n && !_.intersection(hotel.LinkedAirports.map(a => a.Code), TRPCONFIG.Domain.HotelOptionsFilterOutAirportCodes).length\n ) {\n $location.path(`hotels/options/${tripId}`);\n } else {\n let totalRooms = trip.HotelsRequest.Rooms && trip.HotelsRequest.Rooms.length || 0;\n let singleRoomOnly = TRPCONFIG.Domain.ParasolHotelBookingSingleRoomOnly\n && totalRooms === 1;\n let isMobile = TRPCONFIG.IsMobileView;\n let goV3 = isMobile && (TRPCONFIG.Domain.ParasolHotelBooking && singleRoomOnly)\n || (TRPCONFIG.Domain.ParasolHotelBooking && !TRPCONFIG.Domain.ParasolHotelBookingSingleRoomOnly);\n _prepareBooking(tripId, 'hotels/book', goV3);\n }\n });\n });\n }\n });\n }\n\n function bookHotelBasket(tripId) {\n _prepareBooking(tripId, 'hotels/book');\n }\n\n function updateBrandedFare(params) {\n return basketStore.updateBrandedFare(params)\n .then(f => {\n broker.publish('flightAddedToBasket', f);\n service.updateBasket();\n });\n }\n\n function showChangeHotelsDurationConfirmationPopup(flight) {\n const legs = flight.Legs;\n const flightArrival = (legs && legs[0].Segments) ? dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate) : null;\n const flightReturn = (legs && legs.length > 1) ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\n const zeroTime = dateUtil.zeroTime(flightArrival, true);\n const checkInDate = dateUtil.format(flightArrival, 'dd MMMM yyyy');\n const checkInTime = dateUtil.format(flightArrival, 'HH:mm');\n const newCheckInDate = dateUtil.format(dateUtil.addDays(zeroTime, -1, true), 'dd MMMM yyyy');\n const nights = dateUtil.numberOfNights(flightArrival, flightReturn);\n const newNights = dateUtil.numberOfNights(dateUtil.addDays(zeroTime, -1, true), flightReturn);\n const headerText = resourceService.get('CHANGENIGHTSPOPUPHEADER');\n const messageText = String.format(resourceService.get('CHANGE_HOTEL_CHECKIN_POPUP_MSG'), checkInDate, checkInTime, checkInDate, nights, newCheckInDate, newNights);\n const nightsText = resourceService.get('NIGHTS');\n const nightsButtonLabel = `${nights} ${nightsText}`;\n const newNightsButtonLabel = `${newNights} ${nightsText}`;\n const dateTemplate = messageText;\n let messageHtml = dateTemplate;\n return changeDurationPopupService.showPopup({\n popupHeader: headerText,\n popupMessage: messageHtml,\n nightsButtonLabel,\n newNightsButtonLabel\n });\n }\n\n function _block() {\n $rootScope.$emit('block', {\n title: resourceService.get('SEARCHINGHOTELS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'holidays-hotelSearchCtrl-isHolidayTrue'\n });\n }\n\n function selectFlight(flight, tripId, opts, params, mobileParams = {}, forceRedirectToOptions = false) {\n //if the flight does not contain full date information (AVRO), then we\n //have to wait until after the detail call has completed before moving on to\n //the hotel route\n\n let defaultFlight = sessionStorage.getItem('DefaultFlight') ? JSON.parse(sessionStorage.getItem('DefaultFlight')) : null;\n const { HasFullDates, Legs } = flight;\n const airportCodeFilter = TRPCONFIG.Domain.AutoFilterByAirport ? Legs[0].ArrivalAirport.Code : null;\n let storeSelectedFlight = sessionStorage.getItem('storeSelectedFlight');\n storeSelectedFlight = JSON.parse(storeSelectedFlight !== null ? storeSelectedFlight : '{}');\n let isNewFlight = false;\n isNewFlight = (storeSelectedFlight && storeSelectedFlight.FlightId) || (defaultFlight && defaultFlight.FlightId) ? isNewFlight : !isNewFlight;\n const flightComparisonResult = (storeSelectedFlight && storeSelectedFlight.FlightId) ? _compareFlights(storeSelectedFlight, flight) :\n (defaultFlight && defaultFlight.Details.Itinerary) ? _compareFlights(defaultFlight.Details.Itinerary, flight) : _compareFlights({}, flight);\n flightChanged = flightComparisonResult.isDifferentFlights;\n oldAndNewFlightDatesMatch = flightComparisonResult.isDatesMatch;\n const preselectedHotelData = sessionStorage.getItem('preselectedHotelData');\n\n flightUnavailable = false;\n flightIncompleteDates = !HasFullDates;\n TRPCONFIG.Domain.ChangeHotelNightsDuration = false;\n hotelSearch.setAirportCodeFilter(airportCodeFilter);\n sessionStorage.setItem('storeSelectedFlight', JSON.stringify(flight));\n return tripService.getTrip(tripId).then(trip => {\n if (trip) {\n const { BasketId, FlexibleTripType, FlightsRequest, HotelsRequest, PackageId, TripType } = trip;\n const hotelsRequest = trip.HotelsRequest;\n const legs = flight.Legs;\n const flightArrival = (legs && legs[0].Segments) ? dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate) : null;\n const isFlightType = TripType === tripService.tripTypes.Flight;\n const isHolidayType = TripType === tripService.tripTypes.Holiday;\n const isMultiDestHolidayType = TripType === tripService.tripTypes.MultiDestHoliday;\n const isDirectFlight = _.reduce(Legs, (result, value) => result.NumberOfStops + value.NumberOfStops) === 0;\n const isOneRoomOccupency = HotelsRequest && HotelsRequest.Rooms && HotelsRequest.Rooms.length === 1;\n const isHotelsOnFlights = TRPCONFIG.Domain.HotelsOnFlightsEnabled && isFlightType && FlexibleTripType && !PackageId && isDirectFlight && isOneRoomOccupency;\n const selectedCheckIn = dateUtil.parseDate(hotelsRequest.CheckInDate);\n const flightCheckIn = flightArrival ? dateUtil.parseDate(getCheckInDateForFlight(flightArrival)) : flightArrival;\n const ekReferrer = cookieService.get('CampaignReferrer');\n\n let nextRoute = getRedirectUrlAfterSelectFlight(isHolidayType, isHotelsOnFlights, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, preselectedHotelData);\n const timeRangeChangeDurationPoppup = flightArrival ? (flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff && flightArrival.getHours() <= TRPCONFIG.Domain.HotelCheckInCutOffTime) : null;\n if (timeRangeChangeDurationPoppup && !ekReferrer) {\n _block();\n return showChangeHotelsDurationConfirmationPopup(flight).then(() => {\n searchFlowAfterFlightSelection(trip, tripId, FlightsRequest, flight, BasketId, opts, PackageId,\n isMultiDestHolidayType, isHolidayType, isHotelsOnFlights, nextRoute, params, forceRedirectToOptions, preselectedHotelData,\n selectedCheckIn, flightCheckIn, isNewFlight, timeRangeChangeDurationPoppup, mobileParams);\n });\n }\n if (!timeRangeChangeDurationPoppup || (ekReferrer && ekReferrer.length > 0)) {\n searchFlowAfterFlightSelection(trip, tripId, FlightsRequest, flight, BasketId, opts, PackageId,\n isMultiDestHolidayType, isHolidayType, isHotelsOnFlights, nextRoute, params, forceRedirectToOptions, preselectedHotelData,\n selectedCheckIn, flightCheckIn, isNewFlight, timeRangeChangeDurationPoppup, mobileParams);\n }\n }\n });\n }\n\n function searchFlowAfterFlightSelection(trip, tripId, FlightsRequest, flight, BasketId, opts, PackageId,\n isMultiDestHolidayType, isHolidayType, isHotelsOnFlights, nextRoute, params, forceRedirectToOptions, preselectedHotelData,\n selectedCheckIn, flightCheckIn, isNewFlight, timeRangeChangeDurationPoppup, mobileParams) {\n return tripService.clearOptionalExtras(tripId).then(() => {\n if (!isNewFlight) {\n let newCheckIn = flightCheckIn;\n if (timeRangeChangeDurationPoppup && TRPCONFIG.Domain.ChangeHotelNightsDuration) {\n const zeroTime = dateUtil.zeroTime(flightCheckIn, true);\n flightCheckIn = dateUtil.addDays(zeroTime, -1, true);\n newCheckIn = new Date(flightCheckIn);\n }\n oldAndNewFlightDatesMatch = false;\n oldAndNewFlightDatesMatch = (newCheckIn && selectedCheckIn && newCheckIn.getDate() !== selectedCheckIn.getDate()) ? oldAndNewFlightDatesMatch : !oldAndNewFlightDatesMatch;\n nextRoute = getRedirectUrlAfterSelectFlight(isHolidayType, isHotelsOnFlights, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, preselectedHotelData);\n }\n if (isHolidayType || isHotelsOnFlights) {\n const paramsCopy = { ...params, ...mobileParams };\n nextRoute = optionallyAppendParam(nextRoute, 'fid', paramsCopy && paramsCopy.fid);\n }\n if (FlightsRequest) {\n tripService.setSelectedFlight(tripId, flight, opts);\n\n const addFlightPromise = (\n flight.isMultiDestHolidayLinked\n ? basketStore.addMultiDestHolidayFlight\n : basketStore.addFlight\n )(\n FlightsRequest.AvailabilitySearchId,\n flight,\n BasketId,\n tripId,\n true,\n opts,\n PackageId\n );\n\n if (!isMultiDestHolidayType && isFlightPreselected() && trip.TripType === 4) {\n if (isHolidayType || isHotelsOnFlights) {\n if (!nextRoute.includes('fbt=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'fbt', params && params.fbt);\n }\n if (!nextRoute.includes('fstr=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'fstr', params && params.fstr);\n }\n if (!nextRoute.includes('hpr=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'hpr', params && params.hpr);\n }\n }\n $location.url(nextRoute);\n }\n //if we are in flight only mode here, we need to make sure that this cannot trigger a hotel search\n //due to dates being adjusted.\n return addFlightPromise.then(addFlightResponse => {\n if (addFlightResponse) {\n broker.publish('flightAddedToBasket', addFlightResponse);\n service.updateBasket();\n if (opts && opts.skipRedirection) {\n return;\n }\n if (!isMultiDestHolidayType) {\n if (isHolidayType || isHotelsOnFlights) {\n if (!nextRoute.includes('fbt=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'fbt', params && params.fbt);\n }\n if (!nextRoute.includes('fstr=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'fstr', params && params.fstr);\n }\n if (!nextRoute.includes('hpr=')) {\n nextRoute = optionallyAppendParam(nextRoute, 'hpr', params && params.hpr);\n }\n }\n $location.url(nextRoute);\n }\n }\n });\n }\n });\n }\n\n function getRedirectUrl(tripId, oldAndNewFlightDatesMatch, estabId) {\n if (urlStoreService.isPreviousUrlHotelDetails(tripId)) {\n return urlStoreService.getPreviousURL();\n }\n if (urlStoreService.isPreviousUrlHotelOptions(tripId) || urlStoreService.isPreviousUrlHotelBook(tripId)) {\n if (oldAndNewFlightDatesMatch) {\n return urlStoreService.getPreviousURL();\n }\n return estabId ? `holidays/${tripId}/${estabId}` : '';\n }\n return '';\n }\n\n function getRedirectUrlHotelFirstJourney(tripId, oldAndNewFlightDatesMatch, estabId) {\n if (oldAndNewFlightDatesMatch) {\n return `holidays/options/${tripId}`;\n }\n return estabId ? `holidays/${tripId}/${estabId}` : '';\n }\n\n function getRedirectUrlAfterSelectFlight(isHolidayType, isHotelsOnFlights, forceRedirectToOptions, tripId, oldAndNewFlightDatesMatch, hotelData) {\n const hotelDataJson = hotelData && JSON.parse(hotelData);\n const estabId = _.get(hotelDataJson, 'd.Itinerary.EstabId');\n let nextPath = (isHolidayType || isHotelsOnFlights) && !forceRedirectToOptions && sessionStorage.getItem('preselectedHotelData') === null ? 'hotels' : 'options';\n const backwardCompatibilityUrl = `holidays/${nextPath}/${tripId}`;\n\n switch (true) {\n case TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled:\n return getRedirectUrlHotelFirstJourney(tripId, oldAndNewFlightDatesMatch, estabId) || backwardCompatibilityUrl;\n case TRPCONFIG.Domain2.EnableChangeFlightRedirectionToPrevious:\n return getRedirectUrl(tripId, oldAndNewFlightDatesMatch, estabId) || backwardCompatibilityUrl;\n default:\n return backwardCompatibilityUrl;\n }\n }\n\n function _compareFlights(selectedFlight, newFlight) {\n let isDifferentFlights = true;\n let isDatesMatch = false;\n if (selectedFlight && selectedFlight.FlightId !== undefined && newFlight.FlightId !== undefined) {\n isDifferentFlights = selectedFlight.FlightId !== newFlight.FlightId;\n }\n if (selectedFlight && selectedFlight.Legs !== undefined && selectedFlight.Legs[0] !== undefined && selectedFlight.Legs[1] !== undefined) {\n isDatesMatch = isCheckOutDatesMatched(selectedFlight.Legs[1].DepartureDate, newFlight.Legs[1].DepartureDate)\n && isCheckInDatesMatched(selectedFlight.Legs[0].ArrivalDate, newFlight.Legs[0].ArrivalDate);\n }\n return { isDifferentFlights, isDatesMatch };\n }\n\n function isCheckInDatesMatched(date1, date2) {\n date1 = getCheckInDateForFlight(getIOSDateFormat(date1));\n date2 = getCheckInDateForFlight(getIOSDateFormat(date2));\n return $filter('date')(date1, 'dd MM yy') === $filter('date')(date2, 'dd MM yy');\n }\n\n function isCheckOutDatesMatched(date1, date2) {\n date1 = getCheckOutDateForFlight(getIOSDateFormat(date1));\n date2 = getCheckOutDateForFlight(getIOSDateFormat(date2));\n return $filter('date')(date1, 'dd MM yy') === $filter('date')(date2, 'dd MM yy');\n }\n\n function getHotelDatesFromFlight(flight) {\n let checkInDate = _.get(flight, 'Legs[0].ArrivalDate');\n let checkOutDate = _.get(flight, 'Legs[1].DepartureDate');\n if (checkInDate && checkOutDate) {\n checkInDate = getCheckInDateForFlight(getIOSDateFormat(checkInDate));\n checkOutDate = getCheckOutDateForFlight(getIOSDateFormat(checkOutDate));\n }\n return [checkInDate, checkOutDate];\n }\n\n function getIOSDateFormat(paramDate) {\n const year = paramDate.split(/[- : T]/)[0];\n let month = paramDate.split(/[- : T]/)[1];\n month = Number(month) - 1;\n const day = paramDate.split(/[- : T]/)[2];\n const hour = paramDate.split(/[- : T]/)[3];\n const min = paramDate.split(/[- : T]/)[4];\n const second = paramDate.split(/[- : T]/)[5];\n\n if (month < 10) {\n month = `0${month}`;\n }\n\n const date = new Date(year, month, day, hour, min, second);\n return date;\n\n }\n function getNumberOfNightsFromFlights(...flights) {\n return flights.map(flight => {\n let checkInDate = _.get(flight, 'Legs[0].ArrivalDate');\n let checkOutDate = _.get(flight, 'Legs[1].DepartureDate');\n if (checkInDate && checkOutDate) {\n checkInDate = getCheckInDateForFlight(getIOSDateFormat(checkInDate));\n checkOutDate = getCheckOutDateForFlight(getIOSDateFormat(checkOutDate));\n return dateUtil.numberOfNights(checkInDate, checkOutDate);\n }\n return undefined;\n });\n }\n\n async function changeToFlightWorkflow(tripId) {\n const { TripType } = await tripService.getTrip(tripId);\n const isHolidayType = TripType === tripService.tripTypes.Holiday;\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled && isHolidayType) {\n const { BasketId } = await tripService.changeTripType(tripId, tripService.tripTypes.Flight);\n await basketStore.removeAccomodation(BasketId);\n const basketStoreFlightResponse = await basketStore.flight(BasketId);\n broker.publish('flightAddedToBasket', basketStoreFlightResponse);\n service.updateBasket();\n }\n $timeout(() => $location.url(optionallyAppendParam(`/holidays/options/${tripId}`, 'fid', $routeParams && $routeParams.fid)));\n }\n\n async function changeToHolidayTripType(tripId) {\n if (TRPCONFIG.Domain.HotelsOnFlightsEnabled) {\n const packagePrice = await tripService.usePackageRates(tripId);\n if (!packagePrice) {\n const { TripType } = await tripService.getTrip(tripId);\n const isFlightType = TripType === tripService.tripTypes.Flight;\n if (isFlightType) {\n return tripService.changeTripType(tripId, tripService.tripTypes.Holiday);\n }\n }\n }\n }\n\n function updateFlight(flight, tripId, opts, numBags) {\n tripService.getTrip(tripId).then(trip => {\n const holiday = trip.TripType === tripService.tripTypes.Holiday;\n if (trip) {\n tripService.clearOptionalExtras(tripId).then(() => {\n if (trip.FlightsRequest) {\n tripService.setSelectedFlight(tripId, flight, opts);\n basketStore.addFlight(trip.FlightsRequest.AvailabilitySearchId, flight, trip.BasketId, tripId, holiday, opts, trip.PackageId)\n .then(f => {\n f.Details.Itinerary = _.assign({}, flight, f.Details.Itinerary);\n broker.publish('flightAddedToBasket', f);\n flightSearch.modifyBags(numBags);\n });\n }\n });\n }\n });\n }\n\n function selectMultiFlight(option, tripId) {\n const nextRoute = 'dp/basket/';\n\n tripService.getTrip(tripId).then(function(trip) {\n if (!trip || !trip.MultiFlightsRequest) {\n return;\n }\n\n basketStore.addMultiFlight(trip.MultiFlightsRequest.AvailabilitySearchId, option, trip.BasketId, tripId).then(function() {\n $location.path(nextRoute + tripId);\n });\n });\n }\n\n function getCarQuotes(basketId, tripId, driverAge) {\n return basketStore.flight(basketId).then(flight => {\n if (flight == null) {\n return $q.when([]);\n }\n return tripService.getTripReducedOccupancy(tripId).then(occ => {\n const legs = flight.Details.Itinerary.Legs;\n\n let request = _addCommonCarHireRequestCriteria(\n {\n AvailabilitySearchId: guidService.uuid(),\n PickUpLocation: {\n Type: 2,\n Code: legs[0].ArrivalAirport.Code\n },\n DropOffLocation: {\n Type: 2,\n Code: legs[0].ArrivalAirport.Code\n },\n PickUpDate: dateUtil.roundedToStartOfHour(dateUtil.addHours(legs[0].ArrivalDate, TRPCONFIG.CarHireFlightDepartureOffset), true),\n DropOffDate: dateUtil.roundedToStartOfHour(dateUtil.addHours(legs[legs.length - 1].DepartureDate, TRPCONFIG.CarHireFlightReturnOffset), true),\n DriverAge: driverAge,\n PassengerCount: occ.Adults + occ.ChildAges.length\n },\n 0\n );\n\n return carHireService.getCarQuotes(tripId, request);\n });\n });\n }\n\n function getCarQuotesFromSession(searchId, pageIndex) {\n let request = _addCommonCarHireRequestCriteria({ AvailabilitySearchId: searchId }, pageIndex);\n return carHireService.getCarQuotesFromSession(request);\n }\n\n function _addCommonCarHireRequestCriteria(request, pageIndex) {\n return _.assign(request, {\n SortCriterion: enumService.CarHireSortOrder.Recommended,\n Paging: {\n PageIndex: pageIndex,\n PageSize: 5\n }\n });\n }\n\n function getParkingQuotes(searchId, basketId, tripId) {\n const _tidyAirportParkingTitles = quotes => {\n if (!quotes || quotes.length === 0) {\n return;\n }\n\n _.forEach(quotes, q => {\n q.CarPark = q.CarPark.replace(/\\s+\\(.*?\\)\\s*/g, '');\n q.CarPark = q.CarPark.replace(/(\\s*-\\s?(on|off)\\sairport\\s*)/gi, '');\n });\n\n return quotes;\n };\n\n if (!searchId) {\n return basketStore.flight(basketId).then(function(flight) {\n if (flight == null) {\n return $q.when([]);\n }\n\n const legs = flight.Details.Itinerary.Legs;\n\n const request = {\n AvailabilitySearchId: guidService.uuid(),\n DepartureDate: legs[0].DepartureDate,\n ReturnDate: legs.length > 1 ? legs[legs.length - 1].ArrivalDate : null,\n AirportCode: legs[0].DepartureAirport.Code,\n DepartureFlightNumber: legs[0].Segments[0].FlightNumber,\n ReturnFlightNumber: legs.length > 1 ? legs[legs.length - 1].Segments[0].FlightNumber : null,\n PassengerCount: flight.CostBreakdown[0].Quantity + 1,\n DepartureTerminalCode: null\n };\n\n if (TRPCONFIG.Domain.AirportParkingUseTerminal === true) {\n return flightsTerminalService.getTerminalsForAirport(request.AirportCode)\n .then(airport => {\n //if we know about the airport and it has more than one terminal use the terminal code\n //to filter down our parking otherwise assume only one terminal\n if (airport && airport.Terminals.length > 1) {\n return flightsTerminalService.getTerminalForFlight(request.AirportCode,\n request.DepartureFlightNumber,\n request.DepartureDate)\n .then(terminal => {\n if (terminal) {\n request.DepartureTerminalCode = terminal.Code;\n\n return parkingService.getParkingQuotes(tripId, request)\n .then(quotes => _tidyAirportParkingTitles(quotes));\n }\n\n //record it if we don't have info on the terminal a flight is going from\n loggingService.logInfo(\n `No terminal information found for ${request.AirportCode} : ${request.DepartureFlightNumber} on ${request.DepartureDate}`\n );\n\n return $q.when(null);\n });\n }\n return parkingService.getParkingQuotes(tripId, request)\n .then(quotes => _tidyAirportParkingTitles(quotes));\n });\n }\n\n return parkingService.getParkingQuotes(tripId, request);\n });\n }\n\n return tripService.getTrip(tripId)\n .then(trip => {\n return parkingService.getParkingQuotesFromSession(searchId, trip.ParkingRequest)\n .then(quotes => {\n if (TRPCONFIG.Domain.AirportParkingUseTerminal === true) {\n return _tidyAirportParkingTitles(quotes);\n }\n return quotes;\n });\n });\n }\n\n function getAttractionQuotes(searchId, basketId, tripId) {\n if (searchId) {\n return attractionService.getAttractionQuotesFromSession(searchId);\n }\n\n return $q.all([\n currentDestination.getCurrentDestination(),\n basketStore.hotel(basketId),\n attractionService.getOccupancy(tripId),\n tripService.getHotelsRequestCheckInDate(tripId, true),\n tripService.getHotelsRequestCheckOutDate(tripId, true),\n tripService.getFlightsRequestDepartureDate(tripId, true),\n tripService.getFlightsRequestReturnDate(tripId, true)\n ]).then(function([dest, hotel, occ, checkInDate, checkOutDate, departureDate, returnDate]) {\n //Exactly one of ProvinceId and LocationId must be non-zero\n //we might be dealing with a polygon therefore try to fill in the details from the hotel\n if (!dest) { return; }\n\n let locationId = dest.LocationId;\n let locationType = dest.Type;\n\n if (!locationId) {\n if (hotel) {\n locationId = hotel.Details.LocationId;\n locationType = 2;\n } else {\n locationId = dest.Id;\n }\n }\n\n return getQuotes();\n\n function getQuotes() {\n return attractionService.getAttractionQuotes(tripId, {\n AvailabilitySearchId: guidService.uuid(),\n Visitors: occ,\n LocationId: locationId,\n LocationType: locationType,\n ProvinceId: 0,\n\n StartDate: checkInDate || departureDate,\n EndDate: checkOutDate || returnDate,\n\n // to be removed\n ProductItemId: 1\n });\n }\n });\n }\n\n function waitForFlight() {\n return flightIncompleteDates;\n }\n\n function updateBasket() {\n broker.publish('basketUpdated');\n }\n\n function bookingAlreadyDone(path) {\n return reason => {\n if (path != null && (`${$location.url()}`).search(/[\\\\/]options[\\\\/]/) >= 0) {\n let reasonString = 'unknown';\n try {\n reasonString = JSON.stringify(reason || 'nothing');\n } catch (e) { }\n loggingService.logError(`Booking Already Done: ${path}, DomainId: ${TRPCONFIG.Domain.DomainId}, href: ${$location.absUrl()}}, reason: ${reasonString}`);\n }\n $location.path('bookingalreadydone');\n };\n }\n\n function isFlightPreselected() {\n return JSON.parse(sessionStorage.getItem('PreselectFlight'));\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('basketStore', basketStore);\n\nfunction basketStore($filter,\n $routeParams,\n flightDetail,\n searchUnitService,\n $http,\n $location,\n commonErrors,\n arrayUtil,\n $q,\n $rootScope,\n hotelService,\n transferDetail,\n dateUtil,\n broker,\n hotelSearch,\n marhabaService,\n resourceService,\n carHireDetailsService,\n parkingDetailsService,\n attractionDetailsService,\n adHocService,\n tripService,\n insuranceService,\n cookieService) {\n const productType = {\n Accommodation: 0,\n Flight: 1,\n Transfer: 2,\n Parking: 3,\n Attractions: 4,\n CarHire: 5,\n Marhaba: 6,\n Insurance: 7,\n ProductBundle: 8,\n AdHoc: 9\n };\n const productGroup = {\n Hotel: 1,\n Flight: 2,\n Extra: 3,\n Transfer: 4,\n Parking: 6,\n Attractions: 7\n };\n const productResultMap = {\n h: 'Hotel',\n f: 'Flight',\n t: 'Transfer',\n p: 'Parking',\n a: 'Attractions'\n };\n const bookingExtraOptionsMap = {\n 0: 'flights',\n 1: 'hotels',\n 2: 'transfers',\n 3: 'insurance',\n 4: 'carHire',\n 5: 'parking',\n 6: 'attractions',\n 7: 'marhaba'\n };\n let basket;\n let attractionsBasket;\n const url = '/api2/basket/';\n const productNames = {\n 0: 'ACCOMODATION',\n 1: 'FLIGHT',\n 2: 'TRANSFER',\n 3: 'AIRPORTPARKING',\n 4: 'ATTRACTIONS',\n 5: 'CARHIRE',\n 6: 'MARHABA',\n 7: 'TRAVELINSURANCE',\n 9: 'ADHOC'\n };\n const productIcons = {\n 0: 'icon-hotels',\n 1: 'icon-flights',\n 2: 'icon-transfers',\n 3: 'icon-parking',\n 5: 'icon-car-hire',\n 6: 'icon-marhaba',\n 7: 'icon-insurance',\n 9: 'icon-stack'\n };\n let costBreakdownResult;\n let addingFlightResult;\n const titles = {\n 1: resourceService.getDeferred('HOTEL'),\n 2: resourceService.getDeferred('FLIGHTS'),\n 3: resourceService.getDeferred('EXTRAS'),\n 4: resourceService.getDeferred('TRANSFER'),\n 6: resourceService.getDeferred('PARKING'),\n 7: resourceService.getDeferred('ATTRACTIONS'),\n 9: resourceService.getDeferred('ADHOC')\n };\n let baseCost;\n\n const service = {\n getBasket,\n addHotel,\n addVoucher,\n addingFlight,\n addFlight,\n updateBrandedFare,\n addMultiDestHolidayFlight,\n addMultiFlight,\n addTransfer,\n addMarhaba,\n addCar,\n addParking,\n updateProduct,\n putAttractionExtras,\n addAttraction,\n updateAttraction,\n getAttractionsBasket,\n getAttractionsBasketId,\n addInsurance,\n addCancellationProtection,\n removeCancellationProtection,\n balancesDue,\n removeInsurance,\n removeParking,\n removeAttraction,\n removeAttractionsLineItem,\n insurance,\n removeMarhaba,\n addMarhabaOption,\n marhaba,\n marhabaHolidayPath,\n hotel,\n flight,\n transfer,\n flightSpecificInfo,\n flightOptions,\n optionConditions,\n carHireOptions,\n carHire,\n parking,\n attraction,\n adHoc,\n clearBasket,\n destroyBasket,\n setPaymentMethod,\n createBasket,\n removeProductById,\n removeAccomodation,\n removeFlight,\n removeTransfer,\n all,\n removeCar,\n removeOption,\n addOption,\n addOptions,\n removeOptions,\n getNotes,\n addNote,\n addAdHoc,\n addAdjustment,\n getPriceAdjustments,\n getAddedPriceAdjustments,\n getBaseCost,\n baseCostTotal,\n removePriceAdjustment,\n costBreakdown,\n costBreakdownGrouped,\n applyCancelations,\n payments,\n payDirectTotal,\n totalDeposit,\n payDepositAggregates,\n totalCost,\n totalDiscount,\n totalCostFromBasket,\n sumCosts,\n attractionCost,\n carHireCost,\n carHireRequestedItemsCosts,\n flightCost,\n flightBaggageCostings,\n hotelCost,\n hotelDeposit,\n insuranceCost,\n isAtolProtected,\n parkingCost,\n transferCost,\n rules,\n productType,\n productGroup,\n marhabaCost,\n getBasketId,\n getProductCount,\n getDynamicPackage,\n simplifiedBaggageCount,\n updateBaggageOptions,\n updatePriorityBoarding,\n setProductVisibility,\n setAdjustmentVisibility,\n checkBasketBookingAllowed,\n setBasketIdentity,\n getBasketIdentity,\n productNames,\n getTitle,\n getTitleForProduct,\n getBasketCurrency,\n getIconForProduct,\n getCancellationProtectionQuote,\n getTaxAdjustmentValue,\n extrasBreakdown,\n rehydrateBasketForPUP,\n _costByProduct\n };\n\n function getTitle(type) {\n return titles[type]();\n }\n\n function getTitleForProduct(p) {\n return (p.group ? titles[p.group]() : productNames[p.ProductType]) || titles[productGroup.Extra]();\n }\n\n function getIconForProduct(p) {\n return productIcons[p.ProductType];\n }\n\n function _enrichPayments(b) {\n const data = {\n totalBalances: 0,\n minimumDeposit: 0,\n totalCosts: 0,\n products: []\n };\n\n const currency = searchUnitService.getCurrency();\n\n angular.forEach(b.Products, function(prod) {\n data.minimumDeposit += prod.ImmediatePayment.Amount;\n let balance = 0;\n const p = {\n cost: _aggregateCosts(prod.CostBreakdown),\n productType: prod.ProductType,\n productTitle: resourceService.get(productNames[prod.ProductType]),\n initialDeposit: prod.ImmediatePayment.Amount,\n currentDeposit: prod.ImmediatePayment.Amount,\n schedule: arrayUtil.map(prod.FuturePayments, function(pay) {\n data.totalBalances += pay.Amount;\n balance += pay.Amount;\n return {\n amount: pay.Amount,\n balance: pay.Amount,\n due: pay.Due\n };\n }),\n directPayments: arrayUtil.map(prod.DirectPayments, function(pay) {\n return {\n localAmount: pay.LocalAmount,\n localCurrency: pay.LocalCurrency,\n amount: pay.Amount,\n currency\n };\n }),\n payableLocally: prod.RequestedItems || null\n };\n data.totalCosts += p.cost;\n //for flights we need to include any direct payments in the pay now figure because the payment will always be taken immediately.\n if (prod.ProductType === 1 && prod.DirectPayments.length > 0) {\n p.initialDeposit = p.currentDeposit = prod.ImmediatePayment.Amount + arrayUtil.reduce(arrayUtil.sum, arrayUtil.map(prod.DirectPayments, function(pay) {\n return pay.Amount;\n }));\n } else if (prod.ProductType === 7) {\n p.productTitle += ` ${resourceService.get('IPTINCLUDED')}`;\n }\n p.balance = balance;\n data.products.push(p);\n });\n\n const attractions = data.products.filter(item => 4 === item.productType);\n if (attractions.length) {\n const squashedAttractions = attractions.reduce((prev, curr) => ({\n balance: prev.balance + curr.balance,\n currentDeposit: prev.currentDeposit + curr.currentDeposit,\n initialDeposit: prev.initialDeposit + curr.initialDeposit,\n directPayments: prev.directPayments.concat(curr.directPayments),\n payableLocally: prev.directPayments.concat(curr.directPayments),\n schedule: prev.schedule.concat(curr.schedule),\n productTitle: curr.productTitle,\n productType: curr.productType\n }));\n data.products = data.products.filter(item => productType.Attractions !== item.productType);\n data.products.push(squashedAttractions);\n }\n\n return data;\n }\n\n function _productsByType(t, basketId, firstOnly) {\n return _getBasket(basketId)\n // `firstOnly` for products that don't support multiples\n .then(b => b == null ? null : _[firstOnly ? 'find' : 'filter'](\n b.Products,\n { ProductType: t }\n ));\n }\n\n function _optionsByType(type, basketId) {\n return _productsByType(type, basketId, true).then(function(p) {\n if (p && p.Options) {\n return arrayUtil.map(p.Options, function(o) {\n return { OptionId: o.OptionId, Quantity: o.ChosenQuantity || 1 };\n });\n }\n return [];\n });\n }\n\n function _getBasket(id) {\n if (basket != null) {\n return basket.then(function(r) {\n if (r.BasketId !== id) {\n basket = _getBasketById(id);\n }\n return basket;\n });\n }\n basket = _getBasketById(id);\n return basket;\n }\n\n function getBasket(id) {\n return _getBasket(id);\n }\n\n function _getBasketById(id) {\n costBreakdownResult = null;\n return $http.get(`${url}get?basketId=${id}`)\n .then(function(result) {\n return result.data === 'null' ? null : result.data;\n })\n .then(function(data) {\n if (data && data.Products && data.Products.length && data.Products.length > 0) {\n let hotelProduct = data.Products.find(p => {\n return p.ProductType !== undefined && p.ProductType !== null\n ? p.ProductType === productType.Accommodation\n : false;\n });\n\n if (hotelProduct) {\n broker.publish('ProductHotelReceivedFromBasket', { productId: hotelProduct.ProductId, basketId: id });\n }\n }\n return data;\n });\n }\n\n function _addProduct(type, searchId, detailsId, basketId, options, packageId, rebookId, replaceBrandedFareType) {\n const params = {\n BasketId: basketId,\n AvailabilitySearchId: searchId,\n ProductType: type,\n ProductId: detailsId,\n Options: options,\n PackageId: packageId,\n RebookId: rebookId,\n };\n if (replaceBrandedFareType) {\n params.IsBrandedFareUpdate = true;\n }\n return $http.post(`${url}addproduct`, params, {\n customErrCallback: TRPCONFIG.Domain.HandleDatesMismatchError ? function(err) {\n if (err.status === 400 && err.data.Message === 'Mismatch between flight and hotel dates') {\n $location.url('errordatesmismatch');\n } else {\n commonErrors.fourHundred(err);\n }\n } : undefined\n }).then(function(result) {\n basket = $q.when(result.data);\n costBreakdownResult = null;\n broker.publish('productAddedToBasket');\n });\n }\n\n function updateProduct(detailsId, basketId) {\n return $http.post(`${url}updateproduct`, {\n BasketId: basketId,\n ProductId: detailsId\n })\n .then(result => {\n basket = $q.when(result.data);\n costBreakdownResult = null;\n });\n }\n\n function addAdHoc(detailsRequest) {\n return adHocService.getDetails(detailsRequest)\n .then(response => {\n const d = response.data;\n if (d && d.AvailabilityId && d.DetailsId) {\n return getBasketId().then(basketId => {\n if (basketId) {\n return _addProduct(productType.AdHoc\n , d.AvailabilityId\n , d.DetailsId\n , basketId\n , []);\n }\n return $q.when(null);\n });\n }\n });\n }\n\n function getPriceAdjustments(basketId) {\n return _getBasket(basketId).then(basket => basket && basket.AvailableAdjustments || []);\n }\n\n function baseCostTotal() {\n return baseCost;\n }\n\n function getBaseCost(res) {\n let products = res[5].products;\n let baseCostNum = Number(res[2]);\n let totalCost = Math.ceil(baseCostNum);\n let flightCost;\n\n for (let i = 0; i < products.length; i++) {\n if (products[i].productTitle === 'FLIGHT') {\n flightCost = Math.ceil(products[i].cost);\n }\n }\n\n baseCost = totalCost - flightCost;\n return baseCost;\n }\n\n function getAddedPriceAdjustments(bId) {\n return _getBasket(bId).then(basket =>\n (basket && Array.isArray(basket.Adjustments) ? basket.Adjustments : [])\n .map(item => {\n return {\n Id: item.Id,\n Title: item.Title,\n CostBreakdown: [{\n Description: item.Title,\n Quantity: item.Quantity,\n NetUnitAmount: item.NetUnitAmount,\n UnitAmount: item.UnitAmount,\n ManualCommission: item.ManualCommission || 0,\n TravelAgentCommissionRate: item.TravelAgentCommissionRate || 0,\n IsHiddenFromDocumentation: item.IsHidden,\n IsPriceHidden: item.IsPriceHidden\n }]\n };\n })\n );\n }\n\n function getCancellationProtectionQuote(basketId) {\n let protectionDisabled = {\n IsApplicable: false\n };\n\n if (!TRPCONFIG.Domain.CancellationProtectionEnabled) {\n return protectionDisabled;\n }\n\n return $http.get(`api/hotels/cancellationprotection/quote?basketId=${basketId}`)\n .then(res => res.data)\n .catch(() => protectionDisabled);\n }\n\n function getTaxAdjustmentValue(basketId) {\n return getAddedPriceAdjustments(basketId).then(function(result) {\n let value = 0;\n if (result) {\n const adjustments = result.filter(item => {\n return item.CostBreakdown && item.CostBreakdown.length;\n });\n if (adjustments && adjustments.length) {\n _.forEach(adjustments, adjustment => {\n value += _.get(adjustment, 'CostBreakdown[0].UnitAmount', 0);\n });\n }\n }\n return value;\n });\n }\n\n function addAdjustment(adjustmentRequest) {\n return $http.post(`${url}addadjustment`, adjustmentRequest)\n .then(res => _updateBasketPromise(res.data));\n }\n\n function removePriceAdjustment(basketId, adjustmentId) {\n const req = {\n BasketId: basketId,\n AdjustmentId: adjustmentId,\n ExpectedVersion: 0\n };\n return $http.post(`${url}removeadjustment`, req)\n .then(res => _updateBasketPromise(res.data));\n }\n\n function _updateBasketPromise(newBasket) {\n basket = $q.when(newBasket);\n costBreakdownResult = null;\n broker.publish('productRemovedFromBasket');\n return newBasket;\n }\n\n function _aggregateCosts(cs) {\n let cost = 0;\n angular.forEach(cs, function(c) {\n cost += (c.Quantity * c.UnitAmount);\n });\n return cost;\n }\n\n function _costByProduct(type, basketId) {\n return _productsByType(type, basketId, true)\n .then(function(p) {\n return p ? _aggregateCosts(p.CostBreakdown) : 0;\n });\n }\n\n //[ { CurrencyCode: String, Total: Number } ]\n function _requestedItemsCostsByProduct(type, basketId) {\n return _productsByType(type, basketId, true)\n .then(product => {\n let costs = {};\n let costList = [];\n if (product) {\n _.each(product.RequestedItems, i => {\n let val = costs[i.LocalCurrency] || 0;\n costs[i.LocalCurrency] = val + (i.UnitAmount * i.Quantity);\n });\n _.forOwn(costs, (value, key) => {\n costList.push({ CurrencyCode: key, Total: value });\n });\n }\n return costList;\n });\n }\n\n function _optionIndex(options, id) {\n return arrayUtil.indexOf(options, function(o) {\n return o.OptionId === id;\n });\n }\n\n function _removeProduct(type, basketId) {\n return _productsByType(type, basketId, true)\n .then(p => {\n if (p != null) {\n return removeProductById(p.ProductId, basketId);\n }\n });\n }\n\n function removeProductById(productId, basketId) {\n return $http.post(`${url}removeproduct`, {\n BasketId: basketId,\n ProductId: productId\n })\n .then(result => {\n basket = $q.when(result.data);\n costBreakdownResult = null;\n broker.publish('productRemovedFromBasket');\n });\n }\n\n function _addProductDetails(p, rehydrator) {\n if (p && !p.Details) {\n return rehydrator(p.ProductId).then(function(p2) {\n p.Details = p2;\n return p;\n });\n }\n return p;\n }\n\n function _rehydrateProducts(type, rehydrator, basketId, firstOnly) {\n return _productsByType(type, basketId)\n .then(products => {\n if (firstOnly) { // Products that don't support multiples\n return _addProductDetails(products[0], rehydrator);\n }\n\n return $q.all(\n products.reduce((promises, p) => {\n promises.push(_addProductDetails(p, rehydrator));\n return promises;\n }, [])\n );\n });\n }\n\n function _concatCostBreakdowns(products) {\n let result = [];\n _.keys(_.omit(products, 'all')).forEach(p => {\n arrayUtil.wrapNonArray(products[p])\n .forEach(product => {\n const cb = product && product.CostBreakdown;\n if (cb) {\n result = result.concat(cb);\n }\n });\n });\n return result;\n }\n\n function _changeOption(type, productId, optionId, operation, basketId, quantity) {\n return $http.post(url + operation, {\n BasketId: basketId,\n ProductId: productId,\n OptionId: optionId,\n ChosenQuantity: quantity\n }).then(function(result) {\n basket = $q.when(result.data);\n costBreakdownResult = null;\n return _optionsByType(type, basketId);\n });\n }\n\n function _changeOptions(type, productId, options, operation, basketId) {\n return $http.post(url + operation, {\n BasketId: basketId,\n ProductId: productId,\n Options: options\n }).then(function(result) {\n basket = $q.when(result.data);\n costBreakdownResult = null;\n return _optionsByType(type, basketId);\n });\n }\n\n function _checkChauffeur(marhaba) {\n if (!marhaba) {\n return false;\n }\n\n function isChauffeur(availableOption, selectedOption) {\n if (availableOption.Type === 4 && availableOption.Id === selectedOption.OptionId) {\n return true;\n }\n return false;\n }\n\n const selectedOptions = marhaba.Options;\n const availableOptions = marhaba.Details.AvailableOptions;\n\n for (let x = availableOptions.length - 1; x >= 0; x--) {\n for (let i = selectedOptions.length - 1; i >= 0; i--) {\n if (isChauffeur(availableOptions[x], selectedOptions[i])) {\n return true;\n }\n }\n }\n return false;\n }\n\n function _calculateProductTotals(products) {\n products.total = 0;\n products.totalNet = 0;\n products.totalTravelAgentCommission = 0;\n\n const currency = searchUnitService.getCurrency();\n angular.forEach(products, function(product) {\n product.total = 0;\n product.totalNet = 0;\n product.totalTravelAgentCommission = 0;\n product.costBreakdown = (product.costBreakdown ? product.costBreakdown : product.CostBreakdown);\n angular.forEach(product.costBreakdown, function(item) {\n product.total += (item.UnitAmount * item.Quantity);\n product.totalNet += (item.NetUnitAmount * item.Quantity);\n item.TravelAgentCommission = (item.ManualCommission ? item.ManualCommission : item.TravelAgentCommission);\n product.totalTravelAgentCommission += (item.TravelAgentCommission * item.Quantity);\n item.Margin = item.UnitAmount - item.NetUnitAmount;\n });\n\n product.totalStr = $filter('customCurrency')(product.total, currency);\n product.totalNetStr = $filter('customCurrency')(product.totalNet, currency);\n product.totalTravelAgentCommissionStr = $filter('customCurrency')(product.totalTravelAgentCommission, currency);\n product.totalMargin = product.total - product.totalNet;\n product.totalMarginStr = $filter('customCurrency')(product.totalMargin, currency);\n\n product.title = (product.group ? titles[product.group]() : productNames[product.ProductType])\n || titles[productGroup.Extra](); // Default title to 'Extras' when missing\n product.icon = productIcons[product.ProductType];\n products.total += product.total;\n products.totalNet += product.totalNet;\n products.totalTravelAgentCommission += product.totalTravelAgentCommission;\n });\n products.totalStr = $filter('customCurrency')(products.total, currency);\n products.totalNetStr = $filter('customCurrency')(products.totalNet, currency);\n products.totalTravelAgentCommissionStr = $filter('customCurrency')(products.totalTravelAgentCommission, currency);\n\n products.totalMargin = products.total - products.totalNet;\n products.totalMarginStr = $filter('customCurrency')(products.totalMargin, currency);\n return products;\n }\n\n function getCheckInDateForFlight(flightArrival) {\n const landsAfterCutOff = flightArrival.getHours() >= TRPCONFIG.Domain.DepartureFlightCutOff;\n const zeroTime = dateUtil.zeroTime(flightArrival, true);\n let cutOff = landsAfterCutOff ? zeroTime : dateUtil.addDays(zeroTime, -1, true);\n if (TRPCONFIG.Domain.ChangeHotelNightsDuration) {\n cutOff = dateUtil.addDays(zeroTime, -1, true);\n }\n return cutOff;\n }\n\n function getCheckOutDateForFlight(flightReturn) {\n if (TRPCONFIG.Domain.ReturnFlightCutOff < 0) {\n return dateUtil.zeroTime(flightReturn, true);\n }\n const departsBeforeCutOff = flightReturn.getHours() < TRPCONFIG.Domain.ReturnFlightCutOff;\n const zeroTime = dateUtil.zeroTime(flightReturn, true);\n return departsBeforeCutOff ? dateUtil.addDays(zeroTime, -1, true) : zeroTime;\n }\n\n //the problem with this is that if the user refreshes the flights list, we will hit this before the\n //hotel search request has been restored. Proglem.\n function _adjustSearchDatesIfNecessary(f, tripId) {\n return $q.all([\n tripService.getHotelsRequestCheckInDate(tripId),\n tripService.getHotelsRequestCheckOutDate(tripId)])\n .then(dates => {\n const [checkIn, checkOut] = dates.map(d => dateUtil.serialiseDate(d));\n const newHotelsRequestDates = {};\n const legs = f.Legs;\n const flightArrival = dateUtil.parseDate(legs[0].Segments[legs[0].Segments.length - 1].ArrivalDate);\n const flightReturn = legs.length > 1 ? dateUtil.parseDate(legs[legs.length - 1].Segments[0].DepartureDate) : null;\n const requiredCheckIn = getCheckInDateForFlight(flightArrival);\n const requiredCheckOut = getCheckOutDateForFlight(flightReturn);\n\n if (checkIn == null && checkOut == null && TRPCONFIG.Domain2.ResetAdjustingDatesFixEnabled) {\n return newHotelsRequestDates;\n }\n\n if (requiredCheckIn !== checkIn) {\n newHotelsRequestDates.CheckInDate = requiredCheckIn;\n }\n if (requiredCheckOut !== checkOut) {\n newHotelsRequestDates.CheckOutDate = requiredCheckOut;\n }\n return newHotelsRequestDates;\n });\n }\n\n function addVoucher(basketId, voucherCode) {\n const req = {\n VoucherCode: voucherCode || '',\n BasketId: basketId,\n };\n\n return $http.post('/api2/basket/addvoucher', req)\n .then(res => {\n const data = res.data;\n const discountMsg = data.DiscountMessages && data.DiscountMessages.length > 0 && data.DiscountMessages[0] || '';\n cookieService.set('VoucherWarnMessage', JSON.stringify(discountMsg));\n\n return data;\n });\n }\n\n function addHotel(searchId, estabId, roomIds, basketId, bookingPath, packageId, rebookId, discountCode, voucherCode) {\n //reclaim price difference only for single - room hotel bookings\n const reclaimPriceDifference = TRPCONFIG.Domain.ReclaimPriceDifferenceEnabledFE && roomIds.length === 1;\n let request = {\n AvailabilitySearchId: searchId,\n EstabId: estabId,\n RoomAndBoardIds: roomIds,\n DiscountCode: discountCode || TRPCONFIG.DiscountCode || '',\n VoucherCode: voucherCode || '',\n BookingPath: bookingPath,\n BasketId: basketId,\n ReclaimPriceDifference: reclaimPriceDifference\n };\n\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\n const SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser'));\n const Tier = (SkywardsLoginUser && SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\n SkywardsLoginUser.data.Contact.Tier : null;\n request.LoyaltyInfo = {\n SkywardsTier: Tier\n };\n }\n\n return hotelService.getHotelDetails(request)\n .then(d => {\n sessionStorage.setItem('preselectedHotelData', JSON.stringify({\n Accommodation: productType.Accommodation,\n searchId,\n DetailsId: d.DetailsId,\n basketId,\n options: undefined,\n packageId,\n rebookId,\n d\n }));\n return _addProduct(productType.Accommodation, searchId, d.DetailsId, basketId, undefined, packageId, rebookId);\n })\n .then(() => service.hotel(basketId));\n }\n\n function addingFlight() {\n return addingFlightResult != null;\n }\n\n function buildBaggageArray(opExtras, bagOpts, type, baggageOptions) {\n //for best fit flight selection this will come through as null\n if (bagOpts == null) {\n return;\n }\n\n switch (type) {\n case 'multi':\n for (let i = 0; i < bagOpts.bags; i++) {\n if (opExtras[i].Options.length > 1) {\n let option = null;\n //this is just needed for our initial release so we can go out without being coupled to flights\n //once they have their data updated we should pick the default bag rather that just the 1st one\n // in the list (only applies to multi options\n if (TRPCONFIG.BaggageUseDefaultOption === true) {\n const defaultOption = _.find(opExtras[i].Options, { IsDefault: true });\n option = {\n OptionId: defaultOption.OptionId,\n ChosenQuantity: defaultOption.Quantity\n };\n } else {\n option = {\n OptionId: opExtras[i].Options[1].OptionId,\n ChosenQuantity: opExtras[i].Options[1].Quantity\n };\n }\n baggageOptions.push(option);\n }\n }\n break;\n case 'single':\n for (let j = 0; j < bagOpts.bags; j++) {\n if (opExtras[j] != null) {\n baggageOptions.push({\n OptionId: opExtras[j].OptionId,\n ChosenQuantity: opExtras[j].Quantity\n });\n }\n }\n break;\n }\n }\n\n function getCheckInOptions(sector) {\n return arrayUtil.first(sector.OptionalExtras, function(o) {\n return o.Type === 4;\n });\n }\n\n function getSpecificCheckInOption(options, typeName) {\n return arrayUtil.first(options.MultiOptionalExtras[0].Options, function(o) {\n return o.Type === typeName;\n });\n }\n\n\n function addCheckInOptionsIfNecessary(sector, opts, baggageOptions) {\n //if the flight has CheckInOptions we need to add default online checkin options as well\n const checkInOptions = getCheckInOptions(sector);\n if (checkInOptions && opts) {\n const nobags = getSpecificCheckInOption(checkInOptions, 'OnlineCheckinNoBaggage');\n const withbags = getSpecificCheckInOption(checkInOptions, 'OnlineCheckinWithBaggage');\n if (opts.bags > 0 && withbags != null) {\n baggageOptions.push({\n OptionId: withbags.OptionId,\n ChosenQuantity: opts.bags\n });\n }\n if (opts.bags < opts.maxbags) {\n baggageOptions.push({\n OptionId: nobags.OptionId,\n ChosenQuantity: opts.maxbags - opts.bags\n });\n }\n }\n }\n\n function updateBrandedFare(params) {\n const {\n searchId,\n basketId,\n packageId,\n details\n } = params;\n const baggageOptions = [];\n _.forEach(details.FlightSectorOptionalExtras, function(sector) {\n addBaggageOptions(sector, params, baggageOptions);\n });\n return _addProduct(productType.Flight, searchId, details.DetailsId, basketId, baggageOptions, packageId, undefined, true)\n .then(() => {\n return service.flight(basketId);\n });\n }\n\n function addFlight(searchId, flight, basketId, tripId, verifyDates, opts, packageId) {\n let checkDates = !flight.HasFullDates;\n let adjustingDates = $q.when();\n if (verifyDates && flight.HasFullDates && flight.Legs.length > 1) {\n adjustingDates = _adjustSearchDatesIfNecessary(flight, tripId).then(newHotelsRequestDates => {\n if (!_.isEmpty(newHotelsRequestDates)) {\n checkDates = false;\n hotelSearch.adjustHotelCheckInCheckOutDates(tripId, newHotelsRequestDates);\n }\n });\n }\n\n addingFlightResult = adjustingDates.then(function() {\n return flightDetail.getFlightDetails(tripId, {\n AvailabilitySearchId: searchId,\n FlightId: flight.FlightId,\n IncludeSeatPlan: TRPCONFIG.DeviceSettings.SeatPlanEnabled\n }).then(function(d) {\n if (d != null) {\n sessionStorage.setItem('FlightDetailsId', d.DetailsId);\n const baggageOptions = [];\n _.forEach(d.FlightSectorOptionalExtras, function(sector) {\n addBaggageOptions(sector, opts, baggageOptions);\n });\n\n return _addProduct(productType.Flight, searchId, d.DetailsId, basketId, baggageOptions, packageId)\n .then(function(res) {\n const preselectedHotelData = sessionStorage.getItem('preselectedHotelData');\n return preselectedHotelData !== null ? _addProduct(...Object.values(JSON.parse(preselectedHotelData))) : res;\n })\n .then(function() {\n addingFlightResult = null;\n return service.flight(basketId).then(function(f) {\n //in the case where the flight did not have full dates we need to defer checking that the hotel search\n //dates match until we have the full info i.e. after the details call\n if (verifyDates && checkDates && flight.Legs.length > 1) {\n return _adjustSearchDatesIfNecessary(f.Details.Itinerary, tripId).then(newHotelsRequestDates => {\n if (!_.isEmpty(newHotelsRequestDates)) {\n broker.publish('searchDatesAdjusted', {\n tripId,\n dates: newHotelsRequestDates\n });\n }\n return f;\n });\n }\n return f;\n });\n });\n }\n return null;\n });\n });\n return addingFlightResult;\n }\n\n\n function addMultiDestHolidayFlight(searchId, flight, basketId, tripId, verifyDates, opts, packageId) {\n // Duplicate of addFlight() with no getFlightDetails() because it already ran immediately prior\n let checkDates = !flight.HasFullDates;\n let adjustingDates = $q.when();\n if (verifyDates && flight.HasFullDates && flight.Legs.length > 1) {\n adjustingDates = _adjustSearchDatesIfNecessary(flight, tripId).then(newHotelsRequestDates => {\n if (!_.isEmpty(newHotelsRequestDates)) {\n checkDates = false;\n broker.publish('searchDatesAdjusted', { tripId, dates: newHotelsRequestDates });\n }\n });\n }\n addingFlightResult = adjustingDates.then(function() {\n const baggageOptions = [];\n _.forEach(flight.FlightSectorOptionalExtras, function(sector) {\n addBaggageOptions(sector, opts, baggageOptions);\n });\n\n return _addProduct(productType.Flight, searchId, flight.DetailsId, basketId, baggageOptions, packageId)\n .then(function() {\n addingFlightResult = null;\n return service.flight(basketId).then(function(f) {\n if (verifyDates && checkDates && flight.Legs.length > 1) {\n return _adjustSearchDatesIfNecessary(f.Details.Itinerary, tripId).then(newHotelsRequestDates => {\n if (!_.isEmpty(newHotelsRequestDates)) {\n broker.publish('searchDatesAdjusted', { tripId, dates: newHotelsRequestDates });\n }\n return f;\n });\n }\n return f;\n });\n });\n });\n return addingFlightResult;\n }\n\n function addMultiFlight(searchId, option, basketId, tripId) {\n return flightDetail.getFlightDetails(tripId, {\n AvailabilitySearchId: searchId,\n FlightId: option.FlightId,\n IncludeSeatPlan: false,\n MultiSector: true\n }).then(function(d) {\n if (!d) {\n return null;\n }\n return _addProduct(productType.Flight, searchId, d.DetailsId, basketId);\n });\n }\n\n function addBaggageOptions(sector, opts, baggageOptions) {\n const optionalExtras = arrayUtil.first(sector.OptionalExtras, o => o.Type === 0);\n if (optionalExtras != null) {\n if (optionalExtras.MultiOptionalExtras.length > 0) {\n buildBaggageArray(optionalExtras.MultiOptionalExtras, opts, 'multi', baggageOptions);\n } else {\n buildBaggageArray(optionalExtras.SingleOptionalExtras, opts, 'single', baggageOptions);\n }\n\n addCheckInOptionsIfNecessary(sector, opts, baggageOptions);\n }\n }\n\n function addTransfer(type, searchId, transferId, basketId) {\n if (type === productType.Transfer) {\n return transferDetail.getTransferDetails({\n AvailabilitySearchId: searchId,\n TransferId: transferId\n }).then(function(d) {\n return _addProduct(productType.Transfer, searchId, d.DetailsId, basketId)\n .then(function() {\n return service.transfer(basketId);\n });\n });\n }\n\n if (type === productType.Accommodation) {\n let preselectedHotelData = JSON.parse(sessionStorage.getItem('preselectedHotelData'));\n return _addProduct(productType.Accommodation, preselectedHotelData.searchId,\n preselectedHotelData.DetailsId, basketId, transferId)\n .then(function() {\n return service.hotel(basketId);\n });\n }\n }\n\n function addMarhaba(searchId, productId, basketId, options) {\n return marhabaService.getProductDetails(searchId, productId)\n .then(function(details) {\n return _addProduct(productType.Marhaba, searchId, details.DetailsSearchId, basketId, options)\n .then(function() {\n return service.marhaba(basketId, productId);\n });\n });\n }\n\n function removeMarhaba(basketId) {\n return _removeProduct(productType.Marhaba, basketId);\n }\n\n function addMarhabaOption(productId, optionId, quantity, basketId) {\n return _productsByType(productType.Marhaba, basketId, true)\n .then(function(p) {\n if (p && p.Options) {\n const i = _optionIndex(p.Options, optionId);\n if (i < 0) {\n p.Options.push({ OptionId: optionId });\n }\n }\n return _changeOption(productType.Marhaba, productId, optionId, 'addoption', basketId, quantity);\n });\n }\n\n function marhaba(basketId, productId) {\n return _productsByType(productType.Marhaba, basketId, true).then(function(p) {\n if (p && !p.Details) {\n return marhabaService.rehydrate(productId, p.AvailabilitySearchId)\n .then(function(res) {\n p.Details = res;\n return p;\n });\n }\n return p;\n });\n }\n\n function marhabaHolidayPath(basketId) {\n return _getBasket(basketId)\n .then(function(b) {\n return b.Products.length > 1;\n });\n }\n\n function hotel(basketId) {\n return _rehydrateProducts(productType.Accommodation, hotelService.rehydrate.bind(hotelService), basketId,\n true); // `firstOnly` when not dynamic packaging\n }\n\n function flight(basketId) {\n if (addingFlightResult) {\n return addingFlightResult\n .then(function(f) {\n return f;\n });\n }\n return _rehydrateProducts(productType.Flight, flightDetail.rehydrate.bind(flightDetail), basketId,\n true); // `firstOnly` when not dynamic packaging\n }\n\n function transfer(basketId) {\n return _rehydrateProducts(productType.Transfer, transferDetail.rehydrate.bind(transferDetail), basketId,\n true); // `firstOnly` when not dynamic packaging\n }\n\n function carHire(basketId) {\n return _rehydrateProducts(productType.CarHire, carHireDetailsService.rehydrate.bind(carHireDetailsService), basketId, true);\n }\n\n function optionConditions(basketId) {\n return service.flight(basketId).then(function(f) {\n if (f) {\n return f.Details.OptionConditions;\n }\n return {};\n });\n }\n\n function flightOptions(basketId) {\n if (addingFlightResult != null) {\n return addingFlightResult.then(function() {\n return _optionsByType(productType.Flight, basketId);\n });\n }\n return _optionsByType(productType.Flight, basketId);\n }\n\n function carHireOptions(basketId) {\n return _optionsByType(productType.CarHire, basketId).then(function(options) {\n return arrayUtil.map(options, function(o) {\n return o.OptionId;\n });\n });\n }\n\n function _flushBasket() {\n basket = null;\n attractionsBasket = null;\n }\n\n function _refreshBasket(basketId) {\n return $q.when(basketId || getBasketId())\n .then(bId => {\n _flushBasket();\n return _getBasket(bId);\n })\n .then(() => broker.publish('basketRefreshed'));\n }\n\n function destroyBasket() {\n _flushBasket();\n TRPCONFIG.BasketId = null;\n }\n\n function clearBasket(basketId) {\n destroyBasket();\n return $http.post(`${url}clearbasket`, JSON.stringify(basketId))\n .then(res => {\n broker.publish('basketCleared');\n return res;\n });\n }\n\n function setPaymentMethod(cardTypeId, basketId) {\n TRPCONFIG.Domain.CardTypeId = cardTypeId;\n return _getBasket(basketId)\n .then(function(b) {\n if (b.CardTypeId !== cardTypeId) {\n return $http.post(`${url}setpaymentmethod`, {\n BasketId: basketId,\n CardTypeId: cardTypeId\n }).then(function(result) {\n result.data.CardTypeId = cardTypeId;\n basket = $q.when(result.data);\n return {\n CardHandlingFee: result.data.CardHandlingFee,\n AirlineSurcharge: result.data.AirlineSurcharge\n };\n });\n }\n return {\n CardHandlingFee: b.CardHandlingFee,\n AirlineSurcharge: b.AirlineSurcharge\n };\n });\n }\n\n function createBasket(forHoliday) {\n const domain = TRPCONFIG.Domain;\n const reqParams = {\n AccountingCurrencyCode: domain.AccountingCurrencyCode,\n CurrencyCode: searchUnitService.getCurrency(),\n DomainId: domain.DomainId,\n ForHoliday: forHoliday,\n CultureCode: domain.CultureCode\n };\n\n basket = $http.post(`${url}create`, reqParams)\n .then(result => {\n TRPCONFIG.BasketId = result.data.BasketId;\n broker.publish('attractionsBasketUpdated');\n broker.publish('basketCreated');\n return result.data;\n });\n return basket;\n }\n\n function removeAccomodation(basketId) {\n return _removeProduct(productType.Accommodation, basketId);\n }\n\n function removeFlight(basketId) {\n return _removeProduct(productType.Flight, basketId);\n }\n\n function removeTransfer(basketId) {\n return _removeProduct(productType.Transfer, basketId);\n }\n\n function all(basketId, productId) {\n const p = [\n service.flight(basketId),\n service.hotel(basketId),\n service.transfer(basketId),\n service.insurance(basketId),\n service.carHire(basketId),\n service.parking(basketId),\n service.attraction(basketId)\n ];\n\n if (TRPCONFIG.Domain.MarhabaEnabled) {\n p.push(service.marhaba(basketId, productId));\n }\n\n return $q.all(p)\n .then(function(results) {\n _storeAdaptiveBookingFlags(results);\n return {\n f: results[0],\n h: results[1],\n t: results[2],\n i: results[3],\n c: results[4],\n p: results[5],\n a: results[6],\n m: TRPCONFIG.Domain.MarhabaEnabled ? results[7] : null,\n all: results\n };\n });\n }\n\n function _storeAdaptiveBookingFlags(results) {\n const marhaba = 5;\n const bookingFlags = results.reduce((acc, current, i) => {\n if ((!Array.isArray(current) && (current !== undefined)) ||\n (Array.isArray(current) && (current.length > 0)) ||\n (!Array.isArray(current) && (current !== undefined) && (i === marhaba) && TRPCONFIG.Domain.MarhabaEnabled)) {\n acc.push(bookingExtraOptionsMap[i]);\n }\n return acc;\n }, []);\n sessionStorage.setItem('adaptiveBookingFlags', JSON.stringify(bookingFlags));\n }\n\n function _rehydrateDynamicPackage() {\n // Rehydrate `Details` data on `basket.Products` entries\n return getBasketId().then(bId => {\n let services = [\n service.flight(bId),\n service.hotel(bId),\n service.transfer(bId),\n service.adHoc(bId)\n ];\n\n if (TRPCONFIG.Domain.MarhabaEnabled) {\n services.push(service.marhaba(bId));\n }\n\n return $q.all(services);\n });\n }\n\n function getDynamicPackage(flatList) {\n // Rehydrates and returns `basket.Products` grouped by type (or `flatList`)\n return _rehydrateDynamicPackage()\n .then(res => {\n // Normalise entries to [{}, {}, ...]\n res = res.map(p => arrayUtil.wrapNonArray(p));\n return flatList ? _.flatten(res) : {\n f: res[0],\n h: res[1],\n t: res[2],\n ah: res[3],\n m: TRPCONFIG.Domain.MarhabaEnabled ? res[4] : null\n };\n });\n }\n\n function removeOption(type, productId, optionId, basketId) {\n return _productsByType(type, basketId, true)\n .then(function(p) {\n if (p && p.Options) {\n const i = _optionIndex(p.Options, optionId);\n if (i >= 0) {\n p.Options.splice(i, 1);\n }\n }\n return _changeOption(type, productId, optionId, 'removeoption', basketId);\n });\n }\n\n function addOption(type, productId, optionId, basketId, quantity) {\n return _productsByType(type, basketId, true)\n .then(function(p) {\n if (p && p.Options) {\n const i = _optionIndex(p.Options, optionId);\n if (i < 0) {\n p.Options.push({\n OptionId: optionId,\n ChosenQuantity: quantity\n });\n }\n }\n return _changeOption(type, productId, optionId, 'addoption', basketId, quantity);\n });\n }\n\n function addOptions(type, productId, options, basketId) {\n return options.length === 0 ?\n _optionsByType(type, basketId) :\n _changeOptions(type, productId, options, 'addoptions', basketId);\n }\n\n function removeOptions(type, productId, options, basketId) {\n return options.length === 0 ?\n _optionsByType(type, basketId) :\n _changeOptions(type, productId, options, 'removeoptions', basketId);\n }\n\n function getNotes(basketId) {\n return _getBasket(basketId).then(b => b.Notes);\n }\n\n function addNote(basketId, text) {\n const payload = JSON.stringify({\n BasketId: basketId,\n NoteText: text\n });\n const conf = {\n ignoreErrors: true\n };\n\n return $http.post(`${url}addnote`, payload, conf)\n .then(res => {\n basket = $q.when(res.data);\n return res.data;\n })\n .catch(() => ({}));\n }\n\n function _hidePricesIfNecessary(products) {\n return tripService.usePackageRates().then(packagePrice => {\n if (packagePrice) {\n //check whether flight cost breakdown needs to be shown\n let productsToHidePrice = TRPCONFIG.Domain.PackageFlightPrice ? [products.h, products.f] : products.h;\n angular.forEach([productsToHidePrice], product => {\n arrayUtil.wrapNonArray(product).forEach(p => {\n if (p) {\n angular.forEach(p.CostBreakdown, function(el) {\n el.HidePrice = true;\n });\n }\n });\n });\n }\n return products;\n });\n }\n\n function groupProducts(products, excluded = {}) {\n const results = [];\n _.forEach(productResultMap, (groupName, k) => {\n if (!excluded[k]) {\n arrayUtil.wrapNonArray(products[k]).forEach(p => {\n if (p && p.CostBreakdown) {\n const groupEntry = _.find(results, {\n group: productGroup[groupName]\n });\n if (groupEntry) {\n groupEntry.costBreakdown = (groupEntry.costBreakdown || []).concat(p.CostBreakdown);\n groupEntry.futurePaymentAdminFees = (groupEntry.futurePaymentAdminFees || []).concat(p.FuturePaymentAdminFees);\n } else {\n results.push({\n costBreakdown: p.CostBreakdown,\n futurePaymentAdminFees: p.FuturePaymentAdminFees,\n group: productGroup[groupName]\n });\n }\n }\n });\n }\n });\n return results;\n }\n\n function costBreakdownGrouped(basketId) {\n return service.all(basketId)\n .then(products => {\n let extras = {};\n let exclusions;\n\n // Extras\n return _hidePricesIfNecessary(products).then(es => {\n if (products.h || products.f) {\n extras = _enhanceCostBreakdownsWithProductTypes(angular.copy(es));\n delete extras.h;\n delete extras.f;\n exclusions = { t: true, p: true, a: true };\n }\n }).then(() => {\n const results = groupProducts(_enhanceCostBreakdownsWithProductTypes(products), exclusions);\n\n if (!_.isEmpty(extras)) {\n results.push({\n costBreakdown: _concatCostBreakdowns(extras),\n group: productGroup.Extra\n });\n }\n return tripService.usePackageRates().then(packagePrice => {\n results.isPackage = packagePrice;\n return _calculateProductTotals(results);\n });\n });\n });\n }\n\n function _enhanceCostBreakdownsWithProductTypes(products) {\n _.forEach(products, value => {\n if (value && value.ProductType) {\n const x = value.ProductType;\n _.forEach(value.CostBreakdown, value => {\n value.ProductType = x;\n });\n }\n });\n return products;\n }\n\n function costBreakdown(basketId, productId) {\n if (costBreakdownResult) {\n return costBreakdownResult;\n }\n costBreakdownResult = service.all(basketId, productId)\n .then(_getAllCostBreakdowns);\n\n return costBreakdownResult;\n }\n\n function payments(basketId) {\n return _getBasket(basketId)\n .then(function(b) {\n return _enrichPayments(b);\n });\n }\n\n function payDirectTotal(basketId) {\n return service.payments(basketId).then(payment => {\n let directAmount = 0;\n _.forEach(payment.products, p => {\n directAmount = _.reduce(p.directPayments, (result, value) => {\n return result + value.amount;\n }, directAmount);\n });\n return directAmount;\n });\n }\n\n function balancesDue(basketId, productId) {\n const s = (b1, b2) => b1.Due > b2.Due ? 1 : -1;\n\n return service.all(basketId, productId)\n .then(function(products) {\n const balances = {};\n if (products.all) {\n products.all.forEach(product => {\n arrayUtil.wrapNonArray(product).forEach(p => {\n if (p && p.FuturePayments && p.FuturePayments.length > 0) {\n p.FuturePayments.forEach(fp => {\n if (balances[fp.Due] == null) {\n balances[fp.Due] = {\n Due: fp.Due,\n Amount: 0\n };\n }\n balances[fp.Due].Amount += fp.Amount;\n });\n }\n });\n });\n }\n const balancesArray = Object.keys(balances).map(d => balances[d]);\n balancesArray.sort(s);\n return balancesArray;\n });\n }\n\n function totalDeposit(basketId) {\n return payDepositAggregates(basketId)\n .then(pda => pda.TotalImmediatePayment);\n }\n\n function payDepositAggregates(basketId) {\n return _getBasket(basketId)\n .then(b => b.PayDepositAggregates);\n }\n\n function totalDiscount(basketId) {\n return service.costBreakdown(basketId)\n .then(sumDiscounts);\n }\n\n function sumDiscounts(cb) {\n return cb.reduce((sum, c) =>\n /* select only discounts. id 20 is discounts */\n c.UnitAmount < 0 && c.TypeId === 20\n ? sum + (c.Quantity * c.UnitAmount) :\n sum, 0);\n }\n\n function totalCost(basketId) {\n return TRPCONFIG.Domain.EnableAmendBookingV2\n ? totalAmount(basketId)\n : service.costBreakdown(basketId).then(sumCosts);\n }\n\n function totalAmount(basketId) {\n return service.all(basketId)\n .then(({ all }) => _(all).map(a => a ? a.TotalAmount : 0).sum());\n }\n\n function _getAllCostBreakdowns(products) {\n return _hidePricesIfNecessary(products).then(_concatCostBreakdowns);\n }\n\n function sumCosts(cb) {\n return cb.reduce((sum, c) => sum + (c.Quantity * c.UnitAmount), 0).toFixed(2);\n }\n\n function totalCostFromBasket(products) {\n return $q.when(products).then(_getAllCostBreakdowns).then(sumCosts);\n }\n\n function attractionCost(basketId) {\n return _costByProduct(productType.Attractions, basketId);\n }\n\n function carHireCost(basketId) {\n return _costByProduct(productType.CarHire, basketId);\n }\n\n function carHireRequestedItemsCosts(basketId) {\n return _requestedItemsCostsByProduct(productType.CarHire, basketId);\n }\n\n function marhabaCost(basketId) {\n return _costByProduct(productType.Marhaba, basketId);\n }\n\n function _productSpecificFields(type, basketId) {\n return _productsByType(type, basketId, true)\n .then(function(p) {\n return (p && p.ProductSpecificFields) || null;\n });\n }\n\n function flightSpecificInfo(basketId) {\n return _productSpecificFields(productType.Flight, basketId);\n }\n\n function flightCost(basketId) {\n return _costByProduct(productType.Flight, basketId);\n }\n\n function flightBaggageCostings(basketId) {\n return flightSpecificInfo(basketId)\n .then(i => {\n let costings = {\n total: 0,\n discount: 0\n };\n\n const baggageCosts = i.BaggageCostings;\n if (baggageCosts) {\n costings.total = baggageCosts.Total;\n costings.discount = baggageCosts.Discount;\n } else {\n costings.total = i.TotalBaggageCost;\n //this is to be removed, here so that we don't have to tie the flights release\n // to the website release HJ-64 HJ-57\n }\n return costings;\n });\n }\n\n function hotelCost(basketId) {\n return _costByProduct(productType.Accommodation, basketId);\n }\n\n function hotelDeposit(basketId) {\n return service.hotel(basketId)\n .then(hotel => (hotel && hotel.ImmediatePayment) ? hotel.ImmediatePayment.Amount : 0);\n }\n\n function insuranceCost(basketId) {\n return _costByProduct(productType.Insurance, basketId);\n }\n\n function isAtolProtected(basketId) {\n return _getBasket(basketId)\n .then(basket => basket.IsAtolProtected);\n }\n\n\n function parkingCost(basketId) {\n return _costByProduct(productType.Parking, basketId);\n }\n\n function transferCost(basketId) {\n return _costByProduct(productType.Transfer, basketId);\n }\n\n function rules(basketId, productId) {\n return service.all(basketId, productId)\n .then(function(products) {\n const hotelOnly = products.h != null && products.f == null && products.t == null && products.m == null && products.i == null && !arrayUtil.count(products.a);\n const hasTransfer = products.t != null;\n const hasOutboundTransfer = products.t != null && products.t.Details.Itinerary.OutboundLeg != null;\n const hasInboundTransfer = products.t != null && products.t.Details.Itinerary.InboundLeg != null;\n const hasParking = products.p != null;\n const hasCarHire = products.c != null;\n const hasCarHirePayableLocally = products.c && products.c.RequestedItems && products.c.RequestedItems.length;\n const hasInsurance = products.i != null;\n const productList = [products.f, products.h, products.i, products.t, products.m, products.p, ...products.a];\n const isOriginOpenJaw = products.f && products.f.Details && products.f.Details.Itinerary && products.f.Details.Itinerary.IsOriginOpenJaw;\n const hasConnectingFlight = products.m != null && products.m.Details.MarhabaQuote.Type === 2;\n const isAttractionsStandalone = !products.h && !products.f && products.a && !!products.a.length;\n\n return {\n captureMainDriver: hasCarHire,\n hasChauffeur: _checkChauffeur(products.m),\n hasAttraction: products.a != null,\n hotelOnly,\n hasMarhaba: products.m != null,\n captureConnectingFlight: hasConnectingFlight,\n captureFlight: (products.f == null && hasTransfer),\n hasTransfer,\n hasOutboundTransfer,\n hasInboundTransfer,\n captureOutboundFlight: hasOutboundTransfer,\n captureInboundFlight: hasInboundTransfer,\n captureSpecialRequests: (products.h != null || products.m != null),\n captureHotel: (products.h == null && products.t != null),\n captureInsurance: hasInsurance,\n captureVehicle: hasParking,\n showPayableNow: arrayUtil.count(productList, function(p) { return p && p.ImmediatePayment && p.ImmediatePayment.Amount > 0; }) > 0,\n showPayableLocally: hasCarHirePayableLocally,\n depositAllowed: arrayUtil.count(productList, function(p) { return p && p.FuturePayments && p.FuturePayments.length > 0; }) > 0,\n showDirectPayments: arrayUtil.count(productList, function(p) { return p && p.DirectPayments && p.DirectPayments.length > 0; }) > 0,\n showOptionalExtras: products.f != null && _.some(products.f.Details.FlightSectorOptionalExtras, sector => sector.OptionalExtras.length > 0),\n empty: products.f === null && products.h === null && products.i == null && products.t === null,\n showParkingQuotes: _.get(products, 'f.Details.Itinerary.Legs.length') > 1 && !isOriginOpenJaw,\n isAttractionsStandalone\n };\n });\n }\n\n function insurance(basketId) {\n return _rehydrateProducts(productType.Insurance, insuranceService.rehydrate.bind(insuranceService), basketId, true);\n //return _productsByType(productType.Insurance, basketId, true);\n }\n\n function parking(basketId) {\n return _rehydrateProducts(productType.Parking, parkingDetailsService.rehydrate.bind(parkingDetailsService), basketId, true);\n //return _productsByType(productType.Parking, basketId, true);\n }\n\n function attraction(basketId) {\n return _rehydrateProducts(productType.Attractions, attractionDetailsService.rehydrate.bind(attractionDetailsService), basketId);\n }\n\n function adHoc(basketId) {\n return _rehydrateProducts(productType.AdHoc, adHocService.rehydrate.bind(adHocService), basketId);\n }\n\n function removeInsurance(basketId) {\n return _removeProduct(productType.Insurance, basketId);\n }\n\n function removeParking(basketId) {\n return _removeProduct(productType.Parking, basketId);\n }\n\n function removeAttraction(basketId) {\n return _removeProduct(productType.Attractions, basketId);\n }\n\n function addInsurance(searchId, quote, basketId) {\n return insuranceService.getInsuranceDetails({\n AvailabilityId: searchId,\n SchemeId: quote.QuoteType.SchemeId,\n TripTypeId: quote.QuoteType.TypeId,\n SupplierId: quote.SupplierId,\n DestinationId: quote.QuoteType.DestinationId,\n RelationshipId: quote.QuoteType.RelationshipId\n }).then(function(d) {\n const opt = [{ OptionId: `${quote.QuoteType.SchemeId}|${quote.QuoteType.TypeId}|${quote.SupplierId}|${quote.QuoteType.RelationshipId}` }];\n return _addProduct(productType.Insurance, searchId, d.DetailSearchId, basketId, opt).then(function() {\n return service.insurance(basketId);\n });\n });\n }\n\n function addCancellationProtection(productId, quote, basketId, quantity) {\n\n return addOption(productType.Accommodation, productId, quote.QuoteId, basketId, quantity)\n .then(() => {\n broker.publish('basketUpdated');\n });\n }\n\n function removeCancellationProtection(productId, quote, basketId) {\n\n return removeOption(productType.Accommodation, productId, quote.QuoteId, basketId)\n .then(() => {\n broker.publish('basketUpdated');\n });\n }\n\n function rehydrateBasketForPUP(basketId) {\n _flushBasket();\n basket = _getBasketById(basketId);\n return basket;\n }\n\n function addCar(searchId, quote, basketId) {\n return carHireDetailsService.getCarDetails({\n AvailabilitySearchId: searchId,\n CarHireQuote: quote\n }).then(function(d) {\n return _addProduct(productType.CarHire, searchId, d.DetailsSearchId, basketId)\n .then(function() {\n return service.carHire(basketId);\n });\n });\n }\n\n function addParking(searchId, parking, basketId) {\n return parkingDetailsService.getParkingDetails({\n AvailabilitySearchId: searchId,\n AirportParkingQuoteId: parking\n }).then(function(d) {\n return _addProduct(productType.Parking, searchId, d.DetailsSearchId, basketId).then(function() {\n return service.parking(basketId);\n });\n });\n }\n\n function putAttractionExtras(searchId, attractions, basketId) {\n // Create or replace attraction extras entry in basket\n const atts = [];\n angular.forEach(attractions.selected, function(a) {\n atts.push({\n AttractionId: a,\n TicketTypesCount: attractions.occupancy[a]\n });\n });\n return removeAttraction(basketId)\n .then(() =>\n attractionDetailsService.getAttractionDetails({\n AvailabilitySearchId: searchId,\n AttractionRequests: atts\n }))\n .then(details => _addProduct(\n productType.Attractions,\n searchId,\n details.DetailsSearchId,\n basketId\n ))\n .then(() => service.attraction(basketId));\n }\n\n function addAttraction(productId, productTags, basketId) {\n // Add standalone attractions product to basket\n const domain = TRPCONFIG.Domain;\n return $http.post(\n '/api2/attractions/bookingfunnel/addtobasket', {\n BasketId: basketId,\n AvailabilityRequest: {\n Id: productId,\n DomainId: domain.DomainId,\n Tags: productTags,\n Currency: domain.CurrencyCode\n }\n },\n { ignoreErrors: true }\n ).then(\n res => _refreshAttractionsBasket(res.data, basketId),\n err => ({ error: err })\n );\n }\n\n function updateAttraction(lineItemId, updates, basketId) {\n // Modify standalone attractions product in basket\n return $http.post(\n '/api2/attractions/bookingfunnel/updatebasket', {\n BasketId: basketId,\n LineItemId: lineItemId,\n Updates: updates,\n DomainId: TRPCONFIG.Domain.DomainId\n },\n { ignoreErrors: true }\n ).then(\n res => _refreshAttractionsBasket(res.data, basketId),\n err => ({ error: err })\n );\n }\n\n function removeAttractionsLineItem(lineItemId, basketId) {\n // Remove standalone attractions product from basket\n return $http.post(\n '/api2/attractions/bookingfunnel/removefrombasket', {\n BasketId: basketId,\n LineItemId: lineItemId\n },\n { ignoreErrors: true }\n ).then(\n res => _refreshAttractionsBasket(res.data, basketId),\n err => ({ error: err })\n );\n }\n\n function getAttractionsBasket() {\n // Get all standalone attractions products in basket\n return attractionsBasket || (\n attractionsBasket = getAttractionsBasketId()\n .then(id => $http.post(`/api2/attractions/bookingfunnel/getbasket?basketId=${id}`))\n .then(res => res.data)\n );\n }\n\n function getAttractionsBasketId() {\n return $q.when(\n TRPCONFIG.BasketId ||\n service.createBasket()\n .then(b => TRPCONFIG.BasketId = b.BasketId)\n );\n }\n\n function _refreshAttractionsBasket(basketData, basketId) {\n // `attractions/bookingfunnel/...` API makes back-end changes to the basket\n const responseBasketId = basketData.Basket.BasketId;\n basket = null;\n attractionsBasket = null;\n attractionDetailsService.purge();\n\n // Back-end creates a new basket if existing contains non-attractions products\n if (responseBasketId !== basketId) {\n TRPCONFIG.BasketId = responseBasketId;\n }\n\n return _getBasket(responseBasketId)\n .then(() => service.attraction(responseBasketId)) // Rehydrate `basket` products\n .then(() => {\n // Can't use `basketService.updateBasket()` due to circular dependency error\n broker.publish('basketUpdated');\n // Publish/return 'attractions/bookingfunnel' data format\n broker.publish('attractionsBasketUpdated', basketData);\n return basketData;\n });\n }\n\n function removeCar(basketId) {\n return _removeProduct(productType.CarHire, basketId);\n }\n\n function getBasketId(tripId) {\n if (tripId) {\n return tripService.getTrip(tripId).then(trip => {\n if (trip) {\n return trip.BasketId;\n }\n return $q.when();\n });\n } else if (TRPCONFIG.BasketId) {\n return $q.when(TRPCONFIG.BasketId);\n }\n\n return createBasket().then(basket => {\n TRPCONFIG.BasketId = basket.BasketId;\n return basket.BasketId;\n });\n }\n\n function getProductCount() {\n return getBasketId()\n .then(basketId => _getBasket(basketId))\n .then(basket => _.filter(basket.Products, p => p.CostBreakdown.length > 0).length);\n }\n\n function _simplifiedBaggageOptions(basketId) {\n return flight(basketId).then(f => {\n const baggageOptionsSimplified = [];\n\n const addToArray = function(arr, index, bagOption, price, weight) {\n if (arr.length <= index) {\n arr.push({ TotalPrice: 0, Bags: [], UnitWeightKg: [] });\n }\n arr[index].Bags.push(bagOption);\n arr[index].TotalPrice += price;\n arr[index].UnitWeightKg.push(weight);\n };\n //for multiple sectors adding 1 bag will mean multiple options being added under the hood\n //so 1 bag option may contain an array of options\n // e.g if you add a bag to your out leg your are more than likely going to need it on the way back\n _.forEach(f.Details.FlightSectorOptionalExtras, extras => {\n const baggageOptions = _.find(extras.NonCheckInOptions, ['Type', 0]);\n if (baggageOptions) {\n _.forEach(baggageOptions.MultiOptionalExtras, (multi, index) => {\n const opt = _.find(multi.Options, { IsDefault: true });\n addToArray(baggageOptionsSimplified, index, opt.Key, opt.UnitAmount, opt.UnitWeightKg);\n });\n\n const options = _.filter(baggageOptions.SingleOptionalExtras, { IsDefault: true });\n _.forEach(options, (opt, index) => {\n addToArray(baggageOptionsSimplified, index, opt.Key, opt.UnitAmount, opt.UnitWeightKg);\n });\n }\n });\n return baggageOptionsSimplified;\n });\n }\n\n function _baggageOptionComparer(o1, o2) {\n const o1qty = o1.Quantity || o1.ChoosenQuantity;\n const o2qty = o2.Quantity || o2.ChoosenQuantity;\n return o1.OptionId === o2.OptionId && o1qty === o2qty;\n }\n\n function simplifiedBaggageCount(basketId) {\n //figure out how many bags from our possible list\n //are actually selected\n return $q.all([\n flightOptions(basketId),\n _simplifiedBaggageOptions(basketId)\n ]).then(results => {\n let bagsSelected = 0;\n const basketOptions = results[0];\n const bagOptions = results[1];\n\n //check the whole option is in our basket\n _.forEach(bagOptions, option => {\n const selected = _.every(option.Bags, function(opt) {\n return _.some(basketOptions, function(bo) {\n return _baggageOptionComparer(opt, bo);\n });\n });\n if (selected) {\n bagsSelected++;\n }\n });\n\n const minWeight = (bagOptions.length > 0) ? _.min(_.flatMap(bagOptions, o => o.UnitWeightKg)) : 0;\n\n return {\n selected: bagsSelected,\n maxAllowed: bagOptions.length,\n price: (bagOptions.length > 0) ? bagOptions[0].TotalPrice : 0,\n unitWeightKg: minWeight\n };\n });\n }\n\n function updateBaggageOptions(basketId, count, model) {\n return $q.all([\n flight(basketId),\n flightOptions(basketId),\n _simplifiedBaggageOptions(basketId)\n ]).then(results => {\n const flight = results[0];\n const bagOptions = results[2];\n const allBagOptions = flight.Details.FlightSectorOptionalExtras.reduce((res, cur) => {\n const baggageNonCheckInOptions = _.find(cur.NonCheckInOptions, ['Type', 0]);\n return res.concat(baggageNonCheckInOptions.MultiOptionalExtras.reduce((res, cur) =>\n res.concat(cur.Options.map(op => op.Key)),\n []).concat(baggageNonCheckInOptions.SingleOptionalExtras.map(option => option.Key)));\n },\n []);\n const basketOptions = _.intersectionBy(results[1], allBagOptions, 'OptionId');\n let selectedOptions = [];\n\n const createBasketOption = option => {\n return {\n OptionId: option.OptionId,\n ChosenQuantity: option.Quantity\n };\n };\n\n //use the count to figure out which bags we need to select\n _.times(count, i => {\n selectedOptions = selectedOptions.concat(bagOptions[i].Bags);\n });\n\n //compare what we want with what we have and add/remove accordingly\n const optionsToRemove = _.map(\n arrayUtil.difference(basketOptions, selectedOptions, _baggageOptionComparer),\n o => createBasketOption(o)\n );\n const optionsToAdd = _.map(\n arrayUtil.difference(selectedOptions, basketOptions, _baggageOptionComparer),\n o => createBasketOption(o)\n );\n\n return removeOptions(productType.Flight, flight.ProductId, optionsToRemove, basketId)\n .then(() => addOptions(productType.Flight, flight.ProductId, optionsToAdd, basketId))\n .then(options => {\n _.pullAllBy(model[0], optionsToRemove, 'OptionId');\n\n //not great, a bit of a band aid while we still use the 'old' options page and have all flight\n //options handled together (seats, meals) using the code in optionsCtrl\n const optionsOldFormat = _.map(optionsToAdd, o => {\n return {\n OptionId: o.OptionId,\n Quantity: o.ChosenQuantity\n };\n });\n model[0].push(...optionsOldFormat);\n return options;\n });\n });\n }\n\n function updatePriorityBoarding(basketId, pbDetails, pbSelectedStatus) {\n return flight(basketId).then(flight => {\n const pbBasketOptions = [{\n OptionId: pbDetails.OptionId,\n ChosenQuantity: pbDetails.Quantity\n }];\n\n return pbSelectedStatus\n ? addOptions(productType.Flight, flight.ProductId, pbBasketOptions, basketId)\n : removeOptions(productType.Flight, flight.ProductId, pbBasketOptions, basketId);\n });\n }\n\n function setProductVisibility(userRequest) {\n return $http.post(`${url}setproductvisibility`, userRequest);\n }\n\n function setAdjustmentVisibility(adjustmentRequest) {\n return $http.post(`${url}setadjustmentvisibility`, adjustmentRequest);\n }\n\n function checkBasketBookingAllowed(basketId) {\n return _getBasket(basketId)\n .then(basket => {\n return basket.Products.every(p =>\n (p.ProductSpecificFields == null) || (p.ProductSpecificFields.IsBookable == null) || (p.ProductSpecificFields.IsBookable));\n });\n }\n\n function setBasketIdentity(basketId, userRequest) {\n let validateTravelAgent = req => !_.isEmpty(req)\n && !_.isEmpty(req.TravelAgent)\n && !_.isEmpty(_.trim(req.TravelAgent.FirstName))\n && !_.isEmpty(_.trim(req.TravelAgent.LastName));\n\n return !validateTravelAgent(userRequest)\n ? $q.reject('bad request')\n : $http.post(`${url}setidentities`, {\n BasketId: basketId,\n TravelAgent: userRequest ? userRequest.TravelAgent : null,\n TravelAgentCustomer: userRequest ? userRequest.TravelAgentCustomer : {}\n }).then(result => {\n basket = $q.when(result.data);\n return getBasketIdentity(result.data.BasketId);\n });\n }\n\n function getBasketIdentity(basketId) {\n return _getBasket(basketId)\n .then(basket => {\n return {\n TravelAgent: basket.TravelAgent,\n TravelAgentCustomer: basket.TravelAgentCustomer\n };\n });\n }\n\n function getBasketCurrency(basketId) {\n return _getBasket(basketId).then(basket => basket && basket.Currency || '');\n }\n\n function applyCancelations(basketId, legacyBasketId) {\n if (!$routeParams.BookingRef) {\n return $q.when();\n }\n return $http.post(`${url}applycancellations`, {\n CultureCode: TRPCONFIG.Domain.CultureCode,\n BasketId: basketId,\n DomainId: TRPCONFIG.Domain.DomainId,\n LegacyBasketId: legacyBasketId,\n })\n .then(({ data }) => {\n basket = $q.when(data);\n });\n }\n\n function extrasBreakdown(arr) {\n let extras = {\n transfersCost: 0,\n insuranceCost: 0,\n parkingCost: 0,\n carHireCost: 0,\n marhabaCost: 0\n };\n\n _.each(arr, cb => {\n if (cb.ProductType === productType.Transfer) {\n extras.transfersCost += cb.Quantity * cb.UnitAmount;\n }\n if (cb.ProductType === productType.Insurance) {\n extras.insuranceCost += cb.Quantity * cb.UnitAmount;\n }\n if (cb.ProductType === productType.Parking) {\n extras.parkingCost += cb.Quantity * cb.UnitAmount;\n }\n if (cb.ProductType === productType.CarHire) {\n extras.carHireCost += cb.Quantity * cb.UnitAmount;\n }\n if (cb.ProductType === productType.Marhaba) {\n extras.marhabaCost += cb.Quantity * cb.UnitAmount;\n }\n });\n\n return extras;\n }\n\n /*\n Subscriptions\n */\n broker.subscribe('basketStore', 'travelAgentSignIn', () => _refreshBasket());\n\n broker.subscribe('basketStore', 'agentSignedInToBooking', ({ data }) =>\n setBasketIdentity(TRPCONFIG.BasketId, {\n TravelAgent: data.TravelAgent,\n TravelAgentCustomer: _.omit(data.Contact, ['Email', 'BookingId', 'SiteId'])\n }));\n\n return service;\n}\n})();\n","namespace Core {\n\n //service to hold common bits required for tracking data when completing a booking.\n //two routes for us to handle booking complete from the booking form and complete after\n //coming from payment via PayPal\n\n type QuoteService = Quote.QuoteService;\n type TripState = Core.Trip.TripState;\n type TripType = Core.Trip.TripType;\n\n interface TrackingData\n {\n hotel : any;\n totalCost :number;\n }\n\n export class BookingCompleteTrackingService {\n\n constructor(\n private $q :ng.IQService,\n private abTest :any,\n private analytics :any,\n private basketStore :any,\n private criteoService :any,\n private ecommerceService :any,\n private quoteService :QuoteService,\n private trackingPixelsService :any\n ) {\n }\n\n trackConversion(trip :TripState,\n refs :string[],\n source :string,\n userEmail :string,\n rooms :any):ng.IPromise {\n\n return this.basketStore.all(trip.BasketId).then(basket => {\n //dont bother running analytics code as we dont have a basket anymore!\n if (basket.f == null && basket.h == null && basket.t == null && basket.c == null &&\n basket.a == null && basket.p == null) {\n return;\n }\n return this.trackTotalCost(\n trip.BasketId,\n basket,\n refs,\n source,\n userEmail,\n trip.TripId,\n trip.TripType,\n trip.QuoteId,\n rooms\n );\n });\n }\n\n private trackTotalCost(basketId :string,\n basket :any,\n refs :string[],\n source :string,\n userEmail :string,\n tripId :string,\n tripType :TripType,\n quoteId :string | undefined,\n rooms :any) :ng.IPromise {\n\n return this.$q.all([\n this.basketStore.totalCostFromBasket(basket),\n this.basketStore.getBasketCurrency(basketId)\n ]).then(results => {\n const totalCost = results[0];\n const currency = results[1];\n\n const criteoData = {\n ref: refs.join('|'),\n items: {\n hotel: basket.h,\n flight: basket.f\n },\n price: totalCost\n };\n\n this.criteoService.enqueue(criteoData, 'bookingcomplete', tripType);\n\n const trackingData = {\n TotalCost: totalCost,\n Hotel: basket.h,\n Flight: basket.f,\n CarHire: basket.c,\n Transfer: basket.t,\n Attractions: basket.a,\n Insurance: basket.i,\n Parking: basket.p,\n Marhaba: basket.m,\n FirstBookingId: refs[0].split('/')[1],\n Source: source\n };\n\n this.analytics.track('mixpanel', 'BookingComplete', trackingData);\n this.analytics.track('mixpanelPeople', 'BookingComplete', trackingData);\n this.analytics.setMixpanelEmail(userEmail);\n\n return this.ecommerceService.pushBasket(tripId, basket, totalCost, refs)\n .then(() => {\n this.trackingPixelsService.setData(refs, currency, totalCost, basket.h, rooms, tripType);\n\n this.abTest.recordRevenue(totalCost);\n\n const run = $.when();\n\n if (TRPCONFIG.Domain.QuoteEnabled && quoteId) {\n run.then(() => this.quoteService.linkQuote(refs, quoteId));\n }\n\n return run;\n });\n });\n }\n\n\n }\n\n angular\n .module('TR')\n .service('bookingCompleteTrackingService', BookingCompleteTrackingService);\n}\n","(function() {\n'use strict';\r\n\r\n/*\r\n this is a horrible hack to make sure that all the services\r\n that we need to be constructed and listening for events are\r\n alive and ready\r\n*/\r\nangular\r\n .module('TR')\r\n .service('bootstrapper', bootstrapper);\r\n\r\nfunction bootstrapper($injector) {\n const service = {\r\n init\r\n };\r\n\r\n function init() {\r\n $injector.get('hotelService');\r\n $injector.get('flightSearch');\r\n $injector.get('hotelSearch');\r\n $injector.get('transferSearch');\r\n $injector.get('authService');\r\n $injector.get('searchUnitService');\r\n $injector.get('basketService');\r\n $injector.get('urgencyMessaging');\r\n }\r\n\r\n return service;\n}\n})();\n","(function() {\n'use strict';\r\n\r\nangular.module('TR')\r\n .service('cancellerService', cancellerService);\r\n\r\nfunction cancellerService($q, broker) {\n let supervisors = [];\r\n\r\n const service = {\r\n add,\r\n process: processFunc\r\n };\r\n\r\n function add(...validRoutes) {\r\n const supervisor = { validRoutes, canceller: $q.defer() };\r\n supervisors.push(supervisor);\r\n return supervisor.canceller;\r\n }\r\n\r\n function processFunc(nextRoute) {\r\n const remainingSupervisors = [];\r\n supervisors.forEach(function(s) {\n const valid = s.validRoutes.some(function(r) {\r\n if (r instanceof RegExp) {\r\n return r.test(nextRoute);\r\n }\r\n return r === nextRoute;\r\n });\r\n\r\n if (!valid) {\r\n broker.publish('unblock');\r\n s.canceller.resolve('CANCELLED');\r\n } else {\r\n remainingSupervisors.push(s);\r\n }\r\n });\r\n\r\n supervisors = remainingSupervisors;\r\n }\r\n\r\n return service;\n}\n})();\n","namespace TR {\n\n export enum KeyCode {\n TAB = 9,\n RETURN = 13,\n ESC = 27,\n SPACE = 32,\n PAGEUP = 33,\n PAGEDOWN = 34,\n END = 35,\n HOME = 36,\n LEFT = 37,\n UP = 38,\n RIGHT = 39,\n DOWN = 40\n }\n\n export interface ComponentUtil {\n getRandomID(prefix: string): string;\n }\n}\n","(function() {\n'use strict';\n\nangular.module('TR')\n .service('countryService', countryService);\n\nfunction countryService(hotelSearch, $filter, $http, destinationService, imageService, $q, arrayUtil, broker, fieldGroupService, objectTypeService) {\n const service = {\n getTopDeals\n };\n\n const fieldTypes = fieldGroupService.getFieldTypes();\n const fieldFlags = fieldGroupService.getFieldGroup([\n fieldTypes.Global,\n fieldTypes.Titles,\n fieldTypes.IndicativePrice,\n fieldTypes.ReviewSnippets,\n fieldTypes.Url,\n fieldTypes.Summary,\n fieldTypes.Recommendations\n ]);\n\n //yes this looks a lot like what the hotelSearch service does, but in this case we need to run n searches\n //concurrently which the hotelSearch service is specifically designed to prevent.\n function _getHotelsForDestination(dest) {\n const domain = TRPCONFIG.Domain;\n dest.loading = true;\n const objectTypeAndId = objectTypeService.getObjectTypeAndId(dest);\n return $http.post('/api/hotels/static/gethotelsbydestination', {\n DestinationType: objectTypeAndId.Type,\n DestinationId: objectTypeAndId.Id,\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId,\n CurrencyCode: domain.CurrencyCode,\n Paging: {\n Index: 0,\n Size: 2\n },\n SortCriterion: 1,\n FilterCriteria: hotelSearch.getFilter(),\n FieldFlags: fieldFlags\n }).then(function(result) {\n return arrayUtil.map(result.data.Hotels, function(hotel) {\n const dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, dim, dim);\n hotel.MinCostStr = $filter('roundedCurrency')(hotel.MinCost);\n hotel.OriginalCostStr = $filter('roundedCurrency')(hotel.OriginalCost);\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice);\n return hotel;\n });\n });\n }\n\n function getTopDeals(topn, destination, children) {\n function getHotels(children) {\n return hotelSearch.updateFilterFromFid().then(function() {\n return $q.all(arrayUtil.map(children, _getHotelsForDestination)).then(function(results) {\n let all = [];\n results.forEach(function(hotels, i) {\n children[i].hotels = hotels;\n all = all.concat(hotels);\n });\n broker.publish('hotelsReturnedFromSearch', all); //make sure we publish the results so that\n return children; //urgency messaging works efficiently\n });\n });\n }\n\n if (children == null) {\n return destinationService.getTopChildren(topn, destination).then(getHotels);\n }\n return getHotels(children);\n }\n\n return service;\n}\n})();\n","(function() {\n/* eslint-disable camelcase */\n'use strict';\n\nangular\n .module('TR')\n .factory('criteoService', criteoService);\n\nfunction criteoService($q,\n dateUtil,\n funcUtil,\n currentUser,\n searchUnitService,\n destinationAirport,\n currentDestination,\n broker) {\n const productTypes = {\n hotel: 1,\n tailorMade: 2,\n flight: 3\n };\n\n const userLanguages = {\n en: 'english',\n ar: 'arabic'\n };\n\n const language = TRPCONFIG.Domain.CultureCode != null\n ? userLanguages[TRPCONFIG.Domain.CultureCode.substring(0, 2)]\n : 'en';\n\n const service = {\n enqueue\n };\n\n let getCustomerIdComplete;\n\n broker.subscribe('criteoService', 'userExtended', function(ev) {\n if (getCustomerIdComplete) {\n getCustomerIdComplete.resolve(ev.data.UserIdHash);\n }\n });\n\n function _getCustomerId() {\n const user = currentUser.get();\n const isUserComplete = user && (user.Email !== undefined || !user.SignedIn);\n if (isUserComplete) {\n return $q.when(user.UserIdHash);\n }\n getCustomerIdComplete = $q.defer();\n return getCustomerIdComplete.promise;\n }\n\n function _getSearchDates(type) {\n const product = (type === 'hotel' ? searchUnitService.hotel : searchUnitService.flight);\n\n return {\n checkInDate: dateUtil.format(searchUnitService.startDate(product), 'yyyy-MM-dd'),\n checkOutDate: dateUtil.format(searchUnitService.endDate(product), 'yyyy-MM-dd')\n };\n }\n\n function _buildConfirmationId(items) {\n let id = '';\n if (items.hotel) {\n id += items.hotel.Details.Id;\n }\n if (items.flight && !items.hotel) {\n id += '::';\n id += searchUnitService.getDepartureAirports();\n }\n\n return id;\n }\n\n function _getIds(items, type) {\n const ids = [];\n\n switch (type) {\n case 'hotels':\n items = items.Hotels;\n angular.forEach(items, function(hotel) {\n ids.push(hotel.Id);\n });\n break;\n case 'flights':\n angular.forEach(items, function(flight) {\n ids.push(flight.FlightId);\n });\n }\n return ids;\n }\n\n const _config = function(type, tripType) {\n const promises = {\n customerId: _getCustomerId(),\n emailHash: (() => {\n const getEmailHash = () => currentUser.get() && currentUser.get().EmailHash;\n return type === 'bookingcomplete' ? funcUtil.waitForValue(getEmailHash) : getEmailHash();\n })()\n };\n return $q.all(promises).then(results => {\n results.customerId = results.customerId || '';\n const config = [\n { event: 'setCustomerId', id: results.customerId },\n { event: 'setAccount', account: TRPCONFIG.Domain.CriteoPartnerId },\n { event: 'setSiteType', type: (TRPCONFIG.IsMobileView) ? 'm' : 'd' }\n ];\n\n if (results.emailHash) {\n config.push({ event: 'setHashedEmail', m: results.emailHash, hash_method: 's2m' });\n }\n\n if (tripType != null) {\n switch (tripType) {\n case 4:\n config.push({ event: 'setData', append_to_landing_url: 'tm=1' });\n break;\n default:\n config.push({ event: 'setData', append_to_landing_url: 'tm=' });\n break;\n }\n }\n\n return config;\n });\n };\n\n function enqueue(data, type, tripType) {\n if (TRPCONFIG.Domain.isAgentMode) {\n return;\n }\n\n $('#criteo-tags-div').empty();\n\n if (TRPCONFIG.Domain.CriteoEnabled) {\n window.criteo_q = window.criteo_q || [];\n\n _config(type, tripType).then(function(conf) {\n let airports;\n let product;\n let title = null;\n\n switch (type) {\n case 'home':\n _homeTag(conf);\n break;\n case 'hotel':\n product = {\n dates: _getSearchDates('hotel'),\n type: productTypes.hotel,\n id: data.Id\n };\n _productTag(product, conf);\n break;\n case 'hotellist':\n currentDestination.getCurrentDestination().then(function(dest) {\n if (dest) {\n title = dest.Title;\n } else if (searchUnitService.getSearchArea() && data.Hotels) {\n title = data.Hotels[0].Location;\n }\n product = {\n dates: _getSearchDates('hotel'),\n items: _getIds(data, 'hotels'),\n type: productTypes.hotel\n };\n _productListTag(product, title, conf);\n });\n\n break;\n case 'flightlist':\n airports = searchUnitService.getDepartureAirports() || [];\n destinationAirport.getTopEstabsForAirport(airports[0]).then(function(data) {\n const ids = [];\n angular.forEach(data.Hotels, function(estab) {\n ids.push(estab.Id);\n });\n\n product = {\n dates: _getSearchDates('flight'),\n items: ids,\n type: productTypes.flight\n };\n _productListTag(product, null, conf);\n });\n break;\n case 'basket':\n product = {\n id: _buildConfirmationId(data.items),\n price: data.price\n };\n _basketTag(product, conf);\n break;\n case 'bookingcomplete': {\n const id = _buildConfirmationId(data.items);\n if (id != null) {\n product = {\n id,\n price: data.price\n };\n _confirmationTag(data.ref || data.ref[0], product, conf);\n }\n break;\n }\n case 'signin':\n _signinTag(data, conf);\n }\n });\n }\n }\n\n\n function _confirmationTag(transaction, product, conf) {\n window.criteo_q.push(\n conf,\n {\n event: 'trackTransaction',\n id: transaction || transaction.id,\n item: [{\n id: product.id,\n price: product.price,\n quantity: 1\n }],\n section: language\n }\n );\n }\n\n function _homeTag(conf) {\n window.criteo_q.push(\n conf,\n {\n event: 'viewHome',\n section: language\n }\n );\n }\n\n function _signinTag(data, conf) {\n window.criteo_q.push(\n conf,\n {\n event: 'setHashedEmail',\n m: data && data.EmailHash,\n hash_method: 's2m'\n }\n );\n }\n\n function _productTag(product, conf) {\n window.criteo_q.push(\n conf,\n { event: 'setData', user_segment: product.type },\n { event: 'viewItem', item: product.id, section: language }\n );\n\n if (product.dates.checkInDate || product.dates.checkOutDate) {\n window.criteo_q.push({\n event: 'viewSearch',\n checkin_date: product.dates.checkInDate,\n checkout_date: product.dates.checkOutDate\n });\n }\n }\n\n function _productListTag(product, keywords, conf) {\n window.criteo_q.push(\n conf,\n { event: 'setData', user_segment: product.type },\n {\n event: 'viewList',\n item: product.items,\n section: language,\n keywords\n },\n {\n event: 'viewSearch',\n checkin_date: product.dates.checkInDate,\n checkout_date: product.dates.checkOutDate\n }\n );\n }\n\n function _basketTag(product, conf) {\n window.criteo_q.push(\n conf,\n {\n event: 'viewBasket',\n section: language,\n retarget: 0,\n item: [{\n id: product.id,\n price: product.price,\n quantity: 1\n }]\n }\n );\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular.module('TR')\n .service('currentDestination', currentDestination);\n\nfunction currentDestination($routeParams, tripService, searchUnitService, destinationService, $q) {\n const service = {\n getCurrentDestination\n };\n\n function getCurrentDestination(options) {\n return destinationFn(options).then(destination => {\n if (destination == null) {\n return null;\n }\n return destinationService.enhanceDestinationFromPreferences(destination).then(() => destination);\n });\n }\n\n const defaults = {\n useTrip: true,\n useLandingPage: true,\n useSearchUnitService: true\n };\n\n function destinationFn(options) {\n options = angular.extend({}, defaults, options);\n\n if (options.useTrip && $routeParams.tripId) {\n return tripService.getTripDestination($routeParams.tripId);\n }\n if (options.useLandingPage && $routeParams.landingPageV4) {\n return destinationService.fromUrl(`/${$routeParams.urlText}/${$routeParams.landingPageV4}`, $routeParams.tm)\n .then(destinationService.enhanceLegacyDestination)\n .then(destinationService.getDetails);\n }\n if (options.useLandingPage && ($routeParams.landingPageV2 || $routeParams.landingPageV3)) {\n let tmParam = $routeParams.tm || '2';\n let route = '';\n if ($routeParams.landingPageV3) {\n let possibleParam = $routeParams.landingPageV3 && $routeParams.landingPageV3.match(/(?:\\d+-\\d+-)(\\d+)(?:-\\d+)/) || [];\n tmParam = possibleParam && possibleParam[1] !== '1' ? '1' : tmParam;\n route = $routeParams.landingPageV3;\n } else if ($routeParams.landingPageV2) {\n let possibleParam = $routeParams.landingPageV2 && $routeParams.landingPageV2.match(/(?:\\d+-\\d+-)(\\d+)?/) || [];\n tmParam = possibleParam && possibleParam[1] !== '1' ? '1' : tmParam;\n route = $routeParams.landingPageV2;\n }\n return destinationService.fromUrl(`/${route}/${$routeParams.urlText}`, tmParam)\n .then(destinationService.setFidFromDestinationFilter)\n .then(destinationService.enhanceLegacyDestination)\n .then(destinationService.getDetails);\n }\n if (options.useLandingPage && $routeParams.landingPage) {\n return destinationService.fromUrl(`/${$routeParams.landingPage}.html`, $routeParams.tm)\n .then(destinationService.enhanceLegacyDestination)\n .then(destinationService.getDetails);\n }\n if (options.useSearchUnitService) {\n return $q.when(searchUnitService.getDestination());\n }\n return $q.when();\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('dateUtil', dateUtil);\n\nfunction dateUtil($injector,\n $filter,\n $route,\n resourceService) {\n const oneDay = 24 * 60 * 60 * 1000;\n\n const service = {\n addDays,\n addMinutes,\n addHours,\n atLeastOneDayInTheFuture,\n atLeastTwoDaysInTheFuture,\n DateRange,\n format,\n getAge,\n getDurationSummary,\n isValid,\n minutesToHoursAndMinutes,\n numberOfNights,\n parseDate,\n serialiseDate,\n alignDates,\n sameDay,\n sameMonth,\n todayPlus,\n defaultTime,\n zeroTime,\n roundedToStartOfHour,\n dayDiff,\n thisWeek,\n nextWeek,\n thisMonth,\n specificMonth,\n oneDay: () => oneDay,\n compareDates,\n totalMinutes,\n getWeeksString,\n getDifferenceInDays,\n getDateInterval,\n checkZonedDateFromat,\n getNextSaturday\n };\n\n function getWeeksString(date1, date2) {\n const oneweek = 604800000; //ms in one week\n const weeks = Math.ceil((new Date(date2).setHours(0, 0, 0, 0).valueOf() - new Date(date1).setHours(0, 0, 0, 0).valueOf()) / oneweek);\n return `${weeks.toString()} ${(weeks > 1) ? resourceService.get('WEEKS') : resourceService.get('WEEK')}`;\n }\n\n function DateRange(start, end, timeSupport = false) {\n this.start = serialiseDate(start);\n this.end = serialiseDate(end);\n this.timeSupport = timeSupport;\n this.isStartTimeApprovedByCustomer = timeSupport ? false : undefined;\n this.isEndTimeApprovedByCustomer = timeSupport ? false : undefined;\n }\n\n DateRange.prototype.setStart = function(val, defaultTimeObj) {\n this.start = serialiseDate(val);\n if ((this.end == null && this.start != null) ||\n (this.end != null && this.start != null && numberOfNights(this.start, this.end) < 1)) {\n const areaInfo = getAreaInfo();\n const endDateOffset = areaInfo && areaInfo.endDateOffset || 1;\n const endDate = addDays(this.start, endDateOffset, true);\n\n if (this.timeSupport) {\n this.end = defaultTime(endDate, true, defaultTimeObj);\n } else {\n this.end = endDate;\n }\n }\n this.durationSummary = null;\n this.nights = null;\n };\n\n DateRange.prototype.setEnd = function(val) {\n this.end = serialiseDate(val);\n this.durationSummary = null;\n this.nights = null;\n };\n\n DateRange.prototype.getDurationSummary = function() {\n if (this.durationSummary) {\n return this.durationSummary;\n }\n this.durationSummary = getDurationSummary(this.start, this.end);\n return this.durationSummary;\n };\n\n DateRange.prototype.numberOfNights = function() {\n if (this.nights) {\n return this.nights;\n }\n this.nights = numberOfNights(this.start, this.end);\n return this.nights;\n };\n\n function today() {\n return zeroTime(new Date());\n }\n\n function zeroTime(date, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n const d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n d.setMilliseconds(0);\n return _serialiseIfNecessary(d, serialised);\n }\n\n function defaultTime(date, serialised, defaultTimeObj) {\n if (!date) { return null; }\n date = parseDate(date);\n const d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n if (defaultTimeObj) {\n d.setHours(defaultTimeObj.hours, defaultTimeObj.minutes);\n } else {\n d.setHours(11, 30);\n }\n return _serialiseIfNecessary(d, serialised);\n }\n\n function _toUtc(date, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n return _serialiseIfNecessary(new Date(date.getTime() - (date.getTimezoneOffset() * 60000)), serialised);\n }\n\n function todayPlus(options, ...rest) {\n if (!_.isObject(options)) {\n options = {\n days: options,\n hours: rest[0],\n serialised: rest[1]\n };\n }\n const d = zeroTime(new Date());\n if (options.months) {\n d.setMonth(d.getMonth() + options.months);\n }\n if (options.days) {\n d.setDate(d.getDate() + options.days);\n }\n if (options.hours) {\n d.setHours(options.hours);\n }\n return _serialiseIfNecessary(d, options.serialised);\n }\n\n function numberOfNights(earliest, latest) {\n if (earliest && latest) {\n const [e, l] = alignDates([earliest, latest], true);\n return Math.ceil((l.getTime() - e.getTime()) / oneDay);\n }\n return -1;\n }\n\n function format(date, fmt) {\n if (!date) {\n return null;\n }\n date = parseDate(date);\n return $filter('unadjustedDate')(date, fmt || 'd MMM yyyy');\n }\n\n function atLeastOneDayInTheFuture(date) {\n return _xDaysInTheFuture(date, 1);\n }\n\n function atLeastTwoDaysInTheFuture(date) {\n return _xDaysInTheFuture(date, 2);\n }\n\n function addDays(date, days, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n const d = new Date(date);\n d.setDate(date.getDate() + days);\n return _serialiseIfNecessary(d, serialised);\n }\n\n function addMinutes(date, minutes, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n const d = new Date(date);\n d.setMinutes(d.getMinutes() + minutes);\n return _serialiseIfNecessary(d, serialised);\n }\n\n function addHours(date, hours, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n const d = new Date(date);\n d.setHours(d.getHours() + hours);\n return _serialiseIfNecessary(d, serialised);\n }\n\n function getAge(birthDate, returnDate) {\n if (!birthDate || !returnDate) { return null; }\n birthDate = parseDate(birthDate);\n returnDate = parseDate(returnDate);\n let age = returnDate.getFullYear() - birthDate.getFullYear();\n const m = returnDate.getMonth() - birthDate.getMonth();\n if (m < 0 || (m === 0 && returnDate.getDate() < birthDate.getDate())) {\n age--;\n }\n return age;\n }\n\n function getDurationSummary(from, to) {\n from = parseDate(from);\n to = parseDate(to);\n if (!from || !isValid(from)) {\n return '';\n }\n\n if (to == null) { //perhaps for a one way flight\n return format(from);\n }\n if (to.getTime() === 0) {\n return format(from);\n }\n if (!isValid(to)) {\n return '';\n }\n const days = numberOfNights(from, to);\n return `${days} ${\n days > 1 ? resourceService.get('NIGHTS') : resourceService.get('NIGHT')\n }, (${format(from)}) - (${format(to)})`;\n }\n\n function minutesToHoursAndMinutes(m, leadingZero = true) {\n const hours = leadingZero ? $filter('frontPad')(Math.floor(m / 60)) : Math.floor(m / 60);\n const minutes = $filter('frontPad')(m % 60);\n return `${hours + resourceService.get('HOURABBR')} ${minutes}${resourceService.get('MINUTEABBR')}`;\n }\n\n function isValid(d) {\n d = parseDate(d);\n return d instanceof Date && isFinite(d);\n }\n\n //this function will treat all datetime strings as if they are GMT\n //if there is no timezone we add 'Z', if there is any other timezone\n //we replace with 'Z'. This allows us to then parse the date and\n //then undo the browser's adjustment meaning that we end up with whatever\n //we started with, regardless of timezone.\n function parseDate(str) {\n if (!str) { return null; }\n\n if (str instanceof Date) {\n return str;\n }\n\n if (typeof str === 'string' && /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(str)) {\n str += 'T00:00:00Z';\n }\n\n //we are expecting an ISO string but we need to check if it ends with a timezone\n //if it doesn't we must add Z for GMT because firefox does not assume Z as it should\n //according to http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\n if (typeof str === 'string' && !/^.+((\\+|-)[0-9]{2}:[0-9]{2}|Z)$/.test(str)) {\n str += 'Z';\n }\n\n //if the date string contains a timezone string other than 'Z' we need to replace it with 'Z'\n if (typeof str === 'string') {\n str = str.replace(/^(.+)((\\+|-)[0-9]{2}:[0-9]{2})$/, function(m, p1) {\n return `${p1}Z`;\n });\n }\n\n //parse the date into a new local timezone date object\n const d = new Date(str);\n\n //undo the offset that the browser *may* have applied so that we end up with\n //a date time that looks like the original string - yucky\n return new Date(d.getTime() + (d.getTimezoneOffset() * 60000));\n }\n\n function sameDay(d1, d2) {\n if (!d1 || !d2) { return null; }\n return zeroTime(d1, false).getTime() === zeroTime(d2, false).getTime();\n }\n\n function sameMonth(d1, d2) {\n if (!d1 || !d2) {\n return null;\n }\n return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();\n }\n\n function roundedToStartOfHour(date, serialised) {\n if (!date) { return null; }\n date = parseDate(date);\n const newDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), 0, 0);\n const minutes = date.getMinutes();\n\n if (minutes < 15) {\n return _serialiseIfNecessary(newDate, serialised);\n }\n if (minutes < 45) {\n return service.addMinutes(newDate, 30, serialised);\n }\n return service.addHours(newDate, 1, serialised);\n }\n\n function dayDiff(date1, date2) {\n if (!date1 || !date2) { return null; }\n date1 = parseDate(date1);\n date2 = parseDate(date2);\n const [a, b] = alignDates([date1, date2], true);\n return Math.abs(Math.floor((a - b) / oneDay));\n }\n\n function thisWeek() {\n const t = today();\n const y = t.getFullYear();\n const m = t.getMonth();\n const d = t.getDate();\n const dow = t.getDay();\n const startDay = 1; // monday\n const startDate = (d - dow) + startDay;\n const start = zeroTime(new Date(y, m, startDate));\n const end = addDays(start, 6);\n return new DateRange(start, end);\n }\n\n function nextWeek() {\n const dateRange = thisWeek();\n return new DateRange(addDays(dateRange.start, 7), addDays(dateRange.end, 7));\n }\n\n function thisMonth() {\n const d = today();\n const y = d.getFullYear();\n const m = d.getMonth();\n const start = zeroTime(new Date(y, m, 1));\n const end = zeroTime(new Date(y, m + 1, 0));\n return new DateRange(start, end);\n }\n\n function specificMonth(month, year) {\n const start = zeroTime(new Date(year, month, 1));\n const end = zeroTime(new Date(year, month + 1, 0));\n return new DateRange(start, end);\n }\n\n function serialiseDate(date) {\n date = parseDate(date);\n if (isValid(date)) {\n return _toUtc(date).toISOString();\n }\n return null;\n }\n\n function _serialiseIfNecessary(d, serialised) {\n return (serialised ? serialiseDate : parseDate)(d);\n }\n\n function _xDaysInTheFuture(date, days) {\n if (!date) { return null; }\n let t = today();\n [date, t] = alignDates([date, t], true);\n return date.getTime() - t.getTime() >= (oneDay * days);\n }\n\n // to be used exclusively for dates comparisons && calculations\n function alignDates(dates, zeroTime = false) {\n return dates.map(_.flowRight(_toUtc, zeroTime ? service.zeroTime : d => d));\n }\n\n\n /*\n returns -1 when d1d2,\n return 0 when d1=d2\n */\n function compareDates(d1, d2) {\n const [a1, a2] = alignDates([d1, d2]);\n if (a1 < a2) {\n return -1;\n }\n if (a1 > a2) {\n return 1;\n }\n return 0;\n }\n\n function totalMinutes(d1, d2) {\n const start = parseDate(d1);\n const end = parseDate(d2);\n const diffMs = end - start; // milliseconds between start & end\n\n return Math.floor(diffMs / 60000);\n }\n\n function getDifferenceInDays(d1, d2) {\n if (!d1 || !d2) { return 0; }\n const startTime = angular.copy(d1).setHours(0, 0, 0, 0);\n const endTime = angular.copy(d2).setHours(0, 0, 0, 0);\n return Math.floor((endTime - startTime) / (1000 * 60 * 60 * 24));\n }\n\n function getDateInterval(date, rangeLength, skipPivot) {\n const minimumDate = todayPlus(1, 0, false);\n const halfRange = Math.floor(rangeLength / 2);\n\n const initialDate = skipPivot ? date : addDays(date, -halfRange);\n const comparison = compareDates(initialDate, minimumDate);\n const startingDate = zeroTime(comparison === -1 ? minimumDate : initialDate);\n\n const dates = [];\n for (let i = 0, ii = rangeLength; i < ii; i++) {\n const d = addDays(startingDate, i).setHours(0, 0, 0, 0);\n dates.push(d);\n }\n return dates;\n }\n\n function getNextSaturday(weeks) {\n // This function finds your weekend in the future.\n const theFuture = todayPlus(weeks * 7);\n const howMaynDaysYet = 6 - theFuture.getDay();\n return addDays(theFuture, howMaynDaysYet, true);\n }\n\n let _Area;\n function getAreaInfo() {\n if (!_Area) {\n //I know $injector is not awesome but I'm trying to limit how much I refactor.\n _Area = $injector.get('Area');\n }\n const area = $route.current && $route.current.$$route && $route.current.$$route.area;\n return _Area[area];\n }\n\n function checkZonedDateFromat(str) {\n // Time-zoned date strings must have a four digit time zone in order to be parsed successfully by new Date()\n // valid formats: 'YYYY-MM-DDThh:mm:ss+hhmm' or 'YYYY-MM-DDThh:mm:ss+hh:mm'\n // eg: '2016-08-07T15:05:00+0100' or '2016-08-07T15:05:00+01:00'\n\n if (str === null) {\n return;\n }\n\n const time = str.substring(str.indexOf('T') + 1);\n\n let pos = time.indexOf('+');\n if (pos === -1) {\n pos = time.indexOf('-');\n }\n\n if (time.substring(pos + 1).length === 2) {\n // the time zone only specifies hours so we need to add minutes\n str += ':00';\n }\n\n return (new Date(str)).toISOString();\n }\n\n return service;\n}\n})();\n","namespace TR {\n\n export class DealsBoxService {\n\n hotelInfoBackTracked: boolean;\n singleEditTrack: any;\n\n\n constructor(\n private $filter: any,\n private holidayDeals: any,\n private dateUtil: any,\n private hotelFromSession: any,\n private occupancyService: any,\n private analytics: any\n ) {\n this.hotelInfoBackTracked = false;\n this.singleEditTrack = {};\n }\n\n enrichSelected(selected) {\n return this.holidayDeals\n .getCurrentFilters()\n .then(f => {\n let boardTypeFilter = f.BoardTypes.map(bt => parseInt(bt, 10));\n return _.first(this.holidayDeals.enrichDeals([selected], boardTypeFilter));\n });\n }\n\n getDealsForCalendar(estabId, duration, dates, selectedDate) {\n let boardTypeFilter;\n return this.holidayDeals\n .getCurrentFilters()\n .then(f => {\n boardTypeFilter = f.BoardTypes.map(bt => parseInt(bt, 10));\n return this.holidayDeals.getDealsForHotel(estabId, [duration], dates);\n })\n .then(h => {\n return h && h.HolidayDeals\n ? this.holidayDeals.enrichDeals(h.HolidayDeals, boardTypeFilter)\n : [];\n });\n }\n\n getTransfersMap(transferTimes) {\n if (!transferTimes) { return; }\n return transferTimes.reduce(\n (p, c) => {\n p[c.Airport] = c.Minutes;\n return p;\n }, {});\n }\n\n getRoomsForDeal(estabId, searchId, oldRoom, oldBoardType, persist) {\n let boardTypeFilter;\n return this.holidayDeals\n .getCurrentFilters()\n .then(f => {\n boardTypeFilter = f.BoardTypes.map(bt => parseInt(bt, 10));\n return this.hotelFromSession.getRoomTypes(estabId, searchId, boardTypeFilter);\n })\n .then(r => {\n const dealsRooms: any = {};\n dealsRooms.rooms = (r || r.length) ? this._sortRoomsByPrice(r) : [];\n if (r.length) {\n dealsRooms.best = this._pickBestRoom(\n dealsRooms.rooms,\n boardTypeFilter,\n oldRoom,\n oldBoardType,\n persist\n );\n }\n return dealsRooms;\n });\n }\n\n updatePriceLabels(rooms, selectedRoomId, currentBoardTypes, selectedBt, priceMode) {\n const updatedBoardTypes = currentBoardTypes.map(bt => {\n const { diff, label } = this._calcDifference(bt.Cost, selectedBt.Cost, priceMode);\n bt.NamePrice = diff === 0\n ? bt.BoardDescription\n : `${bt.BoardDescription} (${diff < 0 ? '-' : '+'}${label})`;\n return bt;\n });\n\n const updatedRooms = rooms.map(r => {\n const current =\n _.find(r.BoardOptions, (bt: any) => bt.BoardType === selectedBt.BoardType);\n const boardCost = current ? current.Cost : r.BoardOptions[0].Cost;\n const { diff, label } = this._calcDifference(boardCost, selectedBt.Cost, priceMode);\n r.PriceDiffLabel = `${diff < 0 ? '-' : '+'}${label}`;\n r.NamePrice = diff === 0 || r.MasterId === selectedRoomId\n ? r.RoomDescription\n : `${r.RoomDescription} (${r.PriceDiffLabel})`;\n\n return r;\n });\n\n return { updatedBoardTypes, updatedRooms };\n }\n\n findTemperature(selectedDate, temperatures) {\n if (!selectedDate || !temperatures) { return 0; }\n\n const weather = _.find(\n temperatures,\n (t: any) => t.Month === (selectedDate.getMonth() + 1)\n );\n return weather ? Math.round(weather.Temperature) : 0;\n }\n\n getTabCounter(entryPoint: string) {\n const tracking = { entryPoint };\n return (tab) => {\n if (!tab) { return tracking; }\n tracking[tab] = _.has(tracking, tab) ? tracking[tab] + 1 : 1;\n return tracking;\n };\n }\n\n sendTabTracking(tabsStat) {\n if (!tabsStat || !_.has(tabsStat, 'entryPoint')) { return; }\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsHotelDetails',\n tabsStat\n );\n }\n\n trackHotelInfoBack() {\n if (!this.hotelInfoBackTracked) {\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsHotelDetailsBack'\n );\n this.hotelInfoBackTracked = true;\n }\n }\n\n trackOpenBox(hotel, dealsNumber, dealsMiss) {\n this.hotelInfoBackTracked = false;\n this.singleEditTrack = {};\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsDetails',\n {\n EstabId: hotel.Id,\n EstabName: hotel.Title,\n ProvinceId: hotel.ProvinceId,\n Province: hotel.Province,\n CountryId: hotel.CountryId,\n Country: hotel.Country,\n StarRating: hotel.StarRating,\n DealsOnCalendar: dealsNumber,\n DealsMiss: dealsMiss\n }\n );\n }\n\n trackDateChange(newDeal, oldDeal) {\n if (!oldDeal || !oldDeal.Price) { return; }\n const dow = this.$filter('date')(newDeal.HotelDeal.CheckInDate, 'EEE');\n const delta = newDeal.Price - oldDeal.Price;\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsChangedDate',\n {\n DayOfWeek: dow,\n Delta: delta\n }\n );\n }\n\n trackDealEdit(type) {\n if (!this.singleEditTrack[type]) {\n this.analytics.track('mixpanel', `HolidayDealsChanged${type}`);\n this.singleEditTrack[type] = true;\n }\n }\n\n private _findSelected(deals, preselected) {\n let cheapest;\n for (let i = 0, ii = deals.length; i < ii; i++) {\n // pick perfect selection\n if (preselected && deals[i].DepartureEpoch === preselected.DepartureEpoch) {\n return deals[i];\n }\n\n // pick absolute cheapest in the grid\n if (!cheapest || deals[i].Price < cheapest.Price) { cheapest = deals[i]; }\n }\n return cheapest;\n }\n\n private _sortRoomsByPrice(rooms: any) {\n for (let i = 0, ii = rooms.length; i < ii; i++) {\n const r = rooms[i];\n r.BoardOptions = _.sortBy(r.BoardOptions, (b: any) => b.Cost);\n r.MinCost = r.BoardOptions[0].Cost;\n }\n return _.sortBy(rooms, (r: any) => r.MinCost);\n }\n\n private _pickBestRoom(\n rooms: any,\n boardTypes: any,\n oldRoom: any,\n oldBt: any,\n persist: boolean\n ) {\n let pRoom;\n let pBoardType;\n\n if (persist) {\n const persisted = this._persistSelection(rooms, oldRoom, oldBt);\n pRoom = persisted.pRoom;\n pBoardType = persisted.pBoardType;\n }\n\n if ((!boardTypes || !boardTypes.length) || (pRoom && pBoardType)) {\n return { room: pRoom || rooms[0], bt: pBoardType || rooms[0].BoardOptions[0] };\n }\n\n let bestSelection;\n for (let i = 0, ii = rooms.length; i < ii; i++) {\n const room = rooms[i];\n for (let j = 0, jj = room.BoardOptions.length; j < jj; j++) {\n const bt = room.BoardOptions[j];\n if (boardTypes.indexOf(bt.BoardType) > -1) {\n if (!bestSelection || bestSelection.bt.Cost > bt.Cost) {\n bestSelection = { room: pRoom || room, bt };\n }\n }\n }\n }\n\n return bestSelection;\n }\n\n private _persistSelection(rooms, oldRoom, oldBt) {\n const pRoom = oldRoom\n ? _.find(rooms, (r: any) => r.MasterId === oldRoom)\n : undefined;\n\n let pBoardType;\n if (pRoom) {\n pBoardType = _.find(pRoom.BoardOptions, (bt: any) => bt.BoardType === oldBt);\n }\n\n return { pRoom, pBoardType };\n }\n\n private _calcDifference(priceToCompare, currentPrice, priceMode) {\n let diff = priceToCompare - currentPrice;\n if (priceMode === 0) {\n diff = diff / this.occupancyService.getNumberOfNonInfantPassengers();\n }\n const label = this.$filter('roundedCurrency')(Math.abs(diff));\n return { diff, label };\n }\n\n }\n\n angular\n .module('TR')\n .service('dealsBoxService', DealsBoxService);\n}\n","(function() {\n'use strict';\n\nangular.module('TR')\n .service('destinationService', destinationService);\n\nfunction destinationService(loggingService,\n objectTypeService,\n pageStrand,\n fieldFilterParser,\n $http,\n $location,\n $q,\n broker,\n imageService,\n supportedProducts,\n currentUser,\n preferences,\n resourceService,\n $cacheFactory,\n rootPath,\n fidParser) {\n const url = `${TRPCONFIG.DestinationServiceClientDomain}/api2/destination/v2/`;\n const cultureCode = TRPCONFIG.Domain.CultureCode;\n const strands = {\n hotel: 1,\n holiday: 2\n };\n const tiles = [];\n const textUrl = `${TRPCONFIG.DestinationServiceClientDomain}${rootPath.getRootPath()}website/destinations/text?`;\n const tileUrl = `${TRPCONFIG.DestinationServiceClientDomain}/api2/destination/tiles/`;\n const tileImageUrl = `${TRPCONFIG.DestinationImagesClientDomain}/api2/destination/images/`;\n const websiteUrl = 'website/destinations/';\n const airportCache = $cacheFactory.get('airports') || $cacheFactory('airports');\n const service = {\n country: 0,\n estab: 1,\n region: 2,\n getDetails,\n getTopChildren,\n getAllChildren,\n fromUrl,\n destinationIsEstab,\n destinationIsCountry,\n destinationThumb,\n getDestinationType,\n getBreadcrumbTitle,\n isHoliday,\n getText,\n getAirport,\n getAirportDestination,\n getHeroImage,\n getTiles,\n //getTileImageUrl : getTileImageUrl,\n sortByTitle,\n getCountries,\n enhanceDestinationFromPreferences,\n // isLongHaul,\n enhanceLegacyDestination,\n setFidFromDestinationFilter,\n getAllCountries,\n getDestinationInfo,\n rootPath\n };\n\n const detailsSearch = {};\n\n function setFidFromDestinationFilter(destination) {\n const fid = fidParser.parse();\n if (destination.FilterId !== fid) {\n $location.replace();\n $location.search('fid', null);\n if (destination.FilterId > 0) {\n if (destination.LegacyType !== 1 && !TRPCONFIG.Domain.UseIdBasedUrls) {\n $location.search('fid', destination.FilterId);\n } else if (destination.LegacyType === 1) {\n $location.search('fid', destination.FilterId);\n }\n }\n }\n return destination;\n }\n\n function enhanceLegacyDestination(destination) {\n const type = parseInt(destination.LegacyType) || parseInt(destination.Type);\n const id = destination.LegacyId || destination.Id;\n return $q.when({\n PageStrand: destination.PageStrand,\n Type: type,\n Id: id,\n EstablishmentId: type === 1 ? id : 0,\n LocationId: type === 2 ? id : 0,\n ProvinceId: type === 3 ? id : 0,\n CountryId: type === 4 ? id : 0,\n PlaceId: type === 5 ? id : 0,\n PolygonId: type === 10 ? id : 0,\n DestinationId: destination.DestinationId\n });\n }\n\n function sortByTitle(dests) {\n return _.sortBy(dests, 'Title');\n }\n\n function getText(dest, errorHandler) {\n const fid = fidParser.parse();\n errorHandler = errorHandler || { ignoreErrors: true };\n errorHandler.cache = true;\n return $http.get(textUrl + $.param({\n ObjectTypeId: objectTypeService.get(dest),\n FilterId: fid || 0,\n PageStrandId: dest.PageStrand,\n DomainId: TRPCONFIG.Domain.DomainId,\n Path: dest.PagePath,\n IsPreview: (dest.IsPreview !== undefined && dest.IsPreview === true),\n v: TRPCONFIG.CurrentVersion\n }), errorHandler).then(function(result) {\n result.data.PageTitle = resourceService.getDeferred(result.data.PageTitle)();\n return result.data;\n });\n }\n\n function getTiles(req) {\n if (tiles[req.ControlId]) {\n return tiles[req.ControlId];\n }\n\n tiles[req.ControlId] = $http.get(`${tileUrl}get?${$.param({\n DomainId: TRPCONFIG.Domain.DomainId,\n ControlId: req.ControlId\n })}`, { cache: true, ignoreErrors: true }).then(function(result) {\n const tiles = result.data;\n const baseImageReq = _.constant({\n Height: 600,\n Width: 600\n });\n\n return tiles.map(tile => {\n const infoTile = _.flowRight(JSON.parse, JSON.parse, JSON.stringify)(tile.TitlePattern);\n infoTile.ImageUrl = getTileImageUrl(_.assignIn(baseImageReq(), {\n ObjectId: tile.ObjectId,\n ObjectTypeId: tile.ObjectTypeId\n }));\n infoTile.mainUrl = infoTile.ImageUrl;\n infoTile.thumbUrl = infoTile.ImageUrl;\n return infoTile;\n });\n });\n\n function getTileImageUrl(req) {\n return `${tileImageUrl}gettileimage?${$.param(req)}`;\n }\n\n return tiles[req.ControlId];\n }\n\n function isHoliday(dest) {\n return dest && dest.PageStrand != null && dest.PageStrand === strands.holiday;\n }\n\n function getDestinationType(dest) {\n if (dest == null) { return service.region; }\n\n if (destinationIsCountry(dest)) { return service.country; }\n\n if (destinationIsEstab(dest)) { return service.estab; }\n\n return service.region;\n }\n\n function logWarning(apiName, err, params) {\n const utm = currentUser.get().UtmId;\n loggingService.logWarn(`Got back err: ${err.status} for utm ${utm} and userAgent ${navigator.userAgent} for api ${apiName} with params ${params}`);\n }\n\n function fromUrl(from, tm) {\n return $http.get(`${url}fromurlv2?${$.param({\n PagePath: from,\n DomainId: TRPCONFIG.Domain.DomainId,\n v: TRPCONFIG.CurrentVersion\n })}`, { cache: true, ignoreErrors: true }).then(function(result) {\n if (result.data && tm === '1') {\n result.data.PageStrand = 2;\n }\n if (result.data && result.data.PageStrand > 1 && !supportedProducts.isProductSupported(supportedProducts.products.holidays)) {\n result.data.PageStrand = 1;\n }\n return result.data;\n }, function(err) {\n logWarning('fromUrl', err, from);\n return null;\n });\n }\n\n function getDestinationInfo(id, type, pagestrand) {\n return $http.get(`${url}getdetailsv2?${$.param({\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n PageStrand: pagestrand,\n Id: id,\n Type: type\n })}`\n ).then((result => result.data), (err => {\n logWarning('getdetailsv2', err);\n return null;\n }));\n }\n\n function destinationIsEstab(dest) {\n if (dest == null) { return false; }\n return dest.EstablishmentId > 0;\n }\n\n function destinationIsCountry(dest) {\n if (dest == null) { return false; }\n if (dest.Searchable) { return false; }\n if (dest.PolygonId > 0 &&\n dest.TagIds &&\n dest.TagIds.indexOf(1) >= 0) {\n return true;\n }\n return dest.CountryId > 0 &&\n dest.ProvinceId === 0 &&\n dest.LocationId === 0 &&\n dest.PlaceId === 0 &&\n dest.PolygonId === 0;\n }\n\n function destinationThumb(dest) {\n const objectTypeAndId = objectTypeService.getObjectTypeAndId(dest);\n return `${tileImageUrl}getfromobject?${$.param(_.assignIn({\n height: 190\n }, objectTypeAndId), { cache: true, ignoreErrors: true })}`;\n }\n\n function getTopChildren(n, d) {\n const fid = fidParser.parse();\n return $http.get(`${url}gettopchildren?${$.param({\n CountryId: d.CountryId,\n ProvinceId: d.ProvinceId,\n LocationId: d.LocationId,\n PlaceId: d.PlaceId,\n EstablishmentId: d.EstablishmentId,\n PolygonId: d.PolygonId,\n Count: n,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n FilterId: fid || 0,\n PageStrand: d.PageStrand,\n v: TRPCONFIG.CurrentVersion\n })}`, { cache: true, ignoreErrors: true }).then(function(result) {\n // Publish topic with data\n broker.publish('destTopChildrenRetrieved', result.data);\n return result.data;\n });\n }\n\n function getAllChildren(d) {\n return $http.get(`${url}getallchildren?${$.param(childRequest(d))}`,\n { cache: true, ignoreErrors: true }).then(function(result) {\n return result.data;\n });\n }\n\n function childRequest(d) {\n const fid = fidParser.parse();\n return _.assignIn(objectTypeService.getObjectTypeAndId(d), {\n CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n FilterId: fid || 0,\n PageStrand: d.PageStrand,\n v: TRPCONFIG.CurrentVersion\n });\n }\n\n function getAllCountries() {\n return $http.get(`${url}getallchildren?${$.param({ CultureCode: TRPCONFIG.Domain.CultureCode,\n DomainId: TRPCONFIG.Domain.DomainId,\n PageStrand: 2,\n Type: 12 })}`,\n { cache: true, ignoreErrors: true }).then(function(result) {\n return result.data;\n });\n }\n\n function getBreadcrumbTitle(dest, comparatorFn) {\n // `comparatorFn` example: `(bc) => bc.ObjectTypeId === 1`\n const bcTrail = dest && dest.BreadcrumbTrail;\n let i = bcTrail && bcTrail.length;\n while (i--) {\n const bc = dest.BreadcrumbTrail[i];\n if (comparatorFn(bc)) {\n return bc.Title;\n }\n }\n }\n\n function getCountryOwnId(dest) {\n const bcTrail = dest && dest.BreadcrumbTrail;\n let i = bcTrail && bcTrail.length;\n\n if (i > 0) {\n return dest.BreadcrumbTrail[0].ObjectId;\n }\n }\n\n function getDetails(dest, fieldsFilter, options) {\n if (_.isEmpty(dest)) {\n return $q.when();\n }\n let _isAirport = isAirport(dest);\n let get = isAirport => isAirport ? getDetailsForAirport(dest) : getDetailsForDestination(dest, fieldsFilter, options);\n\n return $q.when()\n .then(() => get(_isAirport))\n .then(result => result || get(!_isAirport));\n }\n\n function getDetailsForDestination(dest, fieldsFilter, options) {\n let d = _.assign({}, dest);\n options = options || {};\n if (!d.Type) {\n angular.extend(d, objectTypeService.getObjectTypeAndId(d));\n }\n\n // eslint-disable-next-line\n if (d.Type == 1 && d.Id && !d.EstablishmentId) {\n d.EstablishmentId = d.Id;\n }\n\n const ps = options.pageStrandOverride || pageStrand.fromRoute(d);\n const fid = fidParser.parse();\n\n let params = $.param({\n Type: d.Type,\n Id: d.Id,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n IncludeBreadcrumb: true,\n PageStrand: ps,\n v: TRPCONFIG.CurrentVersion,\n domainId: TRPCONFIG.Domain.DomainId,\n auth: currentUser.get().HardSignedIn,\n filterId: fid || 0\n });\n const filter = fieldFilterParser.parse(fieldsFilter);\n if (filter != null) {\n params += `&${filter}`;\n }\n const key = `${websiteUrl}getdetails?${params}`;\n\n if (!_.isUndefined(detailsSearch[key])) {\n return detailsSearch[key];\n }\n\n detailsSearch[key] = $http.get(key, { cache: true, ignoreErrors: true }).then(function(result) {\n if (result.data == null) { return null; }\n d.HolidayEnabled = result.data.HolidayEnabled;\n d.Searchable = result.data.Searchable;\n d.BreadcrumbTrail = result.data.BreadcrumbTrail;\n d.Title = result.data.Title;\n // Last non-hotel breadcrumb text\n d.SummaryTitle = getBreadcrumbTitle(d, bc => bc.ObjectTypeId !== strands.hotel) || d.Title;\n // Hotel name, or `SummaryTitle`\n d.ShortTitle = getBreadcrumbTitle(d, bc => bc.ObjectTypeId === strands.hotel) || d.SummaryTitle;\n d.CountryOwnId = getCountryOwnId(d) || 0;\n d.DestinationAirports = result.data.DestinationAirports;\n d.AirportCount = result.data.AirportCount;\n d.HotelCount = result.data.HotelCount;\n d.Longitude = result.data.Longitude;\n d.Latitude = result.data.Latitude;\n d.ZoomLevel = result.data.ZoomLevel;\n d.IsPOI = result.data.IsPOI;\n d.PagePath = result.data.PagePath;\n d.TagIds = result.data.TagIds;\n d.Price = result.data.Price;\n d.PromoText = result.data.PromoText;\n d.Airports = result.data.Airports;\n d.PageStrand = ps;\n return d;\n }, function(err) {\n logWarning('getDetails', err, key);\n return null;\n });\n\n return detailsSearch[key];\n }\n\n function getDetailsForAirport(dest) {\n const d = _.assign({}, dest);\n const airportKey = $.param(d);\n if (!_.isUndefined(detailsSearch[airportKey])) {\n return detailsSearch[airportKey];\n }\n\n function getAirportCode() {\n const airportCode = d.Code && d.Code.split(',')[0];\n if (airportCode) {\n return $q.when(airportCode);\n }\n const params = d.PolygonId ? { id: d.PolygonId, type: 10 } : { id: d.Id, type: d.Type };\n const url = `${TRPCONFIG.DestinationServiceClientDomain}/api/landingpages/destinations/airports?${$.param(params)}`;\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function(result) {\n const airports = result.data;\n if (airports && airports[0]) {\n d.Code = _(airports).map(a => a.Code).reduce((memo, a) => `${memo},${a}`);\n return airports[0].Code;\n }\n }, function(err) {\n logWarning('airports', err, url);\n return $q.when(airportCode);\n });\n }\n\n function getDestinationIds(airportCode) {\n if (angular.isNumber(d.PolygonId) || !/^[a-zA-Z]{3}$/.test(airportCode)) {\n return $q.when();\n }\n\n const params = $.param({\n airportCode\n });\n const url = `${TRPCONFIG.DestinationServiceClientDomain}/api2/destination/airports/getdestinationservedbyairport?${params}`;\n\n return $http.get(url, { cache: true, ignoreErrors: true }).then(function(result) {\n if (result.data == null) {\n return null;\n }\n d.CountryId = result.data.CountryId;\n d.ProvinceId = result.data.ProvinceId;\n d.LocationId = result.data.LocationId;\n d.PlaceId = result.data.PlaceId;\n d.EstablishmentId = result.data.EstablishmentId;\n d.PolygonId = result.data.PolygonId;\n }, function(err) {\n logWarning('getdestinationservedbyairport', err, url);\n return $q.when();\n });\n }\n\n return getAirportCode()\n .then(airportCode => getDestinationIds(airportCode))\n .then(() => service.enhanceDestinationFromPreferences(d))\n .then(() => {\n const code = shorten(d.Code, ',');\n if (!d.Title && code) {\n return getAirport(code).then(airport => {\n if (airport) {\n d.Title = shorten(airport.Title, '(');\n d.ShortTitle = shorten(airport.ShortTitle, '(');\n }\n });\n }\n })\n .then(() => {\n d.Title = d.Title || d.ShortTitle || d.SummaryTitle || d.Code || '';\n d.ShortTitle = d.ShortTitle || d.SummaryTitle || shorten(d.Title, ',');\n d.SummaryTitle = d.SummaryTitle || d.ShortTitle;\n d.HolidayEnabled = true;//Because this is a flight search, all destinations will be near an airport.\n d.Searchable = true;\n d.AirportCount = d.Code && d.Code.split(',').length;\n d.BreadcrumbTrail = [{\n Title: d.Title,\n //PagePath: '/holidays/gatwick-airport-lgw-west-sussex-united-kingdom.html',\n ObjectId: d.PolygonId,\n ObjectTypeId: 10\n }];\n angular.extend(d, objectTypeService.getObjectTypeAndId(d));\n return d;\n });\n }\n\n function isAirport(d) {\n let isAirport;\n if (d.searchLookupType) {\n isAirport = d.searchLookupType === 'flights';\n } else if (d.PageStrand) {\n isAirport = false;\n } else if (d.Code) {\n isAirport = !angular.isNumber(d.PolygonId) || d.PolygonId > 0;\n } else {\n isAirport = false;\n }\n return isAirport;\n }\n\n function shorten(title, separator) {\n return (title || '').split(separator)[0];\n }\n\n function enhanceDestinationFromPreferences(destination) {\n objectTypeService.populateObjectTypeAndId(destination);\n return preferences.get('search').then(preferences => {\n const preferencesDest = preferences && preferences.destination && preferences.destination[0];\n if (preferencesDest && preferencesDest.Id && preferencesDest.Id === destination.Id) {\n _.forEach(['Title', 'Code', 'ShortTitle', 'SummaryTitle', 'icon', 'searchLookupType', 'AirportCount'],\n key => {\n if (typeof preferencesDest[key] !== undefined) {\n destination[key] = preferencesDest[key];\n }\n });\n }\n return destination;\n });\n }\n\n function getAirport(airportCode) {\n const k = `${airportCode}_${TRPCONFIG.Domain.CultureCode}`;\n if (!airportCache.get(k)) {\n airportCache.put(\n k,\n $http.post('/api2/flights/static/getairport', {\n AirportCode: airportCode,\n CultureCode: TRPCONFIG.Domain.CultureCode\n }, {\n ignoreErrors: true\n })\n .then(result => result.data.Airport, angular.noop));\n }\n return airportCache.get(k);\n }\n\n function getAirportDestination(airportCode) {\n const params = {\n airportCode,\n cultureCode: TRPCONFIG.Domain.CultureCode\n };\n return $http.get(\n `/api2/destination/airports/getairportlocation?${$.param(params)}`,\n { ignoreErrors: true }\n ).then(result => {\n return result.data;\n });\n }\n\n function getHeroImage(destination) {\n return imageService.getLandingPageImage(destination);\n }\n\n function getCountries() {\n return $http.get(`/api2/destination/countries/get?CultureCode=${cultureCode}`, { cache: true, ignoreErrors: true }).then(function(res) {\n return res.data;\n });\n }\n\n // function isLongHaul(destination) {\n // return _.includes(destination && destination.TagIds, 12)\n // ? $q.when(true)\n // : $http.get(`/api/destinations/${destination.Id}/ancestors?${$.param({\n // tenantId: TRPCONFIG.Domain.TenantId,\n // pointOfSaleId: TRPCONFIG.Domain.PointOfSaleId,\n // culture: TRPCONFIG.Domain.CultureCode,\n // fields: 'Tags'\n // })}`, { cache: true }).then(result =>\n // _.chain(result.data)\n // .flatMap(ancestor => ancestor.Tags)\n // .includes(12)\n // .value());\n // }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('destinationContent', destinationContent);\n\nfunction destinationContent($http, pageStrand, objectTypeService, fidParser) {\n const url = '/api2/destination/content?';\n const service = {\n get\n };\n\n function get(destination) {\n const { Type, Id } = objectTypeService.getObjectTypeAndId(destination);\n return $http.get(url + $.param({\n Id,\n Type,\n FilterId: fidParser.parse() || 0,\n DomainId: TRPCONFIG.Domain.DomainId,\n ApplicationType: TRPCONFIG.ApplicationType,\n TenantId: TRPCONFIG.Domain.TenantId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n PageStrand: pageStrand.fromRoute(destination)\n }), { cache: true, ignoreErrors: true }).then(function(res) {\n return res.data.Contents;\n });\n }\n\n return service;\n}\n})();\n","namespace TR {\n export class Friend {\n Name: String = '';\n Email: String = '';\n }\n\n export interface DiscountsService {\n referFriends(friends: Friend[]);\n getDiscountCodeForUser(): Promise;\n validate(): Promise;\n }\n}\n","(function() {\n 'use strict';\n\n angular\n .module('TR')\n .factory('ecommerceService', ecommerceService);\n\n function ecommerceService(\n tripService,\n basketStore,\n attractionService,\n carHireService,\n $q,\n loaderService,\n $window,\n cookieService,\n $http) {\n const productType = {\n 0: function getHotelInfo(transactionId, hotel) {\n if (hotel && hotel.Details) {\n const hotelDetails = hotel.Details;\n\n const hotelInfo = {\n id: transactionId,\n category: 'Accommodation',\n name: hotelDetails.EstablishmentId,\n price: basketStore.sumCosts(hotel.CostBreakdown),\n quantity: 1,\n sku: hotelDetails.ProvinceTitle\n };\n\n return $q.when([hotelInfo]);\n }\n\n return $q.when(null);\n },\n 1: function getFlightInfo(transactionId, flight) {\n if (flight && flight.Details) {\n const flightLeg = flight.Details.Itinerary.Legs[0];\n const segmentInfo = flightLeg.Segments[0];\n\n const flightInfo = {\n id: transactionId,\n category: 'Flight',\n name: segmentInfo.CarrierName,\n price: basketStore.sumCosts(flight.CostBreakdown),\n quantity: 1,\n sku: segmentInfo.DestinationAirportTitle\n };\n return $q.when([flightInfo]);\n }\n\n return $q.when(null);\n },\n 2: function getTransferInfo(transactionId, transfer) {\n if (transfer && transfer.Details) {\n const transferDetails = transfer.Details;\n\n const transferInfo = {\n id: transactionId,\n category: 'Transfer',\n name: transferDetails.TransferId.SupplierId,\n price: basketStore.sumCosts(transfer.CostBreakdown),\n quantity: 1,\n sku: (transferDetails.Itinerary.OutboundLeg || transferDetails.Itinerary.InboundLeg).DeparturePoint\n };\n\n return $q.when([transferInfo]);\n }\n return $q.when(null);\n },\n 3: function getParkingInfo(transactionId, parking) {\n if (parking && parking.Details) {\n const parkingDetails = parking.Details;\n\n const parkingInfo = {\n id: transactionId,\n category: 'Parking',\n name: parkingDetails.AirportParkingQuoteId.SupplierId,\n price: basketStore.sumCosts(parking.CostBreakdown),\n quantity: 1,\n sku: parkingDetails.AirportParkingQuoteId.CarParkCode\n };\n\n return $q.when([parkingInfo]);\n }\n return $q.when(null);\n },\n 4: function getAttractionInfo(transactionId, attraction, flight) {\n if (attraction && attraction.Details && flight && flight.Details) {\n const flightLeg = flight.Details.Itinerary.Legs[0];\n const segmentInfo = flightLeg.Segments[0];\n const sku = segmentInfo.DestinationAirportTitle;\n\n const attractionDetails = attraction.Details;\n const attractionInfo = {\n id: transactionId,\n category: 'Attractions',\n price: basketStore.sumCosts(attraction.CostBreakdown),\n quantity: 1\n };\n\n return attractionService.getAttractionQuotesFromSession(attraction.AvailabilitySearchId).then(attractions => {\n const attractionBreakdown = _.map(attractionDetails.AttractionIds, (element, index) => {\n const cost = attraction.CostBreakdown[index];\n const price = basketStore.sumCosts([cost]);\n\n const res = _.findIndex(attractions, a => a.AttractionId === element);\n\n if (res >= 0) {\n const attr = attractions[res];\n return _.assignIn({}, attractionInfo, { name: attr.ShortTitle, sku, price });\n }\n return $q.when(null);\n });\n\n return $q.when(attractionBreakdown);\n });\n }\n return $q.when(null);\n },\n 5: function getCarHireInfo(transactionId, carHire) {\n if (carHire && carHire.Details) {\n const carHireDetails = carHire.Details;\n let carHireInfo = {\n id: transactionId,\n category: 'Car Hire',\n price: basketStore.sumCosts(carHire.CostBreakdown),\n quantity: 1,\n sku: carHireDetails.HireDetails.PickUpPoint\n };\n return carHireService.getCarQuotesFromSession(carHire.AvailabilitySearchId).then(carhire => {\n const hireProvider = _.filter(carhire, elem => elem.CarHireId.CarHireCode === carHireDetails.CarHireId.CarHireCode);\n\n carHireInfo = _.assignIn({}, carHireInfo, {\n name: hireProvider[0].SupplierName\n });\n\n return $q.when(carHireInfo);\n });\n }\n return $q.when(null);\n },\n 6: function getMarhabaInfo(transactionId, marhaba) {\n if (marhaba && marhaba.CostBreakdown) {\n const marhabaInfo = {\n id: transactionId,\n category: 'Marhaba',\n price: basketStore.sumCosts(marhaba.CostBreakdown),\n quantity: 1,\n name: 'Marhaba',\n sku: 'Marhaba'\n };\n\n return $q.when(marhabaInfo);\n }\n return $q.when(null);\n },\n 7: function getInsuranceInfo(transactionId, insurance) {\n if (insurance && insurance.CostBreakdown) {\n const insuranceInfo = {\n id: transactionId,\n category: 'Insurance',\n price: basketStore.sumCosts(insurance.CostBreakdown),\n quantity: 1,\n name: 'Insurance',\n sku: 'Insurance'\n };\n\n return $q.when(insuranceInfo);\n }\n return $q.when(null);\n }\n };\n\n function pushBasket(tripId, baskets, totalCost) {\n\n if (_tagManagerEnabled()) {\n return _pushGABasket(tripId, baskets, totalCost);\n }\n\n return $q.when();\n }\n\n function _pushGABasket(tripId, baskets, totalCost) {\n return addTransaction(tripId, `${totalCost}`, `${0}`).then(transaction => {\n const basketInfo = _.map(_.omit(baskets, 'all'), b => {\n const entries = _.flatten([b]); // Normalise single entries and arrays\n\n for (let i = 0, len = entries.length; i < len; i++) {\n const basket = entries[i];\n\n if (basket == null) {\n return $q.when(null);\n }\n const product = productType[basket.ProductType];\n const info = product != null ? product(transaction.transactionId, basket, baskets.f) : null;\n\n if (info == null) {\n return $q.when(null);\n }\n\n return info\n .then(result => result)\n .catch(() => null);\n }\n });\n\n return $q.all(basketInfo).then(basketResult => {\n const output = _.reduce(basketResult, (memo, elem) => {\n if (elem) {\n return memo.concat(elem);\n }\n return memo;\n }, []);\n\n return tripService.getCurrency(tripId).then(currency => {\n _.forEach(output, item => {\n const { CountryCode, Language } =\n TRPCONFIG.SelectedRegionalContext ? TRPCONFIG.SelectedRegionalContext : { CountryCode: null, Language: null };\n const newItem = addItem(item.id, `${item.name}`, `${item.sku}`, `${item.category}`, `${item.price}`, `${item.quantity}`, `${currency}`, CountryCode, Language);\n transaction.transactionProducts.push(newItem);\n });\n\n if (!TRPCONFIG.Domain2.NewTransactionTracking) {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(transaction);\n }\n\n // Create rollup transaction\n let transactionRollup = JSON.parse(JSON.stringify(transaction));\n transactionRollup.event = 'pushTransactionRollup';\n\n if (transaction.transactionCurrency !== 'AED' && TRPCONFIG.Domain.EnableAnalyticsCurrencyConversion === true) {\n updateTransactionAed(transactionRollup);\n } else if (!TRPCONFIG.Domain2.NewTransactionTracking) {\n window.dataLayer.push(transactionRollup);\n }\n });\n });\n });\n }\n\n function updateTransactionAed(t) {\n getExchangeRate(t.transactionCurrency, 'AED').then(rate => {\n t.transactionTotal = calCurrency(t.transactionTotal, rate);\n t.transactionCurrency = 'AED';\n for (let i = 0; i < t.transactionProducts.length; i++) {\n t.transactionProducts[i].currency = 'AED';\n t.transactionProducts[i].price = calCurrency(t.transactionProducts[i].price, rate);\n }\n window.dataLayer.push(t);\n });\n }\n\n function calCurrency(val, rate) {\n const x = parseInt(val);\n const convertedTotal = x * rate.data;\n return convertedTotal.toFixed(2);\n }\n\n function getExchangeRate(from, to) {\n return $http.get(`/api2/fxrates/get?request.currencyFrom=${from}&request.currencyTo=${to}&request.futureMonth=0`);\n }\n\n function addTransaction(transactionId, transactionTotal, transactionTax, transactionAffiliation) {\n transactionAffiliation = transactionAffiliation || TRPCONFIG.Domain.DomainId;\n return tripService.getCurrency(transactionId).then(transactionCurrency => {\n const transaction = {\n event: 'pushTransaction',\n transactionId,\n transactionAffiliation,\n transactionTotal,\n transactionTax,\n transactionCurrency,\n transactionProducts: []\n };\n\n return transaction;\n });\n }\n\n function addItem(id, name, sku, category, price, quantity, currency, dimension1, dimension2) {\n const item = {\n id,\n name,\n sku,\n category,\n price,\n quantity,\n currency,\n dimension1,\n dimension2\n };\n\n return item;\n }\n\n const service = {\n addTransaction,\n addItem,\n pushBasket\n };\n\n function _tagManagerEnabled() {\n return !!TRPCONFIG.Domain.GoogleTagManagerEnabled;\n }\n\n const noop = function() { return $q.when(); };\n\n if (!_tagManagerEnabled()) {\n for (const func in service) {\n service[func] = noop;\n }\n }\n\n return service;\n }\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .config(config);\r\n\r\nfunction config($provide, $httpProvider) {\r\n $provide.factory('errInterceptor', errInterceptor);\r\n\r\n errInterceptor.$inject = ['$location', '$q', 'commonErrors'];\r\n\r\n function errInterceptor($location, $q, commonErrors) {\r\n const _errCallbacksCollection = {};\r\n const googlebot = /googlebot/i.test(navigator.userAgent);\r\n const prerender = /prerender/i.test(navigator.userAgent);\r\n let _counter = 0;\r\n\r\n const service = {\r\n addErrCallback,\r\n responseError\r\n };\r\n\r\n\r\n function logError(data) {\r\n if (googlebot || prerender) {\r\n return;\r\n }\r\n\r\n const utm = JSON.parse($('body').attr('user')).UtmId;\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/log',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Message: `Customer ended up on the error page with error: ${JSON.stringify({\r\n utmId: utm,\r\n userAgent: navigator.userAgent,\r\n status: data.status,\r\n url: data.config.url,\r\n data: data.config.data\r\n })}`,\r\n LogLevel: 1 // Warning\r\n })\r\n });\r\n }\r\n\r\n // Basic error handling\r\n function _defaultError(data) {\r\n if (data.status === -1) {\r\n return;\r\n }\r\n\r\n $location.replace();\r\n // $location.path('error');\r\n logError(data);\r\n }\r\n\r\n // Retrieves submitted custom callback\r\n function _getCustomCallback(headers) {\r\n const _callbackName = headers['x-callback'] || '';\r\n return _errCallbacksCollection[_callbackName];\r\n }\r\n\r\n // Tries to invoke custom callback\r\n function _invokeCustomCallback(data) {\r\n if (!data.config) {\r\n return false;\r\n }\r\n\r\n const _errCallback = _getCustomCallback(data.config.headers);\r\n\r\n // no custom callback available\r\n if (!_errCallback || data.status === 401) {\r\n return false;\r\n }\r\n\r\n // dealing with partial callbacks\r\n if (typeof _errCallback === 'object') {\r\n if (!_errCallback[data.status]) {\r\n return false;\r\n }\r\n _errCallback[data.status](data);\r\n } else if (typeof _errCallback === 'function') {\r\n // dealing with full callbacks\r\n _errCallback(data);\r\n } else {\r\n // dealing with weird things\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n function addErrCallback(cb) {\r\n _errCallbacksCollection[++_counter] = cb;\r\n return _counter;\r\n }\r\n\r\n const callbacksHandled = {};\r\n\r\n function responseError(data) {\r\n //a hack to make sure that we don't handle the same error twice which can happen with the retry interceptor\r\n if (callbacksHandled[data.config.headers['x-callback']]) {\r\n return $q.reject(data);\r\n }\r\n callbacksHandled[data.config.headers['x-callback']] = true;\r\n\r\n if (!_invokeCustomCallback(data)) {\r\n // common error handling\r\n (commonErrors[data.status] || _defaultError)(data);\r\n }\r\n\r\n return $q.reject(data);\r\n }\r\n\r\n return service;\r\n }\r\n\r\n if ($httpProvider.interceptors.indexOf('errInterceptor') < 0) {\r\n $httpProvider.interceptors.unshift('errInterceptor');\r\n }\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .factory('$exceptionHandler', $exceptionHandler);\r\n\r\nfunction $exceptionHandler(broker, $log, $window, currentUser) {\r\n const ie9 = /msie 9.0/i.test(navigator.userAgent);\r\n let success = function() {\r\n // do nothing\r\n };\r\n let skipErrorsLogging = false;\r\n let digestErrors = 0;\r\n let errorQueue = [];\r\n\r\n $window.addEventListener('beforeunload', function() {\r\n skipErrorsLogging = true;\r\n });\r\n\r\n function error(err, type, msg) {\r\n errorQueue = []; //clear the queue if there is a problem - we don't want to kill the client\r\n $log.warn('Error logging failed');\r\n $log.log(msg || err);\r\n }\r\n\r\n (function tick() {\r\n if (errorQueue.length !== 0) {\r\n //de-dupe into a dictionary\r\n const errorDict = {};\r\n const deduped = [];\r\n errorQueue.forEach(function(err) {\r\n if (errorDict[err.errorMessage] == null) {\r\n err.count = 0;\r\n errorDict[err.errorMessage] = err;\r\n }\r\n errorDict[err.errorMessage].count += 1;\r\n });\r\n\r\n //convert back to an array\r\n Object.keys(errorDict).forEach(function(msg) {\r\n deduped.push(errorDict[msg]);\r\n });\r\n\r\n try {\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/logbatch',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Messages: deduped.map(function(err) { return JSON.stringify(err); }),\r\n LogLevel: ie9 ? 2 : 1 //warn for ie9, otherwise error\r\n }),\r\n success,\r\n error\r\n });\r\n errorQueue = [];\r\n } catch (loggingError) {\r\n error(loggingError);\r\n }\r\n }\r\n setTimeout(tick, 2000);\r\n })();\r\n\r\n return function(...args) {\r\n const exception = args[0];\r\n const cause = args[1];\r\n $log.error(...args);\r\n broker.publish('unblock');\r\n if (TRPCONFIG.IsBot) { return; }\r\n try {\r\n const stackTrace = printStackTrace({ e: exception });\r\n let errorMessage = exception.toString();\r\n let user = currentUser.get();\r\n\r\n user = user == null ? 'user is unexpectedly null' : (user.SignedIn ? { Email: user.Email, UtmId: user.UtmId } : user);\r\n\r\n if (skipErrorsLogging) {\r\n return;\r\n }\r\n\r\n //note that we can't use $http or $location here because it causes a circular dependency which is a bit annoying\r\n if (errorMessage.indexOf('$rootScope:infdig') >= 0 ||\r\n errorMessage.indexOf('$rootScope:inprog') >= 0) {\r\n digestErrors += 1;\r\n }\r\n if (digestErrors > 5) {\r\n errorMessage = 'Digest loop panic detected';\r\n skipErrorsLogging = true;\r\n success = function() {\r\n $window.location.href = '/';\r\n };\r\n }\r\n\r\n errorQueue.push({\r\n Message: {\r\n userAgent: navigator.userAgent,\r\n errorUrl: $window.location.href,\r\n errorMessage,\r\n stackTrace,\r\n cause: (cause || ''),\r\n user\r\n },\r\n LogLevel: ie9 ? 2 : 1 //warn for ie9, otherwise error\r\n });\r\n } catch (loggingError) {\r\n $log.warn('Error logging failed');\r\n $log.log(loggingError);\r\n }\r\n };\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('FilterIdUtils', FilterIdUtils);\n\nfunction FilterIdUtils(\n $http,\n $location,\n currentDestination,\n pageStrand) {\n const url = '/api2/destination/filters/';\n const service = {\n estabGroupFilterAvailable,\n createEstabGroupOptions,\n lookupFid,\n sanitiseFidFilters,\n updateEstabGroupProperties,\n getFilters\n };\n let _filterData;\n\n\n const fidSettings = {\n ignorable: ['EstabGroupIds', 'EstabGroupIds', 'EstabGroupName', 'EstablishmentName', 'FilterByEstabGroup'],\n propertyMap: {\n BoardTypes: 'HotelsByBoardType',\n FacilityCodes: 'MergedHotelsByFacility',\n PriceRange: 'PriceRange',\n HolidayPriceRange: 'HolidayPriceRange',\n RatingRange: 'RatingRange',\n PropertyTypes: 'HotelsByPropertyType',\n Stars: 'HotelsByStar'\n }\n };\n\n function _groupFilterAvailable(filter) {\n return filter != null && filter.EstabGroupName != null && filter.EstabGroupName !== '';\n }\n\n function lookupFid(fid) {\n return currentDestination\n .getCurrentDestination()\n .then(dest => getFilters(fid, pageStrand.fromRoute(dest)));\n }\n\n function getFilters(fid, pageStrandId) {\n const params = {\n DomainId: TRPCONFIG.Domain.DomainId,\n FilterId: parseInt(fid),\n PageStrandId: pageStrandId\n };\n const opt = {\n cache: true,\n customErrCallback: {\n 404: () => true\n }\n };\n return $http.get(`${url}get?${jQuery.param(params)}`, opt)\n .then(\n res => {\n const filters = _.pickBy(res.data, v => v !== null);\n // renaming keys\n if (filters.BoardTypeCode) { filters.BoardTypes = filters.BoardTypeCode; }\n if (filters.PropertyType) { filters.PropertyTypes = filters.PropertyType; }\n\n // filter by estab group\n filters.FilterByEstabGroup = filters.EstabGroupIds &&\n filters.EstabGroupIds.length > 0 &&\n filters.EstabGroupName != null;\n _filterData = filters;\n return filters;\n },\n () => null\n );\n }\n\n //this needs to work off the original definition of the fidFilter, *not* the current\n //filter as it is at the moment because the current filter can have the estabgroupIds\n //removed by unchecking the checkbox whereupon it all goes wrong.\n function createEstabGroupOptions(groupAggregates) {\n if (_groupFilterAvailable(_filterData) && groupAggregates) {\n let hotelCount = 0;\n for (let i = 0; i < _filterData.EstabGroupIds.length; i++) {\n const group = groupAggregates[_filterData.EstabGroupIds[i]];\n if (_.isObject(group)) {\n hotelCount = group.Count || 0;\n } else {\n hotelCount += group || 0;\n }\n }\n\n return [{\n title: _filterData.EstabGroupName,\n count: hotelCount\n }];\n }\n\n return null;\n }\n\n function estabGroupFilterAvailable(filter) {\n return _groupFilterAvailable(filter);\n }\n\n function updateEstabGroupProperties(filter) {\n //we need to correctly set the estab group ids property based on the bool FilterByEstabGroup\n //and ensure the groupname is always set\n\n if (!filter.EstabGroupName && _filterData && _filterData.EstabGroupName) {\n filter.EstabGroupName = _filterData.EstabGroupName;\n }\n\n //1. if it is true don't remove the groupIds (might have to add ids in)\n //2. otherwise clear it\n if (filter.FilterByEstabGroup === true) {\n if (filter.EstabGroupIds.length === 0 && _filterData) {\n filter.EstabGroupIds = angular.copy(_filterData.EstabGroupIds);\n }\n } else {\n filter.EstabGroupIds = [];\n }\n }\n\n function sanitiseFidFilters(f, agg, defaultFilterCriteria) {\n const { propertyMap } = fidSettings;\n\n function relevantFilters(f) {\n f = _.omit(f, fidSettings.ignorable);\n return _.omitBy(f, (p, key) => !p || _.isArray(p) && !p.length || _.isEmpty(agg[propertyMap[key]]));\n }\n\n function arrayTypeFilter(key) {\n return x => _.isObject(agg[propertyMap[key]][x]) ? !_.isEmpty(agg[propertyMap[key]][x])\n : agg[propertyMap[key]][x] != null;\n }\n\n function objectFilter(filterValue, key) {\n if (agg[propertyMap[key]].Min > filterValue.Min) {\n filterValue.Min = agg[propertyMap[key]].Min;\n }\n if (agg[propertyMap[key]].Max < filterValue.Max) {\n filterValue.Max = agg[propertyMap[key]].Max;\n }\n return filterValue;\n }\n\n function compareFiltersWithAggregates(filterValue, key) {\n return _.isArray(filterValue) ? filterValue.filter(arrayTypeFilter(key))\n : _.isObject(filterValue) && filterValue.Min != null && filterValue.Max ? objectFilter(filterValue, key)\n : filterValue;\n }\n\n function filteredCriteria() {\n return _.mapValues(relevantFilters(f), compareFiltersWithAggregates);\n }\n\n const filteredFilter = angular.extend(defaultFilterCriteria, filteredCriteria());\n return angular.equals(filteredFilter, f) ? false : filteredFilter;\n }\n\n\n return service;\n}\n})();\n","namespace TR {\n export class Filtering {\n\n transform: any = {\n Stars: { s: this._serializeArray, d: this._deserializeArray },\n BoardTypes: { s: this._serializeArray, d: this._deserializeArray },\n ChildDestinations: { s: this._serializeArray, d: this._deserializeArray },\n FacilityCodes: { s: this._serializeArray, d: this._deserializeArray },\n PropertyTypes: { s: this._serializeArray, d: this._deserializeArray },\n RatingRange: { s: this._serialiseRange, d: this._deserialiseRange },\n PriceRange: { s: this._serialiseRange, d: this._deserialiseRange },\n HolidayPriceRange: { s: this._serialiseRange, d: this._deserialiseRange }\n };\n\n boardTypes: any = {\n 1: 'ROOMONLY',\n 2: 'BEDANDBREAKFAST',\n 3: 'HALFBOARD',\n 4: 'FULLBOARD',\n 5: 'ALLINCLUSIVE',\n 6: 'SELFCATERING'\n };\n\n constructor(\n private $location: ng.ILocationService,\n private $q: ng.IQService,\n private FilterIdUtils: any,\n private fidParser: Core.IFidParser\n ) {}\n\n getFilters(defaultFilters: any = {}, pageStrand) {\n const params = this.$location.search();\n const fid = this.fidParser.parse();\n\n return fid ?\n this.FilterIdUtils.getFilters(fid, pageStrand)\n .then(f => this._mergeFromFid(defaultFilters, f)) :\n this.$q.when(this._mergeFromParams(defaultFilters, params));\n }\n\n deserialiseFilters(rawFilters: any) {\n let filters = {};\n for (let filter in rawFilters) {\n filters[filter] = this.transform[filter].d(rawFilters[filter]);\n }\n return filters;\n }\n\n serialiseFilters(filterObj: any) {\n let updated = false;\n const paramValues = this.$location.search();\n for (let filter in filterObj) {\n // have to convert to null as non existant parameters are deleted by null value in\n // $location.search\n const paramValue = paramValues[filter] || null;\n const newParamValue = this.transform[filter].s(filterObj[filter]);\n if (paramValue !== newParamValue) {\n updated = true;\n this.$location.search(filter, newParamValue);\n }\n }\n return updated;\n }\n\n getBoardTypeName(bt: number) {\n if (!bt) { return ''; }\n return this.boardTypes[bt];\n }\n\n private _mergeFromParams(defaultFilters: any, params: any) {\n let filters = {};\n for (let filter in defaultFilters) {\n const f = params[filter]\n ? this.transform[filter].d(params[filter])\n : defaultFilters[filter];\n filters[filter] = f;\n }\n return filters;\n }\n\n private _mergeFromFid(defaultFilters: any, fidFilters: any) {\n let filters = {};\n for (let filter in defaultFilters) {\n const f = fidFilters && fidFilters[filter]\n ? fidFilters[filter]\n : defaultFilters[filter];\n filters[filter] = f;\n }\n return filters;\n }\n\n private _deserializeArray(str: string) {\n return str.split(',');\n }\n\n private _serializeArray(arr: any[]) {\n if (!arr.length) { return null; }\n return arr.join(',');\n }\n\n private _deserialiseRange(str: string) {\n const rating = str.split(',');\n return { Min: parseFloat(rating[0] || '0'), Max: parseFloat(rating[1] || '0') };\n }\n\n private _serialiseRange(range: any) {\n if (!range) { return null; }\n return `${range.Min},${range.Max}`;\n }\n\n }\n\n angular\n .module('TR')\n .service('filtering', Filtering);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('flightSearch', flightSearch);\n\nfunction flightSearch(\n preferences,\n unadjustedDateFilter,\n sortCriteria,\n $http,\n dateUtil,\n analytics,\n occupancyService,\n flightSearchValidator,\n baggageService,\n flightDetail,\n searchUnitService,\n FilterUtils,\n arrayUtil,\n $q,\n broker,\n cancellerService,\n tripService,\n currentDestination,\n $routeParams,\n $window,\n $rootScope) {\n const url = '/api2/flights/availability/';\n const webUrl = 'website/flights/';\n const staticUrl = '/api2/flights/static';\n let results;\n let inProgress;\n let filterCanceller;\n let filterDefer = $q.defer();\n const sortCriteriaDef = sortCriteria.getFlightCriteria();\n let filterUtil = new FilterUtils(_defaultFilterCriteria());\n\n const req = {\n Paging: {\n PageIndex: 0,\n PageSize: 10\n },\n OneWayOnly: false,\n NumberOfLeadBags: 0,\n WaitForResults: true\n };\n\n // Stop when clicking the back/forward buttons, the filters need to be cleared\n // because the next page might have completely different search results.\n $($window).on('popstate', () => {\n if (req.AvailabilitySearchId) {\n resetFilters();\n }\n });\n\n preferences.getFlightSortOrder(true).then(function(so) {\n req.SortCriterion = so;\n });\n\n const service = {\n clearSearchResults,\n filter,\n filterSet,\n getAirportTitles,\n getAvailabilityRequest,\n getFilter,\n getFilterLazy,\n getFlightsForDeals,\n getFlightInfo,\n getBaggageAllowanceTotalKg,\n getBaggagePieces,\n getBaggageAllowanceKgPerBag,\n getOccupancySummary,\n getRouteSummary,\n getSearchResults,\n getSearchSummary,\n getSortCriteria,\n getSortCriterionDescription,\n getUrl,\n rehydrateMultiDestHolidayFlight,\n setBags,\n modifyBags,\n nextPage,\n pageSize,\n rangeFilterSet,\n removeArrayFilter,\n resetArrayFilter,\n resetBooleanFilter,\n resetFilters,\n resetPageIndex,\n resetRangeFilter,\n search,\n setCabin,\n showFlightDetailsModal,\n showCancellationsDetailsModal,\n sort,\n validateSearchCriteria,\n trackFlightClick\n };\n\n function resetPageIndex() {\n req.Paging.PageIndex = 0;\n if (results) {\n results.CombinedDates.AvailableFlights = results.CombinedDates.AvailableFlights.slice(0, req.Paging.PageSize);\n }\n }\n\n function _emptyFilterCriteria() {\n return {\n DepartureDates: [],\n DepartureAirport: [],\n Airline: [],\n Stop: [],\n PriceRange: null,\n OutboundTakeOffRange: null,\n ReturnTakeOffRange: null,\n HideOpenJaw: false\n };\n }\n\n function _defaultFilterCriteria() {\n const newFilter = _emptyFilterCriteria();\n\n if (_.get(req, 'FilterCriteria.DepartureDates.length') > 0) {\n newFilter.DepartureDates = req.FilterCriteria.DepartureDates.slice(); //copy values over\n }\n\n return newFilter;\n }\n\n function _getFilterCriteriaSet() {\n //when filtering we should only pass the items a user has set, but we also want to\n //take care to not modify the actual filter object, so return a modified\n //copy of the filter\n const filterCopy = angular.copy(getFilter());\n if (results != null) {\n filterUtil.setToNullIfMatches(filterCopy, 'PriceRange', results.CombinedDates.UnfilteredAggregates);\n filterUtil.setToNullIfMatches(filterCopy, 'OutboundTakeOffRange', results.CombinedDates.UnfilteredAggregates);\n filterUtil.setToNullIfMatches(filterCopy, 'ReturnTakeOffRange', results.CombinedDates.UnfilteredAggregates);\n }\n return filterCopy;\n }\n\n function _getUrl(newSearch) {\n return newSearch ?\n `${webUrl}search` :\n `${webUrl}searchfromsession`;\n }\n\n function _resetFlexibleDates(req) {\n // If DepartureDates are emty we will get the responce +-3 days using this reqest.\n // Here we use only one date from search by default so dates wil not be flexible.\n // But if user will change the date using checkbox in departure date fliter we will use dates which was choosen.\n if (req.FilterCriteria.DepartureDates === undefined || req.FilterCriteria.DepartureDates.length === 0) {\n req.FilterCriteria.DepartureDates = [unadjustedDateFilter(searchUnitService.startDate(), 'yyyy-MM-dd')];\n } else if (req.FilterCriteria.DepartureDates.length === 1) {\n req.FilterCriteria.DepartureDates = getFilter().DepartureDates;\n }\n return req;\n }\n\n function showCancellationsDetailsModal() {\n broker.publish('showModalCancellationsBasketDetails');\n }\n\n function getFlightInfo(flightData) {\n let flight = flightData || JSON.parse(sessionStorage.getItem('storeSelectedFlight'));\n if (flight) {\n let legs = flight.Legs;\n let airportCodes = [];\n let journeyType = 'Direct';\n let stopText = 'Stop';\n\n if (legs && legs.length === 2) {\n for (let i = 0; i < legs.length; i++) {\n let segments = legs[i].Segments;\n let segmentCount = segments.length - 1;\n\n if (segments.length > 1) {\n if (segmentCount > 1) {\n stopText = 'Stops';\n }\n journeyType = `${segmentCount} ${stopText}`;\n }\n\n airportCodes.push(legs[i].DepartureAirport.Code);\n if (airportCodes.length > 1) {\n let text = `${airportCodes[0]} - ${airportCodes[1]} (${journeyType})`;\n return text;\n }\n }\n }\n }\n }\n\n function getBaggageAllowanceTotalKg(flightData) {\n return flightData.Legs[0].BaggageAllowanceKgPerBag;\n }\n\n function getBaggagePieces(flightData) {\n return flightData.Legs[0].Segments[0].BaggagePieces;\n }\n\n function getBaggageAllowanceKgPerBag(flightData) {\n return flightData.Legs[0].Segments[0].BaggageAllowanceKgPerBag;\n }\n\n function showFlightDetailsModal(isHotelFirstJourney) {\n const passengers = occupancyService.getTotalPeopleCounts();\n const config = {\n flight: JSON.parse(sessionStorage.getItem('storeSelectedFlight')),\n passengers,\n customiseMessage: isHotelFirstJourney,\n };\n broker.publish('showModalFlightDetails', config);\n }\n\n function getFlightsForDeals(id, checkIn, checkOut, destAirports, depAirports) {\n const api = `${url}getflightsfordeal`;\n const req = {\n AvailabilitySearchId: id,\n DomainId: TRPCONFIG.Domain.DomainId,\n CheckInDate: dateUtil.serialiseDate(checkIn),\n CheckOutDate: dateUtil.serialiseDate(checkOut),\n DepartureAirports: depAirports,\n DestinationAirports: destAirports,\n FlightsCount: 3\n };\n\n return $http.post(api, req)\n .then(res => {\n if (!res.data || !res.data.Flights) { return []; }\n return res.data.Flights;\n });\n }\n\n function getAirportTitles(codes) {\n const params = {\n AirportCodes: codes,\n CultureCode: TRPCONFIG.Domain.CultureCode\n };\n let url = `${staticUrl}/gettitles?${jQuery.param(params)}`;\n return $http.get(url, { cache: true });\n }\n\n function getSortCriteria(oneWay) {\n return sortCriteria.getFlightCriteria(oneWay);\n }\n\n function getSortCriterionDescription() {\n return preferences.getFlightSortOrder().then(function(so) {\n const i = arrayUtil.indexOf(sortCriteriaDef, function(c) {\n return c.val === so || (angular.isArray(c.val) && c.val.indexOf(so) !== -1);\n });\n return i >= 0 ? sortCriteriaDef[i].name() : '';\n });\n }\n\n function getFilter() {\n return filterUtil.getFilter();\n }\n\n function getFilterLazy() {\n return filterDefer.promise;\n }\n\n function filterSet(filterName) {\n return filterUtil.filterSet(filterName);\n }\n\n function _resetPriceRange(results) {\n filterUtil.resetRangeFilter(results, results.CombinedDates.UnfilteredAggregates, 'PriceRange', ['Min', 'Max']);\n }\n\n function resetFilters(dontApply) {\n filterUtil = new FilterUtils(_emptyFilterCriteria());\n filterDefer = $q.defer();\n if (!dontApply) {\n return service.filter();\n }\n return $q.when();\n }\n\n function rangeFilterSet(filterName, range) {\n return filterUtil.rangeFilterSet(results, results.CombinedDates.UnfilteredAggregates, filterName, range);\n }\n\n function resetRangeFilter(filterName, range) {\n filterUtil.resetRangeFilter(results, results.CombinedDates.UnfilteredAggregates, filterName, range);\n return service.filter();\n }\n\n function removeArrayFilter(filterName, item) {\n filterUtil.removeArrayFilter(filterName, item);\n return service.filter();\n }\n\n function resetBooleanFilter(filterName) {\n filterUtil.resetBooleanFilter(filterName);\n return service.filter();\n }\n\n function resetArrayFilter(filterName) {\n filterUtil.resetArrayFilter(filterName);\n return service.filter();\n }\n\n function getRouteSummary(tripType, tripId) {\n return $q.all([\n currentDestination.getCurrentDestination(),\n tripService.getSelectedDestinationAirport(tripId)\n ]).then(function(res) {\n const [dest, destAirport] = res;\n let to;\n if ((dest == null || tripType === 1) && destAirport) { //if it's flight only we should always use the destination airport\n to = destAirport.ShortTitle || destAirport.Title;\n } else if (dest) {\n to = dest.SummaryTitle;\n }\n return to;\n //return to ? 'Flights to ' + to : 'Flights';\n });\n }\n\n function getOccupancySummary() {\n return occupancyService.getRoomOccupancyString();\n }\n\n function getSearchSummary(tripType, tripId) {\n // TODO: use formatted resource string\n //return getRouteSummary() + ' on ' + getDurationSummary() + ', ' + getOccupancySummary();\n return $q.all([\n getRouteSummary(tripType, tripId),\n tripService.getDurationSummary(searchUnitService.flight, $routeParams.tripId)\n ]).then(result => `${result[0]} on ${result[1]}`);\n }\n\n function validateSearchCriteria(isHoliday, oneWayOnly) {\n return flightSearchValidator.validate(\n isHoliday,\n searchUnitService.getDestination(),\n searchUnitService.getDestinationAirport(),\n searchUnitService.getDepartureAirports(),\n searchUnitService.startDate(searchUnitService.flight),\n searchUnitService.endDate(searchUnitService.flight),\n searchUnitService.getOutboundDates(searchUnitService.flight),\n searchUnitService.getCabin(),\n occupancyService.getOccupancy(),\n oneWayOnly\n );\n }\n\n function clearSearchResults() {\n filterUtil = new FilterUtils(_defaultFilterCriteria());\n filterDefer = $q.defer();\n req.Paging.PageIndex = 0;\n results = null;\n }\n\n function getSearchResults(searchId, tripId, selectedFlightId) {\n if (results && searchId === results.AvailabilitySearchId) {\n if (selectedFlightId) {\n const r = _.cloneDeep(results);\n const flights = _.get(r, 'CombinedDates.AvailableFlights');\n _.set(r, 'CombinedDates.AvailableFlights', _.filter(flights, f => f.FlightId !== selectedFlightId));\n return $q.when(r);\n }\n return $q.when(results);\n }\n clearSearchResults();\n return service.search({ searchId, tripId });\n }\n\n function calculatePrice(adults, children) {\n let childTaxArr = [];\n let infantTaxArr = [];\n let adultFareArr = [];\n let childFareArr = [];\n let infantFareArr = [];\n\n for (let i = 0; i < children.length; i++) {\n if (children[i] <= 1) {\n infantTaxArr.push(children[i]);\n infantFareArr.push(children[i]);\n } else {\n childTaxArr.push(children[i]);\n if (children[i] >= 12) {\n adultFareArr.push(children[i]);\n } else {\n childFareArr.push(children[i]);\n }\n }\n }\n\n let adultCount = adults + adultFareArr.length;\n let priceQtys = {\n AdultFareQuantity: adultCount,\n AdultTaxQuantity: adults,\n ChildFareQuantity: childFareArr.length,\n ChildTaxQuantity: childTaxArr.length,\n InfantFareQuantity: infantFareArr.length,\n InfantTaxQuantity: infantTaxArr.length,\n };\n\n sessionStorage.setItem('priceQtys', JSON.stringify(priceQtys));\n }\n\n function search(args) {\n if (inProgress != null && !args.newSearch) {\n return inProgress;\n }\n req.AvailabilitySearchId = args.searchId;\n req.TripId = args.tripId;\n req.CombineDates = true;\n\n if (args.newSearch || args.useSearchUnit || args.isV3HolidayRoute) {\n delete req.SelectedFlight;\n\n req.Destination = searchUnitService.getDestination();\n req.DestinationAirports = args.newSearch ? searchUnitService.getDestinationAirports() : searchUnitService.getDestinationAirports(req.Destination);\n req.SelectedDestinationAirport = searchUnitService.getDestinationAirport();\n req.DepartureAirports = searchUnitService.getDepartureAirports();\n req.SelectedDepartureAirport = searchUnitService.getSelectedDepartureAirport();\n req.DepartureDate = searchUnitService.startDate(searchUnitService.flight);\n req.ReturnDate = searchUnitService.endDate(searchUnitService.flight);\n const occ = occupancyService.reduceOccupancy();\n req.Adults = occ.Adults;\n req.ChildAges = occ.ChildAges;\n req.Paging.PageIndex = 0;\n req.OneWayOnly = args.oneWayOnly;\n req.FlightOnlySearch = args.flightOnly;\n searchUnitService.setOneWayFlightEnabled(args.oneWayOnly);\n req.Cabin = searchUnitService.getCabin();\n req.PreferredCarrierCodes = args.prefilterAirlines;\n req.IsDirectFlight = args.prefilterDirectFlights;\n\n calculatePrice(req.Adults, req.ChildAges);\n\n if (TRPCONFIG.Domain.isAgentMode && TRPCONFIG.Domain.ShowAgentOfficeSelector) {\n req.OfficeLocationId = $rootScope.agent.CurrentOfficeLocation;\n }\n if (args && args.postfilterAirlines && args.postfilterAirlines.length) {\n getFilter().Airline = args.postfilterAirlines;\n }\n if (!TRPCONFIG.Domain.FlexibleDatesEnabled || !args.flexibleDates) {\n getFilter().DepartureDates = [unadjustedDateFilter(req.DepartureDate, 'yyyy-MM-dd')];\n } else {\n getFilter().DepartureDates = [];\n }\n req.FilterCriteria = _getFilterCriteriaSet();\n tripService.recordFlightSearch(args.tripId, req);\n }\n\n function get() {\n if (!args.newSearch && args.isV3HolidayRoute) {\n return;\n }\n const whitelist = [\n /^\\/holidays\\/flights\\/\\w+/,\n '/holidays/flightunavailable',\n /^\\/flights\\/\\w+/,\n /^\\/holidays\\/hotels\\/\\w+/\n ];\n filterCanceller = cancellerService.add.apply(null, whitelist);\n filterCanceller.promise.then(function() {\n inProgress = null;\n });\n const isHotelFirst = JSON.parse(sessionStorage.getItem('PreselectFlight'));\n if (isHotelFirst && !TRPCONFIG.Domain2.IsHotelFirstJourneyEnabled) {\n _resetFlexibleDates(req);\n }\n const prunedReq = pruneRequest(req);\n return $http.post(_getUrl(args.newSearch), prunedReq, { timeout: filterCanceller.promise })\n .then(function(res) {\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\n\n getFilter().DepartureDates = res.data.FilterCriteria.DepartureDates;\n\n filterUtil.copyFilterFrom('PriceRange', res.data.CombinedDates.UnfilteredAggregates);\n filterUtil.copyFilterFrom('OutboundTakeOffRange', res.data.CombinedDates.UnfilteredAggregates);\n filterUtil.copyFilterFrom('ReturnTakeOffRange', res.data.CombinedDates.UnfilteredAggregates);\n\n if (results) { //we already had results so we are just loading more results\n results.CombinedDates.AvailableFlights = results.CombinedDates.AvailableFlights.concat(res.data.CombinedDates.AvailableFlights);\n } else {\n results = res.data;\n }\n\n inProgress = null;\n filterDefer.resolve(service.getFilter());\n\n if (args.resetPriceRange === true) {\n _resetPriceRange(results);\n }\n\n broker.publish('flightResultsModified', results);\n\n return results;\n });\n }\n\n inProgress = $q.all([\n args.sortOrder || preferences.getFlightSortOrder(args.newSearch),\n tripService.getFlightsRequest(args.tripId)\n ])\n .then(([so, fr]) => {\n req.SortCriterion = so;\n const selectedFlightId = _.get(fr, 'SelectedFlight.FlightId');\n _.set(req, 'FilterCriteria.SelectedFlightId', selectedFlightId);\n })\n .then(get)\n .catch(() => inProgress = null);\n\n return inProgress;\n }\n\n function rehydrateMultiDestHolidayFlight(selectedFlight) {\n const { DetailsId, FlightId } = selectedFlight || {};\n\n if (DetailsId && FlightId) {\n return flightDetail.rehydrate(DetailsId)\n .then(details => {\n if (details.Itinerary) {\n // See holidaySearchCtrl.js\n details.Itinerary.FlightId = FlightId;\n }\n return details;\n });\n }\n return $q.when();\n }\n\n function setBags(trip, flight) {\n if (flight) {\n return baggageService.getBaggageInfo(trip.TripId).then(function(bagInfo) {\n flight.Legs.forEach((l, i) => {\n if (l.BagsIncludedCount > 0) {\n //this means that the leg already comes with bags (though we may not have known this at the time we selected the flight\n l.passengerBagCount = l.BagsIncludedCount;\n } else {\n //if the leg does not include baggage, we use the number of bags that the user has currently selected\n l.passengerBagCount = bagInfo[i]\n ? bagInfo[i].holdBagCount\n : bagInfo[0] && bagInfo[0].holdBagCount || 0;\n }\n });\n flight.bags = _.max(flight.Legs.map(leg => leg.passengerBagCount));\n });\n }\n return $q.when();\n }\n\n function modifyBags(numberOfBags) {\n broker.publish('searchCriteriaModified');\n if (results != null) {\n _resetPriceRange(results);\n }\n req.FilterCriteria = _getFilterCriteriaSet();\n req.Paging.PageIndex = 0;\n req.NumberOfLeadBags = numberOfBags;\n results = null;\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId, resetPriceRange: true });\n }\n\n function sort(criterion) {\n broker.publish('searchCriteriaModified');\n req.FilterCriteria = _getFilterCriteriaSet();\n req.Paging.PageIndex = 0;\n results = null;\n return preferences.setFlightSortOrder(criterion).then(() => {\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId, sortOrder: criterion });\n });\n }\n\n function filter() {\n const filterDeferred = (filterCanceller || $q.defer());\n filterDeferred.resolve();\n broker.publish('searchCriteriaModified');\n req.FilterCriteria = _getFilterCriteriaSet();\n req.Paging.PageIndex = 0;\n results = null;\n return filterDeferred.promise.then(function() {\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId });\n });\n }\n\n function getAvailabilityRequest() {\n return req;\n }\n\n function pageSize() {\n return req.Paging.PageSize;\n }\n\n function nextPage() {\n req.Paging.PageIndex += 1;\n req.FilterCriteria = _getFilterCriteriaSet();\n return service.search({ searchId: req.AvailabilitySearchId, tripId: req.TripId });\n }\n\n function getUrl() {\n return url;\n }\n\n function setCabin(cabin) {\n req.Cabin = cabin;\n }\n\n function trackFlightClick(\n flight,\n tripId,\n boostReason = null) {\n const _flight = _.partial(_.get, flight);\n\n analytics.track('mixpanel', 'FlightListingClick', {\n RepeatFlightClicked: _flight('RecentlyViewedIndex') === 1,\n InboundCareer: _flight('Legs[0].Segments[0].CarrierName'),\n OutboundCareer: _flight('Legs[1].Segments[0].CarrierName')\n });\n\n return tripService.getFlightsRequest(tripId).then(fRequest => {\n let FreeBaggage = _(_flight('Legs')).map(leg => leg.BagsIncludedCount).min() > 0;\n\n const selectionsReq = {\n Type: 1,\n SearchId: _.get(fRequest, 'AvailabilitySearchId'),\n DomainId: _.get(TRPCONFIG, 'Domain.DomainId'),\n AdultFare: _flight('LeadAdultPrice'),\n AdultTax: _flight('LeadAdultTax'),\n CurrencyCode: _flight('CurrencyCode'),\n FreeBaggage,\n SearchResultsIndex: _flight('SearchResultsIndex'),\n BoostReason: boostReason,\n OutboundDepartureAirport: _flight('Legs[0].DepartureAirport.Code'),\n OutboundDepartureDate: _flight('Legs[0].DepartureDate'),\n OutboundArrivalAirport: _flight('Legs[0].ArrivalAirport.Code'),\n OutboundArrivalDate: _flight('Legs[0].ArrivalDate'),\n OutboundSegmentDetails: _.map(_flight('Legs[0].Segments'), mapSegmentForTracking),\n InboundDepartureAirport: _flight('Legs[1].DepartureAirport.Code'),\n InboundDepartureDate: _flight('Legs[1].DepartureDate'),\n InboundArrivalAirport: _flight('Legs[1].ArrivalAirport.Code'),\n InboundArrivalDate: _flight('Legs[1].ArrivalDate'),\n InboundSegmentDetails: _.map(_flight('Legs[1].Segments'), mapSegmentForTracking)\n };\n\n localStorage.setItem('flightsSelections', JSON.stringify(selectionsReq));\n\n return $http.post('/api/useractions/selections', selectionsReq, { ignoreErrors: true });\n });\n }\n\n function mapSegmentForTracking(s) {\n const _s = _.partial(_.get, s);\n return {\n DepartureAirport: _s('DepartureAirportCode'),\n DepartureDate: _s('DepartureDate'),\n ArrivalAirport: _s('DestinationAirportCode'),\n ArrivalDate: _s('ArrivalDate'),\n FlightNumber: _s('FlightNumber'),\n CarrierName: _s('CarrierName'),\n Cabin: _s('Cabin'),\n AdditionalStops: _s('AdditionalStops')\n };\n }\n\n function pruneRequest(req) {\n req = _.pick(req,\n 'Adults',\n 'AvailabilitySearchId',\n 'ChildAges',\n 'CombineDates',\n 'CultureCode',\n 'CurrencyCode',\n 'DepartureAirports',\n 'DepartureDate',\n 'Destination',\n 'DestinationAirports',\n 'DomainId',\n 'ExcludeOpenJaw',\n 'FilterCriteria',\n 'FlightOnlySearch',\n 'IsAnyToAny',\n 'NumberOfLeadBags',\n 'OneWayOnly',\n 'Paging',\n 'Cabin',\n 'ReturnDate',\n 'ReturnFullResults',\n 'SortCriterion',\n 'IsSingleDaySearch',\n 'PreferredCarrierCodes',\n 'IsDirectFlight',\n 'OfficeLocationId',\n 'WaitForResults'\n );\n\n req.Destination = _.pick(req.Destination,\n 'CountryId',\n 'ProvinceId',\n 'LocationId',\n 'EstablishmentId',\n 'PolygonId'\n );\n\n req.Paging = _.pick(req.Paging,\n 'PageIndex',\n 'PageSize'\n );\n\n req.FilterCriteria = _.pick(req.FilterCriteria,\n 'DepartureAirport',\n 'Airline',\n 'SelectedFlightId',\n 'Stop',\n 'OutboundTakeOffRange',\n 'OutboundLandingRange',\n 'ReturnTakeOffRange',\n 'ReturnLandingRange',\n 'PriceRange',\n 'HideAlternativeDates',\n 'HideOpenJaw',\n 'DepartureDates'\n );\n\n return req;\n }\n\n return service;\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('flightSearchValidator', flightSearchValidator);\r\n\r\nfunction flightSearchValidator(resourceService, dateUtil, occupancyService) {\r\n const service = {\r\n validate\r\n };\r\n\r\n function validate(isHoliday, destination, destinationAirport, departureAirports, departureDate, returnDate, outboundDates, cabin, occupancy, oneWayOnly) {\r\n const errors = [];\r\n\r\n if (isHoliday) {\r\n if (_.isEmpty(destination)) {\r\n errors.push(resourceService.get('SELECTDESTINATION'));\r\n } else {\r\n if (!destination.HolidayEnabled) {\r\n errors.push(String.format(resourceService.get('NOTHOLIDAYENABLED'), destination.Title));\r\n }\r\n\r\n if (!destination.Searchable) {\r\n errors.push(String.format(resourceService.get('NONSEARCHABLE'), destination.Title));\r\n }\r\n }\r\n\r\n if (cabin < 1) {\r\n errors.push(resourceService.get('SELECTFLIGHTCLASS'));\r\n }\r\n } else if (_.isEmpty(destinationAirport)) {\r\n errors.push(resourceService.get('SELECTDESTINATIONAIRPORT'));\r\n }\r\n\r\n if (departureAirports == null ||\r\n departureAirports.length === 0) {\r\n errors.push(resourceService.get('SELECTDEPARTUREAIRPORT'));\r\n }\r\n\r\n let destinationCodes = isHoliday ? destination && destination.DestinationAirports : destinationAirport && destinationAirport.Code;\r\n if (destinationCodes && departureAirports) {\r\n destinationCodes = destinationCodes.split(',');\r\n\r\n const destinationAndDepartureAreSame = _.some(destinationCodes, dest => _.includes(departureAirports, dest));\r\n if (destinationAndDepartureAreSame) {\r\n errors.push(resourceService.get('DEPARTUREANDDESTINATIONAIRPORTSTHESAME'));\r\n }\r\n }\r\n\r\n if (departureDate == null) {\r\n errors.push(resourceService.get('SELECTDEPARTUREDATE'));\r\n } else {\r\n if (TRPCONFIG.Domain.HolidaysSearchOffsetDate !== 0 && !dateUtil.atLeastOneDayInTheFuture(departureDate)) {\r\n errors.push(resourceService.get('DEPARTUREDATEMUSTBEFUTURE'));\r\n }\r\n if (outboundDates &&\r\n Object.keys(outboundDates).length > 0 &&\r\n outboundDates[dateUtil.format(departureDate, 'yyyy-MM-dd')] === undefined) {\r\n errors.push(resourceService.get('DEPARTUREDATENOTAVAILABLE'));\r\n }\r\n }\r\n\r\n if (returnDate == null && !oneWayOnly) {\r\n errors.push(resourceService.get('SELECTRETURNDATE'));\r\n } else if (returnDate <= departureDate && !oneWayOnly) {\r\n errors.push(resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\r\n }\r\n\r\n if (occupancyService.moreInfantsThanAdults()) {\r\n errors.push(resourceService.get('TOOMANYINFANTS'));\r\n }\r\n\r\n if (occupancyService.getNumberOfNonInfantPassengers() > TRPCONFIG.Domain.MaxPassengers) {\r\n errors.push(String.format(decodeURI(resourceService.get('TOOMANYPASSENGERS')), `${TRPCONFIG.DesktopUrlRoot}/Help/Groupbookings.aspx`, resourceService.get('TELEPHONENUMBER')));\r\n }\r\n\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","'use strict';\nnamespace TR {\n export class FlightsFilterService {\n constructor(\n private $filter: angular.IFilterService) {\n }\n\n private sortArray = (arr, prop) => {\n var sortBy = '-count';\n if(prop === 'FlightsByAirline' && TRPCONFIG.Domain.FlightsByAirlineFilterOrder) {\n sortBy = TRPCONFIG.Domain.FlightsByAirlineFilterOrder;\n }\n if(prop === 'DepartureDates') {\n sortBy = 'name';\n }\n return this.$filter('orderBy')(arr, sortBy);\n }\n\n arrayifyAggregates = (dict, props) :void => {\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n if (dict[prop + 'Array']) {\n continue;\n }\n var arr:any = [];\n for (var p in dict[prop]) {\n if (dict[prop].hasOwnProperty(p)) {\n arr.push({\n name: p,\n count: dict[prop][p].Count != null ? dict[prop][p].Count : dict[prop][p],\n logo: dict[prop][p].Logo,\n minimumPrice: dict[prop][p].MinimumPrice\n });\n }\n }\n dict[prop + 'Array'] = this.sortArray(arr, prop);\n }\n }\n\n populateMinimumPrice = (dict) :void => {\n const values = _.values(dict.FlightsByAirline);\n dict.minimumPrice = (_.minBy(values, (x: any) => x.MinimumPrice) || {}).MinimumPrice;\n }\n }\n\n angular.module('TR').service('flightsFilterService', FlightsFilterService);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('geo', geo);\n\nfunction geo($http, $q, autocompleter) {\n const service = {\n getSearchArea,\n supported,\n getNearestAirportTitles,\n getNearestAirports\n };\n\n function getSearchArea() {\n const d = $q.defer();\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function(pos) {\n d.resolve({\n Latitude: pos.coords.latitude,\n Longitude: pos.coords.longitude,\n Radius: 10\n });\n }, function(err) {\n //this happens quite a lot but it is almost always because the user does not give permission\n //analytics.trackEvent({category : 'failure', action : 'geo', label:'getCurrentPositionFailed'});\n //loggingService.logWarn('geo.getCurrentPositionFailed with err: ' + JSON.stringify(err));\n d.reject(err);\n });\n } else {\n //having tracked this for a while, it pretty much never happens.\n //analytics.trackEvent({category : 'failure', action : 'geo', label:'geolocationNotSupported'});\n d.reject('geo not supported');\n }\n return d.promise;\n }\n\n function supported() {\n return navigator.geolocation;\n }\n\n function defaultClientLocation() {\n return angular.fromJson(TRPCONFIG.Domain.ClientDefaultLocation\n || '{ \"CountryCode\": \"GB\", \"Latitude\": 51.4167, \"Longitude\": -0.2833 }');\n }\n\n function getLocationFromIpAddress() {\n const isPrerender = /prerender/i.test(navigator.userAgent);\n if (isPrerender) {\n return $q.when([]);\n }\n let ipAddress = TRPCONFIG.ClientIpAddress;\n const url = `/api2/globalisation/location?${$.param({\n ipAddress\n })}`;\n return $http\n .get(url, { cache: true, ignoreErrors: true })\n .then(response => {\n let location = response.data;\n if (angular.equals(location, { CountryCode: null, Latitude: 0, Longitude: 0 })) {\n location = defaultClientLocation();\n }\n return location;\n });\n }\n\n function getNearestAirports() {\n if (TRPCONFIG.Domain.NearestAirportsStaticList) {\n return $q.when(TRPCONFIG.Domain.NearestAirportsStaticList);\n }\n return getLocationFromIpAddress()\n .then(location => $q.all({\n airportValidator: getAirportValidator(),\n nearbyAirports: getAirportsNear(location)\n }))\n .then(({\n airportValidator,\n nearbyAirports\n }) => {\n let filter = airports => _(airports)\n .filter(airportValidator)\n .take(6)\n .map(a => ({ Code: a }))\n .value();\n\n nearbyAirports = filter(nearbyAirports);\n if (nearbyAirports && nearbyAirports.length) {\n return nearbyAirports;\n }\n return getAirportsNear(defaultClientLocation())\n .then(nearbyAirports => filter(nearbyAirports));\n })\n .catch(() => []);\n }\n\n function getNearestAirportTitles() {\n return getLocationFromIpAddress()\n .then(location => {\n const url = `website/flights/nearestairporttitles?${$.param({\n cultureCode: TRPCONFIG.Domain.CultureCode,\n latitude: location.Latitude,\n longitude: location.Longitude\n })}`;\n return $http\n .get(url, { cache: true, ignoreErrors: true })\n .then(response => _.take(response.data, 6));\n });\n }\n\n function getAirportsNear(location) {\n let params = {\n latitude: location.Latitude,\n longitude: location.Longitude\n };\n if (TRPCONFIG.Domain.NearestAirportsMaxDistance) {\n params.maxDistance = TRPCONFIG.Domain.NearestAirportsMaxDistance;\n }\n const url = `/api2/flights/static/getnearestairports?${$.param(params)}`;\n return $http\n .get(url, { cache: true, ignoreErrors: true })\n .then(response => response.data);\n }\n\n function getAirportValidator() {\n if (TRPCONFIG.Domain.UseStaticDepartureDropdown) {\n return autocompleter.initialDepartureAirports().then(validAirports => {\n const validAirportCodes = _.map(validAirports.data, va => va.Code);\n return a => _.some(validAirportCodes, va => va === a);\n });\n }\n return $q.when(() => true);\n }\n\n return service;\n}\n})();\n","namespace TR {\n type HotelService = Core.Hotels.HotelService;\n type FieldGroupService = Core.FieldGroupService;\n type TripService = Core.TripService;\n class DealsFindParameters {\n url: string;\n sort: number;\n fieldFlags: any;\n paging: any;\n includeCruises: boolean;\n destination: any;\n discountedPricesOnly: boolean;\n flexibility: number;\n }\n\n export class HolidayDeals {\n\n API: string = '/api/holidays/deals';\n DURATIONS: number[] = TRPCONFIG.Domain.HolidayDealsDurations.map(d => parseInt(d, 10));\n runningRequest: any;\n\n constructor(\n private $http: ng.IHttpService,\n private $location: ng.ILocationService,\n private $filter: any,\n private $q: ng.IQService,\n private dateUtil: any,\n private resourceService: Core.ResourceService,\n private getPropertyTypeFromResKey: any,\n private imageService: any,\n private occupancyService: Core.OccupancyService,\n private fieldGroupService: FieldGroupService,\n private filtering: any,\n private pageStrand: any,\n private tripService: TripService,\n private hotelService: HotelService,\n private analytics: any,\n private flightSearch: any,\n private geo: any,\n private preferences: any\n ) {\n this.runningRequest = this.$q.defer();\n }\n\n find({\n page = 0, sort = 1, pageSize = TRPCONFIG.Domain.HolidayDealsPageSize, destination, saveToUrl,\n includeAggregates = true, discountedPricesOnly = false,\n flexibility,\n includeCruises = TRPCONFIG.Domain.HolidayDealsCruisesEnabled\n }) {\n let findParams = new DealsFindParameters();\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(\n Core.FieldType.Global,\n Core.FieldType.Titles,\n Core.FieldType.Url,\n Core.FieldType.Description,\n Core.FieldType.Summary,\n Core.FieldType.HolidayDeals,\n Core.FieldType.LegacyFacilities,\n Core.FieldType.Weather,\n Core.FieldType.Distances,\n Core.FieldType.Recommendations,\n Core.FieldType.Airports,\n Core.FieldType.TransferTimes\n );\n findParams.paging = { Size: pageSize, Index: page };\n findParams.sort = sort;\n findParams.url = `${this.API}/search`;\n findParams.includeCruises = includeCruises;\n findParams.destination = destination;\n findParams.discountedPricesOnly = discountedPricesOnly;\n findParams.flexibility = flexibility;\n\n return this.$q.all({\n params: this.getFullParameters(saveToUrl),\n filters: this.filtering.getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\n })\n .then(res => this.$q.all({\n deals: this._findDeals(findParams, res.filters, includeAggregates, res.params),\n summary: this.getSearchSummary(res.params),\n }))\n .then((res: any) => ({\n Products: this._enrichProducts(res.deals.data.Hotels, res.deals.req),\n Aggregates: res.deals.data.Aggregates,\n Paging: {\n Size: res.deals.req.Paging.Size,\n Index: res.deals.req.Paging.Index,\n Total: res.deals.data.Aggregates\n ? res.deals.data.Aggregates.FilteredHotelCount\n : 0,\n UnfilteredTotal: res.deals.data.Aggregates\n ? res.deals.data.Aggregates.HotelCount\n : 0\n },\n Info: {\n duration: res.deals.req.Duration,\n searchSummary: res.summary,\n filters: res.deals.filters,\n airportsTitles: res.deals.data.AirportTitles\n }\n }));\n }\n\n getMapCoordinates() {\n let findParams = new DealsFindParameters();\n const fields = 'Hotels.Id,Hotels.Latitude,Hotels.Longitude,Hotels.DealMinPrice';\n\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(\n Core.FieldType.Global\n );\n findParams.paging = null;\n findParams.sort = 0;\n findParams.url = `${this.API}/search?fields=${fields}`;\n\n return this.filtering\n .getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\n .then(filters => this._findDeals(findParams, filters, false))\n .then(res => res.data.Hotels.filter(h => (h.Latitude || h.Longitude)));\n }\n\n getDealsForHotel(\n estabId: number,\n durations: number[] | undefined,\n dates: Date[]\n ) {\n const params:any = this.deserialiseParameters();\n const fieldFlags = this.fieldGroupService.getFieldGroup(\n Core.FieldType.HolidayDeals,\n Core.FieldType.Airports,\n Core.FieldType.TransferTimes\n );\n\n let datesAndDurations = _(dates || [params.startDate])\n .map(date => this.dateUtil.serialiseDate(date))\n .flatMap(date => {\n return _.map(durations || [params.duration], duration => ({ Date: date, Duration: duration }));\n })\n .value();\n\n let request: any = {\n Id: estabId,\n DatesAndDurations: datesAndDurations,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n Adults: params.occupancy[0].Adults,\n ChildAges: params.occupancy[0].ChildAges,\n OriginAirports: params.depAir,\n FieldFlags: fieldFlags,\n BoardTypes: []\n };\n\n return this.$http.post(`${this.API}/getdealsforhotel`, request)\n .then(res => res.data);\n }\n\n getDealsFromMap(estabId) {\n const { startDate } = this.deserialiseParameters();\n const dates = this.dateUtil.getDateInterval(startDate, 7);\n return this.getDealsForHotel(estabId, undefined, dates);\n }\n\n getAggregates(saveToUrl = true, presetParams = {}) {\n let findParams = new DealsFindParameters();\n\n findParams.fieldFlags = this.fieldGroupService.getFieldGroup(\n Core.FieldType.HolidayDeals\n );\n findParams.paging = { Size: 0, Index: 0 };\n findParams.sort = 5;\n findParams.url = `${this.API}/search`;\n findParams.includeCruises = false;\n\n return this.$q.all([\n this.getFullParameters(saveToUrl, presetParams),\n this.filtering.getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'))\n ])\n .then(res => ({ params: res[0], filters: _.omit(res[1], 'ChildDestinations') }))\n .then((res:any) => this._findDeals(findParams, res.filters, true, res.params))\n .then(res => res && res.data);\n }\n\n enrichDeals(deals, boardTypeFilters) {\n return deals.map(d => {\n d.HotelDeal.CheckInDate =\n this.dateUtil.parseDate(d.HotelDeal.CheckInDate);\n d.HotelDeal.CheckOutDate =\n this.dateUtil.parseDate(d.HotelDeal.CheckOutDate);\n\n d.DepartureEpoch = angular\n .copy(d.HotelDeal.CheckInDate)\n .setHours(0, 0, 0, 0);\n\n d.Duration = this.dateUtil.getDifferenceInDays(\n d.HotelDeal.CheckInDate,\n d.HotelDeal.CheckOutDate\n );\n\n let bt;\n if (boardTypeFilters && boardTypeFilters.length) {\n bt = _.chain(d.HotelDeal.BoardTypeMinPrices)\n .filter(v => boardTypeFilters.indexOf(v.BoardType) > -1)\n .sortBy(v => v.MinPrice)\n .value()[0];\n }\n\n const hotelPrice = bt ? bt.MinPrice : d.HotelDeal.Price;\n d.Price = d.FlightsDeal.Price + hotelPrice;\n const num = this.occupancyService.getNumberOfNonInfantPassengers();\n d.PricePerPerson = d.Price / num;\n\n return d;\n });\n }\n\n selectDeal(deal: any, estabId: number, original: any, originalTimes: any) {\n const params = this.deserialiseParameters();\n let request: any = {\n AvailabilitySearchId: deal.HotelDeal.AvailabilitySearchId,\n EstabId: estabId,\n RoomAndBoardIds: [deal.selectedBoardType.Id],\n DiscountCode: TRPCONFIG.DiscountCode,\n BookingPath: 4\n };\n if (TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\n const SkywardsLoginUser = JSON.parse(sessionStorage.getItem('skywardsLoginUser') || '{}');\n const Tier = (SkywardsLoginUser&& SkywardsLoginUser.data && SkywardsLoginUser.data.Contact) ?\n SkywardsLoginUser.data.Contact.Tier : null;\n request.LoyaltyInfo = {\n SkywardsTier: Tier\n };\n }\n\n return this.hotelService.getHotelDetails(request)\n .then(details => {\n deal.EstabId = estabId;\n deal.HotelDeal.ProductId = details.DetailsId;\n return deal;\n })\n .then(deal => this.tripService.getTripIdForHolidayDeal(deal, params.occupancy))\n .then(tripId => {\n this._trackDealChanges(original, deal, originalTimes);\n return this.$location.url(`holidays/options/${tripId}/`);\n });\n }\n\n serialiseParameters(params: any, toUrl: boolean) {\n const getParams = {\n depAir: params.airportsCodes ? params.airportsCodes.map(a => a.Code).join('-') : undefined,\n startDate: params.startDate ? this.dateUtil.format(params.startDate, 'yyyy-MM-dd') : undefined,\n duration: params.duration,\n occ: params.occupancy ? this.occupancyService.serialise(params.occupancy) : undefined,\n flex: params.flexibility\n };\n return toUrl ? jQuery.param(getParams) : getParams;\n }\n\n deserialiseParameters() {\n const params = this.$location.search();\n return {\n depAir: params.depAir ? params.depAir.split('-') : undefined,\n startDate: params.startDate\n ? this.dateUtil.parseDate(params.startDate)\n : undefined,\n duration: parseInt(params.duration, 10),\n occupancy: params.occ\n ? this.occupancyService.parseOccupancyString(params.occ)\n : undefined,\n flexibility: parseInt(params.flex || '3', 10)\n };\n }\n\n getFullParameters(saveToUrl = true, presetParams = {}) {\n const params = _.merge(this.deserialiseParameters(), presetParams);\n const queryString:any = this.serialiseParameters(presetParams, false);\n if (params.startDate && params.depAir && params.occupancy && params.duration) {\n return this.$q.when(params);\n }\n\n if (!params.startDate) {\n params.startDate =\n this.dateUtil.getNextSaturday(TRPCONFIG.Domain.HolidayDealsDefaultWeeks);\n queryString.startDate = this.dateUtil.format(params.startDate, 'yyyy-MM-dd');\n }\n\n if (!params.occupancy) {\n params.occupancy = this.occupancyService.parseOccupancyString(\n 'A2'\n );\n queryString.occ = TRPCONFIG.Domain.HolidayDealsDefaultOccupancy;\n }\n\n if (!params.duration) {\n params.duration = TRPCONFIG.Domain.HolidayDealsDefaultDuration;\n queryString.duration = TRPCONFIG.Domain.HolidayDealsDefaultDuration;\n }\n\n const promise = !params.depAir || !params.depAir.length\n ? this.preferences\n .get('holidayaSsearch')\n .then((holiday:any) => holiday && holiday.airports\n ? holiday.airports\n : this.geo\n .getNearestAirports()\n .then(airports => airports.map(a => a.Code))\n )\n .then(airports => {\n params.depAir = airports && airports.length > 0\n ? airports\n : TRPCONFIG.Domain.HolidayDealsDefaultAirports;\n queryString.depAir = params.depAir.join('-');\n return params;\n })\n : this.$q.when(params);\n\n return promise.then(params => {\n if (saveToUrl) {\n let search = this.$location.search();\n _.merge(search, queryString, { dealsOnly: 1 });\n this.$location.search(search).replace();\n }\n return params;\n });\n }\n\n getDefaultFilters(): any {\n return {\n Stars: [],\n BoardTypes: [],\n ChildDestinations: [],\n FacilityCodes: [],\n PropertyTypes: [],\n RatingRange: null,\n PriceRange: null\n };\n }\n\n getCurrentFilters() {\n return this.filtering\n .getFilters(this.getDefaultFilters(), this.pageStrand.get('Holiday'));\n }\n\n getSearchSummary(params) {\n params.occupancy = _.first(params.occupancy);\n const appDate = this.$filter('date')(params.startDate, 'd MMM yyyy');\n const { nights, adults, children } = this._getSummaryElements(params);\n\n let summary = '';\n summary += `${this.resourceService.get('HOLIDAYDEALSHEADER')} `;\n summary += `${params.duration} ${nights}`;\n summary += `, ${appDate}, `;\n summary += params.occupancy.Adults > 0\n ? `${params.occupancy.Adults} ${adults} `\n : '';\n summary += params.occupancy.ChildAges.length > 0\n ? `${params.occupancy.ChildAges.length} ${children} `\n : '';\n\n return this.flightSearch\n .getAirportTitles(params.depAir)\n .then(res => {\n const different = this.resourceService\n .get('DIFFERENTAIRPORTS')\n .replace('{0}', res.data.length);\n\n const fromString = this.resourceService.get('FROM');\n\n return res.data.length === 1\n ? `${summary} ${fromString} ${res.data}`\n : `${summary} ${different}`;\n });\n }\n\n enrichHotel(hotel, request) {\n const imageW = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\n const imageH = imageW;\n const propertyType = this.getPropertyTypeFromResKey(hotel.AcomTypeId, hotel.IsVilla);\n const numberOfNonInfantPassengers = this.occupancyService.getNumberOfNonInfantPassengers();\n hotel.PropertyTypeFrom = this.resourceService.get(propertyType);\n hotel.ImageUrl = this.imageService.getMainImageUrl(hotel.Id, imageW, imageH);\n hotel.CroppedImage = this.imageService.getMainImageUrl(hotel.Id, 270, 150, true);\n hotel.MinPricePerson = hotel.DealMinPrice / numberOfNonInfantPassengers;\n if (hotel.HolidayDeals) {\n hotel.DealWasPrice = hotel.HolidayDeals[0].HotelDeal.WasPrice + hotel.HolidayDeals[0].FlightsDeal.Price;\n hotel.WasPricePerPerson = hotel.DealWasPrice / numberOfNonInfantPassengers;\n hotel.BoardType = this.resourceService.get(\n this.filtering.getBoardTypeName(hotel.HolidayDeals[0].HotelDeal.BoardType)\n );\n }\n hotel.Duration = request.Duration;\n hotel.OccupancyString = this.occupancyService.getOccupancyString(\n [_.pick(request, 'Adults', 'ChildAges')]\n );\n return hotel;\n }\n\n private getMinHolidayPrice() {\n return this._getTeaserPriceRequest()\n .then(r => this.$http.post(`${this.API}/getminholidayprice`, r, { ignoreErrors: true }))\n .then(response => response && response.data);\n }\n\n private getMinCruisePrice() {\n return this._getTeaserPriceRequest()\n .then(r => this.$http.post(`${this.API}/getmincruiseprice`, r, { ignoreErrors: true }))\n .then(response => response && response.data);\n }\n\n _getTeaserPriceRequest() {\n return this.getFullParameters(false).then(params => ({\n DatesAndDurations: this._getDatesAndDurations(this.dateUtil.getNextSaturday(2), params.duration, 3),\n Adults: 2,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n OriginAirports: params.depAir\n }));\n }\n\n private _trackDealChanges(orig, sel, originalTimes) {\n if (!orig || !orig.HotelDeal || !orig.FlightsDeal ||\n !sel || !sel.HotelDeal || !sel.FlightsDeal) {\n return;\n }\n\n const dow = this.$filter('date')(sel.HotelDeal.CheckInDate, 'EEE');\n\n const priceVariation =\n (sel.HotelDeal.Price + sel.FlightsDeal.Price) -\n (orig.HotelDeal.Price + orig.FlightsDeal.Price);\n\n this.analytics.track(\n 'mixpanel',\n 'HolidayDealsSelected',\n {\n DurationChanged: originalTimes.Duration !== sel.Duration,\n DateChanged: originalTimes.DepartureEpoch !== sel.DepartureEpoch,\n FlightChanged: orig.FlightsDeal.FlightId !== sel.FlightsDeal.FlightId,\n RoomChanged: orig.selectedRoom.MasterId !== sel.selectedRoom.MasterId,\n BoardTypeChanged: orig.selectedBoardType.BoardType !== sel.selectedBoardType.BoardType,\n PriceVariation: priceVariation,\n DayOfWeek: dow\n }\n );\n }\n\n private _getSummaryElements(params) {\n const nights = this.resourceService\n .get(params.duration === 1 ? 'NIGHT' : 'NIGHTS').toLowerCase();\n\n const adults = this.resourceService\n .get(params.occupancy.Adults === 1 ? 'ADULT' : 'ADULTS');\n const children = this.resourceService\n .get(params.occupancy.ChildAges.length === 1 ? 'CHILDREN' : 'CHILDREN');\n\n return { nights, adults, children };\n }\n\n private _findDeals(\n findParams: DealsFindParameters,\n filters: any,\n includeAggregates,\n params: any = undefined\n ) {\n\n if (this.runningRequest && includeAggregates) {\n this.runningRequest.resolve('CANCELLED');\n this.runningRequest = this.$q.defer();\n }\n\n if (!params) {\n params = this.deserialiseParameters();\n }\n\n let flexibility = angular.isUndefined(findParams.flexibility)\n ? params.flexibility : findParams.flexibility;\n\n const request = {\n DatesAndDurations: this._getDatesAndDurations(params.startDate, params.duration, flexibility),\n Adults: params.occupancy[0].Adults,\n ChildAges: params.occupancy[0].ChildAges,\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n OriginAirports: params.depAir,\n FieldFlags: findParams.fieldFlags,\n FilterCriteria: filters,\n SortCriterion: findParams.sort,\n Paging: findParams.paging,\n IncludeAggregates: includeAggregates,\n IncludeCruises: findParams.includeCruises,\n DiscountedPricesOnly: findParams.discountedPricesOnly,\n Destination: findParams.destination\n };\n\n return this.$http.post(\n findParams.url,\n request,\n { timeout: this.runningRequest.promise })\n .then((res: any) => {\n res.req = request;\n res.params = params;\n res.filters = filters;\n return res;\n });\n }\n\n private _enrichProducts(products: any, request: any) {\n return products\n .filter(p => p.IsCruise || p.HolidayDeals)\n .map(p => p.IsCruise ? this._enrichCruise(p) : this.enrichHotel(p, request));\n }\n\n private _enrichCruise(cruise) {\n cruise.PricePerPerson =\n cruise.DealMinPrice / this.occupancyService.getNumberOfNonInfantPassengers();\n cruise.BoardType = this.resourceService.get(\n this.filtering.getBoardTypeName(cruise.CheapestBoardType)\n );\n return cruise;\n }\n\n private _getDatesAndDurations(date: Date, duration: number, flexibility: number)\n {\n const cutoffDate = this.dateUtil.todayPlus(2);\n return _(_.range(-(flexibility), flexibility + 1))\n .map(x => this.dateUtil.addDays(date, x))\n .filter(date => date > cutoffDate)\n .map(date => ({\n Date: this.dateUtil.serialiseDate(date),\n Duration: duration\n }))\n .value();\n }\n }\n\n angular\n .module('TR')\n .service('holidayDeals', HolidayDeals);\n}\n","namespace TR {\n\n export class HolidayDealsGrouped {\n\n find: (any) => ng.IPromise;\n\n constructor(\n private $http: ng.IHttpService,\n private $location: ng.ILocationService,\n private $filter: any,\n private $q: ng.IQService,\n private dateUtil: any,\n private resourceService: Core.ResourceService,\n private imageService: any,\n private occupancyService: any,\n private fieldGroupService: Core.FieldGroupService,\n private filtering: any,\n private pageStrand: any,\n private tripService: Core.TripService,\n private hotelService: Core.Hotels.HotelService,\n private analytics: any,\n private flightSearch: any,\n private geo: any,\n private holidayDeals: TR.HolidayDeals,\n private preferences: any\n ) {\n this.find = _.memoize(\n options => this._find(options),\n options => angular.toJson(options).replace(/\\W/g, '')\n );\n }\n\n _find({ destinations, dealsPerDestination, startDate,\n duration, occupancy, depAir, flexibility }) {\n\n if (!destinations || !dealsPerDestination || !startDate\n || !duration || !occupancy || !depAir) {\n return this.$q.reject();\n }\n let getByDestinationsRequest = {\n Destinations: destinations,\n DealsPerDestination: dealsPerDestination,\n DatesAndDurations: this.getDates(startDate, duration, flexibility),\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n Adults: occupancy[0].Adults,\n ChildAges: occupancy[0].ChildAges || [],\n OriginAirports: depAir,\n DirectFlightsOnly: false,\n DiscountedPricesOnly: true,\n FieldFlags: this.getFieldGroup(),\n SortCriterion: 1,\n };\n\n return this.$http.post(\n '/api/holidays/deals/getbydestinations',\n getByDestinationsRequest\n )\n .then((res: any) => {\n return res.data;\n })\n .then(dealsForManyDestinations => {\n _.each(dealsForManyDestinations, dealsForADestination => {\n _.each(dealsForADestination, deal => {\n this.holidayDeals.enrichHotel(deal, { Duration: duration });\n });\n });\n return dealsForManyDestinations;\n });\n }\n\n getDates(StartDate, Duration, Flexibility) {\n let pad = x => {\n x = x + '';\n if (x.length === 1) {\n x = '0' + x;\n }\n return x;\n };\n let cutOffDate = this.dateUtil.todayPlus(2);\n\n let dates;\n if (angular.isNumber(Flexibility)) {\n let offsets = _.range(-Flexibility, Flexibility + 1);\n dates = _(offsets).map(offset => this.dateUtil.addDays(StartDate, offset));\n } else {\n let year = StartDate.getFullYear();\n let month = pad(StartDate.getMonth() + 1);\n let endOfMonth = month === '02' ? 29 : 31;\n let days = _.range(1, endOfMonth);\n dates = _(days).map(day => this.dateUtil.parseDate(`${year}-${month}-${pad(day)}`));\n }\n\n return dates\n .filter(date => date > cutOffDate)\n .map(date => this.dateUtil.serialiseDate(date))\n .map(date => ({\n Date: date,\n Duration\n }))\n .value();\n }\n\n getFieldGroup() {\n return this.fieldGroupService.getFieldGroup(\n Core.FieldType.Global,\n Core.FieldType.Titles,\n Core.FieldType.Url,\n Core.FieldType.Description,\n Core.FieldType.Summary,\n Core.FieldType.HolidayDeals,\n Core.FieldType.LegacyFacilities,\n Core.FieldType.Weather,\n Core.FieldType.Distances,\n Core.FieldType.Recommendations,\n Core.FieldType.Airports,\n Core.FieldType.TransferTimes\n );\n }\n }\n\n angular\n .module('TR')\n .service('holidayDealsGrouped', HolidayDealsGrouped);\n}\n","namespace TR {\n\n class HolidayDealsPromoService {\n DEST_IMGS: any;\n ALL_IMGS: any;\n MONTH: any;\n\n constructor(\n private $q: ng.IQService,\n private $filter: any,\n private $location: any,\n private holidayDeals: HolidayDeals,\n private destinationService: any,\n private analytics: any,\n private filtering: Filtering,\n private occupancyService: any,\n private resourceService: Core.ResourceService,\n private dateUtil: any,\n private currencyService: any\n ) {\n this.DEST_IMGS =\n `https://d2f0rb8pddf3ug.cloudfront.net/api2/destination/images/getfromobject`;\n this.ALL_IMGS =\n `https://s3-eu-west-1.amazonaws.com/trp-content/.co.uk/web`;\n }\n\n getInfoPromo() {\n let params;\n return this.holidayDeals.getFullParameters(true, { startDate: this._getNextMonth() })\n .then(p => {\n params = p;\n return _.head(p.depAir);\n })\n .then(this.destinationService.getAirport)\n .then(airport => {\n const plus = _.size(params.depAir) > 1 ? ` (+${_.size(params.depAir)})` : '';\n return {\n summary: {\n occupancy: this._buildOccupancyString(params.occupancy),\n month: this.$filter('date')(params.startDate, 'MMMM yyyy'),\n duration: params.duration,\n airport: `${airport.Title}${plus}`,\n },\n blocks: this._getBlocks(params.duration)\n };\n });\n }\n\n _getBlocks(duration: number) {\n const num = this.occupancyService.getNumberOfNonInfantPassengers() * duration;\n let [min, mid, high] = _.map(\n TRPCONFIG.Domain.HolidayDealsPromoPrices || [',50', '50,95', '95,'],\n (p:string) => _(p)\n .split(',')\n .map((x:string) => (x ? parseInt(x, 10) : 0) * num)\n .value()\n );\n\n const cSymbol = this.currencyService.getSymbol(TRPCONFIG.Domain.CurrencyCode);\n this._adjustPriceRange(min, mid, high);\n return {\n budget: [\n {\n label: 'HOLIDAYDEALSPROMOSHOW',\n img: `${this.ALL_IMGS}/promo_everything.png`,\n name: 'PriceRange',\n value: null,\n group: 'budget'\n },\n {\n label: String.format(this.resourceService.get('UPTOX'), `${cSymbol}${min[1]}`),\n img: `${this.ALL_IMGS}/promo_low_budget.png`,\n name: 'PriceRange',\n value: `${min[0] || ''},${min[1] || ''}`,\n group: 'budget',\n type: 'low'\n },\n {\n label:\n `${cSymbol}${mid[0]} - ${cSymbol}${mid[1]}`,\n img: `${this.ALL_IMGS}/promo_mid_budget.png`,\n name: 'PriceRange',\n value: `${mid[0] || ''},${mid[1] || ''}`,\n group: 'budget',\n type: 'mid'\n },\n {\n label: ` ${cSymbol}${high[0]}+`,\n img: `${this.ALL_IMGS}/promo_high_budget.png`,\n name: 'PriceRange',\n value: `${high[0] || ''},${high[1] || ''}`,\n group: 'budget',\n type: 'high'\n }\n ],\n\n type: [\n {\n label: 'SEO_BEACH',\n img: `${this.ALL_IMGS}/promo_beach.png`,\n name: 'FacilityCodes',\n value: 'HB',\n group: 'type'\n },\n {\n label: 'DEALSCITYROUTENAME',\n img: `${this.ALL_IMGS}/promo_city.png`,\n name: 'FacilityCodes',\n value: 'HT',\n group: 'type'\n },\n TRPCONFIG.Domain.HolidayDealsCruisesEnabled\n ? {\n label: 'MENUCRUISE',\n img: `${this.ALL_IMGS}/promo_cruise.png`,\n name: 'PropertyTypes',\n value: '5',\n group: 'type'\n }\n : {\n label: 'FAMILY',\n img: `${this.ALL_IMGS}/promo_family.png`,\n name: 'FacilityCodes',\n value: 'HF',\n group: 'type'\n },\n {\n label: 'LANDINGPAGEATTRACTIONSACTIVITIES_NIGHTLIFE',\n img: `${this.ALL_IMGS}/promo_nightlife.png`,\n name: 'FacilityCodes',\n value: 'HN',\n group: 'type'\n },\n {\n label: 'SPARELAXATION',\n img: `${this.ALL_IMGS}/promo_spa.png`,\n name: 'FacilityCodes',\n value: 'SP',\n group: 'type'\n },\n {\n label: 'ROMANTIC',\n img: `${this.ALL_IMGS}/promo_romantic.png`,\n name: 'FacilityCodes',\n value: 'HC',\n group: 'type'\n },\n {\n label: 'ACTIVITY',\n img: `${this.ALL_IMGS}/promo_activity.png`,\n name: 'FacilityCodes',\n value: 'HA',\n group: 'type'\n },\n {\n label: 'FARAWAY',\n img: `${this.ALL_IMGS}/promo_far_away.png`,\n name: 'ChildDestinations',\n value: TRPCONFIG.Domain.HolidayDealsPromoDestinations,\n group: 'type'\n },\n ]\n };\n }\n\n _buildOccupancyString(occ) : string {\n const o:any = _.first(occ);\n const childNum = _.size(occ.ChildAges);\n const adults = `${o.Adults} ${this.resourceService.get(o.Adults === 1 ? 'ADULT' : 'ADULTS')}`;\n const children = `${childNum} ${this.resourceService.get(childNum === 1 ? 'CHILD' : 'CHILDREN')}`;\n return childNum === 0 ? adults : `${adults} ${children}`;\n }\n\n _adjustPriceRange(min, mid, high) {\n const priceRange = _.get(this.$location.search(), 'PriceRange');\n if (!priceRange) { return; }\n const newPriceRange = _.startsWith(priceRange, ',') ? min : _.endsWith(priceRange, ',') ? high : mid;\n this.$location.search('PriceRange', `${newPriceRange[0] || ''},${newPriceRange[1] || ''}`);\n }\n\n _getNextMonth(): Date {\n const today = new Date();\n let month = today.getMonth();\n const year = month === 11 ? today.getFullYear() + 1 : today.getFullYear();\n month = month === 11 ? 0 : month + 1;\n return new Date(year, month, 15, 0, 0, 0, 0);\n }\n }\n\n angular\n .module('TR')\n .service('holidayDealsPromoService', HolidayDealsPromoService);\n}\n","namespace Core {\n\n interface HolidaySearchRequest {\n ArrivalAirports?: string[];\n DepartureAirports: string[];\n DepartureDate: string;\n ReturnDate: string;\n Destination: {\n Type: number;\n Id: number;\n };\n Rooms: {\n Adults: number;\n ChildAges: number[];\n }[];\n Cabin: number;\n IsDirectFlight: boolean;\n PreferredCarrierCodes: string[];\n DomainId: number;\n CultureCode: string;\n CurrencyCode: string;\n }\n\n interface HolidaySearchResult {\n HolidaySearchId?: string;\n FlightSearchId?: string;\n PackageId?: string;\n KidsGoFree?: boolean;\n }\n\n interface HotelDates {\n CheckInDate: string;\n CheckOutDate: string;\n }\n\n class HolidaySearch {\n\n private searchUrl: string = '/api/holidays/createsearch';\n private adjustUrl: string = '/api/holidays/adjusthoteldates';\n\n constructor(\n private searchUnitService: Search.SearchUnitService,\n private occupancyService,\n private $http: ng.IHttpService,\n ) {\n }\n\n private getRequest(parameters): HolidaySearchRequest {\n return {\n DepartureAirports: this.searchUnitService.getDepartureAirports(),\n DepartureDate: this.searchUnitService.startDate(this.searchUnitService.flight),\n ReturnDate: this.searchUnitService.endDate(this.searchUnitService.flight),\n Destination: this.searchUnitService.getDestination(),\n Rooms: this.occupancyService.getOccupancy(),\n Cabin: this.searchUnitService.getCabin(),\n PreferredCarrierCodes: _.get(parameters, 'prefilterAirlines', []),\n IsDirectFlight: !!_.get(parameters, 'prefilterDirectFlights'),\n DomainId: TRPCONFIG.Domain.DomainId,\n CultureCode: TRPCONFIG.Domain.CultureCode,\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\n ArrivalAirports: this.searchUnitService.getArrivalAirports()\n };\n }\n\n createSearch(parameters): ng.IHttpPromise {\n return this.$http.post(this.searchUrl, this.getRequest(parameters));\n }\n\n adjustHotelDates(HotelSearchId: string, dates: HotelDates) {\n return this.$http.post(this.adjustUrl, _.defaults({ HotelSearchId }, dates))\n .then(({ data }) => data);\n }\n }\n\n angular\n .module('TR')\n .service('holidaySearch', HolidaySearch);\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('hotelRehydrator', hotelRehydrator);\r\n\r\nfunction hotelRehydrator(fieldFilterParser, $routeParams, $http, arrayUtil, imageService, $q, $filter, tripService, hotelFromSession, fieldGroupService) {\r\n const service = {\r\n hotels,\r\n hotel,\r\n staticHotel\r\n };\r\n\r\n const fieldTypes = fieldGroupService.getFieldTypes();\r\n const fieldFlags = fieldGroupService.getFieldGroup([\r\n fieldTypes.Global,\r\n fieldTypes.Titles,\r\n fieldTypes.IndicativePrice,\r\n fieldTypes.ReviewSnippets,\r\n fieldTypes.Url,\r\n fieldTypes.Summary,\r\n fieldTypes.Recommendations\r\n ]);\r\n\r\n function hotel(id) {\r\n if ($routeParams.tripId) {\r\n return tripService.getTrip($routeParams.tripId).then(function(trip) {\r\n return hotelFromSession.getHotel(trip.HotelsRequest.AvailabilitySearchId, id, $routeParams.tripId);\r\n });\r\n }\r\n return staticHotel(id);\r\n }\r\n\r\n function staticHotel(id, ignoreErrors) {\r\n const dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\r\n return hotels([id], { imageWidth: dim, imageHeight: dim }, ignoreErrors).then(function(data) {\r\n return data[0];\r\n });\r\n }\r\n\r\n function hotels(ids, options, ignoreErrors) {\r\n options = angular.extend({ imageWidth: 80, imageHeight: 80, cropImage: false }, options);\r\n if (ids == null || ids.length === 0) {\r\n return $q.when([]);\r\n }\r\n return $http.post(`/api/hotels/static/gethotelsbyid?${fieldFilterParser.parse(options)}`, {\r\n Ids: ids,\r\n CultureCode: TRPCONFIG.Domain.CultureCode,\r\n CurrencyCode: TRPCONFIG.Domain.CurrencyCode,\r\n DomainId: TRPCONFIG.Domain.DomainId,\r\n FieldFlags: fieldFlags\r\n }, { ignoreErrors: !!ignoreErrors }).then(function(result) {\r\n return arrayUtil.map(result.data, function(hotel) {\r\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, options.imageWidth, options.imageHeight, options.cropImage);\r\n hotel.TeaserStr = $filter('roundedCurrency')(hotel.IndicativeMinPrice);\r\n return hotel;\r\n });\r\n });\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n.module('TR')\n.service('hotelResolver', hotelResolver);\n\nfunction hotelResolver(recentHotels,\n hotelService,\n $route,\n tripService,\n basketStore) {\n const service = {\n resolve\n };\n\n function resolve(includeRooms) {\n const tripId = $route.current.params.tripId;\n const estabId = parseInt($route.current.params.estabId);\n\n recentHotels.set(estabId);\n\n return tripService.restoreSearchUnit(tripId).then(function(trip) {\n if (trip && trip.HotelsRequest) {\n const promise = hotelService.getHotel(includeRooms ? trip.HotelsRequest.AvailabilitySearchId : null, estabId, tripId);\n\n const calculateTotalCost = (hotelInfo, costAggregator) => {\n hotelInfo.Rooms.forEach(rr => {\n rr.Availability.forEach(costAggregator);\n rr.selected = rr.Availability[0].Id;\n });\n return hotelInfo;\n };\n\n if (TRPCONFIG.Domain.PackagePrice && trip.FlightsRequest && trip.FlightsRequest.SelectedFlight) {\n return promise.then(function(hotelInfo) {\n return basketStore.flightCost(trip.BasketId).then(function(flightCost) {\n return calculateTotalCost(hotelInfo, a => a.TotalCost = a.Cost + flightCost / hotelInfo.Rooms.length);\n });\n });\n }\n\n return promise.then(function(hotelInfo) {\n return calculateTotalCost(hotelInfo, a => a.TotalCost = a.Cost);\n });\n }\n });\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('hotelSearch', hotelSearch);\n\nfunction hotelSearch(\n loggingService,\n hotelFilterQueryStringParser,\n preferences,\n $routeParams,\n $http,\n roundedCurrencyFilter,\n arrayUtil,\n guidService,\n localStorageProvider,\n $q,\n cookieService,\n fieldGroupService,\n occupancyService,\n searchUnitService,\n destinationService,\n hotelSearchValidator,\n FilterUtils,\n imageService,\n broker,\n $location,\n cancellerService,\n tripService,\n $timeout,\n sortCriteria,\n criteoService,\n FilterIdUtils,\n $rootScope,\n currentDestination,\n objectTypeService,\n resourceService,\n holidaySearch,\n analytics,\n abTest,\n fidParser,\n flightDetail\n ) {\n const service = {\n adjustHotelCheckInCheckOutDates,\n pruneRequest,\n clearSearchResults,\n bitFilterSet,\n buildHotelsRequest,\n createSearch,\n filter,\n filterSet,\n getAvailabilityRequest,\n getDestinationEstabId,\n getDestinationTitle,\n getFacilitiesIcon,\n getOccupancySummary,\n getFilter,\n getFilterLazy,\n getUserSelectedFilterCriteria, //if ranges match aggregates they will be set to null - this will return a copy of the filter\n getSearchResults,\n getStaticSearchResults,\n getSortCriteria,\n getSortCriterionDescription,\n createMultiDestHolidaySearch,\n getTripForSelectedMultiDestHoliday,\n getPromotionTerms,\n getFlightDetailsForSelectedMultiDestHoliday,\n getUrl,\n getBoardTypesUrl,\n initialise,\n page,\n pageSize,\n pageIndex,\n rangeFilterSet,\n removeArrayFilter,\n removeFiltersIn,\n removeFilter,\n resetArrayFilter,\n resetBitFilter,\n resetFilters,\n resetRangeFilter,\n setAirportCodeFilter,\n showAtol,\n sort,\n validateSearchCriteria,\n updateFilterFromFid,\n estabGroupFilterAvailable,\n getMandatoryExtra,\n getMaldivesIsMandatory,\n fetchAllBoardTypes,\n addTitleToBoardTypes,\n addDynamicTitleToBoardTypes,\n toggleSearch,\n getFlightMiles\n };\n\n const domain = TRPCONFIG.Domain;\n let url = '/api/hotels/availability/';\n const staticUrl = '/api/hotels/static/';\n let boardTypesUrl = '/api/hotels/boardtypes/';\n let results = null;\n let aggregatesCache;\n let inProgress;\n let inProgressStatic;\n let adjustingInProgress = $q.when();\n let canceller;\n let filterCanceller;\n let creatingSearch;\n const sortCriteriaDef = sortCriteria.getHotelCriteria();\n let filterUtil = new FilterUtils(_initialFilterCriteria());\n let filterDefer = $q.defer();\n const qs = $location.search();\n let allBoardTypes;\n let applyDeepLinkFilter = true;\n\n const usedIds = {};\n\n const req = {\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId,\n CurrencyCode: searchUnitService.getCurrency(),\n Paging: {\n Index: qs.pi || 0,\n Size: 8\n },\n IncludeAggregates: true\n };\n\n const fieldType = fieldGroupService.getFieldTypes();\n const availabilitySearchFlags = [\n fieldType.Global,\n fieldType.Titles,\n fieldType.ReviewSnippets,\n fieldType.Url,\n fieldType.Summary,\n fieldType.Pricing,\n fieldType.Recommendations,\n fieldType.RoomAvailability,\n fieldType.EstabGroupIds,\n fieldType.HotelAwards,\n fieldType.Facilities\n ];\n\n const staticSearchFlags = [\n fieldType.Global,\n fieldType.Titles,\n fieldType.IndicativePrice,\n fieldType.ReviewSnippets,\n fieldType.Url,\n fieldType.Summary,\n fieldType.Recommendations,\n fieldType.EstabGroupIds,\n fieldType.HotelAwards\n ];\n\n broker.subscribe('hotelSearch', 'searchDatesAdjusted', ev => {\n if (canceller != null) {\n canceller.resolve('searchDatesAdjusted');\n inProgress = null;\n canceller = null;\n }\n adjustHotelCheckInCheckOutDates(ev.data.tripId, ev.data.dates);\n\n });\n\n function adjustHotelCheckInCheckOutDates(tripId, dates) {\n service.clearSearchResults(true);\n if (filterCanceller) {\n filterCanceller.resolve();\n }\n adjustingInProgress = tripService.getHotelsRequest(tripId).then(request => {\n TRPCONFIG.Domain.DefaultHotelDates = false;\n holidaySearch.adjustHotelDates(request.AvailabilitySearchId, dates).then(AvailabilitySearchId => {\n service.buildHotelsRequest(_.defaults(\n { AvailabilitySearchId },\n dates,\n _.pick(request, ['CheckInDate', 'CheckOutDate'])\n ), searchUnitService.flight);\n tripService.recordHotelSearch(tripId, getAvailabilityRequest());\n });\n });\n }\n\n function toggleSearch(clickPanel) {\n let searchClasses = document.querySelectorAll('.ekh-search-panel')[0].classList;\n searchClasses.toggle('panel-hide');\n\n let close = document.querySelector('.ekh-search-panel .close');\n close.addEventListener('click', () => {\n document.querySelector(clickPanel).click();\n }, { once: true });\n }\n\n function _initialFilterCriteria() {\n return angular.extend(_defaultFilterCriteria(), hotelFilterQueryStringParser.parse());\n }\n\n function _setInProgress(val, stat) {\n if (stat) {\n inProgressStatic = val;\n } else {\n inProgress = val;\n }\n }\n\n function _setResults(val, stat) {\n if (!stat) {\n results = val;\n }\n }\n\n function estabGroupFilterAvailable() {\n return FilterIdUtils.estabGroupFilterAvailable(service.getFilter());\n }\n\n\n function updateFilterFromFid() {\n const fid = fidParser.parse();\n if (fid != null) {\n return FilterIdUtils.lookupFid(fid).then(function(f) {\n $rootScope.canonicalSuffix = f && f.Canonical ? `?fid=${fid}` : '';\n filterUtil = new FilterUtils(angular.extend(filterUtil.getFilter(), f));\n });\n }\n //no fid so nothing to do\n return $q.when();\n }\n\n function _defaultFilterCriteria() {\n const existing = filterUtil ? getFilter() : null;\n const newFilter = {\n AirportCode: null,\n Stars: [],\n PropertyTypes: [],\n BoardTypes: [],\n FacilityCodes: [],\n HotelName: '',\n PriceRange: null,\n HolidayPriceRange: null,\n RatingRange: null,\n EstabGroupIds: [],\n EstabGroupName: null,\n FilterByEstabGroup: false,\n ChildDestinations: [],\n OnlyShowAvailable: true\n };\n if (existing && existing.AirportCode) {\n newFilter.AirportCode = existing.AirportCode;\n }\n return newFilter;\n }\n\n function getUserSelectedFilterCriteria() {\n //when filtering we should only pass the items a user has set, but we also want to\n //take care to not modify the actual filter object, so return a modified\n //copy of the filter\n const filterCopy = angular.copy(getFilter());\n if (aggregatesCache != null) {\n filterUtil.setToNullIfMatches(filterCopy, 'PriceRange', aggregatesCache);\n filterUtil.setToNullIfMatches(filterCopy, 'HolidayPriceRange', aggregatesCache);\n filterUtil.setToNullIfMatches(filterCopy, 'RatingRange', aggregatesCache);\n results && results.SearchCompletePercentage < 100 && _.assignIn(filterCopy, {\n PriceRange: null,\n RatingRange: null,\n HolidayPriceRange: null\n });\n }\n\n //correctly set the estab group property of the copied filter also\n FilterIdUtils.updateEstabGroupProperties(filterCopy);\n\n return filterCopy;\n }\n\n function setAirportCodeFilter(code) {\n const f = getFilter();\n if (f.AirportCode !== code) {\n results = null; //we will need to re-run the results to filter by the new airport code\n }\n f.AirportCode = code;\n }\n\n function mergeFacilitiesFilters(aggregates) {\n aggregates.MergedHotelsByFacility = {};\n for (const group in aggregates.HotelsByFacility) {\n angular.extend(aggregates.MergedHotelsByFacility, aggregates.HotelsByFacility[group]);\n }\n return aggregates;\n }\n\n function enrichData(hotels, currency, isKidsFree) {\n const kidsFreeEnabled = isKidsFree &&\n (parseInt(cookieService.get('KidsPromoAB')) === 1 || TRPCONFIG.Domain.isAgentMode);\n const numPeoplePaying = kidsFreeEnabled\n ? occupancyService.getOnlyPayingIndividuals()\n : occupancyService.getNumberOfNonInfantPassengers();\n angular.forEach(hotels, function(hotel) {\n const dim = TRPCONFIG.DeviceSettings.HotelAvailabilityImageSize;\n hotel.ImageUrl = imageService.getMainImageUrl(hotel.Id, dim, dim, true);\n hotel.MinCostStr = roundedCurrencyFilter(hotel.MinCost, currency);\n hotel.MinCostPerPerson = hotel.MinCost / (numPeoplePaying || 1);\n hotel.MinCostPerPersonStr = roundedCurrencyFilter(hotel.MinCostPerPerson, currency);\n\n hotel.OriginalCostStr = roundedCurrencyFilter(hotel.OriginalCost, currency);\n hotel.OriginalCostPerPerson = hotel.OriginalCost / (numPeoplePaying || 1);\n hotel.OriginalCostPerPersonStr = roundedCurrencyFilter(hotel.OriginalCostPerPerson, currency);\n\n hotel.HasReviewSnippets = !_.isEmpty(hotel.ReviewSnippets);\n hotel.TeaserStr = roundedCurrencyFilter(hotel.IndicativeMinPrice);\n });\n broker.publish('hotelsReturnedFromSearch', hotels);\n }\n\n function setSortCriterion(d, k, newSearch, so) {\n if (so != null) {\n return $q.when(so);\n }\n\n if (k != null && d.EstablishmentId <= 0) {\n switch (k.toLowerCase()) {\n case 'tr':\n return $q.when(2);\n case 'bh':\n return $q.when(5);\n case 'lh':\n return $q.when(8);\n }\n }\n return preferences.getHotelSortOrder(newSearch);\n }\n\n function resetFilters(dontApply) {\n applyDeepLinkFilter = true;\n const f = _defaultFilterCriteria();\n filterUtil = new FilterUtils(f);\n filterDefer = $q.defer();\n //make sure that when we resetAll filters we don't splat any estab group filter completely, just remove the ids\n FilterIdUtils.updateEstabGroupProperties(f);\n if (!dontApply) {\n return service.filter();\n } else if (dontApply === 'doReset') {\n applyDeepLinkFilter = false;\n return service.filter();\n }\n return $q.when();\n }\n\n function removeArrayFilter(filterName, item) {\n filterUtil.removeArrayFilter(filterName, item);\n return service.filter();\n }\n\n function resetArrayFilter(filterName) {\n filterUtil.resetArrayFilter(filterName);\n if (filterName === 'BoardTypes' || filterName === 'Stars') {\n applyDeepLinkFilter = false;\n return service.filter();\n }\n applyDeepLinkFilter = true;\n return service.filter();\n }\n\n function resetBitFilter(filterName) {\n filterUtil.resetBitFilter(filterName);\n return service.filter();\n }\n\n function removeFiltersIn(filterName, vals) {\n filterUtil.removeFiltersIn(filterName, vals);\n return service.filter();\n }\n\n function resetRangeFilter(filterName, range) {\n if (results != null) {\n let resetFrom = abTest.progressiveHotelSearchEnabled() ? null : results.Aggregates;\n filterUtil.resetRangeFilter(results, resetFrom, filterName, range);\n }\n if (filterName === 'HolidayPriceRange') {\n applyDeepLinkFilter = false;\n return service.filter();\n }\n applyDeepLinkFilter = true;\n return service.filter();\n }\n\n function removeFilter(filterName) {\n filterUtil.removeFilter(filterName);\n return service.filter();\n }\n\n function filterSet(filterName) {\n return filterUtil.filterSet(filterName);\n }\n\n function bitFilterSet(filterName) {\n return filterUtil.bitFilterSet(filterName);\n }\n\n function rangeFilterSet(filterName, range) {\n if (!results) { return false; }\n return filterUtil.rangeFilterSet(results, results.Aggregates, filterName, range);\n }\n\n function pageSize() {\n return req.Paging.Size;\n }\n\n // getter/setter\n function pageIndex(pi) {\n const key = 'hotelSearch-pageIndex';\n if (arguments.length === 0) {\n return localStorageProvider.getItem(key)\n .then(item => {\n if (item && item.path === $location.path() && $location.search().disablePaging !== '1') {\n return item.pi;\n }\n return parseInt(req.Paging.Index);\n });\n }\n req.Paging.Index = pi;\n return localStorageProvider.setItem(key, {\n path: $location.path(),\n pi,\n });\n }\n\n function validateSearchCriteria() {\n return hotelSearchValidator.validate(\n searchUnitService.getDestination(),\n searchUnitService.startDate(searchUnitService.hotel),\n searchUnitService.endDate(searchUnitService.hotel),\n searchUnitService.getSearchArea(searchUnitService.hotel),\n occupancyService.getOccupancy());\n }\n\n function getDestinationEstabId() {\n return currentDestination.getCurrentDestination().then(function(dest) {\n return dest &&\n dest.EstablishmentId\n ? dest.EstablishmentId\n : dest.Type === 1\n ? dest.Id\n : 0;\n });\n }\n\n function getDestinationTitle() {\n return currentDestination.getCurrentDestination().then(function(dest) {\n return dest ? dest.SummaryTitle : '';\n });\n }\n\n function getFacilitiesIcon() {\n let facilitiesIcons = {\n AC: 'air_conditioning.svg',\n BA: 'bar.svg',\n BC: 'do_not_show',\n CC: 'kids_club.svg',\n DF: 'accessibility.svg',\n GF: 'golf.svg',\n GM: 'gym.svg',\n HA: 'no_icon',\n HB: 'close_to_beach.svg',\n HC: 'couples.svg',\n HF: 'family.svg',\n HK: 'no_icon',\n HN: 'no_icon',\n HQ: 'boutique_label.svg',\n HS: 'no_icon',\n HT: 'no_icon',\n HU: 'no_icon',\n HV: 'no_icon',\n IN: 'wifi.svg',\n PA: 'no_icon',\n PK: 'parking.svg',\n RS: 'restaurant.svg',\n SP: 'spa.svg',\n SW: 'pool.svg',\n TV: 'do_not_show',\n WN: 'no_icon',\n WP: 'no_icon'\n };\n return facilitiesIcons;\n }\n\n function getOccupancySummary() {\n return occupancyService.getRoomOccupancyString();\n }\n\n function showAtol() {\n let show = true;\n let code = TRPCONFIG.SelectedRegionalContext.CountryCode;\n return code === 'gb' || code === 'ie' || code === 'dk' || code === 'se' ? show : !show;\n }\n\n function _checkSearchId(r) {\n if (usedIds[r.AvailabilitySearchId]) {\n loggingService.logWarn(`DUPLICATESEARCHID: ${r.AvailabilitySearchId} has been used before`);\n } else {\n usedIds[r.AvailabilitySearchId] = true;\n }\n }\n\n function pruneRequest(r) {\n return _.assignIn(_.omit(r, 'Destination'), {\n Destination: _.pick(r.Destination, 'Id', 'Type'),\n StreamPrices: abTest.progressiveHotelSearchEnabled(true)\n });\n }\n\n function createSearch() {\n if (req.SearchArea) {\n req.SortCriterion = 4;\n creatingSearch = doSearch();\n return creatingSearch;\n }\n creatingSearch = setSortCriterion(req.Destination, $location.search().k, true, $location.search().sortOrder)\n .then(s => { req.SortCriterion = s; })\n .then(doSearch);\n\n return creatingSearch;\n\n function doSearch() {\n if (!TRPCONFIG.Domain.HotelAvailabilitySearchIdHashing) {\n _checkSearchId(req);\n }\n\n canceller = cancellerService.add(/^\\/holidays\\/flights\\/\\w+/, /^\\/hotels\\/\\w+/, /^\\/holidays\\/hotels\\/\\w+/);\n\n const prunedReq = pruneRequest(req);\n\n return $http.post(`${url}createsearch`, prunedReq, { timeout: canceller.promise })\n .then(result => {\n creatingSearch = null;\n canceller = null;\n broker.publish('hotelSearchCreated', req.AvailabilitySearchId);\n req.AvailabilitySearchId = result && result.data;\n tripService.recordHotelSearch(req.TripId, req);\n return req.AvailabilitySearchId;\n }, function(res) {\n inProgress = null;\n canceller = null;\n if (res.status === 400) {\n $location.path('error');\n }\n if (res.status === 404) {\n $location.path('hotels/notfound');\n }\n });\n }\n }\n\n function buildHotelsRequest(request, mode) {\n req.AvailabilitySearchId = request && request.AvailabilitySearchId\n || !TRPCONFIG.Domain.HotelAvailabilitySearchIdHashing && guidService.uuid();\n req.Destination = _getDestination(request);\n req.TripId = request && request.TripId || guidService.uuid();\n req.Rooms = request && request.Rooms || occupancyService.getOccupancy();\n req.CurrencyCode = request && request.CurrencyCode || searchUnitService.getCurrency();\n req.CheckInDate = request && request.CheckInDate || searchUnitService.startDate(mode);\n req.CheckOutDate = request && request.CheckOutDate || searchUnitService.endDate(mode);\n req.Paging.Index = 0;\n req.SearchArea = searchUnitService.getSearchArea();\n req.IsFlightPlus = (request && request.IsFlightPlus);\n }\n\n function _getDestination(request) {\n const dest = request && request.Destination || searchUnitService.getDestination();\n\n return dest ? angular.extend(dest, objectTypeService.getObjectTypeAndId(dest)) : null;\n }\n\n function updateSortCriterion() {\n return preferences.getHotelSortOrder().then(s => req.SortCriterion = s);\n }\n\n function search(options) {\n options = angular.merge({\n fidCheck: false,\n stat: false,\n refreshRankingScores: false\n }, options);\n\n const currentInProgress = options.stat ? inProgressStatic : inProgress;\n if (currentInProgress != null) {\n return currentInProgress;\n }\n\n //TODO - now that we are paging the data we should add a cache of pages by availability Id so\n //that if we revisit a page we have already asked for we don't have to go to the server.\n //Must remember to clear the cache if the filter or sort criteria are changed.\n\n const start = new Date().getTime();\n const interval = 1000;\n const timeout = 60000;\n const d = $q.defer();\n const notfound = {\n 410: errorPath, //results are never going to arrive\n 404() {\n const now = new Date().getTime();\n if (now - start < timeout) {\n $timeout(get, interval); //recurse\n return true; //to indicate that the error condition has been handled (for now)\n }\n errorPath();\n }\n };\n\n function errorPath() {\n const supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(p => p.toLowerCase());\n const hotelsPathSupported = supportedProducts.indexOf('hotels') > -1;\n\n _setInProgress(null, options.stat);\n hotelsPathSupported\n ? $location.path('hotels/notfound')\n : $location.path('holidays/notfound');\n\n d.reject();\n }\n\n _setInProgress(d.promise, options.stat);\n hotelFilterQueryStringParser.format(getUserSelectedFilterCriteria());\n if (!options.stat && creatingSearch != null) {\n return creatingSearch.then(get);\n }\n return updateSortCriterion().then(() => fetchAllBoardTypes().then(res => {\n allBoardTypes = res.data;\n return get(options.fidCheck);\n }));\n\n function get(fidCheck) {\n return $q.all([\n tripService.getCurrency($routeParams.tripId),\n currentDestination.getCurrentDestination(),\n tripService.isKidsFree($routeParams.tripId),\n tripService.getTrip($routeParams.tripId)\n ]).then(result => {\n const trip = result[3];\n const isMultiDestHoliday = Boolean(trip && trip.TripType === tripService.tripTypes.MultiDestHoliday);\n\n filterCanceller = cancellerService.add(/^\\/holidays\\/flights\\/\\w+/, /^\\/hotels\\/\\w+/, /^\\/holidays\\/hotels\\/\\w+/);\n filterCanceller.promise.then(function() {\n _setInProgress(null, options.stat);\n });\n if (result[1]) {\n const objectTypeAndId = objectTypeService.getObjectTypeAndId(result[1]);\n req.DestinationType = objectTypeAndId.Type;\n req.DestinationId = objectTypeAndId.Id;\n\n if ($location.search().bfd) {\n req.DestinationType = 1;\n req.DestinationId = $location.search().bfd;\n }\n\n if (applyDeepLinkFilter) {\n if (qs.boardType && $location.search().boardType !== qs.boardType && !req.FilterCriteria.BoardTypes.includes(qs.boardType)) {\n req.FilterCriteria.BoardTypes.push(qs.boardType);\n }\n\n if (qs.stars && $location.search().stars !== qs.stars && !req.FilterCriteria.Stars.includes(qs.stars)) {\n req.FilterCriteria.Stars.push(qs.stars);\n }\n\n if (qs.holidayPrice && !$location.search().hpr) {\n req.FilterCriteria.HolidayPriceRange = { Min: qs.holidayPrice.split(',')[0], Max: qs.holidayPrice.split(',')[1] };\n }\n }\n\n if (result[1].PageStrand) {\n req.PageStrand = result[1].PageStrand;\n }\n }\n req.AllowIncompleteResults = abTest.progressiveHotelSearchEnabled();\n req.CurrencyCode = result[0] || TRPCONFIG.Domain.CurrencyCode;\n req.FieldFlags = fieldGroupService.getFieldGroup(req.AvailabilitySearchId && !options.stat ? availabilitySearchFlags : staticSearchFlags);\n req.DiscountCode = TRPCONFIG.DiscountCode;\n let tripLocal = JSON.parse(localStorage.getItem('trip'));\n req.TripId = $routeParams.tripId ? $routeParams.tripId : (tripLocal && tripLocal.TripId) ? tripLocal.TripId : null;\n req.RefreshRankingScores = options.refreshRankingScores;\n req.AddMeetAndGreet = TRPCONFIG.Domain2.AddMeetAndGreet;\n req.BookingChannelId = 2;\n\n let intermediateRes;\n pageIndex()\n .then(pi => {\n req.Paging.Index = pi;\n const notStaticSearch = req.AvailabilitySearchId && !options.stat;\n let _url;\n if (isMultiDestHoliday) {\n _url = '/api/holidays/getmultidestinationsearchresults';\n req.PlacementId = 'jan-sale';\n } else if (notStaticSearch) {\n _url = `${url}gethotels`;\n } else {\n _url = `${staticUrl}gethotelsbydestination?fieldsX=Hotels.MinCost,Hotels.OriginalCost`;\n }\n\n let reqCopy = angular.copy(req);\n if (notStaticSearch && qs.selectedEstabId) {\n const selId = parseInt(qs.selectedEstabId);\n if (!isNaN(selId)) {\n reqCopy.SelectedEstabId = selId;\n }\n }\n delete reqCopy.Destination;\n _(reqCopy.FilterCriteria).forEach((value, key) => {\n if (value == null || value === false || value.length === 0) {\n delete reqCopy.FilterCriteria[key];\n }\n });\n\n if (isMultiDestHoliday) {\n // Airport Code filter from prev search causes no results\n reqCopy.FilterCriteria = _.omit(reqCopy.FilterCriteria, 'AirportCode');\n }\n\n if ($rootScope.user && $rootScope.user.Tier && TRPCONFIG.Domain2.SkywardsTierPromoEnabled) {\n TRPCONFIG.Domain.SkywardsTier = $rootScope.user.Tier;\n reqCopy.LoyaltyInfo = {\n SkywardsTier: $rootScope.user.Tier\n };\n }\n\n return $http.post(\n _url,\n reqCopy, {\n timeout: filterCanceller.promise,\n customErrCallback: notfound\n });\n }).then(\n response => {\n intermediateRes = response;\n intermediateRes.data.Hotels = _.map(intermediateRes.data.Hotels, (hotel, i) => {\n if (intermediateRes.data.Hotels && intermediateRes.data.Hotels[i].RequestedRooms && intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices) {\n let taxObj = {\n TotalAmount: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTax,\n CityTaxLocalAmount: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTaxLocalAmount,\n CurrencyCode: intermediateRes.data.Hotels[i].RequestedRooms[0].BoardTypeMinPrices[0].CityTaxLocalCurrency\n };\n _.merge(hotel, { Taxation: taxObj });\n\n }\n return hotel;\n });\n return intermediateRes;\n },\n () => intermediateRes\n ).then(res => {\n if (res && res.data) {\n enrichData(res.data.Hotels, req.CurrencyCode, !!result[2]);\n if (!options.stat && res.data.Aggregates) {\n res.data.Aggregates = mergeFacilitiesFilters(res.data.Aggregates);\n //PriceRange.Min will be having only multiples of 10.\n res.data.Aggregates.LowestPricedHotel = res.data.Aggregates.PriceRange.Min;\n res.data.Aggregates.PriceRange.Max = Math.ceil(res.data.Aggregates.PriceRange.Max / 10) * 10;\n res.data.Aggregates.PriceRange.Min = Math.floor(res.data.Aggregates.PriceRange.Min / 10) * 10;\n if (res.data.Aggregates.HolidayPriceRange && res.data.Aggregates.HolidayPriceRange.Min && res.data.Aggregates.HolidayPriceRange.Max) {\n res.data.Aggregates.HolidayPriceRange.Min = Math.ceil(res.data.Aggregates.HolidayPriceRange.Min);\n res.data.Aggregates.HolidayPriceRange.Max = Math.ceil(res.data.Aggregates.HolidayPriceRange.Max);\n }\n if (!abTest.progressiveHotelSearchEnabled() && !isMultiDestHoliday) {\n filterUtil.copyFilterFrom('RatingRange', res.data.Aggregates);\n filterUtil.copyFilterFrom('PriceRange', res.data.Aggregates);\n filterUtil.copyFilterFrom('HolidayPriceRange', res.data.Aggregates);\n }\n //we don't currently allow filtering on each individual estab group, so squash the data\n res.data.Aggregates.HotelsByGroup = FilterIdUtils.createEstabGroupOptions(res.data.Aggregates.HotelsByGroup);\n\n //Add board type title to aggregates\n if (allBoardTypes && allBoardTypes.length > 0) {\n addDynamicTitleToBoardTypes(res.data.Aggregates.HotelsByBoardType, allBoardTypes);\n } else {\n addTitleToBoardTypes(res.data.Aggregates.HotelsByBoardType);\n }\n }\n const currentResults = res.data;\n _setResults(currentResults, options.stat);\n\n //Save the aggregates in their own variable, so that they arn't lost when results is nulled out.\n aggregatesCache = currentResults.Aggregates;\n d.resolve(currentResults);\n\n if (!currentResults.Hotels.length && fidCheck && !options.stat) {\n const filteredFilter = FilterIdUtils.sanitiseFidFilters(angular.copy(filterUtil.getFilter()), angular.copy(currentResults.Aggregates), _defaultFilterCriteria());\n if (filteredFilter) {\n loggingService.logWarn(`Wrong filters in fid ${$location.search().fid}`);\n filterUtil = new FilterUtils(filteredFilter);\n req.FilterCriteria = getUserSelectedFilterCriteria();\n return get();\n }\n }\n\n const filterData = service.getFilter();\n if (applyDeepLinkFilter) {\n if (qs.boardType && !filterData.BoardTypes.includes(qs.boardType)) {\n filterData.BoardTypes.push(qs.boardType);\n }\n if (qs.stars && !filterData.Stars.includes(qs.stars)) {\n filterData.Stars.push(qs.stars);\n }\n if (qs.holidayPrice && !$location.search().hpr) {\n filterData.HolidayPriceRange = { Min: qs.holidayPrice.split(',')[0], Max: qs.holidayPrice.split(',')[1] };\n }\n }\n filterDefer.resolve(filterData);\n currentResults.Filters = filterData;\n currentResults.SortCriterion = sortCriteria.getHotelSortValueById(req.SortCriterion);\n _setInProgress(null, options.stat);\n broker.publish('hotelResultsModified', _.assign({}, currentResults, {\n searchTriggeredBy: options.searchTriggeredBy\n }));\n\n if (!options.ignoreTracking) {\n analytics.track('Event', 'HotelList', currentResults);\n tripService.getTrip($routeParams.tripId)\n .then(trip => {\n let tripType = trip && trip.TripType ||\n (_.get(searchUnitService.getDestination(), 'PageStrand') === 2 ? 4 : 2);\n criteoService.enqueue(currentResults, 'hotellist', tripType);\n });\n }\n\n const noUserClicksRank = _.size(\n _.filter(\n _.get(currentResults, 'Hotels'),\n h => _.get(h, 'UserClicksRank')\n )\n );\n const noRecommended = _.size(\n _.filter(\n _.get(currentResults, 'Hotels'),\n h => _.get(h, 'Recommended')\n )\n );\n const familyFriendlyOffered = _.some(\n _.get(currentResults, 'Hotels'),\n h => _.includes(h.EstabGroupIds, TRPCONFIG.Domain.FamilyFriendlyEstabGroup)\n );\n const winnerOffered = _.some(\n _.get(currentResults, 'Hotels'),\n h => _.has(h, 'HotelAward')\n );\n setTimeout(() => {\n analytics.track('mixpanel', 'HotelListing', {\n RepeatHotelOffered: noUserClicksRank > 0,\n TopDealsOffered: noRecommended > 0,\n WinnerOffered: winnerOffered,\n NoRepeatHotelsOffered: noUserClicksRank,\n NoTopDealsOffered: noRecommended,\n FamilyFavouriteOffered: familyFriendlyOffered,\n IsKidsPromoEligible: !!result[2],\n IsJanSale: isMultiDestHoliday,\n estabIDArray: _.map(currentResults.Hotels, h => h.Id),\n ppPriceArray: _.map(currentResults.Hotels, h => h.MinCostPerPerson),\n TotalPriceArray: _.map(currentResults.Hotels, h => h.MinCost),\n SearchID: $routeParams.tripId,\n });\n });\n }\n }, function() {\n _setInProgress(null, options.stat);\n return $q.reject();\n });\n\n return options.stat ? inProgressStatic : inProgress;\n });\n }\n }\n\n function page(index) {\n return this.pageIndex(index)\n .then(() => {\n req.FilterCriteria = getUserSelectedFilterCriteria();\n return search();\n });\n }\n\n function sort(criterion) {\n broker.publish('searchCriteriaModified');\n req.FilterCriteria = getUserSelectedFilterCriteria();\n results = null;\n return preferences.setHotelSortOrder(criterion)\n .then(fidCheck => search({\n fidCheck,\n refreshRankingScores: true,\n searchTriggeredBy: 'sort'\n }));\n }\n\n function filter() {\n filterCanceller && filterCanceller.resolve();\n broker.publish('searchCriteriaModified');\n req.FilterCriteria = getUserSelectedFilterCriteria();\n _trackHotelName(_.get(req.FilterCriteria, 'HotelName'));\n results = null;\n return pageIndex(0)\n .then(() => search({\n refreshRankingScores: true,\n searchTriggeredBy: 'filter'\n }));\n }\n\n function initialise(baseUrl) {\n url = baseUrl;\n }\n\n function getAvailabilityRequest() {\n return req;\n }\n\n function getUrl() {\n return url;\n }\n\n function getBoardTypesUrl() {\n return boardTypesUrl;\n }\n\n function clearSearchResults(setDefaultCriteria, setPostsCountByCountryId) {\n const qs = $location.search();\n filterUtil = new FilterUtils(setDefaultCriteria ? _defaultFilterCriteria() : _initialFilterCriteria());\n filterDefer = $q.defer();\n req.Paging.Index = qs.pi || 0;\n req.Paging.Size = setPostsCountByCountryId ? 12 : 8;\n results = null;\n return this;\n }\n\n function getSearchResults(searchId, options) {\n const qs = $location.search();\n if (results && searchId === results.AvailabilitySearchId) {\n broker.publish('hotelResultsRetrieved', results);\n return $q.when(results);\n }\n //we don't want to clear filters at this point, but need to clear the page index and results\n req.Paging.Index = qs.pi || 0;\n results = null;\n if (creatingSearch == null) {\n req.AvailabilitySearchId = searchId;\n }\n req.FilterCriteria = getUserSelectedFilterCriteria();\n return adjustingInProgress.then(() => search({\n ignoreTracking: !!_.get(options, 'ignoreTracking'),\n refreshRankingScores: true\n }));\n }\n\n function getStaticSearchResults() {\n const qs = $location.search();\n //we don't want to clear filters at this point, but need to clear the page index and results\n req.Paging.Index = qs.pi || 0;\n return search({\n stat: true\n });\n }\n\n function createMultiDestHolidaySearch(basketId, variant) {\n const { Domain } = TRPCONFIG || {};\n return $http.post('/api/holidays/createjansalesearch', {\n BasketId: basketId,\n DomainId: Domain.DomainId,\n CultureCode: Domain.CultureCode,\n CurrencyCode: Domain.CurrencyCode,\n Variant: variant\n })\n .then(res => res && res.data);\n }\n\n function getTripForSelectedMultiDestHoliday(tripId, hotel) {\n return tripService.getTrip(tripId)\n .then(trip => {\n const linkedFlight = hotel.LinkedFlight;\n const flightsRequest = _.find(\n trip.MultiDestinationFlightRequests,\n r => r.AvailabilitySearchId === hotel.LinkedFlight.FlightSearchId\n );\n const newTripId = guidService.uuid();\n\n // Update trip with linked flight details\n flightsRequest.SelectedDepartureAirport = {\n Code: linkedFlight.OutboundLeg.DepartureAirport\n };\n flightsRequest.SelectedDestinationAirport = {\n Code: linkedFlight.InboundLeg.DepartureAirport\n };\n\n const newTrip = Object.assign(\n trip,\n { // Note that TripType is tripService.tripTypes.MultiDestHoliday\n TripId: newTripId,\n FlightsRequest: flightsRequest\n });\n\n return destinationService.getDetails({ Id: hotel.Id, Type: 1 })\n .then(dest => newTrip.HotelsRequest.Destination = dest)\n .then(() => tripService.persist(newTripId, newTrip))\n .then(() => newTripId);\n });\n }\n function getFlightMiles(origin, destination, cabinCode, journeyType) {\n return flightDetail.flightmiles(origin, destination, cabinCode, journeyType).then(details => {\n return JSON.parse(details);\n });\n }\n\n function getFlightDetailsForSelectedMultiDestHoliday(tripId, hotel) {\n const linkedFlight = hotel.LinkedFlight;\n\n return flightDetail.getFlightDetails(tripId, {\n AvailabilitySearchId: linkedFlight.FlightSearchId,\n FlightId: linkedFlight.FlightId,\n IncludeSeatPlan: TRPCONFIG.DeviceSettings.SeatPlanEnabled,\n MultiSector: false\n }).then(details => {\n const flight = details.Itinerary;\n if (flight) {\n flight.FlightId = linkedFlight.FlightId; // See holidaySearchCtrl.js\n flight.DetailsId = details.DetailsId;\n flight.isMultiDestHolidayLinked = true;\n }\n return flight;\n });\n }\n\n function getFilter() {\n return filterUtil.getFilter();\n }\n\n function getFilterLazy() {\n return filterDefer.promise;\n }\n\n function getSortCriteria() {\n return sortCriteriaDef;\n }\n\n function getSortCriterionDescription() {\n return preferences.getHotelSortOrder().then(function(so) {\n const i = arrayUtil.indexOf(sortCriteriaDef, function(c) {\n return c.val === so || (angular.isArray(c.val) && c.val.indexOf(so) !== -1);\n });\n return sortCriteriaDef[i].name();\n });\n }\n\n function fetchAllBoardTypes() {\n return $http.get(`${boardTypesUrl}get`);\n }\n\n function addDynamicTitleToBoardTypes(boardTypes, allBoardTypes) {\n let newBoardTypeStrings = [];\n newBoardTypeStrings = allBoardTypes;\n for (const p in boardTypes) {\n const boardDetails = newBoardTypeStrings.find(board => board.Id.toString() === p);\n boardTypes[p].Title = boardDetails.Title ? boardDetails.Title : '';\n }\n }\n\n function addTitleToBoardTypes(boardTypes) {\n const boardTypeStrings = {\n 1: 'ROOMONLY',\n 2: 'BEDANDBREAKFAST',\n 3: 'HALFBOARD',\n 4: 'FULLBOARD',\n 5: 'ALLINCLUSIVE',\n 6: 'SELFCATERING',\n };\n\n for (const p in boardTypes) {\n boardTypes[p].Title = resourceService.getDeferred(boardTypeStrings[p])();\n }\n }\n\n\n\n function getPromotionTerms() {\n return $http.get(`/api/hotels/pricing/promotionterms?domainId=${TRPCONFIG.Domain.DomainId}`)\n .then(res => res.data);\n }\n\n function _trackHotelName(name) {\n if (name) {\n analytics.track('mixpanel', 'HotelNameFilter');\n }\n }\n\n function getMandatoryExtra(hotel) {\n let hasMandatoryExtras = false;\n if (domain.MandatoryExtrasEnabled) {\n if (hotel && hotel.RequestedRooms && hotel.RequestedRooms.length > 0) {\n hotel.RequestedRooms[0].BoardTypeMinPrices.map(room => {\n let roomWithMandatoryExtras = room.IncludedExtras && room.IncludedExtras.find(el => el.ExtraTypeId === '2');\n return roomWithMandatoryExtras ? hasMandatoryExtras = true : null;\n });\n }\n }\n return hasMandatoryExtras;\n }\n\n function getMaldivesIsMandatory(hotel) {\n const h = hotel;\n if (h.RequestedRooms && h.RequestedRooms[0].BoardTypeMinPrices && h.RequestedRooms[0].BoardTypeMinPrices[0].IncludedExtras\n && h.RequestedRooms[0].BoardTypeMinPrices[0].IncludedExtras.length > 0) {\n if (h.RequestedRooms[0].Availability[0] && h.RequestedRooms[0].Availability[0].BoardOptions &&\n h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras && h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras.length > 0\n ) {\n return h.RequestedRooms[0].Availability[0].BoardOptions[0].Extras[0].IsMandatory &&\n domain.IncludeMandatoryExtrasBookedItem &&\n domain.IncludeMandatoryExtrasInHolidaysPrice;\n }\n }\n }\n\n return service;\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('hotelSearchValidator', hotelSearchValidator);\r\n\r\nfunction hotelSearchValidator(resourceService, dateUtil, occupancyService) {\r\n const domain = TRPCONFIG.Domain;\r\n\r\n const service = {\r\n validateTimeOfDay,\r\n validate\r\n };\r\n\r\n function dateFromRegexMatch(match) {\r\n const now = new Date();\r\n return match ? new Date(now.getFullYear(), now.getMonth(), now.getDate(), match[1], match[2]) : null;\r\n }\r\n\r\n function matchFromConfigString(cfg) {\r\n return /^([0-9]{2}):([0-9]{2})$/.exec(cfg);\r\n }\r\n\r\n const dateFromConfig = _.flowRight(dateFromRegexMatch, matchFromConfigString);\r\n\r\n function validateTimeOfDay(departureDate) {\r\n const now = new Date();\r\n const msg = null;\r\n\r\n if (dateUtil.sameDay(now, departureDate)) {\r\n const start = dateFromConfig(domain.SameDaySearchStart);\r\n const end = dateFromConfig(domain.SameDaySearchEnd);\r\n\r\n if (start && end) {\r\n if (now > end || now < start) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGOUTOFRANGE'), domain.SameDaySearchStart, domain.SameDaySearchEnd);\r\n }\r\n } else if (start) {\r\n if (now < start) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGTOEARLY'), domain.SameDaySearchStart);\r\n }\r\n } else if (end) {\r\n if (now > end) {\r\n return String.format(resourceService.get('SAMEDAYBOOKINGTOLATE'), domain.SameDaySearchEnd);\r\n }\r\n }\r\n }\r\n return msg;\r\n }\r\n\r\n function validate(destination, departureDate, returnDate, searchArea, occupancy) {\r\n const errors = [];\r\n if (_.isEmpty(destination) && searchArea == null) {\r\n errors.push(resourceService.get('SELECTDESTINATION'));\r\n }\r\n if (destination && destination.Searchable === false) {\r\n errors.push(String.format(resourceService.get('NONSEARCHABLE'), destination.Title));\r\n }\r\n\r\n if (departureDate == null) {\r\n errors.push(resourceService.get('SELECTCHECKIN'));\r\n } else {\r\n const timeValidation = service.validateTimeOfDay(departureDate);\r\n if (timeValidation) {\r\n errors.push(timeValidation);\r\n }\r\n const now = new Date();\r\n const zNow = dateUtil.zeroTime(now).getTime();\r\n const zDep = dateUtil.zeroTime(departureDate).getTime();\r\n if (zDep < zNow) { //departure is in the past\r\n errors.push(resourceService.get('CHECKINCANNOTBEPAST'));\r\n }\r\n }\r\n\r\n if (returnDate == null) {\r\n errors.push(resourceService.get('SELECTCHECKOUT'));\r\n }\r\n\r\n if (returnDate != null && departureDate != null && returnDate <= departureDate) {\r\n errors.push(resourceService.get('CHECKOUTAFTERCHECKIN'));\r\n }\r\n\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n 'use strict';\n\n angular\n .module('TR')\n .service('hotelsSitemap', hotelsSitemap);\n\n function hotelsSitemap(\n $location,\n searchUnitService,\n fieldGroupService,\n destinationService,\n $http\n ) {\n const service = {\n getHotels,\n getSize\n };\n\n const domain = TRPCONFIG.Domain;\n\n const req = {\n CultureCode: domain.CultureCode,\n DomainId: domain.DomainId,\n CurrencyCode: searchUnitService.getCurrency(),\n Paging: {\n Index: 0,\n Size: 100\n },\n IncludeAggregates: true\n };\n\n const fieldType = fieldGroupService.getFieldTypes();\n const staticSearchFlags = [\n fieldType.Global,\n fieldType.Titles,\n fieldType.IndicativePrice,\n fieldType.ReviewSnippets,\n fieldType.Url,\n fieldType.Summary,\n fieldType.Recommendations,\n fieldType.EstabGroupIds,\n fieldType.HotelAwards\n ];\n\n function getHotels(path, pageNum) {\n const _url = '/api/hotels/static/gethotelsbydestination';\n return destinationService.fromUrl(path)\n .then(data => {\n req.Paging.Index = pageNum !== undefined ? pageNum : 0;\n req.DestinationId = data.LegacyId;\n req.DestinationType = data.LegacyType;\n req.PageStrand = data.PageStrand;\n req.FieldFlags = fieldGroupService.getFieldGroup(staticSearchFlags);\n return req;\n })\n .then(req => {\n return $http.post(\n _url,\n req)\n .then(res => {\n return res.data;\n });\n });\n }\n\n function getSize() {\n return req.Paging.Size;\n }\n\n return service;\n}\n})();\n","'use strict';\n\nnamespace TR {\n export class InsuranceSearchValidator {\n constructor(\n private resourceService: Core.ResourceService,\n private dateUtil) {\n\n }\n\n public validate(policyType, travelDestination, startDate, endDate, occupancy) {\n const errors: string[] = [];\n\n if (policyType == null) {\n errors.push(this.resourceService.get('SELECTPOLICYTYPE'));\n }\n\n if (travelDestination == null) {\n errors.push(this.resourceService.get('SELECTTRAVELDESTINATION'));\n }\n\n if (startDate == null) {\n errors.push(this.resourceService.get('SELECTSTARTDATE'));\n }\n\n if (endDate == null) {\n errors.push(this.resourceService.get('SELECTENDDATE'));\n }\n else if (endDate <= startDate) {\n errors.push(this.resourceService.get('RETURNDATEAFTERDEPARTUREDATE'));\n }\n\n if (startDate && endDate &&\n this.dateUtil.compareDates(endDate, this.dateUtil.addDays(startDate, 365, true)) === 1) {\n errors.push(this.resourceService.get('RETURNDATEWITHINONEYEAR'));\n }\n\n /* It has been said that breaking nested loops with labels is the worst way to break loops\n except all the others that have been tried. ~MV */\n /* eslint-disable no-labels */\n childOccupancyLoop:\n for (let ca = occupancy.ChildAges.length - 1; ca >= 0; ca--) {\n if (occupancy.ChildAges[ca] == null) {\n errors.push(this.resourceService.get('CHILDAGESERROR'));\n break childOccupancyLoop;\n }\n }\n adultOccupancyLoop:\n for (let i = occupancy.AdultAges.length - 1; i >= 0; i--) {\n if (occupancy.AdultAges[i] == null) {\n errors.push(this.resourceService.get('ADULTAGESERROR'));\n break adultOccupancyLoop;\n }\n }\n /* eslint-enable no-labels */\n\n return errors;\n }\n }\n\n angular\n .module('TR')\n .service('insuranceSearchValidator', InsuranceSearchValidator);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('mandatoryTransferService', mandatoryTransferService);\n\nfunction mandatoryTransferService($filter) {\n const service = {\n generateMandatoryOptions,\n addFlightDetails,\n getTransfers,\n findSelectedTransfer,\n generateOptionId,\n getRoomsWithTransfers,\n generateOptionsForMultiRooms,\n getOptions,\n addDeltas,\n getSelectedPrices,\n getSelectedTransfers,\n getHolidayRoomsWithTransfers,\n getBookedTransfersPrice\n };\n\n let FlightDetails;\n let Options;\n const mandatoryTransferTypeId = 23;\n\n function generateMandatoryOptions(roomId, flightDetails) {\n FlightDetails = flightDetails;\n Options = flightDetails.options || [{ OptionId: generateOptionId(roomId, flightDetails.transfer.HotelExtraId, flightDetails.transfer.HotelExtraOptionId) }];\n }\n\n function addFlightDetails(connectingFlight) {\n const fd = FlightDetails;\n const cf = connectingFlight;\n\n if (fd && cf && cf.InboundDate && cf.OutboundDate) {\n cf.InboundDate = _setTime(cf.InboundDate, fd.departureTime.hours, fd.departureTime.minutes);\n cf.OutboundDate = _setTime(cf.OutboundDate, fd.arrivalTime.hours, fd.arrivalTime.minutes);\n cf.InboundFlightNumber = fd.inboundFlightNum;\n cf.OutboundFlightNumber = fd.outboundFlightNum;\n }\n return cf;\n }\n\n function getTransfers(extras = []) {\n let transfers = [];\n extras && extras.forEach(item => {\n if (item && item.IsMandatory && item.HotelExtraTypeId === '2') { // typeId = 2 for mandatory transfers\n let HotelExtraId = item.HotelExtraId;\n let options = item.Options || [];\n if (options.length > 0) {\n options.forEach(value => {\n value.HotelExtraId = HotelExtraId;\n transfers.push(value);\n });\n }\n }\n });\n return transfers;\n }\n\n function findSelectedTransfer(transfers = [], includedExtras = []) {\n let transfer;\n let includedTransfer;\n includedExtras.forEach(inclExt => {\n if (inclExt && inclExt.ExtraTypeId === '2') {\n includedTransfer = inclExt;\n }\n });\n transfers.forEach(item => {\n if (includedTransfer && item && Math.round(includedTransfer.ClientPrice) === Math.round(item.GrossCost)\n && includedTransfer.Title === item.Title) {\n transfer = item;\n }\n });\n return transfer;\n }\n\n function getRoomsWithTransfers(hotel, roomGridData, selectedPrices) {\n let selectedRooms = [];\n for (let i = 0; i < hotel.Rooms.length; i++) {\n let selectedRoom = (hotel.Rooms[i].FilteredAvailability || hotel.Rooms[i].Availability)\n .find(item => item.Id === selectedPrices[`id${i}`]);\n selectedRoom = selectedRoom.BoardOptions.find(item => item.Id === selectedPrices[`id${i}`]);\n selectedRoom.roomId = roomGridData[i].Id;\n selectedRoom.roomNumber = roomGridData[i].Id.match(/\\d+/)[0];\n selectedRoom.roomTitle = `Room ${parseInt(selectedRoom.roomNumber) + 1}`;\n selectedRoom.nonInfants = roomGridData[i].nonInfants;\n selectedRoom.mandatoryTransfers = getTransfers(selectedRoom.Extras) || [];\n if (selectedRoom.mandatoryTransfers.length > 0) {\n selectedRooms.push(selectedRoom);\n }\n }\n return selectedRooms;\n }\n\n function getHolidayRoomsWithTransfers(hotel) {\n let selectedRooms = [];\n if (hotel.BookedItems) {\n for (let i = 0; i < hotel.BookedItems.length; i++) {\n let includedTransfer = getTransfers(hotel.AvailableExtrasPerRoom[i]);\n if (hotel.BookedItems[i] && Object.keys(includedTransfer).length !== 0) {\n let roomWithTransfer = Object.assign(hotel.BookedItems[i]);\n roomWithTransfer.roomNumber = `id${i}`;\n roomWithTransfer.roomTitle = `Room ${i + 1}`;\n roomWithTransfer.nonInfants = roomWithTransfer.Adults;\n roomWithTransfer.mandatoryTransfers = includedTransfer;\n selectedRooms.push(roomWithTransfer);\n }\n }\n }\n return selectedRooms;\n }\n\n function generateOptionId(roomNumberId = '0id', HotelExtraId, HotelExtraOptionId) {\n const hotelExtra = 'HotelExtra';\n const roomNumberIdPrefix = 'id';\n let roomNumber = +roomNumberId.split(roomNumberIdPrefix).pop();\n return `${hotelExtra}|${roomNumber}|${HotelExtraId}|${HotelExtraOptionId}`;\n }\n\n function generateOptionsForMultiRooms(flightDetails, rooms = []) {\n let options = [];\n for (let i = 0; i < rooms.length; i++) {\n let option = {};\n\n const hotelExtraId = flightDetails && flightDetails.transfers && flightDetails.transfers[i] && flightDetails.transfers[i].HotelExtraId;\n const hotelExtraOptionId = flightDetails && flightDetails.transfers && flightDetails.transfers[i] && flightDetails.transfers[i].HotelExtraOptionId;\n option.OptionId = generateOptionId(rooms[i].roomNumber, hotelExtraId, hotelExtraOptionId);\n options.push(option);\n }\n return options;\n }\n\n function getOptions() {\n return Options;\n }\n\n function addDeltas(transfers, cheapestTransfer) {\n return transfers.map(t => {\n t.deltaPrice = t.GrossCost - cheapestTransfer.GrossCost;\n return t;\n });\n }\n\n function _setTime(date, hours, minutes) {\n date = new Date(date);\n date.setMinutes(minutes);\n date.setHours(hours);\n return $filter('date')(date, 'yyyy-MM-ddTHH:mm:ss');\n }\n\n function getSelectedPrices(hotelData, bookedHotelData) {\n let selectedPrices = {};\n if (hotelData.Rooms) {\n for (let i = 0; i < hotelData.Rooms.length; i++) {\n const roomDescription = bookedHotelData.Details.BookedItems[i].RoomDescription;\n if (hotelData.Rooms && hotelData.Rooms.length > 0) {\n hotelData.Rooms[i].Availability.map(room => {\n if (room.RoomDescription === roomDescription) {\n selectedPrices[`id${i}`] = room.Id;\n }\n return selectedPrices;\n });\n }\n }\n }\n return selectedPrices;\n }\n\n function getSelectedTransfers(hotel, rooms) {\n let bookedTransfers = [];\n hotel.CostBreakdown.map(item => {\n if (item.TypeId === mandatoryTransferTypeId) {\n bookedTransfers.push(item);\n }\n return bookedTransfers;\n });\n for (let i = 0; i < bookedTransfers.length; i++) {\n bookedTransfers[i] = rooms[i].mandatoryTransfers.find(item => item.GrossCost === bookedTransfers[i].UnitAmount);\n }\n return bookedTransfers;\n }\n\n function getBookedTransfersPrice(costBreakdown) {\n let transfersCost = 0;\n costBreakdown && costBreakdown.map(item => {\n if (item.TypeId === mandatoryTransferTypeId) {\n transfersCost += item.UnitAmount;\n }\n return transfersCost;\n });\n return transfersCost;\n }\n\n return service;\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('marhabaService', marhabaService);\r\n\r\nfunction marhabaService(searchUnitService, occupancyService, $http) {\r\n const url = '/api2/marhaba/';\r\n const promiseCache = {};\r\n\r\n const service = {\r\n getProductDetails,\r\n rehydrate,\r\n getMarhabaEnabledTerminals,\r\n sort: sortMarhabaResults,\r\n filter: filterMarhabaResults,\r\n adjustMarhabaOptions\r\n };\r\n\r\n function getProductDetails(searchId, productId) {\r\n return $http.post(`${url}details/get`, { AvailabilitySearchId: searchId, MarhabaQuoteId: productId }).then(function(res) {\r\n return res.data;\r\n });\r\n }\r\n\r\n function rehydrate(productId, searchId) {\r\n if (promiseCache[productId + searchId]) {\r\n return promiseCache[productId + searchId];\r\n }\r\n promiseCache[productId + searchId] = $http.post(`${url}details/getfromsession`, { DetailsSearchId: searchId }).then(function(res) {\r\n const details = res.data || {};\r\n const occupancy = occupancyService.reduceOccupancy();\r\n const validChildren = occupancy.ChildAges.filter(function(el) { return el >= 2; }).length;\r\n\r\n details.Date = searchUnitService.startDate(searchUnitService.marhaba);\r\n details.Terminal = searchUnitService.getTerminal();\r\n details.maxElements = occupancy.Adults + validChildren;\r\n\r\n return details;\r\n });\r\n return promiseCache[productId + searchId];\r\n }\r\n\r\n function getMarhabaEnabledTerminals(airports) {\r\n return $http.post(`${url}terminals/getforairports`, { CultureCode: TRPCONFIG.Domain.CultureCode, Airports: airports });\r\n }\r\n\r\n function sortMarhabaResults(a, b) {\r\n const type = a.Type > b.Type ? 1 : a.Type < b.Type ? -1 : 0;\r\n const price = a.AdultPrice > b.AdultPrice ? 1 : a.AdultPrice < b.AdultPrice ? -1 : 0;\r\n const name = sortMarhabaResultsName(a, b);\r\n return type || price || name;\r\n }\r\n\r\n function sortMarhabaResultsName(a, b) {\r\n const name = a.Name > b.Name ? 1 : a.Name < b.Name ? -1 : 0;\r\n return name;\r\n }\r\n\r\n function filterMarhabaResults(item) {\r\n const isLounge = item.Type === 5;\r\n const isFree = item.AdultPrice === 0;\r\n if (!isLounge || (isLounge && !isFree)) {\r\n return item;\r\n }\r\n }\r\n\r\n function adjustMarhabaOptions(productInfo, defaultChauffeurName) {\r\n const result = {};\r\n\r\n if (productInfo.Details.AvailableOptions.length === 0) {\r\n result.noOptions = true;\r\n } else {\r\n productInfo.Details.AvailableOptions\r\n .sort(sortMarhabaResults)\r\n .filter(filterMarhabaResults)\r\n .forEach(function(p) {\r\n switch (p.Type) {\r\n case 3:\r\n result.auxillaryProducts = result.auxillaryProducts || [];\r\n result.auxillaryProducts.push(p);\r\n break;\r\n case 4:\r\n p.Num = 0;\r\n result.chauffeurs = result.chauffeurs || [];\r\n result.chauffeurs.push(p);\r\n break;\r\n case 5:\r\n result.lounges = result.lounges || [];\r\n result.lounges.push(p);\r\n }\r\n });\r\n\r\n if (result.chauffeurs && result.chauffeurs.length > 0) {\r\n result.chauffeurs.sort(sortMarhabaResultsName);\r\n result.chauffeurs.unshift({ Id: 0, Name: defaultChauffeurName });\r\n result.selectedChauffeur = result.chauffeurs[0];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('marhabaSearch', marhabaSearch);\r\n\r\nfunction marhabaSearch(marhabaSearchValidator,\r\n searchUnitService,\r\n occupancyService,\r\n $http,\r\n $q,\r\n tripService,\r\n analytics) {\r\n const url = '/api2/marhaba/';\r\n const domain = TRPCONFIG.Domain;\r\n const req = {\r\n CultureCode: domain.CultureCode,\r\n CurrencyCode: domain.CurrencyCode,\r\n DomainId: domain.DomainId\r\n };\r\n let inProgress;\r\n let results;\r\n\r\n const service = {\r\n clearSearchResults,\r\n getSearchResults,\r\n search,\r\n validateSearchCriteria\r\n };\r\n\r\n function _doRequest(request, newSearch) {\r\n const simpleRequest = {\r\n AvailabilitySearchId: request.AvailabilitySearchId,\r\n CultureCode: request.CultureCode,\r\n CurrencyCode: request.CurrencyCode,\r\n DomainId: request.DomainId,\r\n TerminalId: request.Terminal.Id,\r\n FlightType: searchUnitService.getMarhabaFlightType(request.FlightType.Id),\r\n AirportCode: request.Airport.Code,\r\n DateAndTime: request.DateAndTime,\r\n Occupancy: request.Occupancy,\r\n StaffRates: request.StaffRates\r\n };\r\n return newSearch ?\r\n $http.post(`${url}availability/get`, simpleRequest) :\r\n $http.post(`${url}availability/getfromsession`, { AvailabilitySearchId: request.AvailabilitySearchId });\r\n }\r\n\r\n function _childrenAndInfants(childAges) {\r\n const numberOf = {};\r\n numberOf.children = 0;\r\n numberOf.infants = 0;\r\n for (let i = childAges.length - 1; i >= 0; i--) {\r\n if (childAges[i] <= 2) {\r\n numberOf.infants++;\r\n } else {\r\n numberOf.children++;\r\n }\r\n }\r\n return numberOf;\r\n }\r\n\r\n function _obtainSearchParameters() {\r\n req.Terminal = searchUnitService.getTerminal();\r\n req.FlightType = searchUnitService.getFlightType();\r\n req.Airport = searchUnitService.getMarhabaAirport();\r\n req.DateAndTime = searchUnitService.startDate(searchUnitService.marhaba);\r\n const occupancy = occupancyService.reduceOccupancy();\r\n const kiddos = _childrenAndInfants(occupancy.ChildAges);\r\n req.Occupancy = { Adults: occupancy.Adults, Children: kiddos.children, Infants: kiddos.infants, ChildAges: occupancy.ChildAges }; //occupancyService.getOccupancy();\r\n req.StaffRates = searchUnitService.getStaffRates();\r\n }\r\n\r\n function _search(newSearch) {\r\n if (inProgress) {\r\n return inProgress;\r\n }\r\n\r\n inProgress = _doRequest(req, newSearch)\r\n .then(function(res) {\r\n req.AvailabilitySearchId = res.data.AvailabilitySearchId;\r\n results = res.data;\r\n inProgress = null;\r\n return results;\r\n }, function() {\r\n inProgress = null;\r\n results = null;\r\n });\r\n\r\n return inProgress;\r\n }\r\n\r\n function clearSearchResults() {\r\n results = null;\r\n }\r\n\r\n function getSearchResults(searchId, trip) {\r\n return (results && results !== 'null') ? $q.when(results) : service.search({ searchId, trip });\r\n }\r\n\r\n function search(args) {\r\n req.AvailabilitySearchId = args.searchId;\r\n\r\n // programmatically defined parameter\r\n if (args.parameters) {\r\n angular.extend(req, args.parameters);\r\n } else if (!args.parameters) {\r\n if (args.trip) {\r\n searchUnitService.restoreMarhabaSearch(args.trip);\r\n }\r\n _obtainSearchParameters();\r\n }\r\n\r\n if (args.newSearch) {\r\n analytics.track('mixpanel', 'Search', _.extend({}, req, { TypeTitle: 'Marhaba' }));\r\n tripService.recordMarhabaSearch(args.tripId, _.mapValues(req, (v, k) => k === 'FlightType' ? v.Id : v));\r\n }\r\n\r\n return _search(args.newSearch);\r\n }\r\n\r\n function validateSearchCriteria(parameters) {\r\n if (parameters) {\r\n return marhabaSearchValidator.validate(\r\n parameters.Terminal,\r\n parameters.AirportCode,\r\n parameters.DateAndTime,\r\n parameters.Occupancy\r\n );\r\n }\r\n\r\n return marhabaSearchValidator.validate(\r\n searchUnitService.getTerminal(),\r\n searchUnitService.getMarhabaAirport(),\r\n searchUnitService.startDate(searchUnitService.marhaba),\r\n occupancyService.getOccupancy()[0]\r\n );\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('marhabaSearchValidator', marhabaSearchValidator);\r\n\r\nfunction marhabaSearchValidator(resourceService, dateUtil, occupancyService) {\r\n const service = {\r\n validate\r\n };\r\n\r\n function validate(terminal, airport, date, occupancy) {\r\n const errors = [];\r\n const maxPassengers = 9;\r\n\r\n if (!terminal || terminal.Id === 0) {\r\n errors.push(resourceService.get('VALIDATESELECTTERMINAL'));\r\n }\r\n\r\n if (!airport) {\r\n errors.push(resourceService.get('VALIDATESELECTAIRPORT'));\r\n }\r\n\r\n if (occupancy.Adults + occupancy.ChildAges.length > maxPassengers) {\r\n errors.push(String.format(resourceService.get('TOOMANYTRANSFERPASSENGERS'), maxPassengers));\r\n }\r\n\r\n if (!occupancyService.childAgesPopulated(occupancy)) {\r\n errors.push(resourceService.get('CHILDAGESERROR'));\r\n }\r\n\r\n if (!dateUtil.atLeastTwoDaysInTheFuture(date)) {\r\n errors.push(resourceService.get('VALIDATETWODAYSINTHEFUTURE'));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('multiSectorSearch', multiSectorSearch);\n\nfunction multiSectorSearch($http,\n occupancyService,\n tripService,\n multiSectorSearchValidator) {\n const url = 'website/flights/';\n const cache = {};\n\n const service = { search, validateSearchCriteria, getSearchResults, filter };\n\n function search(tripId, params) {\n const { legs } = params;\n const occupancy = occupancyService.getOccupancy()[0];\n\n const req = {\n Adults: occupancy.Adults,\n AvailabilitySearchId: tripId,\n ChildAges: occupancy.ChildAges,\n Destination: {},\n DomainId: TRPCONFIG.Domain.DomainId,\n FlightRoutes: legs.map(leg => ({\n DepartureDate: leg.DepartureDate,\n DepartureAirport: leg.DepartureAirport.Code,\n DestinationAirport: leg.DestinationAirport.Code,\n Cabin: leg.Cabin\n }))\n };\n\n tripService.recordMultiFlightSearch(tripId, req);\n\n const prom = $http.post(`${url}multisectorsearch`, req)\n .then(res => res.data);\n\n cache[tripId] = prom;\n\n return prom;\n }\n\n function validateSearchCriteria(params) {\n return multiSectorSearchValidator.validate(params.legs);\n }\n\n function getSearchResults(tripId, AvailabilitySearchId) {\n if (tripId in cache) {\n return cache[tripId];\n }\n\n const prom = filter(AvailabilitySearchId);\n\n cache[tripId] = prom;\n return prom;\n }\n\n function filter(availabilitySearchId, filters) {\n const req = {\n AvailabilitySearchId: availabilitySearchId,\n MultiSectorFilterCriteria: {\n SectorIdentifiers: filters\n }\n };\n\n return $http.post(`${url}multisectorsearchfromsession`, req)\n .then(res => res.data);\n }\n\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('multiSectorSearchValidator', multiSectorSearchValidator);\n\nfunction multiSectorSearchValidator(dateUtil) {\n const service = {\n validate\n };\n\n function validate(legs) {\n const errors = [];\n\n const minLegs = 2;\n const maxLegs = 8;\n const minDiffDate = 1;\n\n if (legs.length < minLegs) {\n errors.push('Not enough legs');\n } else if (legs.length > maxLegs) {\n errors.push('Too many legs');\n }\n\n legs.forEach((leg, i) => {\n [leg.DepartureAirport, leg.DestinationAirport].forEach((airport, j) => {\n if (airport == null || typeof airport !== 'object' || !airport.Code) {\n errors.push(`Leg ${i + 1}: Please select a ${j ? 'destination' : 'departure'} airport`);\n } else if (airport.Code.indexOf(',') !== -1) {\n errors.push(`Leg ${i + 1}: Group airports are not supported`);\n }\n });\n\n if (i !== 0) {\n const date1 = dateUtil.parseDate(legs[i - 1].DepartureDate);\n const date2 = dateUtil.parseDate(leg.DepartureDate);\n const diff = dateUtil.getDifferenceInDays(date1, date2);\n if (diff < minDiffDate) {\n errors.push('Flights must happen at least 1 day apart.');\n }\n }\n });\n\n return errors;\n }\n\n return service;\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('pageStrand', pageStrand);\n\nfunction pageStrand(urlUtils, $route) {\n const ps = {\n Hotel: 1,\n Holiday: 2,\n Any: 3,\n Flight: 5\n };\n const strandToRoute = {\n 1: 'hotels',\n 2: 'holidays'\n };\n\n function adjustUrlV2(url, strand) {\n const parsed = urlUtils.parseIdBasedUrls(url);\n const matches = parsed.idPart.match(/(\\d+-\\d+)-?(\\d+)?/) || [];\n\n //if the strand param is 1, remove it\n if (strand === ps.Holiday) {\n return `${matches[1]}/${parsed.urlText}`;\n }\n //if the strand param is absent or something other than 1, add 1 or replace it with 1\n return `${matches[1]}-1/${parsed.urlText}`;\n }\n\n return {\n get(name) {\n return ps[name];\n },\n opposite(strand) {\n return strand === ps.Hotel ? ps.Holiday : ps.Hotel;\n },\n adjustUrl(url, strand) {\n if (TRPCONFIG.Domain.UseIdBasedHotelUrls) {\n return adjustUrlV2(url, strand);\n }\n const parsed = urlUtils.parse(url);\n if (strand === ps.Holiday) {\n parsed.qs.tm = 1;\n } else {\n delete parsed.qs.tm;\n }\n return urlUtils.format(parsed);\n },\n toRoute(strand) {\n return strandToRoute[strand] || 'hotels';\n },\n fromRoute(dest) {\n switch ($route.current && $route.current.area) {\n case 'hotels':\n return ps.Hotel;\n case 'holidays':\n return ps.Holiday;\n case 'flights':\n return ps.Flight;\n default:\n return dest && dest.PageStrand || ps.Hotel;\n }\n }\n };\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('preferences', preferences);\n\nfunction preferences($q, $rootScope, localStorageProvider, preferencesHttpProvider, funcUtil) {\n const service = {\n get: decorate(get),\n set: decorate(set),\n getAllPreferences: decorate(getAllPreferences),\n setAllPreferences: decorate(setAllPreferences),\n clear,\n getFlightSortOrder,\n setFlightSortOrder,\n getHotelSortOrder,\n setHotelSortOrder\n };\n const defaultPrefs = {\n priceMode: TRPCONFIG.Domain.DefaultPriceMode,\n hotelSortOrder: getDefaultHotelSortOrder(),\n flightSortOrder: getDefaultFlightSortOrder(),\n flightClass: 0,\n smokingRoom: false,\n footerToolbar: true\n };\n let prefsPromise = getAllPreferences();\n const localPrefs = {};\n\n function get(key) {\n return getAllPreferences().then(prefs => prefs[key]);\n }\n\n function getDefaultHotelSortOrder() {\n return TRPCONFIG.Domain.HotelSearchOrder;\n }\n\n function getDefaultFlightSortOrder() {\n return TRPCONFIG.Domain.BestFitFlightSelection ? 10 : TRPCONFIG.Domain.FlightsSearchOrder;\n }\n\n function getFlightSortOrder(initial) {\n if (TRPCONFIG.Domain.SaveSortPreferences) {\n return decorate(get)('flightSortOrder');\n }\n if (initial) {\n localPrefs.flightSortOrder = getDefaultFlightSortOrder();\n }\n return $q.when(localPrefs.flightSortOrder || getDefaultFlightSortOrder());\n }\n\n function setFlightSortOrder(value) {\n if (TRPCONFIG.Domain.SaveSortPreferences) {\n return decorate(set)('flightSortOrder', value);\n }\n return $q.when(value);\n }\n function getHotelSortOrder(initial) {\n if (TRPCONFIG.Domain.SaveSortPreferences) {\n return decorate(get)('hotelSortOrder');\n }\n if (initial) {\n localPrefs.hotelSortOrder = getDefaultHotelSortOrder();\n }\n return $q.when(localPrefs.hotelSortOrder || getDefaultHotelSortOrder());\n }\n\n function setHotelSortOrder(value) {\n if (TRPCONFIG.Domain.SaveSortPreferences) {\n return decorate(set)('hotelSortOrder', value);\n }\n localPrefs.hotelSortOrder = value;\n return $q.when(value);\n }\n\n function set(key, val) {\n return getUser().then(user => {\n const defered = [$q.defer(), $q.defer()];\n\n if (val === null || val === undefined) {\n preferencesHttpProvider.remove(user, () => defered[0].resolve(), key);\n localStorageProvider.remove(() => defered[1].resolve(), key);\n } else {\n const prefs = {};\n prefs[key] = val;\n preferencesHttpProvider.set(user, () => defered[0].resolve(), prefs);\n localStorageProvider.set(() => defered[1].resolve(), prefs);\n }\n return all(defered).then(clear);\n });\n }\n\n function getAllPreferences() {\n return getUser().then(user => {\n const cacheKey = user.UserIdHash || 'no-hash';\n\n if (prefsPromise && prefsPromise.cacheKey === cacheKey) {\n return prefsPromise;\n }\n const defered = $q.defer();\n preferencesHttpProvider.get(user, prefs => {\n if (prefs) {\n defered.resolve(prefs);\n } else {\n localStorageProvider.get(prefs => defered.resolve(prefs));\n }\n });\n prefsPromise = defered.promise.then(prefs => angular.extend({}, defaultPrefs, prefs));\n prefsPromise.cacheKey = cacheKey;\n return prefsPromise;\n });\n }\n\n function setAllPreferences(prefs) {\n return getUser().then(user => {\n const defered = [$q.defer(), $q.defer()];\n preferencesHttpProvider.set(user, () => defered[0].resolve(), prefs);\n localStorageProvider.set(() => defered[1].resolve(), prefs);\n return all(defered).then(clear);\n });\n }\n\n function all(defered) {\n const promises = _.map(defered, d => d.promise);\n return $q.all(promises);\n }\n\n function clear() {\n prefsPromise = null;\n }\n\n function getUser() {\n return funcUtil.waitForValue(() => $rootScope.user);\n }\n\n // Copies all input/output to ensure that the preferences are not accidently mutated.\n function decorate(func) {\n return function(...args) {\n const argumentsCopy = _.map(args, a => angular.copy(a));\n const result = func.apply(service, argumentsCopy);\n return $q.when(result).then(r => angular.copy(r));\n };\n }\n\n return service;\n}\n})();\n","namespace TR {\n export class PricingService {\n private domain = TRPCONFIG.Domain;\n private apiUrl = 'api/hotels/pricing';\n\n constructor (\n private $http: ng.IHttpService,\n private cookieService) {\n }\n\n hasActiveVouchers() {\n return this.$http.get(`${this.apiUrl}/hasActiveVouchers`,\n {\n params: { domainId: this.domain.DomainId }\n }\n ).then(response => response.data);\n }\n }\n\n angular.module('TR').service('pricingService', PricingService);\n}\n","'use strict';\nnamespace TR {\n\n export interface IPriorityBoardingInfo {\n isSelected: boolean;\n outboundOnly: boolean;\n inboundOnly: boolean;\n both: boolean;\n oneWayFlightPB: boolean;\n optionDetails?: any;\n }\n\n export class PriorityBoardingService {\n\n constructor() {\n }\n\n getPriorityBoardingInfo(flight, flightOptions): IPriorityBoardingInfo {\n const oneWayFlight: boolean = flight.Details.Itinerary.Legs.length === 1;\n const bothWaysFlight: boolean = flight.Details.Itinerary.Legs.length === 2;\n const extras: any[] = flight.Details.FlightSectorOptionalExtras;\n\n const pbInfo: IPriorityBoardingInfo = {\n isSelected: false,\n outboundOnly: false,\n inboundOnly: false,\n both: false,\n oneWayFlightPB: false\n };\n\n if (oneWayFlight) {\n pbInfo.optionDetails = this._getPBOption(extras[0]);\n pbInfo.oneWayFlightPB = Boolean(pbInfo.optionDetails);\n }\n\n if (bothWaysFlight) {\n pbInfo.outboundOnly = extras.length === 2 && Boolean(this._getPBOption(extras[0]));\n pbInfo.inboundOnly = extras.length === 2 && Boolean(this._getPBOption(extras[1]));\n pbInfo.both = extras.length === 1 && Boolean(this._getPBOption(extras[0]));\n\n if (pbInfo.outboundOnly || pbInfo.inboundOnly || pbInfo.both) {\n pbInfo.optionDetails = this._getPBOption(extras[0]) || this._getPBOption(extras[1]);\n }\n }\n\n if (pbInfo.optionDetails && pbInfo.optionDetails.OptionId) {\n pbInfo.isSelected = Boolean(_.find(flightOptions, ['OptionId', pbInfo.optionDetails.OptionId]));\n }\n\n return pbInfo;\n };\n\n private _getPBOption(flightExtra): any {\n if (!flightExtra && !flightExtra.OptionalExtras) { return; }\n\n const otherOptions: any = _.find(flightExtra.OptionalExtras, ['Type', 2]);\n\n if (otherOptions && otherOptions.SingleOptionalExtras && otherOptions.SingleOptionalExtras.length) {\n return _.find(otherOptions.SingleOptionalExtras, ['Type', 'PriorityBoarding']);\n }\n}\n }\n\n angular\n .module('TR')\n .service('priorityBoardingService', PriorityBoardingService);\n}\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('recentHotels', recentHotels);\r\n\r\nfunction recentHotels($http, hotelRehydrator, $window, $timeout, $rootScope, broker) {\n const url = '/api2/recentlyviewedhotels/';\r\n const defer = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame || $timeout;\r\n let promise;\r\n\r\n $rootScope.$on('auth:signout', _clearPromise);\r\n $rootScope.$on('auth:signin', _clearPromise);\r\n\r\n const service = {\r\n set,\r\n remove,\r\n clear,\r\n get,\r\n getIds\r\n };\r\n\r\n function _clearPromise() {\r\n promise = null;\r\n broker.publish('recentHotelsModified');\r\n }\r\n\r\n function set(estabId) {\r\n if (estabId > 0) {\r\n defer(function() {\r\n $http\r\n .post(`${url}set`, { EstabId: estabId }, { ignoreErrors: true })\r\n .then(_clearPromise)\r\n .then(() => broker.publish('recentHotelAdded', estabId));\r\n });\r\n }\r\n }\r\n\r\n function remove(estabId) {\r\n if (estabId > 0) {\r\n return $http\r\n .post(`${url}remove`, { EstabId: estabId })\r\n .then(_clearPromise)\r\n .then(() => broker.publish('recentHotelRemoved', estabId));\r\n }\r\n }\r\n\r\n function clear() {\r\n return $http.post(`${url}removeall`)\r\n .then(_clearPromise);\r\n }\r\n\r\n function get() {\r\n return promise = promise || $http\r\n .get(`${url}get`, { ignoreErrors: true })\r\n .then(results => hotelRehydrator.hotels(results.data));\r\n }\r\n\r\n function getIds() {\r\n return $http\r\n .get(`${url}get`, { ignoreErrors: true })\r\n .then(results => results.data);\r\n }\r\n\r\n return service;\n}\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('commonErrors', commonErrors);\r\n\r\nfunction commonErrors($q, $location, currentUser) {\r\n const service = {\r\n 0: zero,\r\n 400: fourHundred,\r\n 404: fourOFour,\r\n 401: fourOOne,\r\n 410: fourTen\r\n };\r\n\r\n function _notFound(data) {\r\n const area = $location.path().split('/')[1];\r\n const supportedProducts = TRPCONFIG.Domain.SupportedProductNames.map(p => p.toLowerCase());\r\n if (data && data.config && data.config.url) {\r\n logError(data.config.url);\r\n }\r\n const areaSupported = supportedProducts.indexOf(area.toLowerCase()) > -1;\r\n\r\n switch (area) {\r\n case area:\r\n areaSupported\r\n ? $location.path(`${area}/notfound`)\r\n : $location.path('holidays/notfound');\r\n break;\r\n\r\n default:\r\n $location.path('holidays/notfound');\r\n }\r\n }\r\n\r\n function zero() {\r\n return $q.reject('CANCELLED');\r\n }\r\n\r\n function logError(url) {\r\n const utm = currentUser.get().UtmId;\r\n $.ajax({\r\n type: 'POST',\r\n url: 'website/logging/log',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n Message: `Customer with utmId ${utm} received a 404 from ${url}`,\r\n LogLevel: 2 // Warning\r\n })\r\n });\r\n }\r\n\r\n function fourHundred(data) {\r\n $location.path('error');\r\n\r\n return $q.reject(data);\r\n }\r\n\r\n function fourOOne(data) {\r\n const path = $location.path();\r\n const absUrl = $location.absUrl();\r\n const redirectUrl = String.format(TRPCONFIG.Domain.AgentLogonUrl, absUrl);\r\n\r\n if (data && data.headers && data.headers()['www-authenticate']) {\r\n if (data.headers()['www-authenticate'].indexOf('realm=\"Agent\"') > -1 && (path !== '/agents/signin')) {\r\n window.location.href = redirectUrl;\r\n }\r\n }\r\n\r\n return $q.reject(data);\r\n }\r\n\r\n function fourOFour(data) {\r\n _notFound(data);\r\n\r\n return $q.reject(data);\r\n }\r\n\r\n function fourTen(data) {\r\n _notFound(data);\r\n\r\n return $q.reject(data);\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('reviewService', reviewService);\n\nfunction reviewService($rootScope, $http, $q, arrayUtil, authService, $location) {\n const domain = TRPCONFIG.Domain;\n const url = '/api2/users/reviews/';\n const limit = 1750; //borrowed this limit from the jquery plugin\n const suggestedPageSize = 10; // PageSize should probably be passed as an argument to getReviews()\n const likeTypes = {\n organic: 1,\n postSubmission: 2\n };\n let apiKey;\n let reviewsCache = {};\n\n const service = {\n getUrl,\n getRatingCategories,\n getStatements,\n getOriginalText,\n getReviews,\n getReviewSnippets,\n setTranslation,\n setSnippetTranslation,\n setTranslationKey,\n getReviewDetails,\n getReviewDetailsUsingToken,\n likeReview: {\n organic: organicLike,\n postSubmission: postSubmissionLike\n },\n reviewStatus: {\n CannotLeaveReview: 0,\n CanLeaveReview: 1,\n HasLeftReview: 2\n }\n };\n\n $rootScope.$on('auth:signout', function() {\n _clearCache();\n //remove liked review index from url so refresh won't cause redirection to sign in page\n if ($location.$$search.lr) {\n delete $location.$$search.lr;\n $location.$$compose();\n }\n });\n $rootScope.$on('auth:signin', _clearCache);\n\n function getUrl() {\n return url;\n }\n\n function getRatingCategories(cultureCode) {\n return $http.post(`${url}getratingcategories`, {\n CultureCode: cultureCode\n });\n }\n\n function getStatements(cultureCode) {\n return $http.post(`${url}getstatements`, {\n CultureCode: cultureCode\n });\n }\n\n function getOriginalText(reviewId) {\n return $http.post(`${url}getoriginaltext`, {\n ReviewId: reviewId\n }, { ignoreErrors: true }).then(function(res) {\n res.data.Comments = htmlifyLineBreaks(res.data.Comments);\n res.data.TopTip = htmlifyLineBreaks(res.data.TopTip);\n return res.data;\n });\n }\n\n function setTranslationKey(key) {\n apiKey = key;\n }\n\n function _truncate(val) {\n if (val != null && val.length > limit) {\n return val.substring(0, limit);\n }\n return val;\n }\n\n function _translate(text, source, target) {\n const googleUrl = 'https://www.googleapis.com/language/translate/v2?';\n text = $.trim(text);\n\n if (text === '') {\n return $q.when(null);\n }\n\n return $http.jsonp(googleUrl, {\n params: {\n key: apiKey,\n source,\n target,\n q: text,\n callback: 'JSON_CALLBACK'\n }\n });\n }\n\n function getTranslatedText(resp) {\n if (resp != null && resp.data != null && resp.data.data != null && resp.data.data.translations && resp.data.data.translations.length > 0) {\n return resp.data.data.translations[0].translatedText;\n }\n return '';\n }\n\n function setTranslation(review) {\n // truncation is somewhat lame. Can we split the string up into a number of batches possibly, but it would\n // be hard to do that without messing with the meaning of the text. Perhaps breaking it into sentences?\n const promises = [];\n const source = review.CultureCode;\n const target = domain.CultureCode.substring(0, 2);\n\n promises.push(_translate(_truncate(review.Comments), source, target));\n promises.push(_translate(_truncate(review.TopTip), source, target));\n\n return $q\n .all(promises)\n .then(function(responses) {\n const result = {\n Comments: getTranslatedText(responses[0]),\n TopTip: getTranslatedText(responses[1])\n };\n\n return $http.post(`${url}settranslation`, {\n ReviewId: review.ReviewId,\n Comments: result.Comments,\n TopTip: result.TopTip,\n CultureCode: target\n }, { ignoreErrors: true })\n .then(function() {\n return result;\n });\n });\n }\n\n function setSnippetTranslation(snippet) {\n // Same truncation comment as above, but probably has no impact on a snippet.\n const promises = [];\n const source = snippet.CultureCode;\n const target = domain.CultureCode.substring(0, 2);\n\n promises.push(_translate(_truncate(snippet.Comments), source, target));\n\n return $q\n .all(promises)\n .then(function(responses) {\n const result = {\n Comments: responses[0] != null ? responses[0].data.data.translations[0].translatedText : ''\n };\n\n return $http.post(`${url}setsnippettranslation`, {\n ReviewId: snippet.ReviewId,\n Comments: result.Comments,\n CultureCode: target\n }, { ignoreErrors: true })\n .then(function() {\n return result;\n });\n });\n }\n\n function htmlifyLineBreaks(text) {\n return text ? text.replace(/\\\\n/g, '
            ').replace(/\\n/g, '
            ') : text;\n }\n\n function getReviews(hotel, page) {\n const pageSize = suggestedPageSize;\n\n if (reviewsCache[hotel.Id] == null) {\n reviewsCache[hotel.Id] = {\n total: hotel.CustomerReviewCount,\n page: 1,\n reviews: {}\n };\n }\n const cache = reviewsCache[hotel.Id];\n const d = $q.defer();\n cache.page = page;\n\n //is this a page that exists?\n if (((page) * pageSize) > cache.total) {\n throw new Error(`there is no page ${page}`);\n }\n\n function resolve() {\n const remaining = (cache.total - (page + 1) * pageSize);\n d.resolve({\n reviews: cache.reviews[page],\n moreReviews: (remaining > pageSize) ? pageSize : Math.max(remaining, 0),\n page\n });\n }\n\n //have we got the data for this page\n if (cache.reviews[page] != null) {\n resolve();\n } else {\n $http.post(`${url}getpage`, {\n EstabId: hotel.Id,\n CultureCode: domain.CultureCode,\n CountryCode: domain.CountryCode,\n Paging: {\n PageIndex: page,\n PageSize: pageSize\n },\n SortCriterion: 0,\n FilterCriteria: {\n ExcludeEmptyComments: true\n }\n }, { ignoreErrors: true }).then(function(res) {\n cache.reviews[page] = arrayUtil.map(res.data.Reviews, function(review) {\n review.Comments = htmlifyLineBreaks(review.Comments);\n review.TopTip = htmlifyLineBreaks(review.TopTip);\n return review;\n });\n resolve();\n }, function() {\n d.reject();\n });\n }\n\n return d.promise;\n }\n\n function getReviewSnippets(hotel, pageIndex, pageSize) {\n return $http.post(`${url}getsnippetpage`, {\n EstabId: hotel.Id,\n CultureCode: domain.CultureCode,\n Paging: {\n PageIndex: pageIndex,\n PageSize: pageSize\n }\n });\n }\n\n function organicLike(reviewId, like) {\n return _likeReview(reviewId, like, likeTypes.organic);\n }\n\n function postSubmissionLike(reviewId, like) {\n return _likeReview(reviewId, like, likeTypes.postSubmission);\n }\n\n function _likeReview(reviewId, like, reviewLikeType) {\n return $http.post(`${url}like`, {\n ReviewId: reviewId,\n Like: like,\n ReviewLikeType: reviewLikeType,\n ApplicationType: TRPCONFIG.ApplicationType\n }, {\n customErrCallback() {\n return true; //make sure that the default error handling does not occur\n } //Note that we will stay in the error branch\n\n }).then(null, _errorLike);\n\n function _errorLike(resp) {\n if (resp.status === 401) {\n _signIn();\n }\n }\n\n function _signIn() {\n const url = `${$location.path()}?pd=rv&lr=${reviewId}`;\n authService.bufferRoute(url);\n $location.url(`signin?cb=${encodeURIComponent(url)}`);\n }\n }\n\n function _clearCache() {\n reviewsCache = {};\n }\n\n function getReviewDetailsUsingToken(bookingId, token, userId) {\n return $http.post(\n `${url}user/reviewdetailstoken`\n , { BookingId: bookingId, VerificationToken: token, UserId: userId, CultureCode: domain.CultureCode }\n ).then(\n res => res.data\n , err => _processGetReviewError(err.status)\n );\n }\n\n function getReviewDetails(bookingId) {\n return $http.post(\n `${url}user/reviewdetails`\n , { BookingId: bookingId, CultureCode: domain.CultureCode }\n ).then(res => res.data\n , err => _processGetReviewError(err.status)\n );\n }\n\n function _processGetReviewError(errCode) {\n //we can have a number of different states but just return the correct enum value\n let detail = {\n BookingRef: null,\n CheckInDate: null,\n EstabId: null,\n LeadContact: null,\n ReviewStatus: service.reviewStatus.CannotLeaveReview\n };\n\n if (errCode === 401) {\n detail.Status = service.reviewStatus.CannotLeaveReview;\n }\n\n return detail;\n }\n\n return service;\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('savedSearchService', savedSearchService);\r\n\r\nfunction savedSearchService(hotelSearchValidator,\r\n $http,\r\n searchUnitService,\r\n dateUtil,\r\n occupancyService,\r\n resourceService,\r\n arrayUtil,\r\n $q,\r\n $routeParams,\r\n broker,\r\n $rootScope,\r\n analytics,\r\n searchTypesService,\r\n tripService,\r\n unadjustedDateFilter) {\r\n const url = '/api2/savedsearches/';\r\n const isPrerender = /prerender/i.test(navigator.userAgent);\r\n\r\n // cached results\r\n let cachedSearches;\r\n let cachedSearchTypes = [];\r\n\r\n const searchType = searchTypesService.searchType;\r\n const supportedSearchTypes = searchTypesService.supportedTypes();\r\n\r\n const title = {\r\n 1: resourceService.getDeferred('FLIGHTS'),\r\n 3: resourceService.getDeferred('HOLIDAYS'),\r\n 2: resourceService.getDeferred('HOTELS'),\r\n 4: resourceService.getDeferred('TRANSFERS'),\r\n 6: resourceService.getDeferred('AIRPORTPARKING'),\r\n 8: resourceService.getDeferred('INSURANCE')\r\n };\r\n const fromDateTitle = {\r\n 1: resourceService.getDeferred('DEPART'),\r\n 2: resourceService.getDeferred('CHECKIN'),\r\n 3: resourceService.getDeferred('DEPART'),\r\n 4: resourceService.getDeferred('ARRIVAL'),\r\n 6: resourceService.getDeferred('DROPOFFDATE'),\r\n 8: resourceService.getDeferred('DEPART')\r\n };\r\n const toDateTitle = {\r\n 1: resourceService.getDeferred('RETURN'),\r\n 2: resourceService.getDeferred('CHECKOUT'),\r\n 3: resourceService.getDeferred('RETURN'),\r\n 4: resourceService.getDeferred('RETURN'),\r\n 6: resourceService.getDeferred('PICKUPDATE'),\r\n 8: resourceService.getDeferred('RETURN')\r\n };\r\n const fromDateField = {\r\n 1: 'DepartureDate',\r\n 2: 'CheckInDate',\r\n 3: 'DepartureDate',\r\n 4: 'ArrivalDate',\r\n 6: 'DepartureDate',\r\n 8: 'DepartureDate'\r\n };\r\n const toDateField = {\r\n 1: 'ReturnDate',\r\n 2: 'CheckOutDate',\r\n 3: 'ReturnDate',\r\n 4: 'ReturnDate',\r\n 6: 'ReturnDate',\r\n 8: 'ReturnDate'\r\n };\r\n const cabin = {\r\n 1: 'Economy',\r\n 2: 'PremiumEconomy',\r\n 4: 'First',\r\n 8: 'Business'\r\n };\r\n\r\n $rootScope.$on('auth:signin', function() {\r\n cachedSearches = null;\r\n });\r\n $rootScope.$on('auth:signout', function() {\r\n cachedSearches = null;\r\n });\r\n\r\n const service = {\r\n saveFlightSearch,\r\n saveHolidaySearch,\r\n saveHotelSearch,\r\n saveTransferSearch,\r\n saveParkingSearch,\r\n saveInsuranceSearch,\r\n restoreSearch,\r\n getSavedSearches,\r\n removeSavedSearch,\r\n getCabinType\r\n };\r\n\r\n function _getFlightSearch(tripId, SearchModel) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getSelectedDepartureAirport(tripId),\r\n tripService.getSelectedDestinationAirport(tripId),\r\n tripService.isOneWayFlightEnabled(tripId),\r\n tripService.getFlightsRequestDepartureDate(tripId, true),\r\n tripService.getFlightsRequestReturnDate(tripId, true),\r\n tripService.getTripReducedOccupancy(tripId)\r\n ]).then(([\r\n Destination,\r\n DepartureAirport,\r\n DestinationAirport,\r\n isOneWayFlightEnabled,\r\n DepartureDate,\r\n ReturnDate,\r\n ReducedOccupancy\r\n ]) => {\r\n const flightSearchRequest = {\r\n DepartureAirportTitle: DepartureAirport.Title,\r\n Destination,\r\n DestinationAirportTitle: DestinationAirport.Title,\r\n DepartureDate,\r\n SearchModel\r\n };\r\n if (DepartureAirport.Code) {\r\n flightSearchRequest.DepartureAirports = DepartureAirport.Code.split(',');\r\n }\r\n // This is a a hacky fix. DestinationAirport can be in two different shapes\r\n // due to undetermined circumstances (probably search unit configuration)\r\n let destinationCodes = DestinationAirport.Code ? DestinationAirport.Code : DestinationAirport.DestinationAirports;\r\n if (destinationCodes) {\r\n flightSearchRequest.DestinationAirports = destinationCodes.split(',');\r\n }\r\n if (isOneWayFlightEnabled) {\r\n flightSearchRequest.OneWayOnly = true;\r\n } else {\r\n flightSearchRequest.ReturnDate = ReturnDate;\r\n }\r\n\r\n angular.extend(flightSearchRequest, ReducedOccupancy);\r\n flightSearchRequest.Children = flightSearchRequest.ChildAges.length;\r\n\r\n return flightSearchRequest;\r\n });\r\n }\r\n\r\n function _getHolidaySearch(tripId, searchModel) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getSelectedDepartureAirport(tripId),\r\n tripService.getFlightsRequestDepartureDate(tripId, true),\r\n tripService.getFlightsRequestReturnDate(tripId, true),\r\n tripService.getTripOccupancy(tripId),\r\n tripService.getFlightCabin(tripId)\r\n ]).then(results => {\r\n const values = results.every(result => {\r\n return result !== null;\r\n });\r\n return values ?\r\n $q.resolve({\r\n Destination: results[0],\r\n DepartureAirports: results[1].Code.split(','),\r\n DepartureAirportsTitle: results[1].Title,\r\n DepartureDate: results[2],\r\n ReturnDate: results[3],\r\n Rooms: results[4],\r\n Cabin: results[5],\r\n SearchModel: searchModel\r\n }) : $q.reject();\r\n });\r\n }\r\n\r\n function _getHotelSearch(tripId) {\r\n return $q.all([\r\n tripService.getTripDestination(tripId),\r\n tripService.getHotelsRequestCheckInDate(tripId, true),\r\n tripService.getHotelsRequestCheckOutDate(tripId, true),\r\n tripService.getTripOccupancy(tripId)\r\n ]).then(results => ({\r\n Destination: results[0],\r\n CheckInDate: results[1],\r\n CheckOutDate: results[2],\r\n Rooms: results[3]\r\n }));\r\n }\r\n\r\n function _getTransferSearch() {\r\n const airport = searchUnitService.getDestinationAirport();\r\n const route = searchUnitService.getRoute();\r\n const occ = occupancyService.reduceOccupancy();\r\n return {\r\n Airport: airport.Code,\r\n AirportTitle: airport.Title,\r\n Route: route,\r\n Direction: searchUnitService.getDirection(),\r\n ArrivalDate: searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.transfer) : null,\r\n ReturnDate: searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.transfer) : null,\r\n Passengers: {\r\n Adults: occ.Adults,\r\n ChildAges: occ.ChildAges\r\n }\r\n };\r\n }\r\n\r\n function _getInsuranceSearch() {\r\n const occ = occupancyService.reduceOccupancy();\r\n const policyType = searchUnitService.getPolicyType();\r\n const destination = searchUnitService.getTravelDestination();\r\n return {\r\n StartDate: searchUnitService.requiresStartDate() ? searchUnitService.startDate(searchUnitService.insurance) : null,\r\n EndDate: searchUnitService.requiresEndDate() ? searchUnitService.endDate(searchUnitService.insurance) : null,\r\n AdultAges: occ.AdultAges,\r\n ChildAges: occ.ChildAges,\r\n PolicyExtras: searchUnitService.getPolicyExtra(),\r\n PolicyType: policyType.Id,\r\n PolicyTypeTitle: policyType.Name,\r\n Destination: destination.Id,\r\n DestinationTitle: destination.Name\r\n };\r\n }\r\n\r\n function _getParkingSearch(tripId) {\r\n return $q.all([\r\n tripService.getParkingAirport(tripId),\r\n tripService.getParkingDropOffDate(tripId),\r\n tripService.getParkingPickUpDate(tripId),\r\n tripService.getTripOccupancy(tripId)\r\n ]).then(results => ({\r\n AirportCode: results[0].Code,\r\n AirportTitle: results[0].Title,\r\n DropOffDate: results[1],\r\n PickUpDate: results[2],\r\n Passengers: results[3]\r\n }));\r\n }\r\n\r\n function _normaliseSearch(s) {\r\n const dateTimeFormat = 'dd MMM yyyy HH:mm';\r\n\r\n s.TypeTitle = title[s.SearchType]();\r\n window.dataLayer = window.dataLayer || [];\r\n switch (s.SearchType) {\r\n case searchType.Flight:\r\n s.Duration = s.OneWayOnly ? null : dateUtil.getDurationSummary(s.DepartureDate, s.ReturnDate);\r\n // If Destination is not there then we fill in what we can and then basket service will take them\r\n // to the non-flexible flight workflow. If it has something then basket service will take them to a flexible\r\n // flight workflow\r\n if (!s.Destination) {\r\n s.Destination = { Title: s.DestinationAirportTitle };\r\n }\r\n window.dataLayer.push({ CabinTitle: cabin[s.Cabin] });\r\n break;\r\n case searchType.Hotels:\r\n s.Duration = dateUtil.getDurationSummary(s.CheckInDate, s.CheckOutDate);\r\n break;\r\n case searchType.Holidays:\r\n s.Duration = dateUtil.getDurationSummary(s.DepartureDate, s.ReturnDate);\r\n window.dataLayer.push({ CabinTitle: cabin[s.Cabin] });\r\n break;\r\n case searchType.Transfers: {\r\n let str = s.ArrivalDate != null ? dateUtil.format(s.ArrivalDate, dateTimeFormat) : '';\r\n str += s.ArrivalDate != null && s.ReturnDate != null ? ' - ' : '';\r\n str += s.ReturnDate != null ? dateUtil.format(s.ReturnDate, dateTimeFormat) : '';\r\n s.Duration = str;\r\n s.Destination = { Title: _.get(s, 'ResortTitle') || _.get(s, 'Route.DropOffPoint.Description') };\r\n break;\r\n }\r\n case searchType.Parking:\r\n s.Destination = { Title: s.AirportTitle };\r\n s.Duration = `${unadjustedDateFilter(s.DropOffDate, dateTimeFormat)} - ${unadjustedDateFilter(s.PickUpDate, dateTimeFormat)}`;\r\n break;\r\n case searchType.Insurance:\r\n s.Duration = dateUtil.getDurationSummary(s.StartDate, s.EndDate);\r\n }\r\n\r\n // provide generic \"from\" and \"to\" dates that can be rendered by a single template\r\n s.FromDate = { Date: s[fromDateField[s.SearchType]], Title: fromDateTitle[s.SearchType] };\r\n s.ToDate = s.OneWayOnly ? null : { Date: s[toDateField[s.SearchType]], Title: toDateTitle[s.SearchType] };\r\n\r\n s.Nights = s.OneWayOnly ? null : dateUtil.numberOfNights(s.FromDate.Date, s.ToDate.Date);\r\n\r\n // sum occupancy\r\n if (s.Rooms) {\r\n const occ = _.reduce(s.Rooms, (sum, value) => {\r\n return {\r\n Adults: sum.Adults + value.Adults,\r\n ChildAges: (sum.ChildAges || []).concat(value.ChildAges || [])\r\n };\r\n });\r\n s.Adults = occ.Adults;\r\n s.Children = (occ.ChildAges || []).length;\r\n }\r\n\r\n delete s.SearchModel;\r\n\r\n return s;\r\n }\r\n\r\n function _saveSearch(type, op, getter) {\r\n let s = getter();\r\n s.SearchType = type;\r\n const searchModel = s.SearchModel;\r\n s = _normaliseSearch(s);\r\n\r\n if (TRPCONFIG.EnableSavedSearches) {\r\n cachedSearches = null;\r\n $http.post(url + op, s, { ignoreErrors: true }).then(function(res) {\r\n s.SavedSearchId = res.data;\r\n broker.publish('savedSearchAdded', s);\r\n });\r\n }\r\n let trackSearchEvent = { category: 'searches', action: 'run', label: op.replace('save', '') };\r\n if (TRPCONFIG.Domain.TenantId === 3) {\r\n trackSearchEvent.dimension3 = searchModel.airports.map(elem => { return elem.Code; }).join(',');\r\n trackSearchEvent.dimension4 = searchModel.destination[0].DestinationAirports;\r\n trackSearchEvent.dimension5 = searchModel.startDate;\r\n trackSearchEvent.dimension6 = searchModel.endDate;\r\n trackSearchEvent.dimension7 = occupancyService.getOccupancyString(searchModel.occupancy);\r\n trackSearchEvent.dimension8 = searchModel.cabin;\r\n }\r\n\r\n let IsAmend = $routeParams.bookingId ? true : undefined;\r\n\r\n analytics.track('mixpanel', 'Search', _.extend({}, s, { searchModel, IsAmend }));\r\n analytics.track('Search', type, s);\r\n analytics.trackEvent(trackSearchEvent);\r\n analytics.track('mixpanelPeople', 'Search', s);\r\n }\r\n\r\n function _searchRestored() {\r\n broker.publish('savedSearchRestored');\r\n }\r\n\r\n function _restoreFlightSearch(search) {\r\n searchUnitService.setOneWayFlightEnabled(TRPCONFIG.Domain.OneWayFlightsEnabled && search.OneWayOnly);\r\n searchUnitService.startDate(searchUnitService.flight, search.DepartureDate);\r\n searchUnitService.endDate(searchUnitService.flight, search.ReturnDate);\r\n searchUnitService.setDepartureAirports({\r\n Code: search.DepartureAirports.join(','),\r\n Title: search.DepartureAirportTitle\r\n });\r\n searchUnitService.setDestination(search.Destination);\r\n searchUnitService.setDestinationAirport({\r\n Code: search.DestinationAirports.join(','),\r\n Title: search.DestinationAirportTitle\r\n });\r\n return $q.when();\r\n }\r\n\r\n function _restoreHotelSearch(search) {\r\n searchUnitService.startDate(searchUnitService.hotel, search.CheckInDate);\r\n searchUnitService.endDate(searchUnitService.hotel, search.CheckOutDate);\r\n occupancyService.setOccupancy(search.Rooms);\r\n return searchUnitService.setDestination(search.Destination, false, true);\r\n }\r\n\r\n function _restoreHolidaySearch(search) {\r\n searchUnitService.startDate(searchUnitService.flight, search.DepartureDate);\r\n searchUnitService.endDate(searchUnitService.flight, search.ReturnDate);\r\n occupancyService.setOccupancy(search.Rooms);\r\n searchUnitService.setDepartureAirports({\r\n Code: search.DepartureAirports.join(','),\r\n Title: search.DepartureAirportsTitle\r\n });\r\n return searchUnitService.setDestination(search.Destination, false, true);\r\n }\r\n\r\n function _restoreTransferSearch(search) {\r\n searchUnitService.setDirection(search.Direction);\r\n searchUnitService.endDate(searchUnitService.transfer, search.ReturnDate || null);\r\n searchUnitService.startDate(searchUnitService.transfer, search.ArrivalDate || null);\r\n occupancyService.setOccupancy([search.Passengers]);\r\n searchUnitService.setDestinationAirport({\r\n Code: search.Airport,\r\n Title: search.AirportTitle\r\n });\r\n if (search.Route) {\r\n searchUnitService.setResort(search.Route.DropOffPoint);\r\n }\r\n return $q.when();\r\n }\r\n\r\n function _restoreParkingSearch(search) {\r\n searchUnitService.setDepartureAirports({ Code: search.AirportCode, Title: search.AirportTitle });\r\n occupancyService.setPassengerCount(search.Passengers);\r\n searchUnitService.startDate(searchUnitService.parking, search.DropOffDate);\r\n searchUnitService.endDate(searchUnitService.parking, search.PickUpDate);\r\n return $q.when();\r\n }\r\n\r\n function _restoreInsuranceSearch(search) {\r\n searchUnitService.startDate(searchUnitService.insurance, search.StartDate);\r\n searchUnitService.endDate(searchUnitService.insurance, search.EndDate);\r\n searchUnitService.setPolicyExtra(search.PolicyExtra);\r\n searchUnitService.setPolicyType(search.PolicyType);\r\n searchUnitService.setOccupancy(search.Passengers);\r\n searchUnitService.setTravelDestination(search.TravelDestination);\r\n return $q.when();\r\n }\r\n\r\n function saveFlightSearch(tripId, searchModel) {\r\n return _getFlightSearch(tripId, searchModel).then(flightSearch => _saveSearch(searchType.Flight, 'saveFlightSearch', () => flightSearch));\r\n }\r\n\r\n function saveHolidaySearch(tripId, searchModel) {\r\n return _getHolidaySearch(tripId, searchModel)\r\n .then(holidaySearch => _saveSearch(searchType.Holidays, 'saveholidaysearch', () => holidaySearch));\r\n }\r\n\r\n function saveHotelSearch(tripId) {\r\n //we don't want to record geo searches\r\n if (searchUnitService.getSearchArea()) {\r\n analytics.trackEvent({ category: 'searches', action: 'run', label: 'hotelgeosearch' });\r\n return;\r\n }\r\n return _getHotelSearch(tripId).then(hotelSearch => {\r\n let dest = _.get(hotelSearch, 'Destination', null);\r\n let checkInDate = new Date(_.get(hotelSearch, 'CheckInDate', '0001-01-01T00:00:00'));\r\n let checkOutDate = new Date(_.get(hotelSearch, 'CheckOutDate', '0001-01-01T00:00:00'));\r\n let rooms = _.get(hotelSearch, 'Rooms', null);\r\n let today = new Date();\r\n if (dest === null || checkOutDate.getTime() < today.getTime() || checkInDate.getTime() > checkOutDate.getTime() || rooms === null || searchType === null) {\r\n return;\r\n }\r\n return _saveSearch(searchType.Hotels, 'savehotelsearch', () => hotelSearch);\r\n });\r\n }\r\n\r\n function saveTransferSearch() {\r\n //PointToPointTransferSearch does not support Saved Search yet. OR-432 to implement this in the api.\r\n if (!TRPCONFIG.Domain.PointToPointTransferSearchEnabled) {\r\n _saveSearch(searchType.Transfers, 'savetransfersearch', _getTransferSearch);\r\n }\r\n }\r\n\r\n function saveParkingSearch(tripId) {\r\n _getParkingSearch(tripId).then(parkingSearch => _saveSearch(searchType.Parking, 'saveairportparkingsearch', () => parkingSearch));\r\n }\r\n\r\n function saveInsuranceSearch() {\r\n _saveSearch(searchType.Insurance, 'saveinsurancesearch', _getInsuranceSearch);\r\n }\r\n\r\n function restoreSearch(search) {\r\n switch (search.SearchType) {\r\n case searchType.Flight:\r\n return _restoreFlightSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Hotels:\r\n return _restoreHotelSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Holidays:\r\n return _restoreHolidaySearch(search)\r\n .then(_searchRestored);\r\n case searchType.Transfers:\r\n return _restoreTransferSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Parking:\r\n return _restoreParkingSearch(search)\r\n .then(_searchRestored);\r\n case searchType.Insurance:\r\n return _restoreInsuranceSearch(search)\r\n .then(_searchRestored);\r\n }\r\n return $q.when(); //just in case\r\n }\r\n\r\n function getSavedSearches(searchTypes) {\r\n if (isPrerender) {\r\n return $q.when([]);\r\n }\r\n\r\n if (searchTypes) {\r\n // 'searchTypes' must be an array\r\n if (!_.isArray(searchTypes)) {\r\n searchTypes = [searchTypes];\r\n }\r\n // search types must be supported\r\n searchTypes = _.intersection(searchTypes, supportedSearchTypes);\r\n } else {\r\n // default to supported search types\r\n searchTypes = supportedSearchTypes;\r\n }\r\n\r\n if (cachedSearches == null || !_.isEqual(searchTypes.sort(), cachedSearchTypes.sort())) {\r\n // get searches from server\r\n cachedSearchTypes = searchTypes;\r\n cachedSearches = requestRecentSearches(searchTypes);\r\n }\r\n\r\n return cachedSearches.then(function(list) {\r\n //filter out any searches that are not valid because they are same day searches\r\n //and we are past the cut off time\r\n return arrayUtil.filter(list, function(s) {\r\n if (s.SearchType !== searchType.Hotels ||\r\n (s.SearchType === searchType.Hotels &&\r\n !hotelSearchValidator.validateTimeOfDay(s.CheckInDate))) {\r\n return true;\r\n }\r\n service.removeSavedSearch(s.SavedSearchId);\r\n return false;\r\n });\r\n });\r\n\r\n function requestRecentSearches() {\r\n return $http.post(`${url}getsavedsearches`, { SearchTypes: searchTypes }, { ignoreErrors: true }).then(function(res) {\r\n return res.data instanceof Array ? arrayUtil.map(res.data, _normaliseSearch) : [];\r\n });\r\n }\r\n }\r\n\r\n function removeSavedSearch(id) {\r\n cachedSearches = null;\r\n return $http.post(`${url}removesavedsearch`, { SavedSearchId: id }).then(function() {\r\n broker.publish('savedSearchRemoved', id);\r\n return null;\r\n });\r\n }\r\n\r\n function getCabinType(idx) {\r\n return cabin[idx];\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('shortlistService', shortlistService);\r\n\r\nfunction shortlistService($http, $q, arrayUtil, hotelRehydrator, $rootScope, broker) {\r\n const url = '/api2/hotelshortlist/';\r\n let shortlists;\r\n\r\n $rootScope.$on('auth:signout', _clearCache);\r\n $rootScope.$on('auth:signin', _clearCache);\r\n\r\n const service = {\r\n clear,\r\n getHotelsInShortlist,\r\n getShortlist,\r\n getShortlistEstabIds,\r\n removeFromShortlist,\r\n addToShortlist,\r\n isHotelShortlisted,\r\n getUrl,\r\n toggleHotel\r\n };\r\n\r\n function _getShortlists() {\r\n if (!shortlists) {\r\n shortlists = $http.get(`${url}getall`, { ignoreErrors: true })\r\n .then(function(result) {\r\n return result.data.Shortlists;\r\n });\r\n }\r\n return shortlists;\r\n }\r\n\r\n function _clearCache() {\r\n shortlists = null;\r\n }\r\n\r\n function clear(id) {\r\n return $http.post(`${url}clear`, id)\r\n .then(function() {\r\n shortlists = null;\r\n });\r\n }\r\n\r\n function getHotelsInShortlist() {\r\n return getShortlist()\r\n .then(function(sl) {\r\n if (!sl) { return null; }\r\n const estabIds = [];\r\n angular.forEach(sl.Hotels, function(h) {\r\n estabIds.push(h.EstabId);\r\n });\r\n\r\n return hotelRehydrator.hotels(estabIds)\r\n .then(function(hotels) {\r\n return {\r\n ShortlistId: sl.ShortlistId,\r\n Hotels: hotels\r\n };\r\n });\r\n });\r\n }\r\n\r\n function getShortlist() {\r\n return _getShortlists()\r\n .then(function(sls) {\r\n return sls[0];\r\n });\r\n }\r\n\r\n function getShortlistEstabIds() {\r\n return getShortlist().then(function(sl) {\r\n if (!sl) { return []; }\r\n return arrayUtil.map(sl.Hotels, function(h) {\r\n return h.EstabId;\r\n });\r\n });\r\n }\r\n\r\n function toggleHotel(hotel) {\r\n return isHotelShortlisted(hotel).then(function(isShortlisted) {\r\n const p = isShortlisted ? removeFromShortlist(hotel) : addToShortlist(hotel);\r\n return p.then(function() {\r\n return !isShortlisted; //it worked so invert setting\r\n }, function() {\r\n return isShortlisted; //it didn't so leave it alone\r\n });\r\n });\r\n }\r\n\r\n function removeFromShortlist(hotel) {\r\n if (_.get(hotel, 'Id', 0) <= 0) {\r\n return $q.when().then(gatherShortlist);\r\n }\r\n return $http.post(`${url}removehotel`, {\r\n EstabId: hotel.Id\r\n }).then(gatherShortlist);\r\n\r\n function gatherShortlist() {\r\n return _getShortlists()\r\n .then(function(sls) {\r\n angular.forEach(sls, function(sl) {\r\n const index = arrayUtil.indexOf(sl.Hotels, function(h) {\r\n return h.EstabId === hotel.Id;\r\n });\r\n if (index >= 0) {\r\n sl.Hotels.splice(index, 1);\r\n broker.publish('hotelRemovedFromShortlist', hotel);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n function addToShortlist(hotel) {\r\n function add(sl) {\r\n return $http.post(`${url}addhotel`, {\r\n EstabId: hotel.Id,\r\n ShortlistId: sl.ShortlistId,\r\n Note: ''\r\n }).then(function(result) {\r\n sl.Hotels.push({ EstabId: hotel.Id });\r\n broker.publish('hotelAddedToShortlist', hotel);\r\n return result.data;\r\n });\r\n }\r\n\r\n return _getShortlists()\r\n .then(function(sls) {\r\n return add(sls[0]);\r\n });\r\n }\r\n\r\n function isHotelShortlisted(hotel) {\r\n return _getShortlists()\r\n .then(function(sls) {\r\n let found = false;\r\n angular.forEach(sls, function(sl) {\r\n angular.forEach(sl.Hotels, function(h) {\r\n if (h.EstabId === hotel.Id) {\r\n found = true;\r\n }\r\n });\r\n });\r\n return found;\r\n });\r\n }\r\n\r\n function getUrl() {\r\n return url;\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .service('sortCriteria', sortCriteria);\r\n\r\nfunction sortCriteria(resourceService, $location, hotelCriteria, flightCriteria, dealsCriteria) {\r\n const service = {\r\n getHotelCriteria,\r\n getFlightCriteria,\r\n getDealsCriteria,\r\n saveSort,\r\n getSort,\r\n translateHotelSort,\r\n getHotelSortValueById\r\n };\r\n\r\n function processCriteria(values, criteria) {\r\n let itemCriteria = {\r\n name: resourceService.getDeferred(criteria.name),\r\n val: criteria.val,\r\n oneWay: criteria.oneWay,\r\n translatedKey: criteria.name,\r\n trackingLabel: criteria.name\r\n };\r\n if (criteria.defaultSort) {\r\n itemCriteria.defaultSort = criteria.defaultSort;\r\n }\r\n if (criteria.defaultOrder) {\r\n itemCriteria.defaultOrder = criteria.defaultOrder;\r\n }\r\n if (criteria.ascSuffix) {\r\n itemCriteria.ascSuffix = resourceService.getDeferred(criteria.ascSuffix);\r\n }\r\n if (criteria.descSuffix) {\r\n itemCriteria.descSuffix = resourceService.getDeferred(criteria.descSuffix);\r\n }\r\n\r\n values.push(itemCriteria);\r\n\r\n return values;\r\n }\r\n\r\n const processedHotelCriteria = [];\r\n\r\n for (let i in hotelCriteria) {\r\n processCriteria(processedHotelCriteria, hotelCriteria[i]);\r\n }\r\n\r\n if (TRPCONFIG.Domain.ReviewsEnabled) {\r\n processedHotelCriteria.splice(1, 0, {\r\n name: resourceService.getDeferred('CUSTOMERRATING'),\r\n val: [2],\r\n trackingLabel: 'CUSTOMERRATING'\r\n });\r\n }\r\n\r\n const processedFlightCriteria = [];\r\n\r\n for (let ii in flightCriteria) {\r\n processCriteria(processedFlightCriteria, flightCriteria[ii]);\r\n }\r\n\r\n const processedDealsCriteria = [];\r\n\r\n for (let iii in dealsCriteria) {\r\n processCriteria(processedDealsCriteria, dealsCriteria[iii]);\r\n }\r\n\r\n function getHotelCriteria() {\r\n return processedHotelCriteria;\r\n }\r\n\r\n function getFlightCriteria(oneWay) {\r\n if (oneWay === true) {\r\n return processedFlightCriteria.filter(function(c) {\r\n return c.oneWay;\r\n });\r\n }\r\n return processedFlightCriteria;\r\n }\r\n\r\n function translateHotelSort(criteriaValue) {\r\n if (!criteriaValue) { return {}; }\r\n const criteria = _.find(\r\n processedHotelCriteria,\r\n hc => angular.isArray(hc.val) ? (_.get(hc, 'val') || []).indexOf(criteriaValue) > -1 : _.get(hc, 'val') === criteriaValue\r\n );\r\n const defaultDir = _.get(criteria, 'defaultOrder');\r\n const otherDir = defaultDir === 'asc' ? 'desc' : 'asc';\r\n const translated = { label: criteria.translatedKey };\r\n if (defaultDir) {\r\n _.set(\r\n translated,\r\n 'direction',\r\n _.get(criteria, 'defaultSort') === criteriaValue ? defaultDir : otherDir\r\n );\r\n }\r\n return translated;\r\n }\r\n\r\n function getDealsCriteria(criteria = undefined) {\r\n if (criteria) {\r\n return _.find(processedDealsCriteria, dc => dc.val.indexOf(criteria) > -1);\r\n }\r\n return processedDealsCriteria;\r\n }\r\n\r\n function saveSort(sortCriteria) {\r\n $location.search('sort', sortCriteria).replace();\r\n }\r\n\r\n function getSort() {\r\n const sort = _.get($location.search(), 'sort');\r\n return sort ? parseInt(sort) : undefined;\r\n }\r\n\r\n function getHotelSortValueById(id) {\r\n const sortObj = getHotelCriteria().filter(el => {\r\n return el.val.indexOf(id) !== -1;\r\n });\r\n return _.get(sortObj, '[0].trackingLabel');\r\n }\r\n\r\n return service;\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .service('trackingPixelsService', trackingPixelsService);\n\nfunction trackingPixelsService($filter, cookieService, $http) {\n let data = { bookingRef: '', costing: { totalCost: 0, currencyCode: '' }, area: '' };\n const flightBookingPrefix = 'SCH';\n const hotelBookingPrefix = 'ACM';\n const bundleBookingPrefix = 'BND';\n const marhabaBookingPrefix = 'MHB';\n const insuranceBookingPrefix = 'INS';\n const transferBookingPrefix = 'TRN';\n\n const service = {\n setData,\n report\n };\n\n function _getBookingId(bookingId) {\n const prefixExp = new RegExp(`(${flightBookingPrefix}|${hotelBookingPrefix}|${bundleBookingPrefix}|${marhabaBookingPrefix}|${insuranceBookingPrefix}|${transferBookingPrefix})/\\\\d+`, 'g');\n\n bookingId = bookingId.split('|').find(id => {\n return id.search(prefixExp) >= 0;\n });\n\n if (bookingId && bookingId.indexOf('/') > -1) {\n bookingId = bookingId.split('/')[1];\n }\n\n return bookingId || '';\n }\n\n\n function report(eventType, source) {\n const provider = _getProvider(source);\n const eventData = {\n VisitSource: source,\n EventType: eventType,\n ClickId: provider.clickId,\n BookingId: parseInt(provider.bookingId)\n };\n\n $http.post('/api2/b2b/tpe/', eventData);\n }\n\n function setData(bookingRefs, currencyCode, totalCost, hotel, rooms) {\n if (bookingRefs && totalCost) {\n data = {\n bookingRef: bookingRefs.join('|'),\n costing: { totalCost, currencyCode }\n };\n } else {\n data.bookingRef = '';\n }\n\n if (hotel) {\n data.hotel = hotel;\n }\n\n if (rooms) {\n data.rooms = rooms;\n }\n\n return data;\n }\n\n function _getProvider(source) {\n let provider = {\n name: 'unknown',\n source: source || 'unknown',\n bookingId: _getBookingId(data.bookingRef),\n clickId: ''\n };\n\n return provider;\n }\n\n return service;\n}\n})();\n","(function() {\n 'use strict';\n\n angular\n .module('TR')\n .service('urlStoreService', urlStoreService);\n\n function urlStoreService($location) {\n\n const service = {\n pushURL,\n getPreviousURL,\n getURLHistory,\n cameFromWrongPath,\n isTripIdChanged,\n isPreviousUrlHotelDetails,\n isPreviousUrlHotelOptions,\n isPreviousUrlHotelBook\n };\n\n function pushURL() {\n let storage = sessionStorage.getItem('URLstorage');\n let currURL = $location.$$path;\n if (storage === null) {\n storage = {\n urls: [null],\n previous: null\n };\n } else {\n storage = JSON.parse(storage);\n }\n // ignore (do not push url in the storage) if user reload the page\n if (storage.urls[storage.urls.length - 1] !== currURL) {\n storage.urls.push(currURL);\n // find previous url in storage\n storage.previous = storage.urls.slice(-2)[0];\n\n if (storage.urls.length > 4) {\n // delete url before previous if it equal to current url,\n // we need this to check if user click back then forward after that back button\n // it is no make sense to store this in the history\n if (storage.urls[storage.urls.length - 3] === currURL) {\n storage.urls.splice(-3, 1);\n } else {\n // clear not needed url history to save storage memory\n storage.urls.shift();\n }\n }\n }\n sessionStorage.setItem('URLstorage', JSON.stringify(storage));\n }\n\n function getPreviousURL() {\n let storage = sessionStorage.getItem('URLstorage');\n return storage ? JSON.parse(storage).previous : null;\n }\n\n function getURLHistory() {\n let storage = sessionStorage.getItem('URLstorage');\n return storage ? JSON.parse(storage).urls : null;\n }\n\n function isTripIdChanged() {\n const previousURL = getPreviousURL();\n let changed = false;\n if (previousURL !== null) {\n let splitedCurrentPath = $location.$$path.split('/');\n const currentTripId = splitedCurrentPath.pop();\n let splitedPreviousPath = previousURL.split('/');\n const previousTripId = splitedPreviousPath.pop();\n if (JSON.stringify(splitedCurrentPath) === JSON.stringify(splitedPreviousPath) && currentTripId !== previousTripId) {\n changed = true;\n }\n }\n return changed;\n }\n\n function isPreviousUrlHotelDetails(tripId) {\n const r = new RegExp(`/?holidays/${tripId}/[^/]+`, 'gi');\n return r.test(getPreviousURL());\n }\n\n function isPreviousUrlHotelOptions(tripId) {\n const r = new RegExp(`/?holidays/options/${tripId}/?`, 'gi');\n return r.test(getPreviousURL());\n }\n\n function isPreviousUrlHotelBook(tripId) {\n const r = new RegExp(`/?holidays/book/${tripId}/?`, 'gi');\n return r.test(getPreviousURL());\n }\n\n function cameFromWrongPath(applicablePathRegEx) {\n const previousURL = getPreviousURL();\n return previousURL !== null ? previousURL.match(applicablePathRegEx) === null : true;\n }\n\n return service;\n }\n})();\n","namespace TR {\n export class VoucherModalService {\n private domain = TRPCONFIG.Domain;\n private apiUrl = 'api/hotels/modals';\n\n constructor (\n private $http: ng.IHttpService,\n private cookieService) {\n }\n\n getVoucherInfo (options = {}) {\n const bd4userId = this.cookieService.get('bd4ti') || '';\n return this.$http.post(\n `${this.apiUrl}/query/?domainId=${this.domain.DomainId}&bd4userId=${bd4userId}`,\n options\n ).then(response => bd4userId ? response.data : {});\n }\n }\n\n angular.module('TR').service('voucherModalService', VoucherModalService);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('AgentBookingForm', AgentBookingForm);\n\nfunction AgentBookingForm(currentUser, agentModeService) {\n const abf = this;\n abf.user = currentUser.get();\n\n if (TRPCONFIG.Domain.isAgentMode) {\n agentModeService.getAgentInformation().then(function(data) {\n if (data && data.OfficeLocations) {\n abf.officeDetails = data.OfficeLocations;\n data.OfficeLocations.forEach(loc => {\n if (loc.Id === data.CurrentOfficeLocation) {\n abf.selectedOffice = loc.Name;\n }\n });\n }\n });\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('AgentPaymentBox', AgentPaymentBox);\n\nfunction AgentPaymentBox($scope, $rootScope, paymentsService, agentModeService) {\n const apb = this;\n let selectedCard;\n\n apb.authorizeOverride = authorizeOverride;\n apb.hideOverrideBox = hideOverrideBox;\n\n $scope.$watch('$parent.cm.booking.UserData.PaymentDetails.CardDetails.CardType', function(id) {\n if (!id) { return; }\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideUserId = undefined;\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideCardId = undefined;\n selectedCard = paymentsService.getCardFromId($scope.$parent.cm.paymentOptions, id);\n apb.showOverrideBox =\n selectedCard.AdminOverride &&\n !agentModeService.hasOverridePermission($rootScope.agent);\n });\n\n function authorizeOverride(username, password) {\n if ($scope.$parent.form.cardFeeOverrideForm.$invalid) {\n apb.overrideErrorMessage = 'Insert username and password';\n apb.formInvalid = true;\n return;\n }\n\n apb.formInvalid = false;\n agentModeService\n .loginOverride(username, password)\n .then(_confirmOverride, _failedOverride);\n }\n\n function hideOverrideBox() {\n $scope.$parent.cm.booking.cardOption = 0;\n $scope.$parent.cm.updateCardType();\n apb.overrideErrorMessage = undefined;\n apb.formInvalid = false;\n apb.showOverrideBox = false;\n }\n\n function _confirmOverride(overrideInfo) {\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideCardId = selectedCard.cardTypeId;\n $scope.$parent.cm.booking.UserData.PaymentDetails.OverrideUserId = overrideInfo.UserName;\n apb.showOverrideBox = false;\n apb.overrideErrorMessage = undefined;\n }\n\n function _failedOverride(errorInfo) {\n switch (errorInfo.status) {\n case 404:\n apb.overrideErrorMessage = 'User not found';\n break;\n\n case 401:\n apb.overrideErrorMessage = 'Unauthorised';\n break;\n }\n }\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('FlightCapture', FlightCapture);\r\n\r\nfunction FlightCapture(bookingService,\r\n $routeParams,\r\n tripService,\r\n $scope,\r\n resourceService) {\r\n const cm = this;\r\n let dir;\r\n let inverse;\r\n\r\n cm.setDepartureAirport = setDepartureAirport;\r\n cm.setDestinationAirport = setDestinationAirport;\r\n cm.setDateAndTime = setDateAndTime;\r\n cm.resetDestinationAirport = resetDestinationAirport;\r\n\r\n tripService.getTransferDestinationAirport($routeParams.tripId).then(airport => cm.destinationAirport = airport);\r\n\r\n function _setAirport(start, end, item, booking) {\r\n booking.UserData.ConnectingFlight = booking.UserData.ConnectingFlight || {};\r\n booking.UserData.ConnectingFlight[`${dir + start}Airport`] = item.Code;\r\n booking.UserData.ConnectingFlight[`${dir + start}AirportName`] = item.Title;\r\n\r\n if (booking.UserData.ConnectingFlight[`${inverse + end}Airport`] == null || booking.UserData.ConnectingFlight[`${inverse + end}Airport`] === '') {\r\n booking.UserData.ConnectingFlight[`${inverse + end}Airport`] = item.Code;\r\n booking.UserData.ConnectingFlight[`${inverse + end}AirportName`] = item.Title;\r\n }\r\n\r\n bookingService.updateBooking(booking);\r\n }\r\n\r\n function _resetAirport(start, booking) {\r\n booking.UserData.ConnectingFlight[`${dir + start}Airport`] = null;\r\n booking.UserData.ConnectingFlight[`${dir + start}AirportName`] = null;\r\n }\r\n\r\n function _setDirection(outbound) {\r\n dir = outbound === true ? 'Outbound' : 'Inbound';\r\n inverse = dir === 'Outbound' ? 'Inbound' : 'Outbound';\r\n }\r\n\r\n function setDepartureAirport(item, outbound, booking) {\r\n if (_isValidDepartureAirport(item)) {\r\n _setDirection(outbound);\r\n _setAirport('Departure', 'Destination', item, booking);\r\n $scope.$broadcast('flash:hide');\r\n } else {\r\n _setAirport('Departure', 'Destination', {}, booking);\r\n $scope.$broadcast('flash:error', resourceService.get('DEPARTUREAIRPORTERROR'));\r\n }\r\n }\r\n\r\n function _isValidDepartureAirport(airport) {\r\n return !cm.destinationAirport || airport && airport.Code && airport.Code !== cm.destinationAirport.Code;\r\n }\r\n\r\n function setDestinationAirport(item, outbound, booking) {\r\n _setDirection(outbound);\r\n _setAirport('Destination', 'Departure', item, booking);\r\n }\r\n\r\n function setDateAndTime(date, booking, outbound) {\r\n _setDirection(outbound);\r\n booking.UserData.ConnectingFlight[`${dir}Date`] = cm.isStartTimeApprovedByCustomer ? date : null;\r\n bookingService.updateBooking(booking);\r\n }\r\n\r\n function resetDestinationAirport(outbound, booking) {\r\n _setDirection(outbound);\r\n _resetAirport('Destination', booking);\r\n }\r\n}\r\n})();\r\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('SeatPlan', SeatPlan);\n\nfunction SeatPlan(basketStore, tripService, $routeParams, flightSeatPlanService) {\n const sp = this;\n sp.showPlan = false;\n sp.totalPrice = 0;\n sp.minCostPerPerson = 0;\n\n sp.closePlan = function() {\n sp.showPlan = false;\n };\n\n sp.resetSeats = function() {\n for (const p of sp.flightSeatPlan.Passengers) {\n for (const s of p.Seats) {\n s.Number = null;\n s.Price = 0;\n }\n }\n sp.totalPrice = 0;\n };\n\n tripService.getTrip($routeParams.tripId).then(function(trip) {\n return basketStore.flight(trip.BasketId);\n }).then(function(flight) {\n if (!flight.Details.CanSelectSeats) {\n return;\n }\n\n return flightSeatPlanService.getSeatPlan({\n DetailsSessionId: flight.Details.DetailsId\n });\n }).then(function(plan) {\n if (plan) {\n sp.flightSeatPlan = plan;\n }\n });\n}\n})();\n","namespace TR {\n\n 'use strict';\n\n class HolidayDealsResults {\n\n page: Function;\n paging: any;\n results: any;\n showSearchUnit: boolean;\n updating: boolean;\n dealsSortCriteria: any;\n sortCriterion: number;\n showMap: boolean;\n priceMode: number;\n getCoordinates: any;\n showFilterBox: any;\n newSearch: boolean;\n\n constructor(\n private $location: ng.ILocationService,\n private $scope: ng.IScope,\n private holidayDeals: any,\n private broker: any,\n private pagingService: Core.PagingService,\n private resourceService: Core.ResourceService,\n private analytics: any,\n bd4t: any,\n sortCriteria: any\n ) {\n $scope.$emit('block', {\n title: resourceService.get('SEARCHINGDEALS'),\n subtitle: resourceService.get('THISMAYTAKE'),\n loadingScreenStyle: 'default-holidayDealsResults'\n });\n\n bd4t('send','pageview', { type: 'deals', label: 'dealsFinderResults' });\n\n this.page = (page) => this.find(page - 1, this.sortCriterion);\n this.sortCriterion = sortCriteria.getSort() || 1;\n this.priceMode = 0;\n this.newSearch = true;\n this.showSearchUnit = !!_.get(this.$location.search(), 'promo');\n broker.publish('priceModeChanged', this.priceMode);\n\n broker.subscribe(\n 'holidayDealsResults',\n 'REFRESHSEARCH',\n (e:any) => {\n this.newSearch = (e && e.data) ? e.data.newSearch : false;\n this.find(0, this.sortCriterion);\n }\n );\n\n broker.subscribe(\n 'holidayDealsResults',\n 'priceModeChanged',\n e => this.priceMode = e.data\n );\n\n // This also starts the first search\n $scope.$watch(\n 'hd.sortCriterion',\n (v:number) => {\n this.find(0, v).then(() => sortCriteria.saveSort(v));\n }\n );\n\n this.dealsSortCriteria = sortCriteria.getDealsCriteria();\n\n $scope.$on('$destroy', () => {\n broker.unsubscribe('holidayDealsResults');\n });\n\n broker.publish('priceModeChanged', 1);\n }\n\n toggleSearchUnit() {\n this.showSearchUnit = !this.showSearchUnit;\n }\n\n toggleMap() {\n this.showMap = !this.showMap;\n }\n\n isFiltered() {\n if (!this.results) { return false; }\n return !_.isEqual(\n this.results.Info.filters,\n this.holidayDeals.getDefaultFilters()\n );\n }\n\n resetFilters() {\n this.results.Info.filters = this.holidayDeals.getDefaultFilters();\n }\n\n openSlideFilter() {\n this.showFilterBox = true;\n }\n\n find(page = 0, sort = 1) {\n this.updating = true;\n return this.holidayDeals\n .find({ page, sort })\n .then(res => this.results = res)\n .then(() => {\n this.broker.publish(\n 'hotelsReturnedFromSearch',\n this.results.Products.filter(p => !p.IsCruise)\n );\n this.broker.publish('UPDATEMAP');\n })\n .then(() => {\n this.paging = this.pagingService.data(\n this.results.Paging.Index + 1,\n this.results.Paging.Size,\n this.results.Paging.Total);\n this.paging.UnfilteredTotal = this.results.Paging.UnfilteredTotal;\n this.updating = false;\n this.$scope.$emit('unblock');\n\n if (_.has(this.$location.search(), 'openBox')) {\n const hotel = _.first(this.results.Products.filter(p => !p.IsCruise));\n if (hotel) { this.broker.publish('SHOWDEALS', { hotel }); }\n }\n\n if (this.newSearch) {\n this.analytics.track('mixpanel', 'HolidayDealsListing', {\n cruiseCount: (this.results.Products.filter(p => p.IsCruise) || []).length,\n hotelCount: (this.results.Products.filter(p => !p.IsCruise) || []).length\n });\n this.newSearch = false;\n }\n\n if (sort !== 1) {\n const sortElement =\n _.find(\n this.dealsSortCriteria,\n (s:any) => s.val.indexOf(sort) > -1\n );\n\n if (!sortElement) { return; }\n\n const dir = _.min(sortElement.val) === sort ? 'asc' : 'desc';\n\n this.analytics.track('mixpanel', 'HolidayDealsSort', {\n 'ChangedTo': `${sortElement.name()} ${dir}`\n });\n\n }\n }, () => this.$scope.$emit('unblock'));\n }\n }\n\n angular\n .module('TR')\n .controller('HolidayDealsResults', HolidayDealsResults);\n}\n","(function() {\n'use strict';\n\nangular\n .module('TR')\n .controller('Country', Country);\n\nfunction Country(pagingService,\n urlUtils,\n $scope,\n $rootScope,\n pageStrand,\n destinationService,\n reviewService,\n windowUtil,\n imageService,\n countryService,\n broker,\n resourceService,\n $location,\n $q,\n currentDestination) {\n const cm = this;\n const inResource = resourceService.get('InDestination');\n\n cm.lightboxOpen = false;\n cm.mapReady = false;\n cm.loading = true;\n cm.loadingDestinations = true;\n cm.loadingCoords = true;\n cm.loadingReviews = true;\n cm.loadingInfo = true;\n cm.loadingChildren = true;\n cm.destinationThumb = destinationThumb;\n cm.openImageGallery = openImageGallery;\n cm.showReviews = showReviews;\n cm.popupMap = popupMap;\n cm.showAllDestinations = $location.search().allDest;\n const parsed = urlUtils.parse($location.url());\n parsed.qs.allDest = true;\n cm.allDestinationsUrl = urlUtils.stripLeadingSlash(urlUtils.format(parsed));\n cm.toggleDestinations = toggleDestinations;\n cm.pageReviews = page => {\n _getReviews(cm.selectedHotel, page);\n };\n function toggleDestinations(e) {\n e.preventDefault();\n e.stopPropagation();\n if (!cm.showAllDestinations) {\n destinationService.getAllChildren(cm.destination).then(children => cm.all = buildPagePaths(children));\n cm.showAllDestinations = !cm.showAllDestinations;\n }\n }\n\n\n broker.subscribe('CountryCtrl', 'selectHotel', function(ev) {\n selectHotel(ev.data.hotel, ev.data.event);\n });\n\n broker.subscribe('CountryCtrl', 'lightboxOpened', function() {\n cm.lightboxOpen = true;\n });\n\n broker.subscribe('CountryCtrl', 'mapReady', function() {\n cm.mapReady = true;\n });\n\n $scope.$on('$destroy', function() {\n broker.unsubscribe('CountryCtrl');\n });\n\n function popupMap() {\n cm.showPopupMap = true;\n }\n\n function destinationThumb(dest) {\n return destinationService.destinationThumb(dest);\n }\n\n function buildPagePaths(children) {\n return destinationService.sortByTitle(children).map(function(child) {\n child.PagePath = urlUtils.appendExistingQueryString(urlUtils.stripLeadingSlash(child.PagePath));\n return child;\n });\n }\n\n currentDestination.getCurrentDestination().then(function(destination) {\n cm.destination = destination;\n\n const requests = [destinationService.getText(cm.destination), destinationService.getTopChildren(8, cm.destination)];\n if (cm.showAllDestinations) {\n requests.push(destinationService.getAllChildren(cm.destination));\n }\n\n $q.all(requests).then(result => {\n const text = result[0];\n const children = buildPagePaths(result[1]);\n const defaultStr = '{name}';\n\n if (cm.showAllDestinations) {\n cm.all = buildPagePaths(result[2]);\n }\n\n cm.dealsTitle = dest => String.supplant(text.List1Title || defaultStr, _getVarMap(dest));\n\n countryService.getTopDeals(2, cm.destination, children.slice(0, 3)).then(function(deals) {\n cm.greatDeals = deals;\n cm.loadingDeals = false;\n });\n\n cm.popular = children;\n cm.loadingDestinations = false;\n }).finally(() => {\n $rootScope.unlockScreen($scope);\n });\n });\n\n function selectHotel(hotel, e) {\n e.preventDefault();\n e.stopPropagation();\n if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow) {\n windowUtil.open(_getHotelUrl(false, hotel));\n } else {\n $location.path(_getHotelUrl(true, hotel));\n }\n }\n\n function getHotelUrl(hotel) {\n return _getHotelUrl(false, hotel);\n }\n\n function _getHotelUrl(leadingSlash, hotel) {\n let url = hotel.Url;\n const index = url.indexOf('/');\n if (!leadingSlash && index === 0) {\n url = url.substring(1);\n }\n if (leadingSlash && index !== 0) {\n url = `/${url}`;\n }\n return pageStrand.adjustUrl(url, cm.destination.PageStrand);\n }\n\n function openImageGallery(hotel, e) {\n e.preventDefault();\n e.stopPropagation();\n\n const w = TRPCONFIG.DeviceSettings.HotelImageMaxWidth;\n const h = TRPCONFIG.DeviceSettings.HotelImageMaxHeight;\n\n cm.hotelImageIndex = 0;\n cm.hotelImages = [];\n\n for (let i = 0, l = hotel.NumberOfPhotos; i < l; i++) {\n cm.hotelImages.push({\n src: imageService.getImageUrl(hotel.Id, w, h, i, false)\n });\n }\n cm.showHotelImages = true;\n }\n\n function showReviews(hotel, ev) {\n ev.preventDefault();\n cm.reviews = [];\n cm.selectedHotel = hotel;\n cm.reviewPaging = pagingService.data(1, 10, hotel.CustomerRatingCount);\n _getReviews(hotel, cm.reviewPaging.page);\n cm.reviewsShowing = true;\n ev.stopPropagation();\n }\n\n function _getVarMap(dest) {\n // Variable mapping in string templates i.e. {name}\n // Also supports legacy numeric vars i.e. {0}\n return {\n 0: dest.Title,\n 1: inResource,\n name: dest.Title,\n in: inResource\n };\n }\n\n function _getReviews(hotel, page) {\n cm.loadingReviews = true;\n if (page === 1) {\n cm.loadingFirstReviews = true;\n }\n return reviewService.getReviews(hotel, page - 1).then(function(result) {\n cm.reviews = result.reviews;\n cm.loadingReviews = false;\n cm.loadingFirstReviews = false;\n cm.reviewPaging = pagingService.data(page, 10, hotel.CustomerRatingCount);\n });\n }\n\n cm.selectHotel = selectHotel;\n cm.getHotelUrl = getHotelUrl;\n\n cm.bookButton = function() {\n return resourceService.get('VIEWDETAILS');\n };\n}\n})();\n","(function() {\r\n'use strict';\r\n\r\nangular\r\n .module('TR')\r\n .controller('HotelsFilter', HotelsFilter);\r\n\r\nfunction HotelsFilter($scope, hotelSearch, broker, resourceService, hotelsFilter) {\r\n const hf = this;\r\n let agg;\r\n\r\n hf.newSearch = true;\r\n\r\n hotelSearch.getFilterLazy().then(function(filter) {\r\n hf.filter = filter;\r\n });\r\n\r\n broker.subscribe('HotelsFilterCtrl', 'newSearchTriggered', newSearchTriggered);\r\n\r\n broker.subscribe('HotelsFilterCtrl', 'hotelListUpdated', function(ev) {\r\n updateFilter();\r\n if (ev.data.Aggregates) {\r\n configureFilterLimits(ev.data);\r\n }\r\n watchFilter();\r\n });\r\n\r\n $scope.$on('$destroy', function() {\r\n broker.unsubscribe('HotelsFilterCtrl');\r\n });\r\n\r\n function configureFilterLimits(results) {\r\n agg = results.Aggregates;\r\n\r\n if (hf.filterLimits == null) {\r\n hf.filterLimits = hotelsFilter.getFilterLimits(agg);\r\n }\r\n\r\n hf.moreLess = function(filterName) {\r\n if (!agg[`${filterName}Array`] || (agg[`${filterName}Array`].length <= hotelsFilter.config[filterName].limit)) {\r\n return '';\r\n }\r\n if (hf.filterLimits[filterName] <= hotelsFilter.config[filterName].limit) {\r\n return resourceService.get('MORE');\r\n }\r\n if (hf.filterLimits[filterName] > hotelsFilter.config[filterName].limit) {\r\n return resourceService.get('FEWER');\r\n }\r\n };\r\n\r\n hf.toggleLimit = function(filterName) {\r\n hf.filterLimits[filterName] = (hf.filterLimits[filterName] < agg[`${filterName}Array`].length) ? agg[`${filterName}Array`].length : hotelsFilter.config[filterName].limit;\r\n };\r\n\r\n function toggleOpenSelected() {\r\n if (hf.newSearch === false) {\r\n return;\r\n }\r\n for (const i in agg) {\r\n if (typeof agg[`${i}Array`] !== 'undefined') {\r\n if (i.indexOf('HotelsBy') >= 0) {\r\n const name = i.replace('HotelsBy', '');\r\n //check in singular and plural form of model\r\n const f = hf.filter[name] || hf.filter[`${name}s`];\r\n hf.filterLimits[i] = f && f.length > 0 ? agg[`${i}Array`].length : hf.filterLimits[i];\r\n } else if (checkFacilities(i)) {\r\n hf.filterLimits[i] = agg[`${i}Array`].length;\r\n }\r\n }\r\n }\r\n hf.newSearch = false;\r\n }\r\n\r\n toggleOpenSelected();\r\n\r\n function checkFacilities(filterName) {\r\n return _.some(agg[`${filterName}Array`], v => v.name && _.includes(hf.filter.FacilityCodes, v.name));\r\n }\r\n }\r\n\r\n ['removeFilter', 'removeArrayFilter', 'resetArrayFilter', 'resetBitFilter', 'resetRangeFilter', 'resetFilters'].forEach(function(fn) {\r\n hf[fn] = function(...args) {\r\n stopWatch();\r\n return hotelSearch[fn](...args).then(watchFilter).then(updateFilter);\r\n };\r\n });\r\n\r\n hf.resetFacilityFilter = function(group) {\r\n stopWatch();\r\n const codesInGroup = [];\r\n for (const code in agg[group]) {\r\n codesInGroup.push(code);\r\n }\r\n return hotelSearch.removeFiltersIn('FacilityCodes', codesInGroup).then(watchFilter).then(updateFilter);\r\n };\r\n\r\n function updateFilter() {\r\n hf.filter = hotelSearch.getFilter();\r\n }\r\n\r\n let canceller;\r\n function stopWatch() {\r\n if (canceller != null) {\r\n canceller();\r\n }\r\n }\r\n\r\n function watchFilter() {\r\n stopWatch();\r\n canceller = $scope.$watch('hf.filter', _.debounce(function(f, o) {\r\n if (f == null || _.isEqual(f, o)) {\r\n return;\r\n }\r\n //this filter has changed therefore we have to remove any estab group filter just in case\r\n hotelSearch.filter().then(updateFilter);\r\n }, 300), true);\r\n }\r\n\r\n\r\n //the reason that filters need to be reset when a new search is triggered is because the filter criteria\r\n //are built from the aggregates which will be completely different when the search results load. So\r\n //don't be tempted to remove this. Seriously.\r\n //Furthermore when we trigger a new search, becuase we have to reset the filters we also need to suspend\r\n //the watch until those results have been resolved otherwise we get double calling of the getHotelsFromSession\r\n //Fragile? absolutely.\r\n function newSearchTriggered() {\r\n hf.newSearch = true;\r\n hf.resetFilters(true).then(stopWatch);\r\n }\r\n}\r\n})();\r\n","namespace Core {\n\n export interface ICustomPopupOptions {\n popupContainer?: string;\n popupScope: Object;\n }\n\n interface IDefaultPopupOptions {\n popupContainer: string;\n }\n\n export interface IPopupScope extends ng.IScope {\n showPopup: boolean;\n confirm: (val?: any) => void;\n close: (val?: any) => void;\n cancel: (val?: any) => void;\n [key: string]: any;\n }\n\n export class BasePopupService {\n private defaultOptions: IDefaultPopupOptions;\n\n constructor(\n private $compile: ng.ICompileService,\n private $q: ng.IQService,\n private $rootScope: ng.IRootScopeService,\n private $timeout: ng.ITimeoutService\n ) {\n this.defaultOptions = {\n popupContainer: 'body'\n };\n }\n\n public showPopup(template: string, popupOptions: ICustomPopupOptions): ng.IPromise {\n const defer = this.$q.defer();\n const options = Object.assign(this.defaultOptions, popupOptions);\n let scope = this._createScope(defer, options.popupScope || {});\n\n const compiledElement = this.$compile(template)(scope);\n const container = angular.element(options.popupContainer);\n this.addPopupToContainer(container, compiledElement);\n return defer.promise.then((val) => {\n scope.showPopup = false;\n this.removePopupFromContainer(compiledElement);\n return this.$q.when(val);\n },\n (val) => {\n scope.showPopup = false;\n this.removePopupFromContainer(compiledElement);\n return this.$q.reject(val);\n });\n }\n\n public addPopupToContainer(container, template: any) {\n return container.append(template);\n }\n\n public removePopupFromContainer(element) {\n setTimeout(() => {\n element.remove();\n this.$rootScope.$apply();\n });\n }\n\n private _createScope(defer: ng.IDeferred, customScope: Object, ): IPopupScope {\n const sc = this.$rootScope.$new();\n const mergedScope = Object.assign(sc, {\n defer,\n showPopup: true,\n close(value?) {\n defer.reject({\n result: 'close',\n value\n });\n },\n confirm(value?) {\n defer.resolve({\n result: 'confirm',\n value\n });\n },\n cancel(value?) {\n defer.reject({\n result: 'cancel',\n value\n });\n },\n ...customScope\n });\n _.functions(mergedScope).forEach((f) => {\n mergedScope[f] = mergedScope[f].bind(mergedScope);\n });\n return mergedScope;\n }\n }\n\n angular.module('TR').service('basePopupService', BasePopupService);\n}\n","namespace Core {\n\n export interface IChangeDurationPopupScope {\n popupMessage: string;\n popupHeader: string;\n nightsButtonLabel?: string;\n newNightsButtonLabel?: string;\n }\n\n const template = `\n \n
            \n \n
            \n \n \n
            \n
            \n
            \n `;\n\n export class ChangeDurationPopupService {\n private defaultPopupScope: IChangeDurationPopupScope;\n\n constructor(\n private basePopupService: Core.BasePopupService,\n $rootScope: ng.IRootScopeService\n ) {\n this.defaultPopupScope = {\n popupMessage: '',\n popupHeader: '',\n nightsButtonLabel: '',\n newNightsButtonLabel: ''\n };\n }\n\n\n\n public showPopup(customScope: IChangeDurationPopupScope): ng.IPromise {\n const defScope = this.defaultPopupScope;\n const popupParams = {\n popupContainer: 'body',\n popupScope: {\n ...defScope,\n ...customScope,\n confirm: function (val) {\n if (val === 'changeDuration') {\n TRPCONFIG.Domain.ChangeHotelNightsDuration = true;\n } else {\n TRPCONFIG.Domain.ChangeHotelNightsDuration = false;\n }\n this.defer.resolve({\n result: 'confirm'\n });\n },\n close(value?) {\n this.defer.reject({\n result: 'close',\n value\n });\n this.$rootScope.$emit('unblock');\n },\n cancel(value?) {\n this.defer.reject({\n result: 'cancel',\n value\n });\n this.$rootScope.$emit('unblock');\n }\n }\n };\n return this.basePopupService.showPopup(template, popupParams);\n }\n }\n\n angular.module('TR').service('changeDurationPopupService', ChangeDurationPopupService);\n}\n","namespace Core {\n\n export interface IConfirmPopupScope {\n popupMessage: string;\n popupHeader: string;\n okButtonLabel?: string;\n cancelButtonLabel?: string;\n }\n\n const template = `\n \n
            \n \n
            \n \n \n
            \n
            \n
            \n `;\n\n export class ConfirmPopupService {\n private defaultPopupScope: IConfirmPopupScope;\n\n\n constructor(\n private basePopupService: Core.BasePopupService,\n private resourceService: Core.ResourceService\n ) {\n this.defaultPopupScope = {\n popupMessage: '',\n popupHeader: '',\n okButtonLabel: resourceService.get('OK'),\n cancelButtonLabel: resourceService.get('CANCEL')\n };\n }\n\n public showPopup(customScope: IConfirmPopupScope): ng.IPromise {\n const defScope = this.defaultPopupScope;\n const popupParams = {\n popupContainer: 'body',\n popupScope: {\n ...defScope,\n ...customScope\n }\n };\n return this.basePopupService.showPopup(template, popupParams);\n }\n }\n\n angular.module('TR').service('confirmPopupService', ConfirmPopupService);\n}\n","namespace Core {\n\n const template = `\n \n
            \n
            \n
            \n
            {{showSuccess ? successMessage : titleLabel}}
            \n \n \n
            \n
            \n
            \n
            \n `;\n\n export class SignUpPopupService {\n private signUpPopupBackgroundImageUrl: string;\n\n constructor(\n private basePopupService: Core.BasePopupService,\n private resourceService: Core.ResourceService,\n protected analytics: any\n ) {\n this.signUpPopupBackgroundImageUrl = this._getBackgroundImageUrl();\n }\n\n private _getBackgroundImageUrl() {\n let backgroundUrl;\n const configValue = TRPCONFIG.Domain2.SignUpPopupBackgroundUrl;\n try {\n let cfg = JSON.parse(configValue);\n backgroundUrl = TRPCONFIG.Rtl ? cfg.RightToLeft : cfg.LeftToRight;\n } catch(err) {}\n\n return backgroundUrl || configValue;\n }\n\n private _sendPopupClosedGAEvent({value}) {\n if (!value || !value.isSuccess) {\n this.analytics.trackEvent({\n category: 'newsletterSignup',\n action: 'click',\n label: 'PopUp_Closed',\n dimension9: 'newsletterSignup'\n });\n }\n }\n\n public showPopup(): ng.IPromise {\n return this.basePopupService.showPopup(template, {popupScope:\n {\n showSuccess: false,\n continueButtonLabel: this.resourceService.get('CONTINUE'),\n successMessage: this.resourceService.get('NEWSLETTERSIGNUPREGISTRATIONSUCCESSFUL'),\n titleLabel: this.resourceService.get('NEWSLETTERSIGNUPPOPUPTITLE'),\n unsubscriptionNotes: this.resourceService.get('NEWSLETTERSIGNUPPOPUPUNSUBSCRIBENOTES'),\n subscribeButtonLabel: this.resourceService.get('NEWSLETTERSIGNUPPOPUPSUBSCRIBEBUTTON'),\n styles: {\n 'background-image': `url(${this.signUpPopupBackgroundImageUrl})`\n },\n confirm: function () {\n this.showSuccess = true;\n localStorage.setItem('subscriptionState', 'subscribed');\n },\n continue: function() {\n this.defer.resolve({\n result: 'confirm'\n });\n }\n }\n })\n .catch(this._sendPopupClosedGAEvent.bind(this));\n }\n }\n\n angular.module('TR').service('signUpPopupService', SignUpPopupService);\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('baseMap', baseMap);\n\nfunction baseMap(maps, broker) {\n // const template = `\n //
            \n //
            \n //
            \n //
            \n //
            \n //
            \n // `;\n\n // TODO template has now become domain specific as TR uses different spinner html.\n // This can be undone when we re-align.\n\n return {\n restrict: 'E',\n scope: {\n zoom: '@',\n thumbnail: '=',\n visible: '=',\n dealsMode: '@',\n hotelPosition: '=',\n disableUpdates: '@'\n },\n templateUrl: 'partials/home/directivetemplate?type=BaseHotelMap',\n link\n };\n\n function link(scope, el) {\n let map = null;\n\n scope.$watch('visible', v => {\n if (!v) { return; }\n\n maps.loadScript(initializeMap);\n });\n\n function initializeMap() {\n maps.getLocations(scope.hotelPosition, null, !!scope.dealsMode)\n .then(populateMap);\n\n if (!scope.disableUpdates) {\n broker.subscribe(\n 'baseMap',\n 'UPDATEMAP',\n () => maps.getLocations(!!scope.dealsMode).then(populateMap)\n );\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('baseMap');\n });\n }\n }\n\n\n function populateMap(mapInfo) {\n const canvas = el.find('.map-canvas')[0];\n const center = mapInfo.centre;\n const zoom = parseInt(scope.zoom || 4);\n\n if (!map) {\n map = maps.buildMap(canvas, center, zoom, null, scope.thumbnail);\n }\n\n if (mapInfo.markers) {\n if (scope.thumbnail) {\n let hotelId = scope.thumbnail.activeHotel.Id;\n let hotelMarker = null;\n for (let marker of mapInfo.markers) {\n if (marker.estabId === hotelId) {\n hotelMarker = marker;\n break;\n }\n }\n map = maps.buildMap(canvas, null, zoom, hotelMarker, scope.thumbnail);\n map = maps.addMarkers(map, [hotelMarker]);\n } else {\n map = maps.addMarkers(map, mapInfo.markers);\n map.fitBounds(mapInfo.bounds);\n google.maps.event.addListenerOnce(map, 'idle', () => {\n map.fitBounds(mapInfo.bounds);\n if (scope.zoom) {\n map.setZoom(zoom);\n }\n });\n }\n }\n\n broker.subscribe('baseMap', 'hotelListUpdated', initializeMap);\n broker.subscribe('baseMap', 'mapTabSelected', initializeMap);\n scope.initialized = true;\n\n /* If the map is hidden and the window is resized we have to build it again */\n google.maps.event.clearListeners(window, 'resize');\n }\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('comboboxMkc', comboboxMkc);\n\nfunction comboboxMkc() {\n return {\n restrict: 'E',\n link: _linker,\n require: '^combobox'\n };\n\n function _linker(scope, el, attr, combobox) {\n const parentElement = combobox.element;\n const searchField = parentElement.find('input');\n const list = parentElement.find('ul');\n const pScope = scope.$parent;\n const keyBehaviours = {};\n\n searchField.on('keydown.combo', function keySelector(e) {\n const fn = keyBehaviours[e.keyCode] || angular.noop;\n fn(e);\n });\n\n list.on('mouseenter.combo', 'li', function selectItem() {\n $(this).addClass('combobox-selected');\n });\n\n list.on('mouseleave.combo', 'li', function selectItem() {\n $('.menu-list li').removeClass('combobox-selected');\n });\n\n scope.$on('$destroy', () => {\n searchField.off('keydown.combo');\n list.off('mouseenter.combo');\n list.off('mouseleave.combo');\n });\n\n keyBehaviours[9] = function tab() {\n list.hide();\n };\n\n // Return\n keyBehaviours[13] = function keyboardSelection() {\n pScope.clickHandler(_getScopeFromElement());\n };\n\n // Up arrow\n keyBehaviours[38] = _keyboardMovement(true);\n\n // Down arrow\n keyBehaviours[40] = _keyboardMovement();\n\n // Escape\n keyBehaviours[27] = function hideMenu() {\n pScope.menu = false;\n scope.$apply();\n };\n\n function _getScopeFromElement() {\n const se = $('.combobox-selected').scope();\n return se.d || {};\n }\n\n function _scrollOffset(sel) {\n const selHeight = sel.outerHeight();\n const elementTop = sel.offset() ? sel.offset().top : 0;\n const elementBottom = elementTop + selHeight;\n const listTop = list.offset() ? list.offset().top : 0;\n const listBottom = listTop + list.innerHeight();\n\n switch (true) {\n case (listTop >= elementTop):\n return -selHeight;\n case (listBottom <= elementBottom):\n return selHeight;\n default:\n return 0;\n }\n }\n\n /* direction === true -> UP\n direction == false -> DOWN */\n function _keyboardMovement(direction) {\n return () => {\n let current = list.find('.combobox-selected');\n\n current.removeClass('combobox-selected');\n current = direction ? current.prev() : current.next();\n list[0].scrollTop += _scrollOffset(current);\n\n if (!current.length) {\n const elements = list.find('li');\n const index = direction ? elements.length - 1 : 0;\n current = $(elements[index]);\n list[0].scrollTop = direction ? list[0].scrollHeight : 0;\n }\n current.addClass('combobox-selected');\n };\n }\n }\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n interface FlightSegmentInfo {\n AirportCode:string;\n FlightNumber:string;\n CarrierTradingName:string;\n }\n\n interface FlightViaInfo {\n viaflight : string;\n operatedBy : string;\n }\n\n class FlightLeg {\n\n leg: any;\n displayMixedCarrierMessage: boolean;\n displayFlightViaInfo: boolean;\n displayCodeShareInfo: boolean;\n isFlightsPage: boolean = false;\n viaInfo: FlightViaInfo[];\n mixedCarrierMessage: string;\n\n\n constructor( public resourceService:ResourceService, public $filter: any ) {\n\n this.displayFlightViaInfo = TRPCONFIG.Domain.DisplayFlightViaInfo && this.leg.Segments\n && this.leg.Segments.length > 0;\n\n this.displayMixedCarrierMessage = this.leg.IsMixedCarrier &&\n this.leg.NumberOfStops > 0 &&\n this.displayFlightViaInfo === false;\n\n this.displayCodeShareInfo = TRPCONFIG.Domain.DisplayFlightCodeshareInfo || false;\n\n this.isFlightsPage = window.location.pathname.includes('flights')\n || window.location.pathname.includes('quote');\n\n if( this.displayMixedCarrierMessage ) {\n this.mixedCarrierMessage = this.resourceService.get('OPERATEDBYMIXED');\n }\n\n if (this.displayFlightViaInfo || this.displayCodeShareInfo) {\n this.viaInfo = this.getFlightViaInfo();\n }\n\n }\n\n getNumberOfStops() {\n\n var msg = this.resourceService.get('NOSTOP');\n if( this.leg.NumberOfStops === 1 ) {\n msg = this.resourceService.get('1STOP');\n } else if( this.leg.NumberOfStops > 1 ) {\n msg = String.format(this.resourceService.get('XSTOPS'),this.leg.NumberOfStops);\n }\n return msg;\n }\n\n getFlightViaInfo():FlightViaInfo[] {\n const info: FlightSegmentInfo[] = [];\n\n angular.forEach( this.leg.Segments, (segment, i) => {\n if( segment.CodeshareAirlineName !== segment.CarrierName ) {\n let carrier = segment.CarrierTradingName;\n if (segment.CarrierTradingName === '') {\n carrier = segment.CarrierName;\n }\n\n info.push({\n AirportCode: this.leg.LegType === 'outbound'\n ? segment.DestinationAirportCode\n : segment.DepartureAirportCode,\n FlightNumber: segment.FlightNumber,\n CarrierTradingName: carrier\n });\n }\n });\n\n return info.map(item => {\n\n let tradingName = '';\n if( item.CarrierTradingName && item.CarrierTradingName !== '') {\n tradingName = item.CarrierTradingName.toLowerCase();\n }\n\n return {\n viaflight : String.format(this.resourceService.get('VIASUMMARY'),\n item.AirportCode, item.FlightNumber),\n operatedBy : String.format(this.resourceService.get('OPERATEDBYCARRIER'),\n ''+ tradingName +'')\n };\n });\n }\n }\n\n angular\n .module('core')\n .directive('flightLeg', ($filter): ng.IDirective => {\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n bindToController: {\n leg: '='\n },\n controller: FlightLeg,\n controllerAs: 'fl',\n templateUrl: 'partials/home/directivetemplate?type=FlightLeg',\n link: function (scope : ng.IScope, el : ng.IAugmentedJQuery, attr, controller : FlightLeg) {\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class FlightListing {\n\n // Attr\n flight: any;\n appliedBags: number;\n nonInfantPassengers: number;\n isFirst: boolean;\n recentlyViewed: boolean;\n signedIn: boolean;\n depositMessage: string;\n buttonType: string;\n flightButtonText: string;\n basePrice: number;\n isFlightsPage: boolean = false;\n showPrice: boolean;\n showInfo: boolean;\n showChangeFlight: boolean;\n trackingPage: string;\n showButton: boolean;\n showTax: boolean;\n showDeposit: boolean;\n showBaggage: boolean;\n flightAction: (f) => void;\n busy: boolean;\n trip: any = localStorage.getItem('trip');\n qtys: any = sessionStorage.getItem('priceQtys');\n hotel: any = sessionStorage.getItem('hotelData');\n flightsSkywards: any = sessionStorage.getItem('flightsSkywards');\n skywardsPoints: number = 0;\n flightMiles: number = 0;\n sentPayload: boolean = false;\n flightInfo: any;\n skywardsFlightMiles: any = sessionStorage.getItem('SkywardsMilesFlights');\n\n constructor(\n private basketStore: any,\n private broker: any,\n private resourceService: any,\n private $scope: any,\n private occupancyService: any,\n private basketService: any,\n private flightSearch: any,\n private analytics: any,\n private flightDetail: any,\n private brandedFareTypesService: ekh.BrandedFareTypesService,\n private guidService: Core.GuidService,\n private hotelSearch: any,\n ) {\n //update properties after flight provided ( selected flight )\n if (!this.flight) {\n this.buttonType = this.buttonType ? this.buttonType : 'select';\n const flightWatch = this.$scope.$watch('fl.flight', (value) => {\n if (value) {\n this.update();\n flightWatch();\n }\n });\n } else {\n this.update();\n }\n }\n\n update() {\n this.recentlyViewed = this.isFirst && this.flight.RecentlyViewedIndex === 1;\n this.buttonType = this.buttonType ? this.buttonType : 'select';\n this.isFlightsPage = window.location.pathname.includes('flights')\n || window.location.pathname.includes('quote');\n this.flight && this.flight.Legs && this.flight.Legs[0] ?\n this.flight.Legs[0].isFlightsPage = this.isFlightsPage : '';\n this.flight && this.flight.Legs && this.flight.Legs[1] ?\n this.flight.Legs[1].isFlightsPage = this.isFlightsPage : '';\n this.showButton = this.buttonType === 'none' ? false : true;\n this.showTax = this.showPrice && this.getTotalPrice() > 0 || false;\n this.showDeposit = this.showInfo && this.flight && this.flight.DepositAmount > 0;\n this.showBaggage = TRPCONFIG.Domain.DisplayBaggageFeesLink\n && this.flight\n && this.flight.Legs\n && this.flight.Legs.some(function (leg) { return leg.IsMixedCarrier === true; });\n }\n\n init() {\n this.depositMessage = this.signedIn\n ? this.resourceService.get('FLIGHTLISTINGDEPOSITCAPTIONSIGNEDIN')\n : this.resourceService.get('FLIGHTLISTINGDEPOSITCAPTION');\n\n this.flightButtonText = this.buttonType && this.buttonType.toLowerCase() === 'keep'\n ? this.resourceService.get('KEEPTHISFLIGHT')\n : this.resourceService.get('SELECTFLIGHTTEXT');\n }\n\n showDetails() {\n const passengers = this.occupancyService.getTotalPeopleCounts();\n this.broker.publish('showModalFlightDetails', { flight: this.flight, passengers });\n }\n\n changeFlight() {\n this.analytics.track('mixpanel', 'ChangeFlightClick');\n this.flightSearch.resetPageIndex();\n this.basketService.changeJourneyUrl(10);\n }\n\n stops(n) {\n return n === '' ? undefined : new Array(parseInt(n, 10));\n }\n\n selectFlightAction() {\n this.flightAction({ f: this.flight });\n }\n\n public async calculateSkywardsPoints(flight) {\n let trip = JSON.parse(this.trip);\n let qtys = JSON.parse(this.qtys);\n this.flightInfo = flight;\n\n if (!TRPCONFIG.Domain.FlightMiles) {\n TRPCONFIG.Domain.FlightMiles = [];\n }\n\n if (qtys === null || qtys === undefined) {\n const defaultFlightData = JSON.parse(sessionStorage.getItem('DefaultFlight') || '');\n if (defaultFlightData && defaultFlightData.Details.Itinerary.AdultFareQuantity) {\n qtys = {};\n qtys.AdultTaxQuantity = defaultFlightData.Details.Itinerary.AdultFareQuantity;\n qtys.ChildTaxQuantity = defaultFlightData.Details.Itinerary.ChildTaxQuantity;\n qtys.InfantTaxQuantity = defaultFlightData.Details.Itinerary.InfantTaxQuantity;\n }\n }\n\n if (flight && flight.Legs && flight.Legs.length) {\n let legs = flight.Legs;\n let hotel = JSON.parse(this.hotel);\n\n if (qtys && qtys.AdultTaxQuantity) {\n let adultQty = qtys.AdultTaxQuantity;\n let childQty = qtys.ChildTaxQuantity;\n let infantQty = qtys.InfantTaxQuantity;\n\n let adultTax = flight.AdultTax.Amount * adultQty;\n let childTax = flight.ChildTax.Amount * childQty;\n let infantTax = flight.InfantTax.Amount * infantQty;\n\n let totalFlightTax = adultTax + childTax + infantTax;\n let packagePrice = flight.totalHolidayPrice - totalFlightTax;\n let flightId = flight.FlightId;\n if (packagePrice && !Number.isNaN(packagePrice)) {\n if (this.sentPayload === false) {\n this.sentPayload = true;\n await this.brandedFareTypesService.payloadEntry(flightId, trip, legs, hotel, packagePrice)\n .then(result => {\n if (result[0].Miles && TRPCONFIG.Domain.FlightMiles) {\n TRPCONFIG.Domain.FlightMiles.push(result[0].Miles);\n sessionStorage.setItem('FlightMiles',\n JSON.stringify(TRPCONFIG.Domain.FlightMiles));\n this.skywardsPoints = result[0].Miles;\n this.getFlightMiles(flight, legs);\n }\n });\n }\n }\n }\n }\n }\n\n getPassengerCount() {\n const priceQtys = sessionStorage.getItem('priceQtys');\n const defaultFlight = sessionStorage.getItem('DefaultFlight');\n const defaultFlightDetails = defaultFlight ? JSON.parse(defaultFlight) : null;\n const passengers = priceQtys ? JSON.parse(priceQtys) : defaultFlightDetails ?\n defaultFlightDetails.Details.Itinerary : null;\n return {\n infantCount: passengers.InfantFareQuantity ? passengers.InfantFareQuantity : 0,\n childCount: passengers.ChildFareQuantity ? passengers.ChildFareQuantity : 0,\n adultCount: passengers.AdultFareQuantity ? passengers.AdultFareQuantity : 0\n };\n }\n\n getBasePrice() {\n const p = this.getPassengerCount();\n const storeSelectedFlight = sessionStorage.getItem('storeSelectedFlight');\n const defaultFlight = sessionStorage.getItem('DefaultFlight');\n const defaultFlightDetails = defaultFlight ? JSON.parse(defaultFlight) : null;\n const selectedFlightData = storeSelectedFlight ? JSON.parse(storeSelectedFlight) : defaultFlightDetails ?\n defaultFlightDetails.Details.Itinerary : null;\n return (\n (p.adultCount * ((selectedFlightData.LeadAdultPrice ?\n selectedFlightData.LeadAdultPrice : selectedFlightData.AdultFare.Amount)\n + (selectedFlightData.LeadAdultTax ?\n selectedFlightData.LeadAdultTax : selectedFlightData.AdultTax.Amount)))\n + (p.childCount * (selectedFlightData.ChildFare.Amount + selectedFlightData.ChildTax.Amount))\n + (p.infantCount * (selectedFlightData.InfantFare.Amount + selectedFlightData.InfantTax.Amount))\n );\n }\n\n getTotalPrice() {\n const p = this.getPassengerCount();\n return (\n (p.adultCount * (this.flight.LeadAdultPrice + this.flight.LeadAdultTax))\n + (p.childCount * (this.flight.ChildFare.Amount + this.flight.ChildTax.Amount))\n + (p.infantCount * (this.flight.InfantFare.Amount + this.flight.InfantTax.Amount))\n );\n }\n\n isHFareFlightType(): boolean {\n return this.flightDetail.isHFlightType(this.flight);\n }\n getCabinCode(cabinType) {\n switch (cabinType) {\n case 'Economy':\n return 'Y';\n case 'Premium Economy':\n return 'W';\n case 'Business':\n return 'J';\n case 'First':\n return 'F';\n default:\n return '';\n }\n }\n getDepartureCode(legs) {\n for (let i = 0; i < legs.length; i++) {\n if (legs[i].LegType === 'outbound') {\n return legs[i].DepartureAirport.Code;\n }\n }\n }\n getDestinationCode(legs) {\n for (let i = 0; i < legs.length; i++) {\n if (legs[i].LegType === 'outbound') {\n return legs[i].ArrivalAirport.Code;\n }\n }\n }\n public getFareBrandTitle(supplierfareclass) {\n switch (supplierfareclass) {\n case 'F':\n return 'First Flex Plus';\n case 'A':\n return 'First Flex';\n case 'Z':\n return 'First Others';\n case 'J':\n return 'Business Flex Plus';\n case 'C':\n return 'Business Flex Plus';\n case 'I':\n return 'Business Flex';\n case 'O':\n return 'Business Saver';\n case 'H':\n return 'Business Special';\n case 'D':\n return 'Business Others';\n case 'P':\n return 'Business Others';\n case 'W':\n return 'Premium Economy Flex Plus';\n case 'E':\n return 'Premium Economy Flex Plus';\n case 'N':\n return 'Premium Economy Others';\n case 'Y':\n return 'Economy Flex Plus';\n case 'R':\n return 'Economy Flex Plus';\n case 'M':\n return 'Economy Flex';\n case 'B':\n return 'Economy Flex';\n case 'U':\n return 'Economy Flex';\n case 'K':\n return 'Economy Flex';\n case 'Q':\n return 'Economy Saver';\n case 'L':\n return 'Economy Saver';\n case 'T':\n return 'Economy Saver';\n case 'X':\n return 'Economy Special';\n case 'V':\n return 'Economy Saver';\n case 'G':\n return 'Economy Others';\n case 'S':\n return 'Economy Others';\n default:\n return '';\n }\n\n }\n\n public async getFlightMiles(flight, legs) {\n let origin = this.getDepartureCode(legs);\n let destination = this.getDestinationCode(legs);\n let spplierClassFirstLeg = flight.Legs[0].Segments[0].SupplierFareClass;\n let spplierClassSecondLeg = flight.Legs[1].Segments[0].SupplierFareClass;\n let getBrandTitleFirstLeg = this.getFareBrandTitle(spplierClassFirstLeg);\n let getBrandTitleSecondLeg = this.getFareBrandTitle(spplierClassSecondLeg);\n\n let legsAreNotEmpty = getBrandTitleFirstLeg !=='' && getBrandTitleSecondLeg !=='';\n let firstLegEqualsSecondLeg = legsAreNotEmpty && getBrandTitleFirstLeg === getBrandTitleSecondLeg;\n\n this.brandedFareTypesService.getFareInfo(legsAreNotEmpty, firstLegEqualsSecondLeg, this.skywardsFlightMiles,\n flight, this.hotelSearch, origin, destination, getBrandTitleFirstLeg, getBrandTitleSecondLeg);\n }\n }\n angular\n .module('core')\n .directive('flightListing', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n transclude: true,\n bindToController: {\n flight: '=',\n appliedBags: '=',\n nonInfantPassengers: '=',\n isFirst: '=',\n signedIn: '=',\n buttonType: '@',\n flightAction: '&',\n showPrice: '=',\n basePrice: '@',\n showInfo: '=',\n showChangeFlight: '=',\n trackingPage: '=',\n busy: '='\n },\n controller: FlightListing,\n controllerAs: 'fl',\n templateUrl: 'partials/home/directivetemplate?type=FlightListing',\n\n link: function (scope: ng.IScope, el: ng.IAugmentedJQuery, attr, controller: FlightListing) {\n controller.init();\n }\n\n };\n\n });\n\n}\n","'use strict';\n\nnamespace Core {\n\n class FlightStops {\n\n stops: string;\n\n public getStops() {\n return this.stops === '' ? undefined : new Array(parseInt(this.stops, 10));\n }\n }\n\n angular\n .module('core')\n .directive('flightStops', (): ng.IDirective => {\n\n return {\n scope: {},\n restrict: 'E',\n replace: true,\n bindToController: {\n stops: '@'\n },\n controller: FlightStops,\n controllerAs: 'fs',\n template: '
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            '\n\n };\n\n });\n}\n","(function() {\n 'use strict';\n\n angular\n .module('core')\n .directive('infoWindow', infoWindow);\n\n function infoWindow(\n $location,\n $routeParams,\n $filter,\n broker,\n preferences,\n occupancyService,\n resourceService,\n tripService,\n basketService,\n currentDestination,\n windowUtil,\n pageStrand,\n urlUtils,\n holidayDeals,\n hotelService) {\n // TODO this is a hack to let TR have a uniqiue template. The template needs to be an embedded string or\n // else the info window has a loading delay and can fail to load altogether on some devices.\n\n const viewHotelButton = `\n `;\n\n const templatesByTenant = {\n 1: `\n
            \n
            \n
            \n
            \n

            \n \n {{ ::hotel.Title }}\n {{ ::(hotel.Name || hotel.Title) }}\n \n {{ ::(hotel.Name || hotel.Title) }}\n

            \n
              \n
            • \n \n 0\">\n \n {{ ::hotel.CustomerRating }}\n {{ ::hotel.CustomerRatingTitle }}\n ({{ ::hotel.CustomerRatingCount }} {{ ::reviewString }})\n \n \n
            • \n
            • \n
              \n \n \n {{ hotel.OriginalCostStr }}\n \n \n \n {{hotel.displayPrice}}\n \n
              \n
            • \n
            \n
            \n ${viewHotelButton}\n
            \n
            `\n };\n const templateFallback = `\n
            \n
            \n \n
            \n
            \n

            \n \n {{ ::hotel.Title }}\n {{ ::(hotel.Name || hotel.Title) }}\n \n {{ ::(hotel.Name || hotel.Title) }}\n \n

            \n
            \n {{ ::hotel.AcomType }} | {{ ::hotel.Address }}\n
            \n \n
            0\">\n {{ ::hotel.CustomerRating }} \n {{ ::hotel.CustomerRatingTitle }} \n \n ({{ ::hotel.CustomerRatingCount }} {{ ::reviewString }})\n \n
            \n
            {{ hotel.displayPrice }}
            \n ${viewHotelButton}\n
            \n
            `;\n\n return {\n restrict: 'E',\n scope: true,\n template: templatesByTenant[TRPCONFIG.Domain.TenantId] ? templatesByTenant[TRPCONFIG.Domain.TenantId] : templateFallback,\n link\n };\n\n function link(scope) {\n const isTrip = !!$routeParams.tripId;\n const nonInfants = occupancyService.getNumberOfNonInfantPassengers();\n\n preferences.get('priceMode').then(pm => _calculatePrice(pm));\n tripService.usePackageRates().then(packagePrice => scope.PackagePrice = packagePrice);\n _setHotelId($routeParams.estabId);\n scope.inlineStarsEnabled = TRPCONFIG.Domain.InlineStarsEnabled;\n scope.hotelImage = { 'background-image': `url(${scope.hotel.ImageUrl})` };\n\n scope.reviewString = resourceService.get(\n scope.hotelCustomerRatingCount > 1 ? 'HOTELREVIEWS' : 'HOTELREVIEW'\n );\n\n scope.displayReviews = TRPCONFIG.Domain.ReviewsEnabled;\n\n broker.subscribe(\n `infoWindow${scope.$id}`,\n 'priceModeChanged',\n e => _calculatePrice(e.data)\n );\n\n scope.$on('$destroy', () => {\n broker.unsubscribe(`infoWindow${scope.$id}`);\n });\n\n if (isTrip) {\n _setHotelId($routeParams.estabId);\n scope.selectButton = resourceService.get('SELECTHOTELTEXT');\n scope.selectHotel = _selectTripHotel;\n } else if (scope.dealsMode) {\n scope.selectButton = resourceService.get('SHOWDEALS');\n scope.selectHotel = () => _getDeals(scope.hotel);\n } else {\n scope.selectButton = resourceService.get('VIEWDETAILS');\n scope.selectHotel = _selectLandingHotel;\n currentDestination.getCurrentDestination().then(dest => {\n _setHotelId(dest.EstablishmentId);\n });\n }\n\n function _setHotelId(id) {\n scope.pageHotelId = id || null;\n }\n\n function _calculatePrice(pm) {\n const costValue = pm === 0 ?\n scope.hotel.MinCost / nonInfants :\n scope.hotel.MinCost;\n\n if (costValue) {\n scope.hotel.displayPrice = $filter('roundedCurrency')(costValue);\n }\n }\n\n function _selectTripHotel(h) {\n tripService.getTrip($routeParams.tripId).then(trip => {\n basketService.selectHotel(trip.TripId, h, trip.BasketId);\n hotelService.trackHotelClick(\n _.get(h, 'Id'),\n undefined,\n undefined,\n undefined,\n _.get(trip, 'HotelsRequest.AvailabilitySearchId')\n );\n });\n }\n\n function _getDeals(hotel) {\n holidayDeals\n .getDealsFromMap(hotel.Id)\n .then(hotelWithDeals => {\n if (!hotelWithDeals) { return; }\n hotel.HolidayDeals = hotelWithDeals.HolidayDeals;\n hotel.TransferTimes = hotelWithDeals.TransferTimes;\n hotel.Airports = hotelWithDeals.Airports;\n broker.publish('SHOWDEALS', { hotel: holidayDeals.enrichHotel(hotel) });\n });\n }\n\n function _selectLandingHotel(h) {\n currentDestination.getCurrentDestination().then(dest => {\n const url = urlUtils.stripLeadingSlash(\n pageStrand.adjustUrl(urlUtils.appendExistingQueryString(h.Url), dest.PageStrand)\n );\n if (TRPCONFIG.DeviceSettings.OpenHotelInNewWindow) {\n windowUtil.open(url);\n } else {\n $location.path(url);\n }\n });\n }\n }\n }\n })();\n\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('lightboxMap', lightboxMap);\n\nfunction lightboxMap(maps, broker) {\n const template = `\n \n
            \n
            \n `;\n\n return {\n restrict: 'E',\n scope: {\n zoom: '@',\n dealsMode: '@'\n },\n template,\n link\n };\n\n function link(scope, el) {\n let map = null;\n let data = {};\n\n broker.subscribe('lightboxMap', 'MAPLIGHTBOX', e => {\n data = e.data;\n maps.loadScript(initializeMap);\n });\n\n function initializeMap() {\n displayModal(true);\n displayLoader(true);\n\n let centre = {\n lat: data.hotel.lat || data.hotel.Latitude,\n lon: data.hotel.lon || data.hotel.Longitude,\n };\n\n maps.getLocations(null, centre, !!scope.dealsMode, data.showInfoWindow)\n .then(result => { populateMap(result); });\n }\n\n function populateMap(mapInfo) {\n let selectedMarker = null;\n if (mapInfo.markers) {\n selectedMarker = _.find(mapInfo.markers, x => x.estabId === data.hotel.Id);\n }\n\n const canvas = el.find('.map-canvas');\n const zoom = parseInt(scope.zoom);\n\n const mapRendered = scope.$watch(() => canvas.height(), v => {\n if (v && v !== 100) {\n map = maps.buildMap(\n canvas[0],\n mapInfo.centre,\n zoom,\n selectedMarker\n );\n map = maps.addMarkers(map, mapInfo.markers, selectedMarker, mapInfo.infoWindow);\n\n mapRendered();\n }\n });\n\n scope.close = onClose;\n displayLoader(false);\n }\n\n function onClose() {\n displayModal(false);\n }\n\n function displayModal(value) {\n scope.showModal = value;\n }\n\n function displayLoader(value) {\n scope.loadingMap = value;\n }\n\n scope.$on('$destroy', () => {\n broker.unsubscribe('lightboxMap');\n });\n }\n}\n})();\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .directive('lightboxMapTrigger', lightboxMapTrigger);\n\nfunction lightboxMapTrigger(broker) {\n return {\n restrict: 'A',\n replace: true,\n scope: {\n element: '=',\n searchId: '@',\n showInfoWindow: '@'\n },\n link\n };\n\n function link(scope, el) {\n const showInfoWindow = scope.showInfoWindow !== 'false';\n\n el.on('click', () => {\n broker.publish('MAPLIGHTBOX', {\n hotel: scope.element,\n searchId: scope.searchId,\n showInfoWindow\n });\n });\n\n scope.$on('$destroy', function() {\n el.off('click');\n });\n }\n}\n})();\n","'use strict';\n\nnamespace Core {\n\n class ModalParkingDetails {\n\n Details:any;\n airport:string;\n dropOffDate:string;\n pickUpDate:string;\n\n constructor(private $scope: ng.IScope, private modalService:any){\n\n this.Details = modalService.get('details');\n this.airport = modalService.get('airport');\n this.dropOffDate = modalService.get('dropOffDate');\n this.pickUpDate = modalService.get('pickUpDate');\n }\n }\n\n angular\n .module('core')\n .directive('parkingDetails', (): ng.IDirective => {\n\n return {\n scope: {},\n controller: ModalParkingDetails,\n controllerAs: 'pd',\n templateUrl: (elem, attr) => {\n return `partials/booking/template?name=ParkingDetails&version=${attr.templateVersion}`;\n }\n };\n });\n\n}\n","(function() {\n'use strict';\n\nangular\n .module('core')\n .factory('maps', maps);\n\nfunction maps(\n $window,\n $timeout,\n $rootScope,\n $compile,\n $routeParams,\n $q,\n hotelCoordinates,\n hotelRehydrator,\n holidayDeals,\n tripService) {\n const MAX_ZOOM = 1;\n\n let isMapReady = false;\n let isDealsMode = false;\n\n return {\n loadScript,\n getLocations,\n buildMap,\n addMarkers\n };\n\n function loadScript(mapLoadedCb) {\n if (TRPCONFIG.IsBot) { return; }\n\n // if the script is loading go in polling mode...\n if ($window.TRPMAPS && !isMapReady) {\n return _pollingForMap(mapLoadedCb);\n }\n\n // ...if script is loaded just callback..\n if ($window.TRPMAPS && isMapReady) {\n return mapLoadedCb();\n }\n\n // ...actually load the script for maps\n $window.TRPMAPS = _.bind(_mapLoaded, {}, mapLoadedCb);\n\n const script = `