{"version":3,"file":"booking-packaged-from-ts-2023-11-22.js","mappings":"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","sources":["webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/availability.model.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/room-booking.model.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/booking.model.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/common.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/step2.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/step3.ts","webpack://chalets-meribel.co.uk/./includes/packaging/booking-module/cards.ts","webpack://chalets-meribel.co.uk/./includes/packaging/entry-booking-module.ts"],"sourcesContent":["export enum ChaletNameEnum {\r\n LaChouette = \"LaChouette\",\r\n PetitePia = \"PetitePia\",\r\n Caro = \"Caro\",\r\n LesLoups = \"LesLoups\",\r\n Yeti = \"Yeti\",\r\n Galta = \"Galta\",\r\n Alya = \"Alya\",\r\n LesSolans = \"LesSolans\",\r\n}\r\n\r\nexport interface Availability {\r\n Id: number;\r\n name: ChaletNameEnum;\r\n arrivalDate: Date\r\n departureDate: Date\r\n duration: number\r\n minPax: number\r\n maxPax: number\r\n schoolHoliday: string\r\n originalPrice: number\r\n currentPrice: number\r\n discount: number\r\n notes: string\r\n\r\n productEnhancements: string\r\n\r\n isFullyBooked: boolean\r\n\r\n roomsBooked: boolean[],\r\n isPricePerPerson: boolean,\r\n}","export enum RoomBookingStatusEnum {\r\n Selected = \"selected\",\r\n InvalidAsTooManyGuests = \"invalid\",\r\n Unavailable = \"unavailable\",\r\n Unselected = \"unselected\",\r\n InvalidAsNoGuest = \"invalidAsNoGuest\",\r\n InvalidAsNoEnoughGuestForApt = \"invalidAsNoEnoughGuestForApt\",\r\n}\r\n\r\nexport class RoomBooking {\r\n status: RoomBookingStatusEnum;\r\n aptMinPax: number;\r\n maxPax: number;\r\n singleRoomSupplementFactor: number;\r\n thirdGuestOnwardDiscountFactor: number;\r\n babyPrice: number;\r\n childDiscount: number;\r\n extraPriceForThisRoom: number;\r\n aptDiscountPerPerson: number;\r\n\r\n adultsNumber: number;\r\n childrenNumber: number;\r\n babiesNumber: number;\r\n\r\n\r\n calculatedPrice: number;\r\n}","import { AnnexRoom } from \"./annex-room.model\";\r\nimport { Availability } from \"./availability.model\";\r\nimport { RoomBooking } from \"./room-booking.model\";\r\n\r\nexport enum BookingTypeEnum {\r\n ExclusiveBooking = \"exclusiveBooking\",\r\n PartialBooking = \"partialBooking\",\r\n}\r\n\r\nexport class Booking {\r\n constructor(public availability: Availability) {\r\n }\r\n\r\n bookingType: BookingTypeEnum;\r\n annexRooms: AnnexRoom;\r\n roomsBooking: RoomBooking[];\r\n\r\n finalPrice: number;\r\n}","import { Availability } from \"./availability.model\";\r\nimport { Step1 } from \"./cards\";\r\nimport { Step2 } from \"./step2\";\r\nimport { Step3 } from \"./step3\";\r\n\r\nexport class Variables {\r\n\r\n public static get $(): any {\r\n return window['$'];\r\n }\r\n\r\n public static loadingDivId = \"dvLoading\";\r\n public static submittingDivId = \"dvSubmittingForm\";\r\n public static availabilitiesDivId = \"dvAvailabilities\";\r\n\r\n\r\n}\r\n\r\nconst isDevMode: boolean = false;\r\n\r\n// the function being used to fetch json files from API\r\nexport const getJsonDataFor = (fileName: string) => {\r\n return new Promise((resolve, reject) => {\r\n Variables.$.ajax({\r\n dataType: \"json\",\r\n url: `${isDevMode ? 'http://localhost:5000' : 'https://www.luxurychaletsmeribel.co.uk/api'}/public-files/${fileName}.json`,\r\n })\r\n .then((response) => {\r\n resolve(response);\r\n })\r\n .fail(() => {\r\n console.log(`failed to load ${fileName}`);\r\n Variables.$(`#${Variables.availabilitiesDivId}`).hide();\r\n Variables.$(\"#pErrorAvailabilities\").show();\r\n reject();\r\n });\r\n });\r\n};\r\n\r\nexport const dateToString = (date: Date, includeYear: boolean = true) => {\r\n let options: Intl.DateTimeFormatOptions = {\r\n day: \"numeric\"\r\n };\r\n options.month = \"short\";\r\n if (includeYear) {\r\n options.year = \"numeric\";\r\n }\r\n return date.toLocaleString(\"en-ie\", options);\r\n}\r\nexport const moneyToString = (money: number, includeFraction: boolean = false, currencySymbol = \"€\") => {\r\n if (money == null) {\r\n return \"\";\r\n }\r\n let options: Intl.NumberFormatOptions = {\r\n };\r\n if (includeFraction) {\r\n options.minimumFractionDigits = 2;\r\n options.maximumFractionDigits = 2;\r\n }\r\n return currencySymbol + money.toLocaleString(undefined, options);\r\n}\r\n\r\nexport const scrollToTop = (elementId: string) => {\r\n Variables.$(window).scrollTop(Variables.$(`#${elementId}`).offset().top);\r\n}\r\n\r\n\r\n\r\nexport const setStepQS = (stepName: 'step2' | 'step3' | null) => {\r\n\r\n //console.log('called set step method', stepName);\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n\r\n // if we are heading to the first step, i.e., cards\r\n if (stepName == null) {\r\n\r\n const currentStepName = urlParams.get('bookingStep');\r\n if (currentStepName) {\r\n urlParams.delete('bookingStep');\r\n\r\n const newUrl = new URL(window.location.href);\r\n newUrl.search = String(urlParams);\r\n window.history.replaceState({}, document.title, newUrl);\r\n window.onpopstate = () => {\r\n // If we don't do the following lines, the back button needs to pressed multiple time to work\r\n window.onpopstate = undefined;\r\n sessionStorage.removeItem('booking-state-pushed');\r\n\r\n // this is doing the back button\r\n window.history.back();\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n\r\n urlParams.set('bookingStep', stepName);\r\n\r\n const newUrl = new URL(window.location.href);\r\n newUrl.search = String(urlParams);\r\n\r\n if (sessionStorage.getItem('booking-state-pushed') === 'true') {\r\n window.history.replaceState({}, document.title, newUrl);\r\n } else {\r\n sessionStorage.setItem('booking-state-pushed', 'true');\r\n window.history.pushState({}, document.title, newUrl);\r\n }\r\n\r\n window.onpopstate = () => {\r\n onpopstate(stepName);\r\n };\r\n\r\n\r\n\r\n}\r\nconst onpopstate = (callerState: 'step2' | 'step3' | null) => {\r\n\r\n // when the sub,it button is clicked, this pop state is called as well,\r\n // while we want to do all stuff below only if the BROWSER BACK button is clicked\r\n if (Step3.instance.submitButtonPoppingState) {\r\n Step3.instance.submitButtonPoppingState = false;\r\n return;\r\n }\r\n\r\n window.onpopstate = () => {\r\n window.onpopstate = undefined;\r\n sessionStorage.removeItem('booking-state-pushed');\r\n window.history.back();\r\n }\r\n\r\n // If the user clicks on the BROWSER BACK button, we reload the page. That basically leads to the first step, i.e., cards.\r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 1);\r\n\r\n return;\r\n // //const urlParams = new URLSearchParams(window.location.search);\r\n\r\n // // const targetStepName = urlParams.get('bookingStep');\r\n // console.log(callerState);\r\n // // console.log(window.location.search);\r\n // sessionStorage.removeItem('booking-state-pushed');\r\n // switch (callerState) {\r\n // case 'step2':\r\n // Step2.instance.clickStartOverButton();\r\n // window.onpopstate = () => {\r\n // window.onpopstate = undefined;\r\n // //window.history.back();\r\n // }\r\n // return;\r\n // case 'step3':\r\n // Step3.instance.clickBackButton();\r\n // break;\r\n // default:\r\n // break;\r\n // }\r\n // window.onpopstate = undefined;\r\n\r\n}\r\n","import { Availability, ChaletNameEnum } from \"./availability.model\";\r\nimport { Booking, BookingTypeEnum } from \"./booking.model\";\r\nimport { Step1 } from \"./cards\";\r\nimport { dateToString, moneyToString, scrollToTop, setStepQS, Variables } from \"./common\";\r\nimport { RoomBooking, RoomBookingStatusEnum } from \"./room-booking.model\";\r\nimport { Step3 } from \"./step3\";\r\n\r\n/**\r\n * Using singleton design pattern\r\n */\r\nexport class Step2 {\r\n\r\n private static _instance: Step2;\r\n\r\n /**\r\n * The Singleton's constructor should always be private to prevent direct\r\n * construction calls with the `new` operator.\r\n */\r\n private constructor() {\r\n\r\n // disable back button, and anything else that causes leaving booking\r\n //disableBackButton();\r\n\r\n this.handleStartOverButton();\r\n this.handleNextButton();\r\n\r\n // register an action for when an li which contains the booking type option is clicked\r\n this.handleBookingTypeSelection();\r\n\r\n this.handleExtraRoomSelection();\r\n\r\n this.handleRoomBookingsSelection();\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * The static method that controls the access to the singleton instance.\r\n *\r\n * This implementation let you subclass the Singleton class while keeping\r\n * just one instance of each subclass around.\r\n */\r\n public static get instance(): Step2 {\r\n if (!Step2._instance) {\r\n Step2._instance = new Step2();\r\n }\r\n\r\n return Step2._instance;\r\n }\r\n\r\n\r\n\r\n private stepId = \"bookingStep2\";\r\n private bookingSizeSelectionListId = \"ulBookingSizeSelectionList\";\r\n private roomingAndGuestSelectionId = \"roomingAndGuestSelection\";\r\n private pricingNotesId = \"pricingNotes\";\r\n private calculatedPriceId = \"calculatedPrice\";\r\n private btnStep2To3Id = \"btnStep2To3\";\r\n\r\n /**\r\n * hide : hides step 2\r\n */\r\n public hide() {\r\n Variables.$(`#${this.stepId}`).removeClass(\"active\");\r\n }\r\n\r\n /**\r\n * show : shows step 2\r\n */\r\n public show() {\r\n Variables.$(`#${this.stepId}`).addClass(\"active\");\r\n scrollToTop(this.stepId);\r\n setStepQS('step2');\r\n }\r\n\r\n\r\n private $bookingTypeRadio = Variables.$(\"input:radio[name=bookingSizeSelection]\");\r\n\r\n\r\n\r\n public clickStartOverButton() {\r\n this.hide();\r\n Step1.instance.show();\r\n }\r\n public clickNextButton() {\r\n if (!this.booking?.finalPrice) { // proceed to the next step if the final price is calculated\r\n return false;\r\n }\r\n Step3.instance.setBooking(this.booking);\r\n this.hide();\r\n Step3.instance.show();\r\n }\r\n\r\n private handleStartOverButton = () => {\r\n Variables.$(`#${this.stepId} #btnStartOver`).click(() => {\r\n this.clickStartOverButton();\r\n });\r\n }\r\n private handleNextButton = () => {\r\n Variables.$(`#${this.stepId} #${this.btnStep2To3Id}`).click((event) => {\r\n this.clickNextButton();\r\n });\r\n }\r\n\r\n private handleBookingTypeSelection = () => {\r\n Variables.$(`#${this.stepId} #bookingType #${this.bookingSizeSelectionListId} li`).click((event) => {\r\n let $li = Variables.$(event.currentTarget);\r\n\r\n // remove the selection which was selected before\r\n $li.siblings(\"li\").removeClass(\"selected\");\r\n\r\n // if the previous selected option is not the same as the current clicked item, now select it and update UI\r\n if (!$li.hasClass(\"selected\")) {\r\n $li.addClass(\"selected\");\r\n\r\n // set the checked attr for the radio inside li\r\n this.$bookingTypeRadio.filter(\":checked\").prop(\"checked\", false);\r\n\r\n // fire the event that the radio checked\r\n $li.find(\"input\").prop(\"checked\", true).change();\r\n\r\n this.updateUI();\r\n }\r\n\r\n return false; // this stops propagation\r\n });\r\n\r\n }\r\n\r\n private handleExtraRoomSelection() {\r\n Variables.$(\"select#extraRooms\").change((event) => {\r\n this.updateUI();\r\n });\r\n }\r\n\r\n private handleRoomBookingsSelection = () => {\r\n\r\n // guestAges is inside Li\r\n // we want to check/uncheck Li by user click\r\n // however when the click is inside guestAges we don't want this\r\n // the reason is that in guestAge there are some drop downs, and clicking on them should not affect Li selection\r\n // so in this event handler below, we only say if guestAge area clicked do not bubble event up\r\n Variables.$(`#${this.stepId} #${this.roomingAndGuestSelectionId} li .guestAges`).click((event) => {\r\n return false; // this stops propagation\r\n });\r\n\r\n\r\n\r\n Variables.$(`#${this.stepId} #${this.roomingAndGuestSelectionId} li`).click((event) => {\r\n let $li = Variables.$(event.currentTarget);\r\n\r\n // ignore check box click if it is unavailable, as it is not selectable\r\n if ($li.hasClass(\"unavailable\")) {\r\n return false;\r\n }\r\n\r\n // if the previous selected option is not the same as the current clicked item, now select it and update UI\r\n if (!$li.hasClass(\"selected\")) {\r\n $li.addClass(\"selected\");\r\n\r\n // fire the event that the checkbox checked\r\n $li.find(\"input\").prop(\"checked\", true).change();\r\n\r\n } else {\r\n $li.removeClass(\"selected\");\r\n\r\n // fire the event that the checkbox checked\r\n $li.find(\"input\").prop(\"checked\", false).change();\r\n }\r\n\r\n this.updateUI();\r\n\r\n return false; // this stops propagation\r\n });\r\n\r\n\r\n Variables.$(`#${this.stepId} #${this.roomingAndGuestSelectionId} li .guestAges select`).change(() => {\r\n this.updateUI();\r\n });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * setAvailability\r\n */\r\n public setAvailability(availability: Availability) {\r\n this.booking = new Booking(availability);\r\n\r\n this.setupBookingSummary();\r\n\r\n this.updateUI();\r\n }\r\n\r\n\r\n private booking: Booking\r\n\r\n private updateUI() {\r\n\r\n this.setupBookingType();\r\n\r\n this.setupRoomingExtra();\r\n\r\n this.setupRoomBookings();\r\n\r\n this.setupPricingNotes();\r\n\r\n this.setupPrice()\r\n\r\n this.updateNextButtonUI();\r\n\r\n this.setupSummaryMessage();\r\n\r\n }\r\n\r\n\r\n\r\n\r\n\r\n private setupBookingSummary() {\r\n const $bookingSummary = Variables.$(`#${this.stepId} #bookingSummary`);\r\n\r\n // setting up the property name from the data attribute\r\n const $propertyName = $bookingSummary.find('#spnPropertyName');\r\n $propertyName.text($propertyName.data(`title-${this.booking.availability.name.toLowerCase()}`));\r\n\r\n // setting arrival date\r\n $bookingSummary.find('#spnArrivalDate').text(dateToString(this.booking.availability.arrivalDate, true));\r\n\r\n // setting departure date\r\n $bookingSummary.find('#endDateText').text(dateToString(this.booking.availability.departureDate, true));\r\n\r\n // setting duration\r\n $bookingSummary.find('#spnStayDurationInNights').text(`${this.booking.availability.duration} Nights`);\r\n }\r\n\r\n\r\n\r\n\r\n private setupBookingType() {\r\n\r\n const $bookingTypeDiv = Variables.$(`#${this.stepId} #bookingType`);\r\n\r\n if (!this.booking.availability.isPricePerPerson || // can't book partially ==> only whole chalet\r\n !this.booking.availability.roomsBooked?.length // there is no data about booking of rooms ==> only whole chalet\r\n ) {\r\n $bookingTypeDiv.hide();\r\n this.booking.bookingType = BookingTypeEnum.ExclusiveBooking;\r\n return;\r\n }\r\n\r\n\r\n if (this.booking.availability.roomsBooked.indexOf(true) !== -1 // there is some rooms already booked, ==> only partial booking available\r\n ) {\r\n $bookingTypeDiv.hide();\r\n this.booking.bookingType = BookingTypeEnum.PartialBooking;\r\n return;\r\n }\r\n\r\n\r\n // both whole chalet and partial booking options are available\r\n $bookingTypeDiv.show();\r\n\r\n // now we show booking type div, so we need to look at UI to set booking type\r\n // the id of radio options are the same as booking type enum values\r\n this.booking.bookingType = this.$bookingTypeRadio.filter(\":checked\").attr('id');\r\n\r\n\r\n }\r\n\r\n private setupRoomingExtra() {\r\n\r\n const $roomingExtraDiv = Variables.$(`#${this.stepId} #optionalRoomingExtras`);\r\n\r\n if (this.booking.availability.name !== ChaletNameEnum.PetitePia || this.booking.bookingType === BookingTypeEnum.PartialBooking) {\r\n this.booking.annexRooms = null;\r\n $roomingExtraDiv.hide();\r\n return;\r\n }\r\n\r\n\r\n const $dropdown = $roomingExtraDiv.find('select');\r\n const annexRoomPrice = Number($dropdown.val());\r\n const $annexSelectedOption = $dropdown.find(\":selected\");\r\n\r\n\r\n // the value of the selected item in the dropdown shows the price for annex room, this values coming from site wide variables\r\n this.booking.annexRooms = {\r\n maxPax: $annexSelectedOption.data('max-pax'),\r\n price: annexRoomPrice,\r\n roomsNumber: $annexSelectedOption.data('rooms-number')\r\n }\r\n\r\n $roomingExtraDiv.show();\r\n }\r\n\r\n\r\n\r\n private get roomBookingIsAvailable(): boolean {\r\n return this.booking.availability.isPricePerPerson && // can book partially and\r\n this.booking.bookingType == BookingTypeEnum.PartialBooking // user selected to book partially above\r\n ;\r\n }\r\n\r\n\r\n private setupRoomBookings() {\r\n\r\n const $roomBookingDiv = Variables.$(`#${this.stepId} #${this.roomingAndGuestSelectionId}`);\r\n\r\n if (!this.roomBookingIsAvailable) {\r\n $roomBookingDiv.hide();\r\n this.booking.roomsBooking = null;\r\n return;\r\n }\r\n\r\n $roomBookingDiv.show();\r\n\r\n this.booking.roomsBooking = [];\r\n\r\n $roomBookingDiv.find('ul').hide();// all room booking for all chalets\r\n const $roomBookingUl = $roomBookingDiv.find(`ul#${this.booking.availability.name}BedroomOptionsList`).show(); // show the room booking for this chalet\r\n\r\n $roomBookingUl.find('li').\r\n each((index, element) => {\r\n const $li = Variables.$(element);\r\n const roomBooking = new RoomBooking();\r\n this.booking.roomsBooking.push(roomBooking);\r\n\r\n roomBooking.maxPax = $li.data('max-pax');\r\n roomBooking.singleRoomSupplementFactor = $li.data('single-room-supplement');\r\n roomBooking.thirdGuestOnwardDiscountFactor = $li.data('third-guest-discount-factor');\r\n roomBooking.childDiscount = $li.data('child-discount');\r\n roomBooking.babyPrice = $li.data('baby-price');\r\n roomBooking.extraPriceForThisRoom = $li.data('extra-price-for-this-room');\r\n roomBooking.aptDiscountPerPerson = $li.data('apt-discount-per-person');\r\n roomBooking.aptMinPax = $li.data('apt-min-pax');\r\n\r\n\r\n\r\n // find dropdown which had id starting with \"numberOfAdultsIn\"\r\n roomBooking.adultsNumber = Number($li.find(\"select[id^='numberOfAdultsIn']\").val());\r\n\r\n // find dropdown which had id starting with \"numberOfChildrenIn\"\r\n roomBooking.childrenNumber = Number($li.find(\"select[id^='numberOfChildrenIn']\").val());\r\n\r\n // find dropdown which had id starting with \"numberOfBabiesIn\"\r\n roomBooking.babiesNumber = Number($li.find(\"select[id^='numberOfBabiesIn']\").val());\r\n\r\n\r\n\r\n if (this.booking.availability.roomsBooked[index]) { // the room is not available\r\n $li.removeClass('selected').removeClass('validationError').addClass('unavailable');\r\n roomBooking.status = RoomBookingStatusEnum.Unavailable;\r\n return;\r\n }\r\n\r\n // the room is available, so remove the class if it exists there\r\n $li.removeClass('unavailable');\r\n\r\n if (!$li.hasClass('selected')) { // the room is not selected by user\r\n $li.removeClass('validationError');\r\n roomBooking.status = RoomBookingStatusEnum.Unselected;\r\n return;\r\n }\r\n\r\n\r\n // if we reach to this point it means the user selected the room, now we need to check if it is valid\r\n\r\n if (\r\n roomBooking.adultsNumber + roomBooking.childrenNumber > roomBooking.maxPax // the combined total number of adults and children exceeds the number of bed spaces\r\n ) {\r\n $li.addClass('validationError'); // it is selected but invalid\r\n roomBooking.status = RoomBookingStatusEnum.InvalidAsTooManyGuests;\r\n } else if (roomBooking.adultsNumber + roomBooking.childrenNumber === 0) { // there is no guest in the room\r\n $li.addClass('validationError'); // it is selected but invalid\r\n roomBooking.status = RoomBookingStatusEnum.InvalidAsNoGuest;\r\n } else if (roomBooking.aptMinPax && roomBooking.adultsNumber + roomBooking.childrenNumber < roomBooking.aptMinPax) { // no enough guests for apt.\r\n $li.addClass('validationError'); // it is selected but invalid\r\n roomBooking.status = RoomBookingStatusEnum.InvalidAsNoEnoughGuestForApt;\r\n }\r\n else {\r\n $li.removeClass('validationError'); // it is selected with no validation error\r\n roomBooking.status = RoomBookingStatusEnum.Selected;\r\n }\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n\r\n private setupPricingNotes() {\r\n const $pricingNotesDiv = Variables.$(`#${this.stepId} #${this.pricingNotesId}`);\r\n // by default hide it, if any message needed to appear, we show that.\r\n $pricingNotesDiv.hide();\r\n\r\n if (!this.roomBookingIsAvailable || !this.booking.roomsBooking?.length) { // there is no room booking, i.e., partial booking\r\n return;\r\n }\r\n\r\n if (this.booking.roomsBooking.some(rmb => rmb.status === RoomBookingStatusEnum.InvalidAsTooManyGuests)) { // if there is a room with PAX error\r\n $pricingNotesDiv.show().find('#spnPaxErrorMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnPaxErrorMessage').hide();\r\n }\r\n\r\n if (this.booking.roomsBooking.some(rmb => rmb.status === RoomBookingStatusEnum.InvalidAsNoGuest)) { // if there is a room with no (non-baby) guest\r\n $pricingNotesDiv.show().find('#spnZeroPaxErrorMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnZeroPaxErrorMessage').hide();\r\n }\r\n\r\n if (this.booking.roomsBooking.some(rmb => rmb.status === RoomBookingStatusEnum.InvalidAsNoEnoughGuestForApt)) { // if apartment does not have enough (non-baby) guest\r\n $pricingNotesDiv.show().find('#spnApartmentMinPaxErrorMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnApartmentMinPaxErrorMessage').hide();\r\n }\r\n\r\n // for the messages below we only look at the selected rooms to book\r\n const $selectedRoomBookings = this.booking.roomsBooking.filter(rmb => rmb.status === RoomBookingStatusEnum.Selected);\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.adultsNumber < 2 && rmb.childrenNumber > 0 && rmb.thirdGuestOnwardDiscountFactor)) { // if there is a room with a child within the first two guests\r\n $pricingNotesDiv.show().find('#spnChildDiscountMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnChildDiscountMessage').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => !rmb.thirdGuestOnwardDiscountFactor && rmb.childrenNumber > 0)) { // if there is a room with a child within && the third guest discount is not applicable\r\n $pricingNotesDiv.show().find('#spnChildDiscountNotHavingThirdGuestDiscountMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnChildDiscountNotHavingThirdGuestDiscountMessage').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.babiesNumber > 0)) { // if there are some rooms with babies in\r\n $pricingNotesDiv.show().find('#spnBabyFeeMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnBabyFeeMessage').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.adultsNumber + rmb.childrenNumber === 1 && rmb.singleRoomSupplementFactor)) { // if there is a room with single supplement\r\n $pricingNotesDiv.show().find('#spnSingleSupplementMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnSingleSupplementMessage').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.extraPriceForThisRoom)) { // if there is a room with extra price for premium room\r\n $pricingNotesDiv.show().find('#spnMasterBedroomSupplementMessage').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnMasterBedroomSupplementMessage').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.adultsNumber + rmb.childrenNumber > 2 && rmb.thirdGuestOnwardDiscountFactor)) { // if there is a room with more than 2 (non-baby) guests\r\n $pricingNotesDiv.show().find('#spnHalfPriceThirdGuestInBedroom').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnHalfPriceThirdGuestInBedroom').hide();\r\n }\r\n\r\n if ($selectedRoomBookings.some(rmb => rmb.aptDiscountPerPerson)) { // if there is an apartment discount\r\n $pricingNotesDiv.show().find('#spnDiscountForAptBooking').show();\r\n } else {\r\n $pricingNotesDiv.find('#spnDiscountForAptBooking').hide();\r\n }\r\n }\r\n\r\n\r\n\r\n private setupPrice() {\r\n // we initially set price to zero, to make calculation for plus operator easier. We may set it back to null later\r\n this.booking.finalPrice = 0;\r\n if (this.booking.bookingType === BookingTypeEnum.ExclusiveBooking) {\r\n this.calculatePriceForWholeChaletBooking();\r\n } else { // booking is partial for rooms\r\n this.calculatePriceForPartialBooking();\r\n }\r\n\r\n const $calculatedPriceDiv = Variables.$(`#${this.stepId} #${this.calculatedPriceId}`);\r\n if (!this.booking.finalPrice) { // calculated price is null or 0\r\n $calculatedPriceDiv.hide();\r\n } else {\r\n $calculatedPriceDiv.text(\r\n moneyToString(this.booking.finalPrice, true)\r\n );\r\n $calculatedPriceDiv.show();\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n\r\n private calculatePriceForPartialBooking() {\r\n var selectedRooms = this.booking.roomsBooking.filter(rm => rm.status === RoomBookingStatusEnum.Selected);\r\n\r\n if (selectedRooms.length === 0 ||\r\n this.booking.roomsBooking.some(rm => rm.status === RoomBookingStatusEnum.InvalidAsTooManyGuests) ||\r\n this.booking.roomsBooking.some(rm => rm.status === RoomBookingStatusEnum.InvalidAsNoGuest) ||\r\n this.booking.roomsBooking.some(rm => rm.status === RoomBookingStatusEnum.InvalidAsNoEnoughGuestForApt)\r\n ) { // there is no selected room, or some rooms are invalid\r\n this.booking.finalPrice = null;\r\n return;\r\n }\r\n\r\n selectedRooms.forEach(roomBooking => {\r\n roomBooking.calculatedPrice = 0;\r\n\r\n if (roomBooking.thirdGuestOnwardDiscountFactor) {\r\n\r\n const adultAndChild = roomBooking.adultsNumber + roomBooking.childrenNumber;\r\n const adultBeforeThirdGuest = Math.min(roomBooking.adultsNumber, 2);\r\n const childBeforeThirdGuest = 2 - adultBeforeThirdGuest;// from the first 2 guests how many children?\r\n const guestFromThirdGuestOnward = Math.max(adultAndChild - 2, 0);\r\n\r\n // for adults before 3 guests, consider full price\r\n roomBooking.calculatedPrice += adultBeforeThirdGuest * this.booking.availability.currentPrice;\r\n\r\n // for children before 3 guests, consider child discount\r\n roomBooking.calculatedPrice += childBeforeThirdGuest * (this.booking.availability.currentPrice - roomBooking.childDiscount);\r\n\r\n\r\n // for any guest (not babies) from third onward consider third guest discount\r\n roomBooking.calculatedPrice += guestFromThirdGuestOnward * (roomBooking.thirdGuestOnwardDiscountFactor * this.booking.availability.currentPrice);\r\n\r\n } else {\r\n // for adults consider full price\r\n roomBooking.calculatedPrice += roomBooking.adultsNumber * this.booking.availability.currentPrice;\r\n\r\n // for children consider child discount\r\n roomBooking.calculatedPrice += roomBooking.childrenNumber * (this.booking.availability.currentPrice - roomBooking.childDiscount);\r\n }\r\n\r\n\r\n\r\n\r\n if (roomBooking.singleRoomSupplementFactor) {\r\n\r\n if (roomBooking.adultsNumber === 1 && !roomBooking.childrenNumber) { // only one person in the room who is an adult\r\n roomBooking.calculatedPrice += (roomBooking.singleRoomSupplementFactor - 1) * this.booking.availability.currentPrice;\r\n } else if (!roomBooking.adultsNumber && roomBooking.childrenNumber === 1) { // only one person in the room who is a child\r\n roomBooking.calculatedPrice += (roomBooking.singleRoomSupplementFactor - 1) * (this.booking.availability.currentPrice - roomBooking.childDiscount);\r\n }\r\n }\r\n\r\n\r\n if (roomBooking.babiesNumber) {\r\n roomBooking.calculatedPrice += roomBooking.babiesNumber * roomBooking.babyPrice;\r\n }\r\n\r\n if (roomBooking.extraPriceForThisRoom) {\r\n roomBooking.calculatedPrice += roomBooking.extraPriceForThisRoom;\r\n }\r\n\r\n if (roomBooking.aptDiscountPerPerson) {\r\n roomBooking.calculatedPrice -= roomBooking.aptDiscountPerPerson * (roomBooking.adultsNumber + roomBooking.childrenNumber);\r\n }\r\n\r\n this.booking.finalPrice += roomBooking.calculatedPrice;\r\n\r\n });\r\n\r\n }\r\n\r\n private calculatePriceForWholeChaletBooking() {\r\n\r\n if (this.booking.availability.isPricePerPerson) {\r\n this.booking.finalPrice = this.booking.availability.currentPrice * this.booking.availability.minPax;\r\n } else {\r\n this.booking.finalPrice = this.booking.availability.currentPrice;\r\n }\r\n\r\n if (this.booking.annexRooms) {\r\n this.booking.finalPrice += this.booking.annexRooms.price;\r\n }\r\n }\r\n\r\n private updateNextButtonUI() {\r\n const $nextButtonParent = Variables.$(`#${this.stepId} #${this.btnStep2To3Id}`).closest('div');\r\n if (this.booking.finalPrice) {\r\n $nextButtonParent.removeClass('forbidden');\r\n } else {\r\n $nextButtonParent.addClass('forbidden');\r\n }\r\n }\r\n\r\n private setupSummaryMessage() {\r\n\r\n if (this.booking.bookingType === BookingTypeEnum.ExclusiveBooking &&\r\n this.booking.annexRooms == null &&\r\n this.booking.roomsBooking == null) {\r\n Variables.$(`#${this.stepId} #pCanAdjustPrice`).hide();\r\n Variables.$(`#${this.stepId} #pCannotAdjustPrice`).show();\r\n } else {\r\n Variables.$(`#${this.stepId} #pCanAdjustPrice`).show();\r\n Variables.$(`#${this.stepId} #pCannotAdjustPrice`).hide();\r\n }\r\n }\r\n\r\n public findRoom(roomIndex: number, chaletName: ChaletNameEnum): { name: string, abbreviation: string } {\r\n const $roomLi = Variables.$(`#${this.stepId} #${this.roomingAndGuestSelectionId} ul#${chaletName}BedroomOptionsList li`).eq(roomIndex);\r\n return { abbreviation: $roomLi.data('room-abbv-name'), name: $roomLi.data('room-name') }\r\n }\r\n}\r\n","import { Booking } from \"./booking.model\";\r\nimport { dateToString, moneyToString, scrollToTop, setStepQS, Variables } from \"./common\";\r\nimport { RoomBookingStatusEnum } from \"./room-booking.model\";\r\nimport { Step2 } from \"./step2\";\r\n\r\n/**\r\n * Using singleton design pattern\r\n */\r\nexport class Step3 {\r\n\r\n private static _instance: Step3;\r\n\r\n /**\r\n * The Singleton's constructor should always be private to prevent direct\r\n * construction calls with the `new` operator.\r\n */\r\n private constructor() {\r\n\r\n this.handleBackButton();\r\n\r\n this.handleSubmitButton();\r\n\r\n }\r\n\r\n\r\n\r\n /**\r\n * The static method that controls the access to the singleton instance.\r\n *\r\n * This implementation let you subclass the Singleton class while keeping\r\n * just one instance of each subclass around.\r\n */\r\n public static get instance(): Step3 {\r\n if (!Step3._instance) {\r\n Step3._instance = new Step3();\r\n }\r\n\r\n return Step3._instance;\r\n }\r\n\r\n\r\n\r\n private stepId = \"bookingStep3\";\r\n private submitDivId = \"dvSubmit\";\r\n private formId = \"submitForm\";\r\n private ignoreInEmailValue = \"IgnoreThisFieldInEmail\";\r\n\r\n /**\r\n * hide : hides step 3\r\n */\r\n public hide() {\r\n Variables.$(`#${this.stepId}`).removeClass(\"active\");\r\n }\r\n\r\n /**\r\n * show : shows step 3\r\n */\r\n public show() {\r\n Variables.$(`#${this.stepId}`).addClass(\"active\");\r\n scrollToTop(this.stepId);\r\n setStepQS('step3');\r\n }\r\n\r\n /**\r\n * clickBackButton\r\n */\r\n public clickBackButton() {\r\n this.hide();\r\n Step2.instance.show();\r\n }\r\n\r\n private handleBackButton = () => {\r\n Variables.$(`#${this.stepId} #btnBackToStep2`).click(() => {\r\n this.clickBackButton();\r\n });\r\n }\r\n\r\n private handleSubmitButton() {\r\n Variables.$(`#${this.stepId} #${this.submitDivId}`).click(() => {\r\n this.submitForm();\r\n });\r\n\r\n Variables.$(`#${this.stepId} form#${this.formId}`).on(\"beforeSubmit\", () => {\r\n\r\n Variables.$(`#${this.stepId} #dvStep3TopMessage`).hide();\r\n Variables.$(`#${this.stepId} #step3BottomButtons`).hide();\r\n Variables.$(`#${this.stepId} #submitForm`).hide();\r\n\r\n Variables.$(`#${this.stepId} #${Variables.submittingDivId}`).show();\r\n\r\n // scrolling to the submitting div,because sometimes it was scrolling to the top of the page for some reason!\r\n setTimeout(() => {\r\n Variables.$(\"html, body\").animate(\r\n {\r\n scrollTop:\r\n Variables.$(`#${this.stepId} #${Variables.submittingDivId}`)\r\n .offset().top - 100,\r\n },\r\n 1\r\n );\r\n }, 1);\r\n });\r\n\r\n Variables.$(`#${this.stepId} form#${this.formId}`).on(\"afterSuccess\", () => {\r\n Variables.$(`#${this.stepId} #${Variables.submittingDivId}`).hide();\r\n Variables.$(`#${Variables.availabilitiesDivId}`).show();\r\n\r\n // remove bookingStep=Step3 from the end of URL\r\n window.history.replaceState(null, '', window.location.pathname);\r\n //reEnableBackButton();\r\n });\r\n Variables.$(`#${this.stepId} form#${this.formId}`).on(\"afterError\", () => {\r\n\r\n Variables.$(`#${this.stepId} #dvStep3TopMessage`).show();\r\n Variables.$(`#${this.stepId} #step3BottomButtons`).show();\r\n Variables.$(`#${this.stepId} #submitForm`).show();\r\n\r\n Variables.$(`#${this.stepId} #${Variables.submittingDivId}`).hide();\r\n Variables.$(`#${Variables.availabilitiesDivId}`).show();\r\n });\r\n\r\n }\r\n\r\n private booking: Booking\r\n\r\n /**\r\n * setBooking\r\n */\r\n public setBooking(booking: Booking) {\r\n this.booking = booking;\r\n\r\n Variables.$(`#hdChaletName`).val(this.booking.availability.name);\r\n Variables.$(`#hdArrivalDate`).val(dateToString(this.booking.availability.arrivalDate, true));\r\n Variables.$(`#hdDepartureDate`).val(dateToString(this.booking.availability.departureDate, true));\r\n Variables.$(`#hdDuration`).val(`${this.booking.availability.duration} Nights`);\r\n Variables.$(`#hdTotalPrice`).val(moneyToString(this.booking.finalPrice, true));\r\n\r\n const $annexInput = Variables.$(\"input#hdAnnex\");\r\n if (this.booking.annexRooms?.price) {\r\n $annexInput.val(`€${this.booking.annexRooms.price} for ${this.booking.annexRooms.roomsNumber} annex bedroom(s) included.`)\r\n } else {\r\n $annexInput.val(this.ignoreInEmailValue);\r\n }\r\n\r\n const $roomsDescPlaceHolder = Variables.$(\"#dvRoomsDescriptionsForEmail\");\r\n $roomsDescPlaceHolder.html();\r\n\r\n const $paxInput = Variables.$(\"input#hdPax\");\r\n const $inputsShowingIfPartialRooming = Variables.$(\"input[data-conditional-for-email='HasRooming']\");\r\n if (!this.booking.roomsBooking?.length) { // is not partial booking\r\n\r\n if (this.booking.annexRooms) { // if is Chalet Petite\r\n $paxInput.val(`Max ${this.booking.annexRooms.maxPax} guests`);\r\n } else if (this.booking.availability.minPax !== this.booking.availability.maxPax) {// if is Chalet LaChoute\r\n $paxInput.val(`${this.booking.availability.minPax}-${this.booking.availability.maxPax}`);\r\n } else {\r\n $paxInput.val(`${this.booking.availability.maxPax}`);\r\n }\r\n\r\n $inputsShowingIfPartialRooming.val(this.ignoreInEmailValue);\r\n\r\n } else {\r\n // Since we include details of PAX for each room, we do not show Pax No. here\r\n $paxInput.val(this.ignoreInEmailValue);\r\n\r\n $inputsShowingIfPartialRooming.each((index, element) => {\r\n const $input = Variables.$(element);\r\n $input.val($input.data('default-value'));\r\n });\r\n\r\n $roomsDescPlaceHolder.append(Variables.$(``));\r\n // for each room, create a hidden input to be included in email and add it to place holder Div\r\n for (let i = 0; i < this.booking.roomsBooking.length; i++) {\r\n const roomBooking = this.booking.roomsBooking[i];\r\n if (roomBooking.status !== RoomBookingStatusEnum.Selected) {\r\n continue;\r\n }\r\n\r\n let roomText = `${moneyToString(roomBooking.calculatedPrice, true)}, for `;\r\n if (roomBooking.adultsNumber) {\r\n roomText += `${roomBooking.adultsNumber} adult(s), `;\r\n }\r\n if (roomBooking.childrenNumber) {\r\n roomText += `${roomBooking.childrenNumber} child(ren), `;\r\n }\r\n if (roomBooking.babiesNumber) {\r\n roomText += `${roomBooking.babiesNumber} baby(ies), `;\r\n }\r\n\r\n if (roomBooking.adultsNumber + roomBooking.childrenNumber === 1 && roomBooking.singleRoomSupplementFactor) {\r\n roomText += `${(roomBooking.singleRoomSupplementFactor - 1) * 100}% single occupancy rate increase applied, `;\r\n }\r\n\r\n if (roomBooking.childrenNumber) {\r\n roomText += `${moneyToString(roomBooking.childDiscount)} discount per child applied, `;\r\n }\r\n\r\n if (roomBooking.babiesNumber) {\r\n roomText += `${moneyToString(roomBooking.babyPrice)} per baby applied, `;\r\n }\r\n\r\n if (roomBooking.extraPriceForThisRoom) {\r\n roomText += `${moneyToString(roomBooking.extraPriceForThisRoom)} premium bedroom rate applied`;\r\n }\r\n\r\n if (roomBooking.aptDiscountPerPerson) {\r\n roomText += `${moneyToString(roomBooking.aptDiscountPerPerson, true)} per person discount applied`;\r\n }\r\n\r\n\r\n const $newRoom = Variables.$(``);\r\n\r\n $roomsDescPlaceHolder.append($newRoom);\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n public submitButtonPoppingState = false;\r\n\r\n\r\n private submitForm() {\r\n this.submitButtonPoppingState = true;\r\n\r\n Variables.$(`form#${this.formId}`).submit();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n}\r\n\r\n","import { Availability, ChaletNameEnum } from \"./availability.model\";\r\nimport { dateToString, moneyToString, scrollToTop, setStepQS, Variables } from \"./common\";\r\nimport { Step2 } from \"./step2\";\r\n\r\n/**\r\n * Using singleton design pattern\r\n */\r\nexport class Step1 {\r\n\r\n private static _instance: Step1;\r\n\r\n /**\r\n * The Singleton's constructor should always be private to prevent direct\r\n * construction calls with the `new` operator.\r\n */\r\n private constructor() {\r\n sessionStorage.removeItem('booking-state-pushed');\r\n setStepQS(null);\r\n }\r\n\r\n /**\r\n * The static method that controls the access to the singleton instance.\r\n *\r\n * This implementation let you subclass the Singleton class while keeping\r\n * just one instance of each subclass around.\r\n */\r\n public static get instance(): Step1 {\r\n if (!Step1._instance) {\r\n Step1._instance = new Step1();\r\n }\r\n\r\n return Step1._instance;\r\n }\r\n\r\n\r\n\r\n private stepId = \"pricesTable\";\r\n\r\n private $templateElement = Variables.$('#dvAvailabilityCardTemplate');\r\n\r\n /**\r\n * hide : hides step 1\r\n */\r\n public hide() {\r\n Variables.$(`#${this.stepId}`).addClass(\"hidden\");\r\n }\r\n\r\n /**\r\n * show : shows step 1\r\n */\r\n public show() {\r\n Variables.$(`#${this.stepId}`).removeClass(\"hidden\");\r\n scrollToTop(this.stepId);\r\n setStepQS(null);\r\n }\r\n\r\n\r\n\r\n private availabilities: Availability[];\r\n public makeCards = (_availabilities: Availability[]) => {\r\n\r\n this.availabilities = _availabilities.filter(avb => avb.arrivalDate > new Date());\r\n\r\n this.availabilities.forEach((availability, index) => {\r\n\r\n this.setupDivider(index, availability);\r\n\r\n const $card = this.$templateElement.clone(true);\r\n\r\n $card.removeAttr('id');\r\n $card.show();\r\n $card.appendTo(this.$templateElement.parent());\r\n\r\n // setting up data attributes that are being used for CSS\r\n // note: using data method instead of attr does not work see: https://stackoverflow.com/a/14935227/1730846\r\n this.addDataAttributes($card, availability);\r\n\r\n if (availability.isFullyBooked) {\r\n $card.addClass('booked')\r\n }\r\n\r\n $card.find('.date').text(dateToString(availability.arrivalDate));\r\n $card.find(`.propertyName.${availability.name}`).show();\r\n\r\n this.setupSpacesAvailable(availability, $card);\r\n\r\n\r\n this.setupNotes(availability, $card);\r\n\r\n\r\n this.setupPricing(availability, $card);\r\n\r\n this.setupBookingAndAccordion(availability, $card);\r\n\r\n\r\n // handling onClick of \"Book Now\" button\r\n $card.find(`.bookNow`).click({ availability }, (event) => {\r\n Step2.instance.setAvailability(event.data.availability);\r\n this.hide();\r\n Step2.instance.show();\r\n });\r\n\r\n\r\n });\r\n }\r\n\r\n\r\n\r\n private setupDivider(index: number, availability: Availability) {\r\n if (index === 0 || availability.arrivalDate.getMonth() !== this.availabilities[index - 1].arrivalDate.getMonth()) {\r\n const $divider = Variables.$('#dvDividerTemplate').clone(true);\r\n\r\n $divider.removeAttr('id');\r\n $divider.show();\r\n $divider.text(availability.arrivalDate.toLocaleDateString('en-ie', { month: 'long', year: 'numeric' }));\r\n $divider.appendTo(this.$templateElement.parent());\r\n\r\n $divider\r\n .attr('data-month-name', availability.arrivalDate.toLocaleDateString('en-ie', { month: 'short' }));\r\n }\r\n }\r\n\r\n private setupBookingAndAccordion(availability: Availability, $card: any) {\r\n\r\n // if chalet is exclusive use, show whole chalet text\r\n if (availability.isPricePerPerson === false) {\r\n $card.find(`.bookingAndAccordion .pricingBasis.whole-chalet`).show();\r\n\r\n // show modal if the chalet is petite pia & needs whole chalet booking\r\n if (availability.name === ChaletNameEnum.PetitePia) {\r\n $card.find(`.bookingAndAccordion .modal-PetitePia`).show();\r\n } else {\r\n $card.find(`span[data-empty-span]`).show();\r\n }\r\n\r\n } else { // if chalet is not exclusive, then individual rooms can booked\r\n $card.find(`.bookingAndAccordion .rooms`).show();\r\n const $roomingDiv = $card.find(`.bookingAndAccordion .rooming`);\r\n\r\n // for each room, create an empty div and add it to rooming Div\r\n for (let i = 0; i < availability.roomsBooked.length; i++) {\r\n const isRoomBooked = availability.roomsBooked[i];\r\n\r\n\r\n const $newRoom = Variables.$(`