{"version":3,"file":"default/js/main.js","mappings":"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","sources":["webpack://vodafoneziggo/webpack/runtime/chunk loaded","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/letsTalk.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/VZLeadForm.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/VZLeadFormTrigger.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/common.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/VZSpinner.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZInputField.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZSelect.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/form.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/mask.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/masks/caps.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/masks/date.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/masks/iban.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/masks/postcode.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/documentNumber.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/idType.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/index.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/mask.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/password.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/preventCharacters.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/readonly.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/regex.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/valid.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/engagement.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/helpers/formHelpers.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/chat.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/cookies.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/devtools.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/fade-in.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/faq.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/footer.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZDateField.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZDatePicker.js","webpack://vodafoneziggo/./node_modules/clsx/dist/clsx.m.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/modals/modalHelper.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/modals/VZModal.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/navigation.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/scrolling.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/resize.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/search.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/drawers/VZOpenDrawer.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/drawers/VZDrawer.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/collapsibleSpecs.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/prompt.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/checkout/helpers/companySearchHelpers.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/chooserInvite.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/checkout/VZCompanySearch.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/modal.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/service-worker.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/constants.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/urlUtils.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/util.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/validation.js","webpack://vodafoneziggo/./node_modules/custom-event-polyfill/polyfill.js","webpack://vodafoneziggo/./node_modules/lazysizes/lazysizes.js","webpack://vodafoneziggo/./node_modules/moment/locale/ sync [/\\\\](nl(\\.js)","webpack://vodafoneziggo/webpack/bootstrap","webpack://vodafoneziggo/webpack/runtime/amd options","webpack://vodafoneziggo/webpack/runtime/compat get default export","webpack://vodafoneziggo/webpack/runtime/define property getters","webpack://vodafoneziggo/webpack/runtime/global","webpack://vodafoneziggo/webpack/runtime/hasOwnProperty shorthand","webpack://vodafoneziggo/webpack/runtime/node module decorator","webpack://vodafoneziggo/webpack/runtime/runtimeId","webpack://vodafoneziggo/webpack/runtime/jsonp chunk loading","webpack://vodafoneziggo/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { validate } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * Initializes the \"Let's Talk\" functionality for appointment scheduling\n * @param {HTMLElement} modal - The modal element containing the appointment form\n * @returns {Function} A cleanup function to remove event listeners\n */\nexport default function initLetsTalk(modal) {\n const spinner = document.querySelector('vz-spinner') || new window.VZSpinner();\n const day = modal.querySelector('.js-appointment-day');\n const timeSlot = modal.querySelector('.js-appointment-time');\n const employeesField = modal.querySelector('.js-lead-form-employees');\n\n // Disable date picker by default\n day.setAttribute('disabled', true);\n\n /**\n * Resets and disables the time slot selector\n */\n function resetTimeSlot() {\n const selectAppointmentTimeElement = timeSlot.querySelector('.js-select-appointment-time');\n if (selectAppointmentTimeElement) {\n // Remove all options\n [...selectAppointmentTimeElement.options].filter((option) => !option.hasAttribute('disabled')).forEach((option) => option.remove());\n\n // Reset & disable\n selectAppointmentTimeElement.classList.remove('invalid', 'valid');\n selectAppointmentTimeElement.setAttribute('disabled', true);\n\n // Remove error message if present\n const timeSlotErrorMessageElement = selectAppointmentTimeElement.parentElement.querySelector('.error-msg');\n if (timeSlotErrorMessageElement) timeSlotErrorMessageElement.remove();\n }\n }\n\n /**\n * Handles the date change event\n * @param {Event} event - The change event object\n */\n function handleChangeDate(event) {\n const value = `${event.detail.date.getFullYear()}-${event.detail.date.getMonth() + 1}-${event.detail.date.getDate()}`;\n const {\n target: {\n dataset: { url }\n }\n } = event;\n\n const employeesValue = employeesField.value.trim();\n const urlWithParams = `${url}${value}${employeesValue ? `&employees=${encodeURIComponent(employeesValue)}` : ''}`;\n const dayErrorMessageElement = day.parentElement.querySelector('.error-msg');\n\n resetTimeSlot();\n\n // Show spinner\n spinner.start();\n\n fetch(urlWithParams)\n .then((response) => {\n // Remove day error message if present\n if (response.status === 200 && dayErrorMessageElement) dayErrorMessageElement.remove();\n\n return response.text();\n })\n .then((response) => {\n timeSlot.innerHTML = response;\n })\n .finally(spinner.stop);\n }\n\n /**\n * Updates the appointment date section based on employee count\n * @param {string} employeesValue - Number of employees entered\n * @returns {Promise} Promise that resolves when the update is complete\n */\n function handleEmployeesDateUpdate(employeesValue) {\n const dateSection = modal.querySelector('.js-appointment-date');\n const url = employeesField.dataset.url;\n const urlWithParams = `${url}${employeesValue ? `?employees=${encodeURIComponent(employeesValue)}` : ''}`;\n\n // Show spinner\n spinner.start();\n\n return fetch(urlWithParams)\n .then((response) => response.text())\n .then((response) => {\n const currentDateField = modal.querySelector('.js-appointment-day');\n const wasDatePickerOpen = currentDateField && currentDateField.parentElement.querySelector('.datepicker.active') !== null;\n\n dateSection.innerHTML = response;\n // Re-initialize date field since we replaced the content\n const newDateField = dateSection.querySelector('.js-appointment-day');\n if (newDateField) {\n newDateField.addEventListener('changeDate', handleChangeDate);\n // Restore focus if the date picker was open before the update\n if (wasDatePickerOpen) {\n newDateField.focus();\n }\n }\n })\n .finally(spinner.stop);\n }\n\n /**\n * Checks if the new employee count crosses the threshold in either direction\n * @param {string} oldValue - Previous value from input field\n * @param {string} newValue - New value from input field\n * @param {number} threshold - Threshold value to compare against\n * @returns {boolean} True if threshold is crossed in either direction\n */\n function hasPassedThreshold(oldValue, newValue, threshold) {\n const oldCount = parseInt(oldValue || '0', 10);\n const newCount = parseInt(newValue || '0', 10);\n\n if (oldCount === 0) return true;\n\n return Math.floor(oldCount / threshold) !== Math.floor(newCount / threshold);\n }\n\n /**\n * Handles employee field changes\n * @param {Event} event - The input event object\n */\n function handleEmployeeChange(event) {\n const value = event.target.value.trim();\n const threshold = parseInt(event.target.dataset.employeeThreshold, 10);\n const oldValue = event.target.dataset.lastValue || '0';\n const surpassedThreshold = hasPassedThreshold(oldValue, value, threshold);\n\n // Store current value for next comparison\n event.target.dataset.lastValue = value;\n\n if (surpassedThreshold) {\n // If the threshold is crossed, update the date fied\n if (value) {\n handleEmployeesDateUpdate(value).then(() => {\n day.removeAttribute('disabled');\n const newDateField = modal.querySelector('.js-appointment-day');\n if (newDateField && oldValue !== '0') {\n validate({ target: newDateField }, newDateField.dataset.surpassThresholdError);\n }\n });\n resetTimeSlot();\n } else {\n // Reset appointment date section to initial state\n handleEmployeesDateUpdate('').then(() => {\n const newDateField = modal.querySelector('.js-appointment-day');\n if (newDateField) {\n newDateField.setAttribute('disabled', true);\n newDateField.classList.remove('invalid', 'valid');\n newDateField.classList.add('empty');\n newDateField.value = '';\n }\n });\n\n resetTimeSlot();\n }\n }\n }\n\n day.addEventListener('changeDate', handleChangeDate);\n employeesField.addEventListener('blur', handleEmployeeChange);\n\n return () => {\n day.removeEventListener('changeDate', handleChangeDate);\n employeesField.removeEventListener('blur', handleEmployeeChange);\n };\n}\n","'use strict';\n\nimport 'Components/form/VZSelect';\nimport 'Components/form/VZInputField';\nimport initLetsTalk from 'app_business_scan/steps/letsTalk'; // This is used to fetch the timeslots once a date has been selected\nimport { validateForm } from 'app_vodafone_ziggo/util/validation';\nimport { checkGA } from './common.js';\nimport CONST from 'Util/constants';\nimport moment from 'moment';\nimport { validateField } from 'app_vodafone_ziggo/util/validation';\nimport { clearFormFields } from 'app_vodafone_ziggo/helpers/formHelpers';\n\nexport default class VZLeadForm extends HTMLElement {\n constructor() {\n super();\n this.letsTalkHandler = null;\n }\n\n connectedCallback() {\n if ((window.bs && window.bs.Modal) || document.readyState === 'complete') {\n this.initLeadform();\n } else {\n document.addEventListener('DOMContentLoaded', this.initLeadform.bind(this));\n }\n }\n\n /**\n * Initializes the lead form. It sets up the modal button, submit button, form, and lead modal.\n */\n initLeadform() {\n this.leadModalElement = this.querySelector('#lead-modal');\n this.leadModal = this.leadModalElement ? new window.bs.Modal(this.leadModalElement) : null;\n this.form = this.querySelector('form');\n\n if (!this.form) return; // Avoid JS errors if form not available for some reason\n\n this.submitBtn = this.form.querySelector('.js-lead-form-submit');\n this.setPlpBasket = this.setPlpBasket.bind(this);\n\n if (this.leadModal !== null) {\n // Add event listeners for both show and hide events of the modal\n this.leadModalElement.addEventListener('show.bs.modal', this.onModalShow.bind(this));\n this.leadModalElement.addEventListener('hidden.bs.modal', this.onModalHidden.bind(this));\n } else {\n this.initLetsTalk();\n }\n\n this.submitBtn.addEventListener('click', this.submit.bind(this));\n this.updateLeadSource();\n this.updateActionUrl();\n this.spinner = document.querySelector('vz-spinner') || new window.VZSpinner();\n\n // Validate preselected phone prefix field\n const prefixField = this.form.querySelector('.js-leadform-phoneprefix');\n if (prefixField) {\n validateField(prefixField);\n }\n }\n\n disconnectedCallback() {\n this.submitBtn.removeEventListener('click', this.submit);\n }\n\n open() {\n if (this.leadModal != null) {\n this.leadModal.show();\n if (document.querySelector('.js-advice-json')?.value) {\n const customEvent = new CustomEvent('modalLoaded', {\n detail: {\n modal: this.leadModal._element // eslint-disable-line no-underscore-dangle\n }\n });\n document.dispatchEvent(customEvent);\n\n // additional check for GA clientId for Business Scan\n // because the form is injected without page reload\n checkGA();\n }\n // set PLP products\n this.setPlpBasket();\n }\n }\n\n initLetsTalk() {\n // Clean up previous handler if it exists\n this.cleanupLetsTalk();\n\n // Initialize new LetsTalk handler\n this.letsTalkHandler = initLetsTalk(this.leadModalElement || this);\n }\n\n cleanupLetsTalk() {\n if (this.letsTalkHandler) {\n this.letsTalkHandler();\n this.letsTalkHandler = null;\n }\n }\n\n onModalShow() {\n this.initLetsTalk();\n }\n\n /**\n * Cleans up the form by resetting values and restoring initial state\n * @private\n */\n cleanupForm() {\n this.form.reset();\n clearFormFields(this.form);\n\n // Reset time slot selector to disabled state\n const timeSlotSelect = this.form.querySelector('.js-select-appointment-time');\n if (timeSlotSelect) {\n timeSlotSelect.disabled = true;\n }\n }\n\n onModalHidden() {\n this.cleanupLetsTalk();\n this.cleanupForm();\n }\n\n setPlpBasket() {\n const plpSidebar = document.querySelector('vz-plp-sidebar');\n if (plpSidebar) {\n const plpBasket = plpSidebar.getAttribute('plp-basket');\n this.form.querySelector('.js-plp-basket').value = plpBasket;\n }\n }\n\n parseFormFields() {\n return new Promise((resolve) => {\n const timeSlot = this.querySelector('#timeslot');\n this.form.querySelector('.js-scheduler-date-time').value = new Date(timeSlot[timeSlot.selectedIndex].value).toISOString();\n resolve();\n });\n }\n\n /**\n * Updates the lead source with a new value from the 'data-lead-source' attribute of the element.\n *\n * @private updateLeadSource\n * @returns {void}\n */\n updateLeadSource() {\n const leadSourceName = this.dataset.leadSource;\n if (leadSourceName) {\n this.form.querySelector('input[name=leadSourceName]').value = leadSourceName;\n }\n }\n\n /**\n * Updates action url for the Business Scan lead form\n *\n * @private updateActionUrl\n * @returns {void}\n */\n updateActionUrl() {\n const actionUrl = this.dataset.actionUrl;\n if (actionUrl) {\n this.form.action = actionUrl;\n }\n }\n\n /**\n * Sets the selected resource ID in the lead form based on the selected appointment time.\n *\n * This method retrieves the selected appointment time from a dropdown select element and\n * sets the corresponding resource ID in a form input field.\n *\n * @returns {void}\n */\n setSelectedResourceId() {\n const timeSelector = this.form.querySelector('.js-select-appointment-time');\n const selectedTimeOption = timeSelector ? timeSelector.options[timeSelector.selectedIndex] : null;\n if (selectedTimeOption) {\n this.form.querySelector('.js-lead-form-resource-input').value = selectedTimeOption.dataset.resourceId;\n }\n }\n\n /**\n * Gets current time from moment.js library.\n *\n * @returns {void}\n */\n getCurrentTime() {\n const now = moment().format();\n this.form.querySelector('input[name=currentDate]').value = now;\n }\n\n /**\n * @private onSubmit\n * @param {ChangeEvent} evt - submit event\n */\n async submit(evt) {\n evt.preventDefault();\n this.submitBtn.setAttribute(CONST.attributes.disabled, CONST.attributes.disabled);\n this.submitBtn.classList.add(CONST.attributes.disabled);\n this.spinner.start();\n this.setSelectedResourceId();\n this.getCurrentTime();\n if (validateForm(this.form)) {\n await this.parseFormFields();\n this.form.submit();\n } else {\n this.spinner.stop();\n this.submitBtn.removeAttribute(CONST.attributes.disabled);\n this.submitBtn.classList.remove(CONST.attributes.disabled);\n }\n }\n}\n\nif (!window.customElements.get('vz-lead-form')) {\n window.customElements.define('vz-lead-form', VZLeadForm);\n}\n","export class VZLeadFormTrigger extends HTMLElement {\n connectedCallback() {\n this.triggerBtn = this.querySelector('.js-btn-leadmodal');\n if (this.triggerBtn) {\n this.triggerBtn.addEventListener('click', this.openLeadForm.bind(this));\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n openLeadForm(e) {\n e.preventDefault();\n const formId = this.getAttribute('for');\n let leadForm = formId ? document.querySelector(`vz-lead-form[id=\"${formId}\"]`) : null;\n\n // Fallback if no matching ID found\n if (!leadForm) {\n leadForm = document.querySelector('vz-lead-form');\n }\n\n if (leadForm) {\n leadForm.open();\n } else {\n console.error('No lead form found');\n }\n }\n}\n\nif (!window.customElements.get('vz-lead-form-trigger')) {\n window.customElements.define('vz-lead-form-trigger', VZLeadFormTrigger);\n}\n","'use strict';\n\nimport { documentReady } from 'app_vodafone_ziggo/util/util';\nlet counter = 0;\n\n/**\n * Checks if Google Analytics (GA) is loaded and fires custom event.\n * If GA is not loaded,it will keep trying to check 10 times.\n *\n * @returns {void}\n */\nexport function checkGA() {\n const gaCheckInterval = setInterval(() => {\n counter++;\n if (typeof window.ga === 'function') {\n document.dispatchEvent(new CustomEvent('ga:loaded'));\n clearInterval(gaCheckInterval);\n return;\n }\n if (counter > 9) clearInterval(gaCheckInterval);\n }, 500);\n}\n\n/**\n * @private onDocumentReady\n */\nfunction onDocumentReady() {\n document.body.classList.add('ready');\n if (document.querySelector('.js-account-navigation')) {\n document.body.classList.add('logged-in');\n }\n checkGA();\n}\n\ndocumentReady(onDocumentReady);\n","'use strict';\n\nimport Lottie from 'lottie-web/build/player/lottie_light.min';\nconst redSpinnerData = require('./spinners/spinner_animation_min.json');\n\n/**\n * @class VZSpinner\n * @param {HTMLElement} [parent] - Parent element for the spinner to be added in.\n * @description\n * Creates a VZ-Spinner component\n *\n * @example\n * \n *
\n *
\n *
\n *
\n */\nclass VZSpinner extends HTMLElement {\n constructor(parentEl) {\n super();\n\n this.showing = false;\n this.stop = this.stop.bind(this);\n this.veil = null;\n\n const parentElement = parentEl || document.body;\n const location = parentElement.tagName === 'IMG' ? parentElement.parentElement : parentElement;\n location.appendChild(this);\n\n this.lottie = Lottie.loadAnimation({\n container: this.veil.querySelector('.spinner'),\n renderer: 'svg',\n loop: true,\n autoplay: false,\n animationData: redSpinnerData\n });\n }\n\n /**\n * @public\n * @param {string} [msg] - A message to be shown below the spinner.\n * @returns {Promise} promise\n */\n start(msg) {\n return new Promise((resolve) => {\n if (this.showing) resolve();\n const parentPosition = window.getComputedStyle(this.parentElement).getPropertyValue('position');\n\n if (parentPosition === 'static') {\n if (this.parentElement.tagName !== 'BODY') {\n this.parentElement.style.position = 'relative';\n }\n this.parentElement.classList.add('veiled');\n }\n\n if (msg) {\n this.veil.insertAdjacentHTML('beforeend', `
${msg}
`);\n }\n\n this.showing = true;\n setTimeout(() => {\n if (this.showing) {\n this.lottie?.play();\n this.veil.classList.add('show');\n }\n resolve();\n }, 500);\n });\n }\n\n /**\n * @public\n * @returns {Promise} promise\n */\n stop() {\n return new Promise((resolve) => {\n if (!this.showing) resolve();\n if (this.parentElement.classList.contains('veiled')) {\n this.parentElement.style.position = '';\n this.parentElement.classList.remove('veiled');\n }\n\n const content = this.veil.querySelector('.content');\n if (content) content.remove();\n this.veil.classList.remove('show');\n this.showing = false;\n this.lottie?.stop();\n resolve();\n });\n }\n\n connectedCallback() {\n this.innerHTML = `\n
\n
\n
\n
\n `;\n\n this.veil = this.querySelector('.veil');\n this.veil.addEventListener('click', (evt) => evt.stopPropagation());\n }\n}\n\nwindow.VZSpinner = window.customElements.get('vz-spinner') || VZSpinner;\nexport default window.VZSpinner;\n\nif (!window.customElements.get('vz-spinner')) {\n window.customElements.define('vz-spinner', VZSpinner);\n}\n","'use strict';\n\nimport decorators from 'Decorators/index';\nimport { validate } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * @class InputField\n * @param {HTMLInputElement} element - The element to create an instance on\n */\nclass VZInputField extends HTMLInputElement {\n constructor() {\n super();\n this.validatePattern = this.validatePattern.bind(this);\n this.setFieldStatus = this.setFieldStatus.bind(this);\n this.onPaste = this.onPaste.bind(this);\n\n this.addEventListener('input', this.validatePattern);\n this.addEventListener('input', this.setFieldStatus);\n this.addEventListener('changeDate', this.setFieldStatus);\n this.addEventListener('changeDate', validate);\n this.addEventListener('paste', this.onPaste);\n this.validate = validate;\n\n decorators.readonly(this);\n decorators.regex(this);\n decorators.valid(this);\n decorators.documentNumber(this);\n\n if (this.hasAttribute('data-mask')) {\n decorators.mask(this);\n }\n\n if (this.hasAttribute('data-prevent')) {\n decorators.preventCharacters(this);\n }\n\n if (this.type === 'password') {\n decorators.password(this);\n }\n\n // Set initial state\n this.setFieldStatus();\n\n if (this.type === 'radio' || this.type === 'checkbox') {\n this.addEventListener('change', validate);\n } else {\n this.addEventListener('blur', validate);\n }\n\n this.closest('form').addEventListener('submit', this.disableExcludedFields);\n }\n\n onPaste(evt) {\n // Execute these methods at the end of the callstack, otherwise `field.value` will be the value before the paste.\n setTimeout(() => {\n this.setFieldStatus();\n validate(evt);\n }, 1);\n }\n\n disableExcludedFields() {\n if (this.hasAttribute('data-exclude')) {\n this.setAttribute('disabled', 'disabled');\n }\n }\n\n /**\n * @private setFieldStatus\n * @description\n * Sets an empty class when the element is empty for styling purposes.\n */\n setFieldStatus() {\n const hasValue = this.value.length > 0;\n const placeholderIsShown = this.constructor.placeholderActive(this);\n if (hasValue) {\n this.classList.remove('empty');\n } else if (placeholderIsShown) {\n // input[type=\"number\"] accepts dash and dots but returns no value for that.\n this.classList.add('empty');\n }\n }\n\n /**\n * @private validatePattern\n * @description\n * Checks whether the value is valid based on pattern\n */\n validatePattern() {\n this.valid = this.regex.test(this.value);\n }\n\n /**\n * @function placeholderActive\n *\n * @param {HTMLInputElement} element - Input element\n * @return {boolean} whether the placeholder is shown or not\n */\n static placeholderActive(element) {\n const selector = `${element.nodeName.toLowerCase()}[name=\"${element.name}\"]:placeholder-shown`;\n return !!document.querySelector(selector);\n }\n}\n\nexport default window.customElements.get('vz-input') || VZInputField;\nif (!window.customElements.get('vz-input')) {\n window.customElements.define('vz-input', VZInputField, { extends: 'input' });\n}\n","'use strict';\n\nimport decorators from 'Decorators/index';\nimport { validate } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * @class Select\n * @param {HTMLSelectElement} element - The element to create an instance on\n */\nexport default class VZSelect extends HTMLSelectElement {\n constructor() {\n super();\n\n decorators.valid(this, this);\n decorators.readonly(this, this);\n\n if (this.classList.contains('js-custom-select-validation')) {\n this.addEventListener('change', validate);\n }\n\n this.addEventListener('blur', validate);\n }\n\n connectedCallback() {\n this.selectCorrectValue();\n }\n\n /**\n * @public selectCorrectValue\n * @description\n * Safari decided to preselect the second item in the row for no reason.\n */\n selectCorrectValue() {\n const selectedValue = [...this.options].find((opt) => {\n return opt.getAttribute('selected') !== null;\n });\n\n this.selectedIndex = [...this.options].indexOf(selectedValue);\n\n if (\n (this.getAttribute('name').includes('identification_nationality') ||\n this.getAttribute('name').includes('identification_idtype') ||\n this.getAttribute('name').includes('contact_phonePrefix')) &&\n this.selectedIndex !== 0\n ) {\n this.dispatchEvent(new CustomEvent('blur'));\n }\n }\n}\n\nif (!window.customElements.get('vz-select')) {\n window.customElements.define('vz-select', VZSelect, { extends: 'select' });\n}\n","'use strict';\n\n/**\n * @public prepareFormValues\n * @param {HTMLElement} app - The app component\n *\n * @description\n * Sets the value of an input field as a property. By doing this, a previous\n * selection can be preselected when navigating back in the product configurator.\n */\nexport function prepareFormValues(app) {\n const valueTypes = ['text', 'hidden', 'range', 'email', 'number', 'tel', 'password'];\n [...app.querySelectorAll('input')].forEach((field) => {\n if (valueTypes.indexOf(field.type) !== -1) {\n field.setAttribute('value', field.value);\n } else if (field.type === 'radio' || field.type === 'checkbox') {\n if (field.checked) {\n field.setAttribute('checked', true);\n } else {\n field.removeAttribute('checked');\n }\n }\n });\n}\n\n/**\n * @public getFieldValidationMessage\n * @param {HTMLInputElement | HTMLSelectElement} field - Invalid field element\n * @returns {string | false} - Error message for invalid field\n */\nexport function getFieldValidationMessage(field) {\n // Valid\n if (field.validity.valid) return false;\n\n // Required\n if (field.required && field.value.length === 0) return field.getAttribute('data-missing-error');\n\n // Checked\n if (!field.checked && (field.matches('[type=\"checkbox\"]') || field.matches('[type=\"radio\"]'))) return field.getAttribute('data-missing-error');\n\n // Regex\n if (field.pattern && !new RegExp(field.pattern).test(field.value)) return field.getAttribute('data-pattern-error');\n\n // Dates\n if (field.dataset.mask === 'date' && field.dataset.invalid === 'true') return field.getAttribute('data-invalid-error');\n if (field.dataset.mask === 'date' && field.dataset.invalidMin === 'true') return field.getAttribute('data-mindate-error');\n if (field.dataset.mask === 'date' && field.dataset.invalidMax === 'true') return field.getAttribute('data-maxdate-error');\n if (field.dataset.mask === 'addition' && field.dataset.multipleAdditions === 'true') return field.getAttribute('data-missing-error');\n\n // No valid error messages\n return false;\n}\n","'use strict';\n\nimport { POSTCODE_MASK_ATTRIBUTE, PostCodeMask } from './masks/postcode';\nimport { IBAN_MASK_ATTRIBUTE, IBANMask } from './masks/iban';\nimport { DATE_MASK_ATTRIBUTE, DateMask } from './masks/date';\nimport { CAPS_MASK_ATTRIBUTE, CapsMask } from './masks/caps';\n\n/**\n * @class Mask\n * @param {HTMLInputElement} element - The input field to put a mask on\n */\nclass Mask {\n constructor(element) {\n this.element = element;\n this.maskType = this.element.getAttribute('data-mask');\n\n // PostCode mask\n if (this.maskType === POSTCODE_MASK_ATTRIBUTE) {\n this.mask = new PostCodeMask(this.element);\n }\n if (this.maskType === IBAN_MASK_ATTRIBUTE) {\n this.mask = new IBANMask(this.element);\n }\n if (this.maskType === DATE_MASK_ATTRIBUTE) {\n this.mask = new DateMask(this.element);\n }\n if (this.maskType === CAPS_MASK_ATTRIBUTE) {\n this.mask = new CapsMask(this.element);\n }\n }\n}\n\nexport default Mask;\n","'use strict';\n\n/**\n * @constant {string} CAPS_MASK_ATTRIBUTE - Attribute value for caps mask\n */\nexport const CAPS_MASK_ATTRIBUTE = 'caps';\n\n/**\n * @class CapsMask\n * @param {HTMLInputElement} element - An input field\n */\nexport class CapsMask {\n constructor(element) {\n element.addEventListener('input', this.onInput.bind(element));\n element.addEventListener('change', this.onInput.bind(element));\n }\n\n onInput() {\n const position = this.selectionStart;\n this.value = this.value.toUpperCase();\n this.setSelectionRange(position, position);\n }\n}\n","'use strict';\n\n/**\n * @constant {string} DATE_MASK_ATTRIBUTE - Attribute value for date mask\n */\nconst DATE_MASK_ATTRIBUTE = 'date';\n\nclass DateMask {\n constructor(element) {\n this.field = element;\n this.cursorIndex = 0;\n this.maskText = element.getAttribute('data-mask-text');\n this.pressedCharacters = [];\n\n this.onInput = this.onInput.bind(this);\n this.onPaste = this.onPaste.bind(this);\n this.replaceRemovedDigitWithLetter = this.replaceRemovedDigitWithLetter.bind(this);\n this.onArrowRight = this.onArrowRight.bind(this);\n this.onArrowLeft = this.onArrowLeft.bind(this);\n this.onCharacterRemoval = this.onCharacterRemoval.bind(this);\n this.checkIfDashIsSelected = this.checkIfDashIsSelected.bind(this);\n this.replaceAsYouType = this.replaceAsYouType.bind(this);\n\n element.addEventListener('keydown', this.onKeyDown.bind(this));\n element.addEventListener('keyup', this.onInput);\n element.addEventListener('paste', this.onPaste);\n }\n\n /**\n * @private runRegexOnValue\n * @param {string} value - The value\n * @returns {array} - The final manipulated value as an array with each character\n *\n * @description\n * Mask the input value for date using regular expressions and enforcing dashes at specific locations\n */\n static runRegexOnValue(value) {\n return value\n .toUpperCase() // In case lowercase d/m/j letters are entered\n .replace(/^(\\d{1}-)-/, '0$1-') // If we already have the mask and one digit plus a dash has been entered, prepend a 0\n .replace(/-(\\d{1}-)-/, '-0$1-') // For the 2nd group, do the same and prepend a 0\n\n .replace(/-+-/g, '-') // Convert multiple dashes to a single dash\n .replace(/[^\\dDMJ-]/g, '') // Remove any character that is not [numeric, letters D/M/J, a dash]\n .replace(/^-(\\d{1})/, '$1') // If the string starts with a dash, remove the dash\n .replace(/-/g, '') // After all manipulations and cleaning up, remove all dashes (which could also have been added in the 3rd group) and..\n .split(''); // split up our current string so we can enforce dashes on specific locations only\n }\n\n /**\n * @private totalLengthUntilLastDigit\n * @param {string} newVal - The value\n * @returns {number} - The total length\n *\n * @description\n * Calculate what the total length of newVal would be once the dashes are added through `splice`, only until the last entered digit\n * We need this to do calculations for cursorOffset\n */\n static totalLengthUntilLastDigit(newVal) {\n const untilLastDigit = newVal.join('').replace(/[\\D]*$/, '');\n let totalLength = untilLastDigit.length;\n if (totalLength > 4) {\n totalLength += 1;\n }\n if (totalLength > 2) {\n totalLength += 1;\n }\n\n return totalLength;\n }\n\n /**\n * @private replaceRemovedDigitWithLetter\n * @param {string} newVal - The value\n * @returns {array} - The updated newVal\n *\n * @description\n * Will replace the removed digit with a corresponding letter from the maskText\n */\n replaceRemovedDigitWithLetter(newVal) {\n // Calculate the offset which is necessary to determine where the replacing character should be placed\n // The offset is based on the cursorIndex and the amount of dashes that are present\n let cursorOffset = 0;\n const cursorIndex = this.cursorIndex;\n\n if (cursorIndex === 3 || cursorIndex === 4) {\n cursorOffset -= 1;\n } else if (cursorIndex > 4) {\n cursorOffset -= 2;\n }\n\n // Decide which character should take it's place and add it to the array\n const removedCharacter = this.maskText.substring(cursorIndex, cursorIndex + 1);\n\n if (removedCharacter !== '-') {\n newVal.splice(cursorIndex + cursorOffset, 0, removedCharacter);\n }\n\n return newVal;\n }\n\n /**\n * @private addDashes\n * @param {string} newVal - The value\n * @returns {array} - The updated newVal\n *\n * @description\n * Will add dashes at specific spots\n */\n static addDashes(newVal) {\n // If we have 4 or more digits, add a dash\n if (newVal.length >= 4) {\n newVal.splice(4, 0, '-');\n }\n\n // If we have 2 or more digits, add a dash\n if (newVal.length >= 2) {\n newVal.splice(2, 0, '-');\n }\n\n return newVal;\n }\n\n /**\n * @private onArrowRight\n * @param {string} newVal - The value\n *\n * @description\n * Will move the cursor to the right based on some checks\n */\n onArrowRight(newVal) {\n if (this.checkIfDashIsSelected(newVal)) this.cursorIndex += 1;\n this.field.setSelectionRange(this.cursorIndex, this.cursorIndex);\n }\n\n /**\n * @private onArrowLeft\n * @param {string} newVal - The value\n *\n * @description\n * Will move the cursor to the left based on some checks\n */\n onArrowLeft(newVal) {\n if (this.checkIfDashIsSelected(newVal, 'left')) this.cursorIndex -= 1;\n this.field.setSelectionRange(this.cursorIndex, this.cursorIndex);\n }\n\n /**\n * @private onCharacterRemoval\n * @param {string} newVal - The value\n *\n * @description\n * Will move the cursor to the left based on some checks\n */\n onCharacterRemoval(newVal) {\n // If the character on the left is a dash, move an extra spot to the left\n if (this.checkIfDashIsSelected(newVal, 'left')) this.cursorIndex -= 1;\n\n // If we end up before the beginning, reset the index\n if (this.cursorIndex < 0) this.cursorIndex = 0;\n\n this.field.setSelectionRange(this.cursorIndex, this.cursorIndex);\n }\n\n /**\n * @private checkIfDashIsSelected\n * @param {string} value - The string to check\n * @param {string} direction - Either 'left' or 'right'\n * @param {number} offset - An optional offset\n * @returns {boolean} - True of false\n */\n checkIfDashIsSelected(value, direction, offset = 0) {\n const cursorIndex = this.cursorIndex + offset;\n\n if (direction === 'left') {\n return value.substring(cursorIndex - 1, cursorIndex) === '-';\n }\n\n return value.substring(cursorIndex, cursorIndex + 1) === '-';\n }\n\n /**\n * @private replaceAt\n * @param {string} value - The original value\n * @param {number} index - The position of the old character to replace\n * @param {string} replacement - The replacement character\n * @returns {string} - An updated value\n */\n static replaceAt(value, index, replacement) {\n return value.substring(0, index) + replacement + value.substring(index + 1);\n }\n\n /**\n * @private replaceAsYouType\n * @param {string} key - The pressed key as a string\n * @returns {string} - A possibly updated value\n * @description\n * Will replace the next character as you type. This is necessary since we have a max-length on the field.\n */\n replaceAsYouType(key) {\n let value = this.field.value;\n const isDigit = !window.isNaN(key);\n const allowedDash = key === '-' && this.checkIfDashIsSelected(value, 'right', 1);\n\n // If we're not at the end\n // and there's no selection at the moment\n // and the inputted character is either a digit or a dash\n if (this.cursorIndex < value.length && !this.hasSelection && (isDigit || allowedDash)) {\n // If we're before a dash, replace the character after the dash\n if (this.checkIfDashIsSelected(value)) {\n this.cursorIndex++;\n }\n\n value = this.constructor.replaceAt(value, this.cursorIndex, key);\n this.cursorIndex++;\n }\n\n return value;\n }\n\n /**\n * @private onKeyDown\n * @param {KeyboardEvent} evt - On key down event\n */\n onKeyDown(evt) {\n // If the user is holding the key down, and it's not the backspace/delete button, preventDefault\n if (evt.repeat && evt.key !== 'Backspace' && evt.key !== 'Delete') {\n evt.preventDefault();\n return;\n }\n\n this.hasSelection = evt.target.selectionEnd > evt.target.selectionStart;\n const isDigit = !window.isNaN(evt.key);\n\n if (isDigit || evt.key === '-') {\n evt.preventDefault();\n this.pressedCharacters.push(evt.key);\n this.onInput(evt);\n }\n }\n\n /**\n * @private onInput\n * @param {KeyboardEvent} evt - On key up event\n */\n onInput(evt) {\n if (\n evt.type === 'keyup' &&\n (evt.key === 'Escape' ||\n evt.key === 'Enter' ||\n evt.key === 'Tab' ||\n evt.key === 'Control' ||\n evt.key === 'Shift' ||\n evt.key === 'Alt' ||\n evt.key === 'Meta' ||\n evt.key === 'ArrowUp' ||\n evt.key === 'ArrowDown')\n ) {\n return;\n }\n\n const field = this.field;\n const val = field.value;\n let charRemoved = evt.type === 'keyup' && (evt.key === 'Backspace' || evt.key === 'Delete');\n this.cursorIndex = field.selectionStart;\n\n // Getting the pressed character from the array is to cater for the edge case where the user held down for example '1' and then pressed '2'.\n // This should force '1' to be shown first and then '2', instead of the other way around if we would just get evt.key.\n // This is a \"complex\" workaround for a simple problem which would much easier be fixed by using `onKeyDown` instead of `onKeyUp`, but it's\n // too late to refactor half of this file now...\n const firstPressedCharacter = this.pressedCharacters[0];\n\n // If the entire value/date has been selected\n if (evt.target.selectionStart === 0 && evt.target.selectionEnd === 10) {\n if (firstPressedCharacter) {\n // If a character has been entered, reset the value to the pressed character\n field.value = firstPressedCharacter;\n this.cursorIndex++;\n } else {\n // Stop executing the rest of this method so the user can \"select all\" and then hit backspace/delete\n return;\n }\n }\n\n // Init the mask if there is no value yet (seeing as we preventDefault in `onKeyDown`)\n // Also adjust the `empty` class accordingly\n if (val.length === 0 && firstPressedCharacter) {\n field.value = firstPressedCharacter;\n field.classList.remove('empty');\n } else if (val.length === 0) {\n field.classList.add('empty');\n }\n\n // Replace characters as you type\n let newVal = this.replaceAsYouType(firstPressedCharacter, val);\n field.value = newVal;\n\n this.pressedCharacters.shift();\n\n // Mask the input value for date using regular expressions and enforcing dashes at specific locations\n newVal = this.constructor.runRegexOnValue(newVal);\n\n // Calculate what the total length of newVal would be once the dashes are added through `splice`, only until the last entered digit\n // We need this to do calculations for cursorOffset\n const totalLength = this.constructor.totalLengthUntilLastDigit(newVal);\n\n // Will replace the removed digit with a corresponding letter from the maskText\n if (charRemoved) {\n newVal = this.replaceRemovedDigitWithLetter(newVal);\n }\n\n // If we removed any digit \"in the middle\",\n // Reset `charRemoved` to false, in order to keep the cursor in the current position\n if (charRemoved && this.cursorIndex < totalLength) {\n charRemoved = false;\n }\n\n // Add dashes at specific spots\n newVal = this.constructor.addDashes(newVal);\n\n // Set final value with a format of xx-xx-xxxx\n // If the value is incomplete, finish the rest with the mask\n if (totalLength > 0) {\n newVal = newVal.join('').substring(0, 10);\n newVal += this.maskText.substring(newVal.length, 10);\n this.field.value = newVal;\n } else {\n this.field.value = '';\n return;\n }\n\n // If arrow left was pressed\n if (evt.key === 'ArrowLeft') {\n this.onArrowLeft(newVal);\n return;\n }\n\n // If arrow right was pressed\n if (evt.key === 'ArrowRight') {\n this.onArrowRight(newVal);\n return;\n }\n\n // If a character was removed\n if (charRemoved) {\n this.onCharacterRemoval(newVal);\n return;\n }\n\n // When a character has been entered, increment the cursorIndex\n if (this.checkIfDashIsSelected(newVal)) {\n this.cursorIndex += 1;\n }\n\n // Set the new selection based on calculations done in above methods\n this.field.setSelectionRange(this.cursorIndex, this.cursorIndex);\n }\n\n /**\n * @private onPaste\n * @param {KeyboardEvent} evt - On key up event\n */\n onPaste(evt) {\n this.onInput(evt);\n\n setTimeout(() => {\n const val = this.field.value;\n this.field.setSelectionRange(val.length, val.length);\n }, 100); // small delay is necessary because the dashes are added after paste\n }\n}\n\nexport { DateMask, DATE_MASK_ATTRIBUTE };\n","'use strict';\n\nimport { CapsMask } from './caps';\n\n/**\n * @constant {string} POSTCODE_MASK_ATTRIBUTE - Attribute value for postcode mask\n */\nconst IBAN_MASK_ATTRIBUTE = 'iban';\n\n/**\n * @constant {integer} BACKSPACE_KEYCODE\n */\nconst BACKSPACE_KEYCODE = 8;\n\n/**\n * @constant {integer} DELETE_KEYCODE\n */\nconst DELETE_KEYCODE = 46;\n\n/**\n * @constant {Array} UNDO_KEYS\n */\nconst UNDO_KEYS = [BACKSPACE_KEYCODE, DELETE_KEYCODE, 'backspace', 'delete'];\n\nclass IBANMask extends CapsMask {\n constructor(element) {\n super(element);\n this.element = element;\n this.onKeyUp = this.onKeyUp.bind(this);\n\n element.addEventListener('keyup', this.onKeyUp);\n }\n\n /**\n * @private onKeyUp\n * @param {KeyboardEvent} evt - On key up event\n */\n onKeyUp(evt) {\n const key = evt.key && typeof evt.key !== 'number' ? evt.key.toLocaleLowerCase() : evt.key || null;\n if (key && UNDO_KEYS.some((k) => k === key)) {\n if (this.element.value.length % 4 === 1) {\n this.element.value = this.element.value.substring(0, this.element.value.length);\n }\n return;\n }\n\n // Mask the input value for iban using a regular expression.\n this.element.value = this.element.value\n .replace(/\\s/g, '')\n .replace(/^([a-zA-Z]{2}\\d{2})(\\w{0,4})(\\d{0,4})(\\d{0,4})(\\d{0,2})/, '$1 $2 $3 $4 $5')\n .replace(/\\s\\s+/g, ' ');\n }\n}\n\nexport { IBANMask, IBAN_MASK_ATTRIBUTE };\n","'use strict';\n\nimport { CapsMask } from './caps';\n\n/**\n * @constant {string} POSTCODE_MASK_ATTRIBUTE - Attribute value for postcode mask\n */\nconst POSTCODE_MASK_ATTRIBUTE = 'postcode';\n\n/**\n * @constant {integer} BACKSPACE_KEYCODE\n */\nconst BACKSPACE_KEYCODE = 8;\n\n/**\n * @constant {integer} DELETE_KEYCODE\n */\nconst DELETE_KEYCODE = 46;\n\n/**\n * @constant {Array} UNDO_KEYS\n */\nconst UNDO_KEYS = [BACKSPACE_KEYCODE, DELETE_KEYCODE, 'backspace', 'delete'];\n\n/**\n * @class PostCodeMask\n * @param {HTMLInputElement} element - The input field to put the postcode mask on.\n */\nclass PostCodeMask extends CapsMask {\n constructor(element) {\n super(element);\n this.element = element;\n this.onKeyUp = this.onKeyUp.bind(this);\n\n element.addEventListener('keyup', this.onKeyUp);\n }\n\n /**\n * @private onKeyUp\n * @param {KeyboardEvent} evt - On key up event\n */\n onKeyUp(evt) {\n const key = evt.key && typeof evt.key !== 'number' ? evt.key.toLocaleLowerCase() : evt.key || null;\n if (key && UNDO_KEYS.some((k) => k === key)) {\n if (this.element.value.length === 5) {\n this.element.value = this.element.value.substring(0, 4);\n }\n return;\n }\n\n // Mask the input value for postcodes using a regular expression.\n this.element.value = this.element.value.replace(/(^\\d{4})(\\w{0,2}$)/, '$1 $2');\n }\n}\n\nexport { PostCodeMask, POSTCODE_MASK_ATTRIBUTE };\n","'use strict';\n\n/**\n * @constant {string} DOCUMENT_NUMBER - Input field for document number\n */\nconst DOCUMENT_NUMBER = 'dwfrm_checkoutDetails_identification_documentNumber';\n\n/**\n * @public documentNumber\n * @param {HTMLInputElement} element - Document Number input field\n */\nexport default function documentNumber(element) {\n if (element.name !== DOCUMENT_NUMBER) return;\n\n element.closest('form').addEventListener('identificationTypeChanged', (evt) => {\n // First reset regex state due to /g entries\n // https://stackoverflow.com/questions/2630418/javascript-regex-returning-true-then-false-then-true-etc/2630538#2630538\n element.pattern = evt.detail.regex.toString().replace('/^', '^').replace('$/gi', '$');\n element.regex.lastIndex = 0;\n element.regex = new RegExp(element.pattern);\n if (element.value.length > 0) {\n element.dispatchEvent(new CustomEvent('input'));\n element.dispatchEvent(new CustomEvent('blur'));\n }\n });\n\n const originalErrorMsg = element.dataset.patternError;\n element.addEventListener('input', () => {\n // Reset to original error message\n element.dataset.patternError = originalErrorMsg;\n if (element.dataset.selectedId && element.dataset.selectedId.includes('verblijfsdocument')) {\n if (element.value.toLowerCase().startsWith('x00')) element.dataset.patternError = element.dataset.patternX00Error;\n if (element.value.toLowerCase().startsWith('v')) element.dataset.patternError = element.dataset.patternVError;\n }\n });\n}\n","'use strict';\n\n// Can't import cartridges/app_vodafone_ziggo/cartridge/scripts/forms/validator.js\nconst ID_TYPES_CODES = {\n idCard: '1',\n passport: '2',\n driversLicense: '3',\n permit1: '4',\n permit2: '5',\n permit3: '6',\n permit4: '7',\n permit5: '8',\n permitEU: '9',\n other: '10'\n};\n\nconst ID_VALIDATION_RULES = {};\nID_VALIDATION_RULES[ID_TYPES_CODES.passport] = /^[A-NP-Z]{2}[\\dA-NP-Z]{6}\\d{1}$/gi;\nID_VALIDATION_RULES[ID_TYPES_CODES.idCard] = ID_VALIDATION_RULES[ID_TYPES_CODES.passport];\nID_VALIDATION_RULES[ID_TYPES_CODES.driversLicense] = /^\\d{10}$/gi;\nID_VALIDATION_RULES[ID_TYPES_CODES.permit1] = /^(?!(X00|V))[\\dA-Z]{8,9}$/gi;\nID_VALIDATION_RULES[ID_TYPES_CODES.permit2] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\nID_VALIDATION_RULES[ID_TYPES_CODES.permit2] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\nID_VALIDATION_RULES[ID_TYPES_CODES.permit3] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\nID_VALIDATION_RULES[ID_TYPES_CODES.permit4] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\nID_VALIDATION_RULES[ID_TYPES_CODES.permit5] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\nID_VALIDATION_RULES[ID_TYPES_CODES.permitEU] = ID_VALIDATION_RULES[ID_TYPES_CODES.permit1];\n\n// this regexp is always invalid\nID_VALIDATION_RULES[ID_TYPES_CODES.other] = /(?=a)b/;\n\n/**\n * @constant {string} ID_TYPE - Selector for identification type\n */\nconst ID_TYPE = 'dwfrm_checkoutDetails_identification_idtype';\n\n/**\n * @private setValidationPattern\n * @param {Event} evt - Change or load event\n */\nfunction setValidationPattern(evt) {\n const element = evt.target.id === ID_TYPE ? evt.target : document.getElementById(ID_TYPE);\n if (element.value) {\n element.closest('form').dispatchEvent(\n new CustomEvent('identificationTypeChanged', {\n detail: {\n type: element.value,\n regex: ID_VALIDATION_RULES[element.value]\n }\n })\n );\n }\n}\n\n/**\n * @public idType\n * @param {HTMLSelectElement} element - Identification type selector\n */\nexport default function idType(element) {\n if (element.id !== ID_TYPE) return;\n\n element.addEventListener('change', setValidationPattern);\n window.addEventListener('load', setValidationPattern);\n}\n","'use strict';\n\nimport documentNumber from './documentNumber';\nimport idType from './idType';\nimport mask from './mask';\nimport password from './password';\nimport preventCharacters from './preventCharacters';\nimport readonly from './readonly';\nimport regex from './regex';\nimport valid from './valid';\n\nexport default {\n documentNumber,\n idType,\n mask,\n password,\n preventCharacters,\n readonly,\n regex,\n valid\n};\n","'use strict';\n\nimport Mask from 'Components/form/mask';\n\n/**\n * @public regex\n * @param {HTMLInputElement} element - The element to put the mask on\n */\nexport default function mask(element) {\n Object.defineProperty(element, 'mask', {\n enumerable: false,\n configurable: false,\n value: new Mask(element)\n });\n}\n","'use strict';\n\n/**\n * @constant {string} PASSWORD_VIEW_TOGGLE - Selector for toggling the view state of a password field.\n */\nconst PASSWORD_VIEW_TOGGLE = '.js-password-toggle';\n\n/**\n * @public showPassword\n * @param {HTMLInputElement} element - The element used to set the password toggle.\n */\nexport default function showPassword(element) {\n const feedbackElement = element.parentElement.querySelector(PASSWORD_VIEW_TOGGLE);\n if (!feedbackElement) return;\n\n feedbackElement.addEventListener('click', () => {\n element.showPassword = element.type === 'password';\n });\n Object.defineProperty(element, 'showPassword', {\n enumerable: false,\n configurable: false,\n set: (value) => {\n if (value) {\n element.type = 'text';\n } else {\n element.type = 'password';\n }\n }\n });\n}\n","'use strict';\n\n/**\n * @private preventCharacters\n * @param {Event} event - Keydown or paste event\n */\nfunction preventCharacters(event) {\n const { target } = event;\n const bannedCharacters = target.getAttribute('data-prevent');\n\n if (event.key && bannedCharacters.includes(event.key)) {\n event.preventDefault();\n } else if (event.clipboardData) {\n event.preventDefault();\n\n const clipboardData = event.clipboardData.getData('text/plain');\n const dataWithoutBannedCharacters = clipboardData\n .split('')\n .filter((character) => !bannedCharacters.includes(character))\n .join('');\n const currValue = target.value;\n\n if (typeof target.selectionStart === 'number') {\n const start = target.selectionStart;\n const end = target.selectionEnd;\n const newVal = [];\n\n if (start === 0 && end === 0) {\n newVal.push(dataWithoutBannedCharacters);\n newVal.push(currValue);\n } else {\n newVal.push(currValue.substr(0, start));\n newVal.push(dataWithoutBannedCharacters);\n newVal.push(currValue.substr(end, currValue.length - 1));\n }\n\n target.value = newVal.join('');\n } else {\n // Some input types don't support `selectionStart`. In this edge case, just append it to the end\n target.value = currValue + dataWithoutBannedCharacters;\n }\n }\n}\n\n/**\n * @public preventCharactersOnInput\n * @param {HTMLInputElement} element - The input element\n */\nexport default function preventCharactersOnInput(element) {\n if (!element.getAttribute('data-prevent')) return;\n\n element.addEventListener('keydown', preventCharacters);\n element.addEventListener('paste', preventCharacters);\n}\n","'use strict';\n\nconst events = ['keydown', 'paste', 'focus', 'mousedown'];\n\n/**\n * Prevent entry in the field\n * @param {Event} evt - An event\n */\nfunction preventEntry(evt) {\n // ignore tab\n if (evt.keyCode !== 9) evt.preventDefault();\n}\n\n/**\n * Enable the read-only feature\n * @param {HTMLElement} element - The element to make read-only\n * @returns {bool} enabled\n */\nfunction enable(element) {\n events.forEach((event) => {\n element.addEventListener(event, preventEntry);\n });\n return true;\n}\n\n/**\n * Disable the read-only feature\n * @param {HTMLElement} element - The element to make read-only\n * @returns {bool} enabled\n */\nfunction disable(element) {\n events.forEach((event) => {\n element.removeEventListener(event, preventEntry);\n });\n return false;\n}\n\n/**\n * @public idType\n * @param {HTMLSelectElement} element - Identification type selector\n */\nexport default function idType(element) {\n if (!element.hasAttribute('read-only')) return;\n Object.defineProperty(element, 'read-only', {\n enumerable: false,\n configurable: false,\n set: (bool) => {\n if (bool) {\n this.value = enable(element);\n return;\n }\n this.value = disable(element);\n }\n });\n element['read-only'] = element.getAttribute('read-only');\n}\n","'use strict';\n\n/**\n * @public regex\n * @param {HTMLInputElement} element - The element used to set the regex.\n */\nexport default function regex(element) {\n Object.defineProperty(element, 'regex', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: element.required ? new RegExp(element.pattern) : new RegExp() // Pattern or empty when not mandatory\n });\n}\n","'use strict';\n\n/**\n * @public validate\n * @param {HTMLInputElement} element - The element used to validate.\n */\nexport default function validate(element) {\n Object.defineProperty(element, 'valid', {\n enumerable: true,\n configurable: false,\n set: (value) => {\n if (value) {\n element.classList.add('valid');\n element.classList.remove('invalid');\n } else {\n element.classList.add('invalid');\n element.classList.remove('valid');\n }\n }\n });\n}\n","'use strict';\n\nimport * as throttle from 'lodash/throttle';\n\n/**\n * @function getVerticalScrollPercentage\n * @returns {number} the percentage\n */\nfunction getVerticalScrollPercentage() {\n const parentNode = document.body.parentNode;\n return ((document.body.scrollTop || parentNode.scrollTop) / (parentNode.scrollHeight - parentNode.clientHeight)) * 100;\n}\n\n/**\n * @function isWithin24Hours\n * @returns {boolean} Whether the modal was closed within 24 hours\n */\nfunction isWithin24Hours() {\n const then = new Date(localStorage.getItem('modalCloseDate'));\n const now = new Date();\n\n const msBetweenDates = Math.abs(then.getTime() - now.getTime());\n\n // convert ms to hours min sec ms\n const hoursBetweenDates = msBetweenDates / (60 * 60 * 1000);\n return hoursBetweenDates < 24;\n}\n\n/**\n * @function closeModal\n * @param {Event} evt - Click event\n */\nfunction closeModal(evt) {\n // hide modal\n evt.currentTarget.parentNode.removeChild(evt.target);\n localStorage.setItem('modalCloseDate', new Date());\n}\n\n/**\n * @function getAgentStatus\n * @returns {string} Checks if the chat is online\n */\nfunction getAgentStatus() {\n return document.querySelector('.dimelo_chat_mode_online') ? 'online' : 'offline';\n}\n\n/**\n * @function onModalClick\n * @param {Event} Click Event\n */\nfunction onModalClick({ target }) {\n if (!target.classList.contains('btn-close')) {\n if (getAgentStatus() === 'online') {\n document.querySelector('.js-btn-contactmodal').click();\n } else {\n document.querySelector('vz-contactmodal')?.show();\n }\n }\n}\n\n/**\n * @function showModal\n */\nfunction showModal() {\n const engagementModal = document.querySelector('.engagement-modal');\n engagementModal.classList.remove('d-none');\n engagementModal.addEventListener('click', onModalClick);\n document.querySelector('.engagement-modal .btn-close').addEventListener('click', closeModal);\n}\n\n/**\n * @function modalThreshold\n */\nconst modalThreshold = throttle(() => {\n if (getVerticalScrollPercentage() > 75) {\n document.removeEventListener('scroll', modalThreshold);\n setTimeout(showModal, 120_000); // 2 minutes delay\n }\n}, 100);\n\n/**\n * @function shakeThreshold\n */\nconst shakeThreshold = throttle(() => {\n if (getVerticalScrollPercentage() > 30) {\n [...document.querySelectorAll('.dimelo_chat_show_when_online,.dimelo_chat_show_when_offline')].forEach((button) => button.classList.add('shake'));\n document.removeEventListener('scroll', shakeThreshold);\n\n if (!isWithin24Hours()) {\n document.addEventListener('scroll', modalThreshold);\n }\n }\n}, 100);\n\n/**\n * @function startEngagement\n */\n(function startEngagement() {\n const pageView = Math.abs(localStorage.getItem('pageView') || 0) + 1;\n localStorage.setItem('pageView', pageView);\n\n if (pageView === 2) {\n document.addEventListener('scroll', shakeThreshold);\n }\n})();\n","'use strict';\n\nimport { validateField, removeValidationMessageElement } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * Dispatches an 'input' event on the given element.\n * @param {HTMLElement} element - The element to dispatch the event on.\n */\nfunction dispatchInputEvent(element) {\n const event = new Event('input', { bubbles: true, cancelable: true });\n element.dispatchEvent(event);\n}\n\n/**\n * Clears all the fields in the provided form elements object and resets the validation.\n *\n * @param {Object} formElements - The form elements to be cleared.\n */\nfunction clearFormFields(formElements) {\n Object.keys(formElements).forEach((key) => {\n const element = formElements[key];\n // Preselect the only option from a select element\n if (element.tagName === 'SELECT') {\n const notDisabledOptions = Array.from(element.options).filter((option) => !option.disabled);\n if (notDisabledOptions.length === 1) {\n element.selectedIndex = notDisabledOptions[0].index;\n }\n } else {\n element.value = '';\n formElements[key].classList.add('empty');\n validateField(formElements[key]);\n }\n\n dispatchInputEvent(element);\n element.classList.remove('invalid');\n removeValidationMessageElement(element);\n });\n}\n\n/**\n * Prefills the form fields with provided data.\n *\n * @param {Object} formElements - The form elements to be prefilled.\n * @param {Object} data - The data used to prefill the form elements.\n */\nfunction prefillFormFields(formElements, data) {\n Object.keys(formElements).forEach((key) => {\n const element = formElements[key];\n element.value = data[key] || '';\n\n if (element.value) {\n element.classList.remove('empty');\n }\n\n dispatchInputEvent(element);\n });\n}\n\n/**\n * Sets the required attribute on specified contact form fields.\n *\n * @param {Object} formElements - An object containing the form elements to be modified.\n * @param {boolean} isRequired - A boolean indicating whether the fields should be marked as required.\n */\nfunction makeContactFormFieldsRequired(formElements, isRequired) {\n [formElements.initials, formElements.lastName, formElements.email, formElements.phone].forEach((input) => {\n input.required = isRequired;\n input.setAttribute('aria-required', isRequired.toString());\n });\n}\n\nexport { clearFormFields, prefillFormFields, makeContactFormFieldsRequired };\n","'use strict';\n\nimport 'Root/VZLeadForm';\nimport 'Root/VZLeadFormTrigger';\n\nclass ChatPrompt {\n constructor() {\n this.chatOfflineButton = document.querySelector('.dimelo_chat_show_when_offline');\n this.activeConfiguratorGroup = document.getElementById('activeConfiguratorGroup');\n this.committedConfiguratorGroups = document.getElementById('committedConfiguratorGroups');\n this.customerEmail = document.getElementById('customerEmail');\n this.lastOrderNr = document.getElementById('lastOrderNr');\n\n this.prompt = false;\n window.dataLayer = window.dataLayer || [];\n\n this.assignListeners = this.assignListeners.call(this);\n this.openChatPrompt = this.openChatPrompt.bind(this);\n this.closeChatPrompt = this.closeChatPrompt.bind(this);\n this.openChatWhenLoaded = this.openChatWhenLoaded.bind(this);\n\n this.addConfiguratorGroupsToDatalayer = this.addConfiguratorGroupsToDatalayer.bind(this);\n\n if (this.chatOfflineButton && this.chatOfflineButton.length) {\n this.chatOfflineButton.setAttribute('tabindex', 0); // Do this so the element can get a `:focus` state\n }\n }\n\n assignListeners() {\n window.addEventListener('load', () => {\n this.addConfiguratorGroupsToDatalayer.call(this);\n\n if (this.customerEmail) {\n window.dataLayer.push({\n customerEmail: this.customerEmail.value\n });\n }\n if (this.lastOrderNr) {\n window.dataLayer.push({\n lastOrderNr: this.lastOrderNr.value\n });\n }\n this.openByDefault = document.querySelector('.js-dimelo-chat-state')?.value === 'show';\n if (this.openByDefault) {\n if (this.chatOfflineButton) {\n this.chatOfflineButton.querySelector('.js-btn-leadmodal')?.click();\n } else {\n this.interval = setInterval(this.openChatWhenLoaded, 1000);\n }\n }\n });\n\n window.addEventListener('dimelo:chat:load', () => {\n this.openByDefault = document.querySelector('.js-dimelo-chat-state')?.value === 'show';\n this.chatOfflineButton.addEventListener('click', this.openChatPrompt);\n if (this.openByDefault) {\n this.openChatPrompt();\n }\n });\n }\n\n openChatPrompt() {\n if (!this.prompt) {\n const target = this.chatOfflineButton.getAttribute('data-target');\n this.prompt = document.querySelector(target);\n }\n\n if (this.prompt) {\n this.prompt.classList.add('active');\n this.closeButton = this.prompt.querySelector('.js-btn-prompt-cancel');\n this.closeButton.addEventListener('click', this.closeChatPrompt);\n } else {\n this.chatOfflineButton.removeEventListener('click', this.openChatPrompt);\n }\n }\n\n closeChatPrompt(event) {\n event.preventDefault();\n this.prompt.classList.remove('active');\n this.closeButton.removeEventListener('click', this.closeChatPrompt);\n }\n\n // Retrieve the configuration from the dataLayer like this:\n // google_tag_manager[containerId].dataLayer.get(groupName);\n addConfiguratorGroupsToDatalayer() {\n [this.committedConfiguratorGroups, this.activeConfiguratorGroup].forEach((group) => {\n if (!group) return;\n\n this.constructor.pushToDataLayer(group);\n\n group.addEventListener('locationChange', (customEvent) => {\n this.constructor.updateGroupLocation(group, customEvent);\n this.constructor.pushToDataLayer(group);\n });\n\n group.addEventListener('change', () => {\n this.constructor.pushToDataLayer(group);\n });\n });\n }\n\n static pushToDataLayer(group) {\n if (!group) return;\n\n const groupObj = {};\n groupObj[group.id] = JSON.parse(group.value);\n window.dataLayer.push(groupObj);\n }\n\n static updateGroupLocation(group, customEvent) {\n const data = JSON.parse(group.value);\n const address = customEvent.detail;\n\n data.location = {\n street: address.street,\n houseNumber: address.houseNumber,\n appendix: address.extension,\n postCode: address.postalCode,\n city: address.city,\n room: address.room,\n paid: address.paid\n };\n\n group.value = JSON.stringify(data);\n }\n\n /**\n * Opens the chat when the chat button is loaded and available.\n * Clears the interval once the chat button is clicked.\n * @returns {void}\n */\n openChatWhenLoaded() {\n const chatBtn = document.querySelector('.dimelo_chat_show_when_online button');\n if (chatBtn) {\n chatBtn.click();\n clearInterval(this.interval);\n }\n }\n}\n\nnew ChatPrompt(); // eslint-disable-line no-new\n","/**\n * @public setCookie\n * @param {string} cookieName - The cookie name\n * @param {string} cookieValue - The cookie value\n * @param {string} domain - The domain\n * @param {string} expirationDays - The expiration in days\n */\nfunction setCookie(cookieName, cookieValue, domain, expirationDays = 30) {\n const date = new Date();\n date.setTime(date.getTime() + expirationDays * 24 * 60 * 60 * 1000);\n const expires = `expires=${date.toUTCString()}`;\n const domainAndPath = `${domain ? `domain=${domain};` : ''}path=/; secure; sameSite=None`;\n const cookieString = `${cookieName}=${cookieValue};${expires};${domainAndPath}`;\n\n document.cookie = cookieString;\n}\n\n/**\n * @public getCookie\n * @param {string} cookieName - The cookie name\n * @return {string|null} The value of the cookie || null\n */\nfunction getCookie(cookieName) {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${cookieName}=`);\n if (parts.length === 2) return parts.pop().split(';').shift();\n return null;\n}\n\nexport { setCookie, getCookie };\n","'use strict';\n\nimport { setCookie, getCookie } from 'Util/cookies';\n\n/**\n * @private startDevToolsDetector\n *\n * @description\n * Detect whether chrome devtools is open or not.\n * Based on https://stackoverflow.com/a/67148898/8823973\n *\n * Once detected, set a cookie and never fire this again. The cookie is used in the following file\n * to determine that the \"iPad useragent\" is in fact an iPad emulation in Chrome/Firefox devtools:\n * app_vodafone_ziggo/cartridge/scripts/helpers/hookHelpers.js\n *\n * It has been a real challenge to find a method that works properly with the current version of\n * Chrome (v95). This method seems to work since version 89.\n * Chrome usually patches \"hacks\" that try to detect this, so this might stop working in the future.\n * Good luck to the chap that can search for a new way to detect devtools in that case.\n */\nfunction startDevToolsDetector() {\n const devToolsOpen = () => {};\n\n const interval = setInterval(() => {\n console.profile(devToolsOpen);\n console.profileEnd(devToolsOpen);\n }, 5000);\n\n devToolsOpen.toString = () => {\n setCookie('devToolsUser', true, window.location.hostname, 365);\n clearInterval(interval);\n return '-';\n };\n}\n\nif (!getCookie('devToolsUser')) {\n startDevToolsDetector();\n}\n","'use strict';\n\nimport { documentReady, getPosition } from 'Util/util';\n\nlet lastScrollPos = 0;\nlet elementsToFadeIn = []; // An array of all \"fade in\" elements. Will be filled on page load and emptied once the elements are faded in\nlet currentElements = []; // An array of all elements in view at the time of \"checkElements\"\nlet adviceScrollArea;\n\n// Animation vars\nconst fadeInOffset = 250; // Offset from the bottom of the viewport in pixels, before the element is faded in\nconst fadeInTime = 700; // The time it takes to fade in an element. should match the scss transition time value\nconst staggerDelay = 100; // The delay between each element that needs to fade in on page load\n\nconst selectors = {\n fadeInElements: '.js-fade-in-element:not(.faded-in)',\n adviceScrollArea: '.js-bscan-step.bscan-advice .js-bscan-step-scroll-area'\n};\n\n/**\n * @private updateElementsArrays\n *\n * @description\n * Will update the array of elements to fade in. This is done after some elements have been faded in\n */\nfunction updateElementsArrays() {\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n currentElements = [];\n\n // If there are no more elements, remove the event listener\n if (elementsToFadeIn.length === 0) {\n window.removeEventListener('scroll', checkElements); // eslint-disable-line no-use-before-define\n }\n}\n\n/**\n * @private fadeInElements\n *\n * @description\n * Will loop over all elements currently in view, then fade them in\n * In case of multiple elements, the fade-in's are staggered through an incremental transition delay\n */\nfunction fadeInElements() {\n currentElements.forEach((initialElement, index) => {\n initialElement.style.transitionDelay = `${(index * (fadeInTime + staggerDelay)) / 1000}s`;\n initialElement.classList.add('faded-in');\n });\n\n updateElementsArrays();\n}\n\n/**\n * @private checkElements\n *\n * @description Will check to see if there are any elements that need to fade in once they get into view\n */\nfunction checkElements() {\n const currentScrollPos = adviceScrollArea ? adviceScrollArea.scrollTop : window.pageYOffset || document.documentElement.scrollTop;\n const viewHeight = window.innerHeight;\n const isNotScrollingUp = currentScrollPos >= lastScrollPos;\n\n // If there are elements to fade in, and we're not scrolling up\n if (elementsToFadeIn.length > 0 && isNotScrollingUp) {\n elementsToFadeIn.forEach((element) => {\n // First get the element's position relative to the body (+ a possible offset)\n const elementFadeInPosition = getPosition(element).top + fadeInOffset;\n // Then get the bottom of the current viewport\n const bottomOfViewport = currentScrollPos + viewHeight;\n\n // If the element is placed higher than the bottom of the current viewport, add it to an array of elements to fade in\n if (elementFadeInPosition < bottomOfViewport) {\n currentElements.push(element);\n }\n });\n\n fadeInElements();\n }\n\n lastScrollPos = currentScrollPos <= 0 ? 0 : currentScrollPos;\n}\n\nexport default (function init() {\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n adviceScrollArea = document.querySelector(selectors.adviceScrollArea);\n\n // Check to see if any elements should be faded in\n documentReady(checkElements); // On document ready so the first one is done ASAP\n window.addEventListener('load', checkElements); // Also on window load, because for some reason the 2nd+ elements can sometimes not fade in without this\n\n if (adviceScrollArea) {\n adviceScrollArea.addEventListener('scroll', checkElements);\n } else {\n window.addEventListener('scroll', checkElements);\n }\n\n document.addEventListener('bscan:step', (e) => {\n if (e.detail === 'bs-advice') {\n adviceScrollArea = document.querySelector(selectors.adviceScrollArea);\n if (adviceScrollArea) {\n adviceScrollArea.addEventListener('scroll', checkElements);\n }\n\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n checkElements();\n }\n });\n\n // Also do it with a timeout for PageDesigner, seeing as the initial execution (nor window.load) does not seem to do much when inside PD\n if (window.frameElement && window.frameElement.closest('.page-designer-ui')) {\n setTimeout(checkElements.bind(true), 1000);\n setTimeout(checkElements.bind(true), 3000);\n }\n})();\n","'use strict';\n\nimport { getPosition, scrollTo } from 'app_vodafone_ziggo/util/util';\nimport { removeHash } from 'app_vodafone_ziggo/util/urlUtils';\nimport Collapse from 'bootstrap/js/src/collapse';\n\nwindow.bs = window.bs || {};\nwindow.bs.Collapse = Collapse;\n\n/**\n * @private scrollToQuestion\n */\nfunction scrollToQuestion() {\n if (window.location.hash) {\n const hash = window.location.hash;\n const collapseEl = document.querySelector(hash);\n if (!collapseEl) return;\n\n const elementsToExpand = [collapseEl];\n\n // If we're inside a collapsable group, expand the group\n // Otherwise we can't show the child collapsable item\n const group = collapseEl.closest('.faq-items.collapse');\n if (group) elementsToExpand.push(group);\n\n // Auto expand the collapsable items on page load\n elementsToExpand.forEach((item) => {\n /* eslint-disable-next-line no-new */\n new window.bs.Collapse(item, {\n toggle: true\n });\n });\n\n const togglerEl = document.querySelector(`[data-bs-target=\"${hash}\"]`);\n\n // Finally, scroll to the question\n const elementPosition = togglerEl ? getPosition(togglerEl) : getPosition(collapseEl);\n\n // Scroll after a really short timeout for some edgecases where a browser's autoscroll is\n // firing after our custom `scrollTo` functionality. This might have something to do with the\n // callstack, so make sure our `scrollTo` is fired last.\n setTimeout(() => {\n scrollTo(elementPosition);\n }, 1);\n }\n}\n\n/**\n * @private updateHash\n * @param {HTMLElement} target - The clicked element\n */\nfunction updateHash(target) {\n const hashValue = target.getAttribute('data-bs-target');\n const urlWithoutHash = window.location.href.split('#')[0];\n\n // Use replaceState instead of window.location.hash. Otherwise, the user would have a lot of history\n // entries after clicking various questions. Also the browser would auto scroll on hash change.\n window.history.replaceState({}, document.title, urlWithoutHash + hashValue);\n}\n\n/**\n * @private onCollapseToggle\n * @param {event} event - The click event\n */\nfunction onCollapseToggle(event) {\n const { target } = event;\n\n if (target.getAttribute('aria-expanded') === 'true') {\n updateHash(target);\n } else {\n removeHash();\n }\n}\n\nwindow.addEventListener('load', scrollToQuestion);\n\n[...document.querySelectorAll('.btn-faq-item')].forEach((button) => {\n button.addEventListener('click', onCollapseToggle);\n});\n","'use strict';\n\nimport { CONST, addEvent, exists, isAemMobileView, assignStyling, documentReady } from 'Util/util';\nimport * as debounce from 'lodash/debounce';\n\nconst selectors = {\n listColumn: '.js-col-link-list',\n listLink: 'h6 a',\n listGroup: '.list-group'\n};\n\nconst siteFooter = document.querySelector('.js-site-footer');\n\n/**\n * @private toggleMobileMenu\n * @param {Event} event - The click/tap event\n */\nfunction toggleMobileMenu(event) {\n const element = event.target;\n const listElements = document.querySelectorAll(`${selectors.listColumn} ${selectors.listLink}, ${selectors.listColumn} ${selectors.listGroup}`);\n const currentColumn = element.closest(selectors.listColumn);\n const currentElements = currentColumn.querySelectorAll(`${selectors.listLink}, ${selectors.listGroup}`);\n\n if (!exists(listElements) || !exists(currentElements)) {\n console.error('fn toggleMobileMenu: required elements are missing');\n return;\n }\n\n if (isAemMobileView()) {\n event.preventDefault();\n }\n\n [...listElements].forEach((listElement) => listElement.classList.remove(CONST.classes.active));\n [...currentElements].forEach((currentElement) => currentElement.classList.add(CONST.classes.active));\n}\n\n/**\n * @private checkFooterOverlaping\n */\nfunction checkFooterOverlaping() {\n const notFoundAbsoluteContainer = document.querySelector('#js-404-page-absolute-container');\n if (exists(notFoundAbsoluteContainer)) {\n const absolutelyPositionedElementRect = notFoundAbsoluteContainer.getBoundingClientRect();\n const siteFooterRect = siteFooter.getBoundingClientRect();\n\n if (absolutelyPositionedElementRect.bottom >= siteFooterRect.top) {\n siteFooter.classList.remove('mt-5');\n assignStyling(siteFooter, {\n 'margin-top': `${absolutelyPositionedElementRect.bottom - siteFooterRect.top + 10}px`\n });\n }\n }\n}\n\naddEvent(document, CONST.events.click, `${selectors.listColumn} ${selectors.listLink}`, toggleMobileMenu);\ndocumentReady(checkFooterOverlaping);\nwindow.addEventListener(\n 'resize',\n debounce(() => {\n siteFooter.classList.add('mt-5');\n siteFooter.style.removeProperty('margin-top');\n checkFooterOverlaping();\n }),\n 150\n);\n","'use strict';\n\nimport decorators from 'Decorators/index';\nimport { getFieldValidationMessage } from 'Components/form/form';\n\n/**\n * @class VZDateField\n * @param {HTMLInputElement} element - The element to create an instance on\n *\n * @example\n * \n */\nclass VZDateField extends HTMLInputElement {\n constructor() {\n super();\n\n const minDate = this.getAttribute('data-min-date');\n const maxDate = this.getAttribute('data-max-date');\n\n this.minDate = minDate !== null ? new Date(minDate) : null;\n this.maxDate = maxDate !== null ? new Date(maxDate) : null;\n\n this.setFieldStatus = this.setFieldStatus.bind(this);\n\n this.addEventListener('input', this.setFieldStatus);\n this.addEventListener('change', this.setFieldStatus);\n\n this.addEventListener('change', this.validateDate);\n this.addEventListener('change', this.validateField);\n\n this.addEventListener('blur', this.validateDate);\n this.addEventListener('blur', this.validateField);\n\n decorators.valid(this, this);\n\n if (this.hasAttribute('data-mask')) {\n decorators.mask(this, this);\n }\n\n // Set initial state\n this.setFieldStatus();\n }\n\n /**\n * @private setFieldStatus\n * @description\n * Sets an empty class when the element is empty for styling purposes.\n */\n setFieldStatus() {\n const hasValue = this.value.length > 0;\n if (hasValue) {\n this.classList.remove('empty');\n } else {\n this.classList.add('empty');\n }\n }\n\n /**\n * @private validateDate\n * @param {Event} evt - On Blur even\n */\n validateDate(evt) {\n if (evt.target.value.length === 0) return;\n\n const element = evt.target;\n const elValue = element.dataset.value ? element.dataset.value : element.value;\n const elementIsDatepicker = element.classList.contains('js-is-datepicker');\n const [day, month, year] = elValue.split('-');\n const dateValue = `${month}/${day}/${year}`;\n const chosenDate = new Date(dateValue);\n\n let dateIsInvalid = false;\n\n element.dataset.invalid = false;\n element.dataset.invalidMax = false;\n element.dataset.invalidMin = false;\n\n element.setCustomValidity('');\n\n /**\n * BO-3100 & BO-3316:\n * Base date field validation breaks appointment picker date fields.\n * We are using vanillajs-datepicker there so we will rely on it instead for min/max or unavailable dates.\n */\n if (elementIsDatepicker) return;\n\n // Invalid\n if (window.isNaN(chosenDate) || elValue.length < 10) {\n element.dataset.invalid = true;\n dateIsInvalid = true;\n }\n\n // Before min date\n if (this.minDate !== null && chosenDate < this.minDate) {\n element.dataset.invalidMin = true;\n dateIsInvalid = true;\n }\n\n // After max date\n if (this.maxDate !== null && chosenDate > this.maxDate) {\n element.dataset.invalidMax = true;\n dateIsInvalid = true;\n }\n\n // Date is not valid\n if (dateIsInvalid) element.setCustomValidity('invalid');\n }\n\n /**\n * @private validateField\n * @param {Event} evt - blur or invalid event\n * @param {string} [msg] - validation message\n */\n validateField(evt, msg) {\n const message = msg || getFieldValidationMessage(evt.target);\n\n if (message) {\n const element =\n this.parentElement.querySelector('.error-msg') ||\n (function createErrorElement() {\n const el = document.createElement('small');\n\n el.classList.add('error-msg', 'text-primary');\n\n return el;\n })();\n\n element.innerText = message;\n\n evt.target.parentElement.insertAdjacentElement('beforeend', element);\n evt.target.classList.add('invalid');\n evt.target.classList.remove('valid');\n } else {\n const element = this.parentElement.querySelector('.error-msg');\n\n if (element) element.remove();\n\n evt.target.classList.remove('invalid');\n evt.target.classList.add('valid');\n }\n }\n}\n\nexport default window.customElements.get('vz-datefield') || VZDateField;\nif (!window.customElements.get('vz-datefield')) {\n window.customElements.define('vz-datefield', VZDateField, { extends: 'input' });\n}\n","'use strict';\n\nimport { Datepicker } from 'vanillajs-datepicker';\nimport NL from 'vanillajs-datepicker/locales/nl';\nimport moment from 'moment';\n\nimport VZDateField from './VZDateField';\n\nObject.assign(Datepicker.locales, NL);\n\n/**\n * @class VZDatePicker\n * @param {HTMLInputElement} element - The element to create an instance on\n *\n * @example\n *
\n * \n * \n *
\n *
\n *
\n *\n *
\n *
\n *
\n * \n * \n *
\n *
\n *
\n * {DATEPICKER_FORM_GROUP}\n *
\n *
\n */\nclass VZDatePicker extends VZDateField {\n constructor() {\n super();\n\n this.availableDates = this.getAttribute('data-available-dates')?.split(',') || [];\n this.maxDate = this.getAttribute('data-max-date');\n this.minDate = this.getAttribute('data-min-date');\n this.minDateUnFormatted = new Date(this.minDate);\n this.maxDateUnFormatted = new Date(this.maxDate);\n\n this.now = Date.now();\n this.parentElement.setAttribute('id', `c${this.now}`);\n\n this.createDatePicker = this.createDatePicker.bind(this);\n this.datesDisabled = this.datesDisabled.bind(this);\n this.changeDate = this.changeDate.bind(this);\n this.fixUnavailableDateOnBlur = this.fixUnavailableDateOnBlur.bind(this);\n this.setDatePickerDate = this.setDatePickerDate.bind(this);\n this.setDatePickerDefault = this.setDatePickerDefault.bind(this);\n\n this.datepicker = this.createDatePicker();\n\n this.addEventListener('show', this.constructor.setView);\n this.addEventListener('changeView', this.constructor.setView);\n this.addEventListener('changeDate', this.changeDate);\n this.addEventListener('setDatePickerDate', this.setDatePickerDate);\n\n // Invalid date inputs are ignored, so lets listen for the blur event as well\n this.addEventListener('blur', this.fixUnavailableDateOnBlur);\n\n this.setFieldStatus();\n\n // Enable ASAP option\n this.dataAsapDateAttribute = 'data-asap-date';\n this.datePickerContainer = this.parentElement.closest('.js-datepicker-form');\n this.asapToggle = this.datePickerContainer ? this.datePickerContainer.querySelector('input.js-datepicker-asap') : null;\n\n if (this.asapToggle) {\n this.setDatePickerAsap = this.setDatePickerAsap.bind(this);\n this.asapToggle.addEventListener('change', this.setDatePickerAsap);\n }\n }\n\n /**\n * @private setFieldStatus\n * @description\n * Sets an empty class when the element is empty for styling purposes.\n */\n setFieldStatus() {\n const hasValue = this.value.length > 0;\n\n if (hasValue) {\n this.setAttribute('data-value', this.value);\n this.classList.remove('empty');\n } else {\n this.classList.add('empty');\n }\n }\n\n /**\n * @private datesDisabled\n * @param {Date} date - A date object\n * @returns {boolean} - Whether a date should be disabled\n *\n * @description\n * If availableDates is not empty, disable dates that are not in this array\n */\n datesDisabled(date) {\n // If availableDates is empty, do not disable any dates\n if (!this.availableDates || this.availableDates.length === 0) return false;\n\n let day = date.getDate();\n let month = date.getMonth() + 1; // Month is index based, so we need to do +1\n const year = date.getFullYear();\n day = day < 10 ? `0${day}` : day;\n month = month < 10 ? `0${month}` : month;\n\n // Needs to be mm-dd-yyyy for the disable functionality to work\n const dateString = `${month}-${day}-${year}`;\n\n return !this.availableDates.includes(dateString);\n }\n\n /**\n * @private createDatePicker\n * @returns {HTMLElement} - A datepicker element\n *\n * @description\n * Will instantiate a datepicker for this element\n */\n createDatePicker() {\n const options = {\n autohide: true,\n container: `#c${this.now}`,\n defaultViewDate: this.now,\n datesDisabled: this.datesDisabled,\n format: {\n toValue(date) {\n return Datepicker.parseDate(date, 'dd-mm-yyyy', 'nl');\n },\n toDisplay(date) {\n return Datepicker.formatDate(date, 'dd-mm-yyyy', 'nl');\n }\n },\n language: 'nl',\n maxDate: new Date(this.maxDate),\n minDate: new Date(this.minDate),\n nextArrow: '',\n orientation: 'bottom auto',\n prevArrow: '',\n updateOnBlur: true\n };\n\n return new Datepicker(this, options);\n }\n\n /**\n * @private setView\n * @param {Event} evt - Custom event fired by the datepicker\n *\n * @description\n * Sets a data-view attribute used for styling purposes\n */\n static setView(evt) {\n evt.detail.datepicker.picker.element.setAttribute('data-view', evt.detail.viewId);\n }\n\n /**\n * @private getFormattedDate\n * @param {Date} dateObj - A date object\n * @returns {string} formattedDate\n */\n static getFormattedDate(dateObj) {\n const day = `0${dateObj.getDate()}`.slice(-2);\n const month = `0${dateObj.getMonth() + 1}`.slice(-2);\n const year = dateObj.getFullYear();\n\n return `${year}-${month}-${day}`;\n }\n\n /**\n * @private changeDate\n * @param {Event} evt - Custom event fired by the datepicker\n *\n * @description\n * Updates the data-value attribute on the datepicker and triggers form update.\n */\n changeDate(evt) {\n if (evt && evt.detail?.date) {\n this.setAttribute('data-value', this.constructor.getFormattedDate(evt.detail.date));\n\n // If ASAP date was previously selected check if checkbox should be toggled\n if (this.getAttribute(this.dataAsapDateAttribute)) this.resetDatePickerAsap(evt.detail.date);\n } else {\n this.removeAttribute('data-value');\n }\n\n this.closest('form').dispatchEvent(new CustomEvent('change'));\n this.dispatchEvent(new CustomEvent('input'));\n this.blur();\n }\n\n /**\n * @private fixUnavailableDateOnBlur\n * @param {Event} evt - Blur event fired by the datepicker\n *\n * @description\n * Checks if provided date is part of availableDates and if not triggers a value change.\n */\n fixUnavailableDateOnBlur(evt) {\n const newDate = moment(evt.target.value, 'DD-MM-YYYY').format('MM-DD-YYYY');\n\n // If the provided date is not available, automatically set a default value that is available\n if (!this.availableDates.includes(newDate)) this.setDatePickerDefault(newDate);\n }\n\n /**\n * @private setDatePickerDefault\n * @param {string} date - A date string\n *\n * @description\n * Sets datepicker value to `minDateUnFormatted` (if given date is in he past) or `maxDateUnFormatted` (if given date is in the future, or invalid somehow).\n *\n */\n setDatePickerDefault(date) {\n const newDate = moment(date, 'MM-DD-YYYY').isBefore(this.minDate) ? this.minDateUnFormatted : this.maxDateUnFormatted;\n\n // Set new automatic value and refresh date input\n this.datepicker.setDate(newDate);\n\n this.dispatchEvent(new CustomEvent('change'));\n }\n\n /**\n * @private setDatePickerAsap\n *\n * @description\n * Sets datepicker value to `minDate` (first available) on ASAP checkbox checked.\n *\n */\n setDatePickerAsap() {\n if (this.asapToggle.checked) {\n const date = this.momentFormatter(this.minDate);\n\n this.setAttribute(this.dataAsapDateAttribute, date);\n this.datepicker.setDate(date);\n\n // Refresh date field (make sure change event didn't affect checkbox)\n this.dispatchEvent(new CustomEvent('change'));\n\n this.asapToggle.checked = true;\n this.asapToggle.setAttribute('value', true);\n } else {\n this.removeAttribute(this.dataAsapDateAttribute);\n this.asapToggle.setAttribute('value', false);\n }\n }\n\n /**\n * @private setDatePickerDate\n * @param {Event} evt - Custom event fired by other components\n *\n * @description\n * Sets datepicker value to whatever is sent by the component\n *\n */\n setDatePickerDate(evt) {\n if (evt && evt.detail?.date) {\n const asapDate = evt.detail.asap && evt.detail.asap === 'true';\n\n if (asapDate) this.setAttribute(this.dataAsapDateAttribute, evt.detail.date);\n this.datepicker.setDate(evt.detail.date);\n\n // Refresh date field\n this.dispatchEvent(new CustomEvent('change'));\n\n // Handle ASAP toggle\n if (asapDate) {\n this.asapToggle.checked = true;\n this.asapToggle.setAttribute('value', true);\n }\n }\n }\n\n /**\n * @private resetDatePickerAsap\n * @param {string} date - Selected date\n *\n * @description\n * Resets ASAP checkbox if first available date is no longer selected.\n *\n */\n resetDatePickerAsap(date) {\n if (this.getAttribute(this.dataAsapDateAttribute) !== this.momentFormatter(date)) this.asapToggle.checked = false;\n }\n\n /* eslint-disable class-methods-use-this */\n /**\n * @private momentFormatter\n * @param {string} date - Date to be formatted\n * @returns {string} - momentjs formatted date\n *\n * @description\n * Using momentjs to format date to a desired format for vanillajs-datepicker display\n *\n */\n momentFormatter(date) {\n return moment ? moment(date).locale('nl').format('DD-MM-YYYY') : date;\n }\n /* eslint-enable class-methods-use-this */\n}\n\nexport default window.customElements.get('vz-datepicker') || VZDatePicker;\nif (!window.customElements.get('vz-datepicker')) {\n window.customElements.define('vz-datepicker', VZDatePicker, { extends: 'input' });\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t\n
\n
\n ${iconName?.length ? `` : ''}\n
\n
\n ${titleText}\n
\n
\n ${closeBtn && closeBtnUrl ? `` : ''}\n ${closeBtn && !closeBtnUrl ? '' : ''}\n
\n\n
\n ${bodyTitle?.length ? `

${bodyTitle}

` : ''}\n ${bodyText?.length ? `

${bodyText}

` : ''}\n
\n\n \n
\n \n `;\n }\n\n /**\n * @function renderAbandonConfigurationModal\n * @description Will add an onclick listener to all 'Wijzigen' cta's inside the minicart. When clicked on, the abandonConfiguration modal will show up.\n */\n // eslint-disable-next-line\n renderAbandonConfigurationModal() {\n const editButtons = [...document.querySelectorAll('.js-edit-button')];\n editButtons.forEach((editButton) => {\n editButton.addEventListener('click', () => {\n const { abandonConfigurationModalId } = editButton.dataset;\n\n const abandonConfigurationModal = document.getElementById(abandonConfigurationModalId);\n abandonConfigurationModal?.render();\n });\n });\n }\n}\n","'use-strict';\n\nimport ModalHelper from './modalHelper';\n\n/**\n * @class VZModal\n * @description Creates a modal based on defaultModalHTML or the HTML within the custom element.\n * @example\n * \n
Optional custom HTML if not using defaultModalHTML
\n \n * @usage\n * const modal = document.getElementById('specific-modal-name');\n * modal.render(); // An optional object can be passed to render() to overwrite the defaults.\n */\nexport default class VZModal extends HTMLElement {\n constructor() {\n super();\n this.setAttribute('tabindex', '-1');\n this.setAttribute('aria-hidden', 'true');\n this.hasCustomHtml = this.dataset.customModal === 'true';\n this.modalHelper = new ModalHelper();\n }\n\n /**\n * @function createTemplate\n * @description Injects the default modal HTML into the modal container.\n * @param {string} templateHtml - String representing default modal HTML.\n */\n createTemplate(templateHtml) {\n const template = document.createElement('template');\n template.innerHTML = templateHtml;\n this.appendChild(template.content.cloneNode(true));\n }\n\n connectedCallback() {\n document.addEventListener('minicart:open', this.modalHelper.renderAbandonConfigurationModal);\n }\n\n disconnectedCallback() {\n document.removeEventListener('minicart:open', this.modalHelper.renderAbandonConfigurationModal);\n }\n\n /**\n * @function render\n * @description Renders the contents of the addToBasketModal and injects text based on data attributes.\n * @param {Object} options - An optional parameter with configuration options for the modal. To be used to overwrite the default options.\n */\n render(options = {}) {\n // If the default modal does not fit the requirement, custom HTML can be added within the custom element.\n if (this.hasCustomHtml) {\n this.showModal();\n return;\n }\n\n this.configurationOptions = { ...this.dataset, ...ModalHelper.defaultOptions, ...options };\n const defaultModalHTML = ModalHelper.getDefaultModalHtml(this.configurationOptions);\n\n // Remove existing modal so the template can be recreated with new content.\n this.querySelector('.js-modal-dialog')?.remove();\n\n this.createTemplate(defaultModalHTML); // Inject the template, add it to the DOM.\n\n this.showModal(); // Display the modal.\n }\n\n /**\n * @function showModal\n * @description Checks if modal already exists and either creates a new one to show, or shows the existing one.\n */\n showModal() {\n const { backdrop, keyboard } = { ...this.configurationOptions, ...this.dataset }; // If passed in the dataset, the default values for keyboard and backdrop will be overwritten.\n const keyboardSetting = typeof keyboard === 'string' ? keyboard === 'true' : keyboard;\n\n const newModal = new window.bs.Modal(this, { backdrop, keyboard: keyboardSetting }); // Options come from data attributes.\n if (newModal) newModal.show();\n }\n\n /**\n * @function hideModal\n * @description Hides the modal\n */\n hideModal() {\n window.bs.Modal.getInstance(this)?.hide();\n }\n}\n\nif (!window.customElements.get('vz-modal')) {\n window.customElements.define('vz-modal', VZModal);\n}\n","'use strict';\n\nimport * as debounce from 'lodash/debounce';\nimport { CONST, documentReady, isAemMobileView } from 'Util/util';\nimport 'Components/modals/VZModal';\n\nconst classes = {\n navigationActive: 'navigation-active',\n open: 'open',\n scrollLock: 'scroll-lock',\n sticky: 'sticky'\n};\n\nconst selectors = {\n body: 'body',\n flyout: '.flyout',\n header: 'header',\n navigation: '.js-navigation',\n navigationColumn: '.js-navigation-column',\n navigationItems: '.js-navigation-item',\n navigationTitles: '.js-navigation-column-title',\n navigationToggler: '.js-navigation-toggler',\n navigationWrapper: '.js-navigation-wrapper',\n notification: '.js-notification',\n notificationContent: '.js-notification .alert',\n subNavigation: '.js-sub-navigation',\n subNavigationWrapper: '.js-sub-navigation-wrapper',\n storefrontPage: '.pd-page',\n subNavigationBtnSmallBusiness: '.js-btn-small-business',\n subNavigationBtnLargeBusiness: '.js-btn-large-business'\n};\n\nconst body = document.querySelector(selectors.body);\nconst notification = document.querySelector(selectors.notification);\nlet header;\nlet navigation;\nlet navigationToggler;\nlet navigationWrapperMobile;\n\n/**\n * @private toggleStickyClass\n *\n * @description\n * Toggle the sticky class on the header on page scroll\n */\nfunction toggleStickyClass() {\n if (window.pageYOffset > 0) {\n body.classList.add(classes.sticky);\n } else {\n body.classList.remove(classes.sticky);\n }\n}\n\n/**\n * @private updateNotificationHeight\n *\n * @description\n * If there is a notification element:\n * - Adjust the padding on the body\n * - Set a height on the notification for css-transition purposes\n */\nfunction updateNotificationHeight() {\n notification.setAttribute('style', 'height: auto !important');\n body.style.paddingTop = 'auto';\n\n const notificationHeight = notification.offsetHeight;\n const headerHeight = header.offsetHeight;\n\n notification.style.height = `${notificationHeight}px`;\n body.style.paddingTop = `${headerHeight}px`;\n}\n\n/**\n * @function getFlyoutMinHeight\n * @description\n * Iterates over navigation items to get the largest flyout.\n * @return {string} flyout minimum height\n */\nfunction getFlyoutMinHeight() {\n if (!isAemMobileView) return 'auto';\n\n return `${[...navigation.querySelectorAll(selectors.flyout)].reduce((result, item) => {\n return result > item.clientHeight ? result : item.clientHeight;\n }, 0)}px`;\n}\n\n/**\n * @function setFlyoutHeight\n * @default\n * Sets the flyout minimum height on desktop to the largest flyout.\n * On mobile the minimum height is reset to auto.\n */\nfunction setFlyoutHeight() {\n if (isAemMobileView) return;\n\n const flyouts = [...navigation.querySelectorAll(selectors.flyout)];\n const flyoutMinHeight = getFlyoutMinHeight();\n flyouts.forEach((flyout) => {\n flyout.style.minHeight = flyoutMinHeight;\n });\n}\n\n/**\n * @private handleDesktopHoverClasses\n *\n * @description\n * Will toggle an active class on the navigation when hovering over navigation items for desktop\n */\nfunction handleDesktopHoverClasses() {\n if (!isAemMobileView) return;\n\n navigationWrapperMobile?.addEventListener(CONST.events.mouseover, () => {\n body.classList.add(classes.scrollLock);\n navigation.classList.add(classes.navigationActive);\n navigationToggler.classList.add(classes.navigationActive);\n });\n navigationWrapperMobile?.addEventListener(CONST.events.mouseleave, () => {\n body.classList.remove(classes.scrollLock);\n navigation.classList.remove(classes.navigationActive);\n navigationToggler.classList.remove(classes.navigationActive);\n });\n}\n\n/**\n * @private bindItemToggling\n * @param {HTMLElement} item - The navigation item that can be toggled\n *\n * @description\n * Will create toggling functionality on navigation items\n */\nfunction bindItemToggling(item) {\n item.addEventListener(CONST.events.click, (evt) => {\n const targetElement = evt.target.closest(selectors.navigationColumn);\n if (targetElement.classList.contains(classes.open)) {\n targetElement.classList.remove(classes.open);\n } else {\n targetElement.classList.add(classes.open);\n }\n });\n}\n\n/**\n * @private updateMobileMenuPosition\n *\n */\nfunction updateMobileMenuPosition() {\n if (isAemMobileView && navigationWrapperMobile) navigationWrapperMobile.style.top = `${header.offsetHeight}px`;\n}\n\n/**\n * @private toggleMobileMenu\n *\n * @description\n * Calculate top offset for navigation & handle scrollLock/active classes\n */\nfunction toggleMobileMenu() {\n updateMobileMenuPosition();\n\n if (navigation.classList.contains(classes.navigationActive)) {\n body.classList.remove(classes.scrollLock);\n navigation.classList.remove(classes.navigationActive);\n navigationToggler.classList.remove(classes.navigationActive);\n } else {\n body.classList.add(classes.scrollLock);\n navigation.classList.add(classes.navigationActive);\n navigationToggler.classList.add(classes.navigationActive);\n }\n}\n\nexport default documentReady(() => {\n header = document.querySelector(selectors.header);\n navigation = document.querySelector(selectors.navigation);\n const subNavigation = document.querySelector(selectors.subNavigation);\n const subNavigationBtnSmallBusiness = document.querySelector(selectors.subNavigationBtnSmallBusiness);\n const subNavigationBtnLargeBusiness = document.querySelector(selectors.subNavigationBtnLargeBusiness);\n\n if (!navigation) return;\n\n navigationToggler = navigation.querySelector(selectors.navigationToggler);\n navigationWrapperMobile = document.querySelector(selectors.navigationWrapper);\n\n // If there is a notification, adjust the padding on the body and set a height on the notification\n if (document.querySelector(selectors.notificationContent)) {\n updateNotificationHeight();\n\n window.addEventListener(\n 'resize',\n debounce(() => {\n updateNotificationHeight();\n updateMobileMenuPosition();\n setFlyoutHeight();\n }, 100)\n );\n }\n\n // Handle scrolling & sticky header\n toggleStickyClass();\n document.addEventListener('scroll', toggleStickyClass);\n\n // Handle classes for desktop\n handleDesktopHoverClasses();\n setFlyoutHeight();\n\n // Handle classes & offset for mobile navigation\n if (!navigationToggler) return;\n navigationToggler.addEventListener(CONST.events.click, toggleMobileMenu);\n\n // For mobile, add a click event to toggle collapse\n [...navigation.querySelectorAll(selectors.navigationTitles)].forEach(bindItemToggling);\n\n [subNavigationBtnSmallBusiness, subNavigationBtnLargeBusiness]\n .filter((item) => item)\n .forEach((subNavButton) => {\n subNavButton.addEventListener(CONST.events.click, (evt) => {\n const isEmptyBasket = subNavigation.dataset.basketIsEmpty;\n if (isEmptyBasket === 'false') {\n evt.preventDefault();\n const notEmptyBasketModal = document.getElementById('modal-basket-not-empty');\n const primaryBtnText = subNavButton.dataset.modalBtnText;\n notEmptyBasketModal.render({ primaryBtnText, primaryBtnUrl: evt.target.href });\n }\n });\n });\n});\n","'use strict';\n\nimport { getPosition, scrollTo } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @private scrollToHash\n */\nfunction scrollToHash() {\n const hash = window.location.hash;\n\n if (hash) {\n const element = document.querySelector(hash);\n\n if (!element) return;\n if (element.classList.contains('faq-item')) return; // FAQ has it's own scrolling\n\n const elementPosition = getPosition(element);\n\n // Scroll after a really short timeout for some edgecases where a browser's autoscroll is\n // firing after our custom `scrollTo` functionality. This might have something to do with the\n // callstack, so make sure our `scrollTo` is fired last.\n setTimeout(() => {\n scrollTo(elementPosition);\n }, 1);\n }\n}\n\nwindow.addEventListener('load', scrollToHash);\nwindow.addEventListener('hashchange', scrollToHash, false);\n","'use strict';\n\nimport { getCurrentBreakpoint } from 'Util/util';\n\n/**\n * @private detectBreakpointChange\n */\nfunction detectBreakpointChange() {\n const currentBreakpoint = getCurrentBreakpoint();\n\n if (JSON.stringify(window.currentBreakpoint) !== JSON.stringify(currentBreakpoint)) {\n const customEvent = new CustomEvent('breakpointChange', {\n detail: {\n breakpoint: currentBreakpoint\n }\n });\n document.dispatchEvent(customEvent);\n }\n\n window.currentBreakpoint = currentBreakpoint;\n}\n\nwindow.addEventListener('resize', detectBreakpointChange);\n","'use strict';\n\nimport { CONST, documentReady } from 'Util/util';\n\nconst selectors = {\n searchField: '.js-search-field',\n searchForm: '.js-search-form',\n searchTrigger: '.js-search-trigger'\n};\n\nexport default documentReady(() => {\n const searchField = document.querySelector(selectors.searchField);\n const searchForm = document.querySelector(selectors.searchForm);\n const trigger = document.querySelector(selectors.searchTrigger);\n\n if (!searchForm || !searchField) return;\n\n trigger.addEventListener(CONST.events.click, () => {\n if (searchForm.classList.contains(CONST.classes.active)) {\n searchForm.classList.remove(CONST.classes.active);\n } else {\n searchForm.classList.add(CONST.classes.active);\n searchField.focus();\n }\n });\n\n searchField.addEventListener(CONST.events.blur, () => {\n searchForm.classList.remove(CONST.classes.active);\n searchField.value = '';\n });\n});\n","'use strict';\n\nimport Drawer from 'bootstrap/js/src/offcanvas';\nimport VZSpinner from 'Components/VZSpinner';\nimport { appendCsrfToUrl, getParamFromURL, removeParamFromURL } from 'Util/urlUtils';\nimport { showErrorModal } from 'Root/modal';\nimport { appendParamToURL } from 'Root/util/urlUtils';\nimport { loadCSS } from 'Util/util';\n\nconst spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\n/**\n * @class VZOpenDrawer\n * @description Specifically used for the more information drawer\n * @example\n * \n * \n * \n */\nexport default class VZOpenDrawer extends HTMLElement {\n constructor() {\n super();\n\n this.endpoint = this.dataset.drawerUrl;\n this.onClick = this.onClick.bind(this);\n this.handleSuccessResponse = this.handleSuccessResponse.bind(this);\n }\n\n connectedCallback() {\n this.isMinicartButton = this.classList.contains('js-minicart-button');\n this.isEditMode = document.querySelector('.js-edit-mode');\n this.addEventListener('click', this.onClick);\n this.showMinicartDrawerOnLoad();\n }\n\n disconnectedCallback() {\n this.removeEventListener('click', this.onClick);\n }\n\n /**\n * @function showDrawer\n * @description creates a Boostrap offcanvas drawer and shows it\n * @param {HTMLElement} drawerElement the element from which to create a Boostrap Offcanvas element (A.K.A Drawer)\n */\n static showDrawer(drawerElement) {\n const bsDrawer = new Drawer(drawerElement);\n bsDrawer.show();\n }\n\n /**\n * @function showMinicartDrawerOnLoad\n * @description Reopens the minicart after a product is deleted from it and the page reloads.\n * @returns {void} Early exit if the button is not the minicart button.\n */\n showMinicartDrawerOnLoad() {\n if (!this.isMinicartButton) return;\n const showMinicart = getParamFromURL(window.location.href, 'showMinicart') === 'true';\n\n if (showMinicart) {\n this.dispatchEvent(new CustomEvent('click'));\n\n // To avoid opening the minicart again and again on page refresh, the param needs to removed\n const urlWithoutParam = removeParamFromURL(window.location.href, 'showMinicart');\n window.history.pushState(null, '', urlWithoutParam); // Update URL without refreshing the page\n }\n }\n\n /**\n * @function addDrawerToDOM\n * @description adds the drawer returned from the endpoint to the DOM\n * @param {JSON} data returned from calling Drawer-Show\n */\n static addDrawerToDOM(data) {\n const body = document.body;\n body.insertAdjacentHTML('beforeend', data.html);\n }\n\n /**\n * @function handleSuccessResponse\n * @description handles a successful call to Drawer-Show\n * @param {JSON} data returned from calling Drawer-Show\n */\n handleSuccessResponse(data) {\n this.constructor.addDrawerToDOM(data);\n loadCSS(this.getAttribute('loadcss'));\n const drawer = document.getElementById('drawer');\n const drawerElement = drawer.closest('.js-drawer-container');\n\n if (!drawerElement) return;\n this.constructor.showDrawer(drawerElement);\n if (this.isMinicartButton && !this.isEditMode) {\n document.dispatchEvent(new CustomEvent('minicart:open')); // This will open the abandonConfigurationModel triggered inside VZModal.js\n }\n if (this.isMinicartButton && !this.isEditMode) {\n document.dispatchEvent(new CustomEvent('minicart:open')); // This will open the abandonConfigurationModel triggered inside VZModal.js\n }\n }\n\n /**\n * @function onClick\n * @description Handles the click event on an open drawer button\n * @param {Event} event - The click event\n */\n async onClick(event) {\n event.preventDefault(); // This is needed so that checkboxes on the configurator are not checked when more information is clicked\n const endpointWithCsrf = appendCsrfToUrl(this.endpoint);\n const isConfiguratorPage = this.isMinicartButton ? this?.dataset.isConfiguratorPage : false;\n\n // Get and Add the pliId to the querystring to make it available in the minicart drawer only in edit mode.\n const productPliID = this.isMinicartButton && this.isEditMode ? getParamFromURL(window.location.href, 'pliId') : false;\n const editModeEndpoint = productPliID ? appendParamToURL(endpointWithCsrf, 'productPliID', productPliID) : false;\n const finalEndpoint = this.isMinicartButton ? appendParamToURL(editModeEndpoint || endpointWithCsrf, 'isConfiguratorPage', isConfiguratorPage) : endpointWithCsrf;\n\n spinner.start();\n try {\n const response = await fetch(finalEndpoint);\n\n if (!response.ok) {\n throw new Error(`There was an error fetching the endpoint - ${this.endpoint} - status: ${response.status}`);\n }\n\n const data = await response.json();\n this.handleSuccessResponse(data);\n } catch (error) {\n console.warn(error);\n const { title, body, cta } = JSON.parse(this.dataset?.generalError);\n showErrorModal(title, body, cta);\n } finally {\n spinner.stop();\n }\n }\n}\n\nif (!window.customElements.get('vz-open-drawer')) {\n window.customElements.define('vz-open-drawer', VZOpenDrawer);\n}\n","'use strict';\n\nimport initCollapsibleSpecs from 'Components/collapsibleSpecs';\n\n/**\n * @class VZDrawer\n */\nexport default class VZDrawer extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.scrollBarWidth = window.innerWidth - document.body.clientWidth;\n this.pageHeader = document.querySelector('.js-page-header');\n\n document.addEventListener('hidden.bs.offcanvas', this.removeDrawer.bind(this));\n document.addEventListener('show.bs.offcanvas', this.prepareDocumentBody.bind(this));\n document.addEventListener('hide.bs.offcanvas', this.constructor.preventDrawerClosing.bind(this));\n document.addEventListener('show.bs.modal', this.constructor.preventInfiniteLoop.bind(this));\n initCollapsibleSpecs();\n }\n\n disconnectedCallback() {\n document.removeEventListener('hidden.bs.offcanvas', this.removeDrawer);\n document.removeEventListener('show.bs.offcanvas', this.prepareDocumentBody);\n document.removeEventListener('hide.bs.offcanvas', this.constructor.preventDrawerClosing);\n document.removeEventListener('show.bs.modal', this.constructor.preventInfiniteLoop);\n }\n\n /**\n * @function preventInfiniteLoop\n * @description When a drawer is open, if a modal is opened thereafter, an infinite loop can be created. Removing the tabIndex\n * will prevent that. See https://stackoverflow.com/questions/55867609/bootstrap-modal-called-from-jquery-ui-dialog-maximum-call-stack-size-exceeded.\n * @param {Event} event - The show.bs.modal event.\n */\n static preventInfiniteLoop(event) {\n if (document.body.classList.contains('offcanvas-backdrop')) {\n event.target.removeAttribute('tabIndex');\n }\n }\n\n /**\n * @function preventDrawerClosing\n * @description When a drawer is open, and then a modal is opened, this function prevents the drawer from closing when\n * the modal is interacted with.\n * @param {Event} event - The hide.bs.offcanvas event.\n */\n static preventDrawerClosing(event) {\n if (document.body.classList.contains('modal-open')) {\n event.preventDefault();\n }\n }\n\n /**\n * @function removeDrawer\n * @description removes the drawer from the DOM\n */\n removeDrawer() {\n document.body.style.paddingRight = 0;\n this.pageHeader.style.paddingRight = 0;\n\n const parentElement = this.parentElement;\n parentElement.remove();\n }\n\n /**\n * @function prepareDocumentBody\n * @description Sets some styling on the body to match what the drawer will set from Bootstrap.\n * This is to make sure there is no \"jumpy\" effect for some properties that are missing initially. (boo Bootstrap)\n * We only need to do this once, as Bootstrap will set the proper styling after the drawer has already been opened once.\n * See BO-1532 for more context.\n */\n prepareDocumentBody() {\n if (!('drawerInitiated' in document.body.dataset)) {\n document.body.dataset.drawerInitiated = '';\n document.body.style.paddingRight = `${this.scrollBarWidth}px`;\n document.body.setAttribute('overflow', 'hidden');\n }\n\n this.pageHeader.style.paddingRight = `${this.scrollBarWidth}px`;\n }\n}\n\nif (!window.customElements.get('vz-drawer')) {\n window.customElements.define('vz-drawer', VZDrawer);\n}\n","import { isMobile } from 'Util/util';\n\n/**\n * Initializes collapsible specifications.\n *\n * @param {HTMLElement} [wrapper] - The wrapper element containing collapsible specs controls.\n * @private\n */\nexport default function initCollapsibleSpecs(wrapper) {\n const collapseControls = wrapper ? [...wrapper.querySelectorAll('.js-collapsible-specs-control')] : [...document.querySelectorAll('.js-collapsible-specs-control')];\n\n collapseControls.forEach((control) => {\n const toggleState = () => {\n // Toggle aria-expanded attribute\n const isExpanded = control.getAttribute('aria-expanded') === 'true';\n control.setAttribute('aria-expanded', (!isExpanded).toString());\n\n control.classList.toggle('collapsible-specs-control-closed');\n // If the class js-collapsible-specs-independent present each control toggles one item\n // In opposite on the cart page one controll toggles all the product items\n if (control.classList.contains('js-collapsible-specs-independent')) {\n control.closest('.js-collapsible-specs')?.classList.toggle('collapsible-specs-collapsed');\n } else {\n const specs = [...(control.closest('.card')?.querySelectorAll('.js-collapsible-specs') || [])];\n specs.forEach((item) => {\n item.classList.toggle('collapsible-specs-collapsed');\n });\n }\n };\n const tapArea = control.closest('.js-collapsible-specs')?.querySelector('.js-collapsible-specs-tap-area');\n if (tapArea) {\n tapArea.addEventListener('click', toggleState);\n } else {\n control.addEventListener('click', toggleState);\n }\n // Collapse open item on mobile if indicated by the class\n if (isMobile() && control.classList.contains('js-collapsible-specs-collapse-mobile') && control.getAttribute('aria-expanded') === 'true') {\n toggleState();\n }\n });\n}\n","'use strict';\n\nimport { CONST, documentReady, addEvent } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @constant {Object} selectors - Selectors used for the Prompt\n * @property {string} promptOpen - .js-btn-prompt-open\n * @property {string} promptCancel - .js-btn-prompt-cancel\n * @property {string} promptConfirm - .js-btn-prompt-confirm\n */\nconst selectors = {\n prompt: '.js-prompt',\n promptOpen: '.js-btn-prompt-open',\n promptCancel: '.js-btn-prompt-cancel',\n promptConfirm: '.js-btn-prompt-confirm',\n chatPromptOpen: '.dimelo_chat_show_when_offline',\n chatClosedPrompt: '#bscan-chat-closed'\n};\n\n/**\n * @private promptOpen\n * @param {event} event - The click event\n */\nfunction promptOpen(event) {\n const button = event.target;\n const target = button.getAttribute(CONST.attributes.target);\n const prompt = document.querySelector(target);\n\n if (prompt) {\n prompt.classList.add(CONST.classes.active);\n }\n}\n\n/**\n * @private promptClose\n * @param {event} event - The click event\n * @param {boolean} confirm - If the \"confirm\" button has been clicked\n */\nfunction promptClose(event, confirm) {\n if (!confirm) {\n event.preventDefault();\n }\n\n const button = event.target;\n const prompt = button.closest(selectors.prompt);\n\n if (prompt) {\n prompt.classList.remove(CONST.classes.active);\n button.blur(); // Remove the focus on the button, necessary for BScan keyboard navigation\n }\n}\n\ndocumentReady(() => {\n addEvent(document, CONST.events.click, selectors.promptOpen, promptOpen);\n addEvent(document, CONST.events.click, selectors.promptCancel, (event) => {\n promptClose(event, false);\n });\n addEvent(document, CONST.events.click, selectors.promptConfirm, (event) => {\n promptClose(event, true);\n });\n\n addEvent(document, CONST.events.click, selectors.chatPromptOpen, (event) => {\n const button = event.target;\n\n if (!button.getAttribute(CONST.attributes.target)) {\n button.setAttribute(CONST.attributes.target, selectors.chatClosedPrompt);\n }\n\n promptOpen(event);\n });\n});\n","'use strict';\n\n/**\n * @constant {Object} ADDRESS_MAPPING - Mapping company lookup response with form fields.\n */\nconst ADDRESS_MAPPING = {\n postalCode: 'dwfrm_checkoutDetails_company_postcode',\n houseNumber: 'dwfrm_checkoutDetails_company_housenumber',\n houseNumberAddition: 'dwfrm_checkoutDetails_company_addition',\n street: 'dwfrm_checkoutDetails_company_address1',\n city: 'dwfrm_checkoutDetails_company_city',\n country: 'dwfrm_checkoutDetails_company_country',\n foundationDate: 'dwfrm_checkoutDetails_company_creationDate',\n legalForm: 'dwfrm_checkoutDetails_company_legalform'\n};\n\n/**\n * @constant {Object} LEGAL_FORM - Mapping legal form field values with legal form types.\n */\nconst LEGAL_FORM = {\n BV: '1',\n NV: '2',\n VOF: '3',\n Eenmanszaak: '4',\n CV: '5',\n Maatschap: '6',\n Vereniging: '7',\n 'onderlinge waarborgmaatschappij': '8',\n Stichting: '9'\n};\n\n/**\n * @public startsWithNumber\n * @description tests an input against a regex to evaluate if it starts with a number\n * @param {string} value the value to test\n * @returns {boolean} whether it starts with a number or not\n */\nfunction startsWithNumber(value) {\n const regex = /^\\d/;\n return regex.test(value);\n}\n\n/**\n * @private getCompanyRelatedFields\n * @description converts a group of selectors into elements\n * @returns {Array} an array of elements\n */\nfunction getCompanyRelatedFields() {\n return [\n '.js-kvk-number',\n '.js-creation-date',\n '[name=\"dwfrm_checkoutDetails_company_legalform\"]',\n '[name=\"dwfrm_checkoutDetails_company_country\"]',\n '[name=\"dwfrm_checkoutDetails_company_companyName\"]',\n '[name=\"dwfrm_checkoutDetails_company_postcode\"]',\n '[name=\"dwfrm_checkoutDetails_company_housenumber\"]',\n '[name=\"dwfrm_checkoutDetails_company_addition\"]',\n '[name=\"dwfrm_checkoutDetails_company_address1\"]',\n '[name=\"dwfrm_checkoutDetails_company_city\"]'\n ]\n .map((selector) => {\n return document.querySelector(selector);\n })\n .filter((item) => item); // Filter out null values\n}\n\n/**\n * @public clearCompanyRelatedFields\n * @description clears all company related fields and sets correct classes\n */\nfunction clearCompanyRelatedFields() {\n getCompanyRelatedFields().forEach((element) => {\n // eslint-disable-next-line default-case\n switch (element.tagName) {\n case 'INPUT':\n element.value = '';\n element.classList.add('empty');\n break;\n case 'SELECT':\n element.selectedIndex = 0;\n\n if (element.classList.contains('js-kvk-companies') && element.options.length) {\n [...element.options].forEach((option) => {\n if (option.value !== '' && !option.hasAttribute('disabled')) option.remove();\n });\n }\n break;\n }\n });\n}\n\n/**\n * @public getCompanyDetailsUrl\n * @description returns a company's details URL given a list of companies and a KVK number\n * @param {array} companies an array of companies to search in\n * @param {string} kvkNumber a KVK number to search for in the list of companies passed in the first parameter'\n * @returns {string} the details URL for the given KVK number\n */\nfunction getCompanyDetailsUrl(companies, kvkNumber) {\n return companies.find((company) => company.kvkNumber === kvkNumber).detailsUrl;\n}\n\n/**\n * @function getKeyByValue\n * @private\n * @param {Array} map - The Array to search in\n * @param {string} value - The value used to find a key\n * @returns {string | null} - Returns the key when found or null when not found.\n */\nfunction getKeyByValue(map, value) {\n return Object.keys(map).find((key) => map[key] === value) || null;\n}\n\n/**\n * @function onCompanyChange\n * @private\n * @description when fn populateCompanyNameField in VZCompanySearch.js fires a change event, this function handles populating all related fields\n * @param {ChangeEvent} evt - Change event on company selector\n */\nfunction onCompanyChange(evt) {\n const checkedOption = evt.target.querySelector('option:checked');\n if (!checkedOption) return;\n const val = checkedOption.getAttribute('data-value');\n if (!val) return;\n\n try {\n const address = JSON.parse(decodeURI(val)).address;\n Object.keys(ADDRESS_MAPPING)\n .map((key) => document.getElementById(ADDRESS_MAPPING[key]))\n .filter((el) => el) // Filter out null values\n .forEach((element) => {\n const key = getKeyByValue(ADDRESS_MAPPING, element.id);\n const value = key === 'legalForm' ? LEGAL_FORM[address[key]] : address[key];\n const isNoValidOption = element.options && ![...element.options].find((option) => option.value === value);\n const allowManuallyEntry = [ADDRESS_MAPPING.legalForm, ADDRESS_MAPPING.foundationDate].includes(element.id);\n\n if (isNoValidOption && allowManuallyEntry) {\n [...element.options].forEach((option) => {\n if (option.value.length > 0) option.removeAttribute('disabled');\n });\n }\n\n if ((!value || isNoValidOption) && allowManuallyEntry) {\n element.setAttribute('read-only', 'false');\n return;\n }\n\n element.value = value;\n });\n } catch (e) {\n console.error(e);\n }\n}\n\nexport { startsWithNumber, clearCompanyRelatedFields, getCompanyDetailsUrl, onCompanyChange };\n","'use strict';\n\nimport { validateField } from 'app_vodafone_ziggo/util/validation';\n\nconst selectors = {\n chooserInviteWrapper: '.js-chooser-invite',\n chooserInviteCheckbox: '.js-chooser-invite-toggle',\n chooserInviteContent: '.js-chooser-invite-content'\n};\n\n/**\n * Toggles the visibility and disabled state of form fields based on the state of the invite toggle.\n * @param {HTMLElement} chooserInviteToggle - The invite toggle element.\n * @param {HTMLElement} chooserInviteContent - The invite content element.\n */\nfunction toggleContentAndFields(chooserInviteToggle, chooserInviteContent) {\n chooserInviteContent.classList.toggle('show', !chooserInviteToggle.checked);\n const formFields = chooserInviteContent.querySelectorAll('.form-control, .custom-select');\n formFields.forEach((field) => {\n field.disabled = chooserInviteToggle.checked;\n\n // Validate the prefilled phone prefix field when showing the form\n if (field.classList.contains('js-phone-prefix')) {\n validateField(field);\n }\n });\n}\n\n/**\n * Toggles the visibility of the chooser invite section based on the provided condition.\n * @param {boolean} condition - The condition to toggle the visibility.\n */\nfunction showChooserInviteSection(condition) {\n const chooserInviteSection = document.querySelector(selectors.chooserInviteWrapper);\n const chooserInviteCheckbox = document.querySelector(selectors.chooserInviteCheckbox);\n\n // Set the state of the checkbox to checked if the Chooser Invite section gets hidden and collapse the form\n if (!condition && chooserInviteCheckbox) {\n chooserInviteCheckbox.checked = true;\n }\n\n if (chooserInviteSection) {\n chooserInviteSection.classList.toggle('d-none', !condition);\n }\n}\n\n/**\n * Initializes the chooser invite by setting up the toggle functionality.\n */\nfunction initChooserInvite() {\n const chooserInviteToggle = document.querySelector(selectors.chooserInviteCheckbox);\n const chooserInviteContent = document.querySelector(selectors.chooserInviteContent);\n\n if (chooserInviteToggle) {\n toggleContentAndFields(chooserInviteToggle, chooserInviteContent);\n chooserInviteToggle.addEventListener('change', () => toggleContentAndFields(chooserInviteToggle, chooserInviteContent));\n }\n}\n\nexport { initChooserInvite, showChooserInviteSection };\n","'use strict';\n\nimport * as debounce from 'lodash/debounce';\nimport { removeChildNodes, removeAccentCharacters } from 'Util/util';\nimport VZSpinner from 'Components/VZSpinner';\nimport { startsWithNumber, clearCompanyRelatedFields, getCompanyDetailsUrl } from './helpers/companySearchHelpers';\nimport { appendParamToURL, appendCsrfToUrl } from 'Util/urlUtils';\nimport moment from 'moment-timezone';\nimport { showChooserInviteSection } from 'Components/chooserInvite';\n\nexport default class VZCompanySearch extends HTMLElement {\n constructor() {\n super();\n this.inputField = this.querySelector('.js-company-search');\n this.form = this.querySelector('.js-company-search-section');\n this.result = this.querySelector('.js-company-result');\n this.searchResults = this.querySelector('.js-company-search-results');\n this.kvkNumberField = this.querySelector('.js-kvk-number');\n this.companySelector = this.querySelector('.js-kvk-companies');\n this.chooserInviteElement = this.querySelector('.js-chooser-invite');\n this.companyInformationCards = ['companyInformation', 'paymentInformation', 'checkoutNavigation', 'installationInformation']\n .map((item) => document.getElementById(item))\n .filter((item) => item);\n\n this.minQueryLengthText = parseInt(this.inputField.dataset.minQueryLengthText, 10);\n this.minQueryLengthNumber = parseInt(this.inputField.dataset.minQueryLengthNumber, 10);\n this.tradenameEndpoint = this.inputField.dataset.tradenameUrl;\n this.kvkEndpoint = this.inputField.dataset.kvkUrl;\n this.hasExistingKvk = this.getAttribute('has-existing-kvk') === 'true';\n this.isLeadForm = this.getAttribute('is-lead-form') === 'true';\n this.spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\n this.onEdit = this.onEdit.bind(this);\n this.onKeyup = this.onKeyup.bind(this);\n this.onSearchResultClick = this.onSearchResultClick.bind(this);\n this.handleSearchResultClick = this.handleSearchResultClick.bind(this);\n this.populateKvkField = this.populateKvkField.bind(this);\n this.handleDocumentClick = this.handleDocumentClick.bind(this);\n this.fetchExistingKvk = this.fetchExistingKvk.bind(this);\n this.getEndpoint = this.getEndpoint.bind(this);\n this.onExistingKvkFetch = this.onExistingKvkFetch.bind(this);\n }\n\n /**\n * @function observedAttributes\n * @description observes the mentioned attribute and fires attributeChangedCallback when the value has changed\n * @returns {Attr} the companies attribute. This attribute's value is an encoded JSON string so should be decoded when using.\n */\n static get observedAttributes() {\n return ['companies'];\n }\n\n connectedCallback() {\n this.inputField.addEventListener('keyup', debounce(this.onKeyup, 500));\n this.inputField.addEventListener('keydown', VZCompanySearch.onKeydown.bind(this));\n this.searchResults.addEventListener('click', this.onSearchResultClick);\n document.addEventListener('click', this.handleDocumentClick);\n\n if (this.kvkNumberField && this.kvkNumberField.value.length > 0 && this.hasExistingKvk) {\n window.addEventListener('load', this.fetchExistingKvk);\n }\n\n if (this.querySelector('.js-company-edit')) this.querySelector('.js-company-edit').addEventListener('click', this.onEdit);\n }\n\n disconnectedCallback() {\n this.inputField.removeEventListener('keyup', this.onKeyup, 500);\n this.inputField.removeEventListener('keydown', VZCompanySearch.onKeydown);\n this.searchResults.removeEventListener('click', this.onSearchResultClick);\n document.removeEventListener('click', this.handleDocumentClick);\n if (this.querySelector('.js-company-edit')) this.querySelector('.js-company-edit').removeEventListener('click', this.onEdit);\n }\n\n /**\n * @function attributeChangedCallback\n * @description fired when an observed attribute changes\n * @param {string} name the name of the attribute\n * @param {any} oldValue the previous value of the attribute\n * @param {any} newValue the new value of the attribute\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'companies' && this.hasExistingKvk) {\n this.onExistingKvkFetch(newValue);\n }\n }\n\n /**\n * @function handleDocumentClick\n * @private\n * @description handles closing the result list if a user clicks somewhere outside it and reopens if input is clicked again\n * @param {Event} evt the click event\n */\n handleDocumentClick(evt) {\n const { target } = evt;\n const resultsOpen = this.searchResults.classList.contains('open');\n const resultsContainer = this.searchResults.querySelector('.js-company-search-results-container');\n const hasInput = this.inputField.value.length > 0;\n\n if (!hasInput || !resultsContainer || !resultsOpen) {\n return;\n }\n if (!target.classList.contains('.js-company-search-results')) {\n resultsContainer.classList.add('d-none');\n }\n if (target.classList.contains('js-company-search')) {\n resultsContainer.classList.remove('d-none');\n }\n }\n\n /**\n * @function handleSearchResultClick\n * @private\n * @description updates the HTML when a search result is clicked\n */\n handleSearchResultClick() {\n removeChildNodes(this.searchResults);\n this.inputField.value = '';\n this.inputField.dispatchEvent(new CustomEvent('input'));\n }\n\n /**\n * @function populateKvkField\n * @private\n * @param {string} value the kvk number\n */\n populateKvkField(value) {\n this.kvkNumberField.value = value;\n ['input', 'blur'].forEach((event) => this.kvkNumberField.dispatchEvent(new CustomEvent(event)));\n }\n\n /**\n * @function clearResults\n * @private\n * @description resets the company selector dropdown\n */\n clearResults() {\n this.companySelector.options.length = 1;\n this.companySelector.options[0].removeAttribute('selected');\n }\n\n /**\n * @function populateCompanyNameField\n * @private\n * @description populates the company name field and triggers change which populates other related fields. See fn OnCompanyChange in checkout.js\n * @param {Object} data the data returned from the details endpoint\n */\n populateCompanyNameField(data) {\n const {\n companyData,\n companyData: { companyName },\n isExistingCompany\n } = data;\n const address = { ...companyData };\n const companies = [{ address, companyName }];\n\n // When the customer is unkown, enable the chooser information\n showChooserInviteSection(!isExistingCompany);\n\n this.companySelector.innerHTML = companies.reduce((result, company, index) => {\n if (!company.address?.country) company.address.country = 'NL';\n const stringifiedCompany = JSON.stringify(company).replace(/'/g, '''); // JSON.stringify does not escape single quotes so it needs to be done manually.\n\n return `${result}\n \n ${company.companyName}\n \n `;\n }, this.companySelector.innerHTML);\n\n const postcode = companies[0]?.address?.postalCode;\n const postcodeFormatted = postcode ? postcode.replace(/(^\\d{4})([A-Za-z]{2})/, '$1 $2') : '';\n this.querySelector('.js-company-name').innerText = companies[0].companyName;\n this.querySelector('.js-company-address').innerText =\n `${companies[0].address.kvkNumber} - ${companies[0].address.street} ${companies[0].address.houseNumber}${companies[0].address.houseNumberAddition}, ${postcodeFormatted} ${companies[0].address.city}`;\n this.companyInformationCards.forEach((card) => card.setAttribute('visible', 'true'));\n\n ['change', 'blur'].forEach((event) => this.companySelector.dispatchEvent(new CustomEvent(event)));\n this.companySelector.classList.add('valid');\n const nowTime = moment().tz('Europe/Amsterdam').format('HH:mm');\n const currentTimeInput = document.querySelector('input[name=currentTime]');\n if (currentTimeInput) currentTimeInput.value = nowTime;\n }\n\n /**\n * @function fetchCompanyDetails\n * @private\n * @description fetches the selected company details on click of a search result\n * @param {string} url the endpoint url\n */\n fetchCompanyDetails(url) {\n this.spinner.start();\n\n fetch(url)\n .then((res) => res.json())\n .then((res) => {\n this.clearResults();\n this.populateCompanyNameField(res);\n this.form.classList.add('d-none');\n this.result.classList.remove('d-none');\n\n // This event is used to enable or disable the checkout button in checkout.js when a company is changed. See BO-1648 for more info.\n this.result.dispatchEvent(new CustomEvent('shown:companySearchResult'));\n })\n .finally(this.spinner.stop);\n }\n\n /**\n * @function fetchCompanyList\n * @private\n * @description fetches the list of companies on entry in the search field\n * @param {string} url the endpoint url\n */\n fetchCompanyList(url) {\n this.spinner.start();\n\n fetch(url)\n .then((res) => res.json())\n .then((res) => {\n if (!res.success) throw res.serverErrors;\n this.searchResults.innerHTML = res.html || this.constructor.generateResponseHTML(res);\n this.searchResults.classList.add('open');\n this.setAttribute('companies', encodeURI(JSON.stringify(res.companies)));\n })\n .catch((res) => {\n const [title, body] = res;\n removeChildNodes(this.searchResults);\n this.searchResults.innerHTML = `\n
\n
    \n
  • \n
    ${title}
    \n

    ${body}

    \n
  • \n
\n
\n `;\n })\n .finally(this.spinner.stop);\n }\n\n /**\n * @function generateResponseHTML\n *\n * @param {JSON} response - Response from the CompanyInfo-Profile call\n * @return {HTMLElement} search result shown as HTML\n *\n * @description\n * Sync this file with cartridges/app_business_scan/cartridge/templates/default/businessScan/components/searchCompanyResults.isml\n */\n static generateResponseHTML(response) {\n const {\n companyData: { resources, companyName }\n } = response;\n return `\n
\n
\n ${resources.header}\n
\n\n
    \n
  • \n
    \n ${companyName}\n
    \n

    \n ${resources.kvk.split(' ').slice(0, 2).join(' ')}\n ${resources.kvk.split(' ').slice(2).join(' ')}\n

    \n ${companyName}\n
  • \n
\n
\n `;\n }\n\n /**\n * @function onSearchResultClick\n * @private\n * @description handles clicking on a search result by setting calling the details URL for the selected result\n * @param {event} evt a click event on a search result\n */\n onSearchResultClick(evt) {\n const { target } = evt;\n this.searchResultsContainer = this.searchResults.querySelector('.js-company-search-results-container');\n\n if (target.classList.contains('js-company-search-result-item')) {\n if (this.isLeadForm) {\n // For Lead Form replace search query with selected company name\n const selectedNameField = target.querySelector('.js-business-name');\n if (selectedNameField) {\n this.inputField.value = selectedNameField.textContent;\n } else {\n // Clear results on click on 'No results' option\n removeChildNodes(this.searchResults);\n }\n } else {\n const selectedKvkField = target.querySelector('.js-search-result-kvk');\n if (selectedKvkField) {\n // Extract the number from the string to populate kvk field\n const [kvkNumber] = selectedKvkField.textContent.match(/\\d+/);\n\n // Parse companies to find matching company KVK and create URL\n let companyDetailsUrl = getCompanyDetailsUrl(JSON.parse(decodeURI(this.getAttribute('companies'))), kvkNumber);\n companyDetailsUrl = appendParamToURL(companyDetailsUrl, 'investigate', true);\n const selectedCompanyDetailsUrl = appendCsrfToUrl(companyDetailsUrl);\n this.handleSearchResultClick();\n this.populateKvkField(kvkNumber);\n\n // Fetch details endpoint and populate company name field\n this.fetchCompanyDetails(selectedCompanyDetailsUrl);\n }\n }\n }\n }\n\n /**\n * @function getEndpoint\n * @param {string} value - The value entered by a customer to search for.\n *\n * @return {string} The endpoint to call\n * @description\n * When a customer enters a trade name, the Company-Search controller should be called.\n * When a customer entered a KVK number, the Company-Profile endpoint should be called.\n */\n getEndpoint(value) {\n // Number constructor trims “0” from the beginning of a value.\n // so Number(\"0123456\") becomes 123456 which leads to an incorrect KVK number\n return /^\\d{8}$/.test(value) ? `${this.kvkEndpoint}?id=${value}&investigate=true` : `${this.tradenameEndpoint}?q=${value}`;\n }\n\n /**\n * @function fetchExistingKvk\n * @private\n * @description When a user lands on the page with an existing KVK this function triggers the search to populate companies\n */\n fetchExistingKvk() {\n const existingKvkNumber = this.kvkNumberField.value;\n const url = appendCsrfToUrl(this.getEndpoint(existingKvkNumber));\n this.fetchCompanyList(url);\n }\n\n /**\n * @function onExistingKvkFetch\n * @private\n * @description Called when companies attribute changes, this function fetches company details for an existing KVK number\n * @param {string} companies an encoded string of an array of companies - coming from attributeChangedCallback\n */\n onExistingKvkFetch(companies) {\n const existingKvkNumber = this.kvkNumberField.value;\n if (!companies || !existingKvkNumber) return;\n let companyDetailsUrl = getCompanyDetailsUrl(JSON.parse(decodeURI(companies)), existingKvkNumber);\n companyDetailsUrl = appendParamToURL(companyDetailsUrl, 'investigate', true);\n const selectedCompanyDetailsUrl = appendCsrfToUrl(companyDetailsUrl);\n this.fetchCompanyDetails(selectedCompanyDetailsUrl);\n }\n\n /**\n * @function onKeyup\n * @private\n * @description handles entry in the search field. Calls company search endpoint and clears related fields.\n * @param {event} evt a keyup event on the search field\n */\n onKeyup(evt) {\n const {\n target: { value: searchQuery }\n } = evt;\n const minSearchQueryLength = startsWithNumber(searchQuery) ? this.minQueryLengthNumber : this.minQueryLengthText;\n const meetsMinLengthRequirement = searchQuery.length >= minSearchQueryLength;\n clearCompanyRelatedFields();\n\n if (meetsMinLengthRequirement) {\n const url = appendCsrfToUrl(this.getEndpoint(removeAccentCharacters(searchQuery)));\n this.fetchCompanyList(url);\n } else if (this.isLeadForm) {\n // Clear results if the query removed\n removeChildNodes(this.searchResults);\n }\n }\n\n /**\n * @function onKeydown\n * @description Prevents the checkout form being submitted if enter is pressed from within the KVK field.\n * @param {Event} event - The keydown event on the company search field.\n */\n static onKeydown(event) {\n if (event.key === 'Enter' || event.keyCode === 13) {\n event.preventDefault();\n }\n }\n\n onEdit() {\n this.form.classList.remove('d-none');\n this.result.classList.add('d-none');\n this.inputField.value = '';\n this.clearResults();\n showChooserInviteSection(false);\n }\n}\n\nif (!window.customElements.get('vz-company-search')) {\n window.customElements.define('vz-company-search', VZCompanySearch);\n}\n","import { CONST } from 'Util/util';\nimport { validateForm, validateField } from 'app_vodafone_ziggo/util/validation';\nimport Modal from 'bootstrap/js/src/modal';\nimport VZSpinner from 'Components/VZSpinner';\nimport { appendCsrfToUrl } from 'app_vodafone_ziggo/util/urlUtils';\n\nwindow.bs = window.bs || {};\nwindow.bs.Modal = Modal;\n\nconst spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\nconst selectors = {\n errorModal: 'error-modal',\n activeModal: '.modal.show',\n modalStepContainer: '.js-modal-step-container',\n modalStep: '.js-modal-step',\n modalStepInputs: '.form-control, .custom-control'\n};\n\n/**\n * @function showErrorModal\n * @param {string|null} title - The title of the modal\n * @param {string|null} body - The error message within the modal\n * @param {string|null} cta - The cta text within the modal\n */\nfunction showErrorModal(title, body, cta) {\n const errorModalHtml = `\n
\n
\n
\n
\n

${title}

\n \n
\n\n
\n
\n
${body}
\n
\n
\n\n \n
\n \n
\n
\n
\n
`;\n\n const existingModal = document.getElementById(selectors.errorModal);\n\n if (existingModal) {\n window.bs.Modal.getInstance(existingModal).show();\n } else {\n document.body.insertAdjacentHTML('beforeend', errorModalHtml);\n const modal = new window.bs.Modal(document.getElementById(selectors.errorModal));\n modal.show();\n window.addEventListener(CONST.events.popstate, () => {\n modal.hide();\n });\n }\n}\n\n/**\n * @public resetModalState\n * @param {HTMLElement} modal - A DOM modal element\n *\n * In case of a modal that has multiple steps\n * Loop over the steps to remove the active class\n * and add the active class to the first step\n */\nfunction resetModalState(modal) {\n [...modal.querySelectorAll(selectors.modalStep)].forEach((step, index) => {\n if (index === 0) {\n step.classList.add(CONST.classes.active);\n } else {\n step.classList.remove(CONST.classes.active);\n }\n });\n}\n\n/**\n * @public createModalByUrl\n * @param {string} targetId - The id of the target modal\n * @param {string} targetEndpoint - The url to call which should return the modal html\n * @returns {Promise} - Promise\n *\n * @description\n * Will create/show a modal based on a URL to a pipeline.\n * That pipeline should return a template with the modal HTML for more creative freedom\n */\nfunction createModalByUrl(targetId, targetEndpoint) {\n const modalId = `modal-${targetId}`;\n const existingModal = document.getElementById(modalId);\n\n if (existingModal) {\n return new Promise((resolve) => {\n resetModalState(existingModal);\n window.bs.Modal.getInstance(existingModal).show();\n resolve(existingModal);\n });\n }\n\n spinner.start();\n return fetch(targetEndpoint)\n .then((res) => {\n if (res.status === 500) throw new Error('Fetch failed');\n return res.text();\n })\n .then((response) => {\n document.body.insertAdjacentHTML('beforeend', response);\n\n const modalElement = document.getElementById(modalId);\n const modal = new window.bs.Modal(modalElement);\n\n new ModalClass(modal); // eslint-disable-line\n modal.show();\n document.dispatchEvent(new CustomEvent('custom_modal:shown'));\n return modalElement;\n })\n .catch((response) => {\n console.error('error', response);\n return response;\n })\n .finally(spinner.stop);\n}\n\n/**\n * @class ModalClass\n */\nclass ModalClass {\n constructor(modalInstance) {\n this.modal = modalInstance._element; // eslint-disable-line no-underscore-dangle\n this.modalActiveStep = this.modal.querySelector(`${selectors.modalStep}.${CONST.classes.active}`);\n this.modalFields = [...this.modal.querySelectorAll(selectors.modalStepInputs)];\n\n this.validateModalField = this.validateModalField.bind(this);\n this.submitStepForm = this.submitStepForm.bind(this);\n this.appendModalStep = this.appendModalStep.bind(this);\n\n this.modalFields.forEach((field) => {\n field.addEventListener(CONST.events.blur, (event) => {\n this.lastFocussedField = event.target;\n });\n\n field.addEventListener(CONST.events.keyUp, this.validateModalField);\n field.addEventListener(CONST.events.change, this.validateModalField);\n });\n\n this.modalActiveStep.addEventListener(CONST.events.submit, this.submitStepForm);\n\n const customEvent = new CustomEvent('modalLoaded', {\n detail: {\n modal: this.modal\n }\n });\n document.dispatchEvent(customEvent);\n }\n\n /**\n * @method validateModalField\n * @param {event} event - The submit event\n */\n validateModalField(event) {\n // If we're using tab, make sure to validate the previous field instead of the new field\n if (this.lastFocussedField && event.key && event.key.toLowerCase() === 'tab') {\n validateField(this.lastFocussedField);\n this.lastFocussedField = event.target;\n } else {\n const currField = event.target;\n this.lastFocussedField = currField;\n validateField(currField);\n }\n }\n\n /**\n * @method submitStepForm\n * @param {event} event - The submit event\n */\n submitStepForm(event) {\n event.preventDefault();\n const form = event.target;\n\n const validForm = validateForm(form);\n if (!validForm) {\n return;\n }\n\n const endpoint = form.getAttribute('action');\n const formData = new FormData(form);\n const csrfName = form && form.getAttribute(CONST.attributes.csrfName);\n const csrfToken = form && form.getAttribute(CONST.attributes.csrfToken);\n formData.append(csrfName, csrfToken);\n\n /* eslint-disable no-underscore-dangle */\n if (window._dd && window._dd.user && window._dd.user.ids && window._dd.user.ids.ga_id) {\n formData.append('gaId', window._dd.user.ids.ga_id);\n }\n /* eslint-enable no-underscore-dangle */\n\n spinner.start();\n\n fetch(endpoint, {\n method: 'POST',\n body: formData\n })\n .then((res) => res.text())\n .then(this.appendModalStep)\n .catch((error) => {\n console.error('submitStepForm error', error);\n })\n .finally(spinner.stop);\n }\n\n /**\n * @method scrollToTop\n */\n static scrollToTop() {\n const activeModal = document.querySelector(selectors.activeModal);\n const supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n if (supportsNativeSmoothScroll) {\n activeModal.scrollTo({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n } else {\n activeModal.scrollTop = 0;\n }\n }\n\n /**\n * @method appendModalStep\n * @param {string} response - The response containing the next step\n */\n appendModalStep(response) {\n const modalStepContainer = document.querySelector(`${selectors.activeModal} ${selectors.modalStepContainer}`);\n const currentStep = modalStepContainer.querySelector(`${selectors.modalStep}.${CONST.classes.active}`);\n\n currentStep.classList.remove(CONST.classes.active);\n modalStepContainer.insertAdjacentHTML('beforeend', response);\n\n const newStep = modalStepContainer.querySelector(`${selectors.modalStep}:last-child`);\n newStep.classList.add(CONST.classes.active);\n\n this.constructor.scrollToTop();\n\n const customEvent = new CustomEvent('modalStep', {\n detail: {\n currentStep: currentStep,\n newStep: newStep\n }\n });\n document.dispatchEvent(customEvent);\n }\n}\n\n/**\n * @function refreshToken\n * @description Calls an endpoint to execute authorization when the Business Scan contact me modals are opened - BO-1488.\n */\nfunction refreshToken() {\n const container = document.querySelector('[data-refresh-token-url]');\n const { refreshTokenUrl } = container.dataset;\n if (!refreshTokenUrl) return;\n\n const endpoint = appendCsrfToUrl(refreshTokenUrl);\n\n fetch(endpoint);\n}\n\nexport { showErrorModal, createModalByUrl, refreshToken };\n","if ('serviceWorker' in navigator) {\n window.addEventListener('load', () => {\n if (document.documentElement.dataset.serviceWorkerEnabled === 'true') {\n navigator.serviceWorker.register('/sw.js', { scope: '.' }).catch((e) => {\n console.error('Serviceworker - Registration failed with error '.concat(e));\n });\n } else {\n navigator.serviceWorker.getRegistrations().then((serviceWorkers) => {\n serviceWorkers.forEach((workerInstance) => {\n workerInstance.unregister();\n });\n });\n }\n });\n}\n","'use strict';\n\nconst computedStyles = getComputedStyle(document.documentElement);\n\n/**\n * @constant {Object} events - All common events\n * @property {string} blur - Blur event\n * @property {string} change - Change event\n * @property {string} click - Click event\n * @property {string} keyUp - Keyup event\n * @property {string} load - Load event\n * @property {string} mousedown - Mouse down event\n * @property {string} mouseleave - Mouse leave event\n * @property {string} mouseover - Mouse over event\n * @property {string} popstate - Popstate event\n * @property {string} resize - Resize event\n * @property {string} scroll - Scroll event\n * @property {string} submit - Submit event\n * @property {string} update - Custom update event\n */\nconst events = {\n blur: 'blur',\n change: 'change',\n click: 'click',\n input: 'input',\n keyUp: 'keyup',\n load: 'load',\n mousedown: 'mousedown',\n mouseleave: 'mouseleave',\n mouseover: 'mouseover',\n paste: 'paste',\n popstate: 'popstate',\n resize: 'resize',\n responseError: 'responseError',\n scroll: 'scroll',\n submit: 'submit',\n transitionEnd: 'transitionend',\n update: 'update',\n invalid: 'invalid'\n};\n\n/**\n * @constant {Object} selectors - Common selectors\n * @property {string} body - body\n * @property {Object} form - form related selectors\n * @property {string} checkbox - checkbox\n * @property {string} form - form\n * @property {string} input - input\n * @property {string} inputFieldClear - .js-input-clear\n * @property {string} inputFieldFeedback - .js-invalid-feedback\n * @property {string} label - label\n * @property {string} radio - radio\n * @property {string} select - select\n * @property {string} submit - [type=\"submit\"]\n * @property {string} textarea - textarea\n * @property {string} html - html\n * @property {string} htmlBody - html, body\n * @property {string} img - img\n * @property {string} input - input\n */\nconst selectors = {\n body: 'body',\n form: {\n checkbox: 'input[type=\"checkbox\"]',\n file: 'input[type=\"file\"]',\n form: 'form',\n input: 'input',\n inputFieldClear: '.js-input-clear',\n inputFieldFeedback: '.js-invalid-feedback',\n label: 'label',\n radio: 'input[type=\"radio\"]',\n select: 'select',\n submit: '[type=\"submit\"]',\n textarea: 'textarea'\n },\n html: 'html',\n htmlBody: 'html, body',\n img: 'img',\n input: 'input',\n interactiveElements: 'input, button, select, textarea, a[href]'\n};\n\n/**\n * @constant {Object} classes - Common classes\n * @property {string} active - active\n * @property {Object} buttons - buttons\n * @property {string} next - next\n * @property {string} previous - previous\n * @property {string} warning - warning\n * @property {string} dBlock - d-block\n * @property {string} dFlex - d-flex\n * @property {string} dInlineBlock - d-inline-block\n * @property {string} dNone - d-none\n * @property {string} disabled - disabled\n * @property {string} empty - empty\n * @property {string} inactive - inactive\n * @property {string} invalid - invalid\n * @property {string} hidden - hidden\n * @property {string} last - last\n * @property {string} show - show\n * @property {string} valid - valid\n */\nconst classes = {\n active: 'active',\n buttons: {\n next: 'js-button-next',\n previous: 'js-button-previous',\n warning: 'js-button-warning'\n },\n dBlock: 'd-block',\n dFlex: 'd-flex',\n dInlineBlock: 'd-inline-block',\n dNone: 'd-none',\n disabled: 'disabled',\n empty: 'empty',\n inactive: 'inactive',\n invalid: 'invalid',\n hidden: 'hidden',\n last: 'last',\n show: 'show',\n valid: 'valid'\n};\n\n/**\n * @constant {Object} attributes - Common attributes\n * @property {string} action - action\n * @property {string} class - class\n * @property {string} csrfToken - data-csrf-token\n * @property {string} csrfName - data-csrf-name\n * @property {string} disabled - disabled\n * @property {string} exclude - data-exclude\n * @property {string} href - href\n * @property {string} id - id\n * @property {string} pattern - pattern\n * @property {string} url - url\n * @property {string} readonly - readonly\n * @property {string} target - data-bs-target\n * @property {string} value - value\n * @property {Object} validation - Validation related attributes\n * @property {string} patternMismatch - data-pattern-mismatch\n * @property {string} valueMissing - data-missing-error\n */\nconst attributes = {\n action: 'action',\n class: 'class',\n checked: 'checked',\n csrfToken: 'data-csrf-token',\n csrfName: 'data-csrf-name',\n disabled: 'disabled',\n exclude: 'data-exclude',\n href: 'href',\n id: 'id',\n pattern: 'pattern',\n placeholder: 'placeholder',\n required: 'required',\n readonly: 'readonly',\n selected: 'selected',\n target: 'data-bs-target',\n url: 'url',\n value: 'value',\n validation: {\n patternMismatch: 'data-pattern-mismatch',\n valueMissing: 'data-missing-error',\n tooShort: 'data-too-short'\n }\n};\n\n/**\n * @constant {Object} breakpoints - Common reusable breakpoints\n * @property {string} xxs - 0\n * @property {string} xs - 368\n * @property {string} sm - 576\n * @property {string} md - 768\n * @property {string} lg - 992\n * @property {string} xl - 1200\n * @property {string} xxl - 1400\n */\n\nconst breakpoints = {\n xxs: parseInt(computedStyles.getPropertyValue('--breakpoint-xxs'), 10),\n xs: parseInt(computedStyles.getPropertyValue('--breakpoint-xs'), 10),\n sm: parseInt(computedStyles.getPropertyValue('--breakpoint-sm'), 10),\n md: parseInt(computedStyles.getPropertyValue('--breakpoint-md'), 10),\n lg: parseInt(computedStyles.getPropertyValue('--breakpoint-lg'), 10),\n xl: parseInt(computedStyles.getPropertyValue('--breakpoint-xl'), 10),\n xxl: parseInt(computedStyles.getPropertyValue('--breakpoint-xxl'), 10)\n};\n\n/**\n * @constant {Object} localStorage - constants for local storage items\n * @property {string} preferredLayoutId - preferredLayoutId\n */\nconst localStorage = {\n preferredLayoutId: 'preferredLayoutId'\n};\n\n/**\n * @constant {Object} bscanSteps - constants for Business Scan Steps\n * @property {string} ADVICE - The advice Step\n * @property {string} INTRO - The intro Step\n * @property {string} GROUPED_QUESTIONS - The grouped questions Step\n * @property {string} THANKYOU - The thank you Step\n */\nconst bscanSteps = {\n INTRO: 'intro',\n STATEMENTS_DONE: 'bs-statements-done',\n GROUPED_QUESTIONS: 'js-bscan-question-group',\n ADVICE: 'bs-advice',\n THANKYOU: 'bs-thank-you'\n};\n\n/**\n * @constant {Object} vzLayoutToggle - Attributes used for VZLayoutToggle\n * @property {string} class - data-layout-class\n * @property {string} container - data-layout-container\n * @property {string} enabledBreakpoint - data-layout-enabled-breakpoint\n * @property {string} id - data-layout-id\n * @property {string} idDefault - data-layout-id-default\n * @property {string} localStorageKey - data-layout-key\n */\nconst vzLayoutToggle = {\n class: 'data-layout-class',\n container: 'data-layout-container',\n enabledBreakpoint: 'data-layout-enabled-breakpoint',\n id: 'data-layout-id',\n idDefault: 'data-layout-id-default',\n localStorageKey: 'data-layout-key'\n};\n\nexport default {\n bscanSteps,\n attributes,\n breakpoints,\n classes,\n events,\n selectors,\n localStorage,\n vzLayoutToggle\n};\n","'use stict';\n\nimport 'core-js/features/array/at';\n\n/**\n * @private splitUpUrl\n * @param {string} url - The url to split up\n * @returns {Object} values\n *\n * @description\n * Will return an object with different parts of the url\n */\nexport function splitUpUrl(url) {\n if (!url.includes('?')) return {};\n\n let hash;\n let paramUrl = url.split('?').at(1);\n\n // if there is a hash at the end, store the hash\n if (paramUrl.includes('#')) {\n hash = paramUrl.split('#').at(1);\n paramUrl = paramUrl.split('#').at(0);\n }\n\n return {\n domain: url.split('?').at(0),\n params: paramUrl.split('&'),\n hash: hash\n };\n}\n\n/**\n * @public removeParamFromURL\n * @param {string} url - The url from which the parameter will be removed\n * @param {string} name - The name of the parameter that will be removed from url\n * @returns {string} url\n *\n * @description\n * remove the parameter and its value from the given url and returns the\n * changed url\n */\nexport function removeParamFromURL(url, name) {\n if (!url.includes('?') || !url.includes(`${name}=`)) return url;\n\n const urlValues = splitUpUrl(url);\n const newParams = urlValues.params.filter((param) => param.split('=').at(0) !== name);\n\n return `${urlValues.domain}?${newParams.join('&')}${urlValues.hash ? `#${urlValues.hash}` : ''}`;\n}\n\n/**\n * @public getParamFromURL\n * @param {string} url - The url from which the parameter will be retrieved\n * @param {string} name - The name of the parameter that will be retrieved from url\n * @returns {string} The value of the parameter\n *\n * @description\n * remove the parameter and its value from the given url and returns the\n * changed url\n */\nexport function getParamFromURL(url, name) {\n if (!url.includes('?') || !url.includes(`${name}=`)) return url;\n\n const urlValues = splitUpUrl(url);\n const nameMatch = urlValues.params.find((item) => item.includes(`${name}=`));\n\n return nameMatch && nameMatch.split('=').at(1);\n}\n\n/**\n * @public appendParamToURL\n * @param {string} url - The url to which the parameter will be added\n * @param {string} name - The name of the parameter\n * @param {string} value the value of the parameter\n * @returns {string} url\n *\n * @description\n * appends the parameter with the given name and value to the given url\n * and returns the changed url\n */\nexport function appendParamToURL(url, name, value) {\n let newURL = url;\n // remove if the param already exists\n if (url.includes(`${name}=`)) {\n newURL = removeParamFromURL(url, name);\n }\n const separator = newURL.includes('?') ? '&' : '?';\n return `${newURL}${separator}${name}=${encodeURIComponent(value)}`;\n}\n\n/**\n * @public appendCsrfToUrl\n * @description Takes a URL and adds a CSRF token to it\n * @param {string} url - The URL to append the CSRF token on\n * @returns {string} The URL with the CSRF token appended\n */\nexport function appendCsrfToUrl(url) {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${window.csrf.tokenName}=${window.csrf.token}`;\n}\n\n/**\n * @public removeHash\n * @description Will remove the hash from the url\n */\nexport function removeHash() {\n window.history.replaceState({}, document.title, window.location.pathname + window.location.search);\n}\n\nexport const getUrlFromAttributes = (url, component, excludedAttributes) => {\n const newUrl = new URL(url);\n const urlParams = newUrl.searchParams;\n\n // Get all attributeNames except for the irrelevant ones.\n const attributeNames = component.getAttributeNames().filter((attributeName) => !excludedAttributes.includes(attributeName));\n\n // Filter the attributeNames which will be replaced by the new URL.\n attributeNames\n .filter((param) => !urlParams.has(param.replaceAll('-', '')))\n .forEach((attr) => {\n const attrValue = component.getAttribute(attr);\n if (attrValue) {\n const attrName = attr.replaceAll('-', '');\n // Append all other attributes to the new URL\n urlParams.append(attrName, attrValue);\n }\n });\n\n return `${newUrl.origin}${newUrl.pathname}?${urlParams}`;\n};\n\n/**\n * This function checks if the provided element is a part of BM Hardware card. In case of true it appends\n * the 'editIndex' parameter to the URL with the index of the current BM Hardware card, in order to keep the\n * card open after Product-Variation ajax.\n *\n * @public appendBmHardwareCardIndex\n * @param {HTMLElement} element - The HTML element triggering the ajax.\n * @param {string} url - The URL to which the parameter will be appended.\n * @returns {string} The modified URL with the appended parameter.\n */\nexport function appendBmHardwareCardIndex(element, url) {\n let newURL = url;\n if (!element.closest('.js-hardware-device-card')?.classList.contains('is-collapsed') && element.closest('.js-hardware-phones')) {\n newURL = appendParamToURL(url, 'editIndex', element.closest('.js-hardware-phones').dataset.index);\n }\n return newURL;\n}\n","'use strict';\n\nimport CONST from './constants';\n\n/**\n * addEvent - Will add an event listener to an element inside a parent\n *\n * @param {string} parent - The parent element\n * @param {string} passedEvent - The event\n * @param {string} selector - The targeted element\n * @param {function} handler - The handler\n */\nfunction addEvent(parent, passedEvent, selector, handler) {\n parent.addEventListener(\n passedEvent,\n function fnAddEvent(event) {\n // If the clicked element matches the selector, or is a child of the selector\n if (event.target.matches(`${selector} , ${selector} *`)) {\n handler.apply(event.target.closest(selector), arguments);\n }\n },\n false\n );\n}\n\n/**\n * @public documentReady\n * @param {Function} fn - function to be called after document is done loading.\n */\nfunction documentReady(fn) {\n if (document.readyState !== 'loading') {\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n}\n\n/**\n * @public exists\n * @param {*} selection - The element or nodelist to verify for existence\n * @returns {boolean} - Boolean value stating the existance of the selection\n * @description\n * Verifies existance of a certain element by checking for type, null and length\n * Usage: use with either querySelector() or querySelectorAll()\n * querySelector will not have a 'length', e.g. this would return true if other conditions are true\n * querySelectorAll will have a 'length', e.g. this would return true if all conditions are true\n */\nfunction exists(selection) {\n return typeof selection !== 'undefined' && selection !== null && ('length' in selection ? selection.length > 0 : true);\n}\n\n/**\n * @public getPosition\n * @param {*} element - The element to get the position for\n * @returns {Object} - An object containing the left and top position of the element\n *\n * @description\n * Will get the position of an element relative to the document\n */\nfunction getPosition(element) {\n let top = element.offsetTop;\n let left = element.offsetLeft;\n\n let currentElement = element;\n while (currentElement.offsetParent && currentElement.offsetParent !== window) {\n currentElement = currentElement.offsetParent;\n top += currentElement.offsetTop;\n left += currentElement.offsetLeft;\n }\n\n return { left, top };\n}\n\n/**\n * isKeyInObject\n * @param {Object} object - The object\n * @param {string} key - The key\n * @returns {boolean} - True or false\n */\nfunction isKeyInObject(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * @private isAemMobileView\n * @returns {boolean} - Whether the user is on a \"mobile\" viewport or not based on AEM rules\n *\n * @description\n * Checks to see whether the user is on a \"mobile\" viewport or not based on AEM rules\n * Please note that www.vodafone.nl/zakelijk will show the mobile menu from viewports 1023 and smaller\n */\nfunction isAemMobileView() {\n return window.innerWidth < 1024;\n}\n\n/**\n * @memberof util\n * @param {string} breakpointKey from constants that should match css breakpoint\n * @param {boolean} [isUp] by default is true since mobile first, reverses condition\n * @return {boolean} whether window is larger than specified breakpoint\n */\nfunction isMediaBreakpoint(breakpointKey, isUp = true) {\n if (!isKeyInObject(CONST.breakpoints, breakpointKey)) {\n console.error(`fn isMediaBreakpoint: ${breakpointKey} -- does not exist in constants breakpoints object`); // eslint-disable-line\n }\n\n const outerWidth = window.innerWidth;\n const breakpointValue = parseInt(CONST.breakpoints[breakpointKey], 10);\n\n return isUp ? outerWidth > breakpointValue : outerWidth < breakpointValue - 1;\n}\n\n/**\n * @memberof util\n * @return {Object} An object containing the name and value of the current breakpoint\n */\nfunction getCurrentBreakpoint() {\n const breakpoints = CONST.breakpoints;\n const screenSize = document.documentElement.clientWidth;\n const currentBreakpoint = [...Object.keys(breakpoints)].reverse().find((key) => screenSize > breakpoints[key]);\n\n return {\n name: currentBreakpoint,\n value: breakpoints[currentBreakpoint]\n };\n}\n\n/**\n * @memberof util\n * @return {number} a unique number\n */\nfunction generateUniqueNumber() {\n return performance.now().toString().replace('.', 0);\n}\n\n/**\n * @public empty\n * @param {*} element - The element to remove child nodes from\n * @description\n * Empties a given element completely while the given element has child nodes.\n * Plain strings are also considered child nodes and are thus also removed.\n */\nfunction removeChildNodes(element) {\n while (element.hasChildNodes()) {\n element.removeChild(element.lastChild);\n }\n}\n\n/**\n * @public tryParseJSON\n * @param {string} string - The possible JON string\n * @returns {Object} - Either the JSON object or an empty object for consistent return\n * @description\n * Copied from https://stackoverflow.com/a/20392392\n */\nfunction tryParseJSON(string) {\n try {\n const o = JSON.parse(string);\n\n // Handle non-exception-throwing cases:\n // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,\n // but... JSON.parse(null) returns null, and typeof null === \"object\",\n // so we must check for that, too. Thankfully, null is falsey, so this suffices:\n if (o && typeof o === 'object') {\n return o;\n }\n } catch (e) {} // eslint-disable-line no-empty\n\n return {};\n}\n\n/**\n * @function isIOS\n * @public\n * @description returns a boolean to determine whether a device's OS is IOS or not\n * @returns {boolean} whether the device OS is IOS or not\n */\nfunction isIOS() {\n return (/iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream;\n}\n\n/**\n * @function isMobile\n * @returns {boolean} whether the device is an mobile device or not\n */\nfunction isMobile() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * @public scrollTo\n * @param {Object} data - The optional object containing the top & left positions to scroll to\n */\nfunction scrollTo(data) {\n const position = data || {\n top: 0,\n left: 0\n };\n\n const stickyHeader = document.querySelector('.page-header');\n const headerHeight = stickyHeader ? stickyHeader.offsetHeight : 0;\n const supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n let positionTop = position.top;\n\n if (headerHeight > 0) {\n positionTop = position.top - headerHeight - 15; // Removing an additional 15px to put some space between the sticky site header and the element\n }\n\n if (supportsNativeSmoothScroll) {\n document.documentElement.scrollTo({\n top: positionTop,\n left: position.left,\n behavior: 'smooth'\n });\n } else {\n document.documentElement.scrollTop = positionTop;\n }\n}\n\n/**\n * @function toggleButtonState\n * @description Enables or disabled the button passed in based on the value of the second parameter.\n * @param {HTMLElement} button - A button element to be enabled or disabled.\n * @param {boolean} enable - True for enable and false for disable.\n */\nfunction toggleButtonState(button, enable) {\n if (enable) {\n button.classList.remove('disabled');\n button.removeAttribute('disabled');\n } else {\n button.classList.add('disabled');\n button.setAttribute('disabled', 'disabled');\n }\n}\n\n/**\n * @function removeAccentCharacters\n * @description Removes a accents from a string.\n * @param {string} string - The string from which we want to remove accents.\n * @returns {string} The string without accents.\n */\nfunction removeAccentCharacters(string) {\n return string.normalize('NFD').replace(/\\p{Diacritic}/gu, '');\n}\n\n/**\n * @function chunkArrayInGroups\n * @param {Array} arr - Array to be splitted\n * @param {number} size - Max size of the array chunk\n * @return {Array} - Array of grouped chunks\n * @description Splitting an array up into chunks of a given size\n */\nfunction chunkArrayInGroups(arr, size) {\n var groupedChunks = [];\n for (let i = 0; i < arr.length; i += size) {\n groupedChunks.push(arr.slice(i, i + size));\n }\n return groupedChunks;\n}\n\n/**\n * @function chunkGroupArrayInGroups\n * @param {Array} groupArr - Array to be splitted\n * @return {Array} - Array of grouped chunks\n * @description Splitting an array up into chunks of a given size\n */\nfunction chunkGroupArrayInGroups(groupArr) {\n // This one sorts and groups the alike product groups together\n // We need to send the requests to backend in a specific order, so we make it grouped\n const chunkGroups = [];\n Object.keys(groupArr).forEach((groupKey) => {\n const arr = groupArr[groupKey];\n const groupedChunks = [];\n // Sorts the product objects based on pids\n arr.sort((a, b) => {\n return a.pid >= b.pid ? 1 : -1;\n });\n for (let i = 0; i < arr.length; i += Math.round(arr.length / 3)) {\n groupedChunks.push(arr.slice(i, i + Math.round(arr.length / 3)));\n }\n // This makes sure that we have a separate business mobile group to send to backend\n groupedChunks.forEach((chunk, chunkIndex) => {\n Object.keys(chunk).forEach((key, index) => {\n const item = chunk[key];\n if (item?.pdpConfiguratorType === 'business-mobile') {\n chunk.splice(index, 1);\n if (chunk.length < 1) groupedChunks.splice(chunkIndex, 1);\n groupedChunks.push(item);\n }\n });\n });\n chunkGroups.push(groupedChunks);\n });\n return chunkGroups;\n}\n\n/**\n * @function trackPdpEccomerceEvent\n * @param {string} productType - Configurator type\n * @param {Object} step - Step to track\n * @description Builds and submits ecommerce event to track btn clicks on PDP\n */\nfunction trackPdpEccomerceEvent(productType, step) {\n const products = {\n brand: 'vodafone',\n category: `business-sme/acquisition/postpaid/${productType.replace(/\\s|business-/gi, '')}`,\n market: 'b2b'\n };\n\n const ecommerceObject = {\n event: 'checkout',\n events: {\n category: 'ecommerce',\n action: 'checkout'\n },\n ecommerce: {\n checkout: {\n action: 'checkout',\n has_vodafone: true,\n has_ziggo: true,\n products: products,\n step_name: step.name,\n step_nr: step.number\n }\n }\n };\n\n /* eslint-disable no-underscore-dangle */\n if (ecommerceObject && window._ddm) {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(ecommerceObject);\n window._ddm.trigger('ecommerce.checkout', {\n data: ecommerceObject.ecommerce.checkout\n });\n }\n /* eslint-enable no-underscore-dangle */\n}\n\n/**\n * @function assignStyling\n * @private\n * @param {Element} el - Element\n * @param {Object} styles - Styles\n * @description Assign a style object to an element\n */\nfunction assignStyling(el, styles) {\n Object.assign(el.style, styles);\n}\n\n/**\n * Calculate the total width of a collection of elements.\n *\n * @param {NodeListOf} elements - A collection of HTML elements.\n * @param {number} spacing - flex gap value in px.\n * @returns {number} The total width of all elements.\n */\nfunction getTotalWidth(elements, spacing = 0) {\n return Array.from(elements).reduce((totalWidth, element) => {\n const elementStyles = window.getComputedStyle(element);\n const elementWidth = element.offsetWidth + parseFloat(elementStyles.marginLeft) + parseFloat(elementStyles.marginRight);\n return totalWidth + elementWidth;\n }, spacing);\n}\n\n/**\n * Checks if a flex container is wrapped by comparing the total width of its flex items\n * with the container's width.\n *\n * @param {HTMLElement} flexContainer - The HTML element representing the flex container.\n * @param {NodeListOf} flexItems - A collection of HTML elements representing the flex items.\n * @param {number} spacing - flex gap value in px.\n * @returns {boolean} True if the flex container is wrapped, false if all items fit in a single row.\n */\nfunction isFlexContainerWrapped(flexContainer, flexItems, spacing) {\n const containerWidth = flexContainer.clientWidth;\n const itemsTotalWidth = getTotalWidth(flexItems, spacing);\n // Check if the items are wrapped by comparing their total width with the container width.\n const isWrapped = itemsTotalWidth > containerWidth;\n return isWrapped;\n}\n\n/**\n * @function loadCSS\n * @param {string} url - The URL of the CSS file to load.\n * @description Creates a link element and appends it to the document head to load a CSS file.\n */\nfunction loadCSS(url) {\n if (!url || document.querySelector(`link[href=\"${url}\"]`)) {\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n document.head.appendChild(link);\n}\n\n/**\n * The function formats input to money string\n *\n * @param {number} num Source number\n * @returns {string} Formatted string € 1.111,11\n */\nfunction formatToPriceString(num) {\n const parts = Number.parseFloat(num, 10).toFixed(2).toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n if (parts[1] === '00') {\n return `€ ${parts[0]},00`;\n }\n return `€ ${parts.join(',')}`;\n}\n\n/**\n * Checks if two arrays of objects are equal by comparing their elements.\n *\n * @param {Array} arr1 - The first array to compare.\n * @param {Array} arr2 - The second array to compare.\n * @returns {boolean} True if the arrays are equal, false otherwise.\n */\nfunction arraysAreEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n return (\n !arr1.some((obj1) => !arr2.some((obj2) => JSON.stringify(obj1) === JSON.stringify(obj2))) &&\n !arr2.some((obj2) => !arr1.some((obj1) => JSON.stringify(obj1) === JSON.stringify(obj2)))\n );\n}\n\nexport {\n CONST,\n addEvent,\n documentReady,\n exists,\n generateUniqueNumber,\n getCurrentBreakpoint,\n getPosition,\n isIOS,\n isMobile,\n isKeyInObject,\n isAemMobileView,\n isMediaBreakpoint,\n removeChildNodes,\n scrollTo,\n tryParseJSON,\n toggleButtonState,\n removeAccentCharacters,\n chunkArrayInGroups,\n chunkGroupArrayInGroups,\n trackPdpEccomerceEvent,\n assignStyling,\n isFlexContainerWrapped,\n getTotalWidth,\n loadCSS,\n formatToPriceString,\n arraysAreEqual\n};\n","'use strict';\n\nimport { CONST } from 'Util/util';\nimport { getFieldValidationMessage } from 'Components/form/form';\n\nconst validationAttributes = ['valueMissing', 'patternMismatch', 'tooShort'];\n\n/**\n * toggleValidityClass\n * @param {boolean} [isValid] - valid or not - true or false\n * @param {HTMLElement} [target] - target element\n */\nfunction toggleValidityClass(isValid, target) {\n if (isValid) {\n target.classList.remove('invalid');\n target.classList.add('valid');\n } else {\n target.classList.add('invalid');\n target.classList.remove('valid');\n }\n}\n\n/**\n * removeValidationMessageElement\n * @param {HTMLElement} [target] - target element\n */\nfunction removeValidationMessageElement(target) {\n const element = target.parentElement.querySelector('.error-msg');\n if (element) element.remove();\n}\n\n/**\n * createValidationMessageElement\n * @param {string} [message] - validation message\n * @param {HTMLElement} [target] - target element\n */\nfunction createValidationMessageElement(message, target) {\n const element =\n target.parentElement.querySelector('.error-msg') ||\n (function createErrorElement() {\n const el = document.createElement('small');\n el.classList.add('error-msg', 'text-primary');\n return el;\n })();\n element.innerText = message;\n if (target.dataset.selectedId && target.dataset.selectedId.includes('verblijfsdocument')) element.classList.add('d-inline-flex');\n target.parentElement.insertAdjacentElement('beforeend', element);\n}\n\n/**\n * @public validateField\n * @param {HTMLFormElement} field - The form field\n * @return {boolean} valid - Whether the field is valid or not\n */\nfunction validateField(field) {\n let validField = true;\n\n validationAttributes.forEach((attribute) => {\n if (field.validity && field.validity[attribute]) {\n const errorMessage = field.getAttribute(CONST.attributes.validation[attribute]);\n validField = false;\n createValidationMessageElement(errorMessage, field);\n toggleValidityClass(false, field);\n }\n });\n\n if (validField) {\n removeValidationMessageElement(field);\n toggleValidityClass(true, field);\n }\n\n return validField;\n}\n\n/**\n * @public validateForm\n * @param {HTMLForm} form - The form\n * @return {boolean} valid - Whether the form is valid or not\n */\nfunction validateForm(form) {\n let validForm = true;\n const formFields = [...form.querySelectorAll(CONST.selectors.form.input), ...form.querySelectorAll(CONST.selectors.form.textarea)];\n const dropdowns = [...form.querySelectorAll('.js-custom-select-validation')];\n\n formFields.forEach((field) => {\n if (field.type === 'hidden') {\n return;\n }\n\n const validField = validateField(field);\n\n if (!validField) {\n validForm = false;\n }\n });\n\n dropdowns.forEach((dropdown) => {\n const validField = dropdown.checkValidity();\n\n if (!validField) {\n validForm = false;\n }\n });\n\n return validForm;\n}\n\n/**\n * @private validate\n * @param {Event} evt - blur or invalid event\n * @param {string} [msg] - validation message\n */\nfunction validate(evt, msg) {\n const message = msg || getFieldValidationMessage(evt.target);\n if (message) {\n createValidationMessageElement(message, evt.target);\n toggleValidityClass(false, evt.target);\n } else {\n removeValidationMessageElement(evt.target);\n toggleValidityClass(true, evt.target);\n }\n}\n\nexport { validateForm, validateField, validate, removeValidationMessageElement, toggleValidityClass };\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth = parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning = true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n","var map = {\n\t\"./nl\": 2572,\n\t\"./nl.js\": 2572\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 9122;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 416;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t416: 0,\n\t636: 0,\n\t90: 0,\n\t274: 0,\n\t915: 0,\n\t171: 0,\n\t221: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkvodafoneziggo\"] = globalThis[\"webpackChunkvodafoneziggo\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [395,661,139,66], () => (__webpack_require__(8180)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","initLetsTalk","modal","spinner","document","querySelector","window","VZSpinner","day","timeSlot","employeesField","resetTimeSlot","selectAppointmentTimeElement","options","filter","option","hasAttribute","forEach","remove","classList","setAttribute","timeSlotErrorMessageElement","parentElement","handleChangeDate","event","value","detail","date","getFullYear","getMonth","getDate","target","dataset","url","employeesValue","trim","urlWithParams","encodeURIComponent","dayErrorMessageElement","start","fetch","then","response","status","text","innerHTML","finally","stop","handleEmployeesDateUpdate","dateSection","currentDateField","wasDatePickerOpen","newDateField","addEventListener","focus","handleEmployeeChange","threshold","parseInt","employeeThreshold","oldValue","lastValue","surpassedThreshold","newValue","oldCount","newCount","Math","floor","hasPassedThreshold","removeAttribute","validate","surpassThresholdError","add","removeEventListener","VZLeadForm","HTMLElement","constructor","super","this","letsTalkHandler","connectedCallback","bs","Modal","readyState","initLeadform","bind","leadModalElement","leadModal","form","submitBtn","setPlpBasket","onModalShow","onModalHidden","submit","updateLeadSource","updateActionUrl","prefixField","validateField","disconnectedCallback","open","show","customEvent","CustomEvent","_element","dispatchEvent","checkGA","cleanupLetsTalk","cleanupForm","reset","clearFormFields","timeSlotSelect","disabled","plpSidebar","plpBasket","getAttribute","parseFormFields","Promise","resolve","Date","selectedIndex","toISOString","leadSourceName","leadSource","actionUrl","action","setSelectedResourceId","timeSelector","selectedTimeOption","resourceId","getCurrentTime","now","moment","format","evt","preventDefault","CONST","attributes","validateForm","customElements","get","define","VZLeadFormTrigger","triggerBtn","openLeadForm","e","formId","leadForm","console","error","counter","gaCheckInterval","setInterval","ga","clearInterval","documentReady","body","redSpinnerData","require","parentEl","showing","veil","tagName","appendChild","lottie","Lottie","container","renderer","loop","autoplay","animationData","msg","getComputedStyle","getPropertyValue","style","position","insertAdjacentHTML","setTimeout","play","contains","content","stopPropagation","VZInputField","HTMLInputElement","validatePattern","setFieldStatus","onPaste","decorators","readonly","regex","valid","documentNumber","mask","preventCharacters","type","password","closest","disableExcludedFields","hasValue","length","placeholderIsShown","placeholderActive","test","element","selector","nodeName","toLowerCase","name","extends","VZSelect","HTMLSelectElement","selectCorrectValue","selectedValue","find","opt","indexOf","includes","getFieldValidationMessage","field","validity","required","checked","matches","pattern","RegExp","invalid","invalidMin","invalidMax","multipleAdditions","maskType","POSTCODE_MASK_ATTRIBUTE","PostCodeMask","IBAN_MASK_ATTRIBUTE","IBANMask","DATE_MASK_ATTRIBUTE","DateMask","CAPS_MASK_ATTRIBUTE","CapsMask","onInput","selectionStart","toUpperCase","setSelectionRange","cursorIndex","maskText","pressedCharacters","replaceRemovedDigitWithLetter","onArrowRight","onArrowLeft","onCharacterRemoval","checkIfDashIsSelected","replaceAsYouType","onKeyDown","runRegexOnValue","replace","split","totalLengthUntilLastDigit","newVal","totalLength","join","cursorOffset","removedCharacter","substring","splice","addDashes","direction","offset","replaceAt","index","replacement","key","isDigit","isNaN","allowedDash","hasSelection","repeat","selectionEnd","push","val","charRemoved","firstPressedCharacter","shift","UNDO_KEYS","onKeyUp","toLocaleLowerCase","some","k","DOCUMENT_NUMBER","toString","lastIndex","originalErrorMsg","patternError","selectedId","startsWith","patternX00Error","patternVError","ID_TYPES_CODES","ID_VALIDATION_RULES","ID_TYPE","setValidationPattern","id","getElementById","idType","Object","defineProperty","enumerable","configurable","Mask","PASSWORD_VIEW_TOGGLE","showPassword","feedbackElement","set","bannedCharacters","clipboardData","dataWithoutBannedCharacters","getData","character","currValue","end","substr","preventCharactersOnInput","events","preventEntry","keyCode","bool","enable","disable","writable","getVerticalScrollPercentage","parentNode","scrollTop","scrollHeight","clientHeight","closeModal","currentTarget","removeChild","localStorage","setItem","onModalClick","click","showModal","engagementModal","modalThreshold","throttle","shakeThreshold","querySelectorAll","button","getItem","abs","getTime","isWithin24Hours","pageView","dispatchInputEvent","Event","bubbles","cancelable","formElements","keys","notDisabledOptions","Array","from","removeValidationMessageElement","chatOfflineButton","activeConfiguratorGroup","committedConfiguratorGroups","customerEmail","lastOrderNr","prompt","dataLayer","assignListeners","call","openChatPrompt","closeChatPrompt","openChatWhenLoaded","addConfiguratorGroupsToDatalayer","openByDefault","interval","closeButton","group","pushToDataLayer","updateGroupLocation","groupObj","JSON","parse","data","address","location","street","houseNumber","appendix","extension","postCode","postalCode","city","room","paid","stringify","chatBtn","cookieName","parts","cookie","pop","getCookie","devToolsOpen","profile","profileEnd","cookieValue","domain","expirationDays","setTime","cookieString","toUTCString","setCookie","hostname","startDevToolsDetector","adviceScrollArea","lastScrollPos","elementsToFadeIn","currentElements","fadeInOffset","fadeInTime","staggerDelay","selectors","fadeInElements","initialElement","transitionDelay","checkElements","currentScrollPos","pageYOffset","documentElement","viewHeight","innerHeight","isNotScrollingUp","getPosition","top","frameElement","onCollapseToggle","hashValue","urlWithoutHash","href","history","replaceState","title","updateHash","removeHash","Collapse","hash","collapseEl","elementsToExpand","item","toggle","togglerEl","elementPosition","scrollTo","siteFooter","checkFooterOverlaping","notFoundAbsoluteContainer","exists","absolutelyPositionedElementRect","getBoundingClientRect","siteFooterRect","bottom","assignStyling","addEvent","listElements","isAemMobileView","listElement","classes","active","currentElement","debounce","removeProperty","VZDateField","minDate","maxDate","validateDate","elValue","elementIsDatepicker","month","year","chosenDate","dateIsInvalid","setCustomValidity","message","el","createElement","innerText","insertAdjacentElement","assign","Datepicker","locales","NL","VZDatePicker","availableDates","minDateUnFormatted","maxDateUnFormatted","createDatePicker","datesDisabled","changeDate","fixUnavailableDateOnBlur","setDatePickerDate","setDatePickerDefault","datepicker","setView","dataAsapDateAttribute","datePickerContainer","asapToggle","setDatePickerAsap","dateString","autohide","defaultViewDate","toValue","parseDate","toDisplay","formatDate","language","nextArrow","orientation","prevArrow","updateOnBlur","picker","viewId","getFormattedDate","dateObj","slice","resetDatePickerAsap","blur","newDate","isBefore","setDate","momentFormatter","asapDate","asap","locale","r","t","f","n","isArray","arguments","ModalHelper","defaultOptions","headerBorder","backdrop","keyboard","closeBtn","getDefaultModalHtml","configurationOptions","bodyText","bodyTitle","closeBtnUrl","iconName","isSecondaryBtnDismiss","primaryBtnUrl","primaryBtnTarget","primaryBtnText","secondaryBtnTarget","secondaryBtnText","secondaryBtnUrl","titleText","modalFooterClasses","tertiaryBtnTarget","tertiaryBtnText","tertiaryBtnUrl","clsx","renderAbandonConfigurationModal","editButton","abandonConfigurationModalId","abandonConfigurationModal","render","VZModal","hasCustomHtml","customModal","modalHelper","createTemplate","templateHtml","template","cloneNode","defaultModalHTML","keyboardSetting","newModal","hideModal","getInstance","hide","flyout","header","navigation","navigationColumn","navigationItems","navigationTitles","navigationToggler","navigationWrapper","notification","notificationContent","subNavigation","subNavigationWrapper","storefrontPage","subNavigationBtnSmallBusiness","subNavigationBtnLargeBusiness","navigationWrapperMobile","toggleStickyClass","updateNotificationHeight","paddingTop","notificationHeight","offsetHeight","headerHeight","height","setFlyoutHeight","flyouts","flyoutMinHeight","reduce","result","minHeight","bindItemToggling","targetElement","updateMobileMenuPosition","toggleMobileMenu","mouseover","mouseleave","subNavButton","basketIsEmpty","notEmptyBasketModal","modalBtnText","scrollToHash","currentBreakpoint","getCurrentBreakpoint","breakpoint","searchField","searchForm","trigger","VZOpenDrawer","endpoint","drawerUrl","onClick","handleSuccessResponse","isMinicartButton","isEditMode","showMinicartDrawerOnLoad","showDrawer","drawerElement","Drawer","getParamFromURL","urlWithoutParam","removeParamFromURL","pushState","addDrawerToDOM","html","loadCSS","endpointWithCsrf","appendCsrfToUrl","isConfiguratorPage","productPliID","editModeEndpoint","appendParamToURL","finalEndpoint","ok","Error","json","warn","cta","generalError","showErrorModal","VZDrawer","wrapper","scrollBarWidth","innerWidth","clientWidth","pageHeader","removeDrawer","prepareDocumentBody","preventDrawerClosing","preventInfiniteLoop","control","toggleState","isExpanded","tapArea","isMobile","paddingRight","drawerInitiated","promptOpen","promptClose","confirm","clearCompanyRelatedFields","map","getCompanyDetailsUrl","companies","kvkNumber","company","detailsUrl","showChooserInviteSection","condition","chooserInviteSection","chooserInviteCheckbox","VZCompanySearch","inputField","searchResults","kvkNumberField","companySelector","chooserInviteElement","companyInformationCards","minQueryLengthText","minQueryLengthNumber","tradenameEndpoint","tradenameUrl","kvkEndpoint","kvkUrl","hasExistingKvk","isLeadForm","onEdit","onKeyup","onSearchResultClick","handleSearchResultClick","populateKvkField","handleDocumentClick","fetchExistingKvk","getEndpoint","onExistingKvkFetch","observedAttributes","onKeydown","attributeChangedCallback","resultsOpen","resultsContainer","removeChildNodes","clearResults","populateCompanyNameField","companyData","companyName","isExistingCompany","country","stringifiedCompany","encodeURI","postcode","postcodeFormatted","houseNumberAddition","card","nowTime","tz","currentTimeInput","fetchCompanyDetails","res","fetchCompanyList","success","serverErrors","generateResponseHTML","catch","resources","kvk","searchResultsContainer","selectedNameField","textContent","selectedKvkField","match","companyDetailsUrl","decodeURI","selectedCompanyDetailsUrl","existingKvkNumber","searchQuery","minSearchQueryLength","meetsMinLengthRequirement","removeAccentCharacters","errorModal","activeModal","modalStepContainer","modalStep","modalStepInputs","errorModalHtml","existingModal","popstate","navigator","serviceWorkerEnabled","serviceWorker","register","scope","concat","getRegistrations","serviceWorkers","workerInstance","unregister","computedStyles","bscanSteps","INTRO","STATEMENTS_DONE","GROUPED_QUESTIONS","ADVICE","THANKYOU","class","csrfToken","csrfName","exclude","placeholder","selected","validation","patternMismatch","valueMissing","tooShort","breakpoints","xxs","xs","sm","md","lg","xl","xxl","buttons","next","previous","warning","dBlock","dFlex","dInlineBlock","dNone","empty","inactive","hidden","last","change","input","keyUp","load","mousedown","paste","resize","responseError","scroll","transitionEnd","update","checkbox","file","inputFieldClear","inputFieldFeedback","label","radio","select","textarea","htmlBody","img","interactiveElements","preferredLayoutId","vzLayoutToggle","enabledBreakpoint","idDefault","localStorageKey","splitUpUrl","paramUrl","at","params","urlValues","newParams","param","nameMatch","newURL","separator","csrf","tokenName","token","pathname","search","parent","passedEvent","handler","apply","fn","selection","offsetTop","left","offsetLeft","offsetParent","screenSize","reverse","hasChildNodes","lastChild","userAgent","stickyHeader","supportsNativeSmoothScroll","positionTop","behavior","string","normalize","styles","link","rel","head","validationAttributes","toggleValidityClass","isValid","createValidationMessageElement","validField","attribute","errorMessage","validForm","formFields","dropdowns","dropdown","checkValidity","ce","defaultPrevented","origPrevent","createEvent","initCustomEvent","prototype","factory","lazySizes","lazysizes","lazySizesCfg","prop","lazySizesDefaults","lazyClass","loadedClass","loadingClass","preloadClass","errorClass","autosizesClass","fastLoadedClass","iframeLoadMode","srcAttr","srcsetAttr","sizesAttr","minSize","customMedia","init","expFactor","hFac","loadMode","loadHidden","ricTimeout","throttleDelay","lazySizesConfig","lazysizesConfig","getElementsByClassName","cfg","noSupport","docElem","supportPicture","HTMLPictureElement","_addEventListener","_getAttribute","requestAnimationFrame","requestIdleCallback","regPicture","loadEvents","regClassCache","hasClass","ele","cls","addClass","removeClass","reg","addRemoveLoadEvents","dom","triggerEvent","elem","noBubbles","noCancelable","instance","initEvent","updatePolyfill","full","polyfill","picturefill","pf","src","reevaluate","elements","getCSS","getWidth","width","offsetWidth","_lazysizesWidth","rAF","firstFns","secondFns","fns","run","runFns","running","waiting","rafBatch","queue","_lsFlush","rAFIt","simple","that","args","lastTime","gDelay","rICTimeout","idleCallback","timeout","isPriority","delay","func","timestamp","wait","later","loader","regImg","regIframe","supportScroll","shrinkExpand","currentExpand","isLoading","lowRuns","resetPreloading","isVisible","isBodyHidden","isNestedVisible","elemExpand","outerRect","visible","eLtop","eLbottom","eLleft","eLright","right","eLlen","i","rect","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","defaultExpand","preloadExpand","lazyloadElems","_lazyRace","prematureUnveil","unveilElement","expand","_defEx","eLvW","elvH","isCompleted","preloadElems","preloadAfterLoad","throttledCheckElements","switchLoadingClass","_lazyCache","rafSwitchLoadingClass","rafedSwitchLoadingClass","changeIframeSrc","contentWindow","handleSources","source","sourceSrcset","lazyUnveil","isAuto","sizes","isImg","srcset","isPicture","firesLoad","clearTimeout","resetPreloadingTimer","getElementsByTagName","isLoaded","complete","naturalWidth","loading","autoSizer","updateElem","afterScroll","altLoadmodeScrollListner","onload","started","_","persisted","loadingElements","MutationObserver","observe","childList","subtree","checkElems","unveil","_aLSL","sizeElement","sources","len","dataAttr","getSizeElement","debouncedUpdateElementsSizes","autosizesElems","uP","aC","rC","hC","fire","gW","module","exports","webpackContext","req","webpackContextResolve","__webpack_require__","o","code","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","m","amdO","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","d","a","definition","g","globalThis","Function","obj","hasOwnProperty","nmd","paths","children","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}