{"version":3,"file":"default/js/page-designer.js","mappings":"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","sources":["webpack://vodafoneziggo/webpack/runtime/chunk loaded","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/VZSpinner.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/modal.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/VZDynamicLink.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/VZTracker.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/cookies.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/journey/journeyHelper.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/product/components/VZDeleteGroup.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/page-designer.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/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/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 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","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","/**\n * @export\n * @class VZDynamicLink\n * @extends {HTMLAnchorElement}\n *\n * @description\n * Can be used as an anchor. When data-url is adjusted, the href will be updated.\n */\nexport default class VZDynamicLink extends HTMLAnchorElement {\n constructor() {\n super();\n }\n\n static get observedAttributes() {\n return ['data-url'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'data-url' && oldValue !== newValue) {\n this.setAttribute('href', newValue);\n }\n }\n}\n\nif (!window.customElements.get('vz-dynamic-link')) {\n window.customElements.define('vz-dynamic-link', VZDynamicLink, { extends: 'a' });\n}\n","/**\n * @class VZTracker\n * @attribute {String} data-component-id - The component identifier.\n * @description\n * Send (bubbled) click events on Anchors and Buttons to Google Analytics\n * Relying on customerGroups Object available on the Window Object. This Object can't be added to the component due to caching.\n */\nexport default class VZTracker extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.customerGroups = JSON.parse(window.customerGroups || '[]');\n if (this.customerGroups.length > 0) {\n this.addEventListener('click', this.onClick);\n }\n }\n\n disconnectedCallback() {\n this.removeEventListener('click', this.onClick);\n }\n\n onClick(evt) {\n if (window.ga && ['A', 'BUTTON'].includes(evt.target.nodeName)) {\n if (window.dataLayer) {\n window.dataLayer.push({\n event: 'targeting',\n eventCategory: 'targeting',\n eventLabel: `${this.dataset.componentId}-${this.customerGroups.join('-')}'`,\n eventAction: 'click'\n });\n }\n }\n }\n}\n\nif (!window.customElements.get('vz-tracker')) {\n window.customElements.define('vz-tracker', VZTracker);\n}\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 * @function getJourney\n * @description Retrieves the current journey a customer is in.\n * @returns {Array} An Array of products to be configured in the current journey.\n */\nfunction getJourney() {\n return (\n getCookie('journey')\n ?.split('|')\n .filter((item) => item.length > 0) || []\n );\n}\n\n/**\n * @function notifyJourneyModal\n * @param {Array} journey - A stringified version of the journey Object\n * @description Notifies the journey modal on the new journey state\n */\nfunction notifyJourneyModal(journey) {\n const journeyModal = document.getElementById('journey-modal');\n if (journeyModal) {\n journeyModal.setAttribute('products', journey.join('|'));\n }\n}\n\n/**\n * @function updateJourney\n * @param {Array} journey - The updated journey\n * @param {Object} urls - The urls for adding journey products to basket\n * @description Updates the journey with newly added or removed products.\n */\nfunction updateJourney(journey, urls) {\n // cookie lifetime is similar to basket lifetime (4h)\n setCookie('journey', journey.join('|'), window.location.hostname, 0.1667);\n if (urls) {\n setCookie('journeyUpdateUrl-business-mobile', urls['business-mobile'], window.location.hostname, 0.1667);\n setCookie('journeyUpdateUrl-internet', urls.internet, window.location.hostname, 0.1667);\n }\n}\n\n/**\n * @function clearJourney\n * @description Clears the journey\n */\nfunction clearJourney() {\n setCookie('journey', null, window.location.hostname, 0);\n setCookie('journeyUpdateUrl-business-mobile', null, window.location.hostname, 0);\n setCookie('journeyUpdateUrl-internet', null, window.location.hostname, 0);\n}\n\nexport { clearJourney, getJourney, notifyJourneyModal, updateJourney };\n","'use strict';\n\nimport VZSpinner from 'Components/VZSpinner';\nimport { appendParamToURL } from 'Root/util/urlUtils';\nimport { getJourney, updateJourney, clearJourney } from '../../journey/journeyHelper';\n\nclass VZDeleteGroup extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.addEventListener('click', this.onClick);\n this.deleteBtn = this.querySelector('a');\n }\n\n disconnectedCallback() {\n this.removeEventListener('click', this.onClick);\n }\n\n /**\n * @function removeDeletedGroup\n * @description removes the deleted group from the DOM after it has been removed from the basket and dispatches an\n * event to update the monthly total\n */\n removeDeletedGroup() {\n const isMiniCart = !!this.deleteBtn.closest('vz-drawer');\n window.location = isMiniCart ? appendParamToURL(window.location.href, 'showMinicart', 'true') : window.location.href;\n }\n\n onClick(evt) {\n const spinner = document.querySelector('vz-spinner') || new VZSpinner();\n spinner.start();\n evt.preventDefault();\n\n const removeFromJourneyEmptyProduct = this.deleteBtn.getAttribute('data-empty-journey-remove');\n const removeFromJourneyExistingProduct = this.deleteBtn.getAttribute('data-journey-remove');\n\n if (removeFromJourneyEmptyProduct || removeFromJourneyExistingProduct) {\n let journey = getJourney();\n if (journey.length > 0) {\n journey = journey.filter((item) => item !== removeFromJourneyEmptyProduct && item !== removeFromJourneyExistingProduct);\n if (journey.every((id) => id === 'one-net') || removeFromJourneyExistingProduct === 'one-net') {\n clearJourney();\n } else {\n updateJourney(journey);\n }\n if (removeFromJourneyEmptyProduct) {\n spinner.stop();\n window.location.reload();\n return;\n }\n }\n }\n\n fetch(this.deleteBtn.href, {\n method: this.deleteBtn.getAttribute('data-type') || 'GET'\n })\n .then(this.removeDeletedGroup.bind(this))\n .finally(spinner.stop);\n }\n}\n\nexport default window.customElements.get('vz-delete-group') || VZDeleteGroup;\n\nif (!window.customElements.get('vz-delete-group')) {\n window.customElements.define('vz-delete-group', VZDeleteGroup);\n}\n","'use strict';\n\nimport 'Components/VZDynamicLink';\nimport 'Components/VZTracker';\nimport 'Root/product/components/VZDeleteGroup';\nimport { createModalByUrl, refreshToken } from 'Root/modal';\nimport { isMobile } from 'Util/util';\n\nclass PageDesigner {\n constructor() {\n this.assignListeners.call(this);\n\n ['bscan:step', 'pdp:update', 'availability:update'].forEach((event) => {\n document.addEventListener(event, this.assignListeners.bind(this));\n });\n\n document.addEventListener('show.bs.offcanvas', this.assignListeners.bind(this));\n\n this.constructor.openNewTabFromParams();\n }\n\n assignListeners() {\n [...document.querySelectorAll('[href^=\"modal:\"]')].forEach((link) => {\n link.addEventListener('click', this.constructor.getModal);\n });\n\n [...document.querySelectorAll('[href^=\"action:call\"]')].forEach((link) => {\n link.addEventListener('click', this.constructor.initCallMe);\n });\n\n [...document.querySelectorAll('[href^=\"action:chat\"]')].forEach((link) => {\n link.addEventListener('click', this.constructor.initChatWithMe);\n });\n }\n\n static getModal(event) {\n event.preventDefault();\n const link = event.target;\n const linkTarget = link.getAttribute('href').replace('modal:', '');\n const elementWithData = document.querySelector('.js-url-modals-data');\n const modalsData = elementWithData && JSON.parse(elementWithData.getAttribute('data-modals-data'));\n\n if (modalsData) {\n createModalByUrl(linkTarget, modalsData[linkTarget]).then(refreshToken);\n }\n }\n\n static initCallMe(event) {\n event.preventDefault();\n if (isMobile() && document.querySelector('.js-direct-call')?.href) {\n window.location.href = document.querySelector('.js-direct-call').href;\n return;\n }\n\n // If no BS prompt is available, check to see if we have a modal version\n const modalElement = document.querySelector('#modal-call-me');\n if (!modalElement) return;\n\n // Get either the existing instance or create a new one\n const modalInstance = window.bs.Modal.getInstance(modalElement) || new window.bs.Modal(modalElement);\n\n if (modalInstance) {\n modalInstance.show();\n }\n }\n\n static initChatWithMe(event) {\n event.preventDefault();\n const chatButton = document.querySelector('.dimelo_chat_item_markup .btn');\n\n if (chatButton) {\n chatButton.click();\n }\n }\n\n static openNewTabFromParams() {\n const queryString = window.location.search;\n if (queryString) {\n const urlParams = new URLSearchParams(queryString);\n if (urlParams.has('with')) {\n const urlToOpen = urlParams.get('with');\n if (urlToOpen.startsWith('http://') || urlToOpen.startsWith('https://')) {\n window.open(urlToOpen, '_blank');\n }\n }\n }\n }\n}\n\nnew PageDesigner(); // eslint-disable-line\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","// 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\t// no module.id needed\n\t\t// no module.loaded needed\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// 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__.j = 984;","// 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\t984: 0,\n\t274: 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], () => (__webpack_require__(145)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","redSpinnerData","require","VZSpinner","HTMLElement","constructor","parentEl","super","this","showing","stop","bind","veil","parentElement","document","body","tagName","appendChild","lottie","Lottie","container","querySelector","renderer","loop","autoplay","animationData","start","msg","Promise","resolve","window","getComputedStyle","getPropertyValue","style","position","classList","add","insertAdjacentHTML","setTimeout","play","contains","remove","content","connectedCallback","innerHTML","addEventListener","evt","stopPropagation","customElements","get","define","bs","Modal","spinner","selectors","errorModal","activeModal","modalStepContainer","modalStep","modalStepInputs","createModalByUrl","targetId","targetEndpoint","modalId","existingModal","getElementById","querySelectorAll","forEach","step","index","CONST","classes","active","getInstance","show","fetch","then","res","status","Error","text","response","modalElement","modal","ModalClass","dispatchEvent","CustomEvent","catch","console","error","finally","modalInstance","_element","modalActiveStep","modalFields","validateModalField","submitStepForm","appendModalStep","field","events","blur","event","lastFocussedField","target","keyUp","change","submit","customEvent","detail","key","toLowerCase","validateField","currField","preventDefault","form","validateForm","endpoint","getAttribute","formData","FormData","csrfName","attributes","csrfToken","append","_dd","user","ids","ga_id","method","scrollToTop","documentElement","scrollTo","top","left","behavior","scrollTop","currentStep","newStep","refreshToken","refreshTokenUrl","dataset","appendCsrfToUrl","VZDynamicLink","HTMLAnchorElement","observedAttributes","attributeChangedCallback","name","oldValue","newValue","setAttribute","extends","VZTracker","customerGroups","JSON","parse","length","onClick","disconnectedCallback","removeEventListener","ga","includes","nodeName","dataLayer","push","eventCategory","eventLabel","componentId","join","eventAction","setCookie","cookieName","cookieValue","domain","expirationDays","date","Date","setTime","getTime","cookieString","toUTCString","cookie","getJourney","parts","split","pop","shift","getCookie","filter","item","VZDeleteGroup","deleteBtn","removeDeletedGroup","isMiniCart","closest","location","appendParamToURL","href","removeFromJourneyEmptyProduct","removeFromJourneyExistingProduct","journey","every","id","hostname","urls","internet","updateJourney","reload","assignListeners","call","openNewTabFromParams","link","getModal","initCallMe","initChatWithMe","linkTarget","replace","elementWithData","modalsData","isMobile","chatButton","click","queryString","search","urlParams","URLSearchParams","has","urlToOpen","startsWith","open","computedStyles","bscanSteps","INTRO","STATEMENTS_DONE","GROUPED_QUESTIONS","ADVICE","THANKYOU","action","class","checked","disabled","exclude","pattern","placeholder","required","readonly","selected","url","value","validation","patternMismatch","valueMissing","tooShort","breakpoints","xxs","parseInt","xs","sm","md","lg","xl","xxl","buttons","next","previous","warning","dBlock","dFlex","dInlineBlock","dNone","empty","inactive","invalid","hidden","last","valid","input","load","mousedown","mouseleave","mouseover","paste","popstate","resize","responseError","scroll","transitionEnd","update","checkbox","file","inputFieldClear","inputFieldFeedback","label","radio","select","textarea","html","htmlBody","img","interactiveElements","localStorage","preferredLayoutId","vzLayoutToggle","enabledBreakpoint","idDefault","localStorageKey","splitUpUrl","hash","paramUrl","at","params","newURL","urlValues","newParams","param","removeParamFromURL","separator","encodeURIComponent","csrf","tokenName","token","test","navigator","userAgent","validationAttributes","toggleValidityClass","isValid","removeValidationMessageElement","element","createValidationMessageElement","message","el","createElement","innerText","selectedId","insertAdjacentElement","validField","attribute","validity","errorMessage","validForm","formFields","dropdowns","type","dropdown","checkValidity","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}