{"version":3,"file":"scripts/chunks/src_widgets_book-now_book-now_js.325629ea4a2738775e0b.js","mappings":"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","sources":["webpack://disp0001/./src/widgets/book-now/book-now.js"],"sourcesContent":["import { dom } from '@fortawesome/fontawesome-svg-core'\r\n ; (async () => {\r\n const { default: moment } = await import('moment')\r\n\r\n Promise.all([\r\n import('../../plugins/semantic/form'),\r\n import('../../plugins/semantic/form.scss'),\r\n import('../guest-selector/guest-selector'),\r\n import('../guest-selector/guest-selector.scss'),\r\n ]).then(() => {\r\n Promise.all([\r\n import(/* webpackMode: \"eager\" */ './book-now.scss'),\r\n import(/* webpackMode: \"eager\" */ './book-now-external.scss'),\r\n import('../../scripts/dbs/dbs.semantic.form'),\r\n import('../../plugins/semantic/input.scss'),\r\n import('../../plugins/semantic/label.css'),\r\n import('../../plugins/semantic/transition.css'),\r\n import('../../plugins/semantic/transition.js'),\r\n import('../../plugins/semantic/icon.css'),\r\n import('../../plugins/semantic/modal.scss'),\r\n import('../../plugins/semantic/popup.css'),\r\n import('../../plugins/semantic/dropdown.scss'),\r\n import('../../plugins/semantic/dropdown'),\r\n import('../../plugins/semantic/modal'),\r\n import('../../plugins/semantic/dimmer.scss'),\r\n import('../../plugins/semantic/dimmer'),\r\n import('../../plugins/daterangepicker/daterangepicker'),\r\n import('../../plugins/daterangepicker/daterangepicker.scss'),\r\n import('../../scripts/dbs/dbs.utilities.geolocation'),\r\n import('../../scripts/dbs/dbs.utilities.querystring'),\r\n import('../../plugins/semantic/search'),\r\n import('../../plugins/semantic/search.scss'),\r\n import('../../plugins/semantic/api'),\r\n ]).then(() => {\r\n $('.widget.book-now').each(function (i, el) {\r\n $(el).data('widget', new BookNow(el, moment))\r\n $(el).data('widget').init()\r\n })\r\n })\r\n })\r\n })()\r\n\r\nfunction BookNow(el, moment) {\r\n const self = this\r\n\r\n self.el = $(el)\r\n self.tomorrow = new Date(new Date().setDate(new Date().getDate() + 1))\r\n self.today = new Date()\r\n self.maxDate = new moment().add(1, 'y').toDate()\r\n self.qs = new dbs.utilities.querystring()\r\n self.promoCodeInput = self.el.find('.promo-code.input') // NOTE 'promo code' and 'promo voucher' are not the same thing.\r\n self.bookNowParameter = {}\r\n\r\n self.guestCheckoutForm = $('.ui.form.guest-checkout-form')\r\n self.memberCheckoutForm = $('.ui.form.member-checkout-form')\r\n self.bookingCheckoutForm = $('.ui.form.booking-checkout-form')\r\n\r\n\r\n const checkoutPaymentWidget = $('.widget.checkout-payment').data('widget')\r\n const isCheckoutPaymentPage = checkoutPaymentWidget?.el.length\r\n\r\n const mediaBookNowDesktopLayout = window.matchMedia('(min-width: 768px)')\r\n\r\n self.propertyCode = self.qs.getParameter('propertyCode')\r\n self.index = self.qs.getParameter('index')\r\n self.arriveInput = self.el.find('.arrive.input')\r\n self.departInput = self.el.find('.depart.input')\r\n self.adultsInput = self.el.find('.adults.input')\r\n self.kidsInput = self.el.find('.kids.input')\r\n self.infantsInput = self.el.find('.infants.input')\r\n self.sort = self.qs.getParameter('sort')\r\n\r\n if (self.el.hasClass('available')) {\r\n self.bookNow = new dbs.form.genericForm()\r\n self.bookNow.init(self.el.find('.ui.form'))\r\n }\r\n\r\n self.handleDealApplied = function (response) {\r\n self.el.find('.reward-logo').hide()\r\n self.el.find('.members-price').hide()\r\n self.el.find('.deal-applied').show()\r\n self.el.find('.deal-special-name').text(response.DealSpecialName)\r\n self.el.find('.book-form .js-deal-code').val(response.DealCode)\r\n self.el.find('.mobile-summary-label').addClass('has-deal-applied')\r\n }\r\n\r\n self.handleDealNotApplied = function () {\r\n self.el.find('.reward-logo').show()\r\n self.el.find('.members-price').show()\r\n self.el.find('.deal-applied').hide()\r\n self.el.find('.book-form .js-deal-code').val('')\r\n self.el.find('.mobile-summary-label').removeClass('has-deal-applied')\r\n }\r\n\r\n self.renderDates = function () {\r\n // Get arrive/depart dates from query if found, else use today/tomorrow as default.\r\n self.arrive = self.qs.getParameter('arrive')\r\n ? moment(self.qs.getParameter('arrive'), 'YYYY-MM-DD').toDate()\r\n : self.today\r\n self.depart = self.qs.getParameter('depart')\r\n ? moment(self.qs.getParameter('depart'), 'YYYY-MM-DD').toDate()\r\n : self.tomorrow\r\n\r\n // Set display text of datepicker\r\n self.el\r\n .find('.date-range-picker')\r\n .removeClass('empty')\r\n .text(moment(self.arrive).format('DD MMM') + ' – ' + moment(self.depart).format('DD MMM'))\r\n // Set values on hidden inputs\r\n self.el.find('.arrive.input').val(moment(self.arrive).format('YYYY-MM-DD'))\r\n self.el.find('.depart.input').val(moment(self.depart).format('YYYY-MM-DD'))\r\n }\r\n\r\n // Runs first when widget is initialised (on page load) and subsequently on events following page load.\r\n self.bookPricing = function () {\r\n // Set widget state as loading\r\n self.el.addClass('loading')\r\n\r\n let addMembership = window.dbs.addMembershipChecked ?? false // Checks global store\r\n\r\n let propertyCode = self.qs.getParameter('propertyCode')\r\n let forceRequote = false\r\n self.hasFailedPreBookCheck = window.localStorage.getItem('PBCFail')\r\n\r\n const getDealCodeOrPromoCode = function () {\r\n const queryDealCode = self.qs.getParameter('dealCode')\r\n const bookNowPromoCode = self.promoCodeInput.val()\r\n const checkoutPaymentPromoCode = checkoutPaymentWidget?.promoCodeFormInput?.val()\r\n\r\n // TEMP Cannot apply deals/promo codes on localhost, so logging stuff to check output on dev/uat.\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log('DEALCODE: queryDealCode?', queryDealCode)\r\n console.log('DEALCODE: bookNowPromoCode?', bookNowPromoCode)\r\n console.log('DEALCODE: checkoutPaymentPromoCode?', checkoutPaymentPromoCode)\r\n }\r\n\r\n if (queryDealCode && queryDealCode.length) {\r\n return queryDealCode\r\n }\r\n\r\n if (bookNowPromoCode && bookNowPromoCode.length) {\r\n return bookNowPromoCode\r\n }\r\n\r\n if (checkoutPaymentPromoCode && checkoutPaymentPromoCode.length) {\r\n forceRequote = true\r\n\r\n if (checkoutPaymentPromoCode === '__remove_promocode') {\r\n checkoutPaymentWidget?.promoCodeFormInput?.val('')\r\n return ''\r\n }\r\n\r\n return checkoutPaymentPromoCode\r\n }\r\n\r\n return ''\r\n }\r\n\r\n const data = {\r\n arrive: self.el.find('.arrive.input').val(),\r\n depart: self.el.find('.depart.input').val(),\r\n adults: self.el.find('.adults.input').length > 1 ? self.el.find('.adults.input')[1].value : self.el.find('.adults.input').val(),\r\n kids: self.el.find('.kids.input').length > 1 ? self.el.find('.kids.input')[1].value : self.el.find('.kids.input').val(),\r\n infants: self.el.find('.infants.input').length > 1 ? self.el.find('.infants.input')[1].value : self.el.find('.infants.input').val(),\r\n guests: self.el.find('.guests.input').val(),\r\n cabinId: self.el.attr('data-cabinid'),\r\n propertyCode: propertyCode,\r\n propertyId: self.el.attr('data-propertyid'),\r\n addMembership: addMembership,\r\n token: self.el.attr('data-token'),\r\n newBooking: self.el.attr('data-new') === 'True',\r\n isOrderCreated: self.el.attr('data-order-created') === 'True',\r\n isPaymentPage: self.el.attr('data-accept-payment') === 'True',\r\n isRemainingPaymentPage: self.el.attr('data-remaining-payment') === 'True',\r\n hasRewardsNumber: self.el.attr('data-has-rewards-number') === 'True',\r\n parentPageType: self.el.attr('data-parent-page-type'),\r\n dealCode: getDealCodeOrPromoCode(),\r\n forceRequote: forceRequote,\r\n }\r\n\r\n self.bookNowParameter.ParkId = self.el.attr('data-parkid')\r\n self.bookNowParameter.PropertyCode = propertyCode\r\n self.bookNowParameter.AccommodationId = self.el.attr('data-cabinid')\r\n self.bookNowParameter.Adults = self.el.find('.adults.input').val()\r\n self.bookNowParameter.Kids = self.el.find('.kids.input').val()\r\n self.bookNowParameter.Infants = self.el.find('.infants.input').val()\r\n self.bookNowParameter.Arrive = self.el.find('.arrive.input').val()\r\n self.bookNowParameter.Depart = self.el.find('.depart.input').val()\r\n self.bookNowParameter.DealCode = data.dealCode\r\n\r\n $('.checkout-breadcrumbs a').each(function (i, el) {\r\n // For each breadcrumb, get its params and update the param value\r\n // with the value of our data object, which is what we post to the booking API\r\n // to ensure breadcrumb params are kept up-to-date with the booking data.\r\n\r\n const href = $(el).attr('href')\r\n if (href === undefined) return\r\n const [path, params] = href.includes('?') ? href.split('?') : [href, undefined]\r\n if (params === undefined) return\r\n\r\n let newParams = new URLSearchParams(params)\r\n newParams.forEach((value, param) => {\r\n if (!data[param]) return\r\n newParams.set(param, data[param])\r\n })\r\n\r\n $(el).attr('href', `${path}?${newParams.toString()}`)\r\n })\r\n\r\n // Hide any promo invalid errors, this gets checked after API response.\r\n self.el.find('.promo-invalid-error').hide()\r\n\r\n // disable book now button.\r\n // It will be enabled on keypress when the inputs are valid.\r\n self.disableSubmitButton()\r\n\r\n // CW-18490 NOTE BE does not store the statue of a membership in the cart.\r\n // FE requires `addMembership` to be passed to the booking request as either `true` or `false`.\r\n // As such, BE will always respond with membership being added or removed, regardless of if it was/was not in the cart already.\r\n // Because of this, FE needs to determine was a membership actually added or removed from the cart, and fire the GA event respectively.\r\n function wasMembershipActuallyAddedRemovedFromCart(response) {\r\n self.wasMembershipInCart // Leave undefined\r\n let isMembershipInCart = response.MemberJoinPrice > 0\r\n\r\n // Set initial status\r\n if (self.wasMembershipInCart === undefined) {\r\n self.wasMembershipInCart = isMembershipInCart\r\n }\r\n\r\n if (isMembershipInCart !== self.wasMembershipInCart) {\r\n self.wasMembershipInCart = isMembershipInCart // Set new statue\r\n return true\r\n }\r\n }\r\n\r\n // Send booking data and handle response\r\n $.ajax({\r\n url: $(el).attr('data-endpoint'),\r\n type: $(el).attr('data-method'),\r\n data: JSON.stringify(data),\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n })\r\n .done(function (response) {\r\n console.log('BOOKNOW', response)\r\n\r\n //## Google Push Events\r\n //## --------------------------\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log('response.RawDataLayerEvents', response.RawDataLayerEvents)\r\n }\r\n\r\n // CW-8299 [add_to_cart, remove_from_cart] Event success of add/remove membership\r\n if (\r\n response.RawDataLayerEvents &&\r\n response.RawDataLayerEvents['membership'] &&\r\n wasMembershipActuallyAddedRemovedFromCart(response)\r\n ) {\r\n ; (function () {\r\n const dataLayerAsJson = JSON.parse(response.RawDataLayerEvents['membership'])\r\n // TODO verify data layer object\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(`CW-8299 event ${dataLayerAsJson.event}`, JSON.stringify(dataLayerAsJson, null, 2))\r\n }\r\n window.dataLayer = window.dataLayer || [] // Create a data layer\r\n dataLayer.push({ ecommerce: null }) // Clear the previous ecommerce object\r\n dataLayer.push(dataLayerAsJson)\r\n })()\r\n }\r\n\r\n // CW-8299 [view_item, view_cart, begin_checkout] View accommodation detail and checkout pages. Event success of checkout payment.\r\n // Push datalayer for all checkout pages on page load\r\n //\r\n // NOTE 'data-parent-page-type' can have the following values:\r\n // 'ACCOMMODATIONDETAIL', 'CHECKOUTYOURDETAILS', 'CHECKOUTCONFIRMDETAILS', 'CHECKOUTPAYMENTDETAILS'\r\n let dataParentPageType = self.el.attr('data-parent-page-type')\r\n if (dataParentPageType && response.RawDataLayerEvents && response.RawDataLayerEvents[dataParentPageType]) {\r\n ; (function () {\r\n const dataLayerAsJson = JSON.parse(response.RawDataLayerEvents[dataParentPageType])\r\n // TODO verify data layer object\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(`CW-8299 event ${dataLayerAsJson.event}`, JSON.stringify(dataLayerAsJson, null, 2))\r\n }\r\n window.dataLayer = window.dataLayer || [] // Create a data layer\r\n dataLayer.push({ ecommerce: null }) // Clear the previous ecommerce object\r\n dataLayer.push(dataLayerAsJson)\r\n })()\r\n }\r\n\r\n //## --------------------------\r\n //## END Google Push Events\r\n\r\n //## QuoteData\r\n //## --------------------------\r\n\r\n self.bookNowParameter.QuoteData = response.QuoteData\r\n self.el.find('.configuration .js-quote-data').val(response.QuoteData)\r\n self.el.find('.mobile-configuration .js-quote-data').val(response.QuoteData)\r\n\r\n //## --------------------------\r\n //## END QuoteData\r\n\r\n //## Dates\r\n //## --------------------------\r\n\r\n self.el\r\n .find('.date-range-picker')\r\n .removeClass('empty')\r\n .text(moment(response.From).format('DD MMM') + ' – ' + moment(response.To).format('DD MMM'))\r\n\r\n self.el.find('.arrive.input').val(response.From)\r\n self.el.find('.depart.input').val(response.To)\r\n\r\n self.arrive = response.From ? moment(response.From, 'YYYY-MM-DD').toDate() : self.today\r\n self.depart = response.To ? moment(response.To, 'YYYY-MM-DD').toDate() : self.tomorrow\r\n\r\n self.filters = getFilterValues();\r\n self.pushState(self.filters)\r\n\r\n //## --------------------------\r\n //## END Dates\r\n\r\n //## RemainingPaymentID (accommodation detail page)\r\n //## --------------------------\r\n\r\n self.el.find('#remaining-payment-id').val(response.RemainingPaymentID)\r\n\r\n //## --------------------------\r\n //## END RemainingPaymentID (accommodation detail page)\r\n\r\n //## Success false: RedirectURL\r\n //## --------------------------\r\n\r\n if (response.Success == false && response.RedirectURL != null) {\r\n const locationParts = response.RedirectURL.split('?')\r\n const qs = locationParts[1]\r\n\r\n if (qs && qs.length > 1 && qs.toLowerCase().includes('pbcfail')) {\r\n const parts = qs.split(/[&;]/g)\r\n for (let i = parts.length; i-- > 0;) {\r\n if (parts[i].toLowerCase().lastIndexOf('pbcfail=', 0) !== -1) {\r\n parts.splice(i, 1)\r\n }\r\n }\r\n response.RedirectURL = locationParts[0] + '?' + parts.join('&')\r\n window.localStorage.setItem('PBCFail', 'true')\r\n }\r\n\r\n window.location.replace(response.RedirectURL)\r\n return\r\n }\r\n\r\n //## --------------------------\r\n //## END Success false: RedirectURL\r\n\r\n //## Success false: Show Message\r\n //## --------------------------\r\n else if (response.Success == false && response.Message && response.Message.length) {\r\n self.disableSubmitButton()\r\n\r\n if (!response.MessageIcon) {\r\n self.el.find('.message-container').html(response.Message).show()\r\n } else {\r\n self.el.find('.message-container-with-icon .message-content').html(response.Message)\r\n self.el.find('.message-container-with-icon').show()\r\n }\r\n // Show total price NA\r\n self.el.find('.total-price .price').hide()\r\n self.el.find('.total-price .na-price').show()\r\n\r\n // Show members price NA\r\n self.el.find('.members-price .price').hide()\r\n self.el.find('.members-price .na-price').show()\r\n\r\n self.el.find('.deal-applied').hide()\r\n return\r\n }\r\n\r\n //## --------------------------\r\n //## END Success false: Show Message\r\n\r\n //## Success true\r\n //## --------------------------\r\n else if (response.Success && !isCheckoutPaymentPage) {\r\n self.enableSubmitButton()\r\n }\r\n\r\n //## --------------------------\r\n //## END Success true\r\n\r\n //## Total price and members price (accommodation detail page)\r\n //## --------------------------\r\n\r\n if (response.TotalPrice != null && response.Availability != null && response.Availability.length > 0) {\r\n const initialTotalPrice = Math.trunc(response.TotalPrice).toString()\r\n const initialMemberPrice = Math.trunc(response.MemberPrice).toString()\r\n\r\n // Show total price value\r\n self.el.find('.total-price .na-price').hide()\r\n self.el.find('.total-price .price').show()\r\n self.el.find('.total-price .price .value').html(initialTotalPrice)\r\n\r\n // Show members price value\r\n self.el.find('.members-price .na-price').hide()\r\n self.el.find('.members-price .price').show()\r\n self.el.find('.members-price .price .value').html(initialMemberPrice)\r\n } else {\r\n // Show total price NA\r\n self.el.find('.total-price .price').hide()\r\n self.el.find('.total-price .na-price').show()\r\n\r\n // Show members price NA\r\n self.el.find('.members-price .price').hide()\r\n self.el.find('.members-price .na-price').show()\r\n }\r\n\r\n //## --------------------------\r\n //## END Total price and members price (accommodation detail page)\r\n\r\n //## Promo code (accommodation detail page)\r\n //## --------------------------\r\n\r\n if (response.IsPromoCodeInvalid) {\r\n self.el.find('.promo-invalid-error').show()\r\n }\r\n\r\n //## --------------------------\r\n //## END Promo code (accommodation detail page)\r\n\r\n if (response.CartPrice != null) {\r\n $('.terms-credit-card-total').html(response.CartPrice.toFixed(2))\r\n\r\n if (response.DepositAmount !== null && $('#PaymentId').length > 0) {\r\n $.ajax({\r\n url: $(el).attr('data-check-deposit-endpoint'),\r\n type: $(el).attr('data-check-deposit-method'),\r\n data: {\r\n paymentId: $('#PaymentId').val(),\r\n depositAmount: response.DepositAmount * 100,\r\n },\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n })\r\n .done(function (depositResponse) {\r\n if (depositResponse.DepositCharges != 0) {\r\n const totalDepositAmount = (response.DepositAmount + depositResponse.DepositChargeFees / 100).toFixed(\r\n 2,\r\n )\r\n const depositCreditCardFee = (depositResponse.DepositChargeFees / 100).toFixed(2)\r\n\r\n $('#payment-by-deposit').next('.payment-option').show()\r\n $('.credit-card-deposit').text(totalDepositAmount)\r\n $('.credit-card-deposit-fee').text(depositCreditCardFee)\r\n\r\n $('#payment-by-deposit').on('click', function () {\r\n if ($('#totalDepositToday').length === 0) {\r\n if ($('#totalBnplToday').length > 0) {\r\n $('#bnplMemberFirstRow').remove()\r\n $('#totalBnplToday').remove()\r\n }\r\n\r\n //append totalDepositAmount in the confirm and pay button\r\n $('.book-now')\r\n .children('svg')\r\n .after(' $' + totalDepositAmount)\r\n $('.book-now').children('svg').css('margin-right', '10px')\r\n $('.credit-card-surcharge').html(depositCreditCardFee)\r\n $('.terms-credit-card-total').html(totalDepositAmount)\r\n\r\n const gdayMemberCharge = addMembership ? 50 : 0\r\n const totalChargeToday = (parseFloat(totalDepositAmount) + gdayMemberCharge).toFixed(2)\r\n\r\n self.el.find('.summary .line:last-child').css({\r\n 'font-weight': 700,\r\n 'border-bottom': 'none',\r\n })\r\n\r\n if (addMembership) {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
2 Year G’DAY Rewards Membership
$50.00
' +\r\n '
Deposit amount (include card fee of ' +\r\n (depositResponse.DepositChargeFees / 100).toFixed(2) +\r\n ')
' +\r\n totalDepositAmount +\r\n '
' +\r\n '
Total charges on your credit card
' +\r\n totalChargeToday +\r\n '
',\r\n )\r\n } else {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
Deposit amount (include card fee of ' +\r\n (depositResponse.DepositChargeFees / 100).toFixed(2) +\r\n ')
' +\r\n totalDepositAmount +\r\n '
' +\r\n '
Total charges on your credit card
' +\r\n totalChargeToday +\r\n '
',\r\n )\r\n }\r\n }\r\n })\r\n } else {\r\n $('#payment-by-deposit').next('.payment-option').hide()\r\n }\r\n })\r\n .fail(function () {\r\n $('#payment-by-deposit').next('.payment-option').hide()\r\n })\r\n } else {\r\n $('#payment-by-deposit').next('.payment-option').hide()\r\n }\r\n\r\n // TODO handle payment options from the `checkout-payment.js` widget script.\r\n if (response.IsEligibleForBNPL) {\r\n $('#payment-by-bnpl').next('.payment-option').show()\r\n $('#payment-by-bnpl').on('click', function () {\r\n if ($('#totalBnplToday').length === 0) {\r\n if ($('#totalDepositToday').length > 0) {\r\n $('#depositMemberFirstRow').remove()\r\n $('#depositMemberSecondRow').remove()\r\n $('#totalDepositToday').remove()\r\n }\r\n\r\n self.el.find('.summary .line:last-child').css({\r\n 'font-weight': 700,\r\n 'border-bottom': 'none',\r\n })\r\n if (addMembership) {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
2 Year G’DAY Rewards Membership
$50.00
' +\r\n '
Total charges on your credit card
$50.00
',\r\n )\r\n } else {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
Total charges on your credit card
$0.00
',\r\n )\r\n }\r\n }\r\n if (response.CreditCardSurcharge != null) {\r\n $('.credit-card-surcharge').html(response.CreditCardSurcharge.toFixed(2))\r\n }\r\n $('.terms-credit-card-total').html(response.CartPrice.toFixed(2))\r\n })\r\n } else {\r\n $('#payment-by-bnpl').next('.payment-option').hide()\r\n }\r\n\r\n // TODO handle payment options from the `checkout-payment.js` widget script.\r\n $('#payment-in-full').on('click', function () {\r\n if ($('#totalDepositToday').length > 0) {\r\n $('#depositMemberFirstRow').remove()\r\n $('#depositMemberSecondRow').remove()\r\n $('#totalDepositToday').remove()\r\n }\r\n if ($('#totalBnplToday').length > 0) {\r\n $('#bnplMemberFirstRow').remove()\r\n $('#totalBnplToday').remove()\r\n }\r\n\r\n if (response.CreditCardSurcharge != null) {\r\n $('.credit-card-surcharge').html(response.CreditCardSurcharge.toFixed(2))\r\n }\r\n $('.terms-credit-card-total').html(response.CartPrice.toFixed(2))\r\n })\r\n\r\n $('.credit-card-total').html(response.CartPrice.toFixed(2))\r\n\r\n self.el.find('.cart-price .na-price').hide()\r\n self.el.find('.cart-price .price').show()\r\n self.el.find('.cart-price .price .value').html(response.CartPrice.toFixed(2))\r\n\r\n if (response.CartPrice === 0 && response.VoucherChargeTotal === 0) {\r\n window.dbs.globalEvents.emit('disable_payment_options')\r\n } else {\r\n window.dbs.globalEvents.emit('enable_payment_options')\r\n }\r\n\r\n // If a voucher covers the total cost of the order, we do not need credit card details\r\n if (response.VoucherChargeTotal > 0 && response.CartPrice === 0) {\r\n window.dbs.globalEvents.emit('disable_credit_card_validation')\r\n } else {\r\n window.dbs.globalEvents.emit('enable_credit_card_validation')\r\n }\r\n\r\n if (response.VoucherChargeTotal > 0) {\r\n window.dbs.globalEvents.emit('voucher_added_to_order', {\r\n VoucherCode: response.VoucherCode,\r\n VoucherType: response.VoucherType,\r\n VoucherAmount: response.VoucherAmount,\r\n VoucherChargeTotal: response.VoucherChargeTotal,\r\n })\r\n }\r\n\r\n if (response.VoucherChargeTotal === 0) {\r\n window.dbs.globalEvents.emit('voucher_removed_from_order', {\r\n VoucherCode: response.VoucherCode,\r\n VoucherType: response.VoucherType,\r\n VoucherAmount: response.VoucherAmount,\r\n VoucherChargeTotal: response.VoucherChargeTotal,\r\n })\r\n }\r\n } else {\r\n self.el.find('.cart-price .price').hide()\r\n self.el.find('.cart-price .na-price').show()\r\n }\r\n\r\n //## Deals and promo codes\r\n //## --------------------------\r\n\r\n // Deals UI (accommodation detail page)\r\n if (response.DealSpecialName) {\r\n console.log('DealSpecialName?', response.DealSpecialName)\r\n self.handleDealApplied(response)\r\n } else {\r\n self.handleDealNotApplied()\r\n }\r\n // END Deals UI (accommodation detail page)\r\n\r\n if (response.IsPromoCodeApplied || response.IsDiscountApplied) {\r\n self.promoCodeInput.val(response.DealCode)\r\n }\r\n\r\n let discountCodeFromUrl = self.qs.getParameter('dealCode')\r\n let promoCodeContainer = self.el.find('.promo-code-container')\r\n let isBookFormInCheckout = self.el.find('.book-form--disabled').length > 0\r\n // hide the promo code input in checkout OR if deal applied via URL params\r\n if (\r\n isBookFormInCheckout ||\r\n (discountCodeFromUrl && (response.IsPromoCodeApplied || response.IsDiscountApplied))\r\n ) {\r\n promoCodeContainer.hide()\r\n } else {\r\n promoCodeContainer.show()\r\n }\r\n\r\n if (discountCodeFromUrl && (response.IsPromoCodeApplied || response.IsDiscountApplied)) {\r\n checkoutPaymentWidget?.promoCodeComponent?.hide()\r\n } else {\r\n checkoutPaymentWidget?.promoCodeComponent?.show()\r\n }\r\n\r\n ; (function () {\r\n if ((!discountCodeFromUrl && response.IsPromoCodeApplied) || response.IsDiscountApplied) {\r\n window.dbs.globalEvents.emit('promocode_applied', {\r\n DealSpecialName: response.DealSpecialName,\r\n DealCode: response.DealCode,\r\n })\r\n return\r\n }\r\n\r\n if (response.IsPromoCodeInvalid) {\r\n window.dbs.globalEvents.emit('promocode_invalid', {\r\n DealSpecialName: response.DealSpecialName,\r\n DealCode: response.DealCode,\r\n })\r\n return\r\n }\r\n\r\n window.dbs.globalEvents.emit('promocode_not_applied')\r\n })()\r\n\r\n // hide the promo code input in checkout OR if deal applied via URL params\r\n if (\r\n isBookFormInCheckout ||\r\n (discountCodeFromUrl && (response.IsPromoCodeApplied || response.IsDiscountApplied))\r\n ) {\r\n promoCodeContainer.hide()\r\n } else {\r\n promoCodeContainer.show()\r\n }\r\n\r\n if (discountCodeFromUrl && (response.IsPromoCodeApplied || response.IsDiscountApplied)) {\r\n if (checkoutPaymentWidget && checkoutPaymentWidget.promoCodeComponent)\r\n checkoutPaymentWidget.promoCodeComponent.hide()\r\n }\r\n\r\n //## --------------------------\r\n //## END Deals and promo codes\r\n\r\n //## Credit card surcharge (checkout: payment page)\r\n //## --------------------------\r\n\r\n if (response.CreditCardSurcharge != null) {\r\n // Credit card surcharge displays in the payment form's terms checkbox label\r\n $('.credit-card-surcharge').html(response.CreditCardSurcharge.toFixed(2))\r\n }\r\n\r\n //## --------------------------\r\n //## END Credit card surcharge (checkout: payment page)\r\n\r\n //## Partner Rewards\r\n //## --------------------------\r\n\r\n // Update Partner Rewards\r\n self.el.find('.reward-point').html(response.RewardPoint) // Wrapped in `.partner-outer` that is hidden by default\r\n\r\n // ShowPartner returns 'true' if a valid partner number is entered during checkout.\r\n // The partner name and rewards points show on the checkout payment page.\r\n if (response.ShowPartner) {\r\n self.el.find('.partner-outer').show()\r\n }\r\n\r\n if (response.RewardPoint > 0) {\r\n self.el.find('.partner-container .content').show()\r\n } else {\r\n self.el.find('.partner-container .content').hide()\r\n }\r\n\r\n if (response.Partner !== null) {\r\n if (response.Partner.toLowerCase() === 'flybuys') {\r\n self.el.find('.logo .velocity').hide()\r\n self.el.find('.link.velocity').hide()\r\n }\r\n\r\n if (response.Partner.toLowerCase() === 'velocity') {\r\n self.el.find('.logo .flybuys').hide()\r\n self.el.find('.link.flybuys').hide()\r\n }\r\n }\r\n\r\n //## --------------------------\r\n //## END Partner Rewards\r\n\r\n $('body').on('click mouseenter', '.calendar-price-tooltip', function () {\r\n const classes = $(this).attr('class').split(' ')\r\n\r\n for (let i = 0; i < classes.length; i++) {\r\n const class1 = classes[i]\r\n if (class1.indexOf('price') !== -1) {\r\n $(this).attr('data-tooltip', '$' + class1.split('_')[1])\r\n }\r\n }\r\n })\r\n\r\n //## Cart items\r\n //## --------------------------\r\n\r\n // Update summary items\r\n self.el.find('.summary').html('')\r\n $.each(response.Items, function (index, item) {\r\n if (item.LineItemTooltip) {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
' +\r\n item.Label +\r\n '
' +\r\n item.Value +\r\n '
',\r\n )\r\n } else {\r\n self.el\r\n .find('.summary')\r\n .append(\r\n '
' +\r\n item.Label +\r\n '
' +\r\n item.Value +\r\n '
',\r\n )\r\n }\r\n\r\n // if (!price.TotalCabinPrice && !price.TotalSitePrice){\r\n // price.hasPrice = false\r\n // self.el.find('.result[data-property-code=\"'+ price.PropertyCode +'\"] .no-results').html(price.Message).show();\r\n // }else{\r\n // self.el.find('.result[data-property-code=\"'+ price.PropertyCode +'\"] .no-results').hide();\r\n // }\r\n //\r\n // if (price.Guests <= 1){\r\n // self.el.find('.result[data-property-code=\"'+ price.PropertyCode +'\"] .price .pricing-summary .guests .label').html('guest');\r\n // }\r\n //\r\n // if (price.Nights <= 1){\r\n // self.el.find('.result[data-property-code=\"'+ price.PropertyCode +'\"] .price .pricing-summary .nights .label').html('night');\r\n // }\r\n })\r\n\r\n //## --------------------------\r\n //## END Cart items\r\n\r\n //## Show Message\r\n //## --------------------------\r\n\r\n // Show form notification message.\r\n if (response.Message && response.Message.length) {\r\n self.el.find('.message-container').html(response.Message).show()\r\n } else {\r\n self.el.find('.message-container').hide()\r\n }\r\n\r\n //## --------------------------\r\n //## END Show Message\r\n\r\n // Round up cart price to two decimal places.\r\n $('.checkout-payment').attr('data-cart-total-price', response.CartPrice.toFixed(2))\r\n\r\n //## BookingEnabled\r\n //## --------------------------\r\n\r\n // If booking is available\r\n if (response.BookingEnabled) {\r\n if (data.isPaymentPage === false) {\r\n // CW-12886\r\n // if there's a booking-checkout-form, don't remove disabled class.\r\n // it will be handled by form validation\r\n if (!$('.booking-checkout-form').length) {\r\n self.el.find('.submit').removeClass('disabled')\r\n self.el.find('.checkout-continue-btn').removeClass('disabled')\r\n }\r\n }\r\n\r\n if (response.AllowRefund === false) {\r\n $('#terms-non-refundable').removeAttr('hidden')\r\n } else {\r\n $('#terms-non-refundable').attr('hidden')\r\n }\r\n\r\n // show booking summary\r\n let totalPriceSummary = function () {\r\n let label = response.AllowRefund === true ? 'Total' : 'Total (non-refundable)'\r\n let tooltip = response.Tooltip\r\n ? ``\r\n : ''\r\n let price = isNaN(parseFloat(response.CartPrice)) ? 'N/A' : '$' + parseFloat(response.CartPrice).toFixed(2)\r\n\r\n return `
\r\n
${label} ${tooltip}
\r\n
${price}
\r\n
`\r\n }\r\n\r\n self.el.find('.summary').append(totalPriceSummary())\r\n }\r\n\r\n // if booking is NOT available, disable buttons\r\n if (!response.BookingEnabled || self.hasFailedPreBookCheck) {\r\n self.disableSubmitButton()\r\n if (self.hasFailedPreBookCheck) {\r\n window.localStorage.removeItem('PBCFail')\r\n }\r\n }\r\n\r\n //## --------------------------\r\n //## END BookingEnabled\r\n\r\n //## Pre-book check message\r\n //## --------------------------\r\n\r\n if (self.hasFailedPreBookCheck) {\r\n self.el.find('.pbcfail-message-container').show()\r\n } else {\r\n self.el.find('.pbcfail-message-container').hide()\r\n }\r\n\r\n //## --------------------------\r\n //## END Pre-book check message\r\n\r\n //## Availability\r\n //## --------------------------\r\n\r\n self.availability = response.Availability\r\n\r\n //## --------------------------\r\n //## END Availability\r\n\r\n //## Date picker (accommodation detail page)\r\n //## --------------------------\r\n\r\n self.dateSelector.daterangepicker(\r\n {\r\n opens: 'left',\r\n startDate: self.arrive,\r\n endDate: self.depart,\r\n minDate: self.today,\r\n maxDate: self.maxDate,\r\n locale: 'YYYY-MM-DD',\r\n autoApply: true,\r\n isInvalidDate: function (date) {\r\n if (self.availability == null) {\r\n return false\r\n }\r\n\r\n for (let j = 0; j < self.availability.length; j++) {\r\n const availabilityElement = self.availability[j]\r\n const aDate = availabilityElement.Date\r\n\r\n if (moment(aDate, 'YYYY-MM-DD').isSame(date, 'day')) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n },\r\n isCustomDate: function (date) {\r\n if (self.availability == null) {\r\n return ['not-available']\r\n }\r\n\r\n for (let j = 0; j < self.availability.length; j++) {\r\n const availabilityElement = self.availability[j]\r\n const am = availabilityElement.Am\r\n const pm = availabilityElement.Pm\r\n const aDate = availabilityElement.Date\r\n const price = availabilityElement.Price\r\n\r\n const cellClasses = []\r\n\r\n if (am && pm) {\r\n cellClasses.push('all-day')\r\n } else {\r\n if (am) {\r\n cellClasses.push('am')\r\n }\r\n if (pm) {\r\n cellClasses.push('pm')\r\n }\r\n }\r\n\r\n cellClasses.push('calendar-price-tooltip')\r\n cellClasses.push('price_' + price)\r\n\r\n if (moment(aDate, 'YYYY-MM-DD').isSame(date, 'day')) {\r\n return cellClasses\r\n }\r\n }\r\n\r\n return ['not-available']\r\n },\r\n },\r\n function (startDate, endDate) {\r\n self.el\r\n .find('.date-range-picker')\r\n .removeClass('empty')\r\n .text(startDate.format('DD MMM') + ' – ' + endDate.format('DD MMM'))\r\n self.el.find('.arrive.input').val(startDate.format('YYYY-MM-DD'))\r\n self.el.find('.depart.input').val(endDate.format('YYYY-MM-DD'))\r\n self.arrive = startDate\r\n self.depart = endDate\r\n\r\n if (self.dateSelectorMobile.data('daterangepicker')) {\r\n self.dateSelectorMobile.data('daterangepicker').setStartDate(startDate)\r\n self.dateSelectorMobile.data('daterangepicker').setEndDate(endDate)\r\n }\r\n\r\n self.bookPricing()\r\n },\r\n )\r\n\r\n if (self.dateSelector.data('daterangepicker')) {\r\n self.dateSelector.data('daterangepicker').setStartDate(self.arrive)\r\n self.dateSelector.data('daterangepicker').setEndDate(self.depart)\r\n }\r\n\r\n self.dateSelectorMobile.daterangepicker(\r\n {\r\n opens: 'left',\r\n startDate: self.arrive,\r\n endDate: self.depart,\r\n minDate: self.today,\r\n maxDate: self.maxDate,\r\n locale: 'YYYY-MM-DD',\r\n autoApply: true,\r\n isInvalidDate: function (date) {\r\n if (self.availability == null) {\r\n return false\r\n }\r\n\r\n for (let j = 0; j < self.availability.length; j++) {\r\n const availabilityElement = self.availability[j]\r\n const aDate = availabilityElement.Date\r\n\r\n if (moment(aDate, 'YYYY-MM-DD').isSame(date, 'day')) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n },\r\n isCustomDate: function (date) {\r\n if (self.availability == null) {\r\n return ['not-available']\r\n }\r\n for (let j = 0; j < self.availability.length; j++) {\r\n const availabilityElement = self.availability[j]\r\n const am = availabilityElement.Am\r\n const pm = availabilityElement.Pm\r\n const aDate = availabilityElement.Date\r\n\r\n const cellClasses = []\r\n\r\n if (am && pm) {\r\n cellClasses.push('all-day')\r\n } else {\r\n if (am) {\r\n cellClasses.push('am')\r\n }\r\n if (pm) {\r\n cellClasses.push('pm')\r\n }\r\n }\r\n\r\n if (moment(aDate, 'YYYY-MM-DD').isSame(date, 'day')) {\r\n return cellClasses\r\n }\r\n }\r\n\r\n return ['not-available']\r\n },\r\n },\r\n function (startDate, endDate) {\r\n self.el\r\n .find('.date-range-picker')\r\n .removeClass('empty')\r\n .text(startDate.format('DD MMM') + ' – ' + endDate.format('DD MMM'))\r\n self.el.find('.arrive.input').val(startDate.format('YYYY-MM-DD'))\r\n self.el.find('.depart.input').val(endDate.format('YYYY-MM-DD'))\r\n self.arrive = startDate\r\n self.depart = endDate\r\n\r\n // update main date\r\n if (self.dateSelector.data('daterangepicker')) {\r\n self.dateSelector.data('daterangepicker').setStartDate(startDate)\r\n self.dateSelector.data('daterangepicker').setEndDate(endDate)\r\n }\r\n\r\n self.bookPricing()\r\n },\r\n )\r\n\r\n if (self.dateSelectorMobile.data('daterangepicker')) {\r\n self.dateSelectorMobile.data('daterangepicker').setStartDate(self.arrive)\r\n self.dateSelectorMobile.data('daterangepicker').setEndDate(self.depart)\r\n }\r\n\r\n //## --------------------------\r\n //## END Date picker (accommodation detail page)\r\n\r\n //## Tooltip\r\n //## --------------------------\r\n\r\n // init tooltips\r\n let tooltips = self.el.find('.tooltip')\r\n let popupOptions = {\r\n on: 'hover',\r\n position: 'top center',\r\n }\r\n\r\n tooltips.popup(popupOptions)\r\n\r\n // re-init tooltips when layout changes to fix issues\r\n // where popup does not show on hover if hidden via .popup('hide')\r\n mediaBookNowDesktopLayout.addEventListener('change', function () {\r\n tooltips.popup(popupOptions)\r\n })\r\n\r\n // manually hide tooltips when document scrolls\r\n // does not auto hide when if tooltip is in fixed or sticky element, such as book now on mobile (fixed) and desktop (sticky)\r\n let hideTooltips = function () {\r\n let tooltips = self.el.find('.tooltip.visible')\r\n if (tooltips.length) {\r\n tooltips.popup('hide')\r\n }\r\n }\r\n\r\n document.addEventListener('scroll', dbs.utilities.debounce(hideTooltips, 100, true))\r\n\r\n //## --------------------------\r\n //## END Tooltip\r\n }) // END This is the end of .done()\r\n .fail(function () {\r\n // TODO decide what happens on fail - perhaps nothing?\r\n })\r\n .always(function () {\r\n // See: https://fontawesome.com/v5/docs/apis/javascript/methods#dom-i2svg-params\r\n dom.i2svg()\r\n\r\n // TODO hide pricing loaders if any\r\n\r\n // Remove widget state as loading\r\n self.el.removeClass('loading')\r\n })\r\n }\r\n\r\n self.enableSubmitButton = function () {\r\n self.el.find('.submit.book-now').removeClass('disabled')\r\n self.el.find('.submit.mobile-book-now').removeClass('disabled')\r\n self.el.find('.checkout-continue-btn').removeClass('disabled')\r\n }\r\n\r\n self.disableSubmitButton = function () {\r\n self.el.find('.submit.book-now').addClass('disabled')\r\n self.el.find('.submit.mobile-book-now').addClass('disabled')\r\n self.el.find('.checkout-continue-btn').addClass('disabled')\r\n }\r\n\r\n self.bindSubmitButton = function () {\r\n const handleSubmitClick = function (e) {\r\n e.preventDefault()\r\n e.stopPropagation() // stops triggering click on .panel-toggle\r\n\r\n if (isCheckoutPaymentPage) {\r\n let bookNowButton = $(this)\r\n if (bookNowButton.hasClass('disabled')) {\r\n return\r\n }\r\n\r\n self.el.addClass('loading')\r\n checkoutPaymentWidget.submitForm()\r\n } else {\r\n // Accommodation detail page\r\n if (self.promoCodeInput.val()) {\r\n self.bookNowParameter.DealCode = self.promoCodeInput.val()\r\n } else {\r\n self.bookNowParameter.DealCode = self.qs.getParameter('dealCode') ?? ''\r\n }\r\n\r\n $.ajax({\r\n url: $(this).parents('form.booking-accommodation-form').attr('action'),\r\n type: $(this).parents('form.booking-accommodation-form').attr('method'),\r\n data: JSON.stringify(self.bookNowParameter),\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n })\r\n .done(function (response) {\r\n if (response.RedirectUrl) {\r\n location = response.RedirectUrl\r\n }\r\n\r\n // CW-8299 [add_to_cart] Event success of add accommodation item to cart\r\n if (response.RawDataLayerEvents && response.RawDataLayerEvents['addToCart']) {\r\n ; (function () {\r\n const dataLayerAsJson = JSON.parse(response.RawDataLayerEvents['addToCart'])\r\n // TODO verify data layer object\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(`CW-8299 event ${dataLayerAsJson.event}`, JSON.stringify(dataLayerAsJson, null, 2))\r\n }\r\n window.dataLayer = window.dataLayer || [] // Create a data layer\r\n dataLayer.push({ ecommerce: null }) // Clear the previous ecommerce object\r\n dataLayer.push(dataLayerAsJson)\r\n })()\r\n }\r\n })\r\n .fail(function () { })\r\n .always(function () { })\r\n }\r\n }\r\n\r\n let submitButtons = $('.widget.book-now .submit.book-now, .widget.book-now .submit.mobile-book-now')\r\n submitButtons.each(function () {\r\n $(this).click(handleSubmitClick)\r\n })\r\n }\r\n\r\n self.setFiltersFromUrl = function () {\r\n // placeholder\r\n }\r\n\r\n self.pushState = function (filters) {\r\n // Filter out empty values, considering falsely values\r\n let stateFilters = Object.fromEntries(Object.entries(filters).filter(([, value]) => value === 0 || !!value))\r\n\r\n\r\n var backToParkLink = $('#backToParkLink')\r\n if (backToParkLink.length >= 1) {\r\n const href = backToParkLink.attr('href').split('?')[0] + '?' + $.param(stateFilters)\r\n backToParkLink.attr('href', href)\r\n // Update URL params with new filter values, but do not reload the page.\r\n history.replaceState({ filters: stateFilters }, '', window.location.pathname + '?' + $.param(stateFilters))\r\n }\r\n }\r\n\r\n function getFilterValues() {\r\n let filters = {\r\n //propertyCode: self.propertyCode,\r\n //index: self.index,\r\n arrive: moment(self.arrive).format('YYYY-MM-DD'),\r\n depart: moment(self.depart).format('YYYY-MM-DD'),\r\n //adults: self.adultsInput,\r\n //kids: self.kidsInput,\r\n //infants: self.infantsInput,\r\n //sort: self.sort\r\n //fix for CW20-3278\r\n propertyCode: self.qs.getParameter('propertyCode'),\r\n index: self.qs.getParameter('index'),\r\n //arrive: self.qs.getParameter('arrive'),\r\n //depart: self.qs.getParameter('depart'),\r\n adults: self.qs.getParameter('adults'),\r\n kids: self.qs.getParameter('kids'),\r\n infants: self.qs.getParameter('infants'),\r\n sort: self.qs.getParameter('sort')\r\n }\r\n // NOTE Only add `dealCode` property if we have a value.\r\n const dealCode = self.qs.getParameter('dealCode')\r\n if (dealCode) {\r\n filters.dealCode = dealCode\r\n }\r\n\r\n return filters\r\n }\r\n\r\n self.hidePanel = function () {\r\n if (!self.panelToggle.hasClass('active')) return\r\n\r\n self.panelToggle.removeClass('active')\r\n self.toggleLabel.text(self.defaultText)\r\n\r\n self.toggleText.text(\"View Booking Details\")\r\n self.chevronDown.removeAttr('hidden')\r\n self.chevronUp.attr('hidden', 'hidden')\r\n\r\n // prep transition\r\n let panelDOMRect = self.panelCollapse[0].getBoundingClientRect()\r\n self.panelCollapse.addClass('collapsing').css('height', `${panelDOMRect.height}px`)\r\n\r\n // start transition\r\n setTimeout(function () {\r\n self.panelCollapse.css('height', '')\r\n }, 0)\r\n\r\n // on transition end\r\n let transitionDuration = dbs.utilities.getTransitionDurationFromElement(self.panelCollapse)\r\n setTimeout(function () {\r\n self.panelCollapse.removeClass('collapsing').addClass('collapsed').css('height', '')\r\n }, transitionDuration)\r\n }\r\n\r\n self.showPanel = function () {\r\n if (self.panelToggle.hasClass('active')) return\r\n\r\n self.panelToggle.addClass('active')\r\n /*self.toggleLabel.text(self.activeToggleText)*/\r\n self.toggleText.text(\"Close Booking Details\")\r\n self.chevronUp.removeAttr('hidden')\r\n self.chevronDown.attr('hidden','hidden')\r\n // start transition\r\n self.panelCollapse\r\n .removeClass('collapsed')\r\n .addClass('collapsing')\r\n .css('height', `${self.panelCollapse[0].scrollHeight}px`)\r\n\r\n // on transition end\r\n let transitionDuration = dbs.utilities.getTransitionDurationFromElement(self.panelCollapse)\r\n setTimeout(function () {\r\n self.panelCollapse.removeClass('collapsing').css('height', '')\r\n }, transitionDuration)\r\n }\r\n\r\n self.initPanelCollapse = function () {\r\n self.panelCollapse = self.el.find('.panel-collapse')\r\n self.panelToggle = self.el.find('.panel-toggle').not('.disable-toggle')\r\n self.toggleLabel = self.panelToggle.find('.js-toggle-label')\r\n self.defaultText = self.toggleLabel.text()\r\n self.activeToggleText = self.toggleLabel.attr('data-active-toggle-text')\r\n self.toggleText = self.el.find('.toggle-text')\r\n\r\n self.chevronDown = self.el.find('.toggle-chevron-down')\r\n self.chevronUp = self.el.find('.toggle-chevron-up')\r\n console.log(self.chevronDown)\r\n self.panelCollapse.css('height', '')\r\n\r\n self.panelToggle.click(function () {\r\n if (self.panelToggle.hasClass('active')) {\r\n self.hidePanel()\r\n } else {\r\n self.showPanel()\r\n }\r\n })\r\n }\r\n\r\n self.init = function () {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log('BookNow init', self)\r\n }\r\n\r\n self.initPanelCollapse()\r\n\r\n // Proxy button to submit the current form on the checkout page\r\n $('.js-checkout-continue-btn').click(function (event) {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n let checkoutLoginTabs = $('.pt-checkout').find('.checkout-login-tabs')\r\n let isCheckoutDetailsPage = checkoutLoginTabs.length === 1\r\n if (isCheckoutDetailsPage) {\r\n if (self.guestCheckoutForm.is(':visible')) {\r\n return self.guestCheckoutForm.find('input[type=\"submit\"], .submit.button').click()\r\n }\r\n\r\n if (self.memberCheckoutForm.is(':visible')) {\r\n return self.memberCheckoutForm.find('input[type=\"submit\"], .submit.button').click()\r\n }\r\n\r\n // Fallback, if the forms above are not found\r\n let visibleForm = checkoutLoginTabs.find('.tab.active form')\r\n let submitButton = visibleForm.find('input[type=\"submit\"], .submit.button')\r\n return submitButton.click()\r\n }\r\n\r\n let isCheckoutBookingPage = self.bookingCheckoutForm.length === 1\r\n if (isCheckoutBookingPage) {\r\n self.bookingCheckoutForm.find('input[type=\"submit\"], .submit.button').click()\r\n }\r\n })\r\n\r\n self.disableSubmitButton()\r\n self.bindSubmitButton()\r\n self.renderDates()\r\n\r\n // Handle membership cart state\r\n // The URL param `newMember` is passed through the checkout to indicate if the membership should be included in cart for purchase.\r\n // This is not stored on the order in the CMS, so we need to keep up-to-date by checking the value of the URL param on each page.\r\n // NOTE this state is also set on membership checkbox events handled from the 'gday-rewards-cart' widget.\r\n window.dbs.addMembershipChecked = self.qs.getParameter('newMember') === 'True' ?? false\r\n\r\n // Show widget on page\r\n self.el.css('opacity', 1)\r\n\r\n self.timer = null\r\n self.promoCodeInput = self.el.find('.promo-code.input')\r\n // refresh book pricing for promo code input of backspace key\r\n self.promoCodeInput.keydown(function (event) {\r\n if (event.key === 'Backspace') {\r\n // trigger book pricing\r\n clearTimeout(self.timer)\r\n self.timer = setTimeout(function () {\r\n window.dbs.globalEvents.emit('add_promocode')\r\n }, 1000)\r\n }\r\n })\r\n\r\n // refresh book pricing for promo code input of alphanumeric characters\r\n self.promoCodeInput.keypress(function (event) {\r\n const reLettersOrNumbers = new RegExp('^[a-zA-Z0-9]+$')\r\n let isAlphanumeric = reLettersOrNumbers.test(String.fromCharCode(event.which))\r\n\r\n if (!isAlphanumeric) {\r\n event.preventDefault()\r\n return false\r\n }\r\n\r\n clearTimeout(self.timer)\r\n self.timer = setTimeout(function () {\r\n window.dbs.globalEvents.emit('add_promocode')\r\n }, 1000)\r\n })\r\n\r\n // refresh book pricing for promo code input of copy/paste\r\n self.promoCodeInput.bind('paste', function () {\r\n // trigger book pricing\r\n clearTimeout(self.timer)\r\n self.timer = setTimeout(function () {\r\n window.dbs.globalEvents.emit('add_promocode')\r\n }, 1000)\r\n })\r\n\r\n // Date selector\r\n self.dateSelector = self.el.find('.book-form .date-selector')\r\n self.dateSelector.on('show.daterangepicker', function () {\r\n self.dateSelector.addClass('open')\r\n })\r\n self.dateSelector.on('hide.daterangepicker', function () {\r\n self.dateSelector.removeClass('open')\r\n })\r\n\r\n // Date selector (mobile)\r\n self.dateSelectorMobile = self.el.find('.mobile-view .date-selector')\r\n self.dateSelectorMobile.on('show.daterangepicker', function () {\r\n self.dateSelectorMobile.addClass('open')\r\n })\r\n self.dateSelectorMobile.on('hide.daterangepicker', function () {\r\n self.dateSelectorMobile.removeClass('open')\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('payment_form_error', function () {\r\n // Remove widget state as loading\r\n self.el.removeClass('loading')\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('payment_form_is_valid', function (isValid) {\r\n if (isValid) {\r\n self.enableSubmitButton()\r\n } else {\r\n self.disableSubmitButton()\r\n }\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('bpoint_payment_error', function () {\r\n // Remove widget state as loading\r\n self.el.removeClass('loading')\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('guestselector:updated', function () {\r\n setTimeout(function () {\r\n self.bookPricing()\r\n }, 300)\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('book_pricing', function () {\r\n console.log('[PUBSUB]', 'trigger_book_pricing') // TEMP\r\n self.bookPricing()\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('addmembership', function () {\r\n self.bookPricing()\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('removemembership', function () {\r\n self.bookPricing()\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('add_promocode', function () {\r\n self.bookPricing()\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('remove_promocode', function () {\r\n self.bookPricing()\r\n })\r\n\r\n window.dbs.globalEvents.subscribe('formsubmit', function (bookNowButton) {\r\n bookNowButton.parent('form').submit()\r\n })\r\n\r\n if (self.guestCheckoutForm.length) {\r\n self.guestCheckoutForm.data('Form').events.subscribe('Form:validation_fail', function () {\r\n self.hidePanel()\r\n })\r\n }\r\n\r\n if (self.memberCheckoutForm.length) {\r\n self.memberCheckoutForm.data('Form').events.subscribe('Form:validation_fail', function () {\r\n self.hidePanel()\r\n })\r\n }\r\n\r\n if (self.bookingCheckoutForm.length) {\r\n self.bookingCheckoutForm.data('Form').events.subscribe('Form:validation_fail', function () {\r\n self.hidePanel()\r\n })\r\n }\r\n\r\n self.bookPricing()\r\n }\r\n}\r\n"],"names":["BookNow","el","moment","self","this","$","tomorrow","Date","setDate","getDate","today","maxDate","add","toDate","qs","dbs","utilities","querystring","promoCodeInput","find","bookNowParameter","guestCheckoutForm","memberCheckoutForm","bookingCheckoutForm","checkoutPaymentWidget","data","isCheckoutPaymentPage","length","mediaBookNowDesktopLayout","window","matchMedia","propertyCode","getParameter","index","arriveInput","departInput","adultsInput","kidsInput","infantsInput","sort","hasClass","bookNow","form","genericForm","init","handleDealApplied","response","hide","show","text","DealSpecialName","val","DealCode","addClass","handleDealNotApplied","removeClass","renderDates","arrive","depart","format","bookPricing","addMembership","addMembershipChecked","forceRequote","hasFailedPreBookCheck","localStorage","getItem","adults","value","kids","infants","guests","cabinId","attr","propertyId","token","newBooking","isOrderCreated","isPaymentPage","isRemainingPaymentPage","hasRewardsNumber","parentPageType","dealCode","queryDealCode","bookNowPromoCode","checkoutPaymentPromoCode","promoCodeFormInput","getDealCodeOrPromoCode","ParkId","PropertyCode","AccommodationId","Adults","Kids","Infants","Arrive","Depart","each","i","href","undefined","path","params","includes","split","newParams","URLSearchParams","forEach","param","set","toString","disableSubmitButton","ajax","url","type","JSON","stringify","dataType","contentType","done","console","log","RawDataLayerEvents","wasMembershipInCart","isMembershipInCart","MemberJoinPrice","wasMembershipActuallyAddedRemovedFromCart","dataLayerAsJson","parse","dataLayer","push","ecommerce","dataParentPageType","QuoteData","From","To","filters","getFilterValues","pushState","RemainingPaymentID","Success","RedirectURL","locationParts","toLowerCase","parts","lastIndexOf","splice","join","setItem","location","replace","Message","MessageIcon","html","enableSubmitButton","TotalPrice","Availability","initialTotalPrice","Math","trunc","initialMemberPrice","MemberPrice","IsPromoCodeInvalid","CartPrice","toFixed","DepositAmount","paymentId","depositAmount","depositResponse","DepositCharges","totalDepositAmount","DepositChargeFees","depositCreditCardFee","next","on","remove","children","after","css","gdayMemberCharge","totalChargeToday","parseFloat","append","fail","IsEligibleForBNPL","CreditCardSurcharge","VoucherChargeTotal","globalEvents","emit","VoucherCode","VoucherType","VoucherAmount","IsPromoCodeApplied","IsDiscountApplied","discountCodeFromUrl","promoCodeContainer","isBookFormInCheckout","promoCodeComponent","RewardPoint","ShowPartner","Partner","classes","class1","indexOf","Items","item","LineItemTooltip","Label","Value","BookingEnabled","AllowRefund","removeAttr","totalPriceSummary","Tooltip","isNaN","removeItem","availability","dateSelector","daterangepicker","opens","startDate","endDate","minDate","locale","autoApply","isInvalidDate","date","j","aDate","isSame","isCustomDate","availabilityElement","am","Am","pm","Pm","price","Price","cellClasses","dateSelectorMobile","setStartDate","setEndDate","tooltips","popupOptions","position","popup","addEventListener","document","debounce","always","dom","i2svg","bindSubmitButton","handleSubmitClick","e","preventDefault","stopPropagation","submitForm","parents","RedirectUrl","click","setFiltersFromUrl","stateFilters","Object","fromEntries","entries","filter","_ref","backToParkLink","history","replaceState","pathname","hidePanel","panelToggle","toggleLabel","defaultText","toggleText","chevronDown","chevronUp","panelDOMRect","panelCollapse","getBoundingClientRect","height","setTimeout","transitionDuration","getTransitionDurationFromElement","showPanel","scrollHeight","initPanelCollapse","not","activeToggleText","event","checkoutLoginTabs","is","timer","keydown","key","clearTimeout","keypress","RegExp","test","String","fromCharCode","which","bind","subscribe","isValid","bookNowButton","parent","submit","events","default","Promise","all","then"],"sourceRoot":""}