{"version":3,"file":"default/js/main.js","mappings":"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","sources":["webpack://vodafoneziggo/webpack/runtime/chunk loaded","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/VZLeadForm.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/letsTalk.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/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};","'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';\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 onModalHidden() {\n this.cleanupLetsTalk();\n }\n\n disconnectedCallback() {\n this.submitBtn.removeEventListener('click', this.submit);\n this.cleanupLetsTalk();\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","/**\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\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 const dayErrorMessageElement = day.parentElement.querySelector('.error-msg');\n\n // Needs to be queried again every time otherwise the reference to the element when trying to disable it is not valid\n const selectAppointmentTimeElement = timeSlot.querySelector('.js-select-appointment-time');\n const timeSlotErrorMessageElement = selectAppointmentTimeElement.parentElement.querySelector('.error-msg');\n\n // Remove options and disable element if the date value is not present\n if (dayErrorMessageElement || (!value && 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\n if (timeSlotErrorMessageElement) timeSlotErrorMessageElement.remove();\n\n return;\n }\n\n // Show spinner\n spinner.start();\n\n fetch(`${url}${value}`)\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 day.addEventListener('changeDate', handleChangeDate);\n\n return () => {\n day.removeEventListener('changeDate', handleChangeDate);\n };\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 '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","VZLeadForm","HTMLElement","constructor","super","this","letsTalkHandler","connectedCallback","window","bs","Modal","document","readyState","initLeadform","addEventListener","bind","leadModalElement","querySelector","leadModal","form","submitBtn","setPlpBasket","onModalShow","onModalHidden","initLetsTalk","submit","updateLeadSource","updateActionUrl","spinner","VZSpinner","prefixField","validateField","disconnectedCallback","removeEventListener","open","show","value","customEvent","CustomEvent","detail","modal","_element","dispatchEvent","checkGA","cleanupLetsTalk","day","timeSlot","handleChangeDate","event","date","getFullYear","getMonth","getDate","target","dataset","url","dayErrorMessageElement","parentElement","selectAppointmentTimeElement","timeSlotErrorMessageElement","options","filter","option","hasAttribute","forEach","remove","classList","setAttribute","start","fetch","then","response","status","text","innerHTML","finally","stop","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","disabled","add","validateForm","removeAttribute","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","validate","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","Math","abs","getTime","isWithin24Hours","pageView","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","Array","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","focus","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","parseInt","minQueryLengthNumber","tradenameEndpoint","tradenameUrl","kvkEndpoint","kvkUrl","hasExistingKvk","isLeadForm","onEdit","onKeyup","onSearchResultClick","handleSearchResultClick","populateKvkField","handleDocumentClick","fetchExistingKvk","getEndpoint","onExistingKvkFetch","observedAttributes","onKeydown","attributeChangedCallback","oldValue","newValue","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","encodeURIComponent","csrf","tokenName","token","pathname","search","parent","passedEvent","handler","apply","fn","selection","offsetTop","left","offsetLeft","offsetParent","screenSize","keys","reverse","hasChildNodes","lastChild","userAgent","stickyHeader","supportsNativeSmoothScroll","positionTop","behavior","string","normalize","styles","link","rel","head","validationAttributes","toggleValidityClass","isValid","removeValidationMessageElement","createValidationMessageElement","validField","attribute","errorMessage","validForm","formFields","dropdowns","dropdown","checkValidity","ce","cancelable","defaultPrevented","origPrevent","bubbles","createEvent","initCustomEvent","prototype","Event","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","trim","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":""}