{"version":3,"file":"js/viabovag.7517.d0962385.min.js","mappings":"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","sources":["webpack://viabovag/./client/src/components/molecules/contentDialog_v2/contentDialog_v2.js","webpack://viabovag/./client/src/components/molecules/menu_v2/menu_v2.js","webpack://viabovag/./client/src/components/molecules/notificationBar_v2/notificationBar_v2.js","webpack://viabovag/./client/src/components/molecules/toaster_v2/toaster_v2.js","webpack://viabovag/./client/src/components/molecules/uspBar_v2/uspBar_v2.js","webpack://viabovag/./client/src/js/storage.js","webpack://viabovag/./client/src/js/tools.js"],"sourcesContent":["import { getStorage, setStorage } from 'js/storage';\r\n\r\nexport default class ContentDialog {\r\n DEFAULT_CONFIG = {\r\n storageName: 'viaBovag_content-dialog',\r\n errorMessageAttribute: 'data-js-content-dialog-error-message',\r\n baseClassName: 'content-dialog',\r\n storageSelector: 'content-dialog'\r\n };\r\n\r\n constructor() {\r\n this.config = { ...this.config, ...this.DEFAULT_CONFIG };\r\n }\r\n\r\n init() {\r\n this.bindListeners();\r\n }\r\n\r\n bindListeners() {\r\n this.closeButton.addEventListener('click', () => {\r\n this.saveContentDialogHideSetting();\r\n this.removeContentDialog();\r\n });\r\n if (this.image) {\r\n this.image.addEventListener('load', () => {\r\n this.node.classList.add(`${this.config.baseClassName}--active`);\r\n });\r\n } else {\r\n this.node.classList.add(`${this.config.baseClassName}--active`);\r\n }\r\n }\r\n\r\n saveContentDialogHideSetting() {\r\n this.contentDialogStorage.push(this.contentDialogId);\r\n setStorage(this.config.storageSelector, this.contentDialogStorage);\r\n }\r\n\r\n /**\r\n * @param {string} id\r\n * @param {string} [imageSrc]\r\n * @param {string} text\r\n * @param {string} title\r\n * @param {string} [buttonText]\r\n * @param {string} [buttonHref]\r\n * @param {string} [buttonTarget]\r\n * @param {object} [form]\r\n */\r\n showContentDialog({ id, imageSrc, text, title, buttonText, buttonHref, buttonTarget = '_blank', form }) {\r\n /** @type {string[]} */\r\n this.contentDialogStorage = getStorage(this.config.storageSelector) || [];\r\n this.contentDialogId = id;\r\n if (!id || !text) {\r\n return;\r\n }\r\n if (this.contentDialogStorage.includes(this.contentDialogId)) {\r\n return;\r\n }\r\n\r\n const existingNode = document.querySelector(`.${this.config.baseClassName}`);\r\n if (existingNode) {\r\n existingNode.remove();\r\n }\r\n this.createHTML({ imageSrc, text, title, buttonText, buttonHref, buttonTarget, form });\r\n\r\n if (form) {\r\n this.inputHandler = this.formInput.addEventListener('input', () => {\r\n if (this.errorMessage) {\r\n this.errorMessage.remove();\r\n this.errorMessage = null;\r\n }\r\n });\r\n this.buttonHandler = this.button.addEventListener('click', e => {\r\n e.preventDefault();\r\n const result = form.callBack(this.formInput.value);\r\n if (result) {\r\n this.formField.innerText = form.success;\r\n this.button.remove();\r\n } else if (this.errorMessage) {\r\n this.errorMessage.innerText = form.error;\r\n } else {\r\n this.errorMessage = document.createElement('p');\r\n this.errorMessage.innerText = form.error;\r\n this.formField.append(this.errorMessage);\r\n }\r\n });\r\n }\r\n this.init();\r\n }\r\n\r\n createHTML(params) {\r\n this.node = document.createElement('div');\r\n this.node.className = `${this.config.baseClassName}__backdrop`;\r\n\r\n const backdrop = document.createElement('div');\r\n backdrop.className = this.config.baseClassName;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = `${this.config.baseClassName}__wrapper`;\r\n\r\n if (params.imageSrc) {\r\n this.image = document.createElement('img');\r\n this.image.className = `${this.config.baseClassName}__image`;\r\n this.image.src = params.imageSrc;\r\n this.image.alt = '';\r\n } else {\r\n this.image = '';\r\n }\r\n\r\n const title = document.createElement('h2');\r\n title.className = `${this.config.baseClassName}__title`;\r\n title.innerHTML = params.title;\r\n\r\n const paragraph = document.createElement('p');\r\n paragraph.className = `${this.config.baseClassName}__text`;\r\n paragraph.innerHTML = params.text;\r\n\r\n this.button = '';\r\n if ((params.buttonHref && params.buttonText) || params.form) {\r\n this.button = document.createElement('a');\r\n this.button.href = params.buttonHref;\r\n this.button.innerHTML = params.buttonText;\r\n this.button.target = params.buttonTarget;\r\n this.button.className = `button button-primary ${this.config.baseClassName}__button`;\r\n }\r\n\r\n this.formField = params.form ? this.generateForm(params.form) : '';\r\n\r\n /** @type {Node} */\r\n this.closeButton = document.createElement('button');\r\n this.closeButton.className = `${this.config.baseClassName}__close`;\r\n this.closeButton.innerHTML = '✖';\r\n\r\n wrapper.append(this.image, title, paragraph, this.formField, this.button, this.closeButton);\r\n backdrop.append(wrapper);\r\n\r\n this.node.append(backdrop);\r\n document.body.append(this.node);\r\n }\r\n\r\n generateForm(form) {\r\n const formField = document.createElement('div');\r\n formField.className = `${this.config.baseClassName}__form`;\r\n\r\n const formTitle = document.createElement('p');\r\n formTitle.className = `${this.config.baseClassName}__form-title`;\r\n formTitle.innerText = form.instruction;\r\n\r\n const formLabel = document.createElement('label');\r\n formLabel.className = 'form-field';\r\n\r\n this.formInput = document.createElement('input');\r\n this.formInput.className = 'form-field__input';\r\n this.formInput.placeholder = form.placeholder;\r\n\r\n const span = document.createElement('span');\r\n span.className = 'form-field__replacement';\r\n\r\n formLabel.append(this.formInput, span);\r\n\r\n formField.append(formTitle, formLabel);\r\n return formField;\r\n }\r\n\r\n /**\r\n * Removes the dialog\r\n */\r\n removeContentDialog() {\r\n this.node.classList.remove(`${this.config.baseClassName}--active`);\r\n setTimeout(() => {\r\n this.node.remove();\r\n }, 500);\r\n }\r\n}\r\n","export default class Menu {\r\n DEFAULT_CONFIG = {\r\n selectors: {\r\n barLink: '[data-js-menu-bar-link]',\r\n closeButton: '[data-js-close-button]',\r\n controls: '[data-js-menu-controls]',\r\n controlBack: '[data-js-menu-control-back]',\r\n drawer: '[data-js-menu-drawer]',\r\n item: '[data-js-menu-item]',\r\n itemButton: '[data-js-menu-item-button]',\r\n subItem: '[data-js-menu-sub-item]',\r\n subItemButton: '[data-js-menu-sub-item-button]'\r\n },\r\n classNames: {\r\n menuModifiers: {\r\n car: 'menu--car',\r\n bicycle: 'menu--bicycle',\r\n motorcycle: 'menu--motorcycle',\r\n caramper: 'menu--caramper'\r\n },\r\n htmlActiveMenu: 'has-active-menu',\r\n menuButtonActive: 'menu-button--active',\r\n menuOpened: 'menu--opened',\r\n barLinkActive: 'menu-bar__link--active',\r\n itemActive: 'menu__item--active',\r\n subItemActive: 'menu__sub-item--active',\r\n siteHeaderContainer: 'site-header__container'\r\n },\r\n dataset: {\r\n barLink: 'jsMenuBarLink',\r\n item: 'jsMenuItem'\r\n }\r\n };\r\n\r\n constructor({ menuNode, menuBarNode, menuButtonNode }, config = {}) {\r\n if (!menuButtonNode || !menuBarNode || !menuNode) {\r\n return;\r\n }\r\n\r\n this.config = { ...this.DEFAULT_CONFIG, ...config };\r\n\r\n this.menuNode = menuNode;\r\n this.menuBarNode = menuBarNode;\r\n this.menuButtonNode = menuButtonNode;\r\n\r\n this.mouseOutTimeout = null;\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.declareNodes();\r\n this.bindEventListeners();\r\n }\r\n\r\n declareNodes() {\r\n this.barLinkNodes = this.menuBarNode.querySelectorAll(this.config.selectors.barLink);\r\n this.closeButtonNodes = this.menuNode.querySelectorAll(this.config.selectors.closeButton);\r\n this.controlsNode = this.menuNode.querySelector(this.config.selectors.controls);\r\n this.controlBackNode = this.menuNode.querySelector(this.config.selectors.controlBack);\r\n this.drawerNode = this.menuNode.querySelector(this.config.selectors.drawer);\r\n this.itemNodes = this.menuNode.querySelectorAll(this.config.selectors.item);\r\n this.itemButtonNodes = this.menuNode.querySelectorAll(this.config.selectors.itemButton);\r\n this.subItemNodes = this.menuNode.querySelectorAll(this.config.selectors.subItem);\r\n this.subItemButtonNodes = this.menuNode.querySelectorAll(this.config.selectors.subItemButton);\r\n }\r\n\r\n bindEventListeners() {\r\n this.menuButtonNode.addEventListener('click', () => this.handleMenuButtonClick());\r\n this.controlBackNode.addEventListener('click', () => this.handleControlBackClick());\r\n this.drawerNode.addEventListener('mouseleave', e => this.handleDrawerMouseOut(e));\r\n\r\n this.closeButtonNodes.forEach(closeButtonNode => {\r\n closeButtonNode.addEventListener('click', () => this.handleCloseButtonClick());\r\n });\r\n\r\n this.barLinkNodes.forEach(barLinkNode => {\r\n barLinkNode.addEventListener('mouseenter', e => this.handleBarLinkClick(e));\r\n barLinkNode.addEventListener('mouseleave', e => this.handleDrawerMouseOut(e));\r\n });\r\n\r\n this.itemButtonNodes.forEach(itemButtonNode => {\r\n itemButtonNode.addEventListener('click', e => this.handleItemButtonClick(e));\r\n });\r\n\r\n this.subItemButtonNodes.forEach(subItemButtonNode => {\r\n subItemButtonNode.addEventListener('click', e => this.handleSubItemButtonClick(e));\r\n });\r\n }\r\n\r\n handleMenuButtonClick() {\r\n this.toggleMenu();\r\n }\r\n\r\n handleCloseButtonClick() {\r\n this.toggleMenu(false);\r\n }\r\n\r\n handleControlBackClick() {\r\n this.reset();\r\n }\r\n\r\n handleDrawerMouseOut(e) {\r\n if (!this.drawerNode.contains(e.relatedTarget)) {\r\n this.mouseOutTimeout = setTimeout(() => {\r\n this.toggleMenu(false);\r\n }, 150);\r\n }\r\n }\r\n\r\n handleBarLinkClick(e) {\r\n e.preventDefault();\r\n clearTimeout(this.mouseOutTimeout);\r\n const barLinkNode = e.target.closest(this.config.selectors.barLink);\r\n\r\n this.reset();\r\n this.toggleBarLink(barLinkNode, true);\r\n }\r\n\r\n handleItemButtonClick(e) {\r\n this.toggleItem(e.target.closest(this.config.selectors.item));\r\n }\r\n\r\n handleSubItemButtonClick(e) {\r\n this.toggleSubItem(e.target.closest(this.config.selectors.subItem));\r\n }\r\n\r\n toggleMenu(toggle = !this.isOpened()) {\r\n this.menuButtonNode.classList.toggle(this.config.classNames.menuButtonActive, toggle);\r\n this.menuNode.classList.toggle(this.config.classNames.menuOpened, toggle);\r\n document.documentElement.classList.toggle(this.config.classNames.htmlActiveMenu, toggle);\r\n\r\n if (!toggle) {\r\n this.reset();\r\n }\r\n }\r\n\r\n toggleBarLink(barLinkNode, toggle) {\r\n const mobilityType = barLinkNode.dataset[this.config.dataset.barLink];\r\n\r\n barLinkNode.classList.toggle(this.config.classNames.barLinkActive, toggle);\r\n\r\n this.toggleMobilityType(mobilityType, toggle);\r\n this.toggleItem(\r\n Array.from(this.itemNodes).find(itemNode => itemNode.dataset[this.config.dataset.item] === mobilityType),\r\n toggle\r\n );\r\n this.toggleMenu(toggle);\r\n }\r\n\r\n toggleItem(itemNode, toggle) {\r\n const mobilityType = itemNode.dataset[this.config.dataset.item];\r\n const firstSubItemNode = itemNode.querySelector(this.config.selectors.subItem);\r\n\r\n this.toggleSubItem(firstSubItemNode);\r\n\r\n itemNode.classList.toggle(this.config.classNames.itemActive, toggle);\r\n\r\n this.toggleMobilityType(mobilityType, toggle);\r\n }\r\n\r\n toggleSubItem(subItemNode, toggle) {\r\n subItemNode.classList.toggle(this.config.classNames.subItemActive, toggle);\r\n }\r\n\r\n toggleMobilityType(mobilityType, toggle) {\r\n this.menuNode.classList.remove(Object.keys(this.config.classNames.menuModifiers).join(''));\r\n this.menuNode.classList.toggle(this.config.classNames.menuModifiers[mobilityType], toggle);\r\n document.documentElement.classList.remove(Object.keys(this.config.classNames.menuModifiers).join(''));\r\n document.documentElement.classList.toggle(this.config.classNames.menuModifiers[mobilityType], toggle);\r\n }\r\n\r\n isOpened() {\r\n return this.menuNode.classList.contains(this.config.classNames.menuOpened);\r\n }\r\n\r\n reset() {\r\n this.barLinkNodes.forEach(barLinkNode => barLinkNode.classList.remove(this.config.classNames.barLinkActive));\r\n this.itemNodes.forEach(itemNode => this.toggleItem(itemNode, false));\r\n this.subItemNodes.forEach(subItemNode => this.toggleSubItem(subItemNode, false));\r\n }\r\n}\r\n","import * as deepmerge from 'deepmerge';\r\nimport { setStorage, getStorage } from 'js/storage';\r\n\r\nexport default class NotificationBar {\r\n DEFAULT_CONFIG = {\r\n selectors: {\r\n notificationBar: '.notification-bar',\r\n closeButton: '.notification-bar__close',\r\n mobileAppBanner: '.app-promo-header',\r\n intro: '.notification-bar__intro',\r\n description: '.notification-bar__description'\r\n },\r\n classNames: {\r\n notificationBar: 'notification-bar',\r\n wrapper: 'notification-bar__wrapper',\r\n closeButton: 'notification-bar__close',\r\n button: 'notification-bar__button button',\r\n title: 'notification-bar__title',\r\n intro: 'notification-bar__intro',\r\n description: 'notification-bar__description'\r\n },\r\n storageKey: 'notification-bar',\r\n invalidHtml: /<(?!(\\/?(em|strong))).+?>/\r\n };\r\n\r\n /**\r\n * Creates an instance of notificationBar.\r\n * @param {HTMLFormElement} node\r\n */\r\n constructor(config = {}) {\r\n this.config = deepmerge(this.config, this.DEFAULT_CONFIG, config);\r\n this.init();\r\n }\r\n\r\n init() {\r\n // Check in storage if there is a notification bar active:\r\n this.checkNotificationStorage();\r\n }\r\n\r\n /**\r\n * The main trigger that is binded to window.viabovag.showNotification(config)\r\n * @param {object} config\r\n */\r\n showNotification(config) {\r\n if (!config) {\r\n return;\r\n }\r\n\r\n /** Did the visitor discarded this notification before? */\r\n if (this.notificationStorage.includes(config.id)) {\r\n return;\r\n }\r\n\r\n this.removeNotification();\r\n\r\n if (config.intro && config.description) {\r\n const invalidIntro = this.config.invalidHtml.test(config.intro);\r\n const invalidDescription = this.config.invalidHtml.test(config.intro);\r\n\r\n if (!invalidIntro || !invalidDescription) {\r\n this.createNotificationBarElement(config);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove the notification from the DOM,\r\n * this function can be used via: window.viabovag.removeNotification()\r\n */\r\n removeNotification() {\r\n if (this.node) {\r\n this.node.remove();\r\n }\r\n }\r\n\r\n /**\r\n * Creates the notification-bar component and prepends it to the body\r\n * @param {object} config\r\n */\r\n createNotificationBarElement(config) {\r\n const appBanner = document.querySelector(this.config.selectors.mobileAppBanner);\r\n if (appBanner && !appBanner.hidden) {\r\n // If the app-banner is not hidden, don't show the notification bar\r\n return;\r\n }\r\n\r\n const notificationBar = document.createElement('a');\r\n notificationBar.className = this.config.classNames.notificationBar;\r\n notificationBar.target = config.newWindow ? '_blank' : '_self';\r\n notificationBar.href = config.url;\r\n notificationBar.setAttribute('data-js-notification-bar', 'notification');\r\n\r\n notificationBar.innerHTML = `\r\n
\r\n `;\r\n\r\n document.body.prepend(notificationBar);\r\n\r\n this.node = document.querySelector(this.config.selectors.notificationBar);\r\n const intro = this.node.querySelector(this.config.selectors.intro);\r\n const description = this.node.querySelector(this.config.selectors.description);\r\n const closeButton = this.node.querySelector(this.config.selectors.closeButton);\r\n\r\n // Update innerHTML for Intro and Description as it may have html tags: b,i and u.\r\n intro.innerHTML = config.intro;\r\n description.innerHTML = config.description;\r\n\r\n closeButton.addEventListener('click', e => this.handleCloseNotification(e, config.id));\r\n }\r\n\r\n /**\r\n * When the X is clicked on the notification\r\n */\r\n handleCloseNotification(e, id) {\r\n if (e.target.classList.contains(this.config.classNames.closeButton)) {\r\n // Don't navigate when the button pressed the close X icon\r\n e.preventDefault();\r\n }\r\n\r\n // Remove the node and update the localstorage\r\n this.removeNotification();\r\n this.saveNotificationHideSetting(id);\r\n }\r\n\r\n /**\r\n * When user want's to hide the message, remember it.\r\n */\r\n saveNotificationHideSetting(id) {\r\n this.notificationStorage.push(id);\r\n setStorage(this.config.storageKey, this.notificationStorage);\r\n }\r\n\r\n /**\r\n * Checks in storage if there are notifications that should not be visible anymore\r\n */\r\n checkNotificationStorage() {\r\n this.notificationStorage = getStorage(this.config.storageKey) || [];\r\n\r\n // Fallback for older storage objects:\r\n if (this.notificationStorage && !Array.isArray(this.notificationStorage)) {\r\n this.notificationStorage = this.notificationStorage.seen ? [this.notificationStorage.id] : [];\r\n }\r\n }\r\n}\r\n","import { getStorage, setStorage } from 'js/storage';\r\n\r\nexport default class Toaster {\r\n DEFAULT_CONFIG = {\r\n storageName: 'viaBovag_toaster',\r\n baseClassName: 'toaster',\r\n storageSelector: 'toaster',\r\n invalidHtml: /<(?!(\\/?(em|strong))).+?>/\r\n };\r\n\r\n constructor() {\r\n this.config = { ...this.DEFAULT_CONFIG };\r\n }\r\n\r\n init() {\r\n this.bindListeners();\r\n }\r\n\r\n bindListeners() {\r\n this.closeButton.addEventListener('click', () => {\r\n this.saveToasterHideSetting();\r\n this.hideToaster();\r\n });\r\n if (this.image) {\r\n this.image.addEventListener('load', () => {\r\n this.node.classList.add(`${this.config.baseClassName}--active`);\r\n });\r\n } else {\r\n this.node.classList.add(`${this.config.baseClassName}--active`);\r\n }\r\n }\r\n\r\n /**\r\n * When use want's to hide the message, remember it.\r\n */\r\n saveToasterHideSetting() {\r\n this.toasterStorage.push(this.toasterParams.id);\r\n setStorage(this.config.storageSelector, this.toasterStorage);\r\n }\r\n\r\n /**\r\n *\r\n * @param {{\r\n * id: string,\r\n * imageSrc?: string,\r\n * text: string,\r\n * buttonText?: string,\r\n * buttonHref?: string,\r\n * buttonTarget?: string\r\n * }} params\r\n */\r\n showToaster(params) {\r\n this.toasterParams = { ...params };\r\n if (!this.isValidConfig()) {\r\n return;\r\n }\r\n\r\n const existingNode = document.querySelector(`.${this.config.baseClassName}`);\r\n if (existingNode) {\r\n existingNode.remove();\r\n }\r\n this.createHTML();\r\n\r\n this.init();\r\n }\r\n\r\n isValidConfig() {\r\n /** @type {string[]} */\r\n this.toasterStorage = getStorage(this.config.storageSelector) || [];\r\n\r\n /** Are the required fields filled in? */\r\n if (!this.toasterParams.id || !this.toasterParams.text) {\r\n return false;\r\n }\r\n\r\n /** Did the visitor discarded this toaster before? */\r\n if (this.toasterStorage.includes(this.toasterParams.id)) {\r\n return false;\r\n }\r\n\r\n /** Does this text contain html not allowed? */\r\n if (this.config.invalidHtml.test(this.toasterParams.text)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param {string} [imageSrc]\r\n * @param {string} text\r\n * @param {string} [buttonText]\r\n * @param {string} [buttonHref]\r\n * @param {string} [buttonTarget]\r\n */\r\n createHTML() {\r\n this.node = document.createElement('div');\r\n this.node.className = this.config.baseClassName;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = `${this.config.baseClassName}__wrapper`;\r\n\r\n if (this.toasterParams.imageSrc) {\r\n this.image = document.createElement('img');\r\n this.image.className = `${this.config.baseClassName}__image`;\r\n this.image.src = this.toasterParams.imageSrc;\r\n this.image.alt = '';\r\n } else {\r\n this.image = null;\r\n }\r\n\r\n const paragraph = document.createElement('p');\r\n paragraph.className = `${this.config.baseClassName}__text`;\r\n paragraph.innerHTML = this.toasterParams.text;\r\n\r\n let button;\r\n if (this.toasterParams.buttonHref && this.toasterParams.buttonText) {\r\n button = document.createElement('a');\r\n button.href = this.toasterParams.buttonHref;\r\n button.innerHTML = this.toasterParams.buttonText;\r\n button.target = this.toasterParams.buttonTarget || '_blank';\r\n button.className = `button button-primary ${this.config.baseClassName}__button`;\r\n }\r\n\r\n this.closeButton = document.createElement('button');\r\n this.closeButton.className = `${this.config.baseClassName}__close`;\r\n this.closeButton.innerHTML = '✖';\r\n\r\n wrapper.append(this.image || '', paragraph, button || '');\r\n this.node.append(wrapper, this.closeButton);\r\n document.body.append(this.node);\r\n }\r\n\r\n /**\r\n *\r\n * Hides the toaster. After animation is done (css) it is removed\r\n */\r\n hideToaster() {\r\n this.node.classList.remove(`${this.config.baseClassName}--active`);\r\n setTimeout(() => {\r\n this.node.remove();\r\n }, 500);\r\n }\r\n}\r\n","import * as deepmerge from 'deepmerge';\r\n\r\nexport default class UspBar {\r\n DEFAULT_CONFIG = {\r\n interval: 4000,\r\n selectors: {\r\n usp: '[data-js-usp-bar-usp]'\r\n },\r\n classNames: {\r\n uspActive: 'usp-bar__usp--active'\r\n }\r\n };\r\n\r\n constructor(node, config = {}) {\r\n this.node = node;\r\n this.config = deepmerge(this.DEFAULT_CONFIG, config);\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.declareNodes();\r\n this.start();\r\n }\r\n\r\n declareNodes() {\r\n this.uspNodes = this.node.querySelectorAll(this.config.selectors.usp);\r\n }\r\n\r\n start() {\r\n this.index = this.getRandomIndex();\r\n this.update();\r\n\r\n setInterval(() => this.next(), this.config.interval);\r\n }\r\n\r\n next() {\r\n this.index = this.index + 1 < this.uspNodes.length ? this.index + 1 : 0;\r\n this.update();\r\n }\r\n\r\n update() {\r\n this.uspNodes.forEach((uspNode, index) =>\r\n uspNode.classList.toggle(this.config.classNames.uspActive, index === this.index)\r\n );\r\n }\r\n\r\n getRandomIndex() {\r\n return Math.floor(Math.random() * this.uspNodes.length);\r\n }\r\n}\r\n","export const retentionDuration = 864000000; // 10 days\r\nconst retentionTimestampKey = 'retention-timestamp';\r\nexport const retentionFields = [\r\n 'VehicleRegistrationNumber',\r\n 'VehicleBrandModel',\r\n 'taxation',\r\n 'tradeInValue',\r\n 'Name',\r\n 'EmailAddress',\r\n 'PhoneNumber',\r\n 'City',\r\n 'PostalCode',\r\n 'Street',\r\n 'FirstName',\r\n 'LastName',\r\n 'Mileage',\r\n 'Gender',\r\n 'Initials',\r\n 'Tussenvoegsel',\r\n 'HouseNumber',\r\n 'HouseNumberAddition',\r\n 'VideoCallRequested',\r\n 'image-taxation-0',\r\n 'image-taxation-1',\r\n 'image-taxation-2',\r\n 'image-taxation-3',\r\n 'image-taxation-4',\r\n 'image-vehicleDetails'\r\n];\r\n\r\n/**\r\n * Save item in localStorage\r\n * @param {string} key\r\n * @param {*} val\r\n * @param {boolean} saveAsJSON\r\n * @returns {string || null}\r\n */\r\nexport function setStorage(key, val, saveAsJSON = true) {\r\n updateRetentionTime();\r\n if (saveAsJSON) {\r\n val = JSON.stringify(val);\r\n }\r\n try {\r\n const savedStorage = localStorage.setItem(key, val);\r\n return savedStorage;\r\n } catch (e) {\r\n if (e.code === 22) {\r\n console.error('Localstorage is full');\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get item from localStorage\r\n * check if retention has been passed\r\n * update retention timestamp\r\n * @param {string} key\r\n * @param {boolean} getAsJSON\r\n * @returns {string || null}\r\n */\r\nexport function getStorage(key, getAsJSON = true) {\r\n checkStorageRetentionTime();\r\n updateRetentionTime();\r\n let data = localStorage.getItem(key) || null;\r\n\r\n if (getAsJSON && data) {\r\n data = JSON.parse(data);\r\n }\r\n\r\n return data || null;\r\n}\r\n\r\n/**\r\n * Remove item from storage\r\n * @param {string} key\r\n */\r\nexport function removeStorage(key) {\r\n updateRetentionTime();\r\n localStorage.removeItem(key);\r\n}\r\n\r\n/**\r\n * Save new current timestamp\r\n */\r\nexport function updateRetentionTime() {\r\n localStorage.setItem(retentionTimestampKey, Date.now());\r\n}\r\n\r\n/**\r\n * Check if retention has been passed\r\n * if so delete all retentionFields in localStorage\r\n */\r\nexport function checkStorageRetentionTime() {\r\n const currentTime = Date.now();\r\n const lastSaveTimestamp = localStorage.getItem(retentionTimestampKey);\r\n if (!lastSaveTimestamp) {\r\n updateRetentionTime();\r\n return;\r\n }\r\n\r\n const maxRetentionTime = +lastSaveTimestamp + retentionDuration;\r\n\r\n if (maxRetentionTime < currentTime) {\r\n retentionFields.forEach(key => removeStorage(key));\r\n }\r\n\r\n updateRetentionTime();\r\n}\r\n","export function siblingIndex(element) {\r\n let i = 0;\r\n\r\n while ((element = element.previousElementSibling) !== null) {\r\n i += 1;\r\n }\r\n\r\n return i;\r\n}\r\n\r\nexport function keySpline(mX1, mY1, mX2, mY2) {\r\n function get(aX) {\r\n if (mX1 === mY1 && mX2 === mY2) {\r\n return aX;\r\n }\r\n\r\n return calcBezier(getTForX(aX), mY1, mY2);\r\n }\r\n\r\n function a(aA1, aA2) {\r\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\r\n }\r\n\r\n function b(aA1, aA2) {\r\n return 3.0 * aA2 - 6.0 * aA1;\r\n }\r\n\r\n function c(aA1) {\r\n return 3.0 * aA1;\r\n }\r\n\r\n function calcBezier(aT, aA1, aA2) {\r\n return ((a(aA1, aA2) * aT + b(aA1, aA2)) * aT + c(aA1)) * aT;\r\n }\r\n\r\n function getSlope(aT, aA1, aA2) {\r\n return 3.0 * a(aA1, aA2) * aT * aT + 2.0 * b(aA1, aA2) * aT + c(aA1);\r\n }\r\n\r\n function getTForX(aX) {\r\n let aGuessT = aX;\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const currentSlope = getSlope(aGuessT, mX1, mX2);\r\n\r\n if (currentSlope === 0.0) {\r\n return aGuessT;\r\n }\r\n const currentX = calcBezier(aGuessT, mX1, mX2) - aX;\r\n\r\n aGuessT -= currentX / currentSlope;\r\n }\r\n\r\n return aGuessT;\r\n }\r\n\r\n return {\r\n get\r\n };\r\n}\r\n\r\nexport function prefixedEventListener(element, type, callback, options) {\r\n const prefixes = ['webkit', 'moz', 'MS', 'o', ''];\r\n\r\n prefixes.forEach(prefix => {\r\n if (!prefix) {\r\n type = type.toLowerCase();\r\n }\r\n element.addEventListener(prefix + type, callback, options);\r\n });\r\n}\r\n\r\n/**\r\n * Returns dom object or array of dom objects based on html string.\r\n * @param htmlString\r\n * @returns {*}\r\n */\r\nexport function parseHtmlToDom(htmlString) {\r\n const wrap = document.createElement('div');\r\n\r\n wrap.innerHTML = htmlString;\r\n\r\n if (wrap.children.length === 1) {\r\n return wrap.children[0];\r\n }\r\n\r\n return wrap.children;\r\n}\r\n\r\nexport function closest(elm, targetClass) {\r\n if (elm) {\r\n while (elm) {\r\n if (elm.classList && elm.classList.contains(targetClass)) {\r\n break;\r\n } else if (elm.tagName === 'HTML') {\r\n return false;\r\n }\r\n\r\n elm = elm.parentNode;\r\n }\r\n }\r\n\r\n return elm;\r\n}\r\n\r\nexport function offsetTop(elem) {\r\n let offsetLeft = 0;\r\n\r\n do {\r\n if (!Number.isNaN(elem.offsetTop)) {\r\n offsetLeft += elem.offsetTop;\r\n }\r\n } while ((elem = elem.offsetParent));\r\n\r\n return offsetLeft;\r\n}\r\n\r\nexport function toggle(node, toggleValue) {\r\n if (toggleValue === undefined) {\r\n toggleValue = node.hasAttribute('hidden');\r\n }\r\n\r\n if (toggleValue) {\r\n node.removeAttribute('hidden');\r\n } else {\r\n node.setAttribute('hidden', '');\r\n }\r\n}\r\n\r\nexport function scrollTo(targetElement, extraOffset = -20, duration = 1000, callback = false) {\r\n const { width } = getViewport();\r\n const headerOffset = width > 960 ? -65 : -45;\r\n const doc = document.documentElement;\r\n\r\n let targetOffset = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\r\n const from = targetOffset;\r\n const to = offsetTop(targetElement) + extraOffset + headerOffset;\r\n\r\n const relativeOffset = to - from;\r\n let start = null;\r\n const easeInOut = keySpline(0.42, 0, 0.58, 1);\r\n\r\n function step(timestamp) {\r\n if (!start) {\r\n start = timestamp;\r\n }\r\n\r\n const progress = (timestamp - start) / duration;\r\n const yProgress = easeInOut.get(progress);\r\n\r\n targetOffset = Math.round(relativeOffset * yProgress + from);\r\n\r\n if (progress < 1) {\r\n window.scrollTo(0, targetOffset);\r\n window.requestAnimationFrame(step);\r\n } else {\r\n window.scrollTo(0, to);\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n }\r\n\r\n window.requestAnimationFrame(step);\r\n}\r\n\r\n/**\r\n * Simple form data extractor\r\n * Extracts only single select fields and single checkboxes\r\n * @param formReference\r\n * @returns {string} url encoded\r\n */\r\nexport function extractFormData(formReference) {\r\n const formData = new FormData(formReference);\r\n\r\n return [...formData]\r\n .filter(([, value]) => value)\r\n .reduce((entries, [key, value]) => {\r\n entries.push({ key, value });\r\n\r\n return entries;\r\n }, []);\r\n}\r\n\r\nexport function extractSearchFormData(formReference) {\r\n const formData = extractFormData(formReference);\r\n // if there is a postalcode or city field present, but not distance, remove the distance field\r\n if (formData.some(f => f.key === 'PostalCodeCity') && !formData.some(f => f.key === 'Distance')) {\r\n return formData.filter(f => f.key !== 'PostalCodeCity');\r\n }\r\n return formData;\r\n}\r\n\r\nexport function serializeFormData(formData) {\r\n const urlParams = [];\r\n\r\n formData.forEach(({ key, value }) => urlParams.push(`${key}=${encodeURIComponent(value)}`));\r\n\r\n return urlParams.join('&');\r\n}\r\n\r\nexport function touchesElement(sourceEl, targetEl, offset = 0) {\r\n const sourceElRect = sourceEl.getBoundingClientRect();\r\n const targetElRect = targetEl.getBoundingClientRect();\r\n\r\n const overlap = !(\r\n sourceElRect.right < targetElRect.left - offset ||\r\n sourceElRect.left > targetElRect.right + offset ||\r\n sourceElRect.bottom < targetElRect.top - offset ||\r\n sourceElRect.top > targetElRect.bottom + offset\r\n );\r\n\r\n return overlap;\r\n}\r\n\r\nexport function touchesViewport(el, offset = 0) {\r\n if (el) {\r\n const rect = el.getBoundingClientRect();\r\n const targetTop = rect.top - offset;\r\n const targetBottom = rect.bottom;\r\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\r\n const topInViewport = targetTop >= 0 && targetTop < viewportHeight;\r\n const bottomInViewport = targetBottom >= 0 && targetBottom < viewportHeight;\r\n\r\n return topInViewport || bottomInViewport;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function camelToKebab(str) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\r\n}\r\n\r\nexport function kebabToCamel(str) {\r\n return str.replace(/-([a-z])/g, g => g[1].toUpperCase());\r\n}\r\n\r\nexport function createPubSub() {\r\n const subscriptions = {};\r\n\r\n const subscribe = (topic, cb) => {\r\n if (typeof subscriptions[topic] === 'undefined') {\r\n subscriptions[topic] = [];\r\n }\r\n\r\n const subscriptionIndex = subscriptions[topic].push(cb) - 1;\r\n\r\n return {\r\n unsubscribe: () => {\r\n subscriptions[topic].splice(subscriptionIndex, 1);\r\n }\r\n };\r\n };\r\n\r\n const publish = (topic, data = {}) => {\r\n if (typeof subscriptions[topic] !== 'undefined' && subscriptions[topic].constructor === Array) {\r\n subscriptions[topic].forEach(callBack => {\r\n try {\r\n callBack(data);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n });\r\n }\r\n };\r\n\r\n return {\r\n subscribe,\r\n publish\r\n };\r\n}\r\n\r\nexport function isInFullScreen() {\r\n return (\r\n (typeof document.fullscreenElement !== 'undefined' && document.fullscreenElement !== null) ||\r\n (typeof document.webkitFullscreenElement !== 'undefined' && document.webkitFullscreenElement !== null) ||\r\n (typeof document.mozFullScreenElement !== 'undefined' && document.mozFullScreenElement !== null) ||\r\n (typeof document.msFullscreenElement !== 'undefined' && document.msFullscreenElement !== null)\r\n );\r\n}\r\n\r\nexport function enterFullScreen() {\r\n const docElm = document.documentElement;\r\n\r\n if (docElm.requestFullscreen) {\r\n docElm.requestFullscreen();\r\n } else if (docElm.mozRequestFullScreen) {\r\n docElm.mozRequestFullScreen();\r\n } else if (docElm.webkitRequestFullScreen) {\r\n docElm.webkitRequestFullScreen();\r\n } else if (docElm.msRequestFullscreen) {\r\n docElm.msRequestFullscreen();\r\n }\r\n}\r\n\r\nexport function exitFullScreen() {\r\n if (isInFullScreen()) {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n } else if (document.webkitExitFullscreen) {\r\n document.webkitExitFullscreen();\r\n } else if (document.mozCancelFullScreen) {\r\n document.mozCancelFullScreen();\r\n } else if (document.msExitFullscreen) {\r\n document.msExitFullscreen();\r\n }\r\n }\r\n}\r\n\r\nexport function onFullScreenEnter(cb) {\r\n function handleFullScreenChange() {\r\n if (isInFullScreen()) {\r\n cb();\r\n }\r\n }\r\n\r\n document.addEventListener('fullscreenchange', handleFullScreenChange);\r\n document.addEventListener('webkitfullscreenchange', handleFullScreenChange);\r\n document.addEventListener('mozfullscreenchange', handleFullScreenChange);\r\n document.addEventListener('MSFullscreenChange', handleFullScreenChange);\r\n}\r\n\r\nexport function onFullScreenExit(cb) {\r\n function handleFullScreenChange() {\r\n if (!isInFullScreen()) {\r\n cb();\r\n }\r\n }\r\n\r\n document.addEventListener('fullscreenchange', handleFullScreenChange);\r\n document.addEventListener('webkitfullscreenchange', handleFullScreenChange);\r\n document.addEventListener('mozfullscreenchange', handleFullScreenChange);\r\n document.addEventListener('MSFullscreenChange', handleFullScreenChange);\r\n}\r\n\r\nexport function applyOperator(operator, x, y) {\r\n const operators = {\r\n '<': (a, b) => a < b,\r\n '>': (a, b) => a > b,\r\n '<=': (a, b) => a <= b,\r\n '>=': (a, b) => a >= b\r\n };\r\n\r\n return operators[operator](x, y);\r\n}\r\n\r\nexport function triggerJs(componentName, module, context) {\r\n if (typeof context === 'undefined') {\r\n context = document;\r\n }\r\n\r\n context.querySelectorAll(`.${componentName}`).forEach(element => {\r\n if (!element.hasAttribute('data-instantiated')) {\r\n element.setAttribute('data-instantiated', '');\r\n element.jsApi = module(element);\r\n }\r\n });\r\n}\r\n\r\nexport function getViewport() {\r\n return {\r\n width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),\r\n height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0)\r\n };\r\n}\r\n\r\nexport function getComputedStyle(node, cssAttribute) {\r\n return window.getComputedStyle(node, null).getPropertyValue(cssAttribute);\r\n}\r\n\r\nexport function stopEventPropagation(nodes, eventName) {\r\n nodes.forEach(node => {\r\n if (node !== null) {\r\n node.addEventListener(eventName, e => e.stopPropagation());\r\n }\r\n });\r\n}\r\n\r\nexport function isDisplayed(node) {\r\n return node.offsetParent !== null;\r\n}\r\n\r\nexport function stripWhiteSpace(str) {\r\n return str.replace(/ /g, '');\r\n}\r\n\r\nexport function parseJSON(jsonString) {\r\n try {\r\n const json = JSON.parse(jsonString);\r\n\r\n if (json && typeof json === 'object') {\r\n return json;\r\n }\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function arrRemoveValue(array, value) {\r\n const index = array.indexOf(value);\r\n\r\n if (index >= 0) {\r\n array.splice(index, 1);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function delegateEvent(selector, eventType, handler) {\r\n document.addEventListener(eventType, e => {\r\n const listeningTarget = e.target.closest(selector);\r\n\r\n if (listeningTarget) {\r\n handler(listeningTarget, e);\r\n }\r\n });\r\n}\r\n\r\nexport function animateCSS({ node, animationName, animationSpeed = 'faster', callback }) {\r\n node.classList.add('animated', animationSpeed, animationName);\r\n\r\n function handleAnimationEnd() {\r\n node.classList.remove('animated', animationSpeed, animationName);\r\n node.removeEventListener('animationend', handleAnimationEnd);\r\n\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n\r\n node.addEventListener('animationend', handleAnimationEnd);\r\n}\r\n\r\nexport function getCookie(name) {\r\n const cookie = document.cookie.split(';').filter(item => item.trim().startsWith(`${name}=`))[0];\r\n\r\n if (!cookie) {\r\n return false;\r\n }\r\n\r\n const [key, value] = cookie.split('=');\r\n\r\n return {\r\n key,\r\n value\r\n };\r\n}\r\n\r\nexport function setCookie({ name, value, days }) {\r\n const date = new Date();\r\n\r\n date.setTime(date.getTime() + 24 * 60 * 60 * 1000 * days);\r\n\r\n document.cookie = `${name}=${value};path=/;expires=${date.toGMTString()};SameSite=Lax`;\r\n}\r\n\r\nexport function getPageDataKeyValue(key) {\r\n if (!window.viabovag.pageData) {\r\n return undefined;\r\n }\r\n\r\n return window.viabovag.pageData[key];\r\n}\r\n\r\nexport function injectScript(scriptUrl, scriptId = '') {\r\n return new Promise((resolve, reject) => {\r\n if (scriptId && document.getElementById(scriptId)) {\r\n return;\r\n }\r\n\r\n const script = document.createElement('script');\r\n\r\n script.async = true;\r\n script.src = scriptUrl;\r\n\r\n if (scriptId) {\r\n script.id = scriptId;\r\n }\r\n\r\n script.addEventListener('load', resolve);\r\n script.addEventListener('error', () => reject(new Error('Loading script failed')));\r\n script.addEventListener('abort', () => reject(new Error('Loading script aborted')));\r\n\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\nexport function getRandomInt(min, max) {\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n}\r\n\r\nexport function getSvgSpritePath() {\r\n const spriteNode = document.querySelector('use[*|href*=\"icons.sprite\"]');\r\n const href = spriteNode?.getAttribute('xlink:href');\r\n const path = href?.split('#')[0];\r\n\r\n return path;\r\n}\r\n\r\nexport function renderIconNode(iconName) {\r\n const html = `\r\n \r\n `;\r\n\r\n return parseHtmlToDom(html);\r\n}\r\n\r\nexport function replaceIconPlaceholderNodes(cssSelector) {\r\n const iconPlaceholderNodes = document.querySelectorAll(cssSelector);\r\n\r\n iconPlaceholderNodes.forEach(iconPlaceholderNode => {\r\n const iconName = iconPlaceholderNode.textContent.trim();\r\n const iconNode = renderIconNode(iconName);\r\n\r\n iconPlaceholderNode.parentNode.replaceChild(iconNode, iconPlaceholderNode);\r\n });\r\n}\r\n\r\nexport function elementOrParentsHasClass(element, className) {\r\n if (element.classList && element.classList.contains(className)) {\r\n return true;\r\n }\r\n return element.parentNode && elementOrParentsHasClass(element.parentNode, className);\r\n}\r\n\r\n/**\r\n * Checks array of classes on element or parent\r\n * @param {Element} element\r\n * @param {string[]} classNames\r\n * @returns {boolean}\r\n */\r\nexport const elementOrParentsHasOneOfClassNames = (element, classNames) => {\r\n return classNames.some(className => elementOrParentsHasClass(element, className));\r\n};\r\n\r\nexport const getNextMobilityType = mobilityType => {\r\n switch (mobilityType) {\r\n case 'auto':\r\n return 'car';\r\n case 'fiets':\r\n return 'bicycle';\r\n case 'motor':\r\n return 'motor';\r\n case 'kampeervoertuig':\r\n return 'caramper';\r\n default:\r\n return 'car';\r\n }\r\n};\r\n"],"names":["ContentDialog","constructor","storageName","errorMessageAttribute","baseClassName","storageSelector","this","config","DEFAULT_CONFIG","init","bindListeners","closeButton","addEventListener","saveContentDialogHideSetting","removeContentDialog","image","node","classList","add","contentDialogStorage","push","contentDialogId","setStorage","showContentDialog","id","imageSrc","text","title","buttonText","buttonHref","buttonTarget","form","getStorage","includes","existingNode","document","querySelector","remove","createHTML","inputHandler","formInput","errorMessage","buttonHandler","button","e","preventDefault","callBack","value","formField","innerText","success","error","createElement","append","params","className","backdrop","wrapper","src","alt","innerHTML","paragraph","href","target","generateForm","body","formTitle","instruction","formLabel","placeholder","span","setTimeout","Menu","menuNode","menuBarNode","menuButtonNode","selectors","barLink","controls","controlBack","drawer","item","itemButton","subItem","subItemButton","classNames","menuModifiers","car","bicycle","motorcycle","caramper","htmlActiveMenu","menuButtonActive","menuOpened","barLinkActive","itemActive","subItemActive","siteHeaderContainer","dataset","mouseOutTimeout","declareNodes","bindEventListeners","barLinkNodes","querySelectorAll","closeButtonNodes","controlsNode","controlBackNode","drawerNode","itemNodes","itemButtonNodes","subItemNodes","subItemButtonNodes","handleMenuButtonClick","handleControlBackClick","handleDrawerMouseOut","forEach","closeButtonNode","handleCloseButtonClick","barLinkNode","handleBarLinkClick","itemButtonNode","handleItemButtonClick","subItemButtonNode","handleSubItemButtonClick","toggleMenu","reset","contains","relatedTarget","clearTimeout","closest","toggleBarLink","toggleItem","toggleSubItem","toggle","isOpened","documentElement","mobilityType","toggleMobilityType","Array","from","find","itemNode","firstSubItemNode","subItemNode","Object","keys","join","NotificationBar","notificationBar","mobileAppBanner","intro","description","storageKey","invalidHtml","deepmerge","checkNotificationStorage","showNotification","notificationStorage","removeNotification","invalidIntro","test","invalidDescription","createNotificationBarElement","appBanner","hidden","newWindow","url","setAttribute","prepend","handleCloseNotification","saveNotificationHideSetting","isArray","seen","Toaster","saveToasterHideSetting","hideToaster","toasterStorage","toasterParams","showToaster","isValidConfig","UspBar","interval","usp","uspActive","start","uspNodes","index","getRandomIndex","update","setInterval","next","length","uspNode","Math","floor","random","retentionTimestampKey","retentionFields","key","val","saveAsJSON","updateRetentionTime","JSON","stringify","localStorage","setItem","code","console","getAsJSON","checkStorageRetentionTime","data","getItem","parse","Date","now","currentTime","lastSaveTimestamp","removeItem","removeStorage","siblingIndex","element","i","previousElementSibling","keySpline","mX1","mY1","mX2","mY2","a","aA1","aA2","b","c","calcBezier","aT","get","aX","aGuessT","currentSlope","getTForX","prefixedEventListener","type","callback","options","prefix","toLowerCase","parseHtmlToDom","htmlString","wrap","children","elm","targetClass","tagName","parentNode","offsetTop","elem","offsetLeft","Number","isNaN","offsetParent","toggleValue","undefined","hasAttribute","removeAttribute","scrollTo","targetElement","extraOffset","duration","width","getViewport","headerOffset","doc","targetOffset","window","pageYOffset","scrollTop","clientTop","to","relativeOffset","easeInOut","requestAnimationFrame","step","timestamp","progress","yProgress","round","extractFormData","formReference","FormData","filter","reduce","entries","extractSearchFormData","formData","some","f","serializeFormData","urlParams","encodeURIComponent","touchesElement","sourceEl","targetEl","offset","sourceElRect","getBoundingClientRect","targetElRect","right","left","bottom","top","touchesViewport","el","rect","targetTop","targetBottom","viewportHeight","innerHeight","clientHeight","bottomInViewport","camelToKebab","str","replace","kebabToCamel","g","toUpperCase","createPubSub","subscriptions","subscribe","topic","cb","subscriptionIndex","unsubscribe","splice","publish","isInFullScreen","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","enterFullScreen","docElm","requestFullscreen","mozRequestFullScreen","webkitRequestFullScreen","msRequestFullscreen","exitFullScreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","onFullScreenEnter","handleFullScreenChange","onFullScreenExit","applyOperator","operator","x","y","triggerJs","componentName","module","context","jsApi","max","clientWidth","innerWidth","height","getComputedStyle","cssAttribute","getPropertyValue","stopEventPropagation","nodes","eventName","stopPropagation","isDisplayed","stripWhiteSpace","parseJSON","jsonString","json","arrRemoveValue","array","indexOf","delegateEvent","selector","eventType","handler","listeningTarget","animateCSS","animationName","animationSpeed","handleAnimationEnd","removeEventListener","getCookie","name","cookie","split","trim","startsWith","setCookie","days","date","setTime","getTime","toGMTString","getPageDataKeyValue","viabovag","pageData","injectScript","scriptUrl","scriptId","Promise","resolve","reject","getElementById","script","async","Error","head","appendChild","getRandomInt","min","getSvgSpritePath","spriteNode","getAttribute","renderIconNode","iconName","replaceIconPlaceholderNodes","cssSelector","iconPlaceholderNode","iconNode","textContent","replaceChild","elementOrParentsHasClass","elementOrParentsHasOneOfClassNames","getNextMobilityType"],"sourceRoot":""}