{"version":3,"sources":["app.base.js","loadingOverlay.js","toast.js","dataLayer.js","general.js","navigation.js","app.init.js"],"names":["breakpoint_sm","breakpoint_md","breakpoint_lg","breakpoint_xl","breakpoint_xxl","breakpoint_xs_max","breakpoint_sm_max","breakpoint_md_max","breakpoint_lg_max","breakpoint_xl_max","window","NodeList","prototype","forEach","Array","util","frontEndVersion","debugMode","uiCulture","uiLanguage","homePageId","path","getVersionedUrl","url","this","onDocumentReady","callback","document","readyState","addEventListener","endsWith","str","lookup","indexOf","length","startsWith","escapeRegExp","replace","getCookie","name","parts","cookie","split","undefined","pop","shift","setCookie","value","expiryDays","domain","let","expirationDate","Date","setDate","getDate","toUTCString","push","join","deleteCookie","deepExtend","Object","assign","target","i","arguments","key","source","hasOwnProperty","call","apply","isPlainObject","obj","constructor","isMobile","test","navigator","userAgent","isIE","isEdge","getQueryString","results","RegExp","exec","location","href","getAnchor","urlParts","URL","debounce","func","timeout","timer","args","clearTimeout","setTimeout","debounceLeading","addGlobalEventListener","type","selector","event","matches","getVideoEmbedHtmlFromUrl","youTubeMatch","vimeoMatch","slideUp","duration","cb","style","transitionProperty","transitionDuration","boxSizing","height","offsetHeight","overflow","opacity","paddingTop","paddingBottom","marginTop","marginBottom","display","visibility","removeProperty","slideDown","getComputedStyle","slideToggle","areEqualArrays","first","second","includes","scrollContainerTo","container","offset","contains","scrollTo","top","offsetTop","behavior","isKeyboardEvent","KeyboardEvent","clientX","clientY","updateCookiebotConsent","consents","preferencesConsent","statisticsConsent","Cookiebot","consent","console","error","preferences","statistics","marketingConsent","marketing","submitCustomConsent","app","LoadingOverlay","opts","querySelector","styleProperty","onClose","targetElement","targetPositionStyle","position","overlay","element","currentStyle","defaultView","getPropertyValue","createElement","classList","add","tagName","overlayIcon","close","remove","removeChild","innerHTML","appendChild","module","exports","Toast","message","status","closeLabel","toastTimeout","toast","closeButton","toastMessage","setAttribute","toastContainer","e","preventDefault","toastWrapper","parentNode","insertBefore","children","dataLayer","initGtmElements","querySelectorAll","dataset","gtmInit","eventName","gtmEvent","pathname","getAttribute","pagePart","pushEvent","log","init","email","atob","searchResults","keywords","searchKeywords","general","updateViewportdDimensions","documentElement","setProperty","innerHeight","innerWidth","initEmailLinks","link","initViewportDimensions","passive","initAnchorLinks","getBoundingClientRect","scrollY","navigation","_isKeyboardEvent","_mediaQueryIsMobile","matchMedia","_trigger","_container","_close","_body","initMenu","closeMenu","menu","firstMenuItem","focus","closeText","code","resetSubmenu","transform","openText","toggles","activeToggles","toggle","tabIndex","parent","subnav","onWindowResize","body","getElementById","version","culture","homepageId","info","min","index","toastType","toLowerCase","ljs","load","accordion","carousel","videos","lightbox","VideoLightbox","hasMarketingConsent","removeConsentWarning","scrollIntoView","comparisonTable","aspnetValidation","genericForm","sidebarNav","HtmlLightbox","button","maxWidth","html","locationsLoaded","locations","heroFilter"],"mappings":"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","file":"../app.min.js","sourcesContent":["/* ========================================================================\n Breakpoints\n ========================================================================== */\n\nvar breakpoint_sm = '(min-width: 576px)';\nvar breakpoint_md = '(min-width: 768px)';\nvar breakpoint_lg = '(min-width: 992px)';\nvar breakpoint_xl = '(min-width: 1200px)';\nvar breakpoint_xxl = '(min-width: 1400px)';\n\nvar breakpoint_xs_max = '(max-width: 575.98px)';\nvar breakpoint_sm_max = '(max-width: 767.98px)';\nvar breakpoint_md_max = '(max-width: 991.98px)';\nvar breakpoint_lg_max = '(max-width: 1199.98px)';\nvar breakpoint_xl_max = '(max-width: 1399.98px)';\n\n/* ========================================================================\n Polyfills\n ========================================================================== */\n\nif (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}\n\n/* ========================================================================\n Utilities\n ========================================================================== */\n\nconst util = {\n frontEndVersion: '1',\n debugMode: false,\n uiCulture: null,\n uiLanguage: null,\n homePageId: null,\n path: null,\n\n getVersionedUrl: function (url) {\n return url + '?cdv=' + this.frontEndVersion;\n },\n\n onDocumentReady: function (callback) {\n const isReady = document.readyState != null && document.readyState != 'loading';\n\n if (isReady) {\n callback();\n } else {\n document.addEventListener('DOMContentLoaded', callback);\n }\n },\n\n endsWith: function (str, lookup) {\n return str.indexOf(lookup, str.length - lookup.length) !== -1;\n },\n\n startsWith: function (str, lookup) {\n return str.indexOf(lookup) === 0;\n },\n\n // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n escapeRegExp: function (str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n },\n\n // hasClass: function (element, selector) {\n // let s = ' ';\n // return (\n // element.nodeType === 1 &&\n // (s + element.className + s)\n // .replace(/[\\n\\t]/g, s)\n // .indexOf(s + selector + s) >= 0\n // );\n // },\n\n // addClass: function (element, className) {\n // if (this.hasClass(element, className) === false) {\n // element.className += ' ' + className;\n // }\n // },\n\n // removeClass: function (element, className) {\n // const regex = new RegExp(\n // '[\\\\b|\\\\s]*' + this.escapeRegExp(className) + '[\\\\b|\\\\s]*',\n // 'gi'\n // );\n // element.className = element.className.replace(regex, '');\n // },\n\n //isValidEmail: function (email) {\n // if (!email) return false;\n\n // return /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]{2,})+$/.test(email);\n //},\n\n getCookie: function (name) {\n let value = '; ' + document.cookie;\n let parts = value.split('; ' + name + '=');\n return parts.length !== 2 ? undefined : parts.pop().split(';').shift();\n },\n\n setCookie: function (name, value, expiryDays, domain, path) {\n let expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + (expiryDays || 365));\n\n let cookie = [\n name + '=' + value,\n 'Expires=' + expirationDate.toUTCString(),\n 'Path=' + (path || '/'),\n 'SameSite=Lax',\n ];\n\n if (domain) {\n cookie.push('Domain=' + domain);\n }\n\n document.cookie = cookie.join(';');\n },\n\n deleteCookie: function (name) {\n this.setCookie(name, '', -1);\n },\n\n deepExtend: function () {\n let extended =\n Object.assign ||\n function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return extended.apply(this, arguments);\n },\n\n isPlainObject: function (obj) {\n // The code \"typeof obj === 'object' && obj !== null\" allows Array objects\n return typeof obj === 'object' && obj !== null && obj.constructor === Object;\n },\n\n isMobile: function () {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n },\n\n isIE: function () {\n // MSIE used to detect old browsers and Trident used to newer ones\n return navigator.userAgent.indexOf('MSIE ') > -1 || navigator.userAgent.indexOf('Trident/') > -1;\n },\n\n isEdge: function () {\n return navigator.userAgent.indexOf('Edge/') > -1;\n },\n\n getQueryString: function (name) {\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n const regexS = '[\\\\?&]' + name + '=([^&#]*)';\n const regex = new RegExp(regexS);\n let results = regex.exec(window.location.href);\n if (results === null) {\n return '';\n } else {\n return results[1];\n }\n },\n\n getAnchor: function () {\n const urlParts = document.URL.split('#');\n return urlParts.length > 1 ? urlParts[1] : null;\n },\n\n // sortSelect: function (el, sortVal) {\n // sortVal = sortVal || 'text';\n\n // // Checks for an object or string. Uses string as ID.\n // switch (typeof el) {\n // case 'string':\n // el = document.getElementById(el);\n // break;\n // case 'object':\n // if (el == null) return false;\n // break;\n // default:\n // return false;\n // }\n\n // // Builds the options list.\n // let arr = new Array();\n // for (var i = 0; i < el.options.length; i++) {\n // arr[i] = new Array();\n // arr[i][0] = el.options[i].text;\n // arr[i][1] = el.options[i].value;\n // }\n\n // // Allows sortVal to be optional, defaults to text.\n // switch (sortVal) {\n // case 'value': // sort by value\n // sortVal = 1;\n // break;\n // default:\n // // sort by text\n // sortVal = 0;\n // }\n\n // arr.sort((a, b) => {\n // return a[sortVal] == b[sortVal] ? 0 : a[sortVal] < b[sortVal] ? -1 : 1;\n // });\n\n // // Removes all options from the select.\n // while (el.options.length > 0) {\n // el.options[0] = null;\n // }\n\n // // Recreates all options with the new order.\n // for (var i = 0; i < arr.length; i++) {\n // var op = new Option(arr[i][0], arr[i][1]);\n // el.options[i] = op;\n // }\n\n // return true;\n // },\n\n // Requires `smoothscroll.js` polyfill for unsupported browsers: http://iamdustan.com/smoothscroll/\n // scrollTo: function (el, options) {\n // options = options || {};\n\n // if (el.length === 0) return;\n\n // let defaults = {\n // offset: 0,\n // pushHash: true,\n // };\n\n // options = util.deepExtend(defaults, options);\n\n // let hash = el.getAttribute('href');\n\n // if (hash !== '#') {\n // let target = document.querySelector(hash);\n\n // if (!target) {\n // target = document.querySelector(\n // 'a[name=\"' + hash.replace('#', '') + '\"]'\n // );\n // }\n\n // if (!target) return;\n\n // target.scrollIntoView({\n // behavior: 'smooth',\n // });\n\n // let elementPosition = target.offsetTop;\n // let offsetPosition = elementPosition - options.offset;\n\n // window.scrollTo({\n // top: offsetPosition,\n // behavior: 'smooth',\n // });\n\n // if (options.pushHash) {\n // window.location.hash = hash.replace('#', '');\n // }\n // }\n // },\n\n // Use `insertBefore` instead of `appendChild`: https://www.paulirish.com/2011/surefire-dom-element-insertion/\n // injectFile: function (path, type, ref) {\n // if (type == 'js') {\n // let el = document.createElement('script');\n // el.setAttribute('type', 'text/javascript');\n // el.setAttribute('src', path);\n // placeholder.parentNode.insertBefore(el, ref);\n // } else if (type == 'css') {\n // let el = document.createElement('link');\n // el.setAttribute('rel', 'stylesheet');\n // el.setAttribute('type', 'text/css');\n // el.setAttribute('href', path);\n // placeholder.parentNode.insertBefore(el, ref);\n // }\n // },\n\n // https://www.freecodecamp.org/news/javascript-debounce-example/\n debounce: function (func, timeout) {\n timeout = timeout || 250;\n\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func.apply(this, args);\n }, timeout);\n };\n },\n\n debounceLeading: function (func, timeout) {\n timeout = timeout || 250;\n\n let timer;\n return (...args) => {\n if (!timer) {\n func.apply(this, args);\n }\n\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n }, timeout);\n };\n },\n\n addGlobalEventListener: function (type, selector, callback) {\n document.addEventListener(type, (event) => {\n if (event.target.matches(selector)) callback(event);\n });\n },\n\n getVideoEmbedHtmlFromUrl: function (url) {\n const youTubeRegex =\n /https?:\\/\\/.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\/|live\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?\\/]*).*/i;\n const vimeoRegex =\n /https?:\\/\\/(?:www.)?vimeo.com\\/(?:channels\\/(?:w+\\/)?|groups\\/(?:[^\\/]*)\\/videos\\/|)(\\d+)(?:|\\/?)/i;\n\n const youTubeMatch = youTubeRegex.exec(url);\n const vimeoMatch = vimeoRegex.exec(url);\n\n // YouTube\n if (youTubeMatch && youTubeMatch.length >= 2) {\n return (\n ''\n );\n }\n\n // Vimeo\n if (vimeoMatch && vimeoMatch.length >= 2) {\n return (\n ''\n );\n }\n\n return '';\n },\n\n slideUp: function (target, duration, cb) {\n duration = duration || 500;\n\n target.style.transitionProperty = 'height, margin, padding, opacity';\n target.style.transitionDuration = duration + 'ms';\n target.style.boxSizing = 'border-box';\n target.style.height = target.offsetHeight + 'px';\n\n window.setTimeout(() => {\n target.style.overflow = 'hidden';\n target.style.opacity = 0;\n target.style.height = 0;\n target.style.paddingTop = 0;\n target.style.paddingBottom = 0;\n target.style.marginTop = 0;\n target.style.marginBottom = 0;\n\n window.setTimeout(() => {\n target.style.display = 'none';\n target.style.visibility = 'hidden';\n target.style.removeProperty('height');\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n target.style.removeProperty('box-sizing');\n target.style.removeProperty('opacity');\n }, duration);\n }, 10);\n\n if (typeof cb === 'function') {\n window.setTimeout(cb, duration + 10);\n }\n },\n\n slideDown: function (target, duration, cb) {\n duration = duration || 500;\n\n target.style.removeProperty('display');\n let display = window.getComputedStyle(target).display;\n if (display === 'none') display = 'block';\n target.style.display = display;\n let height = target.offsetHeight;\n target.style.overflow = 'hidden';\n target.style.opacity = 0;\n target.style.height = 0;\n target.style.paddingTop = 0;\n target.style.paddingBottom = 0;\n target.style.marginTop = 0;\n target.style.marginBottom = 0;\n target.style.boxSizing = 'border-box';\n\n window.setTimeout(() => {\n target.style.transitionProperty = 'height, margin, padding, opacity';\n target.style.transitionDuration = duration + 'ms';\n target.style.height = height + 'px';\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n target.style.opacity = 1;\n target.style.visibility = 'visible';\n\n window.setTimeout(() => {\n target.style.removeProperty('height');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n }, duration);\n }, 10);\n\n if (typeof cb === 'function') {\n window.setTimeout(cb, duration + 10);\n }\n },\n\n slideToggle: function (target, duration, cb) {\n duration = duration || 500;\n\n if (window.getComputedStyle(target).display === 'none') {\n return slideDown(target, duration, cb);\n } else {\n return slideUp(target, duration, cb);\n }\n },\n\n areEqualArrays: function (first, second) {\n if (first.length !== second.length) {\n return false;\n }\n for (let i = 0; i < first.length; i++) {\n if (second.includes(first[i]) === false) {\n return false;\n }\n }\n return true;\n },\n\n scrollContainerTo: function (container, target, offset) {\n if (container.contains(target)) {\n offset = typeof offset === 'number' ? offset : 0;\n container.scrollTo({\n top: target.offsetTop - offset,\n behavior: 'smooth',\n });\n } else {\n throw 'scrollContainerTo Error: target not found in container';\n }\n },\n\n isKeyboardEvent: function (event) {\n return event instanceof KeyboardEvent || (event.clientX === 0 && event.clientY === 0);\n },\n\n updateCookiebotConsent: function (consents) {\n if (!consents) return;\n if (typeof Cookiebot.consent === 'undefined') {\n console.error('Cookiebot has not been initialized (blocked by adblocker?)');\n return;\n }\n\n let preferencesConsent = consents.indexOf('preferences') > -1 ? true : Cookiebot.consent.preferences;\n let statisticsConsent = consents.indexOf('statistics') > -1 ? true : Cookiebot.consent.statistics;\n let marketingConsent = consents.indexOf('marketing') > -1 ? true : Cookiebot.consent.marketing;\n\n Cookiebot.submitCustomConsent(preferencesConsent, statisticsConsent, marketingConsent);\n },\n};\n\n/* ========================================================================\n Use module pattern to encapsulate JavaScript: http://bit.ly/2jM4ptd\n Define custom namespace\n ========================================================================== */\n\nvar app = app || {};\n","(function () {\n 'use strict';\n\n function LoadingOverlay(target, timeout, opts) {\n // Set default values\n target = target || document.querySelector('body');\n timeout = timeout || 0;\n\n opts = opts || {};\n\n let defaults = {\n onClose: function () {},\n };\n\n opts = util.deepExtend(defaults, opts);\n\n // Check if target is selector or element\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else {\n targetElement = target;\n }\n\n // Save target's position style\n let targetPositionStyle = targetElement.style.position;\n\n // Set target's position style to relative if needed\n if (getStyle(targetElement, 'position') === 'static') {\n targetElement.style.position = 'relative';\n }\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.classList.add('loadingOverlay');\n\n // Set overlay height\n if (targetElement.tagName === 'BODY') {\n overlay.style.position = 'fixed';\n overlay.style.height = 'var(--vh)';\n // overlay.style.minHeight = '100vh';\n } else {\n overlay.style.position = 'absolute';\n overlay.style.height = '100%';\n }\n\n // Create overlay icon\n const overlayIcon = document.createElement('div');\n overlayIcon.classList.add('loadingOverlay__icon');\n overlayIcon.innerHTML =\n '';\n\n // Add icon to overlay\n overlay.appendChild(overlayIcon);\n\n // Add overlay to target element\n targetElement.classList.add('loadingOverlay__container');\n targetElement.appendChild(overlay);\n\n // Auto-close overlay if timeout has been set\n if (timeout > 0) {\n window.setTimeout(() => {\n close();\n }, timeout);\n }\n\n function close() {\n targetElement.classList.remove('loadingOverlay__container');\n targetElement.removeChild(overlay);\n opts.onClose();\n\n if (targetPositionStyle === '') {\n targetElement.style.position = targetPositionStyle;\n } else {\n targetElement.style.removeProperty('position');\n }\n }\n\n function getStyle(element, styleProperty) {\n if (element.currentStyle) {\n return element.currentStyle[styleProperty];\n } else if (window.getComputedStyle) {\n return document.defaultView.getComputedStyle(element, null).getPropertyValue(styleProperty);\n } else {\n return null;\n }\n }\n\n return {\n close: close,\n };\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = LoadingOverlay;\n } else {\n window.LoadingOverlay = LoadingOverlay;\n }\n})();\n","(function () {\n 'use strict';\n\n function Toast(message, status, timeout, opts) {\n // Set default values\n message = message || '';\n status = status || 'info';\n timeout = timeout || 5000;\n\n opts = opts || {};\n\n let defaults = {\n onClose: function () {},\n closeLabel: 'Close notification',\n };\n\n opts = util.deepExtend(defaults, opts);\n\n // Used to determine whether to remove setTimeout or not\n let toastTimeout;\n\n // Create alert element\n const toast = document.createElement('div');\n toast.classList.add('toast__item');\n\n // Attach correct colour to alert\n toast.classList.add('is-' + status);\n\n // Create close button\n const closeButton = document.createElement('a');\n closeButton.classList.add('toast__close');\n closeButton.setAttribute('aria-label', opts.closeLabel);\n closeButton.href = '#';\n closeButton.innerHTML =\n '';\n\n // Add message and close button\n const toastMessage = document.createElement('div');\n toastMessage.classList.add('toast__message');\n toastMessage.innerHTML = message;\n\n toast.appendChild(closeButton);\n toast.appendChild(toastMessage);\n\n // Event listeners\n closeButton.addEventListener('click', (e) => {\n e.preventDefault();\n close();\n });\n\n toast.addEventListener('mouseover', () => {\n if (toast.classList.contains('is-fade-out') === false)\n clearTimeout(toastTimeout);\n });\n\n toast.addEventListener('mouseout', () => {\n toastTimeout = window.setTimeout(() => {\n close();\n }, 3000);\n });\n\n // Prepend new alert to container\n let toastContainer = document.querySelector('.toast__container');\n let toastWrapper = document.querySelector('.toast__wrapper');\n\n // Create container if it doesn't exist\n if (!toastContainer) {\n toastContainer = document.createElement('div');\n toastContainer.classList.add('toast__container');\n\n toastWrapper = document.createElement('div');\n toastWrapper.classList.add('toast__wrapper');\n\n toastContainer.appendChild(toastWrapper);\n document.querySelector('body').appendChild(toastContainer);\n }\n\n toastWrapper.insertBefore(toast, toastWrapper.children[0]);\n\n // If they haven't clicked close within the timeout period, fade out and remove element\n toastTimeout = window.setTimeout(() => {\n close();\n }, timeout);\n\n function close() {\n if (toast.parentNode) {\n toast.classList.add('is-fade-out');\n toastTimeout = window.setTimeout(() => {\n toast.parentNode.removeChild(toast);\n opts.onClose();\n }, 500);\n }\n }\n\n return {\n close: close,\n };\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = Toast;\n } else {\n window.Toast = Toast;\n }\n})();\n","/* ========================================================================\n Data Layer (GTM)\n ========================================================================== */\n\napp.dataLayer = (function () {\n 'use strict';\n\n window.dataLayer = window.dataLayer || [];\n\n const init = function () {\n initGtmElements();\n intTelElements();\n initMailtoElements();\n initSearchKeywords();\n };\n\n const initGtmElements = function () {\n const gtmElements = document.querySelectorAll('[data-gtm-event]');\n\n gtmElements.forEach((element) => {\n if (element.dataset.gtmInit) return;\n\n element.addEventListener('click', (event) => {\n let eventName = element.dataset.gtmEvent ? element.dataset.gtmEvent : '';\n\n if (eventName === '') return;\n let args = {};\n\n args['pageUrl'] = window.location.pathname;\n args['destinationUrl'] = element.getAttribute('href');\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent(eventName, args);\n });\n\n element.dataset.gtmInit = true;\n });\n };\n\n const intTelElements = function () {\n const telElements = document.querySelectorAll('[href^=\"tel:\"]');\n\n telElements.forEach((element) => {\n // Check if element already has a custom event\n if (typeof element.dataset.gtmEvent !== 'undefined') return;\n\n element.addEventListener('click', (event) => {\n let args = {};\n\n args['pageUrl'] = window.location.pathname;\n args['contact'] = element.getAttribute('href');\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent('phoneNumberClick', args);\n });\n });\n };\n\n const initMailtoElements = function () {\n const mailtoElements = document.querySelectorAll('[href^=\"mailto:\"], [data-email]');\n\n mailtoElements.forEach((element) => {\n // Check if element already has a custom event\n if (typeof element.dataset.gtmEvent !== 'undefined') return;\n\n element.addEventListener('click', (event) => {\n let args = {};\n let email = '';\n\n if (typeof element.dataset.email !== 'undefined') {\n email = 'mailto:' + atob(element.getAttribute('data-email'));\n } else {\n email = element.getAttribute('href');\n }\n\n args['pageUrl'] = window.location.pathname;\n args['contact'] = email;\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent('emailClick', args);\n });\n });\n };\n\n const initSearchKeywords = function () {\n const searchResults = document.querySelector('[data-search-keywords]');\n if (searchResults) {\n pushEvent('search', {\n keywords: searchResults.dataset.searchKeywords,\n });\n }\n };\n\n const pushEvent = function (eventName, args) {\n if (eventName === '') return;\n\n args = args || {};\n\n let gtmEvent = { event: eventName };\n\n for (const key in args) {\n if (args.hasOwnProperty(key)) {\n gtmEvent[key] = args[key];\n }\n }\n\n // DATALAYER\n window.dataLayer.push(gtmEvent);\n\n if (util.debugMode) console.log(gtmEvent);\n };\n\n // Expose public functions and variables\n return {\n init: init,\n initGtmElements: initGtmElements,\n pushEvent: pushEvent,\n };\n})();\n","/* ========================================================================\n General\n ========================================================================== */\n\napp.general = (function () {\n 'use strict';\n\n function initEmailLinks() {\n // Handle base-64 encoded mailto-links\n const links = document.querySelectorAll('a[data-email]');\n\n links.forEach((link) => {\n link.addEventListener('click', (event) => {\n event.preventDefault();\n let email = atob(link.getAttribute('data-email'));\n window.location.href = 'mailto:' + email;\n });\n });\n }\n\n // function initLax() {\n // lax.init();\n\n // // Add a driver that we use to control our animations\n // lax.addDriver('scrollY', function () {\n // return window.scrollY;\n // });\n\n // lax.addElements('[data-lax]]', {\n // scrollY: {\n // translateY: [\n // ['elInY', 'elOutY'],\n // [0, -250],\n // ],\n // },\n // });\n // }\n\n const updateViewportdDimensions = util.debounce(() => {\n document.documentElement.style.setProperty(\n '--vh',\n window.innerHeight + 'px'\n );\n document.documentElement.style.setProperty(\n '--vw',\n window.innerWidth + 'px'\n );\n }, 250);\n\n function initViewportDimensions() {\n // Init viewport dimensions\n updateViewportdDimensions();\n\n // Handle viewport dimensions on resize\n window.addEventListener(\n 'resize',\n () => {\n updateViewportdDimensions();\n },\n { passive: true }\n );\n }\n\n // let isTouch = false;\n // let isTouchTimer;\n // const isTouchClass = 'is-touch';\n\n // function addTouchClass() {\n // window.clearTimeout(isTouchTimer);\n // if (isTouch === true) return;\n\n // isTouchTimer = window.setTimeout(() => {\n // document.documentElement.classList.add(isTouchClass);\n // isTouch = true;\n // }, 250);\n // }\n\n // function removeTouchClass() {\n // if (isTouch === false) return;\n\n // document.documentElement.classList.remove(isTouchClass);\n // isTouch = false;\n // }\n\n // function initTouch() {\n // document.addEventListener('touchstart', addTouchClass, { passive: true });\n // document.addEventListener('mouseup', removeTouchClass);\n // }\n\n function initAnchorLinks() {\n const links = document.querySelectorAll('a[href^=\"#\"]');\n\n links.forEach((link) => {\n const href = link.getAttribute('href');\n if (href === '#') return;\n\n const target = document.querySelector(href);\n if (!target) return;\n\n link.addEventListener('click', (event) => {\n event.preventDefault();\n scrollToTarget(target);\n });\n });\n\n // var gotoQs = util.getQueryString('goto');\n // if (gotoQs) {\n // const target = document.querySelector('#' + gotoQs);\n // if (!target) return;\n\n // setTimeout(() => {\n // scrollToTarget(target);\n // }, 500);\n // }\n }\n\n function scrollToTarget(target) {\n const offset = 100;\n const top = target.getBoundingClientRect().top + window.scrollY;\n\n window.scrollTo({\n top: top - offset,\n behavior: 'smooth',\n });\n }\n\n // Expose public functions and variables\n return {\n initEmailLinks: initEmailLinks,\n // initLax: initLax,\n initViewportDimensions: initViewportDimensions,\n updateViewportdDimensions: updateViewportdDimensions,\n // initTouch: initTouch,\n initAnchorLinks: initAnchorLinks,\n };\n})();\n","/* ========================================================================\n Navigation\n ========================================================================== */\n\napp.navigation = (function () {\n 'use strict';\n\n function init() {\n initMenu();\n initSubmenu();\n }\n\n const KEY_ENTER = 'Enter';\n const KEY_SPACE = 'Space';\n const KEY_ESCAPE = 'Escape';\n\n let _isKeyboardEvent = false;\n const _mediaQueryIsMobile = window.matchMedia('(max-width: 767.98px)');\n // const _mainNav = document.querySelector('[data-main-nav]');\n const _trigger = document.querySelector('[data-main-nav-trigger]');\n const _container = document.querySelector('[data-main-nav-container]');\n const _close = document.querySelector('[data-main-nav-close]');\n const _body = document.querySelector('body');\n // const _scrollWatcher = document.querySelector('[data-scroll-watcher]');\n // const _floatingNavButton = document.querySelector('[data-floating-nav-button]');\n\n //\n // Menu\n //\n\n function initMenu() {\n if (!_trigger || !_container) return;\n\n document.addEventListener('click', (event) => {\n if (event.target.classList.contains('pageWrapper')) {\n _isKeyboardEvent = util.isKeyboardEvent(event);\n closeMenu();\n }\n });\n\n _trigger.addEventListener('click', (event) => {\n _isKeyboardEvent = util.isKeyboardEvent(event);\n toggleMenu();\n });\n\n _close.addEventListener('click', (event) => {\n _isKeyboardEvent = util.isKeyboardEvent(event);\n closeMenu();\n });\n\n _container.addEventListener('keydown', (event) => {\n if (event.code === KEY_ESCAPE) {\n _isKeyboardEvent = true;\n closeMenu();\n }\n });\n\n // _floatingNavButton.addEventListener('click', (event) => {\n // toggleMenu(false);\n // });\n\n // // navigation observer\n // if (_scrollWatcher) {\n // const navObserver = new IntersectionObserver(toggleFloatingNavButton);\n // navObserver.observe(_scrollWatcher);\n // }\n }\n\n // function toggleFloatingNavButton() {\n // if (_scrollWatcher.getBoundingClientRect().top <= -1) {\n // _floatingNavButton.classList.add('is-visible');\n // } else {\n // _floatingNavButton.classList.remove('is-visible');\n // }\n // }\n\n function toggleMenu() {\n if (_trigger.getAttribute('aria-expanded') === 'false') {\n openMenu();\n } else {\n closeMenu();\n }\n }\n\n function openMenu() {\n _container.classList.add('is-open');\n _container.style.visibility = 'visible';\n _body.dataset.menu = 'open';\n\n // a11y: switch focus to first link\n const firstMenuItem = _container.querySelector('.navExt__sub__link');\n if (_isKeyboardEvent && firstMenuItem) firstMenuItem.focus();\n\n // a11y: update aria attributes\n _trigger.setAttribute('aria-label', _trigger.dataset.closeText);\n _trigger.setAttribute('aria-expanded', true);\n }\n\n function closeMenu() {\n resetSubmenu();\n\n _container.style.transform = 'translateY(-100%)';\n _body.dataset.menu = 'closing';\n\n window.setTimeout(() => {\n _container.classList.remove('is-open');\n _body.classList.remove('has-open-menu');\n\n // a11y: switch focus back to trigger\n if (_isKeyboardEvent) _trigger.focus();\n\n // a11y: update aria attributes\n _trigger.setAttribute('aria-label', _trigger.dataset.openText);\n _trigger.setAttribute('aria-expanded', false);\n\n _container.style.visibility = null;\n _container.style.transform = null;\n _body.dataset.menu = '';\n }, 500);\n }\n\n //\n // Submenus\n //\n\n function initSubmenu() {\n const toggles = document.querySelectorAll('[data-menu-item-toggle]');\n\n if (!toggles) return;\n\n toggles.forEach((toggle) => {\n const parent = toggle.parentNode.parentNode;\n const subnav = parent.querySelector('[data-menu-item-sub]');\n\n if (!parent || !subnav) return;\n\n toggle.addEventListener('click', (event) => {\n event.preventDefault();\n\n // Don't do anything if not mobile\n if (_mediaQueryIsMobile.matches === false) return;\n\n if (parent.classList.contains('is-open') === false) {\n // close all open submenus\n resetSubmenu();\n\n parent.classList.add('is-open');\n util.slideDown(subnav, 250);\n\n // a11y: update aria attributes\n toggle.setAttribute('aria-label', toggle.dataset.closeText);\n toggle.setAttribute('aria-expanded', true);\n } else {\n util.slideUp(subnav, 250);\n parent.classList.remove('is-open');\n\n // a11y: update aria attributes\n toggle.setAttribute('aria-label', toggle.dataset.openText);\n toggle.setAttribute('aria-expanded', false);\n }\n });\n });\n }\n\n function resetSubmenu() {\n // Don't reset if not mobile\n if (_mediaQueryIsMobile.matches === false) return;\n\n const toggles = document.querySelectorAll('[data-menu-item-toggle]');\n const activeToggles = document.querySelectorAll('[data-menu-item-toggle][aria-expanded=\"true\"]');\n\n toggles.forEach((toggle) => {\n toggle.tabIndex = 0;\n });\n\n if (activeToggles.length === 0) return;\n\n activeToggles.forEach((toggle) => {\n const parent = toggle.parentNode.parentNode;\n const subnav = parent.querySelector('[data-menu-item-sub]');\n\n if (!parent || !subnav) return;\n\n util.slideUp(subnav, 250);\n parent.classList.remove('is-open');\n\n // a11y: update aria attributes\n toggle.setAttribute('aria-label', toggle.dataset.openText);\n toggle.setAttribute('aria-expanded', false);\n });\n }\n\n function openAllSubmenus() {\n const toggles = document.querySelectorAll('[data-menu-item-toggle]');\n\n if (!toggles) return;\n\n toggles.forEach((toggle) => {\n const parent = toggle.parentNode.parentNode;\n const subnav = parent.querySelector('[data-menu-item-sub]');\n\n if (!parent || !subnav) return;\n\n util.slideDown(subnav, 250);\n parent.classList.add('is-open');\n\n // a11y: update aria attributes\n toggle.setAttribute('aria-label', toggle.dataset.closeText);\n toggle.setAttribute('aria-expanded', true);\n toggle.tabIndex = -1;\n });\n }\n\n //\n // Handle submenus on window resize\n // Close all submenus on mobile, open all on desktop\n //\n\n function onWindowResize() {\n if (_mediaQueryIsMobile.matches) {\n resetSubmenu();\n } else {\n openAllSubmenus();\n }\n }\n\n _mediaQueryIsMobile.addEventListener('change', onWindowResize);\n onWindowResize();\n\n // Expose public functions and variables\n return {\n initMenu: initMenu,\n init: init,\n };\n})();\n","/* ========================================================================\n On document ready do stuff\n ========================================================================== */\n\nutil.onDocumentReady(function () {\n const body = document.getElementById('body');\n\n // Set frontend version\n util.frontEndVersion = body.dataset.version;\n\n // Set debug mode\n util.debugMode = body.dataset.debugMode === 'true';\n\n // Set culture\n util.uiCulture = body.dataset.culture;\n\n // Set language\n util.uiLanguage = util.uiCulture ? util.uiCulture.split('-')[0] : null;\n\n // Set homepage Id\n util.homePageId = body.dataset.homepageId;\n\n // Set path\n util.path = body.dataset.path;\n\n if (util.debugMode) {\n console.info(util.uiCulture, util.uiLanguage, util.homePageId, util.path);\n if (!util.uiCulture) console.error('Culture is not set');\n if (!util.uiLanguage) console.error('Language is not set');\n if (!util.homePageId) console.error('HomePageId is not set');\n if (!util.path) console.error('Path is not set');\n }\n\n // Enable transitions\n document.documentElement.classList.remove('is-loading');\n\n // Enable SVG in IE11\n // svg4everybody();\n\n app.general.initViewportDimensions();\n // app.general.initAnchorLinks();\n app.navigation.init();\n // app.navigation.initSearchBox();\n app.general.initEmailLinks();\n // app.general.initLax();\n app.dataLayer.init();\n\n const min = util.debugMode === false ? '.min' : '';\n\n if (document.querySelectorAll('[data-toast-message]').length > 0) {\n // show toast messages (with delay)\n const toastMessages = document.querySelectorAll('[data-toast-message]');\n toastMessages.forEach((message, index) => {\n window.setTimeout(() => {\n Toast(message.innerHTML, message.dataset.toastType.toLowerCase(), message.dataset.toastTimeout ?? 7500);\n }, index * 1000);\n });\n }\n\n if (document.querySelectorAll('[data-accordion-list]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.accordion' + min + '.js'), () => {\n app.accordion.init();\n });\n }\n\n if (\n document.querySelectorAll('[data-carousel]').length > 0 ||\n document.querySelectorAll('[data-hero-carousel]').length > 0 ||\n document.querySelectorAll('[data-logo-carousel]').length > 0\n ) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/embla' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/embla-carousel-autoplay' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.carousel' + min + '.js'),\n () => {\n app.carousel.init();\n }\n );\n }\n\n if (document.querySelectorAll('[data-video]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.videos' + min + '.js'), () => {\n app.videos.init();\n });\n }\n\n if (document.querySelectorAll('[data-video-lightbox]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/videoLightbox' + min + '.js'), () => {\n const videos = document.querySelectorAll('[data-video-lightbox]');\n const lightbox = VideoLightbox(videos);\n\n window.addEventListener(\n 'CookiebotOnAccept',\n (event) => {\n if (lightbox.hasMarketingConsent()) {\n lightbox.removeConsentWarning();\n }\n },\n false\n );\n });\n }\n\n if (document.querySelector('.searchResults')) {\n if (document.location.href.indexOf('?') > -1) {\n setTimeout(() => {\n document.querySelector('[data-results-anchor]').scrollIntoView({\n behavior: 'smooth',\n });\n }, 500);\n }\n }\n\n // ljs.load(\n // util.getVersionedUrl('/scripts/dist/forms.newsletter' + min + '.js'),\n // () => {\n // // Load aspnet-validation if not loaded yet\n // // Use a delay to make sure it doesn't conflict with Umbraco Forms' version of aspnet-validation\n // window.setTimeout(() => {\n // if (typeof window.aspnetValidation !== 'object') {\n // ljs.load(\n // '/scripts/dist/aspnet-validation.min.js',\n // util.getVersionedUrl('/scripts/dist/forms.validation.min.js'),\n // () => {}\n // );\n // }\n // }, 2000);\n // }\n // );\n\n if (document.querySelectorAll('[data-comparison-table]').length > 0) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/dialog' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.comparisonTable' + min + '.js'),\n () => {\n app.comparisonTable.init();\n }\n );\n }\n\n if (document.querySelectorAll('[data-generic-form]').length > 0) {\n window.setTimeout(() => {\n if (typeof window.aspnetValidation !== 'object') {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/aspnet-validation' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/forms.validation' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/forms.generic' + min + '.js'),\n () => {\n app.genericForm.init();\n }\n );\n } else {\n ljs.load(util.getVersionedUrl('/scripts/dist/forms.generic' + min + '.js'), () => {\n app.genericForm.init();\n });\n }\n }, 1000);\n }\n\n if (document.querySelectorAll('[data-sidebar-nav]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.sidebarNav' + min + '.js'), () => {\n app.sidebarNav.init();\n });\n }\n\n if (document.querySelectorAll('[data-image-lightbox]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/lightbox' + min + '.js'), () => {\n const buttons = document.querySelectorAll('[data-image-lightbox]');\n buttons.forEach((button) => {\n HtmlLightbox(button, {\n maxWidth: 1600,\n html: `\"\"`,\n });\n });\n });\n }\n\n if (document.querySelectorAll('[data-locations]').length > 0) {\n let locationsLoaded = false;\n\n document.addEventListener('lazybeforeunveil', (event) => {\n if (locationsLoaded === false && event.target.getAttribute('data-locations') === 'true') {\n ljs.load(\n 'https://unpkg.com/mustache@4.2.0/mustache' + min + '.js',\n util.getVersionedUrl('/scripts/dist/jsonpath' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.locations' + min + '.js'),\n () => {\n app.locations.init();\n locationsLoaded = true;\n }\n );\n }\n });\n }\n\n if (document.querySelectorAll('[data-hero-filter]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.heroFilter' + min + '.js'), () => {\n app.heroFilter.init();\n });\n }\n});\n"]}