{"version":3,"file":"z-menu.min.js","sources":["../../src/scripts/foundation/moduleInitializer.js","../../src/scripts/foundation/eventBus.js","../../src/scripts/feature/navigation/zen-nav-header.js","../../src/scripts/feature/navigation/zen-nav-menu.js","../../src/scripts/feature/navigation/zen-nav-dropdownOption.js","../../src/scripts/feature/navigation/zen-nav-dropdown.js","../../src/scripts/feature/navigation/zen-nav-collapsible.js","../../src/scripts/feature/navigation/zen-nav-budget-selector.js","../../src/scripts/feature/navigation/zen-nav-search.js","../../src/scripts/feature/navigation/zen-nav-search-selector.js","../../src/scripts/feature/navigation/zen-nav-budget-search.js","../../src/scripts/feature/navigation/zen-nav-model-search.js","../../src/scripts/feature/accounts/zen-login-cta.js","../../src/scripts/feature/accounts/zen-login-selectors.js","../../src/scripts/feature/accounts/zen-login.js","../../src/scripts/feature/accounts/sign-in-link.js","../../src/scripts/feature/cta/cookie-banner.js","../../src/scripts/feature/page-content/cookie-consent.js","../../src/scripts/feature/navigation/zen-nav-open-submenu.js","../../src/scripts/feature/navigation/zen-nav-mobile-close-submenu.js","../../src/scripts/feature/navigation/zen-nav-loop.js","../../src/scripts/menu.js"],"sourcesContent":["import document from 'document';\r\n\r\nexport const loadModules = modules => {\r\n modules.forEach((Module, index) => {\r\n if (!Module || typeof Module !== 'function') {\r\n console.log('Invalid module format', module, index);\r\n }\r\n\r\n const module = Module();\r\n \r\n if (module.selector) {\r\n const components = document.querySelectorAll(module.selector);\r\n if (components) {\r\n [...components].forEach(component => {\r\n //console.log('initializing module', module.selector);\r\n module.init(component);\r\n });\r\n } else {\r\n //console.log('module not found', module.selector);\r\n }\r\n } else {\r\n module.init();\r\n }\r\n });\r\n};","// example from https://davidwalsh.name/pubsub-javascript\r\nexport const eventBus = (() => {\r\n\r\n var topics = {};\r\n\r\n var subscribe = function (topic, listener) {\r\n if (!topics.hasOwnProperty.call(topics, topic)) {\r\n topics[topic] = [];\r\n }\r\n topics[topic].push(listener);\r\n };\r\n\r\n var unsubscribe = function (topic) {\r\n delete topics[topic];\r\n };\r\n\r\n // fire the subscribed event\r\n var publish = function (topic, options) {\r\n // manages event queue\r\n if (!topics.hasOwnProperty.call(topics, topic)) {\r\n return;\r\n }\r\n\r\n topics[topic].forEach(function (item) {\r\n item(options != undefined ? options : {});\r\n });\r\n };\r\n\r\n return {\r\n subscribe: subscribe,\r\n unsubscribe: unsubscribe,\r\n publish: publish\r\n };\r\n})();","\r\nimport document from 'document';\r\nimport { eventBus } from '../../foundation/eventBus';\r\n\r\nexport const zenNavEvents = {\r\n openMenu: 'openMenu'\r\n}\r\nexport const zenNavSelectors = {\r\n menuHeader: '.zen-nav-menu-header-mobile',\r\n navMenu: '.zen-nav-menu',\r\n navMenuOpen: 'zen-nav-menu--open',\r\n navVeil: '.zen-nav-veil__link',\r\n navOpen: 'navigation-is-active',\r\n menu: '.menu-bar',\r\n bannerLink: 'nav-login-link',\r\n subNavOpen: 'nav-submenu__list--open',\r\n subNavMenu: '.nav-submenu__list'\r\n};\r\nexport const zenNavElements = () => {\r\n return {\r\n menu: document.querySelector(zenNavSelectors.menu),\r\n navMenu: document.querySelector(zenNavSelectors.navMenu),\r\n menuHeader: document.querySelector(zenNavSelectors.menuHeader),\r\n navVeil: document.querySelector(zenNavSelectors.navVeil),\r\n bannerLink: document.querySelector('.menu-bar .zen-login-cta--mobile .nav-login-link'),\r\n subNavMenu: document.querySelector(zenNavSelectors.subNavMenu),\r\n burgerMenuButton: document.querySelector('.zen-nav-header-mobile .zen-burger-menu')\r\n }\r\n}\r\nexport const zenNavHeader = () => {\r\n const init = component => {\r\n const handleClick = () => {\r\n const elements = zenNavElements();\r\n const { navOpen: openSelector, navMenuOpen} = zenNavSelectors;\r\n elements.navMenu.classList.add(navMenuOpen);\r\n elements.menuHeader.classList.add(openSelector);\r\n elements.menu.classList.add(openSelector);\r\n elements.navVeil.classList.add(openSelector);\r\n eventBus.publish(zenNavEvents.openMenu);\r\n elements.burgerMenuButton.setAttribute('aria-expanded', true);\r\n elements.bannerLink.focus();\r\n };\r\n component.addEventListener('click', handleClick);\r\n };\r\n return {\r\n init: init,\r\n selector: '.zen-burger-menu'\r\n };\r\n};","import { eventBus } from '../../foundation/eventBus';\r\nimport { zenNavEvents as menuEvents, zenNavSelectors as selectors, zenNavElements } from './zen-nav-header';\r\nvar burgerMenu = document.getElementById('zen-burger-menu');\r\n\r\nexport const zenNavMenu = () => {\r\n \r\n const elementDisabled = (element) => element.ariaDisabled !== null ? (element.ariaDisabled === \"true\") : false;\r\n const isOpenSubmenuLink = (element) => element.ariaHasPopup !== null ? (element.ariaHasPopup === \"true\"): false;\r\n \r\n /* prevent overlaying panel propogating events to undelying banner */\r\n const handleBackPanelOverlayingBanner = () => elements.bannerLink.setAttribute('aria-disabled', true);\r\n const handleBackLinkClick = () => elements.bannerLink.setAttribute('aria-disabled', false);\r\n\r\n const elements = zenNavElements();\r\n \r\n const handleMenuClosed = () => {\r\n const { navOpen: openSelector, navMenuOpen} = selectors;\r\n elements.menuHeader.classList.remove(openSelector);\r\n elements.menu.classList.remove(openSelector);\r\n elements.navMenu.classList.remove(navMenuOpen);\r\n elements.navVeil.classList.remove(openSelector);\r\n elements.subNavMenu.classList.remove(selectors.subNavOpen);\r\n burgerMenu.setAttribute('aria-expanded', false);\r\n burgerMenu.focus();\r\n }\r\n const handleBannerClick = (banner) => {\r\n const bannerEnabled = !elementDisabled(elements.bannerLink);\r\n \r\n if (!isOpenSubmenuLink(banner) && !bannerEnabled){\r\n handleBackLinkClick();\r\n }\r\n if (bannerEnabled) {\r\n location.href = banner.getAttribute('data-login-url');\r\n }\r\n }\r\n const menuClick = (event) => {\r\n if (isOpenSubmenuLink(event.target)){\r\n handleBackPanelOverlayingBanner();\r\n }\r\n if (event.target.id == selectors.bannerLink) {\r\n if (elements.bannerLink.classList.contains('loggedin')){\r\n event.preventDefault();\r\n }\r\n handleBannerClick(event.target);\r\n }\r\n }\r\n const closeBurgerMenu = (event) => {\r\n if (elements.menu.classList.contains(selectors.navOpen)) {\r\n if (event.keyCode == 27) {\r\n handleMenuClosed();\r\n document.removeEventListener(\"keydown\", closeBurgerMenu)\r\n }\r\n }\r\n }\r\n const init = component => {\r\n eventBus.subscribe(menuEvents.openMenu, () => {\r\n component.addEventListener('click', handleMenuClosed);\r\n elements.navVeil.addEventListener('click', handleMenuClosed);\r\n elements.menu.addEventListener('click', menuClick);\r\n document.addEventListener(\"keydown\", closeBurgerMenu);\r\n });\r\n };\r\n \r\n return {\r\n init: init,\r\n selector: '.zen-nav-menu-header-mobile__close-button',\r\n handleMenuClosed: handleMenuClosed\r\n };\r\n}","\r\nexport const DropdownOption = option => {\r\n const value = option.getAttribute(\"data-value\");\r\n const link = option.querySelector(\"a\");\r\n const css = {\r\n isSelected: \"is-selected\",\r\n isDisabled: \"is-disabled\",\r\n };\r\n return {\r\n elem: option,\r\n value: value,\r\n getLinkText() {\r\n return link.innerHTML;\r\n },\r\n setLinkHref(href) {\r\n link.href = href;\r\n },\r\n select() {\r\n option.classList.add(css.isSelected);\r\n },\r\n deselect() {\r\n option.classList.remove(css.isSelected);\r\n },\r\n isSelected() {\r\n return option.classList.contains(css.isSelected);\r\n },\r\n enable() {\r\n option.classList.remove(css.isDisabled);\r\n },\r\n disable() {\r\n option.classList.add(css.isDisabled);\r\n },\r\n isDisabled() {\r\n return option.classList.contains(css.isDisabled);\r\n },\r\n };\r\n};\r\nDropdownOption.selectors = {\r\n root: \".dropdown__option\"\r\n};","\r\nimport { zenNavCollapsible } from './zen-nav-collapsible';\r\nimport { DropdownOption } from './zen-nav-dropdownOption';\r\n\r\nexport const zenNavDropdown = function (dropdown, onOptionSelected, onOwnedInputKeyUp, onOpened){\r\n const self = this;\r\n const label = dropdown.querySelector(\".dropdown__label\");\r\n const filterKey = dropdown.getAttribute(\"data-filter-Key\");\r\n const disabledClass = \"disabled\";\r\n const fullFilterList = [];\r\n const dropDownList = dropdown.querySelector('.dropdown__options');\r\n const dropDownListItems = Array.prototype.slice.call(dropdown.querySelectorAll('.dropdown__options li'))\r\n const isOwner = filterKey === null;\r\n const inputField = dropdown.querySelector(\".dropdown__input\");\r\n const readOptionsListIntoArray = () => {\r\n dropDownListItems.map((item) => { \r\n fullFilterList.push({ \r\n \"item\" : item.textContent.trim(),\r\n \"filterKey\" : item.getAttribute(filterKey),\r\n });\r\n });\r\n };\r\n const createOptionListItem = ({ item = '' }) => `
  • ${item}
  • `;\r\n const getFilterString = (input, isOwnerSelection) => (isOwnerSelection ? input.filterKey.trim() : input.item) || '';\r\n const generateOptionsFromOwnerAndInput = (ownerSelection, input) => {\r\n dropDownList.innerHTML = '';\r\n const currentList = fullFilterList.filter(option => {\r\n const itemString = `${option.item}`.toLowerCase();\r\n const ownerString = `${option.filterKey}`.toLowerCase();\r\n return ownerString === ownerSelection.trim().toLowerCase() && itemString.includes(input.trim().toLowerCase());\r\n });\r\n addOptionsToList(currentList);\r\n };\r\n const generateOptionsList = (input, isOwnerSelection) => {\r\n dropDownList.innerHTML = '';\r\n const currentList = fullFilterList.filter(option => {\r\n const item = getFilterString(option, isOwnerSelection);\r\n const itemString = `${item}`.toLowerCase();\r\n return itemString.includes(input.trim().toLowerCase());\r\n });\r\n addOptionsToList(currentList);\r\n };\r\n const addOptionsToList = currentList => {\r\n for (let index = 0; index < currentList.length; index++) {\r\n dropDownList.innerHTML += createOptionListItem(currentList[index]);\r\n }\r\n }\r\n const filterByOwnerAndInput = (ownerSelection, input) => {\r\n return generateOptionsFromOwnerAndInput(ownerSelection, input);\r\n };\r\n const handleOptionKeyUp = (e) => {\r\n if (isOwner) {\r\n return generateOptionsList(e.target.value, false);\r\n }\r\n if (typeof onOwnedInputKeyUp === \"function\") {\r\n onOwnedInputKeyUp(e, isOwner);\r\n }\r\n }\r\n const handleOptionClick = (e) => {\r\n const optionNode = e.target.closest(DropdownOption.selectors.root);\r\n const filterInput = dropdown.getElementsByTagName('input')[0];\r\n const isStaleOptionList = e.target.innerText.length === 0 && isOwner;\r\n if (filterInput){\r\n filterInput.value = e.target.innerText.split(\"\\n\")[0];\r\n }\r\n if (isStaleOptionList){\r\n generateOptionsList(filterInput.value, false);\r\n }\r\n if (optionNode) {\r\n selectOption(optionNode, e);\r\n }\r\n }\r\n function onCollapsibleToggled(e) {\r\n if (e.isOpen) {\r\n dropdown.addEventListener(\"click\", handleOptionClick);\r\n dropdown.addEventListener('keyup', handleOptionKeyUp);\r\n if (typeof onOpened == \"function\") {\r\n onOpened(self, isOwner);\r\n }\r\n } else {\r\n dropdown.removeEventListener(\"click\", handleOptionClick);\r\n dropdown.removeEventListener('keyup', handleOptionKeyUp);\r\n }\r\n }\r\n const collapsible = zenNavCollapsible(dropdown, onCollapsibleToggled);\r\n const options = [...dropdown.querySelectorAll(DropdownOption.selectors.root)]\r\n .map(opt => DropdownOption(opt));\r\n const selectOption = (option, event) => {\r\n const optionToSelect = options.find(o => o.elem.innerText.trim() === option.innerText.trim());\r\n if (optionToSelect.isDisabled()) {\r\n event.preventDefault();\r\n resetInput();\r\n return;\r\n }\r\n const selectedOption = getSelectedOption();\r\n if (selectedOption) {\r\n selectedOption.deselect();\r\n }\r\n optionToSelect.select();\r\n if (typeof onOptionSelected === \"function\") {\r\n onOptionSelected(optionToSelect, event, isOwner);\r\n }\r\n close();\r\n }\r\n const getSelectedOption = () => {\r\n const selectedOptions = options.filter(option => option.isSelected());\r\n return selectedOptions.length > 0 ? selectedOptions[0] : null;\r\n }\r\n const hasSelection = () => {\r\n return getSelectedOption() !== null;\r\n }\r\n const setLabel = (text) => {\r\n label.innerHTML = text;\r\n }\r\n const close = () => {\r\n collapsible.close();\r\n }\r\n const filter = (optionSelected) => {\r\n resetInput();\r\n generateOptionsList(optionSelected, true);\r\n dropdown.classList.remove(disabledClass);\r\n inputField.disabled = false;\r\n }\r\n const enable = (selectedOption) => {\r\n dropdown.classList.remove(disabledClass);\r\n inputField.disabled = false;\r\n \r\n options.forEach(option => updateOptionLink(option, selectedOption));\r\n }\r\n const isEnabled = (option, selectedOption) => {\r\n return !option || option.value === \"0\" || option.value > selectedOption.value;\r\n }\r\n function updateOptionLink(option, selectedOption) {\r\n if (isEnabled(option, selectedOption)) {\r\n option.enable(); \r\n } else {\r\n option.disable();\r\n }\r\n }\r\n const reset = () => {\r\n resetInput();\r\n dropdown.classList.add(disabledClass);\r\n inputField.disabled = true;\r\n }\r\n const resetInput = () => {\r\n const filterInput = dropdown.getElementsByTagName('input')[0];\r\n filterInput.value = '';\r\n }\r\n const init = () => {\r\n readOptionsListIntoArray();\r\n if (!isOwner)\r\n reset();\r\n };\r\n init();\r\n return {\r\n elem: dropdown,\r\n options,\r\n hasSelection,\r\n close,\r\n setLabel,\r\n filter,\r\n isOwner,\r\n reset,\r\n filterByOwnerAndInput,\r\n enable,\r\n inputField,\r\n };\r\n};\r\nzenNavDropdown.selectors = {\r\n root: \"[data-component='dropdown']\"\r\n};","\r\nimport window from 'window';\r\nimport document from 'document';\r\n\r\nexport const zenNavCollapsible = (elem, onToggled) => {\r\n const trigger = elem.querySelector(\".dropdown__trigger\");\r\n const activeClass = \"active\";\r\n\r\n function closeOnClickOutside(e) {\r\n if (window.innerWidth < 768)\r\n return;\r\n let targetElement = e.target;\r\n do {\r\n if (targetElement === elem) {\r\n return;\r\n }\r\n targetElement = targetElement.parentNode;\r\n } while (targetElement);\r\n close();\r\n }\r\n function handleClick() {\r\n var shouldClose = trigger.classList.contains(activeClass);\r\n if (shouldClose) {\r\n trigger.classList.remove(activeClass);\r\n document.removeEventListener(\"click\", closeOnClickOutside);\r\n } else {\r\n trigger.classList.add(activeClass);\r\n document.addEventListener(\"click\", closeOnClickOutside);\r\n }\r\n if (typeof onToggled === \"function\") {\r\n onToggled({ isOpen: !shouldClose });\r\n }\r\n }\r\n function close() {\r\n trigger.classList.remove(activeClass);\r\n }\r\n trigger.addEventListener(\"click\", handleClick);\r\n return {\r\n close: close\r\n };\r\n};","import { zenNavDropdown } from './zen-nav-dropdown';\r\nimport { eventBus } from '../../foundation/eventBus';\r\n\r\nexport const zenNavBudgetEvents = {\r\n selectOption: 'selectBudgetOption',\r\n resetOwner: 'resetOwner',\r\n}\r\n\r\nexport const zenNavBudgetSelector = () => {\r\n let dropdowns = [];\r\n const closeOthers = (allCollapsible, current) => {\r\n const filtered = allCollapsible\r\n .filter(collapsible => collapsible !== current);\r\n filtered.forEach(collapsible => collapsible.close());\r\n };\r\n const resetOwned = (allCollapsible, current) => {\r\n const filtered = allCollapsible\r\n .filter(collapsible => collapsible !== current && !collapsible.isOwner);\r\n filtered.forEach(collapsible => collapsible.reset());\r\n };\r\n const enableOwned = (allDropdowns, current) => {\r\n const dropdown = allDropdowns\r\n .filter(dropdown => dropdown.elem.title !== current.title)[0];\r\n const ownerDropdown = allDropdowns\r\n .filter(dropdown => dropdown.elem.title === current.title)[0];\r\n dropdown.enable(ownerDropdown.options.filter(x => x.isSelected())[0]);\r\n };\r\n const onOptionSelected = (optionToSelect, event, isOwner) => {\r\n if (isOwner){\r\n enableOwned(dropdowns, event.currentTarget);\r\n }\r\n eventBus.publish(zenNavBudgetEvents.selectOption, { label: event.currentTarget.title, option: optionToSelect });\r\n }\r\n const createDropdown = node => {\r\n const dropdown = new zenNavDropdown(node, onOptionSelected, null, function onOpened(event, isOwner) {\r\n closeOthers(dropdowns, dropdown);\r\n resetOwned(dropdowns, dropdown);\r\n if (isOwner)\r\n eventBus.publish(zenNavBudgetEvents.resetOwner);\r\n });\r\n return dropdown;\r\n };\r\n const init = component => {\r\n const dropdownNodes = [...component.querySelectorAll(zenNavDropdown.selectors.root)];\r\n dropdowns = dropdownNodes.map(createDropdown);\r\n };\r\n return {\r\n init,\r\n selector: \"[data-component='budget-search']\"\r\n };\r\n};\r\n","\r\nimport { zenNavDropdown } from './zen-nav-dropdown';\r\nimport { eventBus } from '../../foundation/eventBus';\r\n\r\nexport const zenNavSelectorEvents = {\r\n selectOption: 'selectModelOption',\r\n resetOwner: 'resetOwner',\r\n}\r\nexport const zenNavSearch = () => {\r\n let dropdowns = [];\r\n const filters = () => { \r\n return [...dropdowns.map(d => d.elem.querySelector('input.dropdown__label'))];\r\n }\r\n const closeOthers = (allCollapsible, current) => {\r\n const filtered = allCollapsible\r\n .filter(collapsible => collapsible !== current);\r\n filtered.forEach(collapsible => collapsible.close());\r\n };\r\n const resetOwned = (allCollapsible, current) => {\r\n const filtered = allCollapsible\r\n .filter(collapsible => collapsible !== current && !collapsible.isOwner);\r\n filtered.forEach(collapsible => collapsible.reset());\r\n };\r\n const filterOwned = (allDropdowns, current, optionSelected) => {\r\n const filtered = allDropdowns\r\n .filter(dropdown => dropdown.elem.title !== current.title);\r\n filtered.forEach(dropdown => dropdown.filter(optionSelected));\r\n };\r\n const filterByOwnerAndInput = (allDropdowns, current, input) => {\r\n const dropdown = allDropdowns\r\n .filter(dropdown => dropdown.elem.title === current.title)[0];\r\n const ownerSelection = allDropdowns.filter(x => x.isOwner)[0].elem.querySelector('.dropdown__input').value;\r\n dropdown.filterByOwnerAndInput(ownerSelection, input);\r\n };\r\n const getOwnerOption = (allDropdowns, current) => {\r\n const filtered = allDropdowns\r\n .filter(dropdown => dropdown.elem.title !== current.title);\r\n return filtered[0].inputField.value;\r\n };\r\n const onOptionSelected = (optionToSelect, event, isOwner) => {\r\n let searchDetails = {};\r\n if (isOwner){\r\n filterOwned(dropdowns, event.currentTarget, optionToSelect.elem.textContent);\r\n searchDetails = { makeSelected: optionToSelect.elem.textContent, rangeSelected: null };\r\n } else {\r\n searchDetails = { makeSelected: getOwnerOption(dropdowns, event.currentTarget), rangeSelected: optionToSelect.elem.textContent };\r\n }\r\n eventBus.publish(zenNavSelectorEvents.selectOption, searchDetails);\r\n }\r\n const onOwnedInputKeyUp = (event) => {\r\n filterByOwnerAndInput(dropdowns, event.currentTarget, event.target.value);\r\n }\r\n const createDropdown = node => {\r\n const dropdown = new zenNavDropdown(node, onOptionSelected, onOwnedInputKeyUp, function onOpened(event, isOwner) {\r\n closeOthers(dropdowns, dropdown);\r\n resetOwned(dropdowns, dropdown);\r\n if (isOwner)\r\n eventBus.publish(zenNavSelectorEvents.resetOwner);\r\n });\r\n return dropdown;\r\n };\r\n const init = component => {\r\n const dropdownNodes = [...component.querySelectorAll(zenNavDropdown.selectors.root)];\r\n dropdowns = dropdownNodes.map(createDropdown);\r\n };\r\n return {\r\n init,\r\n filters\r\n };\r\n};\r\nzenNavSearch.selectors = {\r\n root: \"[data-component='nav-selector']\"\r\n};","import { zenNavSearch } from './zen-nav-search';\r\n\r\nexport const zenNavSearchSelector = () => {\r\n\r\n const module = zenNavSearch();\r\n \r\n const init = component => {\r\n module.init(component);\r\n };\r\n return {\r\n init,\r\n selector: \"[data-component='model-search']\"\r\n };\r\n};\r\n","\r\nimport { eventBus } from '../../foundation/eventBus';\r\nimport { zenNavBudgetEvents as selectorEvents } from './zen-nav-budget-selector';\r\nimport document from 'document';\r\n\r\nexport const zenNavBudgetSearch = () => {\r\n const capture = {};\r\n const disabledClass = \"disabled\";\r\n const showResultsButton = document.getElementsByName('view-budget-results-cta');\r\n let dataLinkFormat = null; \r\n\r\n if(showResultsButton.length > 0) {\r\n dataLinkFormat = showResultsButton[0].getAttribute('data-link-format')\r\n }\r\n const getPriceFromFilter = (optionSelected) => {\r\n return {\r\n priceFrom: optionSelected.option.elem.innerText.trim(),\r\n priceTo: '0', \r\n } \r\n };\r\n const getPriceFromAndPriceToFilter = optionSelected => {\r\n const optionSelectedText = optionSelected.option.elem.innerText.trim().replaceAll(\"£\", \"\");\r\n return {\r\n priceFrom: document.getElementById('input-from').value,\r\n priceTo: isNaN(optionSelectedText) ? '' : optionSelectedText, \r\n } \r\n };\r\n const getSearchFilter = optionSelected => {\r\n const fromDropdown = document.getElementById('from-dropdown');\r\n const fromComparisonValue = fromDropdown.getAttribute('data-from-comparison-value');\r\n if (optionSelected.label === fromComparisonValue){\r\n return getPriceFromFilter(optionSelected);\r\n }\r\n else{\r\n return getPriceFromAndPriceToFilter(optionSelected);\r\n }\r\n };\r\n const getBudgetSearchUrl = () => {\r\n const optionSelected = capture['option'];\r\n if (optionSelected === undefined) {\r\n return encodeURI((dataLinkFormat.replace('{from}', '').replace('{to}', '').replace(/^(.+?)\\/*?$/, \"$1\")));\r\n }\r\n const searchFilter = getSearchFilter(optionSelected);\r\n return encodeURI((dataLinkFormat.replace('{from}', searchFilter.priceFrom).replace('{to}', searchFilter.priceTo)).replaceAll(\"£\", \"\"));\r\n }; \r\n const cleanStaleSelection = () => {\r\n if (!capture.hasOwnProperty.call('option')) {\r\n capture['option'] = {};\r\n }\r\n };\r\n const init = component => {\r\n component.classList.add(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"true\");\r\n eventBus.subscribe(selectorEvents.selectOption, (optionSelected) => {\r\n cleanStaleSelection();\r\n capture['option'] = optionSelected;\r\n component.classList.remove(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"false\");\r\n\r\n component.href = getBudgetSearchUrl();\r\n });\r\n eventBus.subscribe(selectorEvents.resetOwner, () => {\r\n cleanStaleSelection();\r\n component.classList.add(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"true\");\r\n });\r\n };\r\n return {\r\n init: init,\r\n selector: '.nav-selector__budget-cta-link'\r\n };\r\n}","\r\nimport { eventBus } from '../../foundation/eventBus';\r\nimport { zenNavSelectorEvents as selectorEvents } from './zen-nav-search';\r\n\r\nexport const zenNavModelSearch = () => {\r\n const capture = {};\r\n const disabledClass = \"disabled\";\r\n const showResultsButton = document.getElementsByName('view-cars-results-cta');\r\n let dataLinkFormat = null; \r\n\r\n if(showResultsButton.length > 0) {\r\n dataLinkFormat = showResultsButton[0].getAttribute('data-link-format')\r\n }\r\n const getMakeFilter = (makeSelected) => { \r\n return {\r\n make: makeSelected.trim(),\r\n range: '', \r\n } \r\n };\r\n const getMakeAndRangeFilter = (makeSelected, rangeSelected) => {\r\n return {\r\n make: makeSelected.trim(), \r\n range: rangeSelected.trim(), \r\n } \r\n };\r\n const getSearchFilter = (makeSelected, rangeSelected) => { \r\n if (makeSelected && !rangeSelected){\r\n return getMakeFilter(makeSelected);\r\n }\r\n return getMakeAndRangeFilter(makeSelected, rangeSelected.replace(/\\./g, \"\"))\r\n };\r\n const getModelSearchUrl = () => { \r\n const makeSelected = capture['make'];\r\n const rangeSelected = capture['range'];\r\n const searchFilter = getSearchFilter(makeSelected, rangeSelected);\r\n return encodeURI(dataLinkFormat.replace('{make}', searchFilter.make.toLowerCase().replace(' ', '-')).replace('{range}', searchFilter.range.toLowerCase().replace(' ', '-')).replace(/^(.+?)\\/*?$/, \"$1\"));\r\n }; \r\n const cleanStaleSelection = () => { \r\n if (!capture.hasOwnProperty.call('make')) {\r\n capture['make'] = {};\r\n }\r\n if (!capture.hasOwnProperty.call('range')) {\r\n capture['range'] = {};\r\n }\r\n };\r\n const init = component => {\r\n component.classList.add(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"true\");\r\n eventBus.subscribe(selectorEvents.selectOption, (searchDetails) => {\r\n cleanStaleSelection();\r\n capture['make'] = searchDetails.makeSelected;\r\n capture['range'] = searchDetails.rangeSelected;\r\n component.classList.remove(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"false\");\r\n\r\n component.href = getModelSearchUrl();\r\n });\r\n eventBus.subscribe(selectorEvents.resetOwner, () => {\r\n cleanStaleSelection();\r\n component.classList.add(disabledClass);\r\n component.setAttribute(\"aria-disabled\", \"true\");\r\n });\r\n };\r\n return {\r\n init: init,\r\n selector: '.nav-selector__cta-link'\r\n };\r\n}","import document from 'document';\r\n\r\nconst lastMenuItem = document.querySelector('#zen-account-menu .zen-login-cta__menu-list .zen-login-cta__menu-item:last-child button');\r\nconst firstMenuItem = document.querySelector('#zen-account-menu .zen-login-cta__menu-list .zen-login-cta__menu-item a');\r\n\r\nexport const zenLoginCtaMenu = (selectors) => {\r\n const menu = document.querySelector(selectors.menu);\r\n const button = document.querySelector(selectors.button);\r\n\r\n const _toggleMenuVisibility = () => {\r\n menu.classList.toggle(selectors.menuOpen);\r\n };\r\n\r\n const _toggleOptionsVisibility = function (e) {\r\n e.stopPropagation();\r\n\r\n document.addEventListener('keydown', _handleKeyPress);\r\n document.addEventListener('click', _handleClick);\r\n\r\n const isOpen = button.classList.contains(selectors.buttonOpen);\r\n\r\n if (isOpen) {\r\n this.classList.add(selectors.buttonClosed);\r\n this.classList.remove(selectors.buttonOpen);\r\n this.setAttribute(\"aria-expanded\", \"false\")\r\n } else {\r\n this.classList.remove(selectors.buttonClosed);\r\n this.classList.add(selectors.buttonOpen);\r\n this.setAttribute(\"aria-expanded\", \"true\")\r\n }\r\n _toggleMenuVisibility();\r\n };\r\n\r\n const _closeLoginOptions = () => {\r\n if (menu.classList.contains(selectors.menuOpen.replace(/\\./g,''))) {\r\n menu.classList.remove(selectors.menuOpen);\r\n button.classList.remove(selectors.buttonOpen);\r\n button.classList.add(selectors.buttonClosed);\r\n button.setAttribute(\"aria-expanded\", \"false\");\r\n }\r\n\r\n document.removeEventListener('click', _handleClick);\r\n document.removeEventListener('keydown', _handleKeyPress);\r\n };\r\n\r\n const _toggleMobileOptionsVisibility = function (e) {\r\n e.stopPropagation();\r\n\r\n const isHidden = menu.getAttribute('aria-hidden') === 'true';\r\n\r\n _toggleMenuVisibility();\r\n\r\n if (isHidden) {\r\n button.classList.remove(selectors.mobileButtonClosed);\r\n button.classList.add(selectors.mobileButtonOpen);\r\n menu.setAttribute('aria-expanded', 'true');\r\n menu.setAttribute('aria-hidden', 'false');\r\n } else {\r\n button.classList.add(selectors.mobileButtonClosed);\r\n button.classList.remove(selectors.mobileButtonOpen);\r\n menu.setAttribute('aria-expanded', 'false');\r\n menu.setAttribute('aria-hidden', 'true');\r\n }\r\n };\r\n\r\n const _closeMobileLoginOptions = () => {\r\n if (menu.classList.contains(selectors.menuOpen.replace(/\\./g,''))) {\r\n menu.classList.remove(selectors.menuOpen);\r\n document.querySelector(selectors.mobileButton).classList.remove(selectors.mobileButtonOpen);\r\n document.querySelector(selectors.mobileButton).classList.add(selectors.mobileButtonClosed);\r\n menu.setAttribute('aria-expanded', 'false');\r\n menu.setAttribute('aria-hidden', 'true');\r\n }\r\n };\r\n\r\n const _loopNavigation = (e) => {\r\n if (e.key == 'Tab' && !e.shiftKey) {\r\n e.preventDefault();\r\n firstMenuItem.focus();\r\n }\r\n }\r\n\r\n const _loopNavigationReverse = (e) => {\r\n if (e.key == 'Tab' && e.shiftKey) {\r\n e.preventDefault();\r\n lastMenuItem.focus();\r\n }\r\n }\r\n\r\n // Handle pressing ESC on the login menu\r\n const _handleKeyPress = (e) => {\r\n if (e.key === 'Escape') {\r\n _closeLoginOptions.call(this, e);\r\n button.focus();\r\n }\r\n }\r\n\r\n // Handle clicking off the login menu\r\n const _handleClick = (e) => {\r\n if (!menu.contains(e.target) && !button.contains(e.target)) {\r\n _closeLoginOptions.call(this, e);\r\n }\r\n }\r\n\r\n const _bindEvents = function (el) {\r\n el.addEventListener('click', _toggleOptionsVisibility);\r\n lastMenuItem && lastMenuItem.addEventListener(\"keydown\", _loopNavigation)\r\n firstMenuItem && firstMenuItem.addEventListener(\"keydown\", _loopNavigationReverse)\r\n };\r\n\r\n const _bindMobileEvents = function (el) {\r\n el.onclick = _toggleMobileOptionsVisibility;\r\n document.onclick = _closeMobileLoginOptions;\r\n };\r\n\r\n return {\r\n bindEvents: _bindEvents,\r\n bindMobileEvents: _bindMobileEvents,\r\n };\r\n};\r\n","\r\nexport const zenLoginSelectors = {\r\n button: '.zen-login-cta__options',\r\n mobileButton: '.zen-login-cta__options_mobile',\r\n menu: '.zen-login-cta__menu',\r\n menuOpen: 'zen-login-cta__menu--open',\r\n menuState: 'closed',\r\n buttonOpen: 'zen-login-cta__options--open',\r\n buttonClosed: 'zen-login-cta__options--closed',\r\n mobileButtonOpen: 'zen-login-cta__options_mobile--open',\r\n mobileButtonClosed: 'zen-login-cta__options_mobile--closed'\r\n};\r\n\r\nexport const loginSelectors = {\r\n button: '.login-cta__options',\r\n mobileButton: '.login-cta__options_mobile',\r\n menu: '.login-cta__menu',\r\n menuOpen: 'login-cta__menu--open',\r\n menuState: 'closed',\r\n buttonOpen: 'login-cta__options--open',\r\n buttonClosed: 'login-cta__options--closed',\r\n mobileButtonOpen: 'login-cta__options_mobile--open',\r\n mobileButtonClosed: 'login-cta__options_mobile--closed'\r\n};","import document from 'document';\r\nimport { zenLoginCtaMenu } from './zen-login-cta';\r\nimport { zenLoginSelectors as selectors, zenLoginSelectors } from './zen-login-selectors';\r\n\r\nexport const zenLoginMenu = () => {\r\n const init = () => {\r\n const button = document.querySelector(selectors.button);\r\n const ctaMenu = zenLoginCtaMenu(zenLoginSelectors);\r\n\r\n if (button !== null) {\r\n ctaMenu.bindEvents(button);\r\n }\r\n\r\n const mobileButton = document.querySelector(selectors.mobileButton);\r\n if (mobileButton !== null) {\r\n ctaMenu.bindMobileEvents(mobileButton);\r\n }\r\n };\r\n\r\n return {\r\n init: init\r\n };\r\n};\r\n","import window from 'window';\r\n\r\nexport const signInLink = () => {\r\n\r\n const init = (link) => {\t \r\n const getLoginPageUrl = () => {\r\n const href = link.getAttribute('href');\t\r\n return href.indexOf('redirectUrl') > 0 ? href.split('?')[0] : href;\r\n }\r\n \r\n link.addEventListener('click', () => {\r\n const loginPageUrl = getLoginPageUrl();\r\n \r\n const currentPageUrl = window.location.pathname + window.location.search;\r\n const redirectParameter = `redirectUrl=${encodeURIComponent(currentPageUrl)}`;\r\n \r\n const separator = loginPageUrl.indexOf('?') < 0 ? '?' : '&';\r\n const newUrl = `${loginPageUrl}${separator}${redirectParameter}`;\r\n\r\n link.setAttribute('href', newUrl);\r\n });\r\n };\r\n\r\n return {\r\n init: init,\r\n selector: '[data-component=\"sign-in-link\"]'\r\n };\r\n};\r\n","import document from 'document';\r\n\r\nexport const cookieBanner = () => {\r\n const selectors = {\r\n root: '.js-cookie-banner',\r\n closeBtn: '.js-close-and-store-cookie',\r\n cookieBannerVisible: 'cookie-banner--visible'\r\n };\r\n\r\n const config = {\r\n cookieName: 'cookiePolicyAccepted'\r\n };\r\n\r\n const _createCookie = (name, value, days) => {\r\n var expires;\r\n if (days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n expires = '; expires=' + date.toGMTString();\r\n }\r\n else {\r\n expires = '';\r\n }\r\n document.cookie = name + '=' + value + expires + '; path=/';\r\n };\r\n\r\n const _readCookie = (name) => {\r\n var cookieName = name + '=';\r\n var storedCookies = document.cookie.split(';');\r\n var filteredCookie = storedCookies.filter(function (cookie) {\r\n if (cookie.indexOf(cookieName) != -1) {\r\n return cookieName;\r\n }\r\n });\r\n return filteredCookie;\r\n };\r\n\r\n const _showCookieBanner = (el) => {\r\n el.classList.add(selectors.cookieBannerVisible);\r\n };\r\n\r\n const _hideCookieBanner = (el) => {\r\n el.closest(selectors.root).classList.remove(selectors.cookieBannerVisible);\r\n };\r\n\r\n const _bindEvents = () => {\r\n const button = document.querySelectorAll(selectors.closeBtn)[0];\r\n button.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n _createCookie(config.cookieName, 'true', 30);\r\n _hideCookieBanner(e.currentTarget);\r\n });\r\n };\r\n\r\n const init = component => {\r\n if (!_readCookie(config.cookieName).length) {\r\n _showCookieBanner(component);\r\n _bindEvents();\r\n }\r\n };\r\n\r\n return {\r\n init: init,\r\n selector: selectors.root\r\n };\r\n};","import window from 'window';\r\n\r\nexport const cookieConsent = () => {\r\n\r\n const init = () => {\r\n const cookieControl = window[\"CookieControl\"];\r\n const config = window[\"cookieControlConfig\"];\r\n\r\n const cookieControlPrefs = document.querySelector(\".cookie-control\");\r\n\r\n // Used to open the Cookie tool from accounts/Cookie Policy page\r\n if (cookieControlPrefs) {\r\n cookieControlPrefs.onclick = () => {\r\n cookieControl.open();\r\n return;\r\n };\r\n }\r\n\r\n if (config) {\r\n cookieControl.load(config);\r\n }\r\n };\r\n\r\n return {\r\n init: init\r\n };\r\n}","export const openSubMenu = () => {\r\n\r\n const menuActions = (event, component, isKeyboard) => {\r\n event.stopPropagation();\r\n const siblingUl = component.nextElementSibling;\r\n\r\n // Clear all menus\r\n closeAllOpenMenus();\r\n\r\n setExpanded(component, true);\r\n siblingUl.classList.add('nav-submenu__list--open');\r\n component.focus();\r\n\r\n const firstChild = siblingUl.querySelector('.nav-submenu__list--open .sub-nav-menu-container .nav-submenu__item:first-of-type a');\r\n const firstInput = siblingUl.querySelector('.nav-submenu__list--open .sub-nav-menu-container .dropdown__input');\r\n\r\n // Determine what to focus\r\n if (firstChild) {\r\n firstChild.addEventListener('keydown', handleShiftTab(siblingUl));\r\n isKeyboard && !isMobile() && firstChild.focus();\r\n }\r\n if (firstInput) {\r\n firstInput.addEventListener('keydown', handleShiftTab(siblingUl));\r\n isKeyboard && !isMobile() && firstInput.focus();\r\n }\r\n\r\n if (isMobile()) {\r\n const backButton = siblingUl.querySelector('.nav-submenu__back-bar-link');\r\n siblingUl.addEventListener('transitionend', (e) => {\r\n if (e.propertyName === 'left') {\r\n backButton.focus();\r\n }\r\n }, { once: true });\r\n }\r\n\r\n // Listen for Esc/click-off to dismiss\r\n document.addEventListener('click', handleClickOff(component));\r\n document.addEventListener('keydown', handleEscape);\r\n };\r\n\r\n // Utilities\r\n const isMobile = () => window.innerWidth <= 767;\r\n\r\n const removeEventListeners = (component) => {\r\n document.removeEventListener('click', handleClickOff(component));\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n\r\n const setExpanded = (component, value) => {\r\n component.setAttribute('aria-expanded', value);\r\n }\r\n\r\n const closeCurrentOpenMenu = (component) => {\r\n const siblingUl = component.nextElementSibling;\r\n siblingUl.classList.remove('nav-submenu__list--open');\r\n removeEventListeners(component);\r\n setExpanded(component, false);\r\n component.focus();\r\n }\r\n\r\n const closeAllOpenMenus = () => {\r\n const openMenus = document.querySelectorAll('.nav-submenu__list--open');\r\n openMenus.forEach(menu => {\r\n menu.classList.remove('nav-submenu__list--open');\r\n const trigger = document.querySelector(`[aria-controls=\"${menu.id}\"]`);\r\n if (trigger) {\r\n setExpanded(trigger, false);\r\n removeEventListeners(trigger);\r\n trigger.focus();\r\n }\r\n });\r\n }\r\n\r\n const handleClickOff = (component) => (event) => {\r\n if (isMobile()) {\r\n return;\r\n }\r\n\r\n const siblingUl = component.nextElementSibling;\r\n if (!siblingUl.contains(event.target) && event.target !== component) {\r\n closeCurrentOpenMenu(component);\r\n }\r\n };\r\n\r\n // Event handlers\r\n const handleClick = (event) => {\r\n event.preventDefault();\r\n const component = event.currentTarget;\r\n menuActions(event, component, false);\r\n }\r\n\r\n const handleKeys = (event) => {\r\n const component = event.currentTarget;\r\n\r\n if (event.key == 'Enter' || event.key == ' ') {\r\n event.preventDefault();\r\n menuActions(event, component, true);\r\n }\r\n }\r\n\r\n const handleEscape = (event) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeAllOpenMenus();\r\n }\r\n }\r\n\r\n const handleShiftTab = (container) => (event) => {\r\n if (isMobile()) {\r\n return;\r\n }\r\n\r\n if (event.key == 'Tab' && event.shiftKey) {\r\n const lastChildren = container.querySelectorAll('.nav-submenu__list--open .sub-nav-menu-container .nav-submenu__item:last-of-type a');\r\n event.preventDefault();\r\n lastChildren[lastChildren.length - 1].focus();\r\n }\r\n }\r\n\r\n const init = (component) => {\r\n component.addEventListener('click', handleClick);\r\n component.addEventListener('keydown', handleKeys);\r\n };\r\n\r\n return {\r\n init: init,\r\n selector: '.menu-bar-link'\r\n };\r\n};\r\n","export const closeSubMenuMobile = () => {\r\n \r\n const init = component => {\r\n const handleClick = (event) => {\r\n const parent = component.parentElement.parentElement;\r\n\r\n if (parent && parent.classList.contains('nav-submenu__list--open')) {\r\n event.preventDefault();\r\n parent.classList.remove('nav-submenu__list--open');\r\n component.removeEventListener('click', handleClick);\r\n }\r\n };\r\n component.addEventListener('click', handleClick);\r\n };\r\n return {\r\n init: init,\r\n selector: '.nav-submenu__back-bar-link'\r\n };\r\n};\r\n","var closeButton = document.getElementById('nav-active-header-close-button');\r\nvar contactUs = document.querySelector('.zen-nav-menu-footer-mobile__contact a');\r\nvar vehicleMakeLastChild = document.querySelector('.sub-nav-menu-all .nav-submenu__item:last-of-type a');\r\nvar vehicleTypeLastChild = document.querySelector('.sub-nav-menu-types .nav-submenu__item:last-child a');\r\nvar viewBudgetResultsButton = document.getElementById('view-budget-results-cta');\r\nvar viewCarResultsButton = document.getElementById('view-cars-results-cta');\r\n\r\n// Select all last-of-type items initially\r\nvar allLastItemLinks = document.querySelectorAll('.sub-nav-menu-container .nav-submenu__item:last-of-type a');\r\n\r\n// Filter out those within .sub-nav-menu-popular\r\nvar lastItemLinks = Array.from(allLastItemLinks).filter(link => {\r\n return !link.closest('.sub-nav-menu-popular');\r\n});\r\n\r\nvar backButtons = document.querySelectorAll('.nav-submenu__back-bar-link');\r\n\r\nexport const zenNavLoop = () => {\r\n const isMobile = () => window.innerWidth <= 767;\r\n\r\n function handleShiftTab(event) {\r\n var navElement = document.querySelector('.nav-submenu__list--open');\r\n if (navElement == null) {\r\n if (event.key == 'Tab' && event.shiftKey) {\r\n event.preventDefault();\r\n contactUs.focus();\r\n }\r\n } else {\r\n const lastChildManufacturer = document.querySelector('.nav-submenu__list--open .sub-nav-menu-all .nav-submenu__item:last-of-type a');\r\n const lastChildType = document.querySelector('.nav-submenu__list--open .sub-nav-menu-types .nav-submenu__item:last-child a');\r\n const lastChildBudgetButton = document.querySelector('.nav-submenu__list--open .nav-selector__cta a');\r\n const lastChildrenMisc = document.querySelectorAll('.nav-submenu__list--open .sub-nav-menu-container .nav-submenu__item:last-of-type a');\r\n if (event.key == 'Tab' && event.shiftKey) {\r\n event.preventDefault();\r\n if (lastChildManufacturer != null) {\r\n lastChildManufacturer.focus();\r\n } else if (lastChildType != null) {\r\n lastChildType.focus();\r\n } else if (lastChildBudgetButton != null) {\r\n lastChildBudgetButton.focus();\r\n } else if (lastChildrenMisc != null) {\r\n lastChildrenMisc[lastChildrenMisc.length - 1].focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function handleShiftTabOnBackButton(event) {\r\n if (event.key === 'Tab' && event.shiftKey) {\r\n event.preventDefault();\r\n closeButton.focus();\r\n }\r\n }\r\n\r\n function loopElementFocus(event) {\r\n if (event.key === 'Tab' && !event.shiftKey) {\r\n event.preventDefault();\r\n if (isMobile()) {\r\n closeButton.focus();\r\n } else {\r\n const navElement = document.querySelector('.nav-submenu__list--open');\r\n const firstSubItem = navElement.querySelector('.sub-nav-menu-container .nav-submenu__item:first-child a');\r\n\r\n firstSubItem.focus();\r\n }\r\n }\r\n }\r\n\r\n function backButtonFocus(event) {\r\n var navElement = document.querySelector('.nav-submenu__list--open');\r\n if (navElement != null) {\r\n var backButton = document.querySelector('.nav-submenu__list--open .nav-submenu__back-bar-link');\r\n if (event.key === 'Tab' && !event.shiftKey) {\r\n event.preventDefault();\r\n backButton.focus();\r\n }\r\n }\r\n }\r\n\r\n const init = () => {\r\n closeButton.addEventListener(\"keydown\", backButtonFocus);\r\n closeButton.addEventListener(\"keydown\", handleShiftTab);\r\n\r\n backButtons.forEach(function (back) {\r\n back.addEventListener(\"keydown\", handleShiftTabOnBackButton);\r\n });\r\n\r\n vehicleMakeLastChild.addEventListener(\"keydown\", loopElementFocus);\r\n vehicleTypeLastChild.addEventListener(\"keydown\", loopElementFocus);\r\n viewCarResultsButton.addEventListener(\"keydown\", loopElementFocus);\r\n viewBudgetResultsButton.addEventListener(\"keydown\", loopElementFocus);\r\n contactUs.addEventListener(\"keydown\", loopElementFocus);\r\n lastItemLinks.forEach((link) => link.addEventListener(\"keydown\", loopElementFocus));\r\n };\r\n\r\n return {\r\n init: init\r\n };\r\n};\r\n","import window from 'window';\r\n\r\nimport { loadModules } from './foundation/moduleInitializer';\r\n\r\nimport { zenNavHeader } from './feature/navigation/zen-nav-header';\r\nimport { zenNavMenu } from './feature/navigation/zen-nav-menu';\r\nimport { zenNavBudgetSelector } from './feature/navigation/zen-nav-budget-selector';\r\nimport { zenNavSearchSelector } from './feature/navigation/zen-nav-search-selector';\r\nimport { zenNavBudgetSearch } from './feature/navigation/zen-nav-budget-search';\r\nimport { zenNavModelSearch } from './feature/navigation/zen-nav-model-search';\r\nimport { zenLoginMenu } from './feature/accounts/zen-login';\r\nimport { signInLink } from './feature/accounts/sign-in-link';\r\nimport { cookieBanner } from './feature/cta/cookie-banner';\r\nimport { cookieConsent } from './feature/page-content/cookie-consent';\r\nimport { openSubMenu } from './feature/navigation/zen-nav-open-submenu';\r\nimport { closeSubMenuMobile } from './feature/navigation/zen-nav-mobile-close-submenu';\r\nimport { zenNavLoop } from './feature/navigation/zen-nav-loop';\r\n\r\nconst app = (() => {\r\n\r\n const modules = [\r\n zenNavHeader,\r\n zenNavMenu,\r\n zenNavBudgetSelector,\r\n zenNavSearchSelector,\r\n zenNavBudgetSearch,\r\n zenNavModelSearch,\r\n zenLoginMenu,\r\n signInLink,\r\n cookieBanner,\r\n cookieConsent,\r\n openSubMenu,\r\n closeSubMenuMobile,\r\n zenNavLoop\r\n ];\r\n\r\n return {\r\n init() {\r\n loadModules(modules);\r\n }\r\n };\r\n})();\r\n\r\nwindow.addEventListener('DOMContentLoaded', app.init);"],"names":["eventBus","topics","subscribe","topic","listener","hasOwnProperty","call","push","unsubscribe","publish","options","forEach","item","undefined","zenNavEvents","zenNavSelectors","menuHeader","navMenu","navMenuOpen","navVeil","navOpen","menu","bannerLink","subNavOpen","subNavMenu","zenNavElements","document","querySelector","burgerMenuButton","zenNavHeader","init","component","addEventListener","elements","openSelector","classList","add","setAttribute","focus","selector","burgerMenu","getElementById","zenNavMenu","isOpenSubmenuLink","element","ariaHasPopup","handleMenuClosed","selectors","remove","handleBannerClick","banner","bannerEnabled","ariaDisabled","location","href","getAttribute","menuClick","event","target","id","contains","preventDefault","closeBurgerMenu","keyCode","removeEventListener","menuEvents","DropdownOption","option","value","link","css","elem","getLinkText","innerHTML","[object Object]","isSelected","isDisabled","root","zenNavDropdown","dropdown","onOptionSelected","onOwnedInputKeyUp","onOpened","self","this","label","filterKey","fullFilterList","dropDownList","dropDownListItems","Array","prototype","slice","querySelectorAll","isOwner","inputField","createOptionListItem","generateOptionsList","input","isOwnerSelection","currentList","filter","trim","getFilterString","toLowerCase","includes","addOptionsToList","index","length","handleOptionKeyUp","e","handleOptionClick","optionNode","closest","filterInput","getElementsByTagName","isStaleOptionList","innerText","split","selectOption","collapsible","onToggled","trigger","closeOnClickOutside","window","innerWidth","targetElement","parentNode","close","shouldClose","isOpen","zenNavCollapsible","map","opt","optionToSelect","find","o","resetInput","selectedOption","getSelectedOption","deselect","select","selectedOptions","reset","disabled","textContent","hasSelection","setLabel","text","optionSelected","filterByOwnerAndInput","ownerSelection","itemString","generateOptionsFromOwnerAndInput","enable","isEnabled","disable","updateOptionLink","zenNavBudgetEvents","zenNavBudgetSelector","dropdowns","allDropdowns","current","title","ownerDropdown","x","enableOwned","currentTarget","createDropdown","node","allCollapsible","resetOwned","dropdownNodes","zenNavSelectorEvents","zenNavSearch","getOwnerOption","searchDetails","makeSelected","rangeSelected","filters","d","zenNavSearchSelector","module","zenNavBudgetSearch","capture","showResultsButton","getElementsByName","dataLinkFormat","getSearchFilter","fromComparisonValue","priceFrom","priceTo","getPriceFromFilter","optionSelectedText","replaceAll","isNaN","getPriceFromAndPriceToFilter","cleanStaleSelection","selectorEvents","encodeURI","replace","searchFilter","getBudgetSearchUrl","zenNavModelSearch","make","range","getMakeFilter","getMakeAndRangeFilter","getModelSearchUrl","lastMenuItem","firstMenuItem","zenLoginCtaMenu","button","_toggleMenuVisibility","toggle","menuOpen","_toggleOptionsVisibility","stopPropagation","_handleKeyPress","_handleClick","buttonOpen","buttonClosed","_closeLoginOptions","_toggleMobileOptionsVisibility","isHidden","mobileButtonClosed","mobileButtonOpen","_closeMobileLoginOptions","mobileButton","_loopNavigation","key","shiftKey","_loopNavigationReverse","bindEvents","el","bindMobileEvents","onclick","zenLoginSelectors","menuState","zenLoginMenu","ctaMenu","signInLink","loginPageUrl","indexOf","getLoginPageUrl","currentPageUrl","pathname","search","redirectParameter","encodeURIComponent","separator","newUrl","cookieBanner","config","_bindEvents","name","days","expires","date","Date","setTime","getTime","toGMTString","cookie","_createCookie","cookieName","cookieConsent","cookieControl","cookieControlPrefs","open","load","openSubMenu","menuActions","isKeyboard","siblingUl","nextElementSibling","closeAllOpenMenus","setExpanded","firstChild","firstInput","handleShiftTab","isMobile","backButton","propertyName","once","handleClickOff","handleEscape","removeEventListeners","closeCurrentOpenMenu","handleClick","handleKeys","container","lastChildren","closeSubMenuMobile","parent","parentElement","closeButton","contactUs","vehicleMakeLastChild","vehicleTypeLastChild","viewBudgetResultsButton","viewCarResultsButton","allLastItemLinks","lastItemLinks","from","backButtons","zenNavLoop","lastChildManufacturer","lastChildType","lastChildBudgetButton","lastChildrenMisc","handleShiftTabOnBackButton","loopElementFocus","backButtonFocus","back","app","modules","Module","console","log","components","loadModules"],"mappings":"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"}