{"version":3,"file":"bgl.bundle.min.js","sources":["bgl.bundle.js"],"sourcesContent":["// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.tabs = (function() {\r\n let buttons = [];\r\n let content = [];\r\n\r\n function init(element) {\r\n const tabs = document.getElementById(element);\r\n\r\n buttons = [...tabs.querySelectorAll('[data-tab-button]')];\r\n content = [...tabs.querySelectorAll('[data-tab-content]')];\r\n\r\n buttons.forEach((button) => {\r\n button.addEventListener('click', (event) => {\r\n clickTab(event);\r\n });\r\n });\r\n }\r\n\r\n function clickTab(event) {\r\n buttons.forEach((button) => {\r\n button.setAttribute('aria-selected', 'false');\r\n });\r\n\r\n event.currentTarget.setAttribute('aria-selected', 'true');\r\n\r\n content.forEach((contentItem) => {\r\n if (contentItem.hasAttribute('aria-hidden')) {\r\n contentItem.setAttribute('aria-hidden', 'true');\r\n } else {\r\n contentItem.classList.add('hide--desktop-only');\r\n }\r\n });\r\n\r\n const currentTargetId = `${event.currentTarget.getAttribute('aria-controls')}`;\r\n const selectedContent = document.getElementById(currentTargetId);\r\n\r\n if (selectedContent.hasAttribute('aria-hidden')) {\r\n selectedContent.setAttribute('aria-hidden', 'false');\r\n } else {\r\n selectedContent.classList.remove('hide--desktop-only');\r\n }\r\n }\r\n\r\n return {\r\n init: init,\r\n clickTab: clickTab,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.table = (() => {\r\n let table;\r\n let buttons;\r\n let checkboxes;\r\n let isAnnual = false;\r\n let isAnyCheckboxChecked = false;\r\n let buildYourOwnAnnual = 0.00;\r\n let buildYourOwnDeposit = 0.00;\r\n let buildYourOwnInstalment = 0.00;\r\n let buildYourOwnTotalPayable = 0.00;\r\n\r\n function init() {\r\n table = document.querySelector('[data-uil-table]');\r\n buttons = table.querySelectorAll('[data-tier-select-btn]');\r\n checkboxes = [...table.querySelectorAll('[data-checkbox]')];\r\n isAnnual = document.getElementById('IsAnnual').value == 'True';\r\n const includedAsStandardTier = table.querySelector('[data-included]');\r\n\r\n if (sessionStorage.getItem('IsBuildYourOwn') === null) {\r\n sessionStorage.setItem('IsBuildYourOwn', 'false');\r\n }\r\n\r\n checkboxes.forEach((checkbox) => {\r\n const checkboxId = checkbox.id;\r\n const checkLabel = document.querySelector(`[data-label=\"${checkboxId}\"]`);\r\n\r\n if (checkbox.checked) {\r\n sessionStorage.setItem('IsBuildYourOwn', 'true');\r\n isAnyCheckboxChecked = true;\r\n }\r\n\r\n checkbox.addEventListener('change', () => {\r\n if (!document.querySelector('[data-build-table-add-product]').classList.contains('hide')) {\r\n document.querySelector('[data-build-table-add-product]').classList.add('hide');\r\n document.querySelector('[data-build-table-pricing]').classList.remove('hide');\r\n };\r\n\r\n if (checkbox.checked) {\r\n sessionStorage.setItem('IsBuildYourOwn', 'true');\r\n setSessionStorageList(checkbox);\r\n checkLabel.innerText = 'Remove';\r\n\r\n if (!document.querySelector('[data-tier=\"Build\"]').hasAttribute('data-active-col')) {\r\n deselectAll();\r\n }\r\n selectTier(checkbox.getAttribute('data-tier'));\r\n\r\n document.querySelector('[data-build-table-add-product]').classList.add('hide');\r\n document.querySelector('[data-build-table-pricing]').classList.remove('hide');\r\n\r\n if (isAnnual) {\r\n buildYourOwnAnnual += parseFloat(checkbox.getAttribute('data-annual-amount'));\r\n\r\n document.querySelector('[data-build-table-annual-price]')\r\n .innerText = `${buildYourOwnAnnual.toFixed(2)} /year`;\r\n } else {\r\n buildYourOwnDeposit += parseFloat(\r\n checkbox.getAttribute('data-monthly-deposit-amount'));\r\n buildYourOwnInstalment += parseFloat(\r\n checkbox.getAttribute('data-monthly-instalment-amount'));\r\n buildYourOwnTotalPayable += parseFloat(\r\n checkbox.getAttribute('data-monthly-total-payable-amount'));\r\n\r\n updateBuildYourOwnTotalsContent(checkbox);\r\n }\r\n } else {\r\n checkLabel.innerText = 'Add';\r\n removeFromSessionStorage(checkbox);\r\n if (!isCheckboxChecked()) {\r\n deselectAll();\r\n checkLabel.innerText = 'Add';\r\n\r\n if (includedAsStandardTier.getAttribute('data-included').toLowerCase() === 'true') {\r\n selectTier(includedAsStandardTier.getAttribute('data-tier'));\r\n }\r\n\r\n sessionStorage.setItem('IsBuildYourOwn', 'false');\r\n }\r\n\r\n if (isAnnual) {\r\n const annualAmount = parseFloat(checkbox.getAttribute('data-annual-amount'));\r\n buildYourOwnAnnual -= annualAmount;\r\n\r\n document.querySelector('[data-build-table-annual-price]')\r\n .innerText = `${buildYourOwnAnnual.toFixed(2)} /year`;\r\n } else {\r\n buildYourOwnDeposit -= parseFloat(\r\n checkbox.getAttribute('data-monthly-deposit-amount'));\r\n buildYourOwnInstalment -= parseFloat(\r\n checkbox.getAttribute('data-monthly-instalment-amount'));\r\n buildYourOwnTotalPayable -= parseFloat(\r\n checkbox.getAttribute('data-monthly-total-payable-amount'));\r\n\r\n updateBuildYourOwnTotalsContent(checkbox);\r\n }\r\n }\r\n });\r\n });\r\n\r\n buttons.forEach((button) => {\r\n button.addEventListener('click', () => {\r\n if (button.hasAttribute('data-active-button')) {\r\n const includedAsStandardTier = document.querySelector('[data-included]');\r\n\r\n deselectAll();\r\n\r\n if (includedAsStandardTier.getAttribute('data-included').toLowerCase() === 'true') {\r\n selectTier(includedAsStandardTier.getAttribute('data-tier'));\r\n }\r\n } else {\r\n deselectAll();\r\n\r\n selectTier(button.getAttribute('data-tier'));\r\n buildYourOwnAnnual = buildYourOwnDeposit = buildYourOwnInstalment = buildYourOwnTotalPayable = 0.00;\r\n }\r\n });\r\n });\r\n\r\n if (isAnyCheckboxChecked) {\r\n const checkedCheckboxes = checkboxes.filter((checkbox) => checkbox.checked);\r\n\r\n checkedCheckboxes.forEach((checkbox) => {\r\n if (isAnnual) {\r\n buildYourOwnAnnual += parseFloat(checkbox.getAttribute('data-annual-amount'));\r\n\r\n document.querySelector('[data-build-table-annual-price]')\r\n .innerText = `${buildYourOwnAnnual.toFixed(2)} /year`;\r\n } else {\r\n buildYourOwnDeposit = parseFloat(\r\n checkbox.getAttribute('data-monthly-deposit-amount'));\r\n buildYourOwnInstalment = parseFloat(\r\n checkbox.getAttribute('data-monthly-instalment-amount'));\r\n buildYourOwnTotalPayable = parseFloat(\r\n checkbox.getAttribute('data-monthly-total-payable-amount'));\r\n\r\n updateBuildYourOwnTotalsContent(checkbox);\r\n }\r\n });\r\n } else {\r\n sessionStorage.setItem('IsBuildYourOwn', 'false');\r\n const activeCol = table.querySelectorAll('[data-active-col][data-tier=\"Build\"]');\r\n removeActiveCol(activeCol);\r\n setDefaultBuildYourOwnPricingHeaderContent();\r\n\r\n const activeElements = table.querySelectorAll('[data-active-col]');\r\n if (activeElements.length == 0 &&\r\n includedAsStandardTier.getAttribute('data-included').toLowerCase() === 'true') {\r\n deselectAll();\r\n selectTier(includedAsStandardTier.getAttribute('data-tier'));\r\n }\r\n }\r\n }\r\n\r\n function isCheckboxChecked() {\r\n for (let i = 0; i < checkboxes.length; i++) {\r\n const checkbox = checkboxes[i];\r\n if (checkbox.checked) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function deselectAll() {\r\n const activeCol = table.querySelectorAll('[data-active-col]');\r\n const activeButton = table.querySelector('[data-active-button]');\r\n const activeBuildYourOwn = document.querySelector('[data-tier=\"Build\"]').hasAttribute('data-active-col');\r\n\r\n checkboxes.forEach((checkbox) => {\r\n if (checkbox.checked && activeBuildYourOwn) {\r\n const checkboxId = checkbox.id;\r\n const checkLabel = document.querySelector(`[data-label=\"${checkboxId}\"]`);\r\n checkbox.checked = false;\r\n if (sessionStorage.getItem('buildYourOwnList') != null) {\r\n removeFromSessionStorage(checkbox);\r\n }\r\n sessionStorage.setItem('IsBuildYourOwn', 'false');\r\n checkLabel.innerText = 'Add';\r\n }\r\n });\r\n if (activeButton != null) {\r\n removeActiveButton(activeButton);\r\n }\r\n\r\n if (activeCol != null) {\r\n removeActiveCol(activeCol);\r\n }\r\n\r\n setDefaultBuildYourOwnPricingHeaderContent();\r\n }\r\n\r\n function setDefaultBuildYourOwnPricingHeaderContent() {\r\n document.querySelector('[data-build-table-add-product]').classList.remove('hide');\r\n document.querySelector('[data-build-table-pricing]').classList.add('hide');\r\n }\r\n\r\n function removeActiveCol(activeCol) {\r\n activeCol.forEach((column) => {\r\n column.removeAttribute('data-active-col');\r\n column.classList.remove('uil-table__head--active');\r\n column.classList.remove('uil-table__data--active');\r\n column.classList.remove('uil-table__foot--active');\r\n column.classList.remove('uil-table__heading--active');\r\n });\r\n }\r\n\r\n function removeActiveButton(activeButton) {\r\n const activeButtonIcon = activeButton.querySelector('[data-button-icon]');\r\n const activeButtonText = activeButton.querySelector('[data-button-text]');\r\n\r\n activeButton.removeAttribute('data-active-button');\r\n activeButtonIcon.classList.add('hide');\r\n activeButtonText.innerText = 'Select';\r\n }\r\n\r\n function selectTier(dataTier) {\r\n const correctTiers = table.querySelectorAll(`[data-tier=\"${dataTier}\"]`);\r\n correctTiers.forEach((element) => {\r\n switch (element.tagName.toLowerCase()) {\r\n case 'th':\r\n element.classList.add('uil-table__head--active');\r\n element.setAttribute('data-active-col', '');\r\n break;\r\n case 'td':\r\n if (element.getAttribute('data-id') === 'tableFooter') {\r\n element.classList.add('uil-table__foot--active');\r\n element.setAttribute('data-active-col', '');\r\n } else {\r\n element.classList.add('uil-table__data--active');\r\n element.setAttribute('data-active-col', '');\r\n }\r\n break;\r\n case 'button':\r\n element.querySelector('.uil-btn__icon').classList.remove('hide');\r\n element.querySelector('[data-button-text]').innerText = 'Remove';\r\n element.setAttribute('data-active-button', '');\r\n break;\r\n case 'h3':\r\n element.classList.add('uil-table__heading--active');\r\n element.setAttribute('data-active-col', '');\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n\r\n function setSessionStorageList(checkbox) {\r\n if (sessionStorage.getItem('buildYourOwnList') === null) {\r\n sessionStorage.setItem('buildYourOwnList', JSON.stringify([checkbox.id]));\r\n } else {\r\n const listOfAddons = JSON.parse(sessionStorage.getItem('buildYourOwnList'));\r\n if (!isThisInBuildYourOwn(checkbox.id)) {\r\n listOfAddons.push(checkbox.id);\r\n sessionStorage.setItem('buildYourOwnList', JSON.stringify(listOfAddons));\r\n }\r\n }\r\n }\r\n\r\n function removeFromSessionStorage(checkbox) {\r\n const listOfAddons = JSON.parse(sessionStorage.getItem('buildYourOwnList'));\r\n const index = listOfAddons.indexOf(checkbox.id);\r\n listOfAddons.splice(index, 1);\r\n sessionStorage.setItem('buildYourOwnList', JSON.stringify(listOfAddons));\r\n }\r\n\r\n function isThisInBuildYourOwn(checkboxId) {\r\n const listOfAddons = JSON.parse(sessionStorage.getItem('buildYourOwnList'));\r\n\r\n return listOfAddons.includes(checkboxId);\r\n }\r\n\r\n function updateBuildYourOwnTotalsContent(checkbox) {\r\n const numberOfInstalments = checkbox.getAttribute('data-monthly-number-of-instalments');\r\n document.querySelector('[data-build-deposit]')\r\n .innerText = `${buildYourOwnDeposit.toFixed(2)}`;\r\n document.querySelector('[data-build-instalment-amount]')\r\n .innerText = `${buildYourOwnInstalment.toFixed(2)}`;\r\n document.querySelector('[data-build-number-of-instalments]')\r\n .innerText = `x ${numberOfInstalments} months`;\r\n document.querySelector('[data-build-total-payable]')\r\n .innerText = `${buildYourOwnTotalPayable.toFixed(2)}`;\r\n }\r\n\r\n return {\r\n init: init,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.datepicker = (() => {\r\n function init() {\r\n const datepicker = document.querySelector('[data-datepicker]');\r\n\r\n datepicker.addEventListener('blur', () => {\r\n if (!datepicker.checkValidity()) {\r\n datepicker.classList.add('error');\r\n } else {\r\n datepicker.classList.remove('error');\r\n }\r\n });\r\n };\r\n\r\n return {\r\n init: init,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.carousel = (() => {\r\n let carousel;\r\n let buttons;\r\n let navIsClicked = false;\r\n\r\n function init() {\r\n carousel = document.querySelector('[data-uil-carousel]');\r\n const carouselNavItems = document.querySelector('[data-uil-carousel-nav-items]');\r\n buttons = carousel.querySelectorAll('[data-tier-select-btn]');\r\n\r\n buttons.forEach((button) => {\r\n button.addEventListener('click', (event) => {\r\n deselectAll(carousel);\r\n\r\n if (!button.hasAttribute('data-active-button')) {\r\n selectTier(carousel, button.getAttribute('data-tier'));\r\n }\r\n });\r\n });\r\n\r\n const activeElements = carousel.querySelectorAll('[data-active]');\r\n if (activeElements.length == 0) {\r\n deselectAll(carousel);\r\n }\r\n\r\n setCarouselNavScrolling();\r\n checkSwipe(carousel, carouselNavItems);\r\n displayActiveTierInViewport(carousel);\r\n }\r\n\r\n function displayActiveTierInViewport(carousel) {\r\n const activeTierCard = carousel.querySelector('[data-active]');\r\n\r\n if (activeTierCard != null) {\r\n carousel.scrollTo(activeTierCard.offsetLeft, 0);\r\n }\r\n }\r\n\r\n function deselectAll(carousel) {\r\n const activeElement = carousel.querySelectorAll('[data-active]');\r\n const activeButton = carousel.querySelector('[data-active-button]');\r\n\r\n if (activeButton != null) {\r\n removeActiveButton(activeButton);\r\n }\r\n\r\n if (activeElement != null) {\r\n removeActive(activeElement);\r\n }\r\n }\r\n\r\n function removeActive(activeElement) {\r\n activeElement.forEach((element) => {\r\n element.removeAttribute('data-active');\r\n element.classList.remove('uil-carousel__card--active');\r\n element.classList.remove('uil-carousel__heading--active');\r\n element.classList.remove('active');\r\n });\r\n }\r\n\r\n function removeActiveButton(activeButton) {\r\n activeButton.removeAttribute('data-active-button');\r\n activeButton.querySelector('[data-button-text-active]').classList.add('hide');\r\n activeButton.querySelector('[data-button-text-inactive]').classList.remove('hide');\r\n activeButton.querySelector('[data-button-icon]').classList.add('hide');\r\n activeButton.querySelector('[data-tier-select-input]').removeAttribute('checked');\r\n }\r\n\r\n function selectTier(carousel, dataTier) {\r\n const correctTiers = carousel.querySelectorAll(`[data-tier=\"${dataTier}\"]`);\r\n\r\n correctTiers.forEach((element) => {\r\n switch (true) {\r\n case element.hasAttribute('data-uil-carousel-card'):\r\n element.classList.add('uil-carousel__card--active');\r\n element.setAttribute('data-active', '');\r\n break;\r\n case element.hasAttribute('data-uil-carousel-heading'):\r\n element.classList.add('uil-carousel__heading--active');\r\n element.setAttribute('data-active', '');\r\n break;\r\n case element.hasAttribute('data-tier-select-btn'):\r\n element.querySelector('[data-button-text-active]').classList.remove('hide');\r\n element.querySelector('[data-button-text-inactive]').classList.add('hide');\r\n element.querySelector('[data-button-icon]').classList.remove('hide');\r\n element.querySelector('[data-tier-select-input]').setAttribute('checked', 'checked');\r\n element.setAttribute('data-active-button', '');\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n\r\n function setCarouselNavScrolling() {\r\n const navItems = document.querySelectorAll('[data-uil-carousel-nav-item]');\r\n\r\n navItems.forEach((item) => {\r\n item.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n\r\n navIsClicked = true;\r\n const controlId = item.getAttribute('aria-controls');\r\n const tierCard = carousel.querySelector('#' + controlId);\r\n\r\n navItems.forEach((navItem) => {\r\n navItem.classList\r\n .remove('uil-carousel-wrapper__btn');\r\n });\r\n item.classList.add('uil-carousel-wrapper__btn');\r\n carousel.scrollTo(tierCard.offsetLeft, 0);\r\n\r\n setTimeout(() => {\r\n navIsClicked = false;\r\n }, 500);\r\n });\r\n });\r\n }\r\n\r\n function checkSwipe(carousel, carouselNav) {\r\n carousel.addEventListener('scroll', () => {\r\n if (!navIsClicked) {\r\n const scrollLeft = carousel.scrollLeft;\r\n\r\n const carouselNavItems = carouselNav.querySelectorAll('[data-uil-carousel-nav-item]');\r\n carouselNavItems.forEach((navItem, index) => {\r\n const controlId = navItem.getAttribute('aria-controls');\r\n const tierCard = carousel.querySelector('#' + controlId);\r\n\r\n const offsetLeft = tierCard.offsetLeft;\r\n const itemWidth = tierCard.offsetWidth;\r\n\r\n if (scrollLeft + itemWidth >= offsetLeft && scrollLeft <= offsetLeft + itemWidth) {\r\n carouselNavItems\r\n .forEach((item) => item.classList\r\n .remove('uil-carousel-wrapper__btn'));\r\n navItem.classList\r\n .add('uil-carousel-wrapper__btn');\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n return {\r\n init,\r\n deselectAll,\r\n selectTier,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.basetabs = (function() {\r\n let buttons = [];\r\n let content = [];\r\n\r\n function init(idName) {\r\n const tabs = document.getElementById(idName);\r\n\r\n getButtonsAndContent(tabs, idName);\r\n\r\n buttons.forEach((button) => {\r\n button.addEventListener('click', (event) => {\r\n clickTab(event, idName);\r\n });\r\n });\r\n }\r\n\r\n function clickTab(event, idName) {\r\n const tabs = document.getElementById(idName);\r\n\r\n getButtonsAndContent(tabs, idName);\r\n\r\n buttons.forEach((button) => {\r\n button.setAttribute('aria-selected', 'false');\r\n });\r\n\r\n event.currentTarget.setAttribute('aria-selected', 'true');\r\n\r\n content.forEach((contentItem) => {\r\n if (contentItem.hasAttribute('aria-hidden')) {\r\n contentItem.setAttribute('aria-hidden', 'true');\r\n } else {\r\n contentItem.classList.add('hide');\r\n }\r\n });\r\n\r\n const currentTargetId = `${event.currentTarget.getAttribute('aria-controls')}`;\r\n const selectedContent = document.getElementById(currentTargetId);\r\n\r\n if (selectedContent.hasAttribute('aria-hidden')) {\r\n selectedContent.setAttribute('aria-hidden', 'false');\r\n } else {\r\n selectedContent.classList.remove('hide');\r\n }\r\n }\r\n\r\n function getButtonsAndContent(tabs, idName) {\r\n buttons = [...tabs.querySelectorAll(`[data-tab-button-${idName}]`)];\r\n content = [...tabs.querySelectorAll(`[data-tab-content-${idName}]`)];\r\n }\r\n\r\n return {\r\n init: init,\r\n clickTab: clickTab,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.uil = bgl.uil || {};\r\n\r\nbgl.uil.accordion = (function() {\r\n function init(elementId) {\r\n if (document.querySelector('[data-accordion]')) {\r\n const accordions = document.querySelectorAll('[data-accordion]');\r\n\r\n accordions.forEach((accordion) => {\r\n const triggers = accordion.querySelectorAll('[data-accordion-button]');\r\n triggers.forEach((trigger) => trigger.addEventListener(\r\n 'click',\r\n (event) => {\r\n clickAccordion(event.currentTarget);\r\n },\r\n ));\r\n });\r\n } else {\r\n const accordion = document.getElementById(elementId);\r\n const triggers = accordion.querySelectorAll('[data-accordion-button]');\r\n triggers.forEach((trigger) => trigger.addEventListener(\r\n 'click',\r\n (event) => {\r\n clickAccordion(event.currentTarget);\r\n },\r\n ));\r\n }\r\n }\r\n\r\n function clickAccordion(currentTarget) {\r\n const isAriaExpanded = currentTarget.getAttribute('aria-expanded');\r\n const currentTargetId = `${currentTarget.getAttribute('aria-controls')}`;\r\n const selectedContent = document.getElementById(currentTargetId);\r\n\r\n if (isAriaExpanded !== 'true') {\r\n const accordion = currentTarget.closest('[data-accordion]');\r\n if (accordion.getAttribute('data-accordion-type') === 'radio') {\r\n collapseAllAccordionContent(accordion);\r\n }\r\n }\r\n\r\n currentTarget.setAttribute(\r\n 'aria-expanded',\r\n isAriaExpanded === 'true' ? 'false' : 'true');\r\n\r\n selectedContent.classList.toggle('hide');\r\n selectedContent.setAttribute(\r\n 'aria-hidden',\r\n isAriaExpanded === 'true' ? 'true' : 'false');\r\n }\r\n\r\n function collapseAllAccordionContent(accordion) {\r\n const buttons = accordion.querySelectorAll('[data-accordion-button]');\r\n buttons.forEach((button) => button.setAttribute('aria-expanded', 'false'));\r\n\r\n const contents = accordion.querySelectorAll('[data-accordion-content]');\r\n contents.forEach((content) => content.classList.add('hide'));\r\n }\r\n\r\n return {\r\n init: init,\r\n clickAccordion: clickAccordion,\r\n };\r\n})();\r\n\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\n\r\nbgl.policyoverviewlink = (function() {\r\n function init(elementId) {\r\n const policyOverviewLink = document.getElementById(elementId);\r\n\r\n if (policyOverviewLink) {\r\n policyOverviewLink.addEventListener('click', function() {\r\n bgl.common.utilities.redirectToUrl(sessionStorage.getItem('policyHomeUrl'));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n init: init,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.introtour = bgl.introtour || {};\r\n\r\nbgl.introtour.steps = (function() {\r\n const storageKey = 'introTourInviteSeen';\r\n let inviteSeen = localStorage.getItem(storageKey);\r\n let tourDriver = null;\r\n let stepsInvite = [];\r\n const handleResize = debounce(() => {\r\n if (tourDriver.isActive()) {\r\n stepsConfiguration.steps = getVisibleSteps();\r\n tourDriver.setConfig(stepsConfiguration);\r\n tourDriver.refresh();\r\n }\r\n }, 250);\r\n\r\n const stepsConfiguration = {\r\n popoverClass: 'driverjs-theme',\r\n showProgress: true,\r\n progressText: 'Step {{current}}/{{total}}',\r\n showButtons: ['next', 'previous', 'close'],\r\n nextBtnText: 'Next',\r\n prevBtnText: 'Back',\r\n doneBtnText: 'Done',\r\n onHighlighted: (element, step, options) => {\r\n onHighlighted(options);\r\n },\r\n onCloseClick: () => {\r\n tourDriver.destroy();\r\n },\r\n onDestroyStarted: () => {\r\n tourDriver.destroy();\r\n },\r\n };\r\n\r\n function init(resourceBasePath, introTourDriver) {\r\n tourDriver = introTourDriver;\r\n const welcomeMessage = document\r\n .querySelector('h1[data-testid=\"PolicyOverviewHeaderMessage__header-message\"] > span')\r\n .innerText;\r\n stepsInvite = [{\r\n popover: {\r\n title: ''.concat(welcomeMessage),\r\n description: '\\n

We would love to show you around your account area.

' +\r\n '\\n ' +\r\n '\\n ',\r\n },\r\n }];\r\n\r\n document.addEventListener('keydown', (event) => {\r\n if (event.key === 'Escape') {\r\n if (tourDriver.isActive()) {\r\n tourDriver.destroy();\r\n }\r\n }\r\n });\r\n\r\n const startTourButton = document.querySelector('[data-tour=\"show-me-around\"]');\r\n startTourButton.addEventListener('click', (event) => {\r\n if (tourDriver.isActive()) {\r\n tourDriver.destroy();\r\n tourDriver.drive();\r\n } else {\r\n launchTour();\r\n }\r\n });\r\n\r\n setupTourLinkClickEvents();\r\n\r\n inviteSeen = localStorage.getItem(storageKey);\r\n if (inviteSeen === null) {\r\n launchWelcome();\r\n }\r\n }\r\n\r\n function launchWelcome() {\r\n tourDriver.setConfig({\r\n animate: true,\r\n overlayColor: 'black',\r\n overlayOpacity: 0.25,\r\n stagePadding: 16,\r\n stageRadius: 8,\r\n popoverClass: 'driverjs-theme driverjs-theme-invite',\r\n allowClose: true,\r\n showButtons: ['close'],\r\n onCloseClick: () => {\r\n tourDriver.destroy();\r\n },\r\n onHighlighted: () => {\r\n localStorage.setItem(storageKey, true);\r\n const showMeAroundButton = document.getElementById('showMeAround');\r\n if (showMeAroundButton) {\r\n showMeAroundButton.addEventListener('click', () => {\r\n tourDriver.destroy();\r\n launchTour();\r\n });\r\n }\r\n\r\n const exploreMyselfButton = document.getElementById('exploreMyself');\r\n if (exploreMyselfButton) {\r\n exploreMyselfButton.addEventListener('click', () => {\r\n tourDriver.destroy();\r\n });\r\n }\r\n },\r\n steps: stepsInvite,\r\n });\r\n setTimeout(() => {\r\n tourDriver.drive();\r\n }, 1000);\r\n }\r\n\r\n function setupTourLinkClickEvents() {\r\n const tourLinks = document\r\n .querySelectorAll('#takeMeThere_Policy, #takeMeThere_MTA, #takeMeThere_Claims');\r\n tourLinks.forEach((element) => {\r\n element.addEventListener('click', () => {\r\n tourDriver.destroy();\r\n });\r\n });\r\n\r\n const helpLink = document.getElementById('takeMeThere_Help');\r\n if (helpLink) {\r\n helpLink.addEventListener('click', () => {\r\n tourDriver.destroy();\r\n document.getElementById('houstonButton').click();\r\n });\r\n }\r\n }\r\n\r\n function launchTour() {\r\n stepsConfiguration.steps = getVisibleSteps();\r\n tourDriver.setConfig(stepsConfiguration);\r\n tourDriver.drive();\r\n window.addEventListener('resize', handleResize);\r\n }\r\n\r\n function onHighlighted(options) {\r\n const activeStep = options.state.activeIndex + 1;\r\n const total = options.config.steps.length;\r\n updateProgressBar(activeStep, total);\r\n setupTourLinkClickEvents();\r\n if (activeStep === total) {\r\n changeProgressLink();\r\n }\r\n }\r\n\r\n function getVisibleSteps() {\r\n return stepsAll.filter((step) => {\r\n return !step.element || isElementVisible(step.element);\r\n });\r\n }\r\n\r\n function changeProgressLink() {\r\n const progressText = document.querySelector('.driver-popover-progress-text');\r\n progressText.innerHTML = 'Start again';\r\n const startAgainLink = document.getElementById('startAgain');\r\n if (startAgainLink) {\r\n startAgainLink.addEventListener('click', () => {\r\n tourDriver.drive();\r\n });\r\n }\r\n }\r\n\r\n function updateProgressBar(active, total) {\r\n getProgessBar().style.width = active / total * 100 + '%';\r\n }\r\n\r\n function getProgessBar() {\r\n const progressBarId = 'intro-tour-progress-bar';\r\n let progressBar = document.querySelector('#' + progressBarId);\r\n if (!progressBar) {\r\n const footer = document.querySelector('.driver-popover-footer');\r\n const progress = document.createElement('span');\r\n progress.id = progressBarId;\r\n progress.classList.add('progress');\r\n footer.prepend(progress);\r\n progressBar = document.querySelector('#' + progressBarId);\r\n }\r\n\r\n return progressBar;\r\n }\r\n\r\n const stepsAll = [{\r\n popover: {\r\n title: 'Policy Overview',\r\n description: '

This is your dashboard, where you can quickly view your policy details, ' +\r\n 'upcoming payments, and any notifications.

' +\r\n 'Take me there

',\r\n side: 'bottom',\r\n align: 'start',\r\n },\r\n },\r\n {\r\n element: '[data-desktop-tourid=\"Make a Change\"]',\r\n popover: {\r\n title: 'Managing your policy',\r\n description: '

Head over to the \\'Make a change\\' section. It\\'s easy and only takes a few clicks.' +\r\n '

Take me there' +\r\n '

',\r\n side: 'bottom',\r\n align: 'end',\r\n },\r\n }, {\r\n element: '[data-mobile-tourid=\"Make Changes\"]',\r\n popover: {\r\n title: 'Managing your policy',\r\n description: '

Head over to the \\'Make Changes\\' section. It\\'s easy and only ' +\r\n 'takes a few clicks.

Take me there

',\r\n side: 'top',\r\n align: 'end',\r\n },\r\n }, {\r\n element: '[data-desktop-tourid=\"Claims\"]',\r\n popover: {\r\n title: 'Claims',\r\n description: '

Windscreen needs sorting, Broken down or need to track a repair?

' +\r\n 'Take me there

',\r\n side: 'bottom',\r\n align: 'end',\r\n },\r\n }, {\r\n element: '[data-mobile-tourid=\"Claims\"]',\r\n popover: {\r\n title: 'Claims',\r\n description: '

Windscreen needs sorting, Broken down or need to track a repair?

' +\r\n '

Take me there

',\r\n side: 'top',\r\n align: 'end',\r\n },\r\n }, {\r\n element: '#HoustonContainer',\r\n popover: {\r\n title: 'Support',\r\n description: '

Our helpful assistant is here to serve. Our web chat team are here too.' +\r\n '

Ask for help

',\r\n side: 'left',\r\n align: 'end',\r\n },\r\n },\r\n {\r\n element: '[data-tourid=\"quickLinks\"]',\r\n popover: {\r\n title: 'Quick access links',\r\n description: '

We have added some popular links for quick access such as making ' +\r\n 'changes and accessing documents or payments.

',\r\n side: 'bottom',\r\n align: 'start',\r\n },\r\n },\r\n {\r\n popover: {\r\n title: 'All done',\r\n description: '

Dive in and explore what MyAccount can do for you. ' +\r\n 'We\\'re here to help every step of the way.

',\r\n },\r\n }];\r\n\r\n function isElementVisible(selector) {\r\n const element = document.querySelector(selector);\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n const style = window.getComputedStyle(element);\r\n if (element.offsetParent == null && style.position != 'fixed') {\r\n return false;\r\n }\r\n\r\n if (style.display == 'none' || style.visibility == 'hidden') {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function debounce(func, wait) {\r\n let timeout;\r\n return () => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func.apply(this);\r\n }, wait);\r\n };\r\n }\r\n\r\n return {\r\n init: init,\r\n onHighlighted: onHighlighted,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.hiddensubmit = bgl.hiddensubmit || {};\r\n\r\nbgl.hiddensubmit = (() => {\r\n let initiallySelectedRadioButton;\r\n let confirmDialogue;\r\n\r\n function init() {\r\n const form = document.querySelector('[data-hidden-submit-form]');\r\n\r\n if (form) {\r\n const fieldset = document.querySelector('[data-hidden-submit-fieldset]');\r\n confirmDialogue = document.querySelector('[data-hidden-submit-confirm]');\r\n\r\n if (fieldset) {\r\n const radioButtons = [...fieldset.querySelectorAll('input[type=\"radio\"]')];\r\n\r\n radioButtons.forEach((radioButton) => {\r\n radioButton.addEventListener('click', handleRadioButtonClick);\r\n\r\n if (radioButton.checked) {\r\n initiallySelectedRadioButton = radioButton;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n const handleRadioButtonClick = (event) => {\r\n if (event.target === initiallySelectedRadioButton) {\r\n confirmDialogue.classList.add('hide');\r\n } else {\r\n confirmDialogue.classList.remove('hide');\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n})();\r\n// eslint-disable-next-line no-var\r\nvar bgl = window.bgl || {};\r\nbgl.common = bgl.common || {};\r\n\r\nbgl.common.pubsub = (function() {\r\n let events = {};\r\n\r\n function on(eventName, fn) {\r\n events[eventName] = events[eventName] || [];\r\n events[eventName].push(fn);\r\n }\r\n\r\n function off(eventName, fn) {\r\n if (events[eventName]) {\r\n for (let i = 0; i < events[eventName].length; i++) {\r\n if (events[eventName][i] === fn) {\r\n events[eventName].splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function emit(eventName, data) {\r\n if (events[eventName]) {\r\n events[eventName].forEach(function(fn) {\r\n fn(data);\r\n });\r\n }\r\n }\r\n\r\n function getEventCount(eventName) {\r\n return events[eventName].length;\r\n }\r\n\r\n function clearEvents() {\r\n events = {};\r\n }\r\n\r\n return {\r\n on: on,\r\n off: off,\r\n emit: emit,\r\n clear: clearEvents,\r\n getEventCount: getEventCount,\r\n };\r\n})();\r\n\r\nbgl.common.loader = (function() {\r\n function makeAjaxCall(options) {\r\n $.ajax({\r\n url: options.componentUrl,\r\n type: 'POST',\r\n contentType: 'application/json',\r\n data: JSON.stringify(options.componentConfiguration),\r\n success: function(data, textStatus, request) {\r\n if (\r\n request.getResponseHeader('Content-Type') ===\r\n 'application/json; charset=utf-8'\r\n ) {\r\n if (data.isSuccess && data.redirectUrl) {\r\n if (typeof options.beforePageRedirectCallback === 'function') {\r\n options.beforePageRedirectCallback();\r\n }\r\n\r\n bgl.common.utilities.redirectToUrl(data.redirectUrl);\r\n } else if (!data.isSuccess) {\r\n bgl.common.utilities.errorRedirect(data.errorRedirectUrl);\r\n }\r\n } else {\r\n const htmlChangingFunction = options.htmlChangingFunction;\r\n\r\n htmlChangingFunction.call($('#' + options.containerElementId), data);\r\n\r\n if (typeof options.callback === 'function') {\r\n options.callback();\r\n }\r\n }\r\n },\r\n error: function(error) {\r\n console.log(error);\r\n },\r\n });\r\n }\r\n\r\n function logToGA(componentConfiguration, componentUrl) {\r\n let subCall;\r\n let sliderGTMPageURL;\r\n let sliderGTMPageTitle;\r\n\r\n if ($(componentConfiguration)[0].CurrentStep) {\r\n subCall = '/' + $(componentConfiguration)[0].CurrentStep;\r\n } else if ($(componentConfiguration)[0].currentStep) {\r\n subCall = '/' + $(componentConfiguration)[0].currentStep;\r\n } else if ($(componentConfiguration)[0].EditActionKey) {\r\n subCall = '/' + $(componentConfiguration)[0].EditActionKey;\r\n } else {\r\n subCall = '';\r\n }\r\n\r\n if (componentUrl && window.dataLayer) {\r\n sliderGTMPageURL =\r\n window.location.pathname.replace(/\\/$/, '') +\r\n '/' +\r\n componentUrl.split('/').pop() +\r\n subCall;\r\n sliderGTMPageTitle = componentUrl.split('/').pop() + subCall;\r\n\r\n dataLayer.push({\r\n event: 'MAVirtualPageView',\r\n virtualPageURL: sliderGTMPageURL,\r\n virtualPageTitle: sliderGTMPageTitle,\r\n });\r\n }\r\n }\r\n\r\n function load(\r\n componentConfiguration,\r\n componentUrl,\r\n containerElementId,\r\n callback,\r\n beforePageRedirectCallback,\r\n ) {\r\n const options = {\r\n componentConfiguration: componentConfiguration,\r\n componentUrl: componentUrl,\r\n containerElementId: containerElementId,\r\n callback: callback,\r\n htmlChangingFunction: $.fn.html,\r\n beforePageRedirectCallback: beforePageRedirectCallback,\r\n };\r\n\r\n logToGA(componentConfiguration, componentUrl);\r\n makeAjaxCall(options);\r\n }\r\n\r\n function loadAndReplace(\r\n componentConfiguration,\r\n componentUrl,\r\n containerElementId,\r\n callback,\r\n beforePageRedirectCallback,\r\n ) {\r\n const options = {\r\n componentConfiguration: componentConfiguration,\r\n componentUrl: componentUrl,\r\n containerElementId: containerElementId,\r\n callback: callback,\r\n htmlChangingFunction: $.fn.replaceWith,\r\n beforePageRedirectCallback: beforePageRedirectCallback,\r\n };\r\n\r\n makeAjaxCall(options);\r\n }\r\n\r\n return {\r\n load: load,\r\n loadAndReplace: loadAndReplace,\r\n };\r\n})();\r\n\r\nbgl.common.modal = (function() {\r\n // Public Functions\r\n function show(el, event) {\r\n el.addClass('show');\r\n el.attr('aria-hidden', false);\r\n $(document.body).addClass('modal-open');\r\n showBackdrop();\r\n event.stopPropagation();\r\n }\r\n\r\n function hide(el) {\r\n el.removeClass('show');\r\n el.attr('aria-hidden', true);\r\n $(document.body).removeClass('modal-open');\r\n $('.modal').off('click');\r\n removeBackdrop();\r\n }\r\n\r\n function showBackdrop() {\r\n const backdrop = document.createElement('div');\r\n backdrop.className = 'modal-backdrop fade show';\r\n $(backdrop).appendTo(document.body);\r\n\r\n $('.modal').on('click', function(e) {\r\n if (e.target !== e.currentTarget) {\r\n return;\r\n }\r\n hide($('.modal'), e);\r\n });\r\n }\r\n\r\n function removeBackdrop() {\r\n $('.modal-backdrop').remove();\r\n $('.modal').off('click');\r\n }\r\n\r\n function loadModalContent(url, $popupContainer, popupConfiguration) {\r\n let requestData = '';\r\n if (popupConfiguration) {\r\n requestData = JSON.stringify(popupConfiguration);\r\n }\r\n\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n contentType: 'application/json',\r\n data: requestData,\r\n success: function(data) {\r\n $popupContainer.html(data);\r\n },\r\n error: function(error) {\r\n console.error(error);\r\n },\r\n });\r\n }\r\n\r\n // Event Handlers\r\n $(document).on('click', '[data-toggle=\"modal\"]', function(event) {\r\n event.preventDefault();\r\n const url = $(this).data('url');\r\n const popupConfiguration = $(this).data('configuration');\r\n\r\n bgl.common.utilities.invoke(\r\n $(this).data('togglePreModal'),\r\n $(this).data('togglePreModalParams'),\r\n );\r\n\r\n const $relatedTarget = $($(this).data('target'));\r\n show($relatedTarget, event);\r\n\r\n if (url) {\r\n loadModalContent(\r\n url,\r\n $relatedTarget.find('.modal-body'),\r\n popupConfiguration,\r\n );\r\n }\r\n });\r\n\r\n $(document).on('click', '[data-dismiss=\"modal\"]', function(event) {\r\n event.preventDefault();\r\n const $relatedTarget = $(this).closest('.modal');\r\n hide($relatedTarget, event);\r\n });\r\n})();\r\n\r\nbgl.common.validator = (function() {\r\n let validator;\r\n const options = {\r\n errorClass: 'error',\r\n hasSubmit: true,\r\n };\r\n\r\n const enterKeyCode = 13;\r\n const escKeyCode = 27;\r\n const tabKeyCode = 9;\r\n const backspaceKeyCode = 8;\r\n const deleteKeyCode = 46;\r\n const endKeyCode = 35;\r\n const downArrowKeyCode = 40;\r\n const numpadZeroKeyCode = 96;\r\n const numpadNineKeyCode = 105;\r\n const zeroKeyCode = 48;\r\n const nineKeyCode = 57;\r\n const letterAInLowerKeyCode = 65;\r\n\r\n function initFormValidator(form, optionsParameters) {\r\n form = $(form);\r\n optionsParameters = optionsParameters || {};\r\n\r\n $.extend(options, optionsParameters);\r\n\r\n // if jQuery validation is switched on\r\n if ($.validator) {\r\n setupCustomValidationRules(form);\r\n\r\n $.validator.unobtrusive.parse(form);\r\n\r\n validator = $(form).validate();\r\n\r\n if (validator) {\r\n validator.settings.onsubmit = options.onsubmit || false;\r\n validator.settings.onkeyup = options.onkeyup || false;\r\n validator.settings.onfocusout = options.onfocusout || false;\r\n validator.settings.onfocusin = options.onfocusin || false;\r\n validator.settings.onclick = options.onclick || false;\r\n validator.settings.focusInvalid = options.focusInvalid || false;\r\n validator.settings.cleanUp = options.cleanUp || false;\r\n validator.settings.errorClass = options.errorClass || 'error';\r\n validator.settings.highlight =\r\n options.highlight ||\r\n function(element) {\r\n highlightElement(element);\r\n };\r\n validator.settings.unhighlight =\r\n options.unhighlight ||\r\n function(element) {\r\n unhighlighElement(element);\r\n };\r\n validator.settings.ignore =\r\n options.ignore !== undefined ?\r\n options.ignore :\r\n validator.settings.ignore;\r\n }\r\n }\r\n\r\n return validator;\r\n }\r\n\r\n function setupCustomValidationRules(form) {\r\n if (form.find('[data-val-requirefromgroup]')) {\r\n setRequireAtLeastOneOfGroupValidation();\r\n }\r\n\r\n if (form.find('[data-val-dateformat]')) {\r\n setValidationOfDateToFormat();\r\n }\r\n\r\n if (form.find('[data-val-requiredif]')) {\r\n setRequiredIfValidation();\r\n }\r\n }\r\n\r\n function validateForm(configuration, form) {\r\n form = $(form);\r\n const isValidForm = isFormValid(form);\r\n\r\n /* client side validation is passed\r\n or skipped if jQuery validation is switched off */\r\n if (isValidForm) {\r\n submitComponentForm(form, configuration);\r\n }\r\n\r\n return isValidForm;\r\n }\r\n\r\n function isFormValid(form) {\r\n form = $(form);\r\n let isValidForm = true;\r\n validator = getFormValidator(form);\r\n\r\n // try to validate the form using jQuery validation\r\n if (validator) {\r\n isValidForm = $(form).valid() && options.hasSubmit;\r\n }\r\n\r\n if (!isValidForm) {\r\n scrollToTheFirstInvalidInput();\r\n getValidationMessages();\r\n }\r\n\r\n /* client side validation is passed\r\n or skipped if jQuery validation is switched off */\r\n return isValidForm;\r\n }\r\n\r\n function getValidationMessages() {\r\n if ($('.form-row').hasClass('error')) {\r\n const data = {\r\n form_section: getFormSectionName($(this)),\r\n error_details: [],\r\n };\r\n\r\n $('.error').find('.form-row__validation-text').each(function() {\r\n const errorDetail = {\r\n error_field: $(this).attr('data-valmsg-for'),\r\n error_message: $(this).text(),\r\n };\r\n\r\n data.error_details.push(errorDetail);\r\n });\r\n\r\n bgl.common.pubsub.emit('formValidationFailed', data);\r\n }\r\n }\r\n\r\n function getFormSectionName() {\r\n const formRow = '.form-row__validation-text';\r\n\r\n if ($(formRow)\r\n .parents()\r\n .find('.step-form__section-title')\r\n .text()\r\n .length === 0) {\r\n return $(formRow).closest('form').find('h1').text();\r\n } else {\r\n return $(formRow)\r\n .closest('form')\r\n .find('.step-form__section-title')\r\n .text();\r\n }\r\n }\r\n\r\n function enableMaxLength() {\r\n $('input[data-val-length-max]').each(function(index, element) {\r\n const maxLength = $(element).data('val-length-max');\r\n\r\n $(element).attr('maxlength', maxLength);\r\n });\r\n }\r\n\r\n function getFormValidator(form) {\r\n form = form || {};\r\n\r\n if (validator) {\r\n return validator;\r\n }\r\n\r\n if ($.validator) {\r\n $.validator.unobtrusive.parse(form);\r\n\r\n validator = $(form).validate({\r\n ignore: '.hide',\r\n });\r\n\r\n $.extend(options, validator.settings);\r\n }\r\n\r\n return validator;\r\n }\r\n\r\n function highlightElement(element) {\r\n element = element || $();\r\n const parentRow = $(element).closest('div.form-row') || $();\r\n\r\n if (parentRow.length > 0) {\r\n $(parentRow).addClass(options.errorClass);\r\n } else {\r\n $(element).addClass(options.errorClass);\r\n }\r\n }\r\n\r\n function unhighlighElement(element) {\r\n element = element || $();\r\n const parentRow = $(element).closest('div.form-row') || $();\r\n\r\n if (parentRow.length > 0) {\r\n $(parentRow).removeClass(options.errorClass);\r\n } else {\r\n $(element).removeClass(options.errorClass);\r\n }\r\n\r\n cleanAriaDescribedbyAttribute(element);\r\n }\r\n\r\n function cleanAriaDescribedbyAttribute(element) {\r\n if (!$(element).attr('aria-describedby')) {\r\n return;\r\n }\r\n\r\n const currentAriaDescribedBy = $(element)\r\n .attr('aria-describedBy')\r\n .split(' ');\r\n const newAriaDescribedBy = [];\r\n\r\n $(currentAriaDescribedBy).each(function(i, elementID) {\r\n elementID = elementID.trim();\r\n if ($('#' + elementID).length) {\r\n newAriaDescribedBy.push(elementID);\r\n }\r\n });\r\n\r\n if (newAriaDescribedBy.length) {\r\n $(element).attr('aria-describedby', newAriaDescribedBy.join(' '));\r\n } else {\r\n $(element).removeAttr('aria-describedby');\r\n }\r\n }\r\n\r\n function submitComponentForm(form, configuration, requestBodyData) {\r\n form = $(form);\r\n const disabled = $('form [data-disable-submit][disabled]').length > 0;\r\n\r\n if (!disabled) {\r\n $('form [data-disable-submit]').attr('disabled', 'disabled');\r\n\r\n bgl.common.pubsub.emit('formSubmit',\r\n form.attr('id') ||\r\n form.attr('action') ||\r\n 'unknown');\r\n\r\n const dataToPost =\r\n requestBodyData ||\r\n $(form).serialize() +\r\n '&' +\r\n $.param({ComponentConfiguration: configuration});\r\n\r\n $.ajax({\r\n url: $(form).attr('action'),\r\n type: $(form).attr('method'),\r\n data: dataToPost,\r\n success: function(data) {\r\n onSuccess(form, configuration, data);\r\n },\r\n error: function(error) {\r\n onError(form, configuration, error.responseText);\r\n },\r\n });\r\n }\r\n }\r\n\r\n function onSuccess(form, configuration, data) {\r\n if (data !== undefined && data !== null) {\r\n if (data.isSuccess === true) {\r\n callFormEvent($(form), 'onSuccess', configuration, data);\r\n } else {\r\n if (data.errorRedirectUrl !== undefined) {\r\n bgl.common.utilities.errorRedirect(data.errorRedirectUrl);\r\n } else {\r\n onError(form, configuration, data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function onError(form, configuration, error) {\r\n form = form || $();\r\n\r\n const $error = $(error);\r\n const $component = $('div[data-component-id=\"' + configuration.Id + '\"]');\r\n\r\n if ($error.length && $component.length) {\r\n $component.replaceWith($error);\r\n }\r\n\r\n const $invalidForm = $error.find('#' + form.attr('id'));\r\n const invalidInputs = {};\r\n\r\n $error.find('input, select').each(function(index, element) {\r\n unhighlighElement($(element));\r\n const inputName = $(element).attr('name');\r\n const message = $('[data-valmsg-for=\"' + inputName + '\"]').text();\r\n\r\n if (message !== '') {\r\n const htmlMessage = $.parseHTML(message);\r\n\r\n $('[data-valmsg-for=\"' + inputName + '\"]').html(htmlMessage);\r\n invalidInputs[inputName] = htmlMessage;\r\n }\r\n });\r\n\r\n callFormEvent($invalidForm, 'onError', configuration, error);\r\n\r\n validator = getFormValidator($invalidForm);\r\n\r\n // if jQuery validation is switched on\r\n if (validator) {\r\n validator.showErrors(invalidInputs);\r\n } else {\r\n // highlight errors if jQuery validation is switched off\r\n showErrors(invalidInputs);\r\n }\r\n\r\n scrollToTheFirstInvalidInput();\r\n }\r\n\r\n function callFormEvent(form, event, configuration, data) {\r\n const onEventName = form.data(event);\r\n const callback = eval(onEventName);\r\n\r\n if (typeof callback === 'function') {\r\n callback(configuration, data);\r\n }\r\n }\r\n\r\n function showErrors(invalidInputs) {\r\n $.each(invalidInputs, function(key) {\r\n highlightElement($('[name=\"' + key + '\"]'));\r\n });\r\n }\r\n\r\n function addRequireAtLeastOneOfGroupMethod(value, element, params) {\r\n const controlsWithValue = $(\r\n 'input[data-val-requirefromgroup-selector=\"' +\r\n params['selector'] + '\"]',\r\n ).filter(function() {\r\n const controlType = $(this).attr('type');\r\n\r\n return controlType === 'checkbox' || controlType === 'radio' ?\r\n $(this).prop('checked') === true :\r\n $(this).val() !== '';\r\n });\r\n\r\n return controlsWithValue.length >= params['number'];\r\n }\r\n\r\n function setRequireAtLeastOneOfGroupValidation() {\r\n $.validator.addMethod(\r\n 'require_from_group',\r\n addRequireAtLeastOneOfGroupMethod,\r\n '',\r\n );\r\n\r\n $.validator.unobtrusive.adapters.add(\r\n 'requirefromgroup',\r\n ['number', 'selector'],\r\n function(options) {\r\n options.rules['require_from_group'] = {\r\n number: options.params.number,\r\n selector: options.params.selector,\r\n };\r\n options.messages['require_from_group'] = options.message;\r\n },\r\n );\r\n }\r\n\r\n function addRequiredIfValidationMethod(value, element, parameters) {\r\n const id =\r\n '[data-dependent-property=\\'' + parameters['dependentproperty'] + '\\']';\r\n\r\n // get the target value (as a string,\r\n // as that's what actual value will be)\r\n let targetValue = parameters['targetvalue'];\r\n targetValue = (targetValue === null ? '' : targetValue).toString();\r\n\r\n // get the actual value of the target control\r\n // note - this probably needs to cater for more\r\n // control types, e.g. radios\r\n const control = $(id);\r\n const controlType = control.attr('type');\r\n let actualValue =\r\n controlType === 'checkbox' || controlType === 'radio' ?\r\n control.filter(':checked').val() :\r\n control.val();\r\n\r\n actualValue =\r\n actualValue !== undefined && actualValue !== null ?\r\n actualValue.toLowerCase() :\r\n actualValue;\r\n\r\n // if the condition is true, reuse the existing\r\n // required field validator functionality\r\n if (\r\n $.trim(targetValue.toLowerCase()) === $.trim(actualValue) ||\r\n ($.trim(targetValue) === '*' && $.trim(actualValue) !== '')\r\n ) {\r\n return $.validator.methods.required.call(\r\n this,\r\n value,\r\n element,\r\n parameters,\r\n );\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function setRequiredIfValidation() {\r\n $.validator.addMethod('requiredif', addRequiredIfValidationMethod);\r\n\r\n $.validator.unobtrusive.adapters.add(\r\n 'requiredif',\r\n ['dependentproperty', 'targetvalue'],\r\n function(options) {\r\n options.rules['requiredif'] = {\r\n dependentproperty: options.params['dependentproperty'],\r\n targetvalue: options.params['targetvalue'],\r\n };\r\n options.messages['requiredif'] = options.message;\r\n },\r\n );\r\n }\r\n\r\n function setValidationOfDateToFormat() {\r\n $.validator.addMethod('dateformat', validateDateFormat);\r\n\r\n $.validator.unobtrusive.adapters.add(\r\n 'dateformat',\r\n ['regex', 'separator'],\r\n function(options) {\r\n options.rules['dateformat'] = {\r\n regex: options.params['regex'],\r\n separator: options.params['separator'],\r\n };\r\n options.messages['dateformat'] = options.message;\r\n },\r\n );\r\n }\r\n\r\n function validateDateFormat(value, element, parameters) {\r\n const separator = parameters['separator'];\r\n\r\n const regex = new RegExp(parameters['regex']);\r\n\r\n if (regex.test(value)) {\r\n const adata = value.split(separator);\r\n\r\n const day = parseInt(adata[0], 10);\r\n const month = parseInt(adata[1], 10) - 1;\r\n const year = parseInt(adata[2], 10);\r\n\r\n const xdata = new Date(year, month, day);\r\n\r\n if (\r\n xdata.getFullYear() === year &&\r\n xdata.getMonth() === month &&\r\n xdata.getDate() === day\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function initAutocompleteSearchInputs(form) {\r\n form = $(form);\r\n const autocompleteSearchInputs = form.find('[autocompletesearch]');\r\n\r\n $.each(autocompleteSearchInputs, function(index, element) {\r\n const input = $(element);\r\n\r\n $.validator.addMethod(\r\n input.attr('name'),\r\n validateAutocompleteSearchInputs,\r\n input.data('val-required'),\r\n );\r\n });\r\n }\r\n\r\n function resetValidationState(input) {\r\n unhighlighElement(input);\r\n }\r\n\r\n function validateAutocompleteSearchInputs(value, element) {\r\n const hiddenItemInputId = $(element).attr('id') + 'Id';\r\n const valueId = $('#' + hiddenItemInputId).val();\r\n\r\n return valueId.length !== 0;\r\n }\r\n\r\n function scrollToTheFirstInvalidInput() {\r\n let headerHeight;\r\n const invalidInput = $('.error, .error-messagebox').first();\r\n\r\n if (invalidInput.length) {\r\n let header;\r\n let selector;\r\n let inputTopPosition = invalidInput.offset().top;\r\n\r\n const slidePanelId = bgl.common.contentpanel.getSlidePanelId();\r\n const isInputInSlidePanel = invalidInput\r\n .closest('#' + slidePanelId)\r\n .length;\r\n\r\n if (isInputInSlidePanel) {\r\n header = $('header.panel-header');\r\n selector = $('#' + slidePanelId);\r\n\r\n const slidePanelContentTopPosition = $(\r\n '#' + bgl.common.contentpanel.getSlidePanelContentId(),\r\n ).offset().top;\r\n inputTopPosition -= slidePanelContentTopPosition;\r\n } else {\r\n header = $('header.page-header, header.page-headerv2');\r\n selector = $(window);\r\n }\r\n\r\n headerHeight = header.height() || 0;\r\n\r\n if (header.css('position') === 'fixed') {\r\n headerHeight *= -1;\r\n }\r\n\r\n selector.scrollTop(inputTopPosition + headerHeight);\r\n const invalidInputElem = invalidInput.find('input, select, textarea')[0];\r\n if (invalidInputElem !== undefined) {\r\n invalidInputElem.focus();\r\n }\r\n }\r\n }\r\n\r\n function initNumberInputField(component, maxLength) {\r\n const isZeroAvailable = component.data('val-range-min') === 0;\r\n\r\n $(component)\r\n .off('keydown')\r\n .on('keydown', function(e) {\r\n if (\r\n $.inArray(e.keyCode, [\r\n deleteKeyCode,\r\n backspaceKeyCode,\r\n tabKeyCode,\r\n escKeyCode,\r\n enterKeyCode,\r\n ]) !== -1 ||\r\n (e.keyCode === letterAInLowerKeyCode &&\r\n (e.ctrlKey === true || e.metaKey === true)) ||\r\n (e.keyCode >= endKeyCode && e.keyCode <= downArrowKeyCode)\r\n ) {\r\n return;\r\n }\r\n if (\r\n ((e.shiftKey ||\r\n e.keyCode < zeroKeyCode ||\r\n e.keyCode > nineKeyCode) &&\r\n (e.keyCode < numpadZeroKeyCode || e.keyCode > numpadNineKeyCode)) ||\r\n $(this).val().length === maxLength ||\r\n (!isZeroAvailable &&\r\n e.keyCode === numpadZeroKeyCode &&\r\n $(this).val().length === 0)\r\n ) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n $(component)\r\n .off('keyup')\r\n .on('keyup', function() {\r\n let val = $(this).val();\r\n while (val.substring(0, 1) === '0') {\r\n if (isZeroAvailable && val.length === 1) {\r\n break;\r\n }\r\n val = val.substring(1);\r\n }\r\n $(this).val(val);\r\n });\r\n }\r\n\r\n function validatePage(buttonId) {\r\n $('#' + buttonId)\r\n .off('click')\r\n .on('click', function(e) {\r\n e.preventDefault();\r\n\r\n const components = $('[data-component-state=\\'partialerror\\']');\r\n\r\n if (components !== undefined && components.length > 0) {\r\n $.each(components, function(index, value) {\r\n highlightElement($(value));\r\n });\r\n\r\n scrollToTheFirstInvalidInput();\r\n } else {\r\n bgl.common.utilities.redirectToUrl($(this).attr('href'));\r\n }\r\n });\r\n }\r\n\r\n return {\r\n init: initFormValidator,\r\n validate: validateForm,\r\n isFormValid: isFormValid,\r\n getValidationMessages: getValidationMessages,\r\n enableMaxLength: enableMaxLength,\r\n initAutocompleteSearchInputs: initAutocompleteSearchInputs,\r\n resetValidationState: resetValidationState,\r\n submitForm: submitComponentForm,\r\n initNumberInputField: initNumberInputField,\r\n validatePage: validatePage,\r\n };\r\n})();\r\n\r\nbgl.common.utilities = (function() {\r\n let globalIdentifier = this;\r\n\r\n function invoke(funcName, funcParams) {\r\n if (funcName !== undefined && funcName !== null && funcName !== '') {\r\n const params =\r\n funcParams !== undefined && funcParams !== null ?\r\n funcParams.split(',') :\r\n [];\r\n\r\n const object = funcName.split('.');\r\n let fn = globalIdentifier;\r\n\r\n for (let i = 0, len = object.length; i < len && fn; i++) {\r\n fn = fn[object[i]];\r\n }\r\n\r\n if (typeof fn === 'function') {\r\n fn(...params);\r\n } else {\r\n console.error(funcName + ' is not a function.');\r\n }\r\n }\r\n }\r\n\r\n function setIdentifier(indentifier) {\r\n if (indentifier !== undefined && indentifier !== null) {\r\n globalIdentifier = indentifier;\r\n }\r\n }\r\n\r\n function startUnderwritingPolling() {\r\n bgl.common.pubsub.emit('PollBasket');\r\n }\r\n\r\n function getWindowLocation() {\r\n return window.location;\r\n }\r\n\r\n function getUrlHashValue() {\r\n return window.location.hash.substring(1);\r\n }\r\n\r\n function setUrlHashValue(hash) {\r\n window.location.hash = hash;\r\n }\r\n\r\n function errorRedirect(errorRedirectUrl) {\r\n errorRedirectUrl = errorRedirectUrl.replace(/\\?returnUrl=.*$/i, '');\r\n bgl.common.utilities.redirectToUrl(errorRedirectUrl);\r\n }\r\n\r\n function redirectToUrl(url) {\r\n window.location.href = url;\r\n }\r\n\r\n function refreshPage() {\r\n window.location.reload(true);\r\n }\r\n\r\n function toBase64(str) {\r\n return window.btoa(unescape(encodeURIComponent(str)));\r\n }\r\n\r\n function fromBase64(str) {\r\n return decodeURIComponent(escape(window.atob(str)));\r\n }\r\n\r\n function getUrlQueryString(parameterName) {\r\n parameterName = parameterName.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n const regex = new RegExp('[\\\\?&]' + parameterName + '=([^&#]*)');\r\n const results = regex.exec(location.search);\r\n return results === null ?\r\n '' :\r\n decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n }\r\n\r\n return {\r\n invoke: invoke,\r\n setIdentifier: setIdentifier,\r\n startUnderwritingPolling: startUnderwritingPolling,\r\n getWindowLocation: getWindowLocation,\r\n getUrlHashValue: getUrlHashValue,\r\n setUrlHashValue: setUrlHashValue,\r\n redirectToUrl: redirectToUrl,\r\n errorRedirect: errorRedirect,\r\n refreshPage: refreshPage,\r\n toBase64: toBase64,\r\n fromBase64: fromBase64,\r\n getUrlQueryString: getUrlQueryString,\r\n };\r\n})();\r\n\r\nbgl.common.cookie = (function() {\r\n function getCookie(name) {\r\n const matches = document.cookie.match(\r\n new RegExp(\r\n '(?:^|; )' +\r\n name.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, '\\\\$1') +\r\n '=([^;]*)',\r\n ),\r\n );\r\n\r\n return matches ? decodeURIComponent(matches[1]) : undefined;\r\n }\r\n\r\n function setCookie(name, value, options) {\r\n options = options || {};\r\n\r\n let expires = options.expires;\r\n\r\n if (typeof expires === 'number' && expires) {\r\n const d = new Date();\r\n d.setTime(d.getTime() + expires * 1000);\r\n expires = options.expires = d;\r\n }\r\n\r\n if (expires && expires.toUTCString) {\r\n options.expires = expires.toUTCString();\r\n }\r\n\r\n value = encodeURIComponent(value);\r\n\r\n let updatedCookie = name + '=' + value;\r\n\r\n for (const propName in options) {\r\n updatedCookie += '; ' + propName;\r\n const propValue = options[propName];\r\n\r\n if (propValue !== true) {\r\n updatedCookie += '=' + propValue;\r\n }\r\n }\r\n\r\n document.cookie = updatedCookie + '; path=/';\r\n }\r\n\r\n function getUrlForCookieAsync(componentUrl) {\r\n const regex = /\\/((\\w+)|(\\w+\\/))$/gi;\r\n\r\n const url = componentUrl.replace(regex, '/UpdateCookie');\r\n\r\n return url;\r\n }\r\n\r\n function setCookieAsync(\r\n cookieKey,\r\n cookieValue,\r\n updateCookieUrl,\r\n onSuccess,\r\n onFailure,\r\n ) {\r\n $.ajax({\r\n url: updateCookieUrl,\r\n type: 'POST',\r\n contentType: 'application/json',\r\n data: JSON.stringify({cookieKey: cookieKey, cookieValue: cookieValue}),\r\n success: function(data) {\r\n if (data && data.isSuccess) {\r\n if (typeof onSuccess === 'function') {\r\n onSuccess();\r\n }\r\n }\r\n },\r\n error: function(error) {\r\n if (typeof onFailure === 'function') {\r\n onFailure();\r\n }\r\n console.log(error);\r\n },\r\n });\r\n }\r\n\r\n function deleteCookie(name) {\r\n deleteCookieByNameAndPath(name, '/');\r\n }\r\n\r\n function deleteCookieByNameAndPath(name, path) {\r\n setCookie(name, '', {expires: -1, path: path});\r\n }\r\n\r\n return {\r\n getCookie: getCookie,\r\n setCookie: setCookie,\r\n deleteCookie: deleteCookie,\r\n deleteCookieByNameAndPath: deleteCookieByNameAndPath,\r\n setCookieAsync: setCookieAsync,\r\n getUrlForCookieAsync: getUrlForCookieAsync,\r\n };\r\n})();\r\n\r\nbgl.common.carousel = (function() {\r\n let carousel; let tabs; let slides; let options;\r\n\r\n function createCarouselBlock() {\r\n carousel = options.element;\r\n slides = carousel.find('.carousel__slide');\r\n tabs = carousel.find('.carousel__navigation-tab');\r\n\r\n const ctrls = $('