{"version":3,"file":"default/js/business-scan.js","mappings":"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","sources":["webpack://vodafoneziggo/webpack/runtime/chunk loaded","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/VZCarousel.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/gtm.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/dataHandling.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/modal.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/responseHandling.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/scrolling.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/navigation.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/backbutton.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/form.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/questions.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/statements.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/letsTalk.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/setActiveProductIDs.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/decorators/idType.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/postcode.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/date.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/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/index.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/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/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/components/form/VZSelect.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZDateField.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/VZDatePicker.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/advice.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/quitbutton.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/spa.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/util/history.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/fade-in.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/prompt.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/searchCompany.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/progressIndicator.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/components/konami.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/steps/startPage.js","webpack://vodafoneziggo/./cartridges/app_business_scan/cartridge/client/default/js/business-scan.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/VZSpinner.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/components/form/form.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/modal.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/service-worker.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/constants.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/drag.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/urlUtils.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/util.js","webpack://vodafoneziggo/./cartridges/app_vodafone_ziggo/cartridge/client/default/js/util/validation.js","webpack://vodafoneziggo/./node_modules/custom-event-polyfill/polyfill.js","webpack://vodafoneziggo/./node_modules/lazysizes/lazysizes.js","webpack://vodafoneziggo/./node_modules/moment/locale/ sync [/\\\\](nl(\\.js)","webpack://vodafoneziggo/webpack/bootstrap","webpack://vodafoneziggo/webpack/runtime/amd options","webpack://vodafoneziggo/webpack/runtime/compat get default export","webpack://vodafoneziggo/webpack/runtime/define property getters","webpack://vodafoneziggo/webpack/runtime/global","webpack://vodafoneziggo/webpack/runtime/hasOwnProperty shorthand","webpack://vodafoneziggo/webpack/runtime/node module decorator","webpack://vodafoneziggo/webpack/runtime/runtimeId","webpack://vodafoneziggo/webpack/runtime/jsonp chunk loading","webpack://vodafoneziggo/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","'use strict';\n\nimport 'Util/drag';\nimport { getCurrentBreakpoint } from 'Util/util';\nimport CONST from 'Util/constants';\n\nconst template = document.createElement('template');\ntemplate.innerHTML = `\n \n \n \n \n`;\n\n/**\n * @example \n *\n * @export\n * @class VZCarousel\n * @extends {HTMLElement}\n */\nexport default class VZCarousel extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({\n mode: 'open'\n });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n connectedCallback() {\n this.initialized = null;\n this.infinite = this.getAttribute('infinite') === 'true';\n this.specificBreakpoints = this.getAttribute('breakpoints') && this.getAttribute('breakpoints').split(',');\n this.slideClassName = 'carousel__item';\n\n this.container = this.shadowRoot.querySelector('slot').assignedElements()[0];\n this.nextButton = this.shadowRoot.querySelector('.carousel__button--next');\n this.prevButton = this.shadowRoot.querySelector('.carousel__button--prev');\n this.nextButton.addEventListener('click', this.moveNext.bind(this));\n this.prevButton.addEventListener('click', this.movePrev.bind(this));\n\n this.setupSlideInformation.call(this);\n\n // If specific breakpoints have been defined in the `breakpoints` attribute, fire up determineBreakpointStyling\n if (this.specificBreakpoints) {\n window.addEventListener('load', this.determineBreakpointStyling.bind(this));\n document.addEventListener('breakpointChange', this.determineBreakpointStyling.bind(this));\n } else {\n this.initCarousel();\n document.addEventListener('breakpointChange', this.goToFirstSlide.bind(this));\n }\n\n // If we're inside PD, do some more initializing\n if (window.frameElement && window.frameElement.closest('.page-designer-ui')) {\n this.initPageDesigner.call(this);\n }\n }\n\n // If specific breakpoints have been defined, determine whether a carousel should be created or destroyed\n determineBreakpointStyling() {\n const currentBreakpoint = getCurrentBreakpoint();\n const supportCurrentBreakpoint = currentBreakpoint && this.specificBreakpoints.some((breakpoint) => breakpoint === currentBreakpoint.name);\n\n if (supportCurrentBreakpoint) {\n this.initCarousel();\n } else {\n this.destroyCarousel();\n }\n }\n\n setupSlideInformation() {\n const slotContent = this.shadowRoot.querySelector('slot').assignedElements();\n this.slides = slotContent.length > 0 ? [...slotContent[0].children] : [];\n this.slide = 0;\n this.totalSlides = this.slides.length;\n }\n\n getSlideWidth() {\n return document.documentElement.clientWidth > 1023 ? 100 / this.activeSlides : 100;\n }\n\n setSlidesWidth() {\n this.slideWidth = this.getSlideWidth();\n\n this.slides.forEach((item) => {\n item.style.width = `${this.slideWidth}%`;\n });\n }\n\n goToFirstSlide() {\n this.container.style.removeProperty('transform');\n this.setupSlideInformation.call(this);\n this.initSlides.call(this);\n\n if (!this.infinite) this.prevButton.classList.add('d-none');\n this.nextButton.classList.remove('d-none');\n }\n\n initSlides() {\n this.setSlidesWidth.call(this);\n this.activeSlides = document.documentElement.clientWidth > 1023 ? parseInt(this.getAttribute('active-slides'), 10) : 1;\n\n this.slides.forEach((item) => {\n item.classList.add(this.slideClassName);\n });\n }\n\n toggleButtonsVisibility() {\n if (!this.initialized) {\n this.nextButton.classList.add('d-none');\n this.prevButton.classList.add('d-none');\n return;\n }\n\n if (this.totalSlides > this.activeSlides) {\n this.nextButton.classList.remove('d-none');\n\n if (!this.infinite) {\n this.prevButton.classList.add('d-none');\n } else {\n this.prevButton.classList.remove('d-none');\n }\n } else {\n this.nextButton.classList.add('d-none');\n this.prevButton.classList.add('d-none');\n }\n }\n\n // Create the carousel\n initCarousel() {\n if (this.initialized || !(this.totalSlides > 0)) return;\n\n this.initialized = true;\n this.moving = true;\n this.classList.add('carousel-wrapper');\n this.container.classList.add('carousel', 'flex-nowrap');\n this.container.classList.remove('pe-none');\n this.initSlides.call(this);\n this.supportDrag.bind(this)(this.container);\n this.toggleButtonsVisibility.call(this);\n\n this.moving = false;\n this.classList.add('initialized');\n }\n\n // Destroy the carousel\n destroyCarousel() {\n if (typeof this.initialized === 'boolean' && !this.initialized) return;\n\n this.classList.remove('carousel-wrapper');\n this.container.classList.remove('carousel', 'flex-nowrap');\n this.container.classList.add('pe-none'); // Will disable dragging\n this.container.style.removeProperty('transform'); // Will remove any dragged value\n this.slide = 0; // Reset to first slide\n this.moving = false;\n this.initialized = false;\n this.classList.remove('initialized');\n this.toggleButtonsVisibility.call(this);\n\n this.slides.forEach((item) => {\n item.style.removeProperty('width');\n });\n }\n\n move() {\n if (this.moving || this.totalSlides === 1) return;\n\n const nextBatch = this.slide + this.activeSlides;\n let amountOfSlidesToMove = 100 * (this.slide / this.activeSlides); // As a percentage in steps of 100%\n\n if (nextBatch >= this.totalSlides) {\n const amountOfLastSlides = this.totalSlides - this.slide;\n\n amountOfSlidesToMove -= 100; // First \"go back\" to the previous amount\n amountOfSlidesToMove += this.slideWidth * amountOfLastSlides; // Then add the actual amount of last slides to show\n }\n\n this.container.style.transform = `translate3d(-${amountOfSlidesToMove}%, 0px, 0px)`;\n\n if (!this.infinite) {\n if (this.slide === 0) {\n this.prevButton.classList.add('d-none');\n } else {\n this.prevButton.classList.remove('d-none');\n }\n\n if (nextBatch >= this.totalSlides) {\n this.nextButton.classList.add('d-none');\n } else {\n this.nextButton.classList.remove('d-none');\n }\n }\n }\n\n moveNext() {\n if (this.moving) return;\n if (this.slide + this.activeSlides >= this.totalSlides && !this.infinite) return;\n if (this.slide + this.activeSlides >= this.totalSlides) {\n this.slide = 0;\n } else {\n this.slide += this.activeSlides;\n }\n this.move();\n }\n\n movePrev() {\n if (this.moving) return;\n if (this.slide <= 0 && !this.infinite) return;\n if (this.slide <= 0) {\n this.slide = this.totalSlides - 1;\n } else {\n this.slide -= this.activeSlides;\n }\n this.move();\n }\n\n supportDrag(item) {\n // Prevent native image dragging.\n item.ondragstart = () => {\n return false;\n };\n\n item.sdrag(\n (el) => {\n this.container.classList.add('dragging');\n el.style.cursor = 'grabbing';\n },\n (el) => {\n this.container.classList.remove('dragging');\n\n // Allow button clicks, etc.\n if (['A', 'BUTTON', 'LABEL', 'INPUT', 'SELECT'].includes(el.nodeName)) {\n el.style.left = '';\n return;\n }\n\n if (el.style.left.length === 0 || Math.abs(parseInt(el.style.left, 10)) < 20) return; // Accidental drag\n if (parseInt(el.style.left, 10) > 0) {\n this.movePrev();\n } else {\n this.moveNext();\n }\n // reset the left to ensure correct position when navigating back.\n el.style.left = '';\n },\n 'horizontal'\n );\n }\n\n // Check if window is \"loaded\" with an interval, seeing as the initial execution (nor window.load) does not do much when inside PD\n initPageDesigner() {\n const interval = setInterval(checkIfLoaded.bind(this), 1000); // eslint-disable-line no-use-before-define\n\n /**\n * @private checkIfLoaded\n *\n * @description\n * Will check to see if the PD window is finally done loading, then call initCarousel\n */\n function checkIfLoaded() {\n if (document.documentElement.clientWidth > 0) {\n this.determineBreakpointStyling.call(this);\n clearInterval(interval);\n }\n }\n }\n}\n\nif (!window.customElements.get('vz-carousel')) {\n window.customElements.define('vz-carousel', VZCarousel);\n}\n","'use strict';\n\nimport { CONST } from 'app_vodafone_ziggo/util/util';\n\nconst mainContainer = document.querySelector('.js-bscan-main');\n\nconst gtmOptOut = 'data-bscan-gtm-opt-out';\nconst attrStepId = 'data-bscan-step-id';\nconst attrResourceIncomplete = 'data-bscan-resource-incomplete';\n\n/**\n * @public sendGtmRouteChangeEvent\n * @param {string} stepName - The step's name\n * @description\n * Will send an event to GTM with the current route\n */\nfunction sendGtmRouteChangeEvent(stepName) {\n // This if statement means we're not inside the BScan\n if (!mainContainer) {\n return;\n }\n\n const optOut = mainContainer.getAttribute(gtmOptOut) !== null;\n\n /* eslint no-underscore-dangle: [\"error\", { \"allow\": [\"_ddm\"] }] */\n if (optOut || !window._ddm || !stepName) {\n return;\n }\n\n /* eslint no-underscore-dangle: [\"error\", { \"allow\": [\"_ddm\"] }] */\n window._ddm.trigger('routeChange.ready', {\n data: {\n page: {\n route: stepName\n }\n }\n });\n}\n\n/**\n * @public appendDataToName\n * @param {string} targetStepId - The target step's id\n * @param {string} targetStepName - The target step's name\n * @param {string} currentStepName - The current step's name\n * @returns {string} - An updated targetStepName\n * @description\n * Will append data to the name to create unique step names for GTM\n */\nfunction appendDataToName(targetStepId, targetStepName, currentStepName) {\n let updatedName = targetStepName;\n\n // On the thank you page, append the previous step's name to make the title unique\n if (targetStepId === CONST.bscanSteps.THANKYOU) {\n updatedName = `${targetStepName}-${currentStepName.toLowerCase().replace(/\\s/g, '-')}`;\n }\n\n // If the user has skipped the statements, append a string to make the title unique\n if (window.skipStatements && targetStepId === CONST.bscanSteps.STATEMENTS_DONE) {\n const targetStep = document.querySelector(`[${attrStepId}=\"${targetStepId}\"]`);\n const resourceIncomplete = targetStep && targetStep.getAttribute(attrResourceIncomplete).toLowerCase();\n\n updatedName = `${targetStepName}-${resourceIncomplete}`;\n }\n\n return updatedName;\n}\n\nexport { sendGtmRouteChangeEvent, appendDataToName };\n","'use strict';\n\n/**\n * @public prefillQuestions\n * @description\n * Will prefill questions if an answer is available\n */\nfunction prefillQuestions() {\n if (this.targetStepId in this.givenAnswers && this.targetStep) {\n this.currentStepInput = this.targetStep.querySelector(this.selectors.stepInput);\n\n if (this.currentStepInput && this.givenAnswers[this.targetStepId] !== this.values.skipped) {\n this.currentStepInput.value = this.givenAnswers[this.targetStepId];\n }\n }\n}\n\nexport { prefillQuestions };\n","'use strict';\n\nimport { CONST, documentReady, addEvent } from 'app_vodafone_ziggo/util/util';\nimport { createModalByUrl, refreshToken } from 'Root/modal';\n\n/**\n * @private addBsIdAsHiddenInputField\n * @param {HTMLElement} modal - The modal\n *\n * @description\n * Will add the currentBsId as a hidden input field to the form, necessary for\n * the share-advice and lets-talk forms/modals.\n */\nfunction addBsIdAsHiddenInputField(modal) {\n const adviceStep = document.querySelector('.js-bscan-step.bscan-advice');\n const currentBsId = adviceStep ? adviceStep.getAttribute('data-bscan-id') : null;\n\n if (currentBsId) {\n const form = modal.querySelector('form');\n const fragment = document.createElement('input');\n\n fragment.setAttribute('type', 'hidden');\n fragment.setAttribute('name', 'currentBsId');\n fragment.setAttribute('value', currentBsId);\n\n form.appendChild(fragment);\n }\n}\n\n/**\n * @private addPlpInputFields\n * @param {HTMLElement} modal - The modal\n *\n * @description\n * Populates hidden input fields to the specified modal form containing the 'plp-basket' and plp url attribute value.\n */\nfunction addPlpInputFields(modal) {\n const plpBasket = document.querySelector('vz-plp-sidebar')?.getAttribute('plp-basket');\n const plpBasketInput = modal.querySelector('#plpBasket');\n const plpUrlInput = modal.querySelector('#plpUrl');\n\n if (plpBasketInput) {\n plpBasketInput.setAttribute('value', plpBasket);\n }\n if (plpUrlInput) {\n plpUrlInput.setAttribute('value', window.location.href.split('?')[0]);\n }\n}\n\n/**\n * @private getModal\n * @param {event} event - The event\n *\n * @description\n * Will retrieve the id and url from the link, then create a modal based on the id and url\n */\nfunction getModal(event) {\n event.preventDefault();\n const link = event.target;\n const modalId = link.getAttribute('data-modal-id');\n const modalUrl = link.getAttribute('data-modal-url');\n const isPlp = link.getAttribute('data-page-type') === 'plp';\n\n if (modalId && modalUrl) {\n createModalByUrl(modalId, modalUrl)\n .then((modal) => {\n if (isPlp) {\n addPlpInputFields(modal);\n } else {\n addBsIdAsHiddenInputField(modal);\n }\n })\n .then(refreshToken);\n }\n}\n\n/**\n * @private showModal\n * @param {string} selector - The selector for the modal\n * @param {string} errorMessage - The message to show in the console in case the modal can't be found in the dom\n *\n * @description\n * Will show a specific modal based on parameters\n */\nfunction showModal(selector, errorMessage) {\n const modalElement = document.getElementById(selector);\n let modalInstance = window.bs.Modal.getInstance(modalElement);\n\n if (!modalInstance) {\n modalInstance = new window.bs.Modal(modalElement);\n }\n\n if (modalInstance) {\n modalInstance.show();\n } else {\n console.error(errorMessage);\n }\n}\n\ndocumentReady(() => {\n addEvent(document, CONST.events.click, '.js-modal-link', getModal);\n});\n\nexport { showModal };\n","'use strict';\n\nimport { showModal } from '../components/modal';\nimport { tryParseJSON } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @public insertResponse\n * @param {string} response - The response from the server. We should make this consistent in the future\n */\nfunction insertResponse(response) {\n const parsedResponse = tryParseJSON(response);\n\n if ('html' in parsedResponse) {\n this.mainContainer.insertAdjacentHTML('beforeend', parsedResponse.html);\n } else if (typeof response === 'string' && response.indexOf('bscan-step') >= 0) {\n this.mainContainer.insertAdjacentHTML('beforeend', response);\n } else {\n console.error('fn insertResponse: Unrecognized response type!', response);\n }\n}\n\n/**\n * @public handleError\n * @param {Object} eventObject - The event object, containing the response from the server\n */\nfunction handleError(eventObject) {\n let errorModal = document.querySelector(this.selectors.errorModal);\n\n if (!errorModal) {\n insertResponse(eventObject.detail);\n errorModal = document.querySelector(this.selectors.errorModal);\n }\n\n if (errorModal) {\n errorModal.classList.add(this.CONST.classes.active);\n } else {\n try {\n showModal('try-again-modal', 'Can\\'t find \"try again\" modal');\n } catch {\n console.error('fn handleError: No modal available to show');\n }\n }\n}\n\nexport { insertResponse, handleError };\n","'use strict';\n\nconst selectors = {\n siteHeader: '.page-header',\n scrollArea: '.js-bscan-step.bscan-advice .bscan-step-scroll-area'\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 const positionTop = parseInt(position.top, 10);\n const positionLeft = parseInt(position.left, 10);\n\n const scrollArea = document.querySelector(selectors.scrollArea);\n const supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n if (scrollArea) {\n if (supportsNativeSmoothScroll) {\n scrollArea.scrollTo({\n top: positionTop,\n left: positionLeft,\n behavior: 'smooth'\n });\n } else {\n scrollArea.scrollTop = positionTop;\n }\n } else {\n const stickyHeader = document.querySelector(selectors.siteHeader);\n const headerHeight = stickyHeader ? stickyHeader.offsetHeight : 0;\n\n document.documentElement.scrollTop = positionTop - headerHeight - 15; // Removing an additional 15px to put some space between the sticky site header and the element\n document.body.scrollTop = positionTop - headerHeight - 15; // Removing an additional 15px to put some space between the sticky site header and the element\n }\n}\n\nexport { scrollTo };\n","'use strict';\n\n/**\n * @constant clickPath {Array} - An array of previous steps.\n */\nconst clickPath = [];\n\n/**\n * @public stepForward\n * @param {string} index - The index of the page we just left\n * @returns {string} index;\n */\nfunction stepForward(index) {\n clickPath.push(index);\n return index;\n}\n\n/**\n * @public stepBackward\n * @returns {string} index;\n */\nfunction stepBackward() {\n clickPath.pop();\n return clickPath[clickPath.length - 1];\n}\n\n/**\n * @public keyboardNavigation\n * @param {event} event - The event\n *\n * @description\n * Will allow the user to use the keyboard to navigate through the BScan\n */\nfunction keyboardNavigation(event) {\n if (!this.currentStep) {\n this.currentStep = document.querySelector(`${this.selectors.step}.${this.CONST.classes.active}`);\n }\n\n this.currentStepInput = this.currentStep.querySelector(this.CONST.selectors.form.input);\n\n // Will allow the user to go to the next page by hitting enter, if there are no questions\n if (\n event.key === 'Enter' &&\n !this.currentStepInput &&\n (this.currentStep.classList.contains(this.classes.stepStart) || this.currentStep.classList.contains(this.classes.stepQuestion))\n ) {\n // Doing `form.submit()` will somehow result in `on submit event` not being listened to.\n this.currentStep.querySelector(this.selectors.button.next).click();\n }\n}\n\nexport { stepForward, stepBackward, keyboardNavigation };\n","'use strict';\n\nimport { stepForward, stepBackward } from '../util/navigation';\n\nconst btnBack = document.querySelector('.js-btn-back');\n\n/**\n * @public toggleBackButton\n */\nfunction toggleBackButton() {\n // If it's not the first step, show the back button in the header\n if (this.targetStepIndex.toLowerCase() === this.startStepIndex) {\n this.btnBack.classList.add(this.CONST.classes.hidden);\n } else if (this.targetStepIndex.toLowerCase() === this.firstStepIndex) {\n this.btnBack.classList.add(this.CONST.classes.hidden);\n } else {\n this.btnBack.classList.remove(this.CONST.classes.hidden);\n }\n}\n\n/**\n * @public updateBackButtonLabel\n *\n * @description\n * Will update the text for the button\n */\nfunction updateBackButtonLabel() {\n const currentState = window.history.state;\n\n if (!currentState || (!currentState.stepIndex && !currentState.statementId)) {\n return;\n }\n\n const indexFromHistory = currentState.stepIndex ? currentState.stepIndex : currentState.statementId;\n const indexInStepsOrder = this.stepsOrder.indexOf(indexFromHistory);\n const selectorAttribute = currentState.stepIndex ? this.attributes.stepIndex : this.attributes.statementId;\n const nameAttribute = currentState.stepIndex ? this.attributes.stepName : this.attributes.statementName;\n\n let prevStepIndex = this.stepsOrder[indexInStepsOrder - 1];\n if (!prevStepIndex) {\n return;\n }\n\n prevStepIndex = prevStepIndex.split('__')[0];\n let prevStep = document.querySelector(`[${selectorAttribute}=\"${prevStepIndex}\"]`);\n let prevStepName = prevStep && prevStep.getAttribute(nameAttribute);\n\n if (!prevStepName && currentState.stepIndex) {\n // This is necessary in case you go from statement > step\n prevStep = document.querySelector(`[${this.attributes.statementId}=\"${prevStepIndex}\"]`);\n prevStepName = prevStep && prevStep.getAttribute(this.attributes.statementName);\n } else if (!prevStepName && currentState.statementId) {\n // This is necessary in case you go from step > statement\n prevStep = document.querySelector(`[${this.attributes.stepIndex}=\"${prevStepIndex}\"]`);\n prevStepName = prevStep && prevStep.getAttribute(this.attributes.stepName);\n }\n\n if (prevStepName) {\n btnBack.innerText = prevStepName;\n }\n}\n\n/**\n * @function updateBackButtonTarget\n */\nfunction updateBackButtonTarget() {\n let backButtonId;\n\n // Will update the target for the button\n if (this.goingBack) {\n backButtonId = stepBackward.call(this);\n\n // If we're coming from the thank you page, take an extra step back in order to land back on the advice overview screen\n if (this.currentStepId === this.CONST.bscanSteps.THANKYOU) {\n backButtonId = stepBackward.call(this);\n }\n } else {\n this.currentStepIndex = this.currentStep.getAttribute(this.attributes.stepIndex);\n backButtonId = stepForward(this.currentStepIndex);\n }\n\n btnBack.setAttribute(this.attributes.targetStep, backButtonId);\n\n // Will update the text for the back button\n updateBackButtonLabel.call(this);\n}\n\nexport { toggleBackButton, updateBackButtonTarget, updateBackButtonLabel };\n","'use strict';\n\nimport { CONST } from 'app_vodafone_ziggo/util/util';\nimport { validateForm } from 'app_vodafone_ziggo/util/validation';\n\n/**\n * @constant selector - The selector\n */\nconst selector = '.js-checkbox-sync';\n\n/**\n * @private onChange\n * @param {InputEven} evt - The input event\n */\nfunction onChange(evt) {\n const target = evt.target.getAttribute(CONST.attributes.target);\n document.querySelector(target).checked = evt.target.checked;\n}\n\n/**\n * @public addEvent\n */\nfunction addEvent() {\n Array.from(document.querySelectorAll(selector)).forEach((input) => {\n input.addEventListener(CONST.events.input, onChange);\n });\n}\n\n/**\n * @public updateFieldWithAnswers\n * @param {HTMLElement} clickedButton - the clicked button\n * @description Update hidden input field with the latest version of this.givenAnswers object.\n * This is used for the chat plugin.\n */\nfunction updateFieldWithAnswers(clickedButton) {\n // Remove step pages/answers that are null;\n const filteredAnswers = Object.fromEntries(\n Object.entries(this.givenAnswers)\n .filter(([, value]) => value != null)\n .map(([key, value]) => {\n if (clickedButton.getAttribute(this.attributes.companyInfo.name) && key === this.currentStepId) {\n // If we're in the \"select a company step\", return object with company details\n return [\n key,\n {\n id: clickedButton.getAttribute(this.attributes.companyInfo.id),\n kvkNumber: clickedButton.getAttribute(this.attributes.companyInfo.kvk),\n businessName: clickedButton.getAttribute(this.attributes.companyInfo.name),\n address: clickedButton.getAttribute(this.attributes.companyInfo.address),\n city: clickedButton.getAttribute(this.attributes.companyInfo.city)\n }\n ];\n }\n return [key, value];\n })\n );\n\n document.querySelector(this.selectors.allAnswersField).value = JSON.stringify(filteredAnswers);\n}\n\n/**\n * @public handleQuestionKeyUp\n * @param {event} event - The keyup event\n */\nfunction handleQuestionKeyUp(event) {\n const inputField = event.target;\n const query = inputField.value;\n const regex = inputField.getAttribute(this.CONST.attributes.pattern);\n this.currentStepNextButton = this.currentStep.querySelector(this.selectors.button.next);\n\n validateForm(this.currentStep);\n\n if (query.length > 0) {\n // Remove any character that's not part of the regex if the inputField only accepts numbers\n if (regex && inputField.getAttribute('type') === 'tel') {\n // Created an non-number regex value based on the existing regex\n const invertedRegex = new RegExp(regex.replace('\\\\d', '\\\\D'));\n\n // Update the input field with the new value that perfectly matches the input's regex\n inputField.value = inputField.value.replace(invertedRegex, '');\n }\n }\n\n // In case of a \"question\" step\n if (this.currentStep.classList.contains(this.classes.stepQuestion)) {\n // If, after key up, after possible regex removal, the length is still > 0...\n // reset customValidity to nothing and show the \"next button\"\n if (inputField.value.length > 0) {\n inputField.setCustomValidity('');\n }\n }\n}\n\n/**\n * @public focusFirstInput\n * @description Auto select the first input for UX convenience sake,\n * which also will auto popup the onscreen keyboard for devices that support that\n */\nfunction focusFirstInput() {\n if (this.targetStep && this.targetStep.classList.contains(this.CONST.classes.active) && !this.targetStep.classList.contains(this.classes.introAnimation)) {\n const stepInput = this.targetStep.querySelector(this.CONST.selectors.form.input);\n\n if (stepInput) {\n stepInput.focus();\n }\n }\n}\n\nexport { addEvent as syncCheckboxes, updateFieldWithAnswers, handleQuestionKeyUp, focusFirstInput };\n","'use strict';\n\n/**\n * @public getQuestionGroupAnswers\n * @returns {Array} answers - The grouped questions answers as an array of objects\n */\nfunction getQuestionGroupAnswers() {\n return [...this.groupedQuestions].reduce((groupedQuestions, question) => {\n groupedQuestions.push({\n id: question.getAttribute(this.attributes.groupedQuestionId),\n answer: question.querySelector(this.CONST.selectors.form.input)?.value || 'skipped'\n });\n return groupedQuestions;\n }, []);\n}\n\nexport { getQuestionGroupAnswers };\n","'use strict';\n\nimport { generateUniqueNumber, isMediaBreakpoint } from 'app_vodafone_ziggo/util/util';\nimport { sendGtmRouteChangeEvent } from '../util/gtm';\nimport { updateBackButtonLabel } from '../components/backbutton';\n\n/**\n * @constant {Object} votes - Votes\n * @property {string} votes.agree - The value for agreeing on a statement.\n * @property {string} votes.disagree - The value for disagreeing on a statement.\n * @property {string} votes.neutral - The value for being neutral on a statement.\n */\nconst votes = {\n agree: '1',\n disagree: '0',\n neutral: '-1'\n};\n\n/**\n * @constant {Object} attributes - attributes used for statements\n * @property {String} baseUrl - data-bscan-url\n * @property {String} answer - data-answer\n * @property {String} statementId - data-bscan-statement-id\n * @property {String} statementName - data-bscan-statement-name\n * @property {String} vote - data-vote\n */\nconst attributes = {\n baseUrl: 'data-bscan-url',\n initialized: 'data-inizialized',\n answer: 'data-answer',\n statementId: 'data-bscan-statement-id',\n statementName: 'data-bscan-statement-name',\n uniqueStatementId: 'data-bscan-unique-statement-id',\n vote: 'data-vote'\n};\n\n/**\n * @constant {Object} classes - Classes used for statements\n * @property {string} dragging - dragging\n * @property {string} answered - answered\n */\nconst classes = {\n container: 'bscan-statements',\n dragging: 'dragging',\n answered: 'answered'\n};\n\n/**\n * @constant {Object} selectors - Selectors used for statements\n * @property {string} mainContainer - mainContainer\n * @property {string} btnAgree - btnAgree\n * @property {string} btnDisagree - btnDisagree\n * @property {string} btnVote - btnVote\n * @property {string} btnDisagreeFeedback - btnDisagreeFeedback\n * @property {string} btnAgreeFeedback - btnAgreeFeedback\n * @property {string} statement - statement\n * @property {string} statementText - statementText\n */\nconst selectors = {\n mainContainer: '.js-bscan-main',\n statementsContainer: '.js-bscan-statements',\n btnAgree: `[${attributes.vote}=\"${votes.agree}\"]`,\n btnDisagree: `[${attributes.vote}=\"${votes.disagree}\"]`,\n btnVote: '.js-btn-vote',\n btnDisagreeFeedback: '.js-btn-disagree-feedback',\n btnAgreeFeedback: '.js-btn-agree-feedback',\n btnSkipStatements: '#bscan-skip-questions .js-btn-prompt-confirm',\n statement: '.js-bscan-statement',\n statementText: '.js-bscan-statement-title'\n};\n\n// Global scope\nconst mainContainer = document.querySelector(selectors.mainContainer);\nconst baseUrl = mainContainer && mainContainer.getAttribute(attributes.baseUrl);\nconst baseTitle = document.title;\n\n/**\n * @private handleDragging\n * @param {HTMLElement} statementElement - The statement element\n */\nfunction handleDragging(statementElement) {\n const maxDraggingDistance = isMediaBreakpoint('sm') ? 175 : 100;\n const btnDisagreeFeedback = statementElement.querySelector(selectors.btnDisagreeFeedback);\n const btnAgreeFeedback = statementElement.querySelector(selectors.btnAgreeFeedback);\n\n statementElement.sdrag(\n function onDrag() {\n const element = statementElement; // If i don't do this, eslint will complain about lines 65/66 with `no-param-reassign` 🙃\n const draggedDistance = parseInt(element.style.left, 10);\n const draggedPercentage = Math.abs(draggedDistance / maxDraggingDistance);\n element.style.opacity = 1.4 - draggedPercentage; // Start from 1.4 so it there's a small \"delay\" before it fades out\n element.classList.add(classes.dragging);\n\n if (btnAgreeFeedback && draggedDistance > 0) {\n btnAgreeFeedback.style.opacity = draggedPercentage;\n } else if (btnDisagreeFeedback) {\n btnDisagreeFeedback.style.opacity = draggedPercentage;\n }\n\n // Going right if draggedDistance > 0, otherwise it's left\n const rotateValue = draggedDistance > 0 ? 2 * draggedPercentage : -(2 * draggedPercentage);\n element.style.transform = `translate3d(0, ${20 * draggedPercentage}px, 0) rotate(${rotateValue}deg)`;\n },\n function onStop(element) {\n const draggedDistance = parseInt(element.style.left, 10);\n element.classList.remove(classes.dragging);\n\n if (draggedDistance >= maxDraggingDistance) {\n element.querySelector(selectors.btnAgree).click();\n } else if (draggedDistance <= -maxDraggingDistance) {\n element.querySelector(selectors.btnDisagree).click();\n }\n\n btnAgreeFeedback.style.opacity = 0;\n btnDisagreeFeedback.style.opacity = 0;\n element.removeAttribute('style');\n },\n 'horizontal'\n );\n}\n\n/**\n * @private pushStatementHistoryState\n * @param {HTMLElement} statement - The statement to push\n */\nfunction pushStatementHistoryState(statement) {\n const statementId = statement.getAttribute(attributes.statementId);\n const uniqueStatementId = `${statementId}__${generateUniqueNumber()}`;\n statement.setAttribute(attributes.uniqueStatementId, uniqueStatementId);\n let statementName = statement.getAttribute(attributes.statementName);\n statementName = statementName.replace(/\\s/g, '-');\n\n window.history.pushState(\n {\n html: null,\n sequence: this.historySequence,\n statementId: uniqueStatementId,\n pageTitle: `${baseTitle} - ${statementName}`\n },\n null,\n `${baseUrl}?${statementName}`\n );\n\n this.stepsOrder.push(uniqueStatementId);\n document.title = `${baseTitle} - ${statementName}`;\n updateBackButtonLabel.call(this);\n sendGtmRouteChangeEvent.call(this, statementName);\n}\n\n/**\n * @private handleVote\n * @param {event} event - The click event\n */\nfunction handleVote(event) {\n const voteButton = event.target;\n const currentStatement = voteButton.closest(selectors.statement);\n const currentStatementId = currentStatement.getAttribute(attributes.uniqueStatementId);\n const nextStatement = currentStatement.nextElementSibling;\n const vote = voteButton.getAttribute(attributes.vote);\n\n currentStatement.setAttribute(attributes.answer, vote);\n currentStatement.classList.add(classes.answered);\n currentStatement.classList.remove(this.CONST.classes.active);\n\n // Upon vote, remove any subsequent steps in stepsOrder after the current statement.\n // This is for the case where you skipped the statements, but then go back and answer statements anyway\n this.stepsOrder.length = this.stepsOrder.indexOf(currentStatementId) + 1;\n\n if (nextStatement && nextStatement.classList.contains(selectors.statement.substring(1))) {\n nextStatement.classList.add(this.CONST.classes.active);\n\n // push history state\n pushStatementHistoryState.call(this, nextStatement);\n this.historyChange = false;\n }\n\n window.skipStatements = false;\n}\n\n/**\n * @private resetPreviousStatements\n * @param {HTMLElement} targetStatement - The target statement of which the previous statements should be reset\n */\nfunction resetPreviousStatements(targetStatement) {\n let prevStatement = targetStatement.previousElementSibling;\n while (prevStatement) {\n prevStatement.classList.add(classes.answered);\n prevStatement.classList.remove(this.CONST.classes.active);\n prevStatement = prevStatement.previousElementSibling;\n }\n}\n\n/**\n * @private resetNextStatements\n * @param {HTMLElement} targetStatement - The target statement of which the next statements should be reset\n */\nfunction resetNextStatements(targetStatement) {\n let nextStatement = targetStatement.nextElementSibling;\n while (nextStatement) {\n nextStatement.classList.remove(classes.answered);\n nextStatement.classList.remove(this.CONST.classes.active);\n nextStatement = nextStatement.nextElementSibling;\n }\n}\n\n/**\n * @public statementHistoryUpdate\n * @param {string} statementId - The statement id\n */\nfunction statementHistoryUpdate(statementId) {\n const targetStatement = document.querySelector(`[${attributes.statementId}=\"${statementId}\"]`);\n targetStatement.classList.remove(classes.answered);\n targetStatement.classList.add(this.CONST.classes.active);\n\n // Will update the text for the back button\n updateBackButtonLabel.call(this);\n\n let statementName = targetStatement.getAttribute(attributes.statementName);\n if (statementName) {\n statementName = statementName.replace(/\\s/g, '-');\n document.title = `${baseTitle} - ${statementName}`;\n sendGtmRouteChangeEvent.call(this, statementName);\n }\n\n resetPreviousStatements.call(this, targetStatement);\n resetNextStatements.call(this, targetStatement);\n}\n\n/**\n * @public generateStatementAnswers\n * @returns {Array} answers - The statement answers as an array of objects\n */\nfunction generateStatementAnswers() {\n const statements = this.currentStep.querySelectorAll(selectors.statement);\n\n return Array.from(statements).map((statement) => {\n const statementId = statement.getAttribute(attributes.statementId);\n const statementText = statement.querySelector(selectors.statementText).textContent;\n let answer = votes.neutral;\n\n if (statement.getAttribute(attributes.answer)) {\n answer = parseInt(statement.getAttribute(attributes.answer), 10);\n }\n\n return {\n id: statementId,\n answer: answer,\n text: statementText\n };\n });\n}\n\n/**\n * @public statementBackButtonChecks\n * @return {boolean} disableBackButton - Whether the default back button functionality should be disabled or not\n *\n * @description If we're on the statements step, add custom functionality to the back button to transition between\n * statements instead of steps. If this is the case, return true to prevent the default back button functionality\n */\nfunction statementBackButtonChecks() {\n let disableBackButton = false;\n let statementStep;\n\n // Get the statement step. It could be either this.currentStep (when the user is on the statements step)\n // Or this.targetStep if we're going back from another step to the statements step\n if (this.currentStep && this.currentStep.classList.contains(classes.container)) {\n statementStep = this.currentStep;\n }\n\n if (!statementStep && this.targetStep && this.targetStep.classList.contains(classes.container)) {\n statementStep = this.targetStep;\n }\n\n // If we're still on the statements step\n if (statementStep && statementStep === this.currentStep) {\n const activeStatement = statementStep.querySelector(`${selectors.statement}.${this.CONST.classes.active}`);\n const previousStatement = activeStatement && activeStatement.previousElementSibling;\n\n if (previousStatement) {\n disableBackButton = true;\n activeStatement.classList.remove(this.CONST.classes.active);\n previousStatement.classList.add(this.CONST.classes.active);\n previousStatement.classList.remove(classes.answered);\n previousStatement.removeAttribute(attributes.answer);\n }\n }\n\n // If we're going back (from a step after the statements step) to the statements step, and\n // if all statements are answered, show the last statement again.\n if (this.goingBack && statementStep === this.targetStep) {\n disableBackButton = false;\n const activeStatementLast = statementStep.querySelector(`${selectors.statement}.${this.CONST.classes.last}.${classes.answered}`);\n\n if (activeStatementLast) {\n activeStatementLast.classList.remove(classes.answered);\n activeStatementLast.classList.add(this.CONST.classes.active);\n activeStatementLast.removeAttribute(attributes.answer);\n }\n }\n\n return disableBackButton;\n}\n\n/**\n * @private doVote\n * @param {string} choice - The choice\n */\nfunction doVote(choice) {\n const btnVote = document.querySelector(`${selectors.statement}.${this.CONST.classes.active} [${attributes.vote}=\"${choice}\"]`);\n if (btnVote) {\n btnVote.click();\n }\n}\n\n/**\n * @private handleKeyupEvent\n * @param {event} event - The keyup event\n */\nfunction handleKeyupEvent(event) {\n switch (event.key) {\n case 'ArrowRight':\n doVote.call(this, votes.agree);\n break;\n case 'ArrowLeft':\n doVote.call(this, votes.disagree);\n break;\n case 'ArrowDown':\n doVote.call(this, votes.neutral);\n break;\n default:\n }\n}\n\n/**\n * @private bindKeyboardKeys\n * @description Support keyboard arrows as answers\n */\nfunction bindKeyboardKeys() {\n this.handleKeyupEvent = handleKeyupEvent.bind(this);\n document.addEventListener(this.CONST.events.keyUp, this.handleKeyupEvent);\n}\n\n/**\n * @private unbindKeyboardKeys\n * @description Unbinds the keyboard arrow key event listener from the document.\n */\nfunction unbindKeyboardKeys() {\n document.removeEventListener(this.CONST.events.keyUp, this.handleKeyupEvent);\n}\n\n/**\n * @public initStatements\n * @description Will initialize functionalities for the statements step\n */\nfunction initStatements() {\n const statementsContainer = document.querySelector(selectors.statementsContainer);\n const isInitialized = statementsContainer.getAttribute(attributes.initialized);\n const btnSkipStatements = document.querySelector(selectors.btnSkipStatements);\n\n if (!isInitialized) {\n bindKeyboardKeys.call(this);\n\n statementsContainer.setAttribute(attributes.initialized, true);\n\n Array.from(statementsContainer.querySelectorAll(selectors.statement)).forEach((element) => handleDragging(element));\n Array.from(statementsContainer.querySelectorAll(selectors.btnVote)).forEach((button) => {\n button.addEventListener(this.CONST.events.click, handleVote.bind(this));\n });\n }\n\n if (!this.historyChange) {\n // For the first statement, push a history state\n this.historySequence += 1;\n\n const firstStatement = statementsContainer.querySelector(selectors.statement);\n\n // If we're returning to statements and we're not on the first statement..\n if (firstStatement.classList.contains(classes.answered)) {\n firstStatement.classList.remove(classes.answered);\n firstStatement.classList.add(this.CONST.classes.active);\n\n resetNextStatements.call(this, firstStatement);\n }\n\n pushStatementHistoryState.call(this, firstStatement);\n }\n\n btnSkipStatements.addEventListener(\n this.CONST.events.click,\n function initSkipStatements() {\n window.skipStatements = true;\n statementsContainer.closest(this.selectors.step).classList.add(this.classes.skipped);\n }.bind(this)\n );\n}\n\nexport { generateStatementAnswers, statementBackButtonChecks, statementHistoryUpdate, initStatements, unbindKeyboardKeys };\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\nconst selectors = {\n productIDs: '.js-product-ids'\n};\n\n/**\n * @private getActiveProductIDs\n * @param {Array} advice - An array of advice objects\n * @returns {Array} activeProductIDs - Returns an Array of all active product ID's\n */\nfunction getActiveProductIDs(advice) {\n const activeProducts = advice\n .flatMap((categories) => {\n return categories.products.flatMap((product) => {\n if (product.recommended === true) {\n return product.id;\n }\n return false;\n });\n })\n .filter((productID) => !!productID);\n\n return [...new Set(activeProducts)];\n}\n/**\n * @function setActiveProductIDs\n * @private\n * @param {Array} advice - An array of advice objects\n * @param {HTMLElement} [container=document] - The container in which to search for the productIDs element\n * @description This function sets the active product IDs in the provided container. If no container is provided, it defaults to the document.\n */\nfunction setActiveProductIDs(advice, container = document) {\n const productIDs = container.querySelectorAll(selectors.productIDs);\n const activeProductIDs = getActiveProductIDs(advice).join();\n\n productIDs.forEach((field) => {\n field.value = activeProductIDs;\n });\n}\n\nexport { setActiveProductIDs };\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\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\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\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\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 { 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 * @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\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\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\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 * @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 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\nimport decorators from 'Decorators/index';\nimport { getFieldValidationMessage } from 'Components/form/form';\n\n/**\n * @class VZDateField\n * @param {HTMLInputElement} element - The element to create an instance on\n *\n * @example\n * \n */\nclass VZDateField extends HTMLInputElement {\n constructor() {\n super();\n\n const minDate = this.getAttribute('data-min-date');\n const maxDate = this.getAttribute('data-max-date');\n\n this.minDate = minDate !== null ? new Date(minDate) : null;\n this.maxDate = maxDate !== null ? new Date(maxDate) : null;\n\n this.setFieldStatus = this.setFieldStatus.bind(this);\n\n this.addEventListener('input', this.setFieldStatus);\n this.addEventListener('change', this.setFieldStatus);\n\n this.addEventListener('change', this.validateDate);\n this.addEventListener('change', this.validateField);\n\n this.addEventListener('blur', this.validateDate);\n this.addEventListener('blur', this.validateField);\n\n decorators.valid(this, this);\n\n if (this.hasAttribute('data-mask')) {\n decorators.mask(this, this);\n }\n\n // Set initial state\n this.setFieldStatus();\n }\n\n /**\n * @private setFieldStatus\n * @description\n * Sets an empty class when the element is empty for styling purposes.\n */\n setFieldStatus() {\n const hasValue = this.value.length > 0;\n if (hasValue) {\n this.classList.remove('empty');\n } else {\n this.classList.add('empty');\n }\n }\n\n /**\n * @private validateDate\n * @param {Event} evt - On Blur even\n */\n validateDate(evt) {\n if (evt.target.value.length === 0) return;\n\n const element = evt.target;\n const elValue = element.dataset.value ? element.dataset.value : element.value;\n const elementIsDatepicker = element.classList.contains('js-is-datepicker');\n const [day, month, year] = elValue.split('-');\n const dateValue = `${month}/${day}/${year}`;\n const chosenDate = new Date(dateValue);\n\n let dateIsInvalid = false;\n\n element.dataset.invalid = false;\n element.dataset.invalidMax = false;\n element.dataset.invalidMin = false;\n\n element.setCustomValidity('');\n\n /**\n * BO-3100 & BO-3316:\n * Base date field validation breaks appointment picker date fields.\n * We are using vanillajs-datepicker there so we will rely on it instead for min/max or unavailable dates.\n */\n if (elementIsDatepicker) return;\n\n // Invalid\n if (window.isNaN(chosenDate) || elValue.length < 10) {\n element.dataset.invalid = true;\n dateIsInvalid = true;\n }\n\n // Before min date\n if (this.minDate !== null && chosenDate < this.minDate) {\n element.dataset.invalidMin = true;\n dateIsInvalid = true;\n }\n\n // After max date\n if (this.maxDate !== null && chosenDate > this.maxDate) {\n element.dataset.invalidMax = true;\n dateIsInvalid = true;\n }\n\n // Date is not valid\n if (dateIsInvalid) element.setCustomValidity('invalid');\n }\n\n /**\n * @private validateField\n * @param {Event} evt - blur or invalid event\n * @param {string} [msg] - validation message\n */\n validateField(evt, msg) {\n const message = msg || getFieldValidationMessage(evt.target);\n\n if (message) {\n const element =\n this.parentElement.querySelector('.error-msg') ||\n (function createErrorElement() {\n const el = document.createElement('small');\n\n el.classList.add('error-msg', 'text-primary');\n\n return el;\n })();\n\n element.innerText = message;\n\n evt.target.parentElement.insertAdjacentElement('beforeend', element);\n evt.target.classList.add('invalid');\n evt.target.classList.remove('valid');\n } else {\n const element = this.parentElement.querySelector('.error-msg');\n\n if (element) element.remove();\n\n evt.target.classList.remove('invalid');\n evt.target.classList.add('valid');\n }\n }\n}\n\nexport default window.customElements.get('vz-datefield') || VZDateField;\nif (!window.customElements.get('vz-datefield')) {\n window.customElements.define('vz-datefield', VZDateField, { extends: 'input' });\n}\n","'use strict';\n\nimport { Datepicker } from 'vanillajs-datepicker';\nimport NL from 'vanillajs-datepicker/locales/nl';\nimport moment from 'moment';\n\nimport VZDateField from './VZDateField';\n\nObject.assign(Datepicker.locales, NL);\n\n/**\n * @class VZDatePicker\n * @param {HTMLInputElement} element - The element to create an instance on\n *\n * @example\n *
\n * \n * \n *
\n *
\n *
\n *\n *
\n *
\n *
\n * \n * \n *
\n *
\n *
\n * {DATEPICKER_FORM_GROUP}\n *
\n *
\n */\nclass VZDatePicker extends VZDateField {\n constructor() {\n super();\n\n this.availableDates = this.getAttribute('data-available-dates')?.split(',') || [];\n this.maxDate = this.getAttribute('data-max-date');\n this.minDate = this.getAttribute('data-min-date');\n this.minDateUnFormatted = new Date(this.minDate);\n this.maxDateUnFormatted = new Date(this.maxDate);\n\n this.now = Date.now();\n this.parentElement.setAttribute('id', `c${this.now}`);\n\n this.createDatePicker = this.createDatePicker.bind(this);\n this.datesDisabled = this.datesDisabled.bind(this);\n this.changeDate = this.changeDate.bind(this);\n this.fixUnavailableDateOnBlur = this.fixUnavailableDateOnBlur.bind(this);\n this.setDatePickerDate = this.setDatePickerDate.bind(this);\n this.setDatePickerDefault = this.setDatePickerDefault.bind(this);\n\n this.datepicker = this.createDatePicker();\n\n this.addEventListener('show', this.constructor.setView);\n this.addEventListener('changeView', this.constructor.setView);\n this.addEventListener('changeDate', this.changeDate);\n this.addEventListener('setDatePickerDate', this.setDatePickerDate);\n\n // Invalid date inputs are ignored, so lets listen for the blur event as well\n this.addEventListener('blur', this.fixUnavailableDateOnBlur);\n\n this.setFieldStatus();\n\n // Enable ASAP option\n this.dataAsapDateAttribute = 'data-asap-date';\n this.datePickerContainer = this.parentElement.closest('.js-datepicker-form');\n this.asapToggle = this.datePickerContainer ? this.datePickerContainer.querySelector('input.js-datepicker-asap') : null;\n\n if (this.asapToggle) {\n this.setDatePickerAsap = this.setDatePickerAsap.bind(this);\n this.asapToggle.addEventListener('change', this.setDatePickerAsap);\n }\n }\n\n /**\n * @private setFieldStatus\n * @description\n * Sets an empty class when the element is empty for styling purposes.\n */\n setFieldStatus() {\n const hasValue = this.value.length > 0;\n\n if (hasValue) {\n this.setAttribute('data-value', this.value);\n this.classList.remove('empty');\n } else {\n this.classList.add('empty');\n }\n }\n\n /**\n * @private datesDisabled\n * @param {Date} date - A date object\n * @returns {boolean} - Whether a date should be disabled\n *\n * @description\n * If availableDates is not empty, disable dates that are not in this array\n */\n datesDisabled(date) {\n // If availableDates is empty, do not disable any dates\n if (!this.availableDates || this.availableDates.length === 0) return false;\n\n let day = date.getDate();\n let month = date.getMonth() + 1; // Month is index based, so we need to do +1\n const year = date.getFullYear();\n day = day < 10 ? `0${day}` : day;\n month = month < 10 ? `0${month}` : month;\n\n // Needs to be mm-dd-yyyy for the disable functionality to work\n const dateString = `${month}-${day}-${year}`;\n\n return !this.availableDates.includes(dateString);\n }\n\n /**\n * @private createDatePicker\n * @returns {HTMLElement} - A datepicker element\n *\n * @description\n * Will instantiate a datepicker for this element\n */\n createDatePicker() {\n const options = {\n autohide: true,\n container: `#c${this.now}`,\n defaultViewDate: this.now,\n datesDisabled: this.datesDisabled,\n format: {\n toValue(date) {\n return Datepicker.parseDate(date, 'dd-mm-yyyy', 'nl');\n },\n toDisplay(date) {\n return Datepicker.formatDate(date, 'dd-mm-yyyy', 'nl');\n }\n },\n language: 'nl',\n maxDate: new Date(this.maxDate),\n minDate: new Date(this.minDate),\n nextArrow: '',\n orientation: 'bottom auto',\n prevArrow: '',\n updateOnBlur: true\n };\n\n return new Datepicker(this, options);\n }\n\n /**\n * @private setView\n * @param {Event} evt - Custom event fired by the datepicker\n *\n * @description\n * Sets a data-view attribute used for styling purposes\n */\n static setView(evt) {\n evt.detail.datepicker.picker.element.setAttribute('data-view', evt.detail.viewId);\n }\n\n /**\n * @private getFormattedDate\n * @param {Date} dateObj - A date object\n * @returns {string} formattedDate\n */\n static getFormattedDate(dateObj) {\n const day = `0${dateObj.getDate()}`.slice(-2);\n const month = `0${dateObj.getMonth() + 1}`.slice(-2);\n const year = dateObj.getFullYear();\n\n return `${year}-${month}-${day}`;\n }\n\n /**\n * @private changeDate\n * @param {Event} evt - Custom event fired by the datepicker\n *\n * @description\n * Updates the data-value attribute on the datepicker and triggers form update.\n */\n changeDate(evt) {\n if (evt && evt.detail?.date) {\n this.setAttribute('data-value', this.constructor.getFormattedDate(evt.detail.date));\n\n // If ASAP date was previously selected check if checkbox should be toggled\n if (this.getAttribute(this.dataAsapDateAttribute)) this.resetDatePickerAsap(evt.detail.date);\n } else {\n this.removeAttribute('data-value');\n }\n\n this.closest('form').dispatchEvent(new CustomEvent('change'));\n this.dispatchEvent(new CustomEvent('input'));\n this.blur();\n }\n\n /**\n * @private fixUnavailableDateOnBlur\n * @param {Event} evt - Blur event fired by the datepicker\n *\n * @description\n * Checks if provided date is part of availableDates and if not triggers a value change.\n */\n fixUnavailableDateOnBlur(evt) {\n const newDate = moment(evt.target.value, 'DD-MM-YYYY').format('MM-DD-YYYY');\n\n // If the provided date is not available, automatically set a default value that is available\n if (!this.availableDates.includes(newDate)) this.setDatePickerDefault(newDate);\n }\n\n /**\n * @private setDatePickerDefault\n * @param {string} date - A date string\n *\n * @description\n * Sets datepicker value to `minDateUnFormatted` (if given date is in he past) or `maxDateUnFormatted` (if given date is in the future, or invalid somehow).\n *\n */\n setDatePickerDefault(date) {\n const newDate = moment(date, 'MM-DD-YYYY').isBefore(this.minDate) ? this.minDateUnFormatted : this.maxDateUnFormatted;\n\n // Set new automatic value and refresh date input\n this.datepicker.setDate(newDate);\n\n this.dispatchEvent(new CustomEvent('change'));\n }\n\n /**\n * @private setDatePickerAsap\n *\n * @description\n * Sets datepicker value to `minDate` (first available) on ASAP checkbox checked.\n *\n */\n setDatePickerAsap() {\n if (this.asapToggle.checked) {\n const date = this.momentFormatter(this.minDate);\n\n this.setAttribute(this.dataAsapDateAttribute, date);\n this.datepicker.setDate(date);\n\n // Refresh date field (make sure change event didn't affect checkbox)\n this.dispatchEvent(new CustomEvent('change'));\n\n this.asapToggle.checked = true;\n this.asapToggle.setAttribute('value', true);\n } else {\n this.removeAttribute(this.dataAsapDateAttribute);\n this.asapToggle.setAttribute('value', false);\n }\n }\n\n /**\n * @private setDatePickerDate\n * @param {Event} evt - Custom event fired by other components\n *\n * @description\n * Sets datepicker value to whatever is sent by the component\n *\n */\n setDatePickerDate(evt) {\n if (evt && evt.detail?.date) {\n const asapDate = evt.detail.asap && evt.detail.asap === 'true';\n\n if (asapDate) this.setAttribute(this.dataAsapDateAttribute, evt.detail.date);\n this.datepicker.setDate(evt.detail.date);\n\n // Refresh date field\n this.dispatchEvent(new CustomEvent('change'));\n\n // Handle ASAP toggle\n if (asapDate) {\n this.asapToggle.checked = true;\n this.asapToggle.setAttribute('value', true);\n }\n }\n }\n\n /**\n * @private resetDatePickerAsap\n * @param {string} date - Selected date\n *\n * @description\n * Resets ASAP checkbox if first available date is no longer selected.\n *\n */\n resetDatePickerAsap(date) {\n if (this.getAttribute(this.dataAsapDateAttribute) !== this.momentFormatter(date)) this.asapToggle.checked = false;\n }\n\n /* eslint-disable class-methods-use-this */\n /**\n * @private momentFormatter\n * @param {string} date - Date to be formatted\n * @returns {string} - momentjs formatted date\n *\n * @description\n * Using momentjs to format date to a desired format for vanillajs-datepicker display\n *\n */\n momentFormatter(date) {\n return moment ? moment(date).locale('nl').format('DD-MM-YYYY') : date;\n }\n /* eslint-enable class-methods-use-this */\n}\n\nexport default window.customElements.get('vz-datepicker') || VZDatePicker;\nif (!window.customElements.get('vz-datepicker')) {\n window.customElements.define('vz-datepicker', VZDatePicker, { extends: 'input' });\n}\n","'use strict';\n\nimport { CONST } from 'app_vodafone_ziggo/util/util';\nimport { sendGtmRouteChangeEvent } from '../util/gtm';\nimport initLetsTalk from './letsTalk';\nimport { setActiveProductIDs } from '../components/setActiveProductIDs';\nimport 'Components/form/VZSelect';\nimport 'Components/form/VZDatePicker';\n\n/**\n * @constant {Object} selectors - All used selectors\n * @property {string} toggle - Toggle selector\n */\nconst selectors = {\n mainContainer: '.js-bscan-main',\n column: '.col',\n allAnswersField: '.js-bscan-answers',\n adviceStep: '.js-bscan-step.bscan-advice',\n chatButton: '.dimelo_chat_item_markup',\n ctcElement: '.js-copy-to-clipboard',\n productTile: '.js-bscan-product-tile',\n adviceJSON: '.js-advice-json',\n productIDs: '.js-product-ids',\n notRecommendedWrapper: '.js-not-recommended-products',\n formFields: {\n firstName: '.js-form-first-name',\n lastName: '.js-form-last-name',\n email: '.js-form-email',\n optIn: '.js-form-optin',\n phone: '.js-form-phone'\n },\n pricing: {\n colTotalPrice: '.js-col-total-price',\n totalPrice: '.js-total-price',\n totalPriceContainer: '.js-total-price-container',\n labelQuoteAndPrice: '.js-total-label-quote-and-price',\n labelQuote: '.js-total-label-quote'\n }\n};\n\n/**\n * @constant {Object} attributes - All used attributes\n */\nconst attributes = {\n stepId: 'data-bscan-step-id',\n stepName: 'data-bscan-step-name',\n stepType: 'data-bscan-step-type',\n exclusive: 'data-bscan-exclude',\n productID: 'data-pid',\n productPrice: 'data-product-price',\n productPriceType: 'data-product-price-type'\n};\n\nconst classes = {\n active: 'active',\n adviceAnimation: 'advice-animation'\n};\n\n/**\n * @constant {string} stepEvent - The event step\n */\nconst stepEvent = 'bscan:step';\n\n/**\n * @let {JSON} advice - The returned advice\n */\nlet advice = {};\n\n/**\n * @private updateAdviceObject\n * @param {string} pid - The product ID\n * @param {boolean} status - Add the product to the basket, yes or no.\n */\nfunction updateAdviceObject(pid, status) {\n if (!advice) {\n return;\n }\n\n advice.forEach((category) => {\n category.products.forEach((product, index) => {\n if (product.id === pid) {\n category.products[index].recommended = status; // eslint-disable-line\n }\n });\n });\n\n setActiveProductIDs(advice); // eslint-disable-line no-use-before-define\n\n window.advice = advice;\n}\n\n/**\n * @private setupAdviceObject\n */\nfunction setupAdviceObject() {\n const element = document.querySelector(selectors.adviceJSON);\n if (element && element.value) {\n advice = JSON.parse(element.value);\n document.removeEventListener(stepEvent, setupAdviceStep); // eslint-disable-line no-use-before-define\n }\n}\n\n/**\n * @private setupAdviceStep\n * @param {CustomEvent} evt - Custom event when stepping trough the application\n */\nfunction setupAdviceStep(evt) {\n if (evt.detail === CONST.bscanSteps.ADVICE || document.querySelector(selectors.adviceStep)) {\n setupAdviceObject();\n }\n}\n\n/**\n * @private setupShareAdvice\n */\nfunction setupShareAdvice() {\n document.addEventListener(\n 'keydown',\n (event) => {\n if (event.ctrlKey && event.shiftKey && event.code === 'KeyS') {\n const ctcElement = document.querySelector(`${selectors.adviceStep} ${selectors.ctcElement}`);\n\n if (ctcElement) {\n ctcElement.click();\n }\n }\n },\n false\n );\n}\n\n/**\n * @public initAdvice\n */\nfunction initAdvice() {\n setupAdviceObject();\n setupShareAdvice();\n\n setTimeout(() => {\n document.querySelector(selectors.adviceStep).classList.remove(classes.adviceAnimation);\n }, 5500);\n}\n\n// Set initial value for the advice object once received.\ndocument.addEventListener(stepEvent, setupAdviceStep);\nwindow.addEventListener(CONST.events.load, setupAdviceObject);\n\nconst activeAdviceStep = document.querySelector(`${selectors.adviceStep}.${classes.active}`);\nif (activeAdviceStep) {\n initAdvice();\n}\n\n// When dynamic modals are being loaded, update the advice object and\n// set the product IDs inside the modal if available\ndocument.addEventListener(\n 'modalLoaded',\n (event) => {\n const currentStep = event.detail.modal;\n const modalId = currentStep.getAttribute('id');\n\n updateAdviceObject(currentStep);\n setActiveProductIDs(advice, currentStep);\n\n if (modalId !== 'lead-modal') {\n const currentStepName = currentStep.querySelector(`[${attributes.stepName}]`).getAttribute(attributes.stepName);\n sendGtmRouteChangeEvent(currentStepName);\n }\n\n if (modalId === 'modal-lets-talk') initLetsTalk(currentStep);\n },\n false\n);\n\ndocument.addEventListener(\n 'modalStep',\n (event) => {\n const { currentStep, newStep } = event.detail;\n const currentStepName = currentStep.getAttribute(attributes.stepName);\n const newStepId = newStep.getAttribute(attributes.stepId);\n const newStepName = newStep.getAttribute(attributes.stepName);\n let updatedName = newStepName;\n\n // On the thank you page, append the previous step's name to make the title unique\n if (newStepId === 'bs-thank-you') {\n updatedName = `${newStepName}-${currentStepName.toLowerCase().replace(/\\s/g, '-')}`;\n }\n\n sendGtmRouteChangeEvent(updatedName);\n updateAdviceObject(newStep);\n },\n false\n);\n\nexport { initAdvice };\n","'use strict';\n\nimport { CONST, isMediaBreakpoint } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @private toggleQuitButton\n * @description Replace the close button with a 'back to vodafone' button on the advice step\n */\nfunction toggleQuitButton() {\n const quitButton = document.querySelector(this.selectors.button.quit);\n const closeButton = document.querySelector(this.selectors.button.close);\n const adviceStep = document.querySelector(this.selectors.adviceStep);\n\n if (!quitButton) return;\n\n const isAdviceStep = this.targetStep.getAttribute(this.attributes.stepId) === CONST.bscanSteps.ADVICE;\n const hasSkippedQuestions = adviceStep?.getAttribute(this.attributes.skippedQuestions);\n const outlineBtnStyle = hasSkippedQuestions === 'true' ? 'btn-secondary' : 'btn-outline-secondary';\n const quitBtnClasses = isMediaBreakpoint('md') ? [outlineBtnStyle, 'btn-icon-start'] : ['btn-text'];\n\n quitButton.classList.toggle(CONST.classes.dNone, !isAdviceStep);\n closeButton.classList.toggle(CONST.classes.dNone, isAdviceStep);\n quitButton.classList.toggle(...quitBtnClasses, isAdviceStep);\n}\n\nexport { toggleQuitButton };\n","'use strict';\n\nimport { exists, generateUniqueNumber } from 'app_vodafone_ziggo/util/util';\nimport { validateForm } from 'app_vodafone_ziggo/util/validation';\nimport VZSpinner from 'Components/VZSpinner';\n\nimport { prefillQuestions } from './dataHandling';\nimport { sendGtmRouteChangeEvent, appendDataToName } from './gtm';\nimport { pushHistoryState } from './history';\nimport { insertResponse } from './responseHandling.js';\nimport { scrollTo } from './scrolling.js';\n\nimport { toggleBackButton, updateBackButtonTarget } from '../components/backbutton';\nimport { focusFirstInput, updateFieldWithAnswers } from '../components/form';\nimport { showModal } from '../components/modal';\n\nimport { getQuestionGroupAnswers } from '../steps/questions';\nimport { initStatements, generateStatementAnswers, statementBackButtonChecks, unbindKeyboardKeys } from '../steps/statements';\nimport { initAdvice } from '../steps/advice';\nimport { toggleQuitButton } from '../components/quitbutton';\n\nlet progressCounter = 0;\n\n/**\n * @constant {Spinner} spinner - Spinner component;\n */\nconst spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\n/**\n * @private Will remove the pageTransition class\n */\nfunction removePageTransitionClass() {\n Array.from(document.querySelectorAll(`${this.selectors.step}.${this.classes.pageTransition}`)).forEach((step) => {\n step.classList.remove(this.classes.pageTransition);\n });\n}\n\n/**\n * @public removeSubsequentSteps\n */\nfunction removeSubsequentSteps() {\n let nextStep = this.currentStep.nextElementSibling;\n\n while (nextStep) {\n nextStep.parentNode.removeChild(nextStep);\n nextStep = this.currentStep.nextElementSibling;\n }\n}\n\n/**\n * @private getActiveScreen\n * @returns {HTMLElement} - The active statement or step\n */\nfunction getActiveScreen() {\n const activeStep = document.querySelector(`${this.selectors.step}.${this.CONST.classes.active}`);\n const activeStatement = activeStep && activeStep.querySelector(`${this.selectors.statement}.${this.CONST.classes.active}`);\n return activeStatement || activeStep;\n}\n\n/**\n * @private animateStep\n */\nfunction animateStep() {\n if (!this.currentStep || !this.targetStep) {\n console.error('fn animateStep: this.currentStep or this.targetStep missing');\n return;\n }\n\n // Add the `pageTransition` class to both steps to enable page transitioning\n // If the steps would have transitioning at all times, it won't not look very nice\n // when the screen is getting resized.\n this.targetStep.classList.remove(this.CONST.classes.active);\n this.targetStep.classList.add(this.classes.pageTransition);\n this.currentStep.classList.add(this.classes.pageTransition);\n\n if (!this.pageTransitionDuration) {\n this.pageTransitionDuration = parseFloat(getComputedStyle(this.currentStep).transitionDuration) * 1000;\n }\n\n scrollTo({ top: 0, left: 0 });\n\n // After the page transition is complete, remove the `pageTransition` this.classes.\n // This used to be done by listening to the `transitionEnd` event, but that was giving some buggy results sometimes\n setTimeout(() => {\n removePageTransitionClass.call(this);\n }, this.pageTransitionDuration);\n\n // If we add/remove the active class without a timeout of 0, the css transition is not handled well.\n setTimeout(() => {\n // Add `active` class to target step, then remove `active` class from current step.\n // This order is important for CSS page transitions.\n this.targetStep.classList.add(this.CONST.classes.active);\n this.currentStep.classList.remove(this.CONST.classes.active);\n\n this.currentStep = document.querySelector(`${this.selectors.step}.${this.CONST.classes.active}`);\n }, 0);\n\n // After transitioning to the new page, update the progress indicator\n if (this.targetStep.getAttribute(this.attributes.stepProgIndicator) === 'true') {\n if (this.currentStep.getAttribute(this.attributes.stepProgIndicator) === 'true') {\n progressCounter = this.goingBack ? progressCounter - 1 : progressCounter + 1;\n }\n this.progressIndicator.show();\n this.progressIndicator.activateNextStep(progressCounter);\n } else {\n this.progressIndicator.hide();\n }\n\n // If we transition from the intro page, add an extra class to this.targetStep for\n // a special intro animation\n if (this.currentStep.getAttribute(this.attributes.stepId) === this.CONST.bscanSteps.INTRO) {\n this.targetStep.classList.add(this.classes.introAnimation);\n\n const stepInput = this.targetStep.querySelector(this.CONST.selectors.form.input);\n if (exists(stepInput)) {\n const avatar = this.targetStep.querySelector(this.selectors.avatar);\n const animationDuration = parseFloat(getComputedStyle(avatar).animationDuration) * 1000;\n\n setTimeout(() => {\n // Only add focus if no navigation took place during animation.\n if (this.targetStep && this.targetStep.classList.contains(this.classes.introAnimation)) {\n stepInput.focus();\n }\n }, animationDuration);\n }\n }\n}\n\n/**\n * @public transitionToStep\n */\nfunction transitionToStep() {\n if (!this.currentStep || !this.targetStep || !this.targetStepIndex) {\n console.error('fn transitionToStep: this.currentStep, this.targetStep or this.targetStepIndex missing');\n return;\n }\n\n // Do nothing if this.targetStep is the same as this.currentStep\n if (this.currentStep === this.targetStep) {\n return;\n }\n\n this.targetStepId = this.targetStep.getAttribute(this.attributes.stepId);\n\n /**\n * @private initTransition\n */\n function initTransition() {\n // push custom event with step ID\n document.dispatchEvent(\n new CustomEvent(this.stepEvent, {\n detail: this.targetStep.getAttribute(this.attributes.stepId)\n })\n );\n\n [...this.targetStep.querySelectorAll('vz-carousel')].forEach((carousel) => {\n carousel.goToFirstSlide();\n });\n\n // Always move targetStep to the end of `.bscan-main` for advice pages,\n // so the direction of the step transition is always from the right\n if (!this.goingBack && this.currentStep.classList.contains(this.classes.advicePages)) {\n const lastStep = document.querySelector(`${this.selectors.mainContainer} ${this.selectors.step}:last-child`);\n lastStep.parentNode.insertBefore(this.targetStep, lastStep.nextSibling);\n }\n\n this.targetStep.classList.remove(this.classes.skipped);\n\n animateStep.call(this, this.currentStep, this.targetStep);\n\n // If it's not the first step, show the back button in the header\n setTimeout(\n () => {\n toggleBackButton.call(this);\n toggleQuitButton.call(this);\n },\n this.goingBack ? 0 : this.pageTransitionDuration\n );\n\n // Push the history change for the new step\n if (!this.historyChange) {\n pushHistoryState.call(this); // eslint-disable-line no-use-before-define\n } else {\n // Push this.targetStep into `stepsOrder` if there was a history change\n // This will create a correct order necessary for steps after the `Advice` screen\n this.stepsOrder.push(`${this.targetStepIndex}__${generateUniqueNumber()}`);\n }\n\n updateBackButtonTarget.call(this); // eslint-disable-line no-use-before-define\n updatePageTitle.call(this); // eslint-disable-line no-use-before-define\n\n // Add the current step id to the main container for css purposes\n this.mainContainer.setAttribute(this.attributes.currentStep, this.targetStepId);\n\n // Auto select the first input for UX convenience sake,\n // which also will auto popup the onscreen keyboard for devices that support that\n setTimeout(() => {\n focusFirstInput.call(this);\n }, this.pageTransitionDuration);\n\n // Statements step\n if (this.targetStep.classList.contains(this.classes.statements.container)) {\n initStatements.call(this);\n // Questions step\n } else if (this.targetStep.classList.contains(this.classes.stepQuestion)) {\n unbindKeyboardKeys.call(this);\n // Advice step\n } else if (this.targetStep.classList.contains(this.classes.adviceAnimation)) {\n initAdvice.call(this);\n }\n }\n\n // If a transition delay has been defined, transition with a timeout\n // Once the timeout is done, check to see if the user has not changed step/statement\n if (this.transitionDelay > 0) {\n const currActiveScreen = getActiveScreen.call(this);\n\n setTimeout(() => {\n const newActiveScreen = getActiveScreen.call(this);\n\n // If the screen has changed, do nothing\n if (newActiveScreen === currActiveScreen) {\n initTransition.call(this);\n }\n }, this.transitionDelay);\n } else {\n initTransition.call(this);\n }\n}\n\n/**\n * @public submitAnswer\n * @param {HTMLElement} clickedButton - the clicked button\n * @description Submit the data and retrieve the next step\n */\nfunction submitAnswer(clickedButton) {\n // Answer has changed. Remove subsequent steps as they might be affected.\n if (this.currentStepAnswer && this.currentStepId in this.givenAnswers && this.givenAnswers[this.currentStepId] !== this.currentStepAnswer) {\n removeSubsequentSteps.call(this);\n }\n\n if (this.currentStep.classList.contains(this.classes.stepQuestionGroup)) {\n this.currentStepAnswer.forEach((questionAnswer) => {\n this.givenAnswers[questionAnswer.id] = questionAnswer.answer || null;\n });\n } else {\n this.givenAnswers[this.currentStepId] = this.currentStepAnswer || null;\n }\n\n updateFieldWithAnswers.call(this, clickedButton);\n\n const endpointQuestion = this.mainContainer && this.mainContainer.getAttribute(this.attributes.endpointQuestion);\n const csrfToken = window.csrf.token;\n const csrfName = window.csrf.tokenName;\n\n const formData = new FormData();\n formData.append('index', this.targetStepIndex);\n formData.append(csrfName, csrfToken);\n formData.append('isGroupOfQuestions', this.groupedQuestions.length > 0);\n\n if (this.currentStepAnswer && this.currentStepAnswer !== this.values.skipped) {\n formData.append('questionid', this.currentStepId);\n formData.append('answer', typeof this.currentStepAnswer === 'object' ? JSON.stringify(this.currentStepAnswer) : this.currentStepAnswer);\n }\n\n if (this.currentStepAnswer === this.values.skipped) {\n formData.append('questionid', this.currentStepId);\n formData.append('answer', '');\n }\n\n spinner.start();\n fetch(endpointQuestion, {\n method: 'POST',\n body: formData\n })\n .then((res) => res.text())\n .then((response) => {\n this.targetStep = document.querySelector(`[${this.attributes.stepIndex}=\"${this.targetStepIndex}\"]`);\n\n // If the target step already exists, just transition to it\n if (this.targetStep) {\n transitionToStep.call(this);\n return;\n }\n\n // On success, insert the step's HTML into the dom\n insertResponse.call(this, response);\n\n // Check to see if this.targetStep does indeed exist in the new HTML\n this.targetStep = document.querySelector(`[${this.attributes.stepIndex}=\"${this.targetStepIndex}\"]`);\n\n if (!this.targetStep) {\n console.error('fn goToStep: this.targetStep does not exist');\n\n if (JSON.parse(response).action === 'CSRF-AjaxFail') {\n showModal('ajax-fail-modal', 'Can\\'t find \"ajax fail\" modal');\n } else {\n showModal('try-again-modal', 'Can\\'t find \"try again\" modal');\n }\n\n return;\n }\n\n // Transition to the new step\n transitionToStep.call(this);\n prefillQuestions.call(this);\n })\n .catch((response) => {\n document.dispatchEvent(\n new CustomEvent(this.CONST.events.responseError, {\n detail: response\n })\n );\n })\n .finally(spinner.stop);\n}\n\n/**\n * @public goToStep\n * @param {Event} event - The click/tap event\n * @param {string} targetStepIndex - (optional) The step index to go to\n */\nfunction goToStep(event, targetStepIndex) {\n event.preventDefault();\n let clickedButton;\n this.currentStep = document.querySelector(`${this.selectors.step}.${this.CONST.classes.active}`);\n\n // If there is a stepIndex in the history state, transition to it\n // Please note that any changes done in the current step will not be sent, before transitioning to the other step\n if (event.state && event.state.stepIndex) {\n const trimmedStepIndex = event.state.stepIndex.split('__')[0];\n this.targetStep = document.querySelector(`[${this.attributes.stepIndex}=\"${trimmedStepIndex}\"]`);\n this.targetStepIndex = this.targetStep.getAttribute(this.attributes.stepIndex);\n this.transitionDelay = 0;\n\n if (this.targetStep) {\n transitionToStep.call(this);\n } else {\n // If `this.targetStep` cannot be found, it's likely that this is an old browser history state from before the user has refreshed the page.\n // In that case, nuke the page by forcing a reload, which should remove the old history state due to the empty pushState in `addHistoryListeners`\n window.location = window.location.href;\n }\n\n return;\n }\n\n this.historyChange = false;\n\n // If we're dealing with a form submit, bind the form's button to `clickedButton`\n if (event.type === this.CONST.events.submit) {\n clickedButton = event.target.querySelector(this.selectors.button.next);\n event.preventDefault();\n } else if (event.target) {\n // Else it must be a click on the button itself\n clickedButton = event.target;\n }\n\n if (!clickedButton) {\n console.error('fn goToStep: event submitter unknown');\n return;\n }\n\n // Set all necessary variables\n this.currentStepId = this.currentStep.getAttribute(this.attributes.stepId);\n this.currentStepName = this.currentStep.getAttribute(this.attributes.stepName);\n this.currentStepInput = this.currentStep.querySelector(this.CONST.selectors.form.input);\n this.targetStepIndex = targetStepIndex || clickedButton.getAttribute(this.attributes.targetStep);\n this.targetStep = document.querySelector(`[${this.attributes.stepIndex}=\"${this.targetStepIndex}\"]`);\n this.goingBack = clickedButton.classList.contains(this.selectors.button.back.substring(1));\n this.transitionDelay = (!this.goingBack && clickedButton.getAttribute(this.attributes.delay) * 1000) || 0;\n this.groupedQuestions = this.currentStep.querySelectorAll(this.selectors.groupedQuestions);\n\n // If we're using the back button from the header, just reuse the browser's back functionality\n if (!event.state && this.goingBack) {\n window.history.back();\n return;\n }\n\n // If we're going back to the advice, set `this.goingBack` to true so the step transition animation goes from right to left\n if (clickedButton.classList.contains(this.selectors.button.backToAdvice.substring(1))) {\n this.goingBack = true;\n }\n\n // Release focus of form elements, so it's not possible to submit the form multiple times by pressing enter multiple times\n const validForm = validateForm(this.currentStep);\n clickedButton.blur();\n\n if (this.currentStepInput && validForm) {\n this.currentStepInput.blur();\n }\n\n this.currentStepAnswer = null;\n\n // when selecting a company from the list\n if (clickedButton.getAttribute(this.attributes.stepAnswer)) {\n this.currentStepAnswer = clickedButton.getAttribute(this.attributes.stepAnswer);\n // when having multiple questions in one step\n } else if (this.groupedQuestions.length > 0) {\n this.currentStepAnswer = getQuestionGroupAnswers.call(this);\n // when a value is entered in an input field\n } else if (this.currentStepInput && this.currentStepInput.value) {\n this.currentStepAnswer = this.currentStepInput.value;\n // if the questions are skipped\n } else if (this.currentStep.classList.contains(this.classes.stepQuestion) || this.currentStep.classList.contains(this.classes.stepQuestionGroup)) {\n this.currentStepAnswer = this.values.skipped;\n // is part of statements\n } else if (this.currentStep.classList.contains(this.classes.statements.container)) {\n this.currentStepAnswer = generateStatementAnswers.call(this);\n }\n\n const answerDidNotChange = this.currentStepId in this.givenAnswers && this.givenAnswers[this.currentStepId] === this.currentStepAnswer;\n if (this.goingBack || (answerDidNotChange && this.targetStep)) {\n // If we're going back or we're resubmitting an existing question while the answer has not changed, just transition to the step\n\n transitionToStep.call(this);\n return;\n }\n\n if (\n !this.targetStepIndex || // Stop if `targetStepIndex` is undefined\n (this.goingBack && statementBackButtonChecks.call(this)) || // Stop if we're going back and `statementBackButtonChecks` returns true\n this.currentStep.classList.contains(this.classes.pageTransition) // Stop if a page transition is already active\n ) {\n return;\n }\n\n submitAnswer.call(this, clickedButton);\n}\n\n/**\n * @public skipStep\n * @param {Event} event - The click/tap event\n */\nfunction skipStep(event) {\n this.currentStepInput = document.querySelector(`${this.selectors.step}.${this.CONST.classes.active} ${this.CONST.selectors.form.input}`);\n this.currentStepInput.removeAttribute('required');\n this.currentStepInput.value = '';\n\n goToStep.call(this, event);\n}\n\n/**\n * @public pdLinkHandler\n * @param {Event} event - The click/tap event\n */\nfunction pdLinkHandler(event) {\n const link = event.target;\n const linkTarget = link.getAttribute(this.CONST.attributes.href);\n\n if (!linkTarget || linkTarget.indexOf('bs:') !== 0) {\n return;\n }\n\n event.preventDefault();\n const targetStepValue = linkTarget.split(':')[1];\n\n if (!this.currentStep) {\n this.currentStep = this.currentStep || document.querySelector(`${this.selectors.step}.${this.CONST.classes.active}`);\n }\n\n const currentStepIndex = parseInt(this.currentStep.getAttribute(this.attributes.stepIndex), 10);\n\n let targetStepIndex;\n if (targetStepValue === 'next') {\n targetStepIndex = currentStepIndex + 1;\n } else if (targetStepValue === 'prev') {\n targetStepIndex = currentStepIndex - 1;\n } else {\n targetStepIndex = targetStepValue;\n }\n\n goToStep.call(this, event, targetStepIndex.toString());\n}\n\n/**\n * @public updatePageTitle\n * @param {string} stepName - (Optional) The step's name\n */\nfunction updatePageTitle(stepName) {\n if (stepName) {\n document.title = `${this.baseTitle} - ${stepName}`;\n return;\n }\n\n this.targetStepName = this.targetStep.getAttribute(this.attributes.stepName);\n this.targetStepId = this.targetStep.getAttribute(this.attributes.stepId);\n\n // If there is a target step name and we're not on the statements step\n if (this.targetStepName && !this.targetStep.classList.contains(this.classes.statements.container)) {\n this.targetStepName = this.targetStepName.replace(/\\s/g, '-');\n\n this.targetStepName = appendDataToName(this.targetStepId, this.targetStepName, this.currentStepName);\n\n document.title = `${this.baseTitle} - ${this.targetStepName}`;\n sendGtmRouteChangeEvent.call(this, this.targetStepName);\n }\n}\n\nexport { goToStep, pdLinkHandler, removeSubsequentSteps, skipStep, submitAnswer, transitionToStep, updatePageTitle };\n","'use strict';\n\nimport { generateUniqueNumber } from 'app_vodafone_ziggo/util/util';\nimport { appendDataToName } from '../util/gtm';\nimport { goToStep, transitionToStep } from '../util/spa';\nimport { statementHistoryUpdate } from '../steps/statements';\n\n/**\n * @public pushHistoryState\n */\nfunction pushHistoryState() {\n this.targetStepName = this.targetStep.getAttribute(this.attributes.stepName);\n this.targetStepId = this.targetStep.getAttribute(this.attributes.stepId);\n\n // If there is a target step name\n if (this.targetStepName) {\n this.targetStepName = this.targetStepName.replace(/\\s/g, '-');\n this.historySequence = !this.goingBack ? this.historySequence + 1 : this.historySequence - 1;\n this.lastHistorySequence = this.historySequence;\n\n // If it's not the statements page, push the state\n // There's a separate `pushStatementHistoryState` for the statements page\n if (!this.targetStep.classList.contains(this.classes.statements.container)) {\n const uniqueStepIndex = `${this.targetStepIndex}__${generateUniqueNumber()}`;\n this.stepsOrder.push(uniqueStepIndex);\n this.targetStepName = appendDataToName(this.targetStepId, this.targetStepName, this.currentStepName);\n\n window.history.pushState(\n {\n html: null,\n sequence: this.historySequence,\n stepIndex: uniqueStepIndex,\n pageTitle: `${this.baseTitle} - ${this.targetStepName}`\n },\n null,\n `${this.baseUrl}?${this.targetStepName}`\n );\n }\n }\n}\n\n/**\n * @public addHistoryListeners\n */\nfunction addHistoryListeners() {\n // On page load, push an empty state if the url does not contain an utm code.\n // In case the user reloads the page while being in one of the history's earlier states, this will remove subsequent history states.\n // In other words, it will remove the \"forward\" option from the browser history on page load which can cause for weird scenario's.\n const utmCode = window.location.href.split('utm=');\n const disableUrlUpdate = this.mainContainer.hasAttribute(this.attributes.disableUrlUpdate);\n\n if (utmCode.length < 2 && !disableUrlUpdate && this.baseUrl !== 'null') {\n window.history.pushState({}, null, this.baseUrl);\n }\n\n window.addEventListener(this.CONST.events.popstate, (event) => {\n const pageTitle = event.state && event.state.pageTitle;\n this.historyChange = true;\n this.transitionDelay = 0;\n\n if (pageTitle) {\n this.goingBack = event.state.sequence < this.lastHistorySequence;\n\n if (event.state.stepIndex) {\n goToStep.call(this, event); // eslint-disable-line no-use-before-define\n this.lastHistorySequence = event.state.sequence;\n } else if (event.state.statementId) {\n const statementsStep = document.querySelector(this.selectors.statementsStep);\n\n if (!statementsStep.classList.contains(this.CONST.classes.active)) {\n this.targetStep = statementsStep;\n this.targetStepIndex = this.targetStep.getAttribute(this.attributes.stepIndex);\n transitionToStep.call(this);\n this.lastHistorySequence = event.state.sequence;\n }\n\n const trimmedStatementId = event.state.statementId.split('__')[0];\n statementHistoryUpdate.call(this, trimmedStatementId);\n }\n } else {\n // If we have no state information, it must be the starting page\n this.targetStep = this.firstStep;\n this.targetStepIndex = this.firstStepIndex;\n\n transitionToStep.call(this);\n }\n });\n}\n\nexport { pushHistoryState, addHistoryListeners };\n","'use strict';\n\nimport { documentReady, getPosition } from 'Util/util';\n\nlet lastScrollPos = 0;\nlet elementsToFadeIn = []; // An array of all \"fade in\" elements. Will be filled on page load and emptied once the elements are faded in\nlet currentElements = []; // An array of all elements in view at the time of \"checkElements\"\nlet adviceScrollArea;\n\n// Animation vars\nconst fadeInOffset = 250; // Offset from the bottom of the viewport in pixels, before the element is faded in\nconst fadeInTime = 700; // The time it takes to fade in an element. should match the scss transition time value\nconst staggerDelay = 100; // The delay between each element that needs to fade in on page load\n\nconst selectors = {\n fadeInElements: '.js-fade-in-element:not(.faded-in)',\n adviceScrollArea: '.js-bscan-step.bscan-advice .js-bscan-step-scroll-area'\n};\n\n/**\n * @private updateElementsArrays\n *\n * @description\n * Will update the array of elements to fade in. This is done after some elements have been faded in\n */\nfunction updateElementsArrays() {\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n currentElements = [];\n\n // If there are no more elements, remove the event listener\n if (elementsToFadeIn.length === 0) {\n window.removeEventListener('scroll', checkElements); // eslint-disable-line no-use-before-define\n }\n}\n\n/**\n * @private fadeInElements\n *\n * @description\n * Will loop over all elements currently in view, then fade them in\n * In case of multiple elements, the fade-in's are staggered through an incremental transition delay\n */\nfunction fadeInElements() {\n currentElements.forEach((initialElement, index) => {\n initialElement.style.transitionDelay = `${(index * (fadeInTime + staggerDelay)) / 1000}s`;\n initialElement.classList.add('faded-in');\n });\n\n updateElementsArrays();\n}\n\n/**\n * @private checkElements\n *\n * @description Will check to see if there are any elements that need to fade in once they get into view\n */\nfunction checkElements() {\n const currentScrollPos = adviceScrollArea ? adviceScrollArea.scrollTop : window.pageYOffset || document.documentElement.scrollTop;\n const viewHeight = window.innerHeight;\n const isNotScrollingUp = currentScrollPos >= lastScrollPos;\n\n // If there are elements to fade in, and we're not scrolling up\n if (elementsToFadeIn.length > 0 && isNotScrollingUp) {\n elementsToFadeIn.forEach((element) => {\n // First get the element's position relative to the body (+ a possible offset)\n const elementFadeInPosition = getPosition(element).top + fadeInOffset;\n // Then get the bottom of the current viewport\n const bottomOfViewport = currentScrollPos + viewHeight;\n\n // If the element is placed higher than the bottom of the current viewport, add it to an array of elements to fade in\n if (elementFadeInPosition < bottomOfViewport) {\n currentElements.push(element);\n }\n });\n\n fadeInElements();\n }\n\n lastScrollPos = currentScrollPos <= 0 ? 0 : currentScrollPos;\n}\n\nexport default (function init() {\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n adviceScrollArea = document.querySelector(selectors.adviceScrollArea);\n\n // Check to see if any elements should be faded in\n documentReady(checkElements); // On document ready so the first one is done ASAP\n window.addEventListener('load', checkElements); // Also on window load, because for some reason the 2nd+ elements can sometimes not fade in without this\n\n if (adviceScrollArea) {\n adviceScrollArea.addEventListener('scroll', checkElements);\n } else {\n window.addEventListener('scroll', checkElements);\n }\n\n document.addEventListener('bscan:step', (e) => {\n if (e.detail === 'bs-advice') {\n adviceScrollArea = document.querySelector(selectors.adviceScrollArea);\n if (adviceScrollArea) {\n adviceScrollArea.addEventListener('scroll', checkElements);\n }\n\n elementsToFadeIn = [...document.querySelectorAll(selectors.fadeInElements)];\n checkElements();\n }\n });\n\n // Also do it with a timeout for PageDesigner, seeing as the initial execution (nor window.load) does not seem to do much when inside PD\n if (window.frameElement && window.frameElement.closest('.page-designer-ui')) {\n setTimeout(checkElements.bind(true), 1000);\n setTimeout(checkElements.bind(true), 3000);\n }\n})();\n","'use strict';\n\nimport { CONST, documentReady, addEvent } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @constant {Object} selectors - Selectors used for the Prompt\n * @property {string} promptOpen - .js-btn-prompt-open\n * @property {string} promptCancel - .js-btn-prompt-cancel\n * @property {string} promptConfirm - .js-btn-prompt-confirm\n */\nconst selectors = {\n prompt: '.js-prompt',\n promptOpen: '.js-btn-prompt-open',\n promptCancel: '.js-btn-prompt-cancel',\n promptConfirm: '.js-btn-prompt-confirm',\n chatPromptOpen: '.dimelo_chat_show_when_offline',\n chatClosedPrompt: '#bscan-chat-closed'\n};\n\n/**\n * @private promptOpen\n * @param {event} event - The click event\n */\nfunction promptOpen(event) {\n const button = event.target;\n const target = button.getAttribute(CONST.attributes.target);\n const prompt = document.querySelector(target);\n\n if (prompt) {\n prompt.classList.add(CONST.classes.active);\n }\n}\n\n/**\n * @private promptClose\n * @param {event} event - The click event\n * @param {boolean} confirm - If the \"confirm\" button has been clicked\n */\nfunction promptClose(event, confirm) {\n if (!confirm) {\n event.preventDefault();\n }\n\n const button = event.target;\n const prompt = button.closest(selectors.prompt);\n\n if (prompt) {\n prompt.classList.remove(CONST.classes.active);\n button.blur(); // Remove the focus on the button, necessary for BScan keyboard navigation\n }\n}\n\ndocumentReady(() => {\n addEvent(document, CONST.events.click, selectors.promptOpen, promptOpen);\n addEvent(document, CONST.events.click, selectors.promptCancel, (event) => {\n promptClose(event, false);\n });\n addEvent(document, CONST.events.click, selectors.promptConfirm, (event) => {\n promptClose(event, true);\n });\n\n addEvent(document, CONST.events.click, selectors.chatPromptOpen, (event) => {\n const button = event.target;\n\n if (!button.getAttribute(CONST.attributes.target)) {\n button.setAttribute(CONST.attributes.target, selectors.chatClosedPrompt);\n }\n\n promptOpen(event);\n });\n});\n","'use strict';\n\nimport * as debounce from 'lodash/debounce';\nimport VZSpinner from 'Components/VZSpinner';\nimport { CONST, addEvent, removeChildNodes, removeAccentCharacters } from 'Util/util';\n\nconst selectors = {\n mainContainer: '.js-bscan-main',\n searchStep: '.js-search-company-step',\n searchField: '.js-search-company',\n resultsBox: '.js-search-company-results',\n resultsBoxContainer: '.js-search-company-results-container',\n resultsBoxHeading: '.js-search-company-results-heading',\n resultsBoxList: '.js-search-company-results-list',\n resultsBoxItem: '.js-search-company-results-list .js-btn-next',\n resultsBoxFadeout: '.js-search-company-results-fadeout'\n};\n\nconst classes = {\n inputFieldClear: 'input-clear',\n jsInputFieldClear: 'js-input-clear'\n};\n\nconst attributes = {\n stepTarget: 'data-bscan-step-target',\n minQueryLengthNumber: 'data-min-query-length-number',\n minQueryLengthText: 'data-min-query-length-text'\n};\n\nconst spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\n// Global scope\nlet mainContainer;\nlet searchStep;\nlet stepTarget;\nlet form;\nlet resultsBox;\nlet minQueryLengthNumber;\nlet minQueryLengthText;\nlet searchEndpoint;\n\n// Variables for updateFadeOut\nlet resultsBoxContainer;\nlet resultsBoxHeading;\nlet resultsBoxList;\nlet resultsBoxFadeout;\n\nlet resultsBoxHeight;\nlet resultsBoxChildrenHeight;\nlet resultsBoxFadeoutHeight;\n\n/**\n * @private calculateFadeOutHeight\n *\n * @description\n * Here we calculate at which point during scrolling, the fadeout should move away as we approach the end\n */\nfunction calculateFadeOutHeight() {\n const scrollPos = resultsBoxContainer.scrollTop;\n const pointOfMovingFadeOutAway = resultsBoxChildrenHeight - resultsBoxHeight - resultsBoxFadeoutHeight;\n\n if (scrollPos - pointOfMovingFadeOutAway > 0) {\n resultsBoxFadeout.style.maxHeight = `${resultsBoxFadeoutHeight - (scrollPos - pointOfMovingFadeOutAway)}px`;\n } else {\n resultsBoxFadeout.style.maxHeight = 'none';\n }\n}\n\n/**\n * @private setFadeOutStyling\n */\nfunction setFadeOutStyling() {\n resultsBoxHeight = resultsBoxContainer.clientHeight;\n resultsBoxChildrenHeight = resultsBoxHeading.clientHeight + resultsBoxList.clientHeight;\n\n // If we have a scrollable resultsBox\n if (resultsBoxChildrenHeight > resultsBoxHeight) {\n resultsBoxFadeout.classList.remove(CONST.classes.dNone);\n resultsBoxFadeout.style.width = `${resultsBoxContainer.clientWidth}px`;\n resultsBoxFadeoutHeight = resultsBoxFadeout.clientHeight; // After displaying the fadeout element, retrieve the height\n\n resultsBoxContainer.addEventListener(CONST.events.scroll, updateFadeOut); // eslint-disable-line no-use-before-define\n calculateFadeOutHeight();\n } else {\n resultsBoxFadeout.classList.add(CONST.classes.dNone);\n }\n}\n\n/**\n * @private updateFadeOut\n * @param {event} event - The scroll event\n *\n * @description\n * Will update the position and visibility of the fadeout element\n */\nfunction updateFadeOut(event) {\n // If we don't have the event, it's the initial setup\n if (!event) {\n resultsBoxContainer = document.querySelector(selectors.resultsBoxContainer);\n resultsBoxFadeout = document.querySelector(selectors.resultsBoxFadeout);\n resultsBoxHeading = document.querySelector(selectors.resultsBoxHeading);\n resultsBoxList = document.querySelector(selectors.resultsBoxList);\n\n setFadeOutStyling();\n window.addEventListener(CONST.events.resize, setFadeOutStyling);\n } else {\n // If we do have the event, we're scrolling\n calculateFadeOutHeight();\n }\n}\n\n/**\n * @private searchCompany\n * @param {Event} event - The change event\n */\nfunction searchCompany(event) {\n const searchField = event.target;\n const csrfToken = window.csrf.token;\n const csrfName = window.csrf.tokenName;\n form = form || searchField.closest(CONST.selectors.form.form);\n mainContainer = mainContainer || searchField.closest(selectors.mainContainer);\n searchStep = searchStep || searchField.closest(selectors.searchStep);\n stepTarget = stepTarget || searchStep.getAttribute(attributes.stepTarget);\n resultsBox = resultsBox || (form && form.querySelector(selectors.resultsBox));\n\n if (!form || !resultsBox) {\n console.error('fn searchCompany: form or resultsBox not found');\n return;\n }\n\n minQueryLengthNumber = minQueryLengthNumber || parseInt(mainContainer.getAttribute(attributes.minQueryLengthNumber), 10);\n minQueryLengthText = minQueryLengthText || parseInt(mainContainer.getAttribute(attributes.minQueryLengthText), 10);\n searchEndpoint = searchEndpoint || form.getAttribute(CONST.attributes.action);\n\n const query = removeAccentCharacters(searchField.value);\n const starsWithNumber = Number.isInteger(parseInt(query.charAt(0), 10));\n const minSearchQueryLength = starsWithNumber ? minQueryLengthNumber : minQueryLengthText;\n\n if (query.length >= minSearchQueryLength) {\n const formData = new FormData();\n formData.append(csrfName, csrfToken);\n\n spinner.start();\n fetch(`${searchEndpoint}?q=${query}`, {\n method: 'POST',\n body: formData\n })\n .then((res) => res.json())\n .then((response) => {\n if (response.success) {\n resultsBox.innerHTML = response.html;\n\n searchStep.querySelectorAll(selectors.resultsBoxItem).forEach((item) => item.setAttribute(attributes.stepTarget, stepTarget));\n\n // Init code for the fadeout\n updateFadeOut();\n } else {\n removeChildNodes(resultsBox);\n document.dispatchEvent(\n new CustomEvent(CONST.events.responseError, {\n detail: JSON.stringify(response)\n })\n );\n }\n })\n .finally(spinner.stop());\n } else {\n removeChildNodes(resultsBox);\n }\n}\n\n/**\n * @private clearInputField\n * @param {event} event - The event\n */\nfunction clearInputField(event) {\n const clearInputElement = event.target;\n const inputToClear = clearInputElement.previousElementSibling;\n\n form = form || clearInputElement.closest(CONST.selectors.form.form);\n resultsBox = resultsBox || (form && form.querySelector(selectors.resultsBox));\n\n if (inputToClear) {\n inputToClear.value = '';\n inputToClear.focus();\n inputToClear.classList.add(CONST.classes.empty);\n clearInputElement.parentNode.removeChild(clearInputElement);\n }\n\n if (resultsBox) {\n resultsBox.innerHTML = '';\n }\n}\n\n/**\n * @private addClearInputFieldElement\n * @param {event} event - The event\n */\nfunction addClearInputFieldElement(event) {\n const searchField = event.target;\n form = form || searchField.closest(CONST.selectors.form.form);\n\n if (!form) {\n return;\n }\n\n if (searchField.value.length > 0) {\n // Only add the clearInputElement element if there isn't one yet\n if (!form.querySelector(CONST.selectors.form.inputFieldClear)) {\n const clearInputElement = document.createElement('span');\n clearInputElement.classList.add(classes.inputFieldClear, classes.jsInputFieldClear);\n\n searchField.insertAdjacentElement('afterend', clearInputElement);\n clearInputElement.addEventListener(CONST.events.click, clearInputField);\n }\n } else {\n searchField.classList.add(CONST.classes.empty);\n }\n}\n\naddEvent(document, CONST.events.keyUp, selectors.searchField, debounce(searchCompany, 500));\naddEvent(document, CONST.events.keyUp, selectors.searchField, addClearInputFieldElement);\n","'use strict';\n\nimport { CONST } from 'app_vodafone_ziggo/util/util';\n\n/**\n * @constant {Object} selectors - Used selectors for the Progress Indicator\n * @property {string} wrapper - The wrapper element\n * @property {string} item - An indicator item\n */\nconst selectors = {\n mainContainer: '.js-bscan-main',\n wrapper: '.js-bscan-step-progress',\n item: '.js-bscan-step-progress-item'\n};\n\nconst classes = {\n activeIndicator: 'bscan-active-indicator'\n};\n\n/**\n * @class ProgressIndicator\n */\nclass ProgressIndicator {\n /**\n * @constructor\n * @property {HTMLElement} element - The Progress Indicator\n * @property {function} hide - Hides the progress indicator\n * @property {function} show - Shows the progress indicator\n * @property {function} activateNextStep - Actives the next possible indicator item.\n */\n constructor() {\n this.mainContainer = document.querySelector(selectors.mainContainer);\n this.element = document.querySelector(selectors.wrapper);\n\n this.hide = () => {\n if (this.mainContainer && this.element) {\n this.mainContainer.classList.remove(classes.activeIndicator);\n this.mainContainer.classList.add('hide-progress-indicator');\n this.element.classList.add(CONST.classes.hidden);\n }\n };\n\n this.show = () => {\n if (this.mainContainer && this.element) {\n this.mainContainer.classList.add(classes.activeIndicator);\n this.mainContainer.classList.remove('hide-progress-indicator');\n this.element.classList.remove(CONST.classes.hidden);\n }\n };\n }\n\n /**\n * @method activateNextStep\n * @param {string} targetStepIndex - The next step index to activate\n */\n activateNextStep(targetStepIndex) {\n const index = parseInt(targetStepIndex, 10);\n if (window.isNaN(index)) return;\n\n // Remove the active class from the current active progress indicator item\n const activeIndicatorItem = this.element.querySelector(`${selectors.item}.${CONST.classes.active}`);\n if (activeIndicatorItem) {\n activeIndicatorItem.classList.remove(CONST.classes.active);\n }\n\n // Add the active class to the new progress indicator item based on targetStepIndex\n const targetIndicatorItem = this.element.querySelector(`${selectors.item}:nth-child(${index + 1})`);\n if (targetIndicatorItem) {\n targetIndicatorItem.classList.add(CONST.classes.active);\n }\n }\n}\n\nexport { ProgressIndicator };\n","'use strict';\n\n/**\n * @private getRandomInt\n * @param {number} max - The maximum number\n * @returns {number} - A random number\n */\nfunction getRandomInt(max) {\n return Math.floor(Math.random() * Math.floor(max));\n}\n\n/**\n * @private createImage\n * @param {string} name - The team member's name\n * @param {string} src - The src to use\n */\nfunction createImage(name, src) {\n const img = document.createElement('img');\n img.src = src.replace('avatar-consultant.png', `/businessscan/team/avatar-${name.toLowerCase()}.png`);\n img.classList.add('d-none');\n document.body.appendChild(img);\n}\n\n/**\n * @private initUpdateAvatarAndName\n * @description\n * Loop through each member and replace the avatar\n */\nfunction initUpdateAvatarAndName() {\n const team = ['Arjun', 'Christian', 'Frank', 'Hendrik', 'Henk', 'Jos', 'Jurjen', 'Koen', 'Mykyta', 'Sander'];\n\n let index = getRandomInt(team.length); // Start off at a random position\n const orgAvatarSrc = document.querySelector('.js-bscan-step-avatar').getAttribute('src');\n\n Array.from(team).forEach((memberName) => {\n createImage(memberName, orgAvatarSrc);\n });\n\n /**\n * @private updateAvatarAndName\n */\n function updateAvatarAndName() {\n if (orgAvatarSrc) {\n const name = team[index];\n\n Array.from(document.querySelectorAll('.js-bscan-step-avatar')).forEach((avatar) => {\n const newAvatarSrc = orgAvatarSrc.replace('avatar-consultant.png', `/businessscan/team/avatar-${name.toLowerCase()}.png`);\n avatar.setAttribute('src', newAvatarSrc);\n });\n\n index++;\n\n if (index === team.length) {\n index = 0;\n }\n }\n }\n\n updateAvatarAndName();\n\n setInterval(() => {\n updateAvatarAndName();\n }, 2000);\n}\n\n/**\n * @public initKonamiCode\n * @description\n * Stolen from https://gomakethings.com/how-to-create-a-konami-code-easter-egg-with-vanilla-js/\n */\nfunction initKonamiCode() {\n const pattern = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'];\n let current = 0;\n\n const keyHandler = (event) => {\n // If the key isn't in the pattern, or isn't the current key in the pattern, reset\n if (pattern.indexOf(event.key) < 0 || event.key !== pattern[current]) {\n current = 0;\n return;\n }\n\n // Update how much of the pattern is complete\n current++;\n\n // If complete, alert and reset\n if (pattern.length === current) {\n current = 0;\n initUpdateAvatarAndName();\n }\n };\n\n // Listen for keydown events\n document.addEventListener('keydown', keyHandler, false);\n}\n\nexport { initKonamiCode };\n","'use strict';\n\nimport { sendGtmRouteChangeEvent } from '../util/gtm';\nimport { updatePageTitle } from '../util/spa';\n\nconst stepSelector = '.js-bscan-step.active';\nconst nameAttribute = 'data-bscan-step-name';\nconst indexAttribute = 'data-bscan-step-index';\n\n/**\n * @public initStartPage\n */\nfunction initStartPage() {\n const startStep = document.querySelector(stepSelector);\n const stepName = startStep && startStep.getAttribute(nameAttribute);\n\n if (stepName) {\n sendGtmRouteChangeEvent.call(this, stepName);\n }\n\n if (startStep.getAttribute(indexAttribute) >= 0) {\n updatePageTitle.call(this, stepName);\n }\n}\n\nexport { initStartPage };\n","'use strict';\n\n// Import custom event polyfill, as this is not polyfilled by babel 🙃\nimport 'custom-event-polyfill';\n\nimport { CONST, addEvent } from 'app_vodafone_ziggo/util/util';\n\n// Util/Helpers\nimport 'app_vodafone_ziggo/util/drag';\nimport { addHistoryListeners } from './util/history';\nimport { handleError } from './util/responseHandling.js';\nimport { keyboardNavigation } from './util/navigation';\nimport { goToStep, skipStep, pdLinkHandler } from './util/spa';\n\n// Components\nimport 'app_vodafone_ziggo/VZCarousel';\nimport 'app_vodafone_ziggo/components/fade-in';\nimport 'app_vodafone_ziggo/components/prompt';\nimport 'app_vodafone_ziggo/components/searchCompany';\n\nimport { handleQuestionKeyUp } from './components/form';\nimport { ProgressIndicator } from './components/progressIndicator';\nimport './components/modal.js';\nimport { initKonamiCode } from './components/konami';\n\n// Step specific code\nimport { initStartPage } from './steps/startPage';\n\n// Constants\nconst selectors = {\n mainContainer: '.js-bscan-main',\n step: '.js-bscan-step',\n statementsStep: '.js-bscan-step.bscan-statements',\n stepInput: '.js-bscan-step-input',\n companyListItem: '.js-search-company-results .js-btn-next',\n statement: '.js-bscan-statement',\n statementsSubmit: '.js-bscan-statement .js-btn-next',\n goToAdviceDetail: '.js-bscan-advice-detail',\n goToThankYou: '.js-bscan-to-thankyou',\n productIDs: '.js-product-ids',\n avatar: '.js-bscan-step-avatar',\n allAnswersField: '.js-bscan-answers',\n button: {\n backToAdvice: '.js-back-to-advice',\n back: '.js-btn-back',\n close: '.js-btn-close',\n next: '.js-btn-next',\n pdButton: '.bscan-pd .btn',\n skipQuestion: '.js-btn-skip-question',\n quit: '.js-btn-quit'\n },\n scrollArea: '.bscan-step-scroll-area',\n errorModal: '#general-error',\n groupedQuestions: '.js-grouped-question'\n};\n\nconst attributes = {\n baseUrl: 'data-bscan-url',\n bsFlow: 'data-bscan-flow',\n delay: 'data-bscan-delay',\n disableUrlUpdate: 'data-bscan-disable-url-update',\n endpoint: 'data-bscan-endpoint',\n endpointQuestion: 'data-bscan-endpoint-question',\n currentStep: 'data-bscan-current-step',\n targetStep: 'data-bscan-step-target',\n stepId: 'data-bscan-step-id',\n stepIndex: 'data-bscan-step-index',\n stepAnswer: 'data-bscan-step-answer',\n stepName: 'data-bscan-step-name',\n stepProgIndicator: 'data-bscan-prog-indicator',\n statementId: 'data-bscan-statement-id',\n statementName: 'data-bscan-statement-name',\n videoID: 'data-video-id',\n groupedQuestionId: 'data-bscan-grouped-question-id',\n skippedQuestions: 'data-skipped-questions',\n companyInfo: {\n address: 'data-company-address',\n city: 'data-company-city',\n id: 'data-company-id',\n kvk: 'data-company-kvk',\n name: 'data-company-name'\n }\n};\n\nconst classes = {\n pageTransition: 'page-transition',\n introAnimation: 'intro-animation',\n adviceAnimation: 'advice-animation',\n skipped: 'skipped',\n stepStart: 'bscan-start',\n stepQuestion: 'bscan-question',\n stepQuestionGroup: 'bscan-question-group',\n stepCompanySearch: 'bscan-search-company',\n statements: {\n container: 'bscan-statements'\n },\n advicePages: 'bscan-advice-pages'\n};\n\nconst values = {\n skipped: 'skipped'\n};\n\nclass BusinessScan {\n constructor() {\n this.selectors = selectors;\n this.attributes = attributes;\n this.classes = classes;\n this.values = values;\n this.CONST = CONST;\n this.givenAnswers = {};\n\n this.baseTitle = document.title;\n this.mainContainer = document.querySelector(selectors.mainContainer);\n this.isBsFlow = this.mainContainer.hasAttribute(attributes.bsFlow);\n this.baseUrl = this.mainContainer && this.mainContainer.getAttribute(attributes.baseUrl);\n this.btnBack = document.querySelector(selectors.button.back);\n this.progressIndicator = new ProgressIndicator();\n\n this.stepEvent = 'bscan:step';\n this.firstStep = document.querySelector(selectors.step);\n this.firstStepIndex = this.firstStep.getAttribute(attributes.stepIndex);\n this.startStepIndex = '-1';\n\n this.currentStep = null;\n this.currentStepId = null;\n this.currentStepName = null;\n this.currentStepIndex = null;\n this.currentStepInput = null;\n this.currentStepAnswer = null;\n this.currentStepNextButton = null;\n\n this.targetStep = null;\n this.targetStepId = null;\n this.targetStepIndex = null;\n this.targetStepName = null;\n\n this.goingBack = null;\n this.pageTransitionDuration = null;\n this.lastHistorySequence = null;\n this.historyChange = false;\n this.historySequence = 0;\n this.stepsOrder = [this.firstStepIndex];\n\n this.groupedQuestions = {};\n\n initStartPage.call(this);\n addHistoryListeners.call(this);\n initKonamiCode();\n\n document.addEventListener(CONST.events.keyUp, keyboardNavigation.bind(this));\n document.addEventListener(CONST.events.responseError, handleError.bind(this));\n\n addEvent(document, CONST.events.submit, `${selectors.step}.${CONST.classes.active}`, goToStep.bind(this));\n addEvent(\n document,\n CONST.events.click,\n `\n ${selectors.button.back},\n ${selectors.companyListItem},\n ${selectors.statementsSubmit},\n ${selectors.goToAdviceDetail}\n `,\n goToStep.bind(this)\n );\n addEvent(document, CONST.events.click, `${selectors.button.skipQuestion}`, skipStep.bind(this));\n addEvent(document, CONST.events.click, `${selectors.button.pdButton}`, pdLinkHandler.bind(this));\n addEvent(document, CONST.events.keyUp, selectors.stepInput, handleQuestionKeyUp.bind(this));\n addEvent(document, CONST.events.change, selectors.stepInput, handleQuestionKeyUp.bind(this));\n }\n}\n\n(() => new BusinessScan())();\n","'use strict';\n\nimport Lottie from 'lottie-web/build/player/lottie_light.min';\nconst redSpinnerData = require('./spinners/spinner_animation_min.json');\n\n/**\n * @class VZSpinner\n * @param {HTMLElement} [parent] - Parent element for the spinner to be added in.\n * @description\n * Creates a VZ-Spinner component\n *\n * @example\n * \n *
\n *
\n *
\n *
\n */\nclass VZSpinner extends HTMLElement {\n constructor(parentEl) {\n super();\n\n this.showing = false;\n this.stop = this.stop.bind(this);\n this.veil = null;\n\n const parentElement = parentEl || document.body;\n const location = parentElement.tagName === 'IMG' ? parentElement.parentElement : parentElement;\n location.appendChild(this);\n\n this.lottie = Lottie.loadAnimation({\n container: this.veil.querySelector('.spinner'),\n renderer: 'svg',\n loop: true,\n autoplay: false,\n animationData: redSpinnerData\n });\n }\n\n /**\n * @public\n * @param {string} [msg] - A message to be shown below the spinner.\n * @returns {Promise} promise\n */\n start(msg) {\n return new Promise((resolve) => {\n if (this.showing) resolve();\n const parentPosition = window.getComputedStyle(this.parentElement).getPropertyValue('position');\n\n if (parentPosition === 'static') {\n if (this.parentElement.tagName !== 'BODY') {\n this.parentElement.style.position = 'relative';\n }\n this.parentElement.classList.add('veiled');\n }\n\n if (msg) {\n this.veil.insertAdjacentHTML('beforeend', `
${msg}
`);\n }\n\n this.showing = true;\n setTimeout(() => {\n if (this.showing) {\n this.lottie?.play();\n this.veil.classList.add('show');\n }\n resolve();\n }, 500);\n });\n }\n\n /**\n * @public\n * @returns {Promise} promise\n */\n stop() {\n return new Promise((resolve) => {\n if (!this.showing) resolve();\n if (this.parentElement.classList.contains('veiled')) {\n this.parentElement.style.position = '';\n this.parentElement.classList.remove('veiled');\n }\n\n const content = this.veil.querySelector('.content');\n if (content) content.remove();\n this.veil.classList.remove('show');\n this.showing = false;\n this.lottie?.stop();\n resolve();\n });\n }\n\n connectedCallback() {\n this.innerHTML = `\n
\n
\n
\n
\n `;\n\n this.veil = this.querySelector('.veil');\n this.veil.addEventListener('click', (evt) => evt.stopPropagation());\n }\n}\n\nwindow.VZSpinner = window.customElements.get('vz-spinner') || VZSpinner;\nexport default window.VZSpinner;\n\nif (!window.customElements.get('vz-spinner')) {\n window.customElements.define('vz-spinner', VZSpinner);\n}\n","'use strict';\n\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","import { CONST } from 'Util/util';\nimport { validateForm, validateField } from 'app_vodafone_ziggo/util/validation';\nimport Modal from 'bootstrap/js/src/modal';\nimport VZSpinner from 'Components/VZSpinner';\nimport { appendCsrfToUrl } from 'app_vodafone_ziggo/util/urlUtils';\n\nwindow.bs = window.bs || {};\nwindow.bs.Modal = Modal;\n\nconst spinner = document.querySelector('vz-spinner') || new VZSpinner();\n\nconst selectors = {\n errorModal: 'error-modal',\n activeModal: '.modal.show',\n modalStepContainer: '.js-modal-step-container',\n modalStep: '.js-modal-step',\n modalStepInputs: '.form-control, .custom-control'\n};\n\n/**\n * @function showErrorModal\n * @param {string|null} title - The title of the modal\n * @param {string|null} body - The error message within the modal\n * @param {string|null} cta - The cta text within the modal\n */\nfunction showErrorModal(title, body, cta) {\n const errorModalHtml = `\n
\n
\n
\n
\n

${title}

\n \n
\n\n
\n
\n
${body}
\n
\n
\n\n \n
\n \n
\n
\n
\n
`;\n\n const existingModal = document.getElementById(selectors.errorModal);\n\n if (existingModal) {\n window.bs.Modal.getInstance(existingModal).show();\n } else {\n document.body.insertAdjacentHTML('beforeend', errorModalHtml);\n const modal = new window.bs.Modal(document.getElementById(selectors.errorModal));\n modal.show();\n window.addEventListener(CONST.events.popstate, () => {\n modal.hide();\n });\n }\n}\n\n/**\n * @public resetModalState\n * @param {HTMLElement} modal - A DOM modal element\n *\n * In case of a modal that has multiple steps\n * Loop over the steps to remove the active class\n * and add the active class to the first step\n */\nfunction resetModalState(modal) {\n [...modal.querySelectorAll(selectors.modalStep)].forEach((step, index) => {\n if (index === 0) {\n step.classList.add(CONST.classes.active);\n } else {\n step.classList.remove(CONST.classes.active);\n }\n });\n}\n\n/**\n * @public createModalByUrl\n * @param {string} targetId - The id of the target modal\n * @param {string} targetEndpoint - The url to call which should return the modal html\n * @returns {Promise} - Promise\n *\n * @description\n * Will create/show a modal based on a URL to a pipeline.\n * That pipeline should return a template with the modal HTML for more creative freedom\n */\nfunction createModalByUrl(targetId, targetEndpoint) {\n const modalId = `modal-${targetId}`;\n const existingModal = document.getElementById(modalId);\n\n if (existingModal) {\n return new Promise((resolve) => {\n resetModalState(existingModal);\n window.bs.Modal.getInstance(existingModal).show();\n resolve(existingModal);\n });\n }\n\n spinner.start();\n return fetch(targetEndpoint)\n .then((res) => {\n if (res.status === 500) throw new Error('Fetch failed');\n return res.text();\n })\n .then((response) => {\n document.body.insertAdjacentHTML('beforeend', response);\n\n const modalElement = document.getElementById(modalId);\n const modal = new window.bs.Modal(modalElement);\n\n new ModalClass(modal); // eslint-disable-line\n modal.show();\n document.dispatchEvent(new CustomEvent('custom_modal:shown'));\n return modalElement;\n })\n .catch((response) => {\n console.error('error', response);\n return response;\n })\n .finally(spinner.stop);\n}\n\n/**\n * @class ModalClass\n */\nclass ModalClass {\n constructor(modalInstance) {\n this.modal = modalInstance._element; // eslint-disable-line no-underscore-dangle\n this.modalActiveStep = this.modal.querySelector(`${selectors.modalStep}.${CONST.classes.active}`);\n this.modalFields = [...this.modal.querySelectorAll(selectors.modalStepInputs)];\n\n this.validateModalField = this.validateModalField.bind(this);\n this.submitStepForm = this.submitStepForm.bind(this);\n this.appendModalStep = this.appendModalStep.bind(this);\n\n this.modalFields.forEach((field) => {\n field.addEventListener(CONST.events.blur, (event) => {\n this.lastFocussedField = event.target;\n });\n\n field.addEventListener(CONST.events.keyUp, this.validateModalField);\n field.addEventListener(CONST.events.change, this.validateModalField);\n });\n\n this.modalActiveStep.addEventListener(CONST.events.submit, this.submitStepForm);\n\n const customEvent = new CustomEvent('modalLoaded', {\n detail: {\n modal: this.modal\n }\n });\n document.dispatchEvent(customEvent);\n }\n\n /**\n * @method validateModalField\n * @param {event} event - The submit event\n */\n validateModalField(event) {\n // If we're using tab, make sure to validate the previous field instead of the new field\n if (this.lastFocussedField && event.key && event.key.toLowerCase() === 'tab') {\n validateField(this.lastFocussedField);\n this.lastFocussedField = event.target;\n } else {\n const currField = event.target;\n this.lastFocussedField = currField;\n validateField(currField);\n }\n }\n\n /**\n * @method submitStepForm\n * @param {event} event - The submit event\n */\n submitStepForm(event) {\n event.preventDefault();\n const form = event.target;\n\n const validForm = validateForm(form);\n if (!validForm) {\n return;\n }\n\n const endpoint = form.getAttribute('action');\n const formData = new FormData(form);\n const csrfName = form && form.getAttribute(CONST.attributes.csrfName);\n const csrfToken = form && form.getAttribute(CONST.attributes.csrfToken);\n formData.append(csrfName, csrfToken);\n\n /* eslint-disable no-underscore-dangle */\n if (window._dd && window._dd.user && window._dd.user.ids && window._dd.user.ids.ga_id) {\n formData.append('gaId', window._dd.user.ids.ga_id);\n }\n /* eslint-enable no-underscore-dangle */\n\n spinner.start();\n\n fetch(endpoint, {\n method: 'POST',\n body: formData\n })\n .then((res) => res.text())\n .then(this.appendModalStep)\n .catch((error) => {\n console.error('submitStepForm error', error);\n })\n .finally(spinner.stop);\n }\n\n /**\n * @method scrollToTop\n */\n static scrollToTop() {\n const activeModal = document.querySelector(selectors.activeModal);\n const supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n if (supportsNativeSmoothScroll) {\n activeModal.scrollTo({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n } else {\n activeModal.scrollTop = 0;\n }\n }\n\n /**\n * @method appendModalStep\n * @param {string} response - The response containing the next step\n */\n appendModalStep(response) {\n const modalStepContainer = document.querySelector(`${selectors.activeModal} ${selectors.modalStepContainer}`);\n const currentStep = modalStepContainer.querySelector(`${selectors.modalStep}.${CONST.classes.active}`);\n\n currentStep.classList.remove(CONST.classes.active);\n modalStepContainer.insertAdjacentHTML('beforeend', response);\n\n const newStep = modalStepContainer.querySelector(`${selectors.modalStep}:last-child`);\n newStep.classList.add(CONST.classes.active);\n\n this.constructor.scrollToTop();\n\n const customEvent = new CustomEvent('modalStep', {\n detail: {\n currentStep: currentStep,\n newStep: newStep\n }\n });\n document.dispatchEvent(customEvent);\n }\n}\n\n/**\n * @function refreshToken\n * @description Calls an endpoint to execute authorization when the Business Scan contact me modals are opened - BO-1488.\n */\nfunction refreshToken() {\n const container = document.querySelector('[data-refresh-token-url]');\n const { refreshTokenUrl } = container.dataset;\n if (!refreshTokenUrl) return;\n\n const endpoint = appendCsrfToUrl(refreshTokenUrl);\n\n fetch(endpoint);\n}\n\nexport { showErrorModal, createModalByUrl, refreshToken };\n","if ('serviceWorker' in navigator) {\n window.addEventListener('load', () => {\n if (document.documentElement.dataset.serviceWorkerEnabled === 'true') {\n navigator.serviceWorker.register('/sw.js', { scope: '.' }).catch((e) => {\n console.error('Serviceworker - Registration failed with error '.concat(e));\n });\n } else {\n navigator.serviceWorker.getRegistrations().then((serviceWorkers) => {\n serviceWorkers.forEach((workerInstance) => {\n workerInstance.unregister();\n });\n });\n }\n });\n}\n","'use strict';\n\nconst computedStyles = getComputedStyle(document.documentElement);\n\n/**\n * @constant {Object} events - All common events\n * @property {string} blur - Blur event\n * @property {string} change - Change event\n * @property {string} click - Click event\n * @property {string} keyUp - Keyup event\n * @property {string} load - Load event\n * @property {string} mousedown - Mouse down event\n * @property {string} mouseleave - Mouse leave event\n * @property {string} mouseover - Mouse over event\n * @property {string} popstate - Popstate event\n * @property {string} resize - Resize event\n * @property {string} scroll - Scroll event\n * @property {string} submit - Submit event\n * @property {string} update - Custom update event\n */\nconst events = {\n blur: 'blur',\n change: 'change',\n click: 'click',\n input: 'input',\n keyUp: 'keyup',\n load: 'load',\n mousedown: 'mousedown',\n mouseleave: 'mouseleave',\n mouseover: 'mouseover',\n paste: 'paste',\n popstate: 'popstate',\n resize: 'resize',\n responseError: 'responseError',\n scroll: 'scroll',\n submit: 'submit',\n transitionEnd: 'transitionend',\n update: 'update',\n invalid: 'invalid'\n};\n\n/**\n * @constant {Object} selectors - Common selectors\n * @property {string} body - body\n * @property {Object} form - form related selectors\n * @property {string} checkbox - checkbox\n * @property {string} form - form\n * @property {string} input - input\n * @property {string} inputFieldClear - .js-input-clear\n * @property {string} inputFieldFeedback - .js-invalid-feedback\n * @property {string} label - label\n * @property {string} radio - radio\n * @property {string} select - select\n * @property {string} submit - [type=\"submit\"]\n * @property {string} textarea - textarea\n * @property {string} html - html\n * @property {string} htmlBody - html, body\n * @property {string} img - img\n * @property {string} input - input\n */\nconst selectors = {\n body: 'body',\n form: {\n checkbox: 'input[type=\"checkbox\"]',\n file: 'input[type=\"file\"]',\n form: 'form',\n input: 'input',\n inputFieldClear: '.js-input-clear',\n inputFieldFeedback: '.js-invalid-feedback',\n label: 'label',\n radio: 'input[type=\"radio\"]',\n select: 'select',\n submit: '[type=\"submit\"]',\n textarea: 'textarea'\n },\n html: 'html',\n htmlBody: 'html, body',\n img: 'img',\n input: 'input',\n interactiveElements: 'input, button, select, textarea, a[href]'\n};\n\n/**\n * @constant {Object} classes - Common classes\n * @property {string} active - active\n * @property {Object} buttons - buttons\n * @property {string} next - next\n * @property {string} previous - previous\n * @property {string} warning - warning\n * @property {string} dBlock - d-block\n * @property {string} dFlex - d-flex\n * @property {string} dInlineBlock - d-inline-block\n * @property {string} dNone - d-none\n * @property {string} disabled - disabled\n * @property {string} empty - empty\n * @property {string} inactive - inactive\n * @property {string} invalid - invalid\n * @property {string} hidden - hidden\n * @property {string} last - last\n * @property {string} show - show\n * @property {string} valid - valid\n */\nconst classes = {\n active: 'active',\n buttons: {\n next: 'js-button-next',\n previous: 'js-button-previous',\n warning: 'js-button-warning'\n },\n dBlock: 'd-block',\n dFlex: 'd-flex',\n dInlineBlock: 'd-inline-block',\n dNone: 'd-none',\n disabled: 'disabled',\n empty: 'empty',\n inactive: 'inactive',\n invalid: 'invalid',\n hidden: 'hidden',\n last: 'last',\n show: 'show',\n valid: 'valid'\n};\n\n/**\n * @constant {Object} attributes - Common attributes\n * @property {string} action - action\n * @property {string} class - class\n * @property {string} csrfToken - data-csrf-token\n * @property {string} csrfName - data-csrf-name\n * @property {string} disabled - disabled\n * @property {string} exclude - data-exclude\n * @property {string} href - href\n * @property {string} id - id\n * @property {string} pattern - pattern\n * @property {string} url - url\n * @property {string} readonly - readonly\n * @property {string} target - data-bs-target\n * @property {string} value - value\n * @property {Object} validation - Validation related attributes\n * @property {string} patternMismatch - data-pattern-mismatch\n * @property {string} valueMissing - data-missing-error\n */\nconst attributes = {\n action: 'action',\n class: 'class',\n checked: 'checked',\n csrfToken: 'data-csrf-token',\n csrfName: 'data-csrf-name',\n disabled: 'disabled',\n exclude: 'data-exclude',\n href: 'href',\n id: 'id',\n pattern: 'pattern',\n placeholder: 'placeholder',\n required: 'required',\n readonly: 'readonly',\n selected: 'selected',\n target: 'data-bs-target',\n url: 'url',\n value: 'value',\n validation: {\n patternMismatch: 'data-pattern-mismatch',\n valueMissing: 'data-missing-error',\n tooShort: 'data-too-short'\n }\n};\n\n/**\n * @constant {Object} breakpoints - Common reusable breakpoints\n * @property {string} xxs - 0\n * @property {string} xs - 368\n * @property {string} sm - 576\n * @property {string} md - 768\n * @property {string} lg - 992\n * @property {string} xl - 1200\n * @property {string} xxl - 1400\n */\n\nconst breakpoints = {\n xxs: parseInt(computedStyles.getPropertyValue('--breakpoint-xxs'), 10),\n xs: parseInt(computedStyles.getPropertyValue('--breakpoint-xs'), 10),\n sm: parseInt(computedStyles.getPropertyValue('--breakpoint-sm'), 10),\n md: parseInt(computedStyles.getPropertyValue('--breakpoint-md'), 10),\n lg: parseInt(computedStyles.getPropertyValue('--breakpoint-lg'), 10),\n xl: parseInt(computedStyles.getPropertyValue('--breakpoint-xl'), 10),\n xxl: parseInt(computedStyles.getPropertyValue('--breakpoint-xxl'), 10)\n};\n\n/**\n * @constant {Object} localStorage - constants for local storage items\n * @property {string} preferredLayoutId - preferredLayoutId\n */\nconst localStorage = {\n preferredLayoutId: 'preferredLayoutId'\n};\n\n/**\n * @constant {Object} bscanSteps - constants for Business Scan Steps\n * @property {string} ADVICE - The advice Step\n * @property {string} INTRO - The intro Step\n * @property {string} GROUPED_QUESTIONS - The grouped questions Step\n * @property {string} THANKYOU - The thank you Step\n */\nconst bscanSteps = {\n INTRO: 'intro',\n STATEMENTS_DONE: 'bs-statements-done',\n GROUPED_QUESTIONS: 'js-bscan-question-group',\n ADVICE: 'bs-advice',\n THANKYOU: 'bs-thank-you'\n};\n\n/**\n * @constant {Object} vzLayoutToggle - Attributes used for VZLayoutToggle\n * @property {string} class - data-layout-class\n * @property {string} container - data-layout-container\n * @property {string} enabledBreakpoint - data-layout-enabled-breakpoint\n * @property {string} id - data-layout-id\n * @property {string} idDefault - data-layout-id-default\n * @property {string} localStorageKey - data-layout-key\n */\nconst vzLayoutToggle = {\n class: 'data-layout-class',\n container: 'data-layout-container',\n enabledBreakpoint: 'data-layout-enabled-breakpoint',\n id: 'data-layout-id',\n idDefault: 'data-layout-id-default',\n localStorageKey: 'data-layout-key'\n};\n\nexport default {\n bscanSteps,\n attributes,\n breakpoints,\n classes,\n events,\n selectors,\n localStorage,\n vzLayoutToggle\n};\n","/* esline-disable */\n\n(function () {\n /**\n * CW JvP:\n * Forked from https://github.com/lingtalfi/simpledrag to enable touch events\n *\n * Original Readme:\n *\n * THIS OBJECT WILL ONLY WORK IF your target is positioned relative or absolute,\n * or anything that works with the top and left css properties (not static).\n *\n * Howto\n * ============\n *\n * document.getElementById('my_target').sdrag();\n *\n * onDrag, onStop\n * -------------------\n * document.getElementById('my_target').sdrag(onDrag, null);\n * document.getElementById('my_target').sdrag(null, onStop);\n * document.getElementById('my_target').sdrag(onDrag, onStop);\n *\n * Both onDrag and onStop callback take the following arguments:\n *\n * - el, the currentTarget element (#my_target in the above examples)\n * - pageX: the mouse event's pageX property (horizontal position of the mouse compared to the viewport)\n * - startX: the distance from the element's left property to the horizontal mouse position in the viewport.\n * Usually, you don't need to use that property; it is internally used to fix the undesirable\n * offset that naturally occurs when you don't drag the element by its top left corner\n * (for instance if you drag the element from its center).\n * - pageY: the mouse event's pageX property (horizontal position of the mouse compared to the viewport)\n * - startY: same as startX, but for the vertical axis (and element's top property)\n *\n *\n *\n * The onDrag callback accepts an extra argument: fix.\n *\n * fix is an array used to fix the coordinates applied to the target.\n *\n * It can be used to constrain the movement of the target inside of a virtual rectangle area for instance.\n * Put a variable in the fix array to override it.\n * The possible keys are:\n *\n * - pageX\n * - startX\n * - pageY\n * - startY\n * - skipX\n * - skipY\n *\n * skipX and skipY let you skip the updating of the target's left property.\n * This might be required in some cases where the positioning of the target\n * is automatically done by the means of other css properties.\n *\n *\n *\n *\n *\n *\n * Direction\n * -------------\n * With direction, you can constrain the drag to one direction only: horizontal or vertical.\n * Accepted values are:\n *\n * - (the default)\n * - vertical\n * - horizontal\n *\n *\n *\n *\n */\n\n // simple drag\n function sdrag(onDrag, onStop, direction) {\n var startX = 0;\n var startY = 0;\n var touchStartX = null;\n var touchStartY = null;\n var el = this;\n var dragging = false;\n\n function move(e) {\n var fix = {};\n onDrag && onDrag(el, e.pageX, startX, e.pageY, startY, fix);\n if ('vertical' !== direction) {\n var pageX = 'pageX' in fix ? fix.pageX : e.pageX;\n if (e.touches) {\n pageX = e.touches[0].pageX;\n }\n if ('startX' in fix) {\n startX = fix.startX;\n }\n if (false === 'skipX' in fix) {\n startX = touchStartX || startX;\n el.style.left = pageX - startX + 'px';\n }\n }\n if ('horizontal' !== direction) {\n var pageY = 'pageY' in fix ? fix.pageY : e.pageY;\n if (e.touches) {\n pageY = e.touches[0].pageY;\n }\n if ('startY' in fix) {\n startY = fix.startY;\n }\n if (false === 'skipY' in fix) {\n startY = touchStartY || startY;\n el.style.top = pageY - startY + 'px';\n }\n }\n }\n\n function startDragging(e) {\n if (e.currentTarget instanceof HTMLElement || e.target instanceof HTMLElement) {\n dragging = true;\n var left = el.style.left ? parseInt(el.style.left) : 0;\n var top = el.style.top ? parseInt(el.style.top) : 0;\n startX = (touchStartX ? touchStartX : e.pageX) - left;\n startY = (touchStartY ? touchStartY : e.pageY) - top;\n window.addEventListener('mousemove', move);\n window.addEventListener('touchmove', move);\n } else {\n throw new Error('Your target must be an html element');\n }\n }\n\n this.addEventListener('mousedown', startDragging);\n this.addEventListener('touchstart', function (event) {\n var left = el.style.left ? parseInt(el.style.left) : 0;\n const firstTouch = event.touches[0];\n touchStartX = firstTouch.pageX - left;\n startDragging(firstTouch);\n });\n\n function dragEnded(e) {\n if (true === dragging) {\n dragging = false;\n window.removeEventListener('mousemove', move);\n window.removeEventListener('touchmove', move);\n window.removeEventListener('touchstart', move);\n onStop && onStop(el, e.pageX, startX, e.pageY, startY);\n }\n }\n\n window.addEventListener('mouseup', dragEnded);\n window.addEventListener('touchend', dragEnded);\n }\n\n Element.prototype.sdrag = sdrag;\n})();\n\n/* eslint-enable */\n","'use stict';\n\nimport 'core-js/features/array/at';\n\n/**\n * @private splitUpUrl\n * @param {string} url - The url to split up\n * @returns {Object} values\n *\n * @description\n * Will return an object with different parts of the url\n */\nexport function splitUpUrl(url) {\n if (!url.includes('?')) return {};\n\n let hash;\n let paramUrl = url.split('?').at(1);\n\n // if there is a hash at the end, store the hash\n if (paramUrl.includes('#')) {\n hash = paramUrl.split('#').at(1);\n paramUrl = paramUrl.split('#').at(0);\n }\n\n return {\n domain: url.split('?').at(0),\n params: paramUrl.split('&'),\n hash: hash\n };\n}\n\n/**\n * @public removeParamFromURL\n * @param {string} url - The url from which the parameter will be removed\n * @param {string} name - The name of the parameter that will be removed from url\n * @returns {string} url\n *\n * @description\n * remove the parameter and its value from the given url and returns the\n * changed url\n */\nexport function removeParamFromURL(url, name) {\n if (!url.includes('?') || !url.includes(`${name}=`)) return url;\n\n const urlValues = splitUpUrl(url);\n const newParams = urlValues.params.filter((param) => param.split('=').at(0) !== name);\n\n return `${urlValues.domain}?${newParams.join('&')}${urlValues.hash ? `#${urlValues.hash}` : ''}`;\n}\n\n/**\n * @public getParamFromURL\n * @param {string} url - The url from which the parameter will be retrieved\n * @param {string} name - The name of the parameter that will be retrieved from url\n * @returns {string} The value of the parameter\n *\n * @description\n * remove the parameter and its value from the given url and returns the\n * changed url\n */\nexport function getParamFromURL(url, name) {\n if (!url.includes('?') || !url.includes(`${name}=`)) return url;\n\n const urlValues = splitUpUrl(url);\n const nameMatch = urlValues.params.find((item) => item.includes(`${name}=`));\n\n return nameMatch && nameMatch.split('=').at(1);\n}\n\n/**\n * @public appendParamToURL\n * @param {string} url - The url to which the parameter will be added\n * @param {string} name - The name of the parameter\n * @param {string} value the value of the parameter\n * @returns {string} url\n *\n * @description\n * appends the parameter with the given name and value to the given url\n * and returns the changed url\n */\nexport function appendParamToURL(url, name, value) {\n let newURL = url;\n // remove if the param already exists\n if (url.includes(`${name}=`)) {\n newURL = removeParamFromURL(url, name);\n }\n const separator = newURL.includes('?') ? '&' : '?';\n return `${newURL}${separator}${name}=${encodeURIComponent(value)}`;\n}\n\n/**\n * @public appendCsrfToUrl\n * @description Takes a URL and adds a CSRF token to it\n * @param {string} url - The URL to append the CSRF token on\n * @returns {string} The URL with the CSRF token appended\n */\nexport function appendCsrfToUrl(url) {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${window.csrf.tokenName}=${window.csrf.token}`;\n}\n\n/**\n * @public removeHash\n * @description Will remove the hash from the url\n */\nexport function removeHash() {\n window.history.replaceState({}, document.title, window.location.pathname + window.location.search);\n}\n\nexport const getUrlFromAttributes = (url, component, excludedAttributes) => {\n const newUrl = new URL(url);\n const urlParams = newUrl.searchParams;\n\n // Get all attributeNames except for the irrelevant ones.\n const attributeNames = component.getAttributeNames().filter((attributeName) => !excludedAttributes.includes(attributeName));\n\n // Filter the attributeNames which will be replaced by the new URL.\n attributeNames\n .filter((param) => !urlParams.has(param.replaceAll('-', '')))\n .forEach((attr) => {\n const attrValue = component.getAttribute(attr);\n if (attrValue) {\n const attrName = attr.replaceAll('-', '');\n // Append all other attributes to the new URL\n urlParams.append(attrName, attrValue);\n }\n });\n\n return `${newUrl.origin}${newUrl.pathname}?${urlParams}`;\n};\n\n/**\n * This function checks if the provided element is a part of BM Hardware card. In case of true it appends\n * the 'editIndex' parameter to the URL with the index of the current BM Hardware card, in order to keep the\n * card open after Product-Variation ajax.\n *\n * @public appendBmHardwareCardIndex\n * @param {HTMLElement} element - The HTML element triggering the ajax.\n * @param {string} url - The URL to which the parameter will be appended.\n * @returns {string} The modified URL with the appended parameter.\n */\nexport function appendBmHardwareCardIndex(element, url) {\n let newURL = url;\n if (!element.closest('.js-hardware-device-card')?.classList.contains('is-collapsed') && element.closest('.js-hardware-phones')) {\n newURL = appendParamToURL(url, 'editIndex', element.closest('.js-hardware-phones').dataset.index);\n }\n return newURL;\n}\n","'use strict';\n\nimport CONST from './constants';\n\n/**\n * addEvent - Will add an event listener to an element inside a parent\n *\n * @param {string} parent - The parent element\n * @param {string} passedEvent - The event\n * @param {string} selector - The targeted element\n * @param {function} handler - The handler\n */\nfunction addEvent(parent, passedEvent, selector, handler) {\n parent.addEventListener(\n passedEvent,\n function fnAddEvent(event) {\n // If the clicked element matches the selector, or is a child of the selector\n if (event.target.matches(`${selector} , ${selector} *`)) {\n handler.apply(event.target.closest(selector), arguments);\n }\n },\n false\n );\n}\n\n/**\n * @public documentReady\n * @param {Function} fn - function to be called after document is done loading.\n */\nfunction documentReady(fn) {\n if (document.readyState !== 'loading') {\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n}\n\n/**\n * @public exists\n * @param {*} selection - The element or nodelist to verify for existence\n * @returns {boolean} - Boolean value stating the existance of the selection\n * @description\n * Verifies existance of a certain element by checking for type, null and length\n * Usage: use with either querySelector() or querySelectorAll()\n * querySelector will not have a 'length', e.g. this would return true if other conditions are true\n * querySelectorAll will have a 'length', e.g. this would return true if all conditions are true\n */\nfunction exists(selection) {\n return typeof selection !== 'undefined' && selection !== null && ('length' in selection ? selection.length > 0 : true);\n}\n\n/**\n * @public getPosition\n * @param {*} element - The element to get the position for\n * @returns {Object} - An object containing the left and top position of the element\n *\n * @description\n * Will get the position of an element relative to the document\n */\nfunction getPosition(element) {\n let top = element.offsetTop;\n let left = element.offsetLeft;\n\n let currentElement = element;\n while (currentElement.offsetParent && currentElement.offsetParent !== window) {\n currentElement = currentElement.offsetParent;\n top += currentElement.offsetTop;\n left += currentElement.offsetLeft;\n }\n\n return { left, top };\n}\n\n/**\n * isKeyInObject\n * @param {Object} object - The object\n * @param {string} key - The key\n * @returns {boolean} - True or false\n */\nfunction isKeyInObject(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * @private isAemMobileView\n * @returns {boolean} - Whether the user is on a \"mobile\" viewport or not based on AEM rules\n *\n * @description\n * Checks to see whether the user is on a \"mobile\" viewport or not based on AEM rules\n * Please note that www.vodafone.nl/zakelijk will show the mobile menu from viewports 1023 and smaller\n */\nfunction isAemMobileView() {\n return window.innerWidth < 1024;\n}\n\n/**\n * @memberof util\n * @param {string} breakpointKey from constants that should match css breakpoint\n * @param {boolean} [isUp] by default is true since mobile first, reverses condition\n * @return {boolean} whether window is larger than specified breakpoint\n */\nfunction isMediaBreakpoint(breakpointKey, isUp = true) {\n if (!isKeyInObject(CONST.breakpoints, breakpointKey)) {\n console.error(`fn isMediaBreakpoint: ${breakpointKey} -- does not exist in constants breakpoints object`); // eslint-disable-line\n }\n\n const outerWidth = window.innerWidth;\n const breakpointValue = parseInt(CONST.breakpoints[breakpointKey], 10);\n\n return isUp ? outerWidth > breakpointValue : outerWidth < breakpointValue - 1;\n}\n\n/**\n * @memberof util\n * @return {Object} An object containing the name and value of the current breakpoint\n */\nfunction getCurrentBreakpoint() {\n const breakpoints = CONST.breakpoints;\n const screenSize = document.documentElement.clientWidth;\n const currentBreakpoint = [...Object.keys(breakpoints)].reverse().find((key) => screenSize > breakpoints[key]);\n\n return {\n name: currentBreakpoint,\n value: breakpoints[currentBreakpoint]\n };\n}\n\n/**\n * @memberof util\n * @return {number} a unique number\n */\nfunction generateUniqueNumber() {\n return performance.now().toString().replace('.', 0);\n}\n\n/**\n * @public empty\n * @param {*} element - The element to remove child nodes from\n * @description\n * Empties a given element completely while the given element has child nodes.\n * Plain strings are also considered child nodes and are thus also removed.\n */\nfunction removeChildNodes(element) {\n while (element.hasChildNodes()) {\n element.removeChild(element.lastChild);\n }\n}\n\n/**\n * @public tryParseJSON\n * @param {string} string - The possible JON string\n * @returns {Object} - Either the JSON object or an empty object for consistent return\n * @description\n * Copied from https://stackoverflow.com/a/20392392\n */\nfunction tryParseJSON(string) {\n try {\n const o = JSON.parse(string);\n\n // Handle non-exception-throwing cases:\n // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,\n // but... JSON.parse(null) returns null, and typeof null === \"object\",\n // so we must check for that, too. Thankfully, null is falsey, so this suffices:\n if (o && typeof o === 'object') {\n return o;\n }\n } catch (e) {} // eslint-disable-line no-empty\n\n return {};\n}\n\n/**\n * @function isIOS\n * @public\n * @description returns a boolean to determine whether a device's OS is IOS or not\n * @returns {boolean} whether the device OS is IOS or not\n */\nfunction isIOS() {\n return (/iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream;\n}\n\n/**\n * @function isMobile\n * @returns {boolean} whether the device is an mobile device or not\n */\nfunction isMobile() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * @public scrollTo\n * @param {Object} data - The optional object containing the top & left positions to scroll to\n */\nfunction scrollTo(data) {\n const position = data || {\n top: 0,\n left: 0\n };\n\n const stickyHeader = document.querySelector('.page-header');\n const headerHeight = stickyHeader ? stickyHeader.offsetHeight : 0;\n const supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n let positionTop = position.top;\n\n if (headerHeight > 0) {\n positionTop = position.top - headerHeight - 15; // Removing an additional 15px to put some space between the sticky site header and the element\n }\n\n if (supportsNativeSmoothScroll) {\n document.documentElement.scrollTo({\n top: positionTop,\n left: position.left,\n behavior: 'smooth'\n });\n } else {\n document.documentElement.scrollTop = positionTop;\n }\n}\n\n/**\n * @function toggleButtonState\n * @description Enables or disabled the button passed in based on the value of the second parameter.\n * @param {HTMLElement} button - A button element to be enabled or disabled.\n * @param {boolean} enable - True for enable and false for disable.\n */\nfunction toggleButtonState(button, enable) {\n if (enable) {\n button.classList.remove('disabled');\n button.removeAttribute('disabled');\n } else {\n button.classList.add('disabled');\n button.setAttribute('disabled', 'disabled');\n }\n}\n\n/**\n * @function removeAccentCharacters\n * @description Removes a accents from a string.\n * @param {string} string - The string from which we want to remove accents.\n * @returns {string} The string without accents.\n */\nfunction removeAccentCharacters(string) {\n return string.normalize('NFD').replace(/\\p{Diacritic}/gu, '');\n}\n\n/**\n * @function chunkArrayInGroups\n * @param {Array} arr - Array to be splitted\n * @param {number} size - Max size of the array chunk\n * @return {Array} - Array of grouped chunks\n * @description Splitting an array up into chunks of a given size\n */\nfunction chunkArrayInGroups(arr, size) {\n var groupedChunks = [];\n for (let i = 0; i < arr.length; i += size) {\n groupedChunks.push(arr.slice(i, i + size));\n }\n return groupedChunks;\n}\n\n/**\n * @function chunkGroupArrayInGroups\n * @param {Array} groupArr - Array to be splitted\n * @return {Array} - Array of grouped chunks\n * @description Splitting an array up into chunks of a given size\n */\nfunction chunkGroupArrayInGroups(groupArr) {\n // This one sorts and groups the alike product groups together\n // We need to send the requests to backend in a specific order, so we make it grouped\n const chunkGroups = [];\n Object.keys(groupArr).forEach((groupKey) => {\n const arr = groupArr[groupKey];\n const groupedChunks = [];\n // Sorts the product objects based on pids\n arr.sort((a, b) => {\n return a.pid >= b.pid ? 1 : -1;\n });\n for (let i = 0; i < arr.length; i += Math.round(arr.length / 3)) {\n groupedChunks.push(arr.slice(i, i + Math.round(arr.length / 3)));\n }\n // This makes sure that we have a separate business mobile group to send to backend\n groupedChunks.forEach((chunk, chunkIndex) => {\n Object.keys(chunk).forEach((key, index) => {\n const item = chunk[key];\n if (item?.pdpConfiguratorType === 'business-mobile') {\n chunk.splice(index, 1);\n if (chunk.length < 1) groupedChunks.splice(chunkIndex, 1);\n groupedChunks.push(item);\n }\n });\n });\n chunkGroups.push(groupedChunks);\n });\n return chunkGroups;\n}\n\n/**\n * @function trackPdpEccomerceEvent\n * @param {string} productType - Configurator type\n * @param {Object} step - Step to track\n * @description Builds and submits ecommerce event to track btn clicks on PDP\n */\nfunction trackPdpEccomerceEvent(productType, step) {\n const products = {\n brand: 'vodafone',\n category: `business-sme/acquisition/postpaid/${productType.replace(/\\s|business-/gi, '')}`,\n market: 'b2b'\n };\n\n const ecommerceObject = {\n event: 'checkout',\n events: {\n category: 'ecommerce',\n action: 'checkout'\n },\n ecommerce: {\n checkout: {\n action: 'checkout',\n has_vodafone: true,\n has_ziggo: true,\n products: products,\n step_name: step.name,\n step_nr: step.number\n }\n }\n };\n\n /* eslint-disable no-underscore-dangle */\n if (ecommerceObject && window._ddm) {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(ecommerceObject);\n window._ddm.trigger('ecommerce.checkout', {\n data: ecommerceObject.ecommerce.checkout\n });\n }\n /* eslint-enable no-underscore-dangle */\n}\n\n/**\n * @function assignStyling\n * @private\n * @param {Element} el - Element\n * @param {Object} styles - Styles\n * @description Assign a style object to an element\n */\nfunction assignStyling(el, styles) {\n Object.assign(el.style, styles);\n}\n\n/**\n * Calculate the total width of a collection of elements.\n *\n * @param {NodeListOf} elements - A collection of HTML elements.\n * @param {number} spacing - flex gap value in px.\n * @returns {number} The total width of all elements.\n */\nfunction getTotalWidth(elements, spacing = 0) {\n return Array.from(elements).reduce((totalWidth, element) => {\n const elementStyles = window.getComputedStyle(element);\n const elementWidth = element.offsetWidth + parseFloat(elementStyles.marginLeft) + parseFloat(elementStyles.marginRight);\n return totalWidth + elementWidth;\n }, spacing);\n}\n\n/**\n * Checks if a flex container is wrapped by comparing the total width of its flex items\n * with the container's width.\n *\n * @param {HTMLElement} flexContainer - The HTML element representing the flex container.\n * @param {NodeListOf} flexItems - A collection of HTML elements representing the flex items.\n * @param {number} spacing - flex gap value in px.\n * @returns {boolean} True if the flex container is wrapped, false if all items fit in a single row.\n */\nfunction isFlexContainerWrapped(flexContainer, flexItems, spacing) {\n const containerWidth = flexContainer.clientWidth;\n const itemsTotalWidth = getTotalWidth(flexItems, spacing);\n // Check if the items are wrapped by comparing their total width with the container width.\n const isWrapped = itemsTotalWidth > containerWidth;\n return isWrapped;\n}\n\n/**\n * @function loadCSS\n * @param {string} url - The URL of the CSS file to load.\n * @description Creates a link element and appends it to the document head to load a CSS file.\n */\nfunction loadCSS(url) {\n if (!url || document.querySelector(`link[href=\"${url}\"]`)) {\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n document.head.appendChild(link);\n}\n\n/**\n * The function formats input to money string\n *\n * @param {number} num Source number\n * @returns {string} Formatted string € 1.111,11\n */\nfunction formatToPriceString(num) {\n const parts = Number.parseFloat(num, 10).toFixed(2).toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n if (parts[1] === '00') {\n return `€ ${parts[0]},00`;\n }\n return `€ ${parts.join(',')}`;\n}\n\n/**\n * Checks if two arrays of objects are equal by comparing their elements.\n *\n * @param {Array} arr1 - The first array to compare.\n * @param {Array} arr2 - The second array to compare.\n * @returns {boolean} True if the arrays are equal, false otherwise.\n */\nfunction arraysAreEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n return (\n !arr1.some((obj1) => !arr2.some((obj2) => JSON.stringify(obj1) === JSON.stringify(obj2))) &&\n !arr2.some((obj2) => !arr1.some((obj1) => JSON.stringify(obj1) === JSON.stringify(obj2)))\n );\n}\n\nexport {\n CONST,\n addEvent,\n documentReady,\n exists,\n generateUniqueNumber,\n getCurrentBreakpoint,\n getPosition,\n isIOS,\n isMobile,\n isKeyInObject,\n isAemMobileView,\n isMediaBreakpoint,\n removeChildNodes,\n scrollTo,\n tryParseJSON,\n toggleButtonState,\n removeAccentCharacters,\n chunkArrayInGroups,\n chunkGroupArrayInGroups,\n trackPdpEccomerceEvent,\n assignStyling,\n isFlexContainerWrapped,\n getTotalWidth,\n loadCSS,\n formatToPriceString,\n arraysAreEqual\n};\n","'use strict';\n\nimport { CONST } from 'Util/util';\nimport { getFieldValidationMessage } from 'Components/form/form';\n\nconst validationAttributes = ['valueMissing', 'patternMismatch', 'tooShort'];\n\n/**\n * toggleValidityClass\n * @param {boolean} [isValid] - valid or not - true or false\n * @param {HTMLElement} [target] - target element\n */\nfunction toggleValidityClass(isValid, target) {\n if (isValid) {\n target.classList.remove('invalid');\n target.classList.add('valid');\n } else {\n target.classList.add('invalid');\n target.classList.remove('valid');\n }\n}\n\n/**\n * removeValidationMessageElement\n * @param {HTMLElement} [target] - target element\n */\nfunction removeValidationMessageElement(target) {\n const element = target.parentElement.querySelector('.error-msg');\n if (element) element.remove();\n}\n\n/**\n * createValidationMessageElement\n * @param {string} [message] - validation message\n * @param {HTMLElement} [target] - target element\n */\nfunction createValidationMessageElement(message, target) {\n const element =\n target.parentElement.querySelector('.error-msg') ||\n (function createErrorElement() {\n const el = document.createElement('small');\n el.classList.add('error-msg', 'text-primary');\n return el;\n })();\n element.innerText = message;\n if (target.dataset.selectedId && target.dataset.selectedId.includes('verblijfsdocument')) element.classList.add('d-inline-flex');\n target.parentElement.insertAdjacentElement('beforeend', element);\n}\n\n/**\n * @public validateField\n * @param {HTMLFormElement} field - The form field\n * @return {boolean} valid - Whether the field is valid or not\n */\nfunction validateField(field) {\n let validField = true;\n\n validationAttributes.forEach((attribute) => {\n if (field.validity && field.validity[attribute]) {\n const errorMessage = field.getAttribute(CONST.attributes.validation[attribute]);\n validField = false;\n createValidationMessageElement(errorMessage, field);\n toggleValidityClass(false, field);\n }\n });\n\n if (validField) {\n removeValidationMessageElement(field);\n toggleValidityClass(true, field);\n }\n\n return validField;\n}\n\n/**\n * @public validateForm\n * @param {HTMLForm} form - The form\n * @return {boolean} valid - Whether the form is valid or not\n */\nfunction validateForm(form) {\n let validForm = true;\n const formFields = [...form.querySelectorAll(CONST.selectors.form.input), ...form.querySelectorAll(CONST.selectors.form.textarea)];\n const dropdowns = [...form.querySelectorAll('.js-custom-select-validation')];\n\n formFields.forEach((field) => {\n if (field.type === 'hidden') {\n return;\n }\n\n const validField = validateField(field);\n\n if (!validField) {\n validForm = false;\n }\n });\n\n dropdowns.forEach((dropdown) => {\n const validField = dropdown.checkValidity();\n\n if (!validField) {\n validForm = false;\n }\n });\n\n return validForm;\n}\n\n/**\n * @private validate\n * @param {Event} evt - blur or invalid event\n * @param {string} [msg] - validation message\n */\nfunction validate(evt, msg) {\n const message = msg || getFieldValidationMessage(evt.target);\n if (message) {\n createValidationMessageElement(message, evt.target);\n toggleValidityClass(false, evt.target);\n } else {\n removeValidationMessageElement(evt.target);\n toggleValidityClass(true, evt.target);\n }\n}\n\nexport { validateForm, validateField, validate, removeValidationMessageElement, toggleValidityClass };\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth = parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning = true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n","var map = {\n\t\"./nl\": 2572,\n\t\"./nl.js\": 2572\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 9122;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 77;","// 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\t77: 0,\n\t274: 0,\n\t915: 0,\n\t853: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkvodafoneziggo\"] = globalThis[\"webpackChunkvodafoneziggo\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [395,661,139,66], () => (__webpack_require__(4573)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","template","document","createElement","innerHTML","CONST","breakpoints","lg","VZCarousel","HTMLElement","constructor","super","this","attachShadow","mode","shadowRoot","appendChild","content","cloneNode","connectedCallback","initialized","infinite","getAttribute","specificBreakpoints","split","slideClassName","container","querySelector","assignedElements","nextButton","prevButton","addEventListener","moveNext","bind","movePrev","setupSlideInformation","call","window","determineBreakpointStyling","initCarousel","goToFirstSlide","frameElement","closest","initPageDesigner","currentBreakpoint","getCurrentBreakpoint","some","breakpoint","name","destroyCarousel","slotContent","slides","length","children","slide","totalSlides","getSlideWidth","documentElement","clientWidth","activeSlides","setSlidesWidth","slideWidth","forEach","item","style","width","removeProperty","initSlides","classList","add","remove","parseInt","toggleButtonsVisibility","moving","supportDrag","move","nextBatch","amountOfSlidesToMove","amountOfLastSlides","transform","ondragstart","sdrag","el","cursor","includes","nodeName","left","Math","abs","interval","setInterval","clearInterval","customElements","get","define","mainContainer","gtmOptOut","attrStepId","attrResourceIncomplete","sendGtmRouteChangeEvent","stepName","_ddm","trigger","data","page","route","appendDataToName","targetStepId","targetStepName","currentStepName","updatedName","bscanSteps","THANKYOU","toLowerCase","replace","skipStatements","STATEMENTS_DONE","targetStep","prefillQuestions","givenAnswers","currentStepInput","selectors","stepInput","values","skipped","value","getModal","event","preventDefault","link","target","modalId","modalUrl","isPlp","createModalByUrl","then","modal","plpBasket","plpBasketInput","plpUrlInput","setAttribute","location","href","addPlpInputFields","adviceStep","currentBsId","form","fragment","addBsIdAsHiddenInputField","refreshToken","showModal","selector","errorMessage","modalElement","getElementById","modalInstance","bs","Modal","getInstance","show","console","error","insertResponse","response","parsedResponse","tryParseJSON","insertAdjacentHTML","html","indexOf","handleError","eventObject","errorModal","detail","classes","active","documentReady","addEvent","events","click","siteHeader","scrollArea","clickPath","stepBackward","pop","keyboardNavigation","currentStep","step","input","key","contains","stepStart","stepQuestion","button","next","btnBack","toggleBackButton","targetStepIndex","startStepIndex","firstStepIndex","hidden","updateBackButtonLabel","currentState","history","state","stepIndex","statementId","indexFromHistory","indexInStepsOrder","stepsOrder","selectorAttribute","attributes","nameAttribute","statementName","prevStepIndex","prevStep","prevStepName","innerText","updateBackButtonTarget","backButtonId","index","goingBack","currentStepId","currentStepIndex","push","updateFieldWithAnswers","clickedButton","filteredAnswers","Object","fromEntries","entries","filter","map","companyInfo","id","kvkNumber","kvk","businessName","address","city","allAnswersField","JSON","stringify","handleQuestionKeyUp","inputField","query","regex","pattern","currentStepNextButton","validateForm","invertedRegex","RegExp","setCustomValidity","focusFirstInput","introAnimation","focus","getQuestionGroupAnswers","groupedQuestions","reduce","question","groupedQuestionId","answer","votes","agree","disagree","neutral","baseUrl","uniqueStatementId","vote","dragging","answered","statementsContainer","btnAgree","btnDisagree","btnVote","btnDisagreeFeedback","btnAgreeFeedback","btnSkipStatements","statement","statementText","baseTitle","title","pushStatementHistoryState","generateUniqueNumber","pushState","sequence","historySequence","pageTitle","handleVote","voteButton","currentStatement","currentStatementId","nextStatement","nextElementSibling","substring","historyChange","resetPreviousStatements","targetStatement","prevStatement","previousElementSibling","resetNextStatements","statementHistoryUpdate","generateStatementAnswers","statements","querySelectorAll","Array","from","textContent","text","statementBackButtonChecks","statementStep","disableBackButton","activeStatement","previousStatement","removeAttribute","activeStatementLast","last","doVote","choice","handleKeyupEvent","bindKeyboardKeys","keyUp","unbindKeyboardKeys","removeEventListener","initStatements","isInitialized","element","statementElement","maxDraggingDistance","isMediaBreakpoint","draggedDistance","draggedPercentage","opacity","rotateValue","handleDragging","firstStatement","initLetsTalk","spinner","VZSpinner","day","timeSlot","employeesField","resetTimeSlot","selectAppointmentTimeElement","options","option","hasAttribute","timeSlotErrorMessageElement","parentElement","handleChangeDate","date","getFullYear","getMonth","getDate","dataset","url","employeesValue","trim","urlWithParams","encodeURIComponent","dayErrorMessageElement","start","fetch","status","finally","stop","handleEmployeesDateUpdate","dateSection","currentDateField","wasDatePickerOpen","newDateField","handleEmployeeChange","threshold","employeeThreshold","oldValue","lastValue","surpassedThreshold","newValue","oldCount","newCount","floor","hasPassedThreshold","validate","surpassThresholdError","productIDs","setActiveProductIDs","advice","activeProductIDs","activeProducts","flatMap","categories","products","product","recommended","productID","Set","getActiveProductIDs","join","field","ID_TYPES_CODES","ID_VALIDATION_RULES","ID_TYPE","setValidationPattern","evt","dispatchEvent","CustomEvent","type","CapsMask","onInput","position","selectionStart","toUpperCase","setSelectionRange","UNDO_KEYS","PostCodeMask","onKeyUp","toLocaleLowerCase","k","IBANMask","DateMask","cursorIndex","maskText","pressedCharacters","onPaste","replaceRemovedDigitWithLetter","onArrowRight","onArrowLeft","onCharacterRemoval","checkIfDashIsSelected","replaceAsYouType","onKeyDown","runRegexOnValue","totalLengthUntilLastDigit","newVal","totalLength","cursorOffset","removedCharacter","splice","addDashes","direction","offset","replaceAt","replacement","isDigit","isNaN","allowedDash","hasSelection","repeat","selectionEnd","val","charRemoved","firstPressedCharacter","shift","setTimeout","maskType","mask","preventCharacters","bannedCharacters","clipboardData","dataWithoutBannedCharacters","getData","character","currValue","end","substr","preventEntry","keyCode","documentNumber","toString","lastIndex","originalErrorMsg","patternError","selectedId","startsWith","patternX00Error","patternVError","idType","defineProperty","enumerable","configurable","Mask","password","feedbackElement","showPassword","set","readonly","bool","enable","disable","writable","required","valid","VZSelect","HTMLSelectElement","decorators","selectCorrectValue","selectedValue","find","opt","selectedIndex","extends","VZDateField","HTMLInputElement","minDate","maxDate","Date","setFieldStatus","validateDate","validateField","elValue","elementIsDatepicker","month","year","chosenDate","dateIsInvalid","invalid","invalidMax","invalidMin","msg","message","getFieldValidationMessage","insertAdjacentElement","assign","Datepicker","locales","NL","VZDatePicker","availableDates","minDateUnFormatted","maxDateUnFormatted","now","createDatePicker","datesDisabled","changeDate","fixUnavailableDateOnBlur","setDatePickerDate","setDatePickerDefault","datepicker","setView","dataAsapDateAttribute","datePickerContainer","asapToggle","setDatePickerAsap","dateString","autohide","defaultViewDate","format","toValue","parseDate","toDisplay","formatDate","language","nextArrow","orientation","prevArrow","updateOnBlur","picker","viewId","getFormattedDate","dateObj","slice","resetDatePickerAsap","blur","newDate","moment","isBefore","setDate","checked","momentFormatter","asapDate","asap","locale","column","chatButton","ctcElement","productTile","adviceJSON","notRecommendedWrapper","formFields","firstName","lastName","email","optIn","phone","pricing","colTotalPrice","totalPrice","totalPriceContainer","labelQuoteAndPrice","labelQuote","adviceAnimation","stepEvent","updateAdviceObject","pid","category","setupAdviceObject","parse","setupAdviceStep","ADVICE","initAdvice","ctrlKey","shiftKey","code","load","toggleQuitButton","quitButton","quit","closeButton","close","isAdviceStep","stepId","hasSkippedQuestions","skippedQuestions","outlineBtnStyle","quitBtnClasses","toggle","dNone","newStep","newStepId","newStepName","progressCounter","removePageTransitionClass","pageTransition","removeSubsequentSteps","nextStep","parentNode","removeChild","getActiveScreen","activeStep","animateStep","pageTransitionDuration","parseFloat","getComputedStyle","transitionDuration","top","positionTop","positionLeft","supportsNativeSmoothScroll","scrollTo","behavior","scrollTop","stickyHeader","headerHeight","offsetHeight","body","stepProgIndicator","progressIndicator","activateNextStep","hide","INTRO","exists","avatar","animationDuration","transitionToStep","transitionDelay","currActiveScreen","initTransition","carousel","advicePages","lastStep","insertBefore","nextSibling","pushHistoryState","updatePageTitle","submitAnswer","currentStepAnswer","stepQuestionGroup","questionAnswer","endpointQuestion","csrfToken","csrf","token","csrfName","tokenName","formData","FormData","append","method","res","action","catch","responseError","goToStep","trimmedStepIndex","submit","back","delay","backToAdvice","validForm","stepAnswer","answerDidNotChange","skipStep","pdLinkHandler","linkTarget","targetStepValue","lastHistorySequence","uniqueStepIndex","addHistoryListeners","utmCode","disableUrlUpdate","popstate","statementsStep","trimmedStatementId","firstStep","adviceScrollArea","lastScrollPos","elementsToFadeIn","currentElements","fadeInOffset","fadeInTime","staggerDelay","fadeInElements","initialElement","checkElements","currentScrollPos","pageYOffset","viewHeight","innerHeight","isNotScrollingUp","getPosition","e","promptOpen","prompt","promptClose","confirm","searchStep","searchField","resultsBox","resultsBoxContainer","resultsBoxHeading","resultsBoxList","resultsBoxItem","resultsBoxFadeout","stepTarget","minQueryLengthNumber","minQueryLengthText","searchEndpoint","resultsBoxHeight","resultsBoxChildrenHeight","resultsBoxFadeoutHeight","calculateFadeOutHeight","scrollPos","pointOfMovingFadeOutAway","maxHeight","setFadeOutStyling","clientHeight","scroll","updateFadeOut","resize","clearInputField","clearInputElement","inputToClear","empty","debounce","removeAccentCharacters","minSearchQueryLength","Number","isInteger","charAt","json","success","removeChildNodes","inputFieldClear","ProgressIndicator","activeIndicatorItem","targetIndicatorItem","initUpdateAvatarAndName","team","max","random","orgAvatarSrc","updateAvatarAndName","newAvatarSrc","memberName","src","img","createImage","initStartPage","startStep","companyListItem","statementsSubmit","goToAdviceDetail","goToThankYou","pdButton","skipQuestion","bsFlow","endpoint","videoID","stepCompanySearch","BusinessScan","isBsFlow","current","initKonamiCode","change","redSpinnerData","require","parentEl","showing","veil","tagName","lottie","Lottie","renderer","loop","autoplay","animationData","Promise","resolve","getPropertyValue","play","stopPropagation","validity","matches","test","multipleAdditions","activeModal","modalStepContainer","modalStep","modalStepInputs","targetId","targetEndpoint","existingModal","Error","ModalClass","_element","modalActiveStep","modalFields","validateModalField","submitStepForm","appendModalStep","lastFocussedField","customEvent","currField","_dd","user","ids","ga_id","scrollToTop","refreshTokenUrl","appendCsrfToUrl","navigator","serviceWorkerEnabled","serviceWorker","register","scope","concat","getRegistrations","serviceWorkers","workerInstance","unregister","computedStyles","GROUPED_QUESTIONS","class","disabled","exclude","placeholder","selected","validation","patternMismatch","valueMissing","tooShort","xxs","xs","sm","md","xl","xxl","buttons","previous","warning","dBlock","dFlex","dInlineBlock","inactive","mousedown","mouseleave","mouseover","paste","transitionEnd","update","checkbox","file","inputFieldFeedback","label","radio","select","textarea","htmlBody","interactiveElements","localStorage","preferredLayoutId","vzLayoutToggle","enabledBreakpoint","idDefault","localStorageKey","Element","prototype","onDrag","onStop","startX","startY","touchStartX","touchStartY","fix","pageX","pageY","touches","startDragging","currentTarget","dragEnded","firstTouch","separator","parent","passedEvent","handler","apply","arguments","fn","readyState","selection","offsetTop","offsetLeft","currentElement","offsetParent","breakpointKey","isUp","object","hasOwnProperty","outerWidth","innerWidth","breakpointValue","screenSize","keys","reverse","performance","hasChildNodes","lastChild","string","o","normalize","validationAttributes","toggleValidityClass","isValid","removeValidationMessageElement","createValidationMessageElement","validField","attribute","dropdowns","dropdown","checkValidity","ce","cancelable","defaultPrevented","params","origPrevent","bubbles","createEvent","initCustomEvent","Event","factory","lazySizes","lazysizes","lazySizesCfg","prop","lazySizesDefaults","lazyClass","loadedClass","loadingClass","preloadClass","errorClass","autosizesClass","fastLoadedClass","iframeLoadMode","srcAttr","srcsetAttr","sizesAttr","minSize","customMedia","init","expFactor","hFac","loadMode","loadHidden","ricTimeout","throttleDelay","lazySizesConfig","lazysizesConfig","getElementsByClassName","cfg","noSupport","docElem","supportPicture","HTMLPictureElement","_addEventListener","_getAttribute","requestAnimationFrame","requestIdleCallback","regPicture","loadEvents","regClassCache","hasClass","ele","cls","addClass","removeClass","reg","addRemoveLoadEvents","dom","triggerEvent","elem","noBubbles","noCancelable","instance","initEvent","updatePolyfill","full","polyfill","picturefill","pf","reevaluate","elements","getCSS","getWidth","offsetWidth","_lazysizesWidth","rAF","firstFns","secondFns","fns","run","runFns","running","waiting","rafBatch","queue","_lsFlush","rAFIt","simple","that","args","throttle","lastTime","gDelay","rICTimeout","idleCallback","timeout","isPriority","func","timestamp","wait","later","loader","regImg","regIframe","supportScroll","userAgent","shrinkExpand","currentExpand","isLoading","lowRuns","resetPreloading","isVisible","isBodyHidden","isNestedVisible","elemExpand","outerRect","visible","eLtop","eLbottom","eLleft","eLright","getBoundingClientRect","right","bottom","eLlen","i","rect","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","defaultExpand","preloadExpand","lazyloadElems","_lazyRace","prematureUnveil","unveilElement","expand","_defEx","eLvW","elvH","isCompleted","preloadElems","preloadAfterLoad","throttledCheckElements","switchLoadingClass","_lazyCache","rafSwitchLoadingClass","rafedSwitchLoadingClass","changeIframeSrc","contentWindow","handleSources","source","sourceSrcset","lazyUnveil","isAuto","sizes","isImg","srcset","isPicture","firesLoad","clearTimeout","resetPreloadingTimer","getElementsByTagName","isLoaded","complete","naturalWidth","loading","autoSizer","updateElem","afterScroll","altLoadmodeScrollListner","onload","started","_","persisted","loadingElements","MutationObserver","observe","childList","subtree","checkElems","unveil","_aLSL","sizeElement","sources","len","dataAttr","getSizeElement","debouncedUpdateElementsSizes","autosizesElems","uP","aC","rC","hC","fire","gW","module","exports","webpackContext","req","webpackContextResolve","__webpack_require__","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","m","amdO","O","result","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","getter","__esModule","d","a","definition","g","globalThis","Function","obj","nmd","paths","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}