{ "version": 3, "sources": ["../webroot/build/modules/booking/range-slider.js", "../webroot/build/modules/booking/utils.js", "../webroot/build/modules/booking/service-card.js", "../webroot/build/modules/booking/summary.js", "../webroot/build/modules/booking/time-selector.js", "../webroot/build/modules/bundles.js", "../webroot/build/modules/booking/conditional-rendering.js", "../webroot/build/modules/booking/multi-part-form.js", "../webroot/build/modules/booking/validation.js", "../webroot/build/script.js"], "sourcesContent": ["const $ = jQuery;\n\nexport function calculateRangeSlider($element) {\n var rangeVal = ($element.val() - $element.attr(\"min\")) / ($element.attr(\"max\") - $element.attr(\"min\"));\n var rangePercent = rangeVal * 100;\n rangeSlider($element, rangePercent);\n}\n\nfunction rangeSlider(input, percent) {\n input.css(\n \"background-image\",\n \"-webkit-gradient(linear, left top, right top, \" +\n \"color-stop(\" +\n percent +\n \"%, #1B88F5), \" +\n \"color-stop(\" +\n percent +\n \"%, #E6EBF2)\" +\n \")\"\n );\n\n input.css(\n \"background-image\",\n \"-moz-linear-gradient(left center, #1B88F5 0%, #1B88F5 \" +\n percent +\n \"%, #E6EBF2 \" +\n percent +\n \"%, #F5D0CC 100%)\"\n );\n}\n", "import { calculateRangeSlider } from \"./range-slider.js\";\n\nconst $ = jQuery;\n\n/** Returns whether the \"Moving out\" cleaning type is selected or not. This is important because prices are\n * higher for moving out cleanings */\nexport function isMovingOutSelected() {\n return $(\"#multiplier\").val() === \"moving_out\";\n}\n\n/** Returns whether the \"In-Depth\" cleaning type is selected or not. This is important because prices are\n * higher for in-depth cleanings */\nexport function isInDepthSelected() {\n return $(\"#multiplier\").val() === \"seasonal_or_annual\";\n}\n\n/** Returns the DOM element for the loader (spinner) that shows loading status */\nexport function getSummaryLoader() {\n return $(\".booking__summary__loader\");\n}\n\n/** Returns the DOM element for the button that directs the user to the payment screen */\nexport function getFinalizeButton() {\n return $(\"#cleaning .booking__submit button\");\n}\n\n/** Returns what step of the booking form we're currently at.\n * Possible values: \"step1\", \"step2\" */\nexport function getBookingFormStatus() {\n return $(\"#cleaning\").is(\":visible\") ? \"step1\" : \"step2\";\n}\n\n/** Returns all input DOM elements that need refreshing if a value changes, usually because they depend on values from\n * the backend, such as the price */\nexport function getInputsThatNeedRefreshing() {\n return $(\n [\n \"#home_size\",\n \"#multiplier\",\n \".booking__content__list input\",\n \".booking__content__list select\",\n \".booking__products input\",\n \"#booking_hours\",\n ].join(\", \"),\n );\n}\n\n/** Returns items in the \"Overview\" section in the summary component */\nexport function getBookingOverviewItems() {\n return $(\".booking__overview\").find(\".booking__overview__items\");\n}\n\n/** Returns the container of the summary component */\nexport function getBookingSummary() {\n return $(\".booking__summary, .booking__summary--step2\");\n}\n\n/** Refreshes the hours needed for the cleaning */\nexport function setBookingHours(dataSet) {\n const bookingHours =\n dataSet.finalItems.find((elem) => elem.name === \"Recommended hours\")?.value || 0;\n $(\"#booking__hours__text\").text(bookingHours);\n const input = $('input[name=\"recommended_hours\"]');\n input.val(bookingHours);\n}\n\n/** Refreshes the appropriate inputs with fresh data from the backend */\nexport function refreshInputs($element, manual = false) {\n if ($element.attr(\"type\") === \"range\") {\n if ($element.attr(\"name\") === \"sq\") {\n var currentBaseService = baseServices[$element.val()];\n console.log({ currentBaseService, val: $element.val(), baseServices });\n var label = $('label[for=\"' + $element.attr(\"id\") + '\"]');\n if (manual === true) {\n const baseServiceItem = backendVars.summaryData.finalItems.find(\n (elem) => elem.name === \"Cleaning\",\n );\n if (baseServiceItem) {\n currentBaseService = baseServices.find(\n (elem) =>\n elem.price === baseServiceItem.price ||\n elem.movingOutPrice === baseServiceItem.price,\n );\n $element.val(currentBaseService.id);\n }\n }\n\n let price = currentBaseService.price;\n\n if (isMovingOutSelected() && currentBaseService.movingOutPrice)\n price = currentBaseService.movingOutPrice;\n // Uncomment this if you want the displayed price to be multiplied for home size when in-depth is selected\n else if (isInDepthSelected()) price = currentBaseService.inDepthPrice;\n\n label.find(\".range__text\").html(currentBaseService.name_html);\n label.find(\".range__value\").text(price + \"€\"); // TODO: Fordítás szempontjából nem a legjobb még!\n } else if ($element.attr(\"name\") === \"booking_hours\") {\n var extraHours = $element.val() / 2;\n\n if (extraHours <= 0) {\n extraHours = \"No\"; // TODO: Fordítás szempontjából nem a legjobb még!\n }\n\n $(\"#booking__extra__hours__text\").text(extraHours);\n }\n\n calculateRangeSlider($element);\n }\n}\n\nexport function addCssRule(rule) {\n document.head.appendChild(document.createElement(\"style\")).innerHTML = rule;\n}\n", "import { addCssRule, isMovingOutSelected } from \"./utils.js\";\n\nconst $ = jQuery;\nconst hideNormalPricesClass = \"hide-normal-prices\";\nconst hideMovingOutPricesClass = \"hide-moving-out-prices\";\n\nexport function setupServiceCards() {\n addServiceCardClickListener();\n setupServiceCardDropdowns();\n handleSelectAndDeselectOfCustomizableServiceCard();\n refreshServiceCardPrices(backendVars?.summaryData?.items?.find?.((elem) => elem.name === \"multiplier\")?.value);\n addServiceCardStyleRules();\n}\n\nfunction setupServiceCardDropdowns() {\n const $select2ListItems = $(\".list-item-select2\");\n\n $select2ListItems.each(function (key, val) {\n const dropdownParent = $(val).closest(\".booking__content__list__item.list-item-variable\");\n $(val).select2({\n minimumResultsForSearch: -1,\n dropdownParent,\n escapeMarkup: function (markup) {\n return markup;\n },\n });\n });\n}\n\n/** Changes service card prices based on whether \"Moving out\" option is selected */\nexport function refreshServiceCardPrices(isMovingOut) {\n document.body.classList.add(isMovingOut ? hideNormalPricesClass : hideMovingOutPricesClass);\n document.body.classList.remove(isMovingOut ? hideMovingOutPricesClass : hideNormalPricesClass);\n}\n\nfunction handleSelectAndDeselectOfCustomizableServiceCard() {\n $(document).on(\"change\", \".booking__content__list__item.list-item-variable select\", function () {\n var $selectedVariable = $(this).find(\"option:selected\");\n var $parentElement = $selectedVariable.closest(\".booking__content__list__item\");\n var variableValue = $selectedVariable.val();\n\n if (variableValue > 0) {\n $parentElement.addClass(\"selected-input\");\n $parentElement.data(\"input\", \"cleaning-\" + variableValue);\n } else {\n $parentElement.removeClass(\"selected-input\");\n }\n });\n}\n\nfunction addServiceCardClickListener() {\n $(document).on(\"click\", \".booking__content__list__item\", function (e) {\n if ($(e.target).closest(\".tooltip\").length) {\n return false;\n }\n\n const $this = $(this);\n const dataInput = $this.attr(\"data-input\");\n let $connectedAction;\n if (!!dataInput) {\n $connectedAction = $(\"#\" + dataInput);\n }\n\n if ($this.hasClass(\"list-item-variable\")) {\n $connectedAction = $this.find(\"select\");\n }\n\n const clickDidComeFromUser = e.originalEvent.isTrusted;\n\n if ($this.hasClass(\"selected-input\")) {\n if (clickDidComeFromUser) {\n $this.attr(\"data-manually-checked\", false);\n }\n if ($connectedAction.prop(\"nodeName\") === \"INPUT\") {\n $this.removeClass(\"selected-input\");\n $connectedAction.prop(\"checked\", false);\n } else if (e.target.getAttribute(\"class\") !== \"select2-selection__rendered\") {\n $connectedAction.prop(\"selectedIndex\", 0);\n }\n } else {\n if (clickDidComeFromUser) {\n $this.attr(\"data-manually-checked\", true);\n }\n if ($connectedAction.prop(\"nodeName\") === \"INPUT\") {\n $this.addClass(\"selected-input\");\n $connectedAction.prop(\"checked\", true);\n } else {\n $connectedAction.val($connectedAction.find(\"option\").eq(1).val());\n }\n }\n\n $connectedAction.trigger(\"change\");\n });\n}\n\nfunction addServiceCardStyleRules() {\n addCssRule(`\n .${hideMovingOutPricesClass} span[data-price-for=moving-out] {\n display: none;\n }\n .${hideNormalPricesClass} span[data-price-for=normal] {\n display: none;\n }\n `);\n}\n", "import {\n addCssRule,\n getFinalizeButton,\n getSummaryLoader,\n refreshInputs,\n setBookingHours,\n} from \"./utils.js\";\n\nconst $ = jQuery;\n\nexport let firstRun = true;\nlet serviceChangeTimeout;\n\nexport function setupSummaryWindow() {\n // Handle the summary window open and close state\n if ($(\".booking__overview\").length > 0) {\n var closeBtn = $(\".booking__summary__close\");\n var overviewHead = $(\".booking__overview__header\");\n\n overviewHead.on(\"click\", function (e) {\n e.preventDefault();\n overviewHead.hide();\n $(\".booking__summary\").fadeIn(200);\n });\n\n closeBtn.on(\"click\", function (e) {\n e.preventDefault();\n $(\".booking__summary\").hide(0);\n overviewHead.fadeIn(200);\n });\n }\n if (backendVars?.summaryData) {\n refreshSummary(backendVars.summaryData);\n }\n addCssRule(`\n .completely-hidden {\n display: none !important;\n }\n `);\n}\n\nlet currentRequestController = null;\n\nexport function refreshSummaryRequest($input, items, couponCode) {\n if ($input) {\n refreshInputs($input);\n }\n\n getSummaryLoader().fadeIn(150);\n getFinalizeButton().prop(\"disabled\", true);\n\n // Throttle the change requests to not flood the server unnecessarily\n if (serviceChangeTimeout) {\n clearTimeout(serviceChangeTimeout);\n }\n\n serviceChangeTimeout = setTimeout(() => sendRequest(items, couponCode), firstRun ? 0 : 1000);\n\n function sendRequest(items, couponCode) {\n // Cancel the previous request if it's still ongoing\n if (currentRequestController) {\n currentRequestController.abort();\n }\n\n let itemData = items ? items : getSerializedData();\n if (!itemData || itemData.length === 0) return;\n window.summaryAtom.focus((atom) => atom.loading).update(() => true);\n currentRequestController = $.ajax({\n type: \"post\",\n url: globalVars.ajaxPaths.refreshSummary,\n dataType: \"json\",\n data: {\n items: items ? items : getSerializedData(),\n coupon: couponCode,\n },\n });\n currentRequestController.done(refreshLocalStateWithFreshSummary).always(() => {\n currentRequestController = null;\n });\n }\n}\n\nexport function refreshLocalStateWithFreshSummary(response) {\n window.backendVars.summaryData = response;\n window.summaryAtom.update(() => ({ loading: false, finalItems: response.finalItems }));\n console.log(\"updating loading to false\");\n\n setBookingHours(response);\n refreshSummary(response);\n handleCoupon(response);\n // Click to refresh conditional rendering\n setTimeout(() => {\n document.body.click();\n }, 500);\n firstRun = false;\n}\n\nexport function refreshSummary(serverResponse) {\n getFinalizeButton().prop(\"disabled\", false);\n const total = serverResponse.finalItems.find(\n (elem) => elem.name === \"Total\" && elem.section === null,\n ).price;\n const priceText = document.querySelector(\".price_text\");\n if (priceText) {\n priceText.innerHTML = total;\n }\n const itemsItem = document.querySelector(\".items\");\n if (itemsItem) {\n if (Number(total) === 0) {\n itemsItem.style.display = \"inline\";\n } else {\n itemsItem.style.display = \"none\";\n }\n }\n}\n\nfunction handleCoupon(dataSet) {\n if (!dataSet) {\n return;\n }\n\n $.each(dataSet, function (key, val) {\n if ([\"discount\", \"frequency_discount\"].includes(val.field_name)) {\n // RENDERING HTML CHUNKS FROM AJAX\n refreshBorgunForm();\n $(\"#paypal-button-container\").html(\"\");\n }\n });\n}\n\nfunction refreshBorgunForm() {\n $.ajax({\n type: \"post\",\n url: globalVars.ajaxPaths.getPaymentElement,\n }).done(function (response) {\n if (response) {\n $(\"#borgun-payment\").html(response);\n }\n });\n}\n\nfunction getSerializedData() {\n var items = [].concat.apply(\n [],\n [\n $(\"input[name=bundle_id]\").serializeArray(),\n $(\"body .booking__service__content input[type=range]\").serializeArray(),\n $(\"body .booking__service__content input:checked\").serializeArray(),\n $(\"body .booking__service__content textarea\").serializeArray(),\n $('body .booking__service__content select[name^=\"cleaning-\"]').serializeArray(),\n $('body .booking__service__content select[name^=\"car-washing-\"]').serializeArray(),\n $('body .booking__service__content input[name$=\"start_time\"]').serializeArray(),\n $('body .booking__service__content input[name$=\"start_date\"]').serializeArray(),\n ],\n );\n\n items.forEach(function (item) {\n try {\n var $input = $(\"[name=\" + item.name + \"]\");\n item.type = $input[0]?.tagName.toLowerCase();\n if (item.type === \"select\" && Number(item.value) > 0) {\n // item.name = item.name.replace(/-\\d+$/, \"-\" + item.value);\n }\n item.field_name = item.field_name || item.name;\n Object.defineProperty(\n item,\n \"field_name\",\n Object.getOwnPropertyDescriptor(item, \"name\"),\n );\n delete item.name;\n } catch (e) {}\n });\n\n return items;\n}\n", "export function setupTimeSelector() {\n for (const elem of document.querySelectorAll(\"*[form-data-discount-percentage] + label span\")) {\n const discountAmount = elem.parentElement.parentElement\n .querySelector(\"*[form-data-discount-percentage]\")\n .getAttribute(\"form-data-discount-percentage\");\n if (discountAmount == 0) {\n elem.textContent = \"\";\n } else {\n elem.textContent = elem.textContent.replace(/^(.*)%/, discountAmount + \"%\");\n }\n }\n}\n", "export function setupBundlePopup() {\n $(\"a[href='#bundles_booknow_popup']\").on(\"click\", (e) => {\n const bundle = JSON.parse(e.target.getAttribute(\"data-bundle\"));\n for (const [key, value] of Object.entries(bundle)) {\n const labelElem = $(`*[data-bundle-property=${key}]`).get(0);\n if (labelElem) {\n labelElem[labelElem.tagName.toLowerCase() !== \"input\" ? \"textContent\" : \"value\"] =\n value;\n window.bundleFormReady = true;\n }\n }\n });\n}\n", "const isVisibleMap = new Map();\n\nexport function setupConditionalRendering() {\n $(\"body\").on(\"change\", render).on(\"click\", render).on(\"input\", render);\n render();\n setupRenderingInSteps();\n}\n\nfunction setupRenderingInSteps() {\n function validateSection() {\n if (getCurrentStep() === 0) {\n if ($(\"#service_type-cleaning\")[0].checked) {\n const $multiplier = $(\"#multiplier\");\n if (!$multiplier.val()) {\n $multiplier.closest(\".booking__opportunity\").addClass(\"error\");\n return false;\n }\n }\n }\n return true;\n }\n function showNextSection() {\n setCurrentStep(getCurrentStep() + 1);\n }\n\n $(\".next-service\").on(\"click\", () => {\n if (validateSection()) {\n showNextSection();\n }\n });\n}\n\nexport function render() {\n for (const elem of $(\"*[data-show-on]\")) {\n const condition = $(elem).attr(\"data-show-on\");\n const isVisible = condition\n .split(\"|\")\n .some((token) =>\n token\n .split(\"&\")\n .every((elem) =>\n elem.startsWith(\"!\") ? !document.querySelector(elem.slice(1)) : !!document.querySelector(elem)\n )\n );\n if (isVisibleMap.get(elem) !== isVisible) {\n changeVisibility($(elem), isVisible);\n }\n isVisibleMap.set(elem, isVisible);\n }\n}\n\nfunction deselectChildren(elems) {\n for (const child of elems) {\n if ($(child).attr(\"data-deselect-on-invisible\")) {\n if (isChecked(child)) {\n child.click();\n }\n }\n deselectChildren($(child).children());\n }\n}\n\nfunction isChecked(target) {\n return target.checked || $(target).hasClass(\"selected-input\");\n}\n\nfunction changeVisibility(elem, isVisible) {\n if (isVisible) {\n elem.fadeIn(300);\n elem.addClass(\"show\");\n } else {\n elem.fadeOut(300);\n elem.removeClass(\"show\");\n elem.hide();\n deselectChildren([elem]);\n }\n const autoSelectQuery = $(elem).attr(\"data-auto-select-on-visible\");\n if (autoSelectQuery) {\n const target = $(autoSelectQuery).get(0);\n if (target) {\n setTimeout(() => {\n if ((isVisible && !isChecked(target)) || (!isVisible && isChecked(target))) target.click();\n }, 250);\n }\n }\n}\n\nexport function getCurrentStep() {\n return Math.max(\n 0,\n ...[...(getStepManager()?.classList || [])].map((className) => Number(className.match(/step-(\\d+)/)?.[1] || 0))\n );\n}\n\nexport function setCurrentStep(step) {\n function generateStepClasses(step) {\n return Array(step)\n .fill(0)\n .map((elem, index) => `step-${index + 1}`);\n }\n getStepManager().className = [\"step-manager\", ...generateStepClasses(step)].join(\" \");\n}\n\nfunction getStepManager() {\n return $(\".step-manager\").get(0);\n}\n\nexport function calculateLargestStepUnderElement(element) {\n const elementsWithCandidateClassnames = [...$(element).find(\"*[class*='step-']\")];\n const presentStepClassNames = elementsWithCandidateClassnames\n .map((elem) => [...elem.classList.values()].filter((elem) => elem.startsWith(\"step-\")))\n .flat(2);\n const stepNumbers = presentStepClassNames.map((elem) => Number(elem.match(/step-(\\d)/)?.[1]) || 0);\n return Math.max(...stepNumbers);\n}\n", "import { calculateLargestStepUnderElement } from \"./conditional-rendering.js\";\n\n/** When a booking is made by choosing a bundle, we need to bring all service types in the bundle into a single\n * flow. This takes care of that. */\nexport function setupMultipartForm() {\n if (getActiveServices().length > 1) {\n bringFormsIntoASingleFlow();\n } else {\n resetNextAndSubmitButtons(getCleaningForm());\n }\n}\n\nfunction bringFormsIntoASingleFlow() {\n const cleaningForm = getCleaningForm();\n if (!cleaningForm) return;\n const activeServices = getActiveServices().filter((elem) => elem !== \"cleaning\");\n\n for (const service of activeServices) {\n const serviceForm = $(\"#\" + service).get(0);\n const largestStep = calculateLargestStepUnderElement(cleaningForm);\n if (serviceForm) {\n cleaningForm.appendChild(serviceForm);\n serviceForm.classList.add(\"step-\" + (largestStep + 1));\n }\n }\n\n resetNextAndSubmitButtons(cleaningForm);\n\n $(\".booking__service\").on(\"click\", () => {\n scatterFormsBackIntoMultipleFlows();\n resetNextAndSubmitButtons(cleaningForm);\n });\n}\n\nfunction resetNextAndSubmitButtons(form) {\n const nextButton = $(form).find(\"button.next-service\").get(0);\n if (nextButton) {\n form.appendChild(nextButton);\n nextButton.setAttribute(\"data-show-on\", \"!.step-manager.step-\" + calculateLargestStepUnderElement(form));\n }\n\n const submitButton = $(form).find(\"button[type='submit']\").get(0);\n if (submitButton) {\n form.appendChild(submitButton);\n submitButton.setAttribute(\"data-show-on\", \".step-manager.step-\" + calculateLargestStepUnderElement(form));\n }\n}\n\nfunction scatterFormsBackIntoMultipleFlows() {\n const cleaningForm = getCleaningForm();\n const otherForms = [...$(cleaningForm).find(\".booking__service__content\")];\n for (const form of otherForms) {\n if (form.id) {\n const newParent = $(`*[data-service='${form.id}'].booking__service__content__wrap`).get(0);\n newParent.prepend(form);\n for (const i of Array(10)\n .fill(0)\n .map((elem, index) => index)) {\n form.classList.remove(\"step-\" + i);\n }\n }\n }\n}\n\nfunction getCleaningForm() {\n return $(\".booking__service__content__wrap[data-service='cleaning']\").get(0);\n}\n\nfunction getActiveServices() {\n return [\n ...new Set(\n backendVars.summaryData.finalItems\n .filter((elem) => elem.type === \"primary\" && !!elem.section)\n .map((elem) => elem.section)\n ).values(),\n // We need to keep the cleaning form right where it is.\n ];\n}\n", "import { refreshSummaryRequest } from \"./summary.js\";\n\nexport function handleValidations() {\n for (const serviceType of Object.keys(validators)) {\n function runValidation(serviceType) {\n setTimeout(() => {\n const isFrequencySelected =\n !!$(`input[name=${serviceType}-frequency]:checked`).length || serviceType === \"gardening\";\n const submitButton = $(\n `*[data-service=${serviceType}].booking__service__content__wrap button[type=submit]`\n );\n submitButton.prop(\"disabled\", false);\n submitButton.attr(\"data-reason\", \"\");\n const isServiceTypeActive = !!$(\n `#${serviceType} input[name^=${serviceType}-]:checked:not([name^=${serviceType}-frequency])`\n ).length;\n let isValidatorValid;\n try {\n isValidatorValid = isServiceTypeActive ? validators[serviceType]() : false;\n } catch (e) {\n isValidatorValid = false;\n }\n const isValid = isFrequencySelected && isServiceTypeActive && isValidatorValid;\n\n // Handle required fields\n for (const elem of $(`#${serviceType} *:is(input,textarea)[data-required]`)) {\n if (!elem.value && !!document.querySelector($(elem).attr(\"data-show-on\"))) {\n console.log({ elem });\n submitButton.attr(\"data-reason\", $(elem).attr(\"data-error-message\"));\n submitButton.prop(\"disabled\", true);\n return false;\n }\n }\n\n // Handle disclaimers\n for (const elem of $(`#${serviceType} input[name$='-consent'][id]`)) {\n const serviceName = elem.name.match(/(.+)-consent/)[1];\n const serviceChecked = !!$(`input[name=${serviceName}]:checked`).length;\n if (serviceChecked && !elem.checked) {\n submitButton.attr(\"data-reason\", \"Please check the consent checkbox!\");\n submitButton.prop(\"disabled\", true);\n return false;\n }\n }\n submitButton.prop(\"disabled\", !isValid);\n }, 50);\n }\n $(\"body\").on(\"click\", \"#\" + serviceType, () => {\n console.log(\"running validation...\");\n runValidation(serviceType);\n });\n $(`#${serviceType} input, #${serviceType} textarea`).on(\"change\", () => {\n runValidation(serviceType);\n refreshSummaryRequest();\n });\n runValidation(serviceType);\n }\n\n $(\"button[type=submit]\").on(\"pointerdown\", (e) => {\n const button = e.target;\n if ($(button).prop(\"disabled\") && button.getAttribute(\"data-reason\")) {\n Toastify({\n text: button.getAttribute(\"data-reason\"),\n duration: 3000,\n }).showToast();\n }\n });\n}\n\nconst validators = {\n \"car-washing\": () => {\n return !!$(\"input[name^=car-washing][type=radio]:checked:not([name^=car-washing-frequency])\").length;\n },\n \"pet-care\": () => {\n return true;\n },\n organizing: () => true,\n painting: () => {\n return !!$(\"input[name^=painting]:checked:not([type=radio])\").length;\n },\n gardening: () => {\n const fileSize = [...$(\"#photos\").get(0).files]\n .map((file) => file.size / 1024 / 1024)\n .reduce((prev, curr) => prev + curr, 0);\n const arefilesOk = fileSize < 5;\n if (!arefilesOk) {\n Toastify({\n text: \"The maximum size of all files together must not exceed 5MB\",\n duration: 3000,\n }).showToast();\n }\n return arefilesOk;\n },\n};\n", "import {\n getBookingFormStatus,\n getFinalizeButton,\n getInputsThatNeedRefreshing,\n getSummaryLoader,\n refreshInputs,\n setBookingHours,\n} from \"./modules/booking/utils.js\";\nimport { setupServiceCards, refreshServiceCardPrices } from \"./modules/booking/service-card.js\";\nimport {\n refreshLocalStateWithFreshSummary,\n refreshSummary,\n refreshSummaryRequest,\n setupSummaryWindow,\n} from \"./modules/booking/summary.js\";\nimport { calculateRangeSlider } from \"./modules/booking/range-slider.js\";\nimport { setupTimeSelector } from \"./modules/booking/time-selector.js\";\nimport { setupBundlePopup } from \"./modules/bundles.js\";\nimport {\n getCurrentStep,\n setCurrentStep,\n setupConditionalRendering,\n render,\n} from \"./modules/booking/conditional-rendering.js\";\nimport { setupMultipartForm } from \"./modules/booking/multi-part-form.js\";\nimport { handleValidations } from \"./modules/booking/validation.js\";\n\n(function ($) {\n const debounceTimers = {};\n\n function debounce(func, timeout = 300, timerId = null) {\n if (timerId == null) timerId = func;\n let timer = debounceTimers[timerId];\n clearTimeout(timer);\n timer = setTimeout(() => func(), timeout);\n debounceTimers[timerId] = timer;\n }\n\n if (window.waitingForFacebookLead) {\n return;\n }\n var hash = window.location.hash;\n var isMobile = $(window).width() <= 480;\n\n $(\"#recaptcha-form\").submit(function (e) {\n e.preventDefault();\n var $form = $(this);\n var formData = {};\n\n $form.serializeArray().map(function (item) {\n if (formData[item.name]) {\n if (typeof formData[item.name] === \"string\") {\n formData[item.name] = [formData[item.name]];\n }\n formData[item.name].push(item.value);\n } else {\n formData[item.name] = item.value;\n }\n });\n\n $.ajax({\n type: \"post\",\n url: recaptchaUrl,\n dataType: \"json\",\n data: formData,\n })\n .done(function () {\n location.reload();\n })\n .fail(function (xhr, status, error) {});\n });\n\n let nonQuoteStep = getCurrentStep();\n\n // BOOKING PAGE RELATED NECESSARY STUFF START\n $(document).on(\"change\", \"input[name='multiplier']\", function () {\n const inputVal = $(this).val();\n\n if (inputVal === \"moving_out\") {\n onMovingOutSelected();\n }\n });\n $(document).on(\"change\", \"input[name='moving-out_option']\", function (e) {\n const inputVal = $(this).attr(\"id\");\n\n if (inputVal === \"moving-out_option-moving_out_with_quote\") {\n nonQuoteStep = getCurrentStep();\n setCurrentStep(4);\n onMovingOutDeSelected();\n render();\n } else {\n setCurrentStep(nonQuoteStep);\n onMovingOutSelected();\n }\n });\n\n function validateStep2(event) {\n console.log(\"validateStep2\");\n\n var validated = true;\n var $firstErrorElement = \"\";\n\n $(\"p.inputfield-error\").remove();\n\n var $field = $(\".booking__payment > form\").find('input[name=\"pp_allowed\"]');\n\n if (!$field) return validated;\n\n if ($field.attr(\"type\") === \"checkbox\" && !$field.is(\":checked\")) {\n $field.addClass(\"inputfield-error\");\n $(\n '

Please accept the terms and conditions!

',\n ).insertAfter($('label[for=\"' + $field.attr(\"name\") + '\"'));\n validated = false;\n }\n\n if (validated === false && $firstErrorElement.length < 1) {\n $firstErrorElement = $field.closest(\"div\");\n }\n\n if (validated === false) {\n scrollToElement($firstErrorElement, -50);\n }\n\n if (!validated && event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n return validated;\n }\n\n window.validateStep2 = validateStep2;\n\n function SliderButtonTextTranslations() {\n var sliderInterval = setInterval(function () {\n var slider = $(\".slick-slider\");\n\n if (slider && slider.hasClass(\"slick-initialized\")) {\n var prevBtnText = $(\".slider-prev-btn-text\");\n var nextBtnText = $(\".slider-next-btn-text\");\n var nextBtn = $(\".slick-next\");\n var prevBtn = $(\".slick-prev\");\n\n nextBtn.text(nextBtnText.text());\n prevBtn.text(prevBtnText.text());\n\n var prevPos = nextBtn.outerWidth() + 40;\n\n prevBtn.css(\"right\", prevPos + \"px\");\n\n clearInterval(sliderInterval);\n }\n }, 100);\n }\n\n SliderButtonTextTranslations();\n\n $(\"form\").on(\"input\", \"input\", function () {\n var $this = $(this);\n\n $this.removeClass(\"inputfield-error\").removeClass(\"form-error\");\n $this.nextAll(\"p.inputfield-error, .error-message\").slideUp(300, function () {\n $(this).remove();\n });\n });\n\n if (getBookingFormStatus() === \"step1\") {\n refreshAllInputs();\n } else {\n getSummaryLoader().fadeOut(150);\n getFinalizeButton().prop(\"disabled\", false);\n }\n\n var isLandingPage = $(\".booking__wrap--fullwidth\").length > 0;\n\n $(\"body\").on(\"input\", \".booking__service__content input[type=range]\", function () {\n refreshSummaryRequest($(this), null, null);\n });\n $(\"body\").on(\"change\", function () {\n refreshSummaryRequest($(this), null, null);\n });\n\n function refreshAllInputs() {\n $.each(getInputsThatNeedRefreshing(), function (key, val) {\n refreshInputs($(val), true);\n });\n }\n\n $(\".booking__content__list__item.list-item-variable select\").trigger(\"change\"); // Needs to be here to trigger the variable services after load!\n\n $(document).on(\"click\", \".booking__products__item\", function () {\n var $this = $(this);\n const dataInput = $this.attr(\"data-input\");\n if (!dataInput) return;\n var $connectedAction = $(\"#\" + dataInput);\n\n if ($this.hasClass(\"selected-input\")) {\n $this.removeClass(\"selected-input\");\n $connectedAction.prop(\"checked\", false);\n } else {\n $this.addClass(\"selected-input\");\n $connectedAction.prop(\"checked\", true);\n $connectedAction.checked = true;\n }\n\n $connectedAction.trigger(\"change\");\n });\n\n setupServiceCards();\n setupTimeSelector();\n\n if (\n typeof backendVars !== \"undefined\" &&\n backendVars.summaryData &&\n backendVars.summaryData.length > 0\n ) {\n refreshAllInputs();\n refreshSummary(backendVars.summaryData);\n setBookingHours(backendVars.summaryData);\n\n $(\"#empty_service\").hide(function () {\n var checkboxToShow = \"cleaning\";\n\n $.each(backendVars.summaryData, function (key, val) {\n var element = val.field_name.match(\"([a-z]+)-input\");\n\n if (element) {\n checkboxToShow = element[1];\n }\n });\n\n var $sectionSelector = $(\"#\" + checkboxToShow);\n $(\"#\" + checkboxToShow + \"-checkbox\").prop(\"checked\", true);\n\n $sectionSelector.fadeIn(500, function () {\n if (checkboxToShow !== \"cleaning\") {\n $sectionSelector.find(\".booking__products__item\").trigger(\"click\");\n }\n });\n });\n }\n\n // Cancellation Protection Checkboxes\n const cancellationProtectionCheckboxYes = $(\"input.cancellation-protection\");\n const cancellationProtectionCheckboxNo = $(\"input.no-cancellation-protection\");\n\n cancellationProtectionCheckboxYes.on(\"change\", function () {\n const cancellationProtectionDescription = $(\"#cancellation_protection_desc\");\n if ($(this).prop(\"checked\")) {\n cancellationProtectionCheckboxNo.prop(\"checked\", false).trigger(\"change\");\n cancellationProtectionCheckboxNo\n .siblings(\".no-cancellation-protection-btn\")\n .removeClass(\"selected-input\");\n\n if (!cancellationProtectionDescription.hasClass(\"active\")) {\n cancellationProtectionDescription.addClass(\"active\");\n }\n\n cancellationProtectionDescription\n .children(\".booking__content__item__extra--yes\")\n .addClass(\"active\");\n cancellationProtectionDescription\n .children(\".booking__content__item__extra--no\")\n .removeClass(\"active\");\n }\n });\n cancellationProtectionCheckboxNo.on(\"change\", function () {\n const cancellationProtectionDescription = $(\"#cancellation_protection_desc\");\n if ($(this).prop(\"checked\")) {\n cancellationProtectionCheckboxYes.prop(\"checked\", false).trigger(\"change\");\n cancellationProtectionCheckboxNo\n .siblings(\".cancellation-protection-btn\")\n .removeClass(\"selected-input\");\n\n if (!cancellationProtectionDescription.hasClass(\"active\")) {\n cancellationProtectionDescription.addClass(\"active\");\n }\n\n cancellationProtectionDescription\n .children(\".booking__content__item__extra--no\")\n .addClass(\"active\");\n cancellationProtectionDescription\n .children(\".booking__content__item__extra--yes\")\n .removeClass(\"active\");\n }\n });\n // BOOKING PAGE RELATED NECESSARY STUFF END\n\n $(document).on(\"keydown\", '[name=\"zip-code\"]', function () {\n $(this).removeClass(\"success\");\n $(this)\n .closest(\".form__item\")\n .siblings(\".form__item\")\n .find(\".btn--submit\")\n .prop(\"disabled\", true);\n });\n\n $(document).on(\"keyup\", '[name=\"zip-code\"]', function () {\n var $this = $(this);\n if ($this.val().length >= 4) {\n $this.val($this.val().substring(0, 4));\n }\n\n if ($this.val() < 4) {\n $this.removeClass(\"success\");\n $this\n .closest(\".form__item\")\n .siblings(\".form__item\")\n .find(\".btn--submit\")\n .prop(\"disabled\", true);\n }\n\n if ($this.val().length === 4) {\n $this.addClass(\"success\");\n $this\n .closest(\".form__item\")\n .siblings(\".form__item\")\n .find(\".btn--submit\")\n .removeAttr(\"disabled\");\n return;\n }\n });\n\n if ($(\".booking__myservices__list\").length > 0) {\n var zipCodeHolder = $(\".booking__myservices__list .zip-holder\");\n var zipCodeInput = $(\"#zip_code_booking\");\n\n if (zipCodeInput.length) {\n $(\"body\").on(\"click\", \".zipcode-actions\", function () {\n var zipChangeButton = $(this);\n\n if (zipChangeButton.data(\"type\") === \"change\") {\n zipChangeButton.text(\"Save\");\n zipChangeButton.data(\"type\", \"save\");\n zipCodeHolder.hide();\n\n zipCodeInput.select2({\n tags: true,\n placeholder: \"L - \",\n minimumInputLength: 3,\n ajax: {\n type: \"post\",\n url: globalVars.ajaxPaths.getZip, // The globalVars.ajaxPaths object comes from backend through ctp template\n dataType: \"json\",\n delay: 250,\n data: function (term) {\n return {\n zipCodePrefix: term.term,\n };\n },\n processResults: function (data) {\n var returnData = [];\n\n $.each(data, function (key, val) {\n returnData.push({\n text: val,\n id: val,\n });\n });\n\n return {\n results: returnData,\n };\n },\n },\n });\n } else if (zipChangeButton.data(\"type\") === \"save\") {\n zipCodeInput.select2(\"destroy\");\n zipCodeHolder.show();\n zipChangeButton.text(\"Change\");\n zipChangeButton.data(\"type\", \"change\");\n\n if (zipCodeInput.val()) {\n zipCodeHolder.find(\"span\").text(zipCodeInput.val());\n }\n }\n });\n }\n }\n\n // SELECT2 ELEMENTS RELATED NECESSARY SECTION END\n\n // SLIDERS RELATED NECESSARY SECTION START\n if ($(\".last-orders-tag-slider\").length > 0) {\n $(\".last-orders-tag-slider\").slick({\n infinite: false,\n arrows: false,\n speed: 300,\n slidesToShow: 3,\n variableWidth: true,\n });\n }\n\n if ($(\".members__slider\").length > 0) {\n $(\".members__slider\").slick({\n arrows: false,\n infinite: false,\n speed: 300,\n slidesToShow: 2,\n slidesToScroll: 2,\n mobileFirst: true,\n dots: true,\n variableWidth: true,\n responsive: [\n {\n breakpoint: 955,\n settings: {\n slidesToShow: 5,\n slidesToScroll: 5,\n dots: false,\n arrows: true,\n },\n },\n {\n breakpoint: 720,\n settings: {\n slidesToShow: 4,\n slidesToScroll: 4,\n dots: false,\n arrows: true,\n },\n },\n {\n breakpoint: 550,\n settings: {\n slidesToShow: 3,\n slidesToScroll: 3,\n },\n },\n ],\n });\n }\n\n if ($(\"#media__slider\").length > 0) {\n $(\"#media__slider\").slick({\n arrows: false,\n dots: true,\n infinite: false,\n speed: 300,\n slidesToShow: 1,\n slidesToScroll: 1,\n mobileFirst: true,\n responsive: [\n {\n breakpoint: 1023,\n settings: {\n slidesToShow: 2,\n dots: false,\n arrows: true,\n },\n },\n ],\n });\n }\n\n if ($(\".testimonials__slider\").length > 0) {\n $(\".testimonials__slider\").slick({\n arrows: false,\n dots: true,\n infinite: false,\n speed: 300,\n slidesToShow: 1,\n slidesToScroll: 1,\n mobileFirst: true,\n responsive: [\n {\n breakpoint: 1023,\n settings: {\n slidesToShow: 2,\n slidesToScroll: 2,\n dots: false,\n arrows: true,\n },\n },\n ],\n });\n }\n\n var bookingSlider = $(\".booking__steps\");\n if (bookingSlider.length > 0) {\n bookingSlider.slick({\n infinite: false,\n arrows: false,\n dots: true,\n customPaging: function (slider, i) {\n return '';\n },\n speed: 300,\n slidesToShow: 1,\n slidesToScroll: 1,\n mobileFirst: true,\n responsive: [\n {\n breakpoint: 768,\n settings: {\n slidesToShow: 3,\n dots: false,\n },\n },\n ],\n });\n }\n\n const bundlesSlider = $(\"#bundles_slider\");\n if (bundlesSlider.length > 0) {\n bundlesSlider.slick({\n infinite: false,\n arrows: true,\n speed: 300,\n slidesToShow: 1,\n slidesToScroll: 1,\n mobileFirst: true,\n responsive: [\n {\n breakpoint: 575,\n settings: {\n slidesToShow: 2,\n },\n },\n {\n breakpoint: 768,\n settings: {\n slidesToShow: 1,\n },\n },\n {\n breakpoint: 992,\n settings: {\n slidesToShow: 2,\n },\n },\n ],\n });\n }\n // SLIDERS RELATED NECESSARY SECTION END\n\n // FRONTEND RELATED NECESSARY SECTION START\n var $rangeInput = $(\"input[type=range]\");\n\n if ($rangeInput.length) {\n $rangeInput.each(function () {\n calculateRangeSlider($(this));\n });\n }\n\n function preventFormSubmitIfSomeValuesAreNotFilledIn() {\n $(document).on(\"submit\", \".booking > form\", function (e) {\n if ($(\"#cleaning-checkbox\")[0]?.checked) {\n const $multiplier = $(\"#multiplier\");\n if (!$multiplier.val()) {\n $multiplier.closest(\".booking__opportunity\").addClass(\"error\");\n e.preventDefault();\n scrollToElement($multiplier, -150);\n }\n }\n if ($(\"#car-washing-checkbox\")[0]?.checked) {\n const selectedCategory =\n [...$(\"input[name=car_category]\")].find((elem) => elem.checked)?.value || null;\n if (!selectedCategory) {\n e.preventDefault();\n const buttonGroup = $(\"#car-washing .booking__opportunity\");\n buttonGroup.addClass(\"error\");\n scrollToElement(buttonGroup, -150);\n } else {\n // Cakephp creates a hidden input, from which we'll later read the selected car category.\n // We update the input's value here.\n document.querySelector(\"input[type=hidden][name=car_category]\").value =\n selectedCategory;\n }\n }\n });\n\n $(\"#car-washing .booking__opportunity input\").on(\"change\", () => {\n $(\"#car-washing .booking__opportunity\").removeClass(\"error\");\n });\n }\n\n setupSummaryWindow();\n\n $(document).on(\"click touchstart\", \".flash__message\", function () {\n $(this)\n .addClass(\"fadeout\")\n .on(\"animationend\", function () {\n $(this).hide();\n }); // Same timing as the CSS animation \"fadeout\" for .flash__message box\n });\n\n // Handle opening, closing and placement of tooltips depending on resolution\n if ($(\".tooltip\").length > 0) {\n $(\"body\").on(\"click\", \".tooltip__trigger\", function (e) {\n e.preventDefault();\n\n $(\".tooltip\").each(function () {\n if ($(this).hasClass(\"active\")) {\n $(this).removeClass(\"active\").children(\".tooltip__info\").hide();\n }\n });\n\n if ($(window).width() <= 767) {\n $(\"body\").addClass(\"no-scroll\");\n $(\".site__header--mobile\").addClass(\"less-zindex\");\n }\n\n $(this).closest(\".tooltip\").toggleClass(\"active\");\n $(this).siblings(\".tooltip__info\").fadeToggle(250).css(\"display\", \"flex\");\n });\n\n $(document).click(function (e) {\n $(\".tooltip\").each(function () {\n var isToolTipWindow = $(e.target).closest(\".tooltip,.tooltip__trigger\").length > 0;\n\n if (isToolTipWindow) {\n return false;\n }\n\n $(this).removeClass(\"active\").children(\".tooltip__info\").fadeOut(250);\n });\n });\n\n $(\"body\").on(\"click\", \".tooltip__info button\", function (e) {\n e.preventDefault();\n var $this = $(this);\n\n if ($this.closest(\".tooltip\").hasClass(\"active\")) {\n if ($(window).width() <= 767) {\n $(\"body\").removeClass(\"no-scroll\");\n $(\".site__header--mobile\").removeClass(\"less-zindex\");\n }\n\n $this.closest(\".tooltip\").removeClass(\"active\");\n $this.closest(\".tooltip__info\").fadeToggle(250).css(\"display\", \"flex\");\n }\n });\n }\n\n function renderImgToSvg() {\n $(\".svg\").each(function () {\n var $img = $(this);\n var imgURL = $img.attr(\"src\");\n var attributes = $img.prop(\"attributes\");\n\n $.get(\n imgURL,\n function (data) {\n // Get the SVG tag, ignore the rest\n var $svg = $(data).find(\"svg\");\n\n // Remove any invalid XML tags\n $svg = $svg.removeAttr(\"xmlns:a\");\n\n // Loop through IMG attributes and apply on SVG\n $.each(attributes, function () {\n $svg.attr(this.name, this.value);\n });\n\n // Replace IMG with SVG\n $img.replaceWith($svg);\n },\n \"xml\",\n );\n });\n }\n\n function mobileNav() {\n var $mobileNav = $(\".site__header__navigation--mobile\");\n var $navBtn = $(\".mobile__nav__btn\");\n var $mobileHeader = $(\".site__header--mobile\");\n\n $(\"body\").on(\"click\", $navBtn, function (e) {\n var target = $(e.target);\n\n if (!$mobileNav.hasClass(\"opened\") && target.hasClass(\"mobile__nav__btn\")) {\n $mobileNav.addClass(\"opened\");\n e.preventDefault();\n $(\"body\").addClass(\"hidden\").append('');\n $mobileHeader.addClass(\"opened\");\n }\n\n if (!target.hasClass(\"mobile__nav__btn\")) {\n $mobileNav.removeClass(\"opened\");\n $(\"body\").removeClass(\"hidden\").find(\".overlay\").remove();\n $mobileHeader.removeClass(\"opened\");\n }\n });\n }\n\n function faqDropdown() {\n if ($(\".faq__wrap\").length > 0) {\n var $trigger = $(\".faq__item__header\");\n\n $trigger.on(\"click\", function () {\n $(this).toggleClass(\"active\").next(\".faq__item__content\").slideToggle(250);\n });\n }\n }\n\n if ($(\".styled-select__text\").length > 0) {\n var selectText = $(\".styled-select__text\");\n selectText.text(selectText.nextAll(\"select\").find(\"option:selected\").text());\n\n $(\"select.styled-select\").on(\"change\", function handleChange() {\n var $this = $(this);\n $this.prevAll(\".styled-select__text\").text($this.find(\":selected\").text());\n });\n }\n\n var $invoiceChanged = $('input[name=\"invoice\"][type=\"checkbox\"]');\n\n $invoiceChanged.change(function () {\n var doesUserWantInvoice = $invoiceChanged.is(\":checked\");\n $.ajax({\n type: \"post\",\n url: globalVars.ajaxPaths.setInvoiceInSession,\n dataType: \"json\",\n data: { Invoice: doesUserWantInvoice },\n }).done(function (response) {});\n });\n\n function isUserLoggedIn() {\n return $(\".booking__payment\").hasClass(\"logged-in\") && loggedIn === true;\n }\n\n $(\"body\").on(\n \"change\",\n \"input[name=gardening], input[name=painting], input[name=cleaning-moving-out], input[name=home-organizing], input[name=pet-care], input[name=car-washing]\",\n function () {\n if (!$(this).prop(\"checked\")) {\n var inputName = $(this).attr(\"name\") + \"-input\";\n $(\"input[name=\" + inputName + \"]\")\n .prop(\"checked\", false)\n .trigger(\"change\");\n $('.selected-input[data-input=\"' + inputName + '\"]').removeClass(\"selected-input\");\n }\n },\n );\n\n $(\"body\").on(\n \"click\",\n '.booking__service__content div[data-input=\"gardening-input\"], .booking__service__content div[data-input=\"painting-input\"], .booking__service__content div[data-input=\"moving-out-input\"], .booking__service__content div[data-input=\"organizing-input\"], .booking__service__content div[data-input=\"pet-care-input\"], .booking__service__content div[data-input=\"car-washing-input\"]',\n function () {\n var $this = $(this);\n var $payButton = $this.nextAll(\".booking__submit\").find(\"button\");\n\n if (!$this.hasClass(\"selected-input\")) {\n $payButton.prop(\"disabled\", false);\n return;\n }\n\n console.log(\"This is happening\");\n $payButton.prop(\"disabled\", true);\n },\n );\n\n $(document).on(\"input\", 'input[name=\"coupon_code\"]', function () {\n debounce(\n () => {\n var couponCode = $(this).val();\n $(\".booking__summary--step2\").removeClass(\"has-discount\");\n\n if (typeof backendVars.summaryData !== \"undefined\" && backendVars.summaryData) {\n $.ajax({\n type: \"post\",\n url: globalVars.ajaxPaths.useCoupon,\n dataType: \"json\",\n data: {\n coupon: couponCode,\n },\n }).done((response) => {\n console.log({ response });\n refreshLocalStateWithFreshSummary(response);\n });\n }\n },\n 500,\n \"couponCodeChanged\",\n );\n });\n $(document).on(\"input\", \"input[name='is_company']\", function () {\n window.summaryAtom.focus((atom) => atom.loading).update(() => true);\n $.ajax({\n type: \"post\",\n url: \"/ajax/refresh-summary\",\n dataType: \"json\",\n data: {\n items: {\n is_company: $(\"input[name='is_company']:checked\").val() === \"1\",\n },\n },\n }).done((response) => {\n window.summaryAtom.update(() => ({ loading: false, finalItems: response.finalItems }));\n });\n });\n\n $(\"input\").click(function () {\n var inputFiled = $(this);\n var errorMessage = $(\"p[input-key=\" + inputFiled.attr(\"name\") + \"]\");\n\n if (inputFiled.css(\"border\")) {\n inputFiled.css(\"border\", \"\");\n errorMessage.hide(\"slow\", function () {\n $target.remove();\n });\n }\n });\n\n $('p[class=\"message error\"]').each(function (i, errorMessage) {\n $(errorMessage).insertAfter(\"body input[name=\" + $(errorMessage).attr(\"input-key\") + \"]\");\n $(\"input[name=\" + $(errorMessage).attr(\"input-key\") + \"]\").css(\"border\", \"1px solid red\");\n });\n\n function manageInvoiceFields() {\n var $invoiceCheckbox = $(\"#invoice_address_checkbox\");\n\n $(\"body\").on(\"input\", \"#fname, #lname, #address, #phone\", function (e) {\n if ($invoiceCheckbox.is(\":checked\")) {\n return false;\n }\n\n var $this = $(this);\n var fieldName = $this.attr(\"name\");\n $('form input[name=\"invoice_' + fieldName + '\"]').val($this.val());\n });\n\n function toggleInvoiceFields() {\n var invoiceContainer = $(\"body .booking__payment .different__invoice\");\n\n console.log({ checked: $(\"#invoice_address_checkbox\").is(\":checked\") });\n if ($(\"#invoice_address_checkbox\").is(\":checked\")) {\n $(\".paypal-overlay\").show(0);\n invoiceContainer.slideDown(300);\n } else {\n invoiceContainer.slideUp(300);\n }\n }\n\n $(\"body\").on(\"change\", \"#invoice_address_checkbox\", toggleInvoiceFields);\n toggleInvoiceFields();\n }\n\n function handleMyOrdersDetails() {\n $(\"body\").on(\"click\", \".myorders__details__btn\", function (e) {\n e.preventDefault();\n\n if (!$(this).hasClass(\"active\")) {\n $(this).addClass(\"active\").text(\"Show less\");\n } else {\n $(this).removeClass(\"active\").text(\"Details\");\n }\n $(this).parent().siblings(\".profile__myorders__details\").slideToggle(250);\n $(this).parent().siblings(\".profile__myorders__meta\").toggleClass(\"show\");\n });\n }\n\n function handlePaymentChangeOnclickIcon() {\n $(\"body\").on(\"click\", \".booking__payment__select__option\", function () {\n $(this).children(\"input\").prop(\"checked\", true).trigger(\"change\");\n });\n }\n\n $(document).on(\"change\", '[name=\"zip-code\"]', function () {\n var $this = $(this);\n if ($this.val() !== \"\" && !$this.hasClass(\"success\")) {\n $this.addClass(\"success\");\n $this\n .parents(\".form__item\")\n .siblings(\".form__item\")\n .find(\".btn--submit\")\n .removeAttr(\"disabled\");\n }\n });\n\n // Scrolls to the given element. (vertical modifier is extra offset, can be positive or negative)\n function scrollToElement(element, verticalModifier) {\n if (!element || !element.length) {\n return;\n }\n\n verticalModifier = typeof verticalModifier !== \"undefined\" ? verticalModifier : 0;\n\n var deferred = $.Deferred(),\n elemPos = element.offset().top,\n finalOffset = elemPos + verticalModifier,\n scrollTop = $(window).scrollTop(),\n animTiming = 400;\n\n if (scrollTop < finalOffset) {\n animTiming = Math.floor(animTiming + (finalOffset - scrollTop) / 10);\n } else {\n animTiming = Math.floor(animTiming + (scrollTop - finalOffset) / 10);\n }\n\n if (elemPos > scrollTop || elemPos + element.outerHeight() < scrollTop) {\n $(\"html, body\")\n .stop()\n .animate({ scrollTop: finalOffset < 0 ? 0 : finalOffset }, animTiming, function () {\n deferred.resolve();\n });\n } else {\n deferred.resolve();\n }\n\n return deferred;\n }\n\n // Scroll Top scroll event & handle onClick\n $(window).scroll(function () {\n var scroll = $(window).scrollTop();\n var windowHeight = $(window).height();\n var scrollToTop = $(\".scroll__top\");\n\n if (scroll > windowHeight) {\n scrollToTop.fadeIn(200);\n } else {\n scrollToTop.fadeOut(200);\n }\n });\n\n var scrollToTopBtn = $(\"button.scroll__top__btn\");\n\n scrollToTopBtn.on(\"click\", function (e) {\n e.preventDefault();\n\n $(\"html, body\").animate(\n {\n scrollTop: 0,\n },\n \"slow\",\n );\n return false;\n });\n\n $(\"body\").on(\"submit\", 'form[action=\"/apply-as-cleaner\"]', function (e) {\n var validated = true;\n\n $('input[type=\"checkbox\"]').each(function () {\n var errorMessage = $(this).closest(\".form__item\").find(\".error-message\");\n\n if (!$(this).prop(\"checked\")) {\n if (errorMessage.is(\":hidden\")) {\n errorMessage.show();\n $(this).closest(\".form__item\").addClass(\"error\");\n }\n\n validated = false;\n } else {\n errorMessage.hide();\n $(this).closest(\".form__item\").removeClass(\"error\");\n }\n });\n\n if (!validated) {\n e.preventDefault();\n }\n });\n\n function refreshMultiplierValue(value) {\n $(\"#multiplier\")[0].value = value;\n $(\"#multiplier\").closest(\".booking__opportunity\").removeClass(\"error\");\n refreshAllInputs();\n }\n\n const multiplierQuery = $('input[name=\"multiplier\"][type=\"hidden\"]');\n if (multiplierQuery[0]) {\n multiplierQuery[0].id = \"multiplier\";\n $('input[name=\"multiplier\"][type=\"radio\"]').on(\"change\", (e) => {\n refreshMultiplierValue(e.target.value);\n });\n const selectedRadioButton = $('input[name=\"multiplier\"][type=\"radio\"][checked]').get(0);\n if (selectedRadioButton) {\n refreshMultiplierValue(selectedRadioButton.value);\n }\n }\n\n function getServicesIncludedInMovingOut() {\n return $('*[data-input-is-included-in-moving-out=\"1\"]');\n }\n\n function onMovingOutSelected() {\n const wrappers = getServicesIncludedInMovingOut();\n for (const wrapper of wrappers) {\n if (!$(wrapper).hasClass(\"selected-input\")) {\n wrapper.click();\n }\n }\n setTimeout(() => {\n refreshServiceCardPrices(true);\n }, 0);\n }\n\n function onMovingOutDeSelected() {\n const wrappers = getServicesIncludedInMovingOut();\n for (const wrapper of wrappers) {\n if (\n $(wrapper).hasClass(\"selected-input\") &&\n !$(wrapper).attr(\"data-manually-checked\")\n ) {\n wrapper.click();\n }\n }\n setTimeout(() => {\n refreshServiceCardPrices(false);\n }, 0);\n }\n\n $('*[for=\"multiplier-moving_out\"]').on(\"click\", () => {\n onMovingOutSelected();\n });\n $('*[for=\"multiplier-weekly_or_monthly\"]').on(\"click\", () => {\n onMovingOutDeSelected();\n });\n $('*[for=\"multiplier-seasonal_or_annual\"]').on(\"click\", () => {\n onMovingOutDeSelected();\n });\n\n function handleCleaningEquipment($cleaningEquipmentBoxes) {\n var checkedCount = 0;\n var $cleaningEquipmentWarning = $(\"#warning_equipment_cleaning\");\n\n $.each($cleaningEquipmentBoxes, function (key, val) {\n if ($(val).prop(\"checked\")) {\n checkedCount++;\n }\n });\n\n if (checkedCount > 0) {\n $cleaningEquipmentWarning.removeClass(\"show\");\n return;\n }\n\n $cleaningEquipmentWarning.addClass(\"show\");\n }\n\n function onChangeCleaningEquipment() {\n var $cleaningEquipmentBoxes = $(\n 'input[name=\"equipment-cleaning-17\"][type=\"checkbox\"], input[name=\"equipment-cleaning-18\"][type=\"checkbox\"], input[name=\"equipment-cleaning-19\"][type=\"checkbox\"]',\n );\n handleCleaningEquipment($cleaningEquipmentBoxes);\n\n $cleaningEquipmentBoxes.change(function () {\n handleCleaningEquipment($cleaningEquipmentBoxes);\n });\n }\n\n function loadHighresImages() {\n $(\"picture.img-low-res\").each(function (key, val) {\n var $pictureElement = $(val);\n var imageSrc = $pictureElement.find(\"img\").attr(\"src\");\n var $pictureElementHighRes = $pictureElement.clone();\n\n $pictureElementHighRes.find(\"source\").attr(\"srcset\", (i, value) => {\n if (isMobile) {\n return value.replace(\"-low-res\", \"-mobile-res\");\n } else {\n return value.replace(\"-low-res\", \"\");\n }\n });\n\n if (isMobile) {\n $pictureElementHighRes\n .find(\"img\")\n .attr(\"src\", imageSrc.replace(\"-low-res\", \"-mobile-res\"));\n } else {\n $pictureElementHighRes.find(\"img\").attr(\"src\", imageSrc.replace(\"-low-res\", \"\"));\n }\n\n $pictureElementHighRes.removeClass(\"img-low-res\").addClass(\"img-high-res\");\n $pictureElementHighRes.insertAfter($pictureElement);\n\n $pictureElementHighRes.find(\"img\").on(\"load\", function () {\n $pictureElement.fadeOut(2800);\n $pictureElementHighRes.fadeIn(1000);\n });\n });\n }\n\n if (!(hash === null) && !(hash === \"\")) {\n focusZipSelector();\n\n if (hash.indexOf(\"order-\")) {\n $(hash).addClass(\"highlight\");\n scrollToElement($(hash), -50);\n }\n }\n\n $(\".free-offer\").on(\"click\", function (e) {\n e.preventDefault();\n handleTogglePopup(true);\n });\n\n function handleTogglePopup(forceOpen = false) {\n const $popupWindow = $(\".popup\");\n\n if (\n ($popupWindow.length &&\n !$popupWindow.hasClass(\"bookacleaner\") &&\n $popupWindow.attr(\"id\") !== \"booking_error_popup\" &&\n $popupWindow.attr(\"id\") !== \"bundles_booknow_popup\") ||\n forceOpen\n ) {\n $popupWindow.addClass(\"show\");\n }\n\n $(\".popup__close__btn\").on(\"click\", function (e) {\n e.preventDefault();\n const btn = $(this);\n btn.parents(\".popup\").removeClass(\"show\");\n });\n }\n\n function handleAccordion() {\n const showMoreBtn = $(\".accordion__trigger--more\");\n const showLessBtn = $(\".accordion__trigger--less\");\n\n showMoreBtn.on(\"click\", function () {\n const accordionId = $(this).attr(\"accordion-id\");\n\n $(\"#\" + accordionId).fadeIn(150);\n showMoreBtn.hide();\n showLessBtn.show();\n });\n\n showLessBtn.on(\"click\", function () {\n const accordionId = $(this).attr(\"accordion-id\");\n\n $(\"#\" + accordionId).fadeOut(150);\n showMoreBtn.show();\n showLessBtn.hide();\n });\n }\n\n handleAccordion();\n\n // FRONTEND RELATED NECESSARY SECTION END\n\n // PROFILE RELATED STUFF START\n if ($(\".profile__myorders\").find(\".profile__history__item\").length) {\n $(\"body\").on(\"click\", \".load-more\", function (e) {\n e.preventDefault();\n var $this = $(this);\n var currentPage = $this.data(\"page\");\n\n $.ajax({\n type: \"post\",\n url: globalVars.ajaxPaths.loadOrders,\n data: {\n page: currentPage + 1,\n },\n }).done(function (response) {\n if (response) {\n $this.data(\"page\", currentPage + 1);\n $(response).insertBefore(\".load-more\");\n\n if (window.renderReact) window.renderReact();\n } else {\n $this.fadeOut(100);\n }\n });\n });\n }\n\n // PROFILE RELATED STUFF END\n\n function validateRecaptcha() {\n $(\".g-recaptcha\")\n .closest(\"form\")\n .on(\"submit\", function (e) {\n if (!grecaptcha) {\n e.preventDefault();\n alert(\"Please wait for the captcha to load!\");\n }\n\n var captchaResponse = grecaptcha.getResponse();\n\n if (!captchaResponse.length) {\n e.preventDefault();\n }\n });\n }\n\n function focusZipSelector() {\n $('[name=\"zip-code\"]').focus();\n $('[name=\"zip-code\"]').select2(\"open\");\n }\n\n function preventFormDoubleSubmit() {\n for (const button of $(\"form button[type=submit]\")) {\n $(button).on(\"click\", () => {\n button.style.pointerEvents = \"none\";\n setTimeout(() => {\n button.style.pointerEvents = \"initial\";\n }, 5000);\n });\n }\n }\n\n function handleInputFileChanges() {\n const fileInput = $('input[type=\"file\"]');\n\n fileInput.on(\"change\", function () {\n const selectedFilesNames = $(\".file-upload__names\");\n\n let inputFileNames = [];\n for (let i = 0; i < $(this).get(0).files.length; ++i) {\n inputFileNames.push($(this).get(0).files[i].name);\n }\n\n if (selectedFilesNames.children()) {\n selectedFilesNames.children().remove();\n }\n\n selectedFilesNames.append(\n ...inputFileNames.map(\n (name) =>\n `\n ${name}\n `,\n ),\n );\n\n if (inputFileNames.length) {\n fileInput[0].checked = true;\n } else {\n fileInput[0].checked = false;\n }\n });\n }\n\n function shouldShowBookingTimeWarningPopup() {\n const maxEndTimeInMinutes = 18 * 60;\n const bookingRecommendedHours = parseInt($(\"input#recommended_hours\").val());\n if (!bookingRecommendedHours) {\n return false;\n }\n const extraHours =\n parseInt($(\"#booking__extra__hours__text\").get(0)?.textContent || \"0\") || 0;\n\n const bookingStartTimeSelect = $(\".styled-select select[name=cleaning-start_time]\");\n const currentValue = bookingStartTimeSelect.val();\n if (!currentValue) {\n return false;\n }\n const hours = Number(currentValue.split(\":\")[0]);\n const mins = Number(currentValue.split(\":\")[1]);\n const selectedEndTimeInMinutes = (hours + bookingRecommendedHours + extraHours) * 60 + mins;\n return selectedEndTimeInMinutes > maxEndTimeInMinutes;\n }\n\n let wasBookingTimeWarningShown = false;\n\n function setupBookingTimesErrorPopup() {\n $(\"button[type=submit]\").on(\"pointerdown\", function (e) {\n const button = $(this);\n if (!wasBookingTimeWarningShown && shouldShowBookingTimeWarningPopup()) {\n e.preventDefault();\n const bookingStartTimeErrorPopup = $(\"#booking_error_popup\");\n bookingStartTimeErrorPopup.addClass(\"show\");\n wasBookingTimeWarningShown = true;\n $(\".popup__close\").on(\"click\", () => {\n button.click();\n });\n }\n });\n }\n\n function handleFlipCard() {\n const flipCard = $(\".flip-card__front\");\n const flipCardCloseBtn = $(\".flip-card__close\");\n\n flipCard.on(\"click\", function () {\n $(this).parents(\".flip-card\").addClass(\"active\");\n });\n flipCardCloseBtn.on(\"click\", function () {\n $(this).parents(\".flip-card\").removeClass(\"active\");\n });\n }\n\n function openBundlePopup() {\n const bundlePopupCta = $(\".bundles__item__cta\");\n\n bundlePopupCta.on(\"click\", function (e) {\n e.preventDefault();\n const popupId = $(this).attr(\"href\");\n\n $(\"\" + popupId).addClass(\"show\");\n });\n }\n\n function deselectFreeQuoteWhenAppropriate() {\n $(\"body\").on(\"change\", () => {\n if (\n $(\"#moving-out_option-moving_out_without_quote\")?.prop(\"checked\") ||\n $(\"#multiplier-seasonal_or_annual\")?.prop(\"checked\") ||\n $(\"#multiplier-weekly_or_monthly\")?.prop(\"checked\")\n ) {\n const input = $(\"input[name^=cleaning-][data-free-quote]\");\n if (input.prop(\"checked\")) {\n input.click();\n }\n }\n });\n }\n\n function setupDeselectableRadioButtons() {\n $(\"input[type=radio][data-deselectable='1']\").on(\"click\", function (event) {\n const element = this;\n if (element.getAttribute(\"data-is-selected\") === \"1\") {\n element.checked = false;\n element.setAttribute(\"data-is-selected\", 0);\n } else {\n element.checked = true;\n element.setAttribute(\"data-is-selected\", 1);\n }\n $(element).trigger(\"change\");\n });\n }\n\n function setupAddingBundlesToCleaning() {\n $(\".bundles__slider__item[data-bundle-id]\").on(\"click\", function () {\n fetch(\"/ajax/addBundleToCleaning/\" + this.getAttribute(\"data-bundle-id\"), {\n method: \"POST\",\n redirect: \"follow\",\n }).then(() => {\n window.location.replace(\"/booking\");\n });\n });\n }\n\n loadHighresImages();\n manageInvoiceFields();\n renderImgToSvg();\n mobileNav();\n faqDropdown();\n handleMyOrdersDetails();\n handlePaymentChangeOnclickIcon();\n onChangeCleaningEquipment();\n handleTogglePopup();\n validateRecaptcha();\n preventFormSubmitIfSomeValuesAreNotFilledIn();\n preventFormDoubleSubmit();\n handleInputFileChanges();\n setupBookingTimesErrorPopup();\n handleValidations();\n handleFlipCard();\n openBundlePopup();\n setupConditionalRendering();\n setupBundlePopup();\n deselectFreeQuoteWhenAppropriate();\n setupDeselectableRadioButtons();\n setupMultipartForm();\n setupAddingBundlesToCleaning();\n window.ready = true;\n})(jQuery);\n"], "mappings": "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", "names": [] }