{"version":3,"file":"tickets-2.0.26.min.js","sources":["walt-disney-world/cogs/js/tickets-2.0.26.min.js"],"sourcesContent":["// Functions for Walt Disney World searches; v2.0.21\n// Author: Tom Nelson, Nov 2021\nvar noStockDates = typeof stock !== 'undefined' && stock ? JSON.parse(stock) : {};\nvar noCapacityDates = typeof capacities !== 'undefined' && capacities ? JSON.parse(capacities) : [];\n\nvar noCapacityInSelectedDate = false;\nvar noStockInSelectedDate = false;\nvar exception14Days = false;\nvar selectionValid = true;\nvar priceDisplayed;\n\nvar getSeasonalPrice = function(age, date, duration) {\n var selectedDateFormatted = moment(date);\n var seasonalOfferEndFormatted = typeof seasonalofferend !== 'undefined' && moment(seasonalofferend, 'DD/MM/YYYY');\n var isOfferAvailableSelectedYear = seasonalOfferEndFormatted && selectedDateFormatted.year() === seasonalOfferEndFormatted.year();\n\n if (isOfferAvailableSelectedYear && selectedDateFormatted.isAfter(seasonalOfferEndFormatted) && duration === 14) {\n return window['offseason' + age + selectedDateFormatted.year() + '14'];\n }\n return window[age + selectedDateFormatted.year() + duration];\n}\n// -------------------------------------------------------------------------------------------------------------------\nvar waterParksOpenDate = '20210306';\nvar waterParksAccepted = false;\n\n// Store active year (Ultimate)\nvar activeyear;\n\n// Store active date and duration (Delta)\nvar activedate = $('#date').val();\nvar activeduration;\nvar activetype;\n\n// Get current/next year\nvar currentyear = new Date().getFullYear()\nvar nextyear = currentyear + 1\n\n// Determine if 2-Day ticket is on sale\nvar twoday = ($('#tickets').attr('data-ticket') == 'true');\n\n// Determine if user is a travel agent\nvar agent = ($('body').attr('data-agent') == 'true');\n\n// Determine ticket product\nvar magicyourway = false;\nvar delta = false;\nvar magic = false;\n\n// MYW/Delta (EMEA) and Magic (UK & Ireland) share % of UI, so all are TPT (Theme Park Tickets) vs. Ulitmate (UK & Ireland)\nvar tpt = true;\n\n// Check ticketproduct value from page\nswitch (ticketproduct) {\n // Magic Your Way (EMEA)\n case 'myw':\n magicyourway = true;\n break;\n // Delta (EMEA, post Oct '18)\n case 'delta':\n delta = true;\n break;\n // Magic (UK & Ireland, post Nov '21)\n case 'magic':\n magic = true;\n break;\n // Ultimate (UK & Ireland)\n default:\n tpt = false;\n break;\n}\n\n// Which date input method are we using?\nvar dateinput;\n// Varies by ticket product\nif (delta||magic) { dateinput = 'calendar' } // Delta/Magic use calendar for all devices\nelse { dateinput = 'menu' } // MYW/Ultimate use drop menus\n\n// Arrays to store core/buffer dates and prices (Delta only)\nvar coreDates = [];\nvar bufferDates = [];\nvar pricingCache = [];\n\n// Delta pricing API\nvar ticketsAPI = '/walt-disney-world/api/tickets/price/'\n\n// Delta pricing API use jQuery AJAX, so set 4s timeout on calls\n$.ajaxSetup({ timeout: 4000 }); // Milliseconds\n\nvar giftCardModalForceContinue = false;\n\n// -------------------------------------------------------------------------------------------------------------------\n\n// Manage tickets based on input values\n\n// Manage tappable guest selection (Delta)\nfunction selectguests(tap) {\n\n // Find .selector wrapper\n var selector = tap.closest('.selector');\n\n // Plus or minus?\n var action = tap.attr('data-modify');\n\n var sum = selectedGuestCount();\n\n if (action == 'plus') {\n if (sum + 1 > 10) {\n setModalForTicketsMaxPassengersError();\n return;\n }\n }\n else {\n if (sum - 1 > 10) {\n setModalForTicketsMaxPassengersError();\n return;\n }\n }\n\n // Find associated form input and display count\n var input = selector.find('input');\n var count = selector.find('.count');\n // Get current value, maximum, minimum\n var value = input.val();\n var minimum = parseInt(input.attr('min'));\n var maximum = parseInt(input.attr('max'));\n\n // Increment/decrement\n switch (action) {\n // Increment\n case 'plus':\n value++\n break;\n // Decrement\n case 'minus':\n value--\n break;\n }\n // Values within limits?\n if ((value >= minimum) && (value <= maximum)) {\n // Within limits so update\n input.val(value).change(); // Programtically fire 'change' event to force tickets() function\n count.html(value);\n }\n}\n\n// Toggle entitlements panel (mobile)\nfunction entitlements(panel) {\n panel.toggleClass('open'); panel.find('a.norgie').toggleClass('open'); panel.find('.grid, .icons').slideToggle(); // Toggle\n}\n\n// 2-Day ticket is off-sale for following year\nfunction offsale() {\n // Show alert\n warning(literal('2-day-ticket-title'), literal('2-day-ticket-message', {\n twoDayStart: moment(twodaystart).format('Do MMMM YYYY'),\n twoDayEnd: moment(twodayend).format('Do MMMM YYYY')\n }));\n}\n\n// Display overlay when dynamic pricing API cannot connect; user can disimss\nfunction connectivity() {\n // Dialog is dismissable\n dismissable = true;\n $('#dialog').addClass('dismissable');\n // Track in GA\n GA.sendEvent( 'Book', 'Enquiry', 'API Connectivity');\n // Add request class to dialog\n $('#dialog').addClass('request has-image');\n // Show dialog\n modal('#connectivity', false);\n}\n\n// Check for offers against active pricing\nfunction offers(selectedDate, featured) {\n // Check if 7 and 14 day adult tickets are the same price\n var seven = getSeasonalPrice('adult', selectedDate, 7);\n var fourteen = getSeasonalPrice('adult', selectedDate, 14);\n\n // Setup variable\n var message\n // Set offer message\n if (seven == fourteen) {\n // 14 for 7 offer (featured on desktop)\n if (featured) {\n message = literal('special-offer')\n } else {\n message = offer\n }\n // Best selling (featured on desktop)\n } else {\n if (featured) {\n message = literal('best-selling')\n } else {\n message = popular\n }\n }\n // Return\n return message\n}\n\n// Paint calendar to show low/mid/high seasonal pricing\nfunction seasons(date) {\n // beforeShowDay must return an array with selectable true/false, CSS (optional), tooltip (optional)\n var isoDate = $.datepicker.formatDate('yymmdd', date) // Convert date object to ISO format\n // First check if active date\n if (coreDates.indexOf(isoDate) > -1) {\n return [true, 'ui-' + isoDate + ' ui-included'];\n }\n else if (bufferDates.indexOf(isoDate) > -1) {\n return [true, 'ui-' + isoDate + ' ui-buffer'];\n }\n else {\n return [true, 'ui-' + isoDate];\n }\n}\n\n// Redraw calendar after change to ticket duration/type\nfunction redraw(date, duration) {\n // Redraw\n usage(date, duration);\n // Repaint calendar\n $('#ui-datepicker-inline').datepicker('refresh');\n typeof updateReactApp === 'function' && updateReactApp();\n}\n\n// Core ticket selection\nfunction selection(date, setup) {\n // Function will only be triggered by non-calender selection in the event of duration chnage\n updateTicketOptions(date);\n var duration = parseInt($('.duration input:radio:checked').val());\n\n // If this is not the setup call\n if (!setup) {\n\n // If neither the date or duration have changed then exit the function\n if ((date == activedate) && (duration == activeduration)) { return; }\n // First check for valid pricing, and revert to previously selected date if API call fails\n pricing(date, duration, function (result) {\n // Pricing API could not return pricing so revert and show modal (e.g. user offline)\n if (!result) { revert(); }\n // Otherwise we have valid pricing\n else {\n // Determine usage window\n usage(date, duration);\n // Call tickets() to update pricing, etc.\n tickets();\n\n }\n });\n // Setup call needs usage window\n } else {\n // Determine usage window\n usage(date, duration);\n }\n}\n\nfunction updateTicketOptions(date) {\n var arrival = moment(date, 'D-M-YYYY');\n if (arrival.isAfter(waterParksOpenDate)) {\n $('.type.plus').removeClass('disabled');\n $('#plus').prop('disabled',false);\n //$('.type.plus').off('click');\n } else {\n $('.type.plus').addClass('disabled');\n if ($('#plus').prop('checked')) {\n $('#base').prop('checked',true);\n }\n $('#plus').prop('disabled',true);\n //$('.type.plus').on('click', showWaterParksClosed);\n }\n\n}\n\nfunction showWaterParksClosed() {\n dismissable = true;\n $('#dialog').addClass('dismissable has-buttons warning');\n modal('#water-parks-closed', false);\n\n $('#water-parks-closed .button').on('click', function(){\n waterParksAccepted = true;\n $('#form').submit();\n })\n}\n\n// Calculate buffer days, with Park Hopper Plus enjoying +1 day\nfunction buffer(duration) {\n // Ticket type selected?\n var type = $('.type input:radio:checked').val();\n // Calculate buffer days based on duration/type\n var bufferDays;\n // Delta (EMEA)\n if (delta) {\n switch (duration) {\n case 1:\n bufferDays = 0;\n break;\n case 2: case 3:\n bufferDays = 2;\n break;\n case 4: case 5: case 6: case 7:\n bufferDays = 3;\n break;\n case 8: case 9: case 10:\n bufferDays = 4;\n break;\n }\n // Park Hopper Plus enjoys +1 day\n if (type == plus) { bufferDays++; }\n // Magic (UK & Ireland)\n } else if (magic) {\n switch (duration) {\n case 7:\n bufferDays = 8;\n break;\n case 14:\n bufferDays = 4;\n break;\n }\n }\n // Return buffer days\n return bufferDays;\n}\n\n// Determine core/buffer days\nfunction usage(date, duration) {\n // Convert date to moment (d-m-yyyy)\n var arrival = moment(date, 'D-M-YYYY');\n\n // Reset arrays for the core/buffer dates\n coreDates = [];\n bufferDates = [];\n\n // Core dates\n coreDates.push(arrival.format('YYYYMMDD'));\n for (i = 1; i < duration; i++) {\n coreDates.push(arrival.add(1, 'd').format('YYYYMMDD'));\n }\n // Buffer days\n for (i = 1; i <= buffer(duration) ; i++) {\n bufferDates.push(arrival.add(1, 'd').format('YYYYMMDD'));\n }\n\n checkAvailability(coreDates[0]);\n}\n\n// Revert date/duration\nfunction revert() {\n // Convert active date to moment\n var revertDate = moment(activedate, 'D-M-YYYY')\n // Check for valid active date to revert datepicker\n if (moment(revertDate).isValid()) {\n // Revert date on datepicker/input\n $('#ui-datepicker-inline').datepicker('setDate', activedate);\n }\n // Revert duration\n $('.duration input:radio[data-ticket=\"' + activeduration + '\"]').prop('checked', true);\n // Show modal explaining connectivity failure\n connectivity();\n}\n\n// Return/store cached prices to improve performance\nfunction priceCache(retrieve, date, duration, prices) { // Get=true or set=false, date, durtaion, 6 x prices array (can be null for get)\n // Price cache key is made of date-duration\n var cacheKey = date + '-' + duration;\n // Getting prices\n if (retrieve) {\n // Check if entry exists in array\n if (typeof pricingCache[cacheKey] !== 'undefined' && pricingCache[cacheKey] !== null) {\n // Otherwise return pricing\n return pricingCache[cacheKey];\n }\n // Setting prices\n } else {\n // Store array of 6x prices within cache array\n pricingCache[cacheKey] = prices;\n }\n}\n\n// Call to local prices API\nfunction getPrices(date, duration, callback) {\n // Build URL for API call\n var buildAPI = ticketsAPI + moment(date, 'D-M-YYYY').format('YYYY-MM-DD') + '/' + duration + '/';\n // Call API\n $.getJSON(buildAPI, function (data) {\n // Pricing API returned response so loop through JSON\n $.each(data, function (key, val) {\n // Get response and update existing variables\n // Delta (EMEA)\n if (delta) {\n switch (key) {\n case 'adultbase': adultbase = parseInt(val); break;\n case 'childbase': childbase = parseInt(val); break;\n case 'adulthopper': adulthopper = parseInt(val); break;\n case 'childhopper': childhopper = parseInt(val); break;\n case 'adultplus': adultplus = parseInt(val); break;\n case 'childplus': childplus = parseInt(val); break;\n }\n // Magic (UK & Ireland)\n } else if (magic) {\n switch (key) {\n case 'adultmagic': adultmagic = parseInt(val); break;\n case 'childmagic': childmagic = parseInt(val); break;\n }\n }\n });\n // Update active date, duration, prices\n activedate = date;\n activeduration = duration;\n if (delta) {\n activeprices = [adultbase, childbase, adulthopper, childhopper, adultplus, childplus];\n } else if (magic) {\n activeprices = [adultmagic, childmagic];\n }\n // Store prices for selected date in cache to support revert if API fails on next call\n priceCache(false, activedate, activeduration, activeprices);\n // Return true in callback\n callback(true);\n })\n // Call fails\n .fail(function (xhr) {\n callback(false);\n });\n}\n\n// Call to pricing API for Delta tickets (post Oct '18)\nfunction pricing(date, duration, callback) {\n // First check if we have the selected date/duration stored in the local JS pricing cache\n var cache = priceCache(true, date, duration, null);\n // If we don't have a cached price then call the pricing API\n if (typeof cache === 'undefined') {\n // Call API, with one retry for failure\n getPrices(date, duration, function (result) {\n // Valid response\n if (result) {\n callback(true);\n // Otherwise call failed so retry once\n } else {\n getPrices(date, duration, function (result) {\n // Now response is okay\n if (result) { callback(true); }\n // Still API error\n else { callback(false); }\n });\n }\n });\n // Otherwise we have cached pricing so can update the UI without an API call\n } else {\n // Populate pricing variables from cache\n // Delta (EMEA)\n if (delta) {\n adultbase = parseInt(cache[0]);\n childbase = parseInt(cache[1]);\n adulthopper = parseInt(cache[2]);\n childhopper = parseInt(cache[3]);\n adultplus = parseInt(cache[4]);\n childplus = parseInt(cache[5]);\n // Magic (UK & Ireland)\n } else if (magic) {\n adultmagic = parseInt(cache[0]);\n childmagic = parseInt(cache[1]);\n }\n // Update active date, duration, prices\n activedate = date;\n activeduration = duration;\n // Return true in callback\n callback(true)\n }\n}\n\n// Update messaging to reflect usage window\nfunction visitation(selecteddate, ticket) {\n // Convert usage start date to moment\n var start = moment(selecteddate, 'D-M-YYYY');\n // Determine duration plus buffer (-1 as usage window is inclusive of last day)\n var duration = ticket + buffer(ticket) - 1\n // Write usage window\n var dates = '' + start.format('Do MMM YYYY') + ' - ' + start.add(duration, 'days').format('Do MMM YYYY') + '';\n if (exception14Days) {\n $('div.usage .window h3').html(literal('usage-window-valid-from-14f7', { ticket, dates }))\n }\n else {\n $('div.usage .window h3').html(literal('usage-window-valid-from', { ticket, dates }))\n }\n}\n\n// -------------------------------------------------------------------------------------------------------------------\n\n// Manage ticket prices and on-page display\nfunction tickets() {\n var selectedType =$('.type input:radio:checked').val();\n\n activetype = selectedType;\n\n if (dateinput == 'menu') {\n var selectedyear = parseInt($('#month').val().split('^')[1]);\n }\n // Check pax\n var adults = parseInt($('#adults').val());\n var children = parseInt($('#children').val());\n // Check ticket duration\n var ticket = parseInt($('.duration input:radio:checked').val());\n // Check arrival date via hidden input field\n var selecteddate = $('#date').val();\n //Convert selected date to an object\n var selecteddateobject = getOutboundDate(dateinput).toDate();\n // -------------------------------------------\n\n // Ultimate Ticket prices vary between years\n if (!tpt) {\n // -------------------------------------------\n // 2-Day Ticket not on sale\n if (!twoday) {\n // Set offer message\n $('.ticket[data-duration=\"14\"] strong.offer').text(offers(selecteddateobject, false));\n }\n // -------------------------------------------\n // 2-Day Ticket on sale\n else {\n // 2-Day Ticket is available for the arrival date\n if (twodaystart.getTime() <= selecteddateobject.getTime() && selecteddateobject.getTime() <= twodayend.getTime()) {\n $('.two').removeClass('suspended'); // Enable\n $('.two input').prop('disabled', false); // Enable radio button\n }\n // 2-Day Ticket is not available for the arrival date\n else {\n if (ticket == 2) { $('input:radio[value=\"14\"]').prop('checked', true); ticket = 14; } // Switch to 14 day ticket\n $('.two').addClass('suspended'); // Disable\n $('.two input').prop('disabled', true); // Disable radio button\n // Close entitlements panel, if open (mobile)\n if (mobile) {\n var panel = $('.two .entitlements'); if (panel.hasClass('open')) { entitlements(panel); }\n }\n }\n // Set offer message (desktop/mobile)\n if (!mobile) { $('.featured').text(offers(selecteddateobject, true)); };\n if (mobile) { $('.ticket[data-duration=\"14\"] strong.offer').text(offers(selecteddateobject, false)); };\n }\n // -------------------------------------------\n // Recalculate prices based on year change\n // -------------------------------------------\n // Update all prices to reflect current year\n $(\"#tickets .ticket\").each(function () {\n // Get duration\n var duration = parseInt($(this).attr('data-duration'));\n // Get price and calculate per day\n var adult = getSeasonalPrice('adult',selecteddateobject, duration);\n var child = getSeasonalPrice('child', selecteddateobject, duration);\n // -------------------------------------------\n // Are we showing was/now pricing?\n // var was = $('.was').length;\n // Are we showing per/day pricing?\n // var day = $('.day').length;\n // -------------------------------------------\n // Update adult prices\n $(this).find('.adult .total').text(formatPrice(adult))\n $(this).find('.adult .day').text(Math.ceil(adult / duration))\n // Hide saving when not 2017\n if (selectedyear != 2017) { $(this).find('.was').hide() } else { $(this).find('.was').show() }\n // Update child prices\n $(this).find('.child .total').text(formatPrice(child))\n $(this).find('.child .day').text(Math.ceil(child / duration))\n })\n // -------------------------------------------\n // Set lead-in price in title; 14 day ticket will always yield best per-day rate\n $(\"#lead\").text(Math.ceil(getSeasonalPrice('adult', selecteddateobject , '14') / 14));\n // Update current year\n activeyear = selectedyear;\n }\n\n // -------------------------------------------\n // -------------------------------------------\n\n // Magic Your Way/Delta (EMEA) or Magic (UK & Ireland)\n if (tpt) {\n\n // Delta/Magic only\n if (delta||magic) {\n // Repaint calendar to reflect buffer days\n redraw(selecteddate, ticket);\n // Update calendar messaging (desktop/mobile)\n $('div.calendar span.day').text(ticket)\n }\n\n //MYW/Delta need different handlers \n if (magicyourway||delta) {\n\n // Check ticket type\n var type = $('.type input:radio:checked').val();\n\n // Update ticket duration (desktop/mobile)\n $('div.options .type span.day').text(ticket)\n // Update ticket prices for base/hopper/plus\n $(\"div.options .type\").each(function () {\n // Get ticket type/entitlements\n var tickettype = $(this).attr('data-type');\n var ticketincluded = $(this).attr('data-included');\n\n // Get MYW adult/child prices (static)\n if (magicyourway) {\n var adultprice = eval('adult' + tickettype + ticket)\n var childprice = eval('child' + tickettype + ticket)\n // Get Delta ticket prices (dynamic)\n } else if (delta) {\n var adultprice = eval('adult' + tickettype)\n var childprice = eval('child' + tickettype)\n }\n\n // Update ticket prices\n $(this).find('.adult .price').text(formatPrice(adultprice))\n $(this).find('.child .price').text(formatPrice(childprice))\n // Update number of adults/children\n $(this).find('.adult .total').text(adults)\n $(this).find('.child .total').text(children)\n // If zero children then hide child price\n if (children == 0) {\n $(this).find('.child').removeClass('show').addClass('hide');\n } else {\n $(this).find('.child').removeClass('hide').addClass('show');\n }\n // Calculate ticket total\n var tickettotal = formatPrice((adults * adultprice) + (children * childprice));\n // Update ticket total\n $(this).find('div.total span').text(tickettotal)\n // Is this the selected ticket type?\n var ticketselection = $(this).find('input:radio').prop('checked');\n // If yes, then update summary\n if (ticketselection) {\n // Update summary\n // Ticket type inclusion\n $('#summary span.included').text(literal('with') + ' ' + ticketincluded)\n // Update ticket type total\n $('#summary #adult .sum').text(formatPrice(adults * adultprice))\n $('#summary #child .sum').text(formatPrice(children * childprice))\n // Update per-ticket price\n $('#summary #adult .price').text(formatPrice(adultprice))\n $('#summary #child .price').text(formatPrice(childprice))\n // Update total\n $('#summary .cost span').text(tickettotal)\n priceDisplayed = tickettotal;\n }\n })\n\n // Magic Tickets need different handlers\n } else if (magic) {\n\n // Get Magic ticket prices (date-based) \n var adultprice = adultmagic;\n var childprice = childmagic;\n\n // Genie+\n var genieplus = false;\n var genieprice = eval('genieplus' + ticket)\n\n // Checkbox ticked?\n if ($(\"#genieplus\").is(':checked')) { genieplus = true; }\n\n // Update per-day/total Genie+ pricing \n $('.genieplus .pricing .perday').text(formatPrice(genieprice/ticket))\n $('.genieplus .pricing .perticket').text(formatPrice(genieprice))\n\n // Recalculate pricing and show inclusion\n var addonincluded = '';\n\n if (genieplus) {\n // Show Genie+ in summary\n addonincluded = 'with Disney Genie+ Service'\n adultprice += genieprice;\n childprice += genieprice;\n }\n\n // Calculate ticket total\n var tickettotal = formatPrice((adults * adultprice) + (children * childprice));\n\n // Update summary\n\n // Show Genie+ inclusion\n $('#summary span.included').text(addonincluded) // Genie+\n // Update ticket type total\n $('#summary #adult .sum').text(formatPrice(adults * adultprice))\n $('#summary #child .sum').text(formatPrice(children * childprice))\n // Update per-ticket price\n $('#summary #adult .price').text(formatPrice(adultprice))\n $('#summary #child .price').text(formatPrice(childprice))\n // Update total\n $('#summary .cost span').text(tickettotal)\n priceDisplayed = tickettotal;\n\n }\n\n // Update summary panel (all ticket types)\n\n //Update \n $('#summary span.days').text(ticket)\n // Update pax\n $('#summary #adult .total').text(adults)\n $('#summary #child .total').text(children)\n // If zero children then hide child price\n if (children == 0) {\n $('#summary #child').removeClass('show').addClass('hide');\n } else {\n $('#summary #child').removeClass('hide').addClass('show');\n }\n\n // Update usage window for Delta\n if (delta||magic) { visitation(selecteddate, ticket); }\n\n // -------------------------------------------\n // -------------------------------------------\n\n // Ultimate Tickets (UK/Ireland)\n } else {\n // Update itinerary (desktop only)\n if (desktop) {\n // Set ticket name\n var ticketname = $('input:radio:checked').attr('data-ticket');\n $('#itinerary h4.tickets').text(ticketname);\n // Set number of tickets\n $('#adult .total').text(adults);\n $('#child .total').text(children);\n // Set ticket pricing\n $('#adult .ticket').text(getSeasonalPrice('adult',selecteddateobject, ticket));\n $('#child .ticket').text(getSeasonalPrice('child', selecteddateobject, ticket));\n }\n // -------------------------------------------\n // Set total (desktop/mobile)\n var total = formatPrice((adults * getSeasonalPrice('adult',selecteddateobject, ticket)) + (children * getSeasonalPrice('child', selecteddateobject, ticket)));\n $('div.total .cost span').text(total)\n priceDisplayed = total;\n }\n sendTicketStoreGAEvent()\n}\n\n// Format price, with comma for £999+ and correct decimals\nfunction formatPrice(val) { return parseFloat(val).toFixed(2).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,'); }\n\nfunction selectedGuestCount() {\n var sum = 0;\n $('.selector').each(function () {\n var val = $(this).find('input').val();\n sum = sum + parseInt(val);\n });\n\n return sum;\n}\n\nfunction setModalForTicketsMaxPassengersError() {\n $('#dialog').addClass('dismissable');\n modal('#tickets-max-passengers-error', false);\n}\n\n// Get dates for validation\nfunction valid() {\n // Get outbound date and convert to moment\n var outbound = getOutboundDate(dateinput)\n // Is the outbound journey before a temporary closure end date?\n var tempClosure = $('#ticket-dates').attr('data-temporary-closure-end');\n if (tempClosure != null) {\n var tempClosureDate = moment(tempClosure, \"DD/MM/YYYY\").toDate();\n if (outbound.isBefore(tempClosureDate)) {\n warning(literal('search.sorry-min-tickets-date'), literal('search.tickets-min-date'));\n return false;\n }\n }\n // Is the outbound journey after the brochure end date?\n var brochureClosure = $('#ticket-dates').attr('data-brochure-end');\n if (brochureClosure != null) {\n var brochureClosureDate = moment(brochureClosure, \"DD/MM/YYYY\").toDate();\n if (outbound.isAfter(brochureClosureDate)) {\n warning(literal('search.sorry-min-tickets-date'), literal('search.tickets-max-date', { maxDate: moment(brochureClosureDate).format('Do MMMM YYYY') }));\n return false;\n }\n }\n // Bookings must be a minimum of 3 days from today for ticket only\n var minimum = moment().add(3, 'd');\n var minimumdays = 3;\n // Override minimum for travel agents\n if (agent) { minimum = moment().add(17, 'd'); minimumdays = 17; } // Bookings must be a minimum of 17 days from today for agents against all product types\n // Check eligible departure date\n if (outbound.isBefore(minimum)) {\n warning(literal('search.within-x-days', { days: minimumdays }), literal('search.within-x-days-again-message'));\n return false;\n }\n\n if (outbound.isSameOrBefore(waterParksOpenDate) && !waterParksAccepted && !delta) {\n showWaterParksClosed(activedate);\n return false;\n }\n // Post form\n return true;\n}\n\nfunction getOutboundDate(dateinput) {\n // Get outbound date and convert to moment\n var outbound\n // Delta tickets use calendar, not drop menus\n if (dateinput == 'calendar') {\n // Get date from hidden field\n outbound = moment($('#date').val(), 'D-M-YYYY');\n // Ultimate/MYW use drop menus, so get outbound date and convert to date object\n }\n else {\n var monthyear = $('#month').val();\n var year = parseInt(monthyear.split('^')[1]);\n var month = parseInt(monthyear.split('^')[0])\n var day = parseInt($('#day').val());\n // Set outbound\n outbound = moment(day + '-' + month + '-' + year, 'D-M-YYYY');\n }\n return outbound\n}\n\nfunction collapse() {\n $('#overlay').hide();\n $('#interstitial').hide();\n $('#dialog').removeClass();\n $('.modal').addClass('hide');\n fixBody(false);\n}\n\n// -------------------------------------------------------------------------------------------------------------------\n\n// On ready\n$(document).ready(function () {\n\n // -------------------------------------------\n $('.type.plus').on('click', showWaterParksClosed);\n\n $('#dialog .close').on('click', collapse);\n\n // Floating datepicker (desktop only for Ultimate/MYW)\n if ((dateinput == 'menu') && (desktop)) {\n // Set datepicker defaults\n $.datepicker.setDefaults({\n dateFormat: 'dd-mm-yy',\n showOn: 'button',\n buttonText: '',\n firstDay: 1,\n prevText: '',\n nextText: '',\n hideIfNoPrevNext: true,\n showOtherMonths: true,\n showAnim: '',\n onClose: function (inst) { calendar(inst.id); $('div.calendar').addClass('shadow'); },\n onSelect: function (dateText, inst) { date(inst.selectedDay, inst.selectedMonth, inst.selectedYear); },\n beforeShow: function () { $('div.calendar').removeClass('shadow'); }\n });\n // Fix position of datepicker\n $.extend($.datepicker, { _checkOffset: function (inst, offset, isFixed) { return offset } });\n // Initialise datepicker against input field (floating)\n $('#date').datepicker({ minDate: mindate, maxDate: maxdate });\n };\n\n // -------------------------------------------\n\n // Inline datepicker (desktop/mobile for Delta/Magic)\n if (dateinput == 'calendar') {\n\n // Store starting date/duration/type for comparison, caching, or to revert\n activedate = $('#date').val();\n activeduration = parseInt($('.duration input:radio:checked').val());\n activetype = $('.type input:radio:checked').val();\n\n // Plus store active prices in cache at setup\n if (delta) {\n var activeprices = [adultbase, childbase, adulthopper, childhopper, adultplus, childplus];\n } else if (magic) {\n var activeprices = [adultmagic, childmagic];\n }\n\n // Store prices for selected date in cache to support revert if API fails\n priceCache(false, activedate, activeduration, activeprices);\n\n // Determine usage window before initialising datepicker (setup is true, called from tickets() is false)\n selection(activedate, true);\n\n // Set datepicker defaults\n $.datepicker.setDefaults({\n dateFormat: 'd-m-yy',\n defaultDate: activedate,\n altField: '#date',\n altFormat: 'dd-mm-yy',\n firstDay: 1,\n prevText: '',\n nextText: '',\n // hideIfNoPrevNext:true,\n showOtherMonths: true,\n onSelect: function (date) { selection(date, false); },\n beforeShowDay: function (date) { return seasons(date); }\n });\n // Initialise datepicker against div (inline)\n if (!$('#tickets-app').length) {\n $('#ui-datepicker-inline').datepicker({ minDate: mindate, maxDate: maxdate });\n }\n\n if (desktop) {\n $.datepicker.setDefaults({\n dayNamesMin: $.datepicker._defaults.dayNamesShort\n });\n }\n\n };\n\n // -------------------------------------------\n\n // All ticket products and devices\n\n // Trigger functions and set listeners for drop-menu date input\n if (dateinput == 'menu') {\n // Setup menus\n days();\n // Search form\n $('#month').change(function () { days(); tickets(); });\n $('#day').change(function () { calendar(); tickets(); }); // Update calendar\n // Listen for changes to date hidden field via datepicker\n $('#date').change(function () { tickets(); });\n }\n\n // Delta/Magic tickets need to handle inputs differently\n if (delta) {\n $('.duration input:radio').change(function () { selection(activedate, false); });\n $('.type input:radio').change(function () { tickets(); });\n // Listen for ticket duration and Genie checkbox\n } else if (magic) {\n $('.duration input:radio').change(function () { selection(activedate, false); });\n $('input:checkbox').change(function () { tickets(); });\n // Otherwise all radio button inputs call tickets()\n } else {\n $('input:radio').change(function () { tickets(); });\n }\n\n // All ticket types update pricing based on ticket/pax selections\n $('#adults, #children').change(function () { tickets(); });\n\n // Initialise page to ensure correct pricing after 'Back' in browser\n tickets();\n\n // -------------------------------------------\n\n // Show entitlments in sliding panel (mobile only)\n if (mobile) {\n // Listen for click\n $(\".entitlements\").click(function (event) {\n // Prevent event from bubbling up the DOM tree\n event.preventDefault();\n event.stopImmediatePropagation();\n // Set $(this) as variable\n var panel = $(this);\n // Is this ticket suspended?\n if (panel.closest('.ticket').hasClass('suspended')) {\n /// If yes, then show alert\n offsale();\n // Else slide panel and manage norgie\n } else {\n entitlements(panel)\n }\n });\n }\n\n // -------------------------------------------\n\n // Guest selection\n $('.selector .minus, .selector .plus').click(function () { selectguests($(this)); });\n\n // -------------------------------------------\n\n // Alerts (desktop)\n\n // Show details of 14 for 7 special offer\n $('.featured').click(function () {\n if ($(this).text() == literal('special-offer')) {\n warning(literal('special-offer-title'), literal('special-offer-message', {\n expireDate: moment(expire).format('Do MMMM YYYY'),\n expireYear: moment(expire).year()\n }));\n }\n });\n\n // Show alert on 2-Day Ticket for next year's arrivals\n $('.two').click(function () { if ($(this).hasClass('suspended')) { offsale() }; });\n\n // XXX\n $('.usage-explained').click(function () { explained(); });\n\n // -------------------------------------------\n\n // Validate input\n $('#form').submit(function (event) {\n // Prevent DOM from unloading before we have fired the tracking code\n if (!selectionValid) {\n warning(literal('ticketAvailability.selection-unavailable-click-button-title'),literal('ticketAvailability.selection-unavailable-click-button-message'));\n return false;\n }\n event.preventDefault();\n // Set this form to be a variable\n var form = this;\n\n if (selectedDateBetweenGiftCardWindow() && !giftCardModalForceContinue && activeduration < 3) {\n showGiftCardModal();\n return;\n }\n\n if (selectedGuestCount() > 10) {\n setModalForTicketsMaxPassengersError();\n return;\n }\n\n // Valid date?\n if (valid()) { form.submit(); }\n });\n\n});\n\nfunction selectedDateBetweenGiftCardWindow(){\n var selectedDate = moment(activedate, 'DD-MM-YYYY');\n return typeof giftCardOfferArrivalStart !== 'undefined' && selectedDate.isSameOrAfter(giftCardOfferArrivalStart) && selectedDate.isSameOrBefore(giftCardOfferArrivalEnd);\n}\n\nfunction showGiftCardModal(){\n dismissable = true;\n\n $('#dialog').addClass('dismissable');\n $('#dialog').addClass('warning has-buttons');\n modal('#gift-card-offer-miss-out', false);\n $('#gift-card-offer-miss-out .button').click(function() {\n giftCardModalForceContinue = true;\n $('#form').submit();\n });\n}\n\nfunction toggleTicketsAvailable(enable) {\n selectionValid = enable;\n $('.confirm .button').toggleClass('disabled', !enable)\n}\nfunction checkHasStockInDate(date, type) {\n var checkType = type || activetype;\n if (checkType === \"14\" || checkType === \"7\") {\n return !(noStockDates[date] && noStockDates[date][checkType]);\n } else {\n return !(noStockDates[date] && noStockDates[date][checkType] && noStockDates[date][checkType].includes(activeduration));\n }\n}\nfunction checkAvailability(date){\n noStockInSelectedDate = false;\n noCapacityInSelectedDate = false;\n exception14Days = false;\n var message = '';\n var title = '';\n\n if (!checkHasStockInDate(date)) {\n noStockInSelectedDate = true;\n message = literal('ticketAvailability.selection-stock-unavailable',{\n ticketDate: moment(date).format(literal('dates.day-and-full-month')),\n duration: activeduration,\n type: literal('ticketTypes.'+activetype) ? literal('with') + ' ' + literal('ticketTypes.'+activetype) : '',\n });\n title = literal('ticketAvailability.selection-unavailable-title');\n } else {\n var noCapacityDatesInSelection = [...coreDates, ...bufferDates].filter(item => noCapacityDates.includes(item)).map(item => moment(item).format(literal('dates.day-and-full-month')));\n\n if (activetype === '14' && noCapacityDatesInSelection.length && noCapacityDatesInSelection.length <= 4) {\n noCapacityInSelectedDate = false;\n exception14Days = true;\n message += literal('ticketAvailability.14-day-exception-message', {dates: formatDatesList(noCapacityDatesInSelection)});\n title = title || literal('ticketAvailability.14-day-exception-title');\n } else if (noCapacityDatesInSelection.length) {\n noCapacityInSelectedDate = true;\n message += literal('ticketAvailability.selection-unavailable-message', {\n dates: formatDatesList(noCapacityDatesInSelection),\n duration: activeduration,\n thisDatePluralized: noCapacityDatesInSelection.length > 1 ? literal('ticketAvailability.datesPlural') : literal('ticketAvailability.datesSingular'),\n })\n title = literal('ticketAvailability.selection-unavailable-title');\n }\n }\n\n drawAvailabilityErrors(message,title);\n}\nfunction formatDatesList(dates){\n var output = dates.join(', ');\n return output.replace(/(.+),/,'$1 ' + literal('concatenate'))\n\n}\nfunction drawAvailabilityErrors(message,title) {\n\n if (message.length) {\n if (noStockInSelectedDate || !exception14Days) {\n toggleTicketsAvailable(false);\n $('#tickets-availability-messages').addClass('error');\n $('.frame').addClass('error');\n } else {\n toggleTicketsAvailable(true);\n $('.frame').removeClass('error');\n $('#tickets-availability-messages').removeClass('error');\n }\n $('#tickets-availability-messages').removeClass('collapsed');\n $(\"#tickets-availability-messages .advisory-text\").html(message)\n $(\"#tickets-availability-messages h3\").html(title)\n\n } else {\n toggleTicketsAvailable(true);\n $('.frame').removeClass('error');\n $('#tickets-availability-messages').addClass('collapsed');\n }\n}\nfunction warnTypeNotAvailable(e,item) {\n var selectedType = item.val();\n var selectedDate = moment(activedate, 'DD-MM-YYYY');\n\n if (!checkHasStockInDate(selectedDate.format('YYYYMMDD'), selectedType)) {\n warning('No stock for type ' + selectedType);\n e.preventDefault();\n }\n}\n\nfunction changeTypeAutomaticallyIfNoStock(date) {\n var formattedDate = date.format('YYYYMMDD');\n var ticketTypes = ['DBT', 'DHT', 'DPT'];\n\n if (ticketTypes.includes(activetype)) {\n ticketTypes.forEach( type => {\n if (!checkHasStockInDate(formattedDate) && checkHasStockInDate(formattedDate, type)) {\n activetype = type;\n $('.type input:radio[value=\"' + type + '\"]').attr('checked',true);\n }\n })\n }\n}\nfunction getTicketID() {\n const selectedDate = moment(activedate, 'D-M-YYYY');\n let code;\n let seasonal14f7Date = null;\n let adultForChildStart = null;\n let adultForChildEnd = null;\n if (typeof seasonalofferend !== 'undefined') {\n seasonal14f7Date = moment(seasonalofferend, 'D/M/YYYY');\n }\n if (typeof adultForChildArrivalStart !== 'undefined') {\n adultForChildStart = moment(adultForChildArrivalStart , 'D/M/YYYY');\n adultForChildEnd = moment(adultForChildArrivalEnd , 'D/M/YYYY');\n }\n if (selectedDate.isSameOrAfter(adultForChildStart) && selectedDate.isSameOrBefore(adultForChildEnd)) {\n if (activetype === '14') {\n code = '14AC';\n } else if (activetype === '7') {\n code = '07AC';\n }\n return code;\n }\n\n if (seasonal14f7Date && selectedDate.isSameOrBefore(seasonal14f7Date) && activeduration === 14) {\n code = '147D';\n } else {\n if (activetype === '14') {\n code = '14DB';\n } else if (activetype === '7') {\n code = '07DB';\n } else {\n code = (activeduration - 1) + activetype;\n }\n }\n return code;\n}\nfunction sendTicketStoreGAEvent(){\n const stopSaleFlag = noStockInSelectedDate || noCapacityInSelectedDate;\n const formattedDate = moment(activedate, 'D-M-YYYY').format('YYYY-MM-DD');\n const ticketId = getTicketID();\n const parsedPrice = priceDisplayed && priceDisplayed.replace(/[^0-9]|(?!^)-/g, '') / 100;\n GA.sendEvent('TicketStore','Detail',formattedDate + \"|\" + ticketId + \"|\" + stopSaleFlag + \"|\" + parsedPrice);\n}"],"names":["noStockDates","stock","JSON","parse","noCapacityDates","capacities","noCapacityInSelectedDate","noStockInSelectedDate","exception14Days","selectionValid","priceDisplayed","getSeasonalPrice","age","date","duration","selectedDateFormatted","moment","seasonalOfferEndFormatted","seasonalofferend","year","isAfter","window","waterParksOpenDate","waterParksAccepted","activeyear","activedate","$","val","activeduration","activetype","currentyear","Date","getFullYear","nextyear","twoday","attr","agent","magicyourway","delta","magic","tpt","dateinput","ticketproduct","coreDates","bufferDates","pricingCache","ticketsAPI","giftCardModalForceContinue","ajaxSetup","timeout","selectguests","tap","selector","closest","action","sum","selectedGuestCount","setModalForTicketsMaxPassengersError","input","find","count","value","minimum","parseInt","maximum","change","html","entitlements","panel","toggleClass","slideToggle","offsale","warning","literal","twoDayStart","twodaystart","format","twoDayEnd","twodayend","connectivity","dismissable","addClass","GA","sendEvent","modal","offers","selectedDate","featured","message","offer","popular","seasons","isoDate","datepicker","formatDate","indexOf","redraw","usage","updateReactApp","selection","setup","updateTicketOptions","pricing","result","tickets","revert","removeClass","prop","showWaterParksClosed","on","submit","buffer","bufferDays","type","plus","arrival","push","i","add","checkAvailability","revertDate","isValid","priceCache","retrieve","prices","cacheKey","getPrices","callback","buildAPI","getJSON","data","each","key","adultbase","childbase","adulthopper","childhopper","adultplus","childplus","adultmagic","childmagic","activeprices","fail","xhr","cache","visitation","selecteddate","ticket","start","dates","selectedType","selectedyear","adults","split","children","selecteddateobject","getOutboundDate","toDate","adultprice","childprice","genieplus","genieprice","addonincluded","tickettotal","ticketname","total","getTime","mobile","hasClass","text","this","adult","child","formatPrice","Math","ceil","hide","show","tickettype","ticketincluded","eval","ticketselection","is","desktop","sendTicketStoreGAEvent","parseFloat","toFixed","replace","valid","outbound","tempClosure","tempClosureDate","isBefore","brochureClosure","brochureClosureDate","maxDate","minimumdays","days","isSameOrBefore","day","monthyear","month","collapse","fixBody","selectedDateBetweenGiftCardWindow","giftCardOfferArrivalStart","isSameOrAfter","giftCardOfferArrivalEnd","showGiftCardModal","click","toggleTicketsAvailable","enable","checkHasStockInDate","checkType","includes","noCapacityDatesInSelection","title","filter","item","map","length","formatDatesList","thisDatePluralized","ticketDate","drawAvailabilityErrors","join","warnTypeNotAvailable","e","preventDefault","changeTypeAutomaticallyIfNoStock","formattedDate","ticketTypes","forEach","getTicketID","let","code","seasonal14f7Date","adultForChildStart","adultForChildEnd","adultForChildArrivalStart","adultForChildArrivalEnd","stopSaleFlag","ticketId","parsedPrice","document","ready","setDefaults","dateFormat","showOn","buttonText","firstDay","prevText","nextText","hideIfNoPrevNext","showOtherMonths","showAnim","onClose","inst","calendar","id","onSelect","dateText","selectedDay","selectedMonth","selectedYear","beforeShow","extend","_checkOffset","offset","isFixed","minDate","mindate","maxdate","defaultDate","altField","altFormat","beforeShowDay","dayNamesMin","_defaults","dayNamesShort","event","stopImmediatePropagation","expireDate","expire","expireYear","explained"],"mappings":"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"}