{"version":3,"sources":["wwwroot/scripts/templates/evotrip/evo.Trip.App.js","wwwroot/scripts/templates/evotrip/bookingController.js","wwwroot/scripts/templates/evotrip/cartService.js","wwwroot/scripts/templates/evotrip/travelerService.js","wwwroot/scripts/templates/evotrip/tripInformationService.js","wwwroot/scripts/templates/evotrip/numeralCurrency.js","wwwroot/scripts/templates/shared/services/regionService.js"],"names":["ng","module","config","$locationProvider","html5Mode","enabled","requireBase","rewriteLinks","angular","controller","$scope","$window","$location","cartService","travelerService","tripInformationService","status","loading","submitted","hasErrors","soldOut","unavailable","response","model","CoreTaxonomyNodeId","CustomerReferral","ItemId","ProductId","QuestionsAndConcerns","RelativePath","TripName","Travelers","WaiverAccepted","BrandName","updateTripInformation","tripId","location","hash","split","pop","relativePath","pathname","startsWith","replace","get","then","trip","TripReason","SKU","Name","Inventory","Unavailable","$","toggleClass","text","MSRP","Price","formatPrice","loadTripInformation","price","affirmBookingBox","affirmPageBottom","document","getElementById","attr","parseFloat","toFixed","DisplayAffirm","style","display","affirmDisplay","updateEvoTripAffirmBooking","length","dataLayerManager","pushTripView","affirm","ui","ready","refresh","amount","numeral","format","each","$tile","this","data","addClass","addTraveler","push","getNewTraveler","removeTraveler","index","splice","onSubmit","action","selector","$form","removeData","validator","unobtrusive","parse","reparseForm","valid","OriginalPrice","CurrentPrice","TotalCost","TripDate","Date","book","result","fetchCart","cart","items","itemsToTrack","map","item","Brand","brandName","CoreTax","category","ImageUrl","imageUrl","productName","productDetailsRelativePath","sku","Quantity","quantity","addedItem","$value","total","AddedItemProductName","AddedItemProductID","AddedItemSKU","AddedItemCoreTaxId","AddedItemRelativePath","AddedItemPrice","AddedItemIsTrip","AddedItemTripDate","Items","klaviyo","catch","remove","path","ApplicationPath","href","$modal","offsetModal","offset","top","offsetMessage","first","closest","animate","scrollTop","on","$apply","factory","$http","CART_SERVICE_BASE","CARTDATA_SERVICE_BASE","booking","post","ArrivingSoonerOrStayingLater","Birthdate","DietaryRestrictions","EmailAddress","FirstName","Gender","InstagramHandle","LastName","NeedsRentalEquipment","PhoneNumber","PrefersSingleRoom","TravelMethod","TravelPartner","EVOTRIP_SERVICE_BASE","getValueOrDefault","object","key","defaultValue","$tripInfo","deposit","isNaN","DepositAmount","RetailPrice","err","filter","$q","REGION_SERVICE_BASE","countries","regionsByCountry","cityRegions","fetchCityRegion","country","postalCode","resolve","reject","params","countryCode","fetchRegionsByCountry","fetchCountries"],"mappings":"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","file":"evotripform.min.js","sourcesContent":["// Define Angular modules for evo.Trip.App\n// Extended in other files.\n(function (ng) {\n ng.module('evo.Trip.Services', []);\n ng.module('evo.Trip.Controllers', []);\n ng.module('evo.Trip.Filters', []);\n ng.module('evo.Shared.Services', []);\n ng.module('evo.Trip.App', ['evo.Trip.Filters', 'evo.Trip.Controllers', 'evo.Trip.Services', 'evo.Shared.Services'\n ]).config(['$locationProvider', function ($locationProvider) {\n $locationProvider.html5Mode({\n enabled: true, requireBase: false, rewriteLinks: false\n });\n }]);\n})(angular);","(function (ng) {\n /// \n /// Controller for evo trip booking form\n /// \n /// angular $scope\n /// Service for retrieving travelers\n /// Service for retrieving evo trip details\n ng.module('evo.Trip.Controllers').controller('bookingController', [\n '$scope',\n '$window',\n '$location',\n 'cartService',\n 'travelerService',\n 'tripInformationService',\n function (\n $scope,\n $window,\n $location,\n cartService,\n travelerService,\n tripInformationService\n ) {\n var FORM_SELECTOR = 'form[name=bookForm]',\n status = {\n loading: false,\n submitted: false,\n hasErrors: false,\n soldOut: false,\n unavailable: false,\n response: ''\n },\n model = {\n CoreTaxonomyNodeId: 0,\n CustomerReferral: '',\n ItemId: 0,\n ProductId: 0,\n QuestionsAndConcerns: '',\n RelativePath: '',\n TripName: '',\n Travelers: [],\n WaiverAccepted: false,\n BrandName: ''\n },\n selectors = {\n tripTile: '.js-trip-tile'\n };\n\n $(selectors.tripTile).each(function () {\n var $tile = $(this);\n var tripId = $tile.data('tripId');\n tripInformationService.get(tripId).then(function (response) {\n $tile.data('inventory', response.Inventory);\n\n // Prioritize unavailable messaging over sold out messaging\n if (response.Unavailable) {\n $tile.addClass('unavailable');\n } else if (response.Inventory === 0) {\n $tile.addClass('sold-out');\n }\n });\n });\n\n // Get the SKU for the currently selected trip\n function updateTripInformation() {\n var tripId = $window.location.hash.split('#').pop();\n if (tripId) {\n loadTripInformation(tripId).then(function (response) {\n if (response) {\n updateEvoTripAffirmMessaging($scope.trip.Price);\n updateEvoTripAffirmBooking(\n $scope.trip.Price * model.Travelers.length\n );\n dataLayerManager.pushTripView(response.SKU, response);\n }\n if ($scope.trip.DisplayAffirm) {\n affirm.ui.ready(function () {\n affirm.ui.refresh();\n });\n }\n });\n }\n }\n\n // function that updates the affirm price on booking form\n function updateEvoTripAffirmBooking(price) {\n var affirmDisplay = document.getElementById('evotrip-affirm-booking');\n\n if (!affirmDisplay) {\n return;\n }\n\n $(affirmDisplay).attr('data-amount', parseFloat(price * 100).toFixed());\n if (!$scope.trip.DisplayAffirm || price < 50) {\n affirmDisplay.style.display = 'none';\n } else {\n affirmDisplay.style.display = 'block';\n }\n }\n\n // function that updates the affirm promotion messaging\n function updateEvoTripAffirmMessaging(price) {\n var affirmBookingBox = document.getElementById(\n 'evotrip-affirm-buy-box'\n );\n var affirmPageBottom = document.getElementById(\n 'evotrip-affirm-page-bottom'\n );\n\n if (!affirmBookingBox) {\n return;\n }\n\n $(affirmBookingBox).attr(\n 'data-amount',\n parseFloat(price * 100).toFixed()\n );\n $(affirmPageBottom).attr(\n 'data-amount',\n parseFloat(price * 100).toFixed()\n );\n if (\n !$scope.trip.DisplayAffirm ||\n price < 50 ||\n status.soldOut ||\n status.unavailable\n ) {\n affirmBookingBox.style.display = 'none';\n affirmPageBottom.style.display = 'none';\n } else {\n affirmBookingBox.style.display = 'block';\n affirmPageBottom.style.display = 'block';\n }\n }\n\n // Get trip details for the specified sku\n function loadTripInformation(tripId) {\n var relativePath = $window.location.pathname.startsWith('/en-ca/')\n ? $window.location.pathname.replace('/en-ca', '')\n : $window.location.pathname;\n return tripInformationService.get(tripId).then(function (trip) {\n if (trip) {\n $scope.trip = trip;\n model.CoreTaxonomyNodeId = trip.CoreTaxonomyNodeId;\n model.CustomerReferral = trip.TripReason;\n model.ItemId = trip.ItemId;\n model.ProductId = trip.ProductId;\n model.RelativePath = relativePath;\n model.SKU = trip.SKU;\n model.TripName = trip.Name;\n model.BrandName = trip.BrandName;\n status.soldOut = !trip.Inventory || trip.Inventory <= 0;\n status.unavailable = trip.Unavailable;\n\n $('.js-trip-buy-box').toggleClass(\n 'unavailable',\n status.unavailable\n );\n $('.js-trip-buy-box').toggleClass(\n 'sold-out',\n status.soldOut && !status.unavailable\n );\n\n // Set buy box pricing\n $('.js-trip-original-price').text(\n trip.MSRP === trip.Price ? '' : formatPrice(trip.MSRP)\n );\n $('.js-trip-actual-price').text(formatPrice(trip.Price));\n return trip;\n }\n });\n }\n\n // Function to format a dollar amount into a price string\n function formatPrice(amount) {\n return numeral(amount).format();\n }\n\n // Re-parse the form validation and display errors\n function reparseForm(selector) {\n var $form = $(selector)\n .removeData('validator')\n .removeData('unobtrusiveValidation');\n $.validator.unobtrusive.parse($form);\n return $form;\n }\n\n // Add a new traveler\n $scope.addTraveler = function () {\n model.Travelers.push(travelerService.getNewTraveler());\n updateTripInformation();\n };\n\n // Remove the traveler at index\n $scope.removeTraveler = function (index) {\n model.Travelers.splice(index, 1);\n updateTripInformation();\n };\n\n // When submitting the form, validate data\n $scope.onSubmit = function (action) {\n var $form = reparseForm(FORM_SELECTOR);\n if (!$form.valid()) {\n var $modal = $('#dynamic-modal'),\n offsetModal = $modal.offset().top,\n offsetMessage = $('.error-message:visible')\n .first()\n .closest('.js-input-section')\n .offset().top;\n\n $modal.animate({\n scrollTop: offsetMessage + $modal.scrollTop() - offsetModal\n });\n return;\n }\n\n model.OriginalPrice = $scope.trip.OriginalPrice;\n model.CurrentPrice = $scope.trip.Price;\n model.TotalCost = model.CurrentPrice * model.Travelers.length;\n model.TripDate = $scope.trip.Date;\n status.loading = true;\n\n\n cartService.book(model)\n .then(function (result) {\n if (result === false) {\n status.hasErrors = true;\n status.loading = false;\n } else {\n status.submitted = true;\n status.hasErrors = false;\n status.loading = false;\n\n // Need to fetch cart to get existing items for klaviyo added to cart event\n return cartService.fetchCart()\n .then\n (function (cart) {\n var cartItems = {};\n if (cart.items) {\n cartItems = cart.items;\n var itemsToTrack = cartItems.map((item) => {\n return {\n \"Brand\": item.brandName,\n \"CoreTax\": item.category,\n \"ImageUrl\": item.imageUrl,\n \"Name\": item.productName,\n \"Price\": item.price,\n \"RelativePath\": item.productDetailsRelativePath,\n \"SKU\": item.sku,\n \"Quantity\": item.quantity\n };\n });\n }\n var addedItem = {\n \"$value\": cart.total,\n \"AddedItemProductName\": model.TripName,\n \"AddedItemProductID\": model.ProductId,\n \"AddedItemSKU\": model.SKU,\n \"AddedItemCoreTaxId\": model.CoreTaxonomyNodeId,\n \"AddedItemRelativePath\": model.RelativePath,\n \"AddedItemPrice\": model.Price,\n \"AddedItemIsTrip\": true,\n \"AddedItemTripDate\": model.TripDate,\n \"Items\": itemsToTrack\n };\n\n klaviyo.push([\"track\", \"Added to Cart\", addedItem]);\n })\n .catch(() => { \n // Ignore errors fetching cart or tracking event \n });\n }\n })\n .then(function () {\n // close booking modal\n $('#dynamic-modal').remove();\n\n // redirect page to checkout or cart\n let path = $.ApplicationPath();\n\n path += '/cart';\n $window.location.href = path;\n })\n .catch(() => {\n status.hasErrors = true;\n status.loading = false;\n });\n };\n\n // There should always be at least 1 traveler\n $scope.addTraveler();\n\n $scope.model = model;\n $scope.status = status;\n\n $($window).on('hashchange', function () {\n updateTripInformation();\n $scope.$apply();\n });\n updateTripInformation();\n }\n ]);\n})(angular);\n","(function (ng) {\n /// \n /// Service for the evoTrip booking controller to use for interacting with the cart\n /// \n ng.module('evo.Trip.Services').factory('cartService', ['$http', 'CART_SERVICE_BASE', 'CARTDATA_SERVICE_BASE', function ($http, CART_SERVICE_BASE, CARTDATA_SERVICE_BASE) {\n return {\n book: function (booking) {\n return $http.post(CART_SERVICE_BASE + 'addevotripitems', booking).then(function (response) {\n return response.data;\n });\n },\n fetchCart: function() {\n return $http.get(CARTDATA_SERVICE_BASE + 'cart').then(function (response) {\n return response.data;\n });\n }\n };\n }]);\n})(angular);","(function (ng) {\n /// \n /// Service to return evo trip Traveler objects.\n /// May be expanded in the future to fetch existing travelers\n /// \n ng.module('evo.Trip.Services').factory('travelerService', [function () {\n return {\n getNewTraveler: function () {\n return {\n ArrivingSoonerOrStayingLater: false,\n Birthdate: null,\n CustomerReferral: '',\n DietaryRestrictions: '',\n EmailAddress: '',\n FirstName: '',\n Gender: '',\n InstagramHandle: '',\n LastName: '',\n NeedsRentalEquipment: false,\n PhoneNumber: '',\n PrefersSingleRoom: false,\n QuestionsAndConcerns: '',\n TravelMethod: '',\n TravelPartner: ''\n }\n }\n };\n }]);\n})(angular);","(function (ng) {\n /// \n /// Service to fetch Evo Trip details\n /// \n ng.module('evo.Trip.Services').factory('tripInformationService', ['$http', 'EVOTRIP_SERVICE_BASE', function ($http, EVOTRIP_SERVICE_BASE) {\n function getValueOrDefault(object, key, defaultValue) {\n return object != null && object[key] != null ? object[key] : defaultValue;\n }\n\n return {\n /// \n /// Get information for the specified tripId\n /// \n /// the trip to fetch information for\n get: function (tripId) {\n var $tripInfo = $('[data-trip-id=' + tripId + ']'),\n deposit = parseFloat($tripInfo.data('dp'));\n\n if (isNaN(deposit) || deposit < 0)\n deposit = 0.00;\n // Get trip inventory for the specified sku and return trip information\n return $http.get(EVOTRIP_SERVICE_BASE + $tripInfo.data('sku')).then(function (result) {\n return {\n BrandName: getValueOrDefault(result.data, 'BrandName', ''),\n CoreTaxonomyNodeId: getValueOrDefault(result.data, 'CoreTaxonomyNodeId', 0),\n Date: getValueOrDefault(result.data, 'Date', $tripInfo.data('trip-date')),\n DepositAmount: getValueOrDefault(result.data, 'DepositAmount', deposit),\n Inventory: getValueOrDefault(result.data, 'Inventory', 0),\n Unavailable: $tripInfo.data('trip-unavailable') === 'True',\n ItemId: getValueOrDefault(result.data, 'ItemId', 0),\n MSRP: getValueOrDefault(result.data, 'MSRP', 0),\n Name: getValueOrDefault(result.data, 'Name', $tripInfo.data('trip-name')),\n OriginalPrice: getValueOrDefault(result.data, 'OriginalPrice', 0),\n Price: getValueOrDefault(result.data, 'Price', 0),\n ProductId: getValueOrDefault(result.data, 'ProductId', 0),\n RetailPrice: getValueOrDefault(result.data, 'RetailPrice', 0),\n SKU: getValueOrDefault(result.data, 'SKU', $tripInfo.data('sku')),\n DisplayAffirm: getValueOrDefault(result.data, 'DisplayAffirm', false)\n };\n }, function (err) {\n return {\n BrandName: '',\n CoreTaxonomyNodeId: 0,\n Date: $tripInfo.data('trip-date'),\n DepositAmount: deposit,\n Inventory: 0,\n Unavailable: $tripInfo.data('trip-unavailable') === 'True',\n ItemId: 0,\n MSRP: 0,\n Name: $tripInfo.data('trip-name'),\n OriginalPrice: 0,\n Price: 0,\n ProductId: 0,\n RetailPrice: 0,\n SKU: $tripInfo.data('sku'),\n DisplayAffirm: false\n };\n });\n }\n };\n }]);\n})(angular);","(function (ng) {\n ng.module('evo.Trip.Filters').filter('numeralCurrency', function () {\n return function (price) {\n return numeral(price).format();\n };\n });\n})(angular);","(function (ng) {\n /// The address service that retrieves information about states and countries.\n /// \n ng.module('evo.Shared.Services').factory('regionService', ['$http', '$q', 'REGION_SERVICE_BASE',\n function ($http, $q, REGION_SERVICE_BASE) {\n var regionsByCountry = {};\n var countries;\n var cityRegions = {};\n return {\n fetchCityRegion: function (country, postalCode) {\n return $q(function (resolve, reject) {\n if (cityRegions[country] && cityRegions[country][postalCode]) {\n resolve(cityRegions[country][postalCode]);\n } else {\n $http.get(REGION_SERVICE_BASE + 'fetch-city-region', { params: { countryCode: country, postalCode: postalCode } }).then(function (result) {\n cityRegions[country] = {};\n cityRegions[country][postalCode] = result.data;\n resolve(result.data);\n });\n }\n });\n },\n fetchRegionsByCountry: function (country) {\n return $q(function (resolve, reject) {\n if (regionsByCountry[country]) {\n resolve(regionsByCountry[country]);\n } else {\n $http.get(REGION_SERVICE_BASE + 'fetch-by-country', { params: { countryCode: country } }).then(function (result) {\n regionsByCountry[country] = result.data;\n resolve(result.data);\n });\n }\n });\n },\n fetchCountries: function () {\n return $q(function (resolve, reject) {\n if (countries && countries.length) {\n resolve(countries);\n } else {\n return $http.get(REGION_SERVICE_BASE + 'fetch-countries').then(function (result) {\n countries = result.data;\n resolve(result.data);\n });\n }\n });\n }\n };\n }\n ]);\n})(angular);"]}