{"version":3,"file":"default/js/VZLeadForm.js","mappings":"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","sources":["webpack://vodafoneziggo/webpack/runtime/chunk loaded","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/letsTalk.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/VZLeadForm.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/common.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/helpers/formHelpers.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/util.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/validation.js","webpack://vodafoneziggo/./node_modules/moment/locale/ sync [/\\\\](nl(\\.js)","webpack://vodafoneziggo/webpack/bootstrap","webpack://vodafoneziggo/webpack/runtime/compat get default export","webpack://vodafoneziggo/webpack/runtime/define property getters","webpack://vodafoneziggo/webpack/runtime/hasOwnProperty shorthand","webpack://vodafoneziggo/webpack/runtime/node module decorator","webpack://vodafoneziggo/webpack/runtime/jsonp chunk loading","webpack://vodafoneziggo/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { validate } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * Initializes the \"Let's Talk\" functionality for appointment scheduling\n * @param {HTMLElement} modal - The modal element containing the appointment form\n * @returns {Function} A cleanup function to remove event listeners\n */\nexport default function initLetsTalk(modal) {\n const spinner = document.querySelector('vz-spinner') || new window.VZSpinner();\n const day = modal.querySelector('.js-appointment-day');\n const timeSlot = modal.querySelector('.js-appointment-time');\n const employeesField = modal.querySelector('.js-lead-form-employees');\n\n // Disable date picker by default\n day.setAttribute('disabled', true);\n\n /**\n * Resets and disables the time slot selector\n */\n function resetTimeSlot() {\n const selectAppointmentTimeElement = timeSlot.querySelector('.js-select-appointment-time');\n if (selectAppointmentTimeElement) {\n // Remove all options\n [...selectAppointmentTimeElement.options].filter((option) => !option.hasAttribute('disabled')).forEach((option) => option.remove());\n\n // Reset & disable\n selectAppointmentTimeElement.classList.remove('invalid', 'valid');\n selectAppointmentTimeElement.setAttribute('disabled', true);\n\n // Remove error message if present\n const timeSlotErrorMessageElement = selectAppointmentTimeElement.parentElement.querySelector('.error-msg');\n if (timeSlotErrorMessageElement) timeSlotErrorMessageElement.remove();\n }\n }\n\n /**\n * Handles the date change event\n * @param {Event} event - The change event object\n */\n function handleChangeDate(event) {\n const value = `${event.detail.date.getFullYear()}-${event.detail.date.getMonth() + 1}-${event.detail.date.getDate()}`;\n const {\n target: {\n dataset: { url }\n }\n } = event;\n\n const employeesValue = employeesField.value.trim();\n const urlWithParams = `${url}${value}${employeesValue ? `&employees=${encodeURIComponent(employeesValue)}` : ''}`;\n const dayErrorMessageElement = day.parentElement.querySelector('.error-msg');\n\n resetTimeSlot();\n\n // Show spinner\n spinner.start();\n\n fetch(urlWithParams)\n .then((response) => {\n // Remove day error message if present\n if (response.status === 200 && dayErrorMessageElement) dayErrorMessageElement.remove();\n\n return response.text();\n })\n .then((response) => {\n timeSlot.innerHTML = response;\n })\n .finally(spinner.stop);\n }\n\n /**\n * Updates the appointment date section based on employee count\n * @param {string} employeesValue - Number of employees entered\n * @returns {Promise} Promise that resolves when the update is complete\n */\n function handleEmployeesDateUpdate(employeesValue) {\n const dateSection = modal.querySelector('.js-appointment-date');\n const url = employeesField.dataset.url;\n const urlWithParams = `${url}${employeesValue ? `?employees=${encodeURIComponent(employeesValue)}` : ''}`;\n\n // Show spinner\n spinner.start();\n\n return fetch(urlWithParams)\n .then((response) => response.text())\n .then((response) => {\n const currentDateField = modal.querySelector('.js-appointment-day');\n const wasDatePickerOpen = currentDateField && currentDateField.parentElement.querySelector('.datepicker.active') !== null;\n\n dateSection.innerHTML = response;\n // Re-initialize date field since we replaced the content\n const newDateField = dateSection.querySelector('.js-appointment-day');\n if (newDateField) {\n newDateField.addEventListener('changeDate', handleChangeDate);\n // Restore focus if the date picker was open before the update\n if (wasDatePickerOpen) {\n newDateField.focus();\n }\n }\n })\n .finally(spinner.stop);\n }\n\n /**\n * Checks if the new employee count crosses the threshold in either direction\n * @param {string} oldValue - Previous value from input field\n * @param {string} newValue - New value from input field\n * @param {number} threshold - Threshold value to compare against\n * @returns {boolean} True if threshold is crossed in either direction\n */\n function hasPassedThreshold(oldValue, newValue, threshold) {\n const oldCount = parseInt(oldValue || '0', 10);\n const newCount = parseInt(newValue || '0', 10);\n\n if (oldCount === 0) return true;\n\n return Math.floor(oldCount / threshold) !== Math.floor(newCount / threshold);\n }\n\n /**\n * Handles employee field changes\n * @param {Event} event - The input event object\n */\n function handleEmployeeChange(event) {\n const value = event.target.value.trim();\n const threshold = parseInt(event.target.dataset.employeeThreshold, 10);\n const oldValue = event.target.dataset.lastValue || '0';\n const surpassedThreshold = hasPassedThreshold(oldValue, value, threshold);\n\n // Store current value for next comparison\n event.target.dataset.lastValue = value;\n\n if (surpassedThreshold) {\n // If the threshold is crossed, update the date fied\n if (value) {\n handleEmployeesDateUpdate(value).then(() => {\n day.removeAttribute('disabled');\n const newDateField = modal.querySelector('.js-appointment-day');\n if (newDateField && oldValue !== '0') {\n validate({ target: newDateField }, newDateField.dataset.surpassThresholdError);\n }\n });\n resetTimeSlot();\n } else {\n // Reset appointment date section to initial state\n handleEmployeesDateUpdate('').then(() => {\n const newDateField = modal.querySelector('.js-appointment-day');\n if (newDateField) {\n newDateField.setAttribute('disabled', true);\n newDateField.classList.remove('invalid', 'valid');\n newDateField.classList.add('empty');\n newDateField.value = '';\n }\n });\n\n resetTimeSlot();\n }\n }\n }\n\n day.addEventListener('changeDate', handleChangeDate);\n employeesField.addEventListener('blur', handleEmployeeChange);\n\n return () => {\n day.removeEventListener('changeDate', handleChangeDate);\n employeesField.removeEventListener('blur', handleEmployeeChange);\n };\n}\n","'use strict';\n\nimport 'Components/form/VZSelect';\nimport 'Components/form/VZInputField';\nimport initLetsTalk from 'app_business_scan/steps/letsTalk'; // This is used to fetch the timeslots once a date has been selected\nimport { validateForm } from 'app_vodafone_ziggo/util/validation';\nimport { checkGA } from './common.js';\nimport CONST from 'Util/constants';\nimport moment from 'moment';\nimport { validateField } from 'app_vodafone_ziggo/util/validation';\nimport { clearFormFields } from 'app_vodafone_ziggo/helpers/formHelpers';\n\nexport default class VZLeadForm extends HTMLElement {\n constructor() {\n super();\n this.letsTalkHandler = null;\n }\n\n connectedCallback() {\n if ((window.bs && window.bs.Modal) || document.readyState === 'complete') {\n this.initLeadform();\n } else {\n document.addEventListener('DOMContentLoaded', this.initLeadform.bind(this));\n }\n }\n\n /**\n * Initializes the lead form. It sets up the modal button, submit button, form, and lead modal.\n */\n initLeadform() {\n this.leadModalElement = this.querySelector('#lead-modal');\n this.leadModal = this.leadModalElement ? new window.bs.Modal(this.leadModalElement) : null;\n this.form = this.querySelector('form');\n\n if (!this.form) return; // Avoid JS errors if form not available for some reason\n\n this.submitBtn = this.form.querySelector('.js-lead-form-submit');\n this.setPlpBasket = this.setPlpBasket.bind(this);\n\n if (this.leadModal !== null) {\n // Add event listeners for both show and hide events of the modal\n this.leadModalElement.addEventListener('show.bs.modal', this.onModalShow.bind(this));\n this.leadModalElement.addEventListener('hidden.bs.modal', this.onModalHidden.bind(this));\n } else {\n this.initLetsTalk();\n }\n\n this.submitBtn.addEventListener('click', this.submit.bind(this));\n this.updateLeadSource();\n this.updateActionUrl();\n this.spinner = document.querySelector('vz-spinner') || new window.VZSpinner();\n\n // Validate preselected phone prefix field\n const prefixField = this.form.querySelector('.js-leadform-phoneprefix');\n if (prefixField) {\n validateField(prefixField);\n }\n }\n\n disconnectedCallback() {\n this.submitBtn.removeEventListener('click', this.submit);\n }\n\n open() {\n if (this.leadModal != null) {\n this.leadModal.show();\n if (document.querySelector('.js-advice-json')?.value) {\n const customEvent = new CustomEvent('modalLoaded', {\n detail: {\n modal: this.leadModal._element // eslint-disable-line no-underscore-dangle\n }\n });\n document.dispatchEvent(customEvent);\n\n // additional check for GA clientId for Business Scan\n // because the form is injected without page reload\n checkGA();\n }\n // set PLP products\n this.setPlpBasket();\n }\n }\n\n initLetsTalk() {\n // Clean up previous handler if it exists\n this.cleanupLetsTalk();\n\n // Initialize new LetsTalk handler\n this.letsTalkHandler = initLetsTalk(this.leadModalElement || this);\n }\n\n cleanupLetsTalk() {\n if (this.letsTalkHandler) {\n this.letsTalkHandler();\n this.letsTalkHandler = null;\n }\n }\n\n onModalShow() {\n this.initLetsTalk();\n }\n\n /**\n * Cleans up the form by resetting values and restoring initial state\n * @private\n */\n cleanupForm() {\n this.form.reset();\n clearFormFields(this.form);\n\n // Reset time slot selector to disabled state\n const timeSlotSelect = this.form.querySelector('.js-select-appointment-time');\n if (timeSlotSelect) {\n timeSlotSelect.disabled = true;\n }\n }\n\n onModalHidden() {\n this.cleanupLetsTalk();\n this.cleanupForm();\n }\n\n setPlpBasket() {\n const plpSidebar = document.querySelector('vz-plp-sidebar');\n if (plpSidebar) {\n const plpBasket = plpSidebar.getAttribute('plp-basket');\n this.form.querySelector('.js-plp-basket').value = plpBasket;\n }\n }\n\n parseFormFields() {\n return new Promise((resolve) => {\n const timeSlot = this.querySelector('#timeslot');\n this.form.querySelector('.js-scheduler-date-time').value = new Date(timeSlot[timeSlot.selectedIndex].value).toISOString();\n resolve();\n });\n }\n\n /**\n * Updates the lead source with a new value from the 'data-lead-source' attribute of the element.\n *\n * @private updateLeadSource\n * @returns {void}\n */\n updateLeadSource() {\n const leadSourceName = this.dataset.leadSource;\n if (leadSourceName) {\n this.form.querySelector('input[name=leadSourceName]').value = leadSourceName;\n }\n }\n\n /**\n * Updates action url for the Business Scan lead form\n *\n * @private updateActionUrl\n * @returns {void}\n */\n updateActionUrl() {\n const actionUrl = this.dataset.actionUrl;\n if (actionUrl) {\n this.form.action = actionUrl;\n }\n }\n\n /**\n * Sets the selected resource ID in the lead form based on the selected appointment time.\n *\n * This method retrieves the selected appointment time from a dropdown select element and\n * sets the corresponding resource ID in a form input field.\n *\n * @returns {void}\n */\n setSelectedResourceId() {\n const timeSelector = this.form.querySelector('.js-select-appointment-time');\n const selectedTimeOption = timeSelector ? timeSelector.options[timeSelector.selectedIndex] : null;\n if (selectedTimeOption) {\n this.form.querySelector('.js-lead-form-resource-input').value = selectedTimeOption.dataset.resourceId;\n }\n }\n\n /**\n * Gets current time from moment.js library.\n *\n * @returns {void}\n */\n getCurrentTime() {\n const now = moment().format();\n this.form.querySelector('input[name=currentDate]').value = now;\n }\n\n /**\n * @private onSubmit\n * @param {ChangeEvent} evt - submit event\n */\n async submit(evt) {\n evt.preventDefault();\n this.submitBtn.setAttribute(CONST.attributes.disabled, CONST.attributes.disabled);\n this.submitBtn.classList.add(CONST.attributes.disabled);\n this.spinner.start();\n this.setSelectedResourceId();\n this.getCurrentTime();\n if (validateForm(this.form)) {\n await this.parseFormFields();\n this.form.submit();\n } else {\n this.spinner.stop();\n this.submitBtn.removeAttribute(CONST.attributes.disabled);\n this.submitBtn.classList.remove(CONST.attributes.disabled);\n }\n }\n}\n\nif (!window.customElements.get('vz-lead-form')) {\n window.customElements.define('vz-lead-form', VZLeadForm);\n}\n","'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 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 { validateField, removeValidationMessageElement } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * Dispatches an 'input' event on the given element.\n * @param {HTMLElement} element - The element to dispatch the event on.\n */\nfunction dispatchInputEvent(element) {\n const event = new Event('input', { bubbles: true, cancelable: true });\n element.dispatchEvent(event);\n}\n\n/**\n * Clears all the fields in the provided form elements object and resets the validation.\n *\n * @param {Object} formElements - The form elements to be cleared.\n */\nfunction clearFormFields(formElements) {\n Object.keys(formElements).forEach((key) => {\n const element = formElements[key];\n // Preselect the only option from a select element\n if (element.tagName === 'SELECT') {\n const notDisabledOptions = Array.from(element.options).filter((option) => !option.disabled);\n if (notDisabledOptions.length === 1) {\n element.selectedIndex = notDisabledOptions[0].index;\n }\n } else {\n element.value = '';\n formElements[key].classList.add('empty');\n validateField(formElements[key]);\n }\n\n dispatchInputEvent(element);\n element.classList.remove('invalid');\n removeValidationMessageElement(element);\n });\n}\n\n/**\n * Prefills the form fields with provided data.\n *\n * @param {Object} formElements - The form elements to be prefilled.\n * @param {Object} data - The data used to prefill the form elements.\n */\nfunction prefillFormFields(formElements, data) {\n Object.keys(formElements).forEach((key) => {\n const element = formElements[key];\n element.value = data[key] || '';\n\n if (element.value) {\n element.classList.remove('empty');\n }\n\n dispatchInputEvent(element);\n });\n}\n\n/**\n * Sets the required attribute on specified contact form fields.\n *\n * @param {Object} formElements - An object containing the form elements to be modified.\n * @param {boolean} isRequired - A boolean indicating whether the fields should be marked as required.\n */\nfunction makeContactFormFieldsRequired(formElements, isRequired) {\n [formElements.initials, formElements.lastName, formElements.email, formElements.phone].forEach((input) => {\n input.required = isRequired;\n input.setAttribute('aria-required', isRequired.toString());\n });\n}\n\nexport { clearFormFields, prefillFormFields, makeContactFormFieldsRequired };\n","'use strict';\n\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 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","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","// 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__.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};","// 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\t171: 0,\n\t636: 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, [66], () => (__webpack_require__(4501)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","initLetsTalk","modal","spinner","document","querySelector","window","VZSpinner","day","timeSlot","employeesField","resetTimeSlot","selectAppointmentTimeElement","options","filter","option","hasAttribute","forEach","remove","classList","setAttribute","timeSlotErrorMessageElement","parentElement","handleChangeDate","event","value","detail","date","getFullYear","getMonth","getDate","target","dataset","url","employeesValue","trim","urlWithParams","encodeURIComponent","dayErrorMessageElement","start","fetch","then","response","status","text","innerHTML","finally","stop","handleEmployeesDateUpdate","dateSection","currentDateField","wasDatePickerOpen","newDateField","addEventListener","focus","handleEmployeeChange","threshold","parseInt","employeeThreshold","oldValue","lastValue","surpassedThreshold","newValue","oldCount","newCount","Math","floor","hasPassedThreshold","removeAttribute","validate","surpassThresholdError","add","removeEventListener","VZLeadForm","HTMLElement","constructor","super","this","letsTalkHandler","connectedCallback","bs","Modal","readyState","initLeadform","bind","leadModalElement","leadModal","form","submitBtn","setPlpBasket","onModalShow","onModalHidden","submit","updateLeadSource","updateActionUrl","prefixField","validateField","disconnectedCallback","open","show","customEvent","CustomEvent","_element","dispatchEvent","checkGA","cleanupLetsTalk","cleanupForm","reset","clearFormFields","timeSlotSelect","disabled","plpSidebar","plpBasket","getAttribute","parseFormFields","Promise","resolve","Date","selectedIndex","toISOString","leadSourceName","leadSource","actionUrl","action","setSelectedResourceId","timeSelector","selectedTimeOption","resourceId","getCurrentTime","now","moment","format","evt","preventDefault","CONST","attributes","validateForm","customElements","get","define","counter","gaCheckInterval","setInterval","ga","clearInterval","documentReady","body","VZInputField","HTMLInputElement","validatePattern","setFieldStatus","onPaste","decorators","readonly","regex","valid","documentNumber","mask","preventCharacters","type","password","closest","disableExcludedFields","setTimeout","hasValue","length","placeholderIsShown","placeholderActive","test","element","selector","nodeName","toLowerCase","name","extends","VZSelect","HTMLSelectElement","contains","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","position","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","dispatchInputEvent","Event","bubbles","cancelable","formElements","keys","tagName","notDisabledOptions","Array","from","removeValidationMessageElement","computedStyles","getComputedStyle","documentElement","bscanSteps","INTRO","STATEMENTS_DONE","GROUPED_QUESTIONS","ADVICE","THANKYOU","class","csrfToken","csrfName","exclude","href","placeholder","selected","validation","patternMismatch","valueMissing","tooShort","breakpoints","xxs","getPropertyValue","xs","sm","md","lg","xl","xxl","classes","active","buttons","next","previous","warning","dBlock","dFlex","dInlineBlock","dNone","empty","inactive","hidden","last","blur","change","click","input","keyUp","load","mousedown","mouseleave","mouseover","paste","popstate","resize","responseError","scroll","transitionEnd","update","selectors","checkbox","file","inputFieldClear","inputFieldFeedback","label","radio","select","textarea","html","htmlBody","img","interactiveElements","localStorage","preferredLayoutId","vzLayoutToggle","container","enabledBreakpoint","idDefault","localStorageKey","fn","validationAttributes","toggleValidityClass","isValid","createValidationMessageElement","message","el","createElement","innerText","insertAdjacentElement","validField","attribute","errorMessage","validForm","formFields","querySelectorAll","dropdowns","dropdown","checkValidity","msg","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","module","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","n","getter","__esModule","d","a","definition","obj","prop","prototype","hasOwnProperty","nmd","paths","children","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","chunkLoadingGlobal","globalThis","__webpack_exports__"],"sourceRoot":""}