{"version":3,"file":"main.min.js","sources":["../../../Frontend/js/utils/onReady.js","../../../Frontend/js/utils/helpers.js","../../../Frontend/js/utils/elementProperties.js","../../../Frontend/js/utils/scrollLock.js","../../../Frontend/js/utils/scroll.js","../../../Frontend/js/utils/stickyNavOnScroll.js","../../../Frontend/js/utils/windowResize.js","../../../Frontend/js/layout/navigation.js","../../../Frontend/js/modules/video.js","../../../node_modules/rellax/rellax.js","../../../Frontend/js/modules/employee-list.js","../../../Frontend/js/components/filter.js","../../../Frontend/js/components/form.js","../../../Frontend/js/modules/osiris.js","../../../Frontend/js/main.js","../../../Frontend/js/components/rellax.js"],"sourcesContent":["/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === 'interactive' || document.readyState === 'complete';\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n if (typeof functionReference === 'function') {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","export const allowStatCookies = window.CookieInformation && CookieInformation.getConsentGivenFor('cookie_cat_statistic');\r\nexport const isTouch = 'ontouchstart' in window;\r\nexport const isIE11 = !!window.MSInputMethodContext && !!document.documentMode;\r\n\r\n/**\r\n * Sets a custom CSS variable to ensure precise vh unit mesuarment\r\n *\r\n */\r\nexport function setVhProp(event) {\r\n // Small delay is needed when orientationchange is triggered\r\n const delay = event != undefined && event.type == 'orientationchange' ? 100 : 0;\r\n setTimeout(() => {\r\n // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\r\n const vh = window.innerHeight * 0.01;\r\n // Then we set the value in the --vh custom property to the root of the document\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n }, delay);\r\n}\r\n\r\nexport function initVhUnitOverwrite() {\r\n setVhProp();\r\n window.addEventListener('orientationchange', setVhProp);\r\n}\r\n\r\nexport function canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n\r\n if (elem.getContext && elem.getContext('2d')) {\r\n // was able or not to get WebP representation\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n\r\n // very old browser like IE 8, canvas not supported\r\n return false;\r\n}\r\n\r\n/**\r\n * Add a to the head\r\n */\r\nexport function addPrefetch(kind, url, as) {\r\n const linkElem = document.createElement('link');\r\n linkElem.rel = kind;\r\n linkElem.href = url;\r\n if (as) {\r\n linkElem.as = as;\r\n }\r\n linkElem.crossorigin = true;\r\n document.head.append(linkElem);\r\n}\r\n\r\n/**\r\n * Format number sparated with commas per thousand.\r\n *\r\n * @param {Number} num - Number you want to format\r\n *\r\n * @returns {string} - Returns the number formatet with commas\r\n *\r\n * @example:\r\n * console.info(formatNumber(2665)) // 2,665\r\n * console.info(formatNumber(102665)) // 102,665\r\n * console.info(formatNumber(1240.5)) // 1,240.5\r\n */\r\n\r\nexport function formatNumber(num, seperator = '.') {\r\n return num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, `$1${seperator}`);\r\n}\r\n\r\n/**\r\n * Prevent function from being executed as long as it is invoked, while given delay hasn't passed.\r\n *\r\n * @param {Function} callback Callback\r\n * @param {String} delay Delay\r\n * @return {Function} Callback\r\n */\r\nexport function debounce(callback, delay) {\r\n let timer = null;\r\n\r\n return function () {\r\n const context = this,\r\n args = arguments;\r\n\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(function () {\r\n callback.apply(context, args);\r\n }, delay);\r\n };\r\n}\r\n\r\n/*\r\n* Load JavsScript asynchronously when needed\r\n* @param {String} source The path to the file\r\n* @param {Function} callback The callback to excecute upon load\r\n* @return {Element} Element to attach\r\n*/\r\nexport function loadJS (source, callback) {\r\n const reference = document.getElementsByTagName('script')[0];\r\n const script = document.createElement('script');\r\n\r\n script.src = source;\r\n script.async = true;\r\n reference.parentNode.insertBefore(script, reference);\r\n\r\n if (callback && typeof(callback) === 'function') {\r\n script.onload = callback;\r\n }\r\n\r\n return script;\r\n}\r\n\r\n/**\r\n * Get the thumbnail dimensions to use for a given player size.\r\n *\r\n * @param {Object} options\r\n * @param {number} options.width The width of the player\r\n * @param {number} options.height The height of the player\r\n * @return {Object} The width and height\r\n */\r\nexport function getRoundedDimensions({ width, height }) {\r\n let roundedWidth = width;\r\n let roundedHeight = height;\r\n\r\n // If the original width is a multiple of 320 then we should\r\n // not round up. This is to keep the native image dimensions\r\n // so that they match up with the actual frames from the video.\r\n //\r\n // For example 640x360, 960x540, 1280x720, 1920x1080\r\n //\r\n // Round up to nearest 100 px to improve cacheability at the\r\n // CDN. For example, any width between 601 pixels and 699\r\n // pixels will render the thumbnail at 700 pixels width.\r\n if (roundedWidth % 320 !== 0) {\r\n roundedWidth = Math.ceil(width / 100) * 100;\r\n roundedHeight = Math.round((roundedWidth / width) * height);\r\n }\r\n\r\n return {\r\n width: roundedWidth,\r\n height: roundedHeight\r\n };\r\n}","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n/**\r\n * Check if an element is in the viewport\r\n *\r\n * @param {HTMLElement} elem - The element to check\r\n */\r\nexport function isVisible(elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element || element instanceof Document || element instanceof Window;\r\n}\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n const useElement = typeof element === 'string' ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw 'getElementPosition did not find an element.';\r\n }\r\n\r\n const useRelativeTo = typeof relativeTo === 'string' ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw 'getElementPosition did not find an element to show the position relative to.';\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n console.warn('Can\\'t get scroll-position or given argument type.');\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n}\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n // Calculate width with margin\r\n if (options.includeMargin) {\r\n width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n }\r\n\r\n // Calculate width without border\r\n if (!options.includeBorder) {\r\n width -= parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);\r\n }\r\n\r\n // Calculate width without padding\r\n if (!options.includePadding) {\r\n width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * Get height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get height including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get height including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get height including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get height of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The height as a number\r\n */\r\nexport function getElementHeight(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get height including border and padding\r\n let height = element.offsetHeight;\r\n\r\n // Calculate height with margin\r\n if (options.includeMargin) {\r\n height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n }\r\n\r\n // Calculate height without border\r\n if (!options.includeBorder) {\r\n height -= parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n\r\n // Calculate height without padding\r\n if (!options.includePadding) {\r\n height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\r\n }\r\n\r\n return height;\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport { getElementScroll } from './elementProperties';\r\n\r\nconst className = 'scroll-lock';\r\nlet scrollTop = 0;\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let scrollLocked = false;\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!scrollLocked) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = 'fixed';\r\n htmlTag.style.overflow = 'hidden';\r\n htmlTag.style.width = '100%';\r\n document.body.style.overflowY = 'scroll';\r\n\r\n // Remember state\r\n scrollLocked = true;\r\n scrollTop = scrollPosition.top;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const enable = enableScrollLock;\r\n\r\n/**\r\n * Disable the scroll lock\r\n */\r\nexport function disableScrollLock() {\r\n if (scrollLocked) {\r\n const scrollPosition = getElementScroll();\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.remove(className);\r\n htmlTag.style.marginTop = '';\r\n htmlTag.style.position = '';\r\n htmlTag.style.overflow = '';\r\n htmlTag.style.width = '';\r\n document.body.removeAttribute('style');\r\n // Set the scroll position to what it was before\r\n window.scrollTo(scrollPosition.left, scrollTop);\r\n\r\n // Remember state\r\n scrollLocked = false;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const disable = disableScrollLock;\r\n\r\n/**\r\n * Toggle the scroll lock between on and off\r\n */\r\nexport function toggleScrollLock() {\r\n if (scrollLocked) {\r\n disableScrollLock();\r\n } else {\r\n enableScrollLock();\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const toggle = toggleScrollLock;\r\n\r\nexport default {\r\n enable,\r\n disable,\r\n toggle\r\n};\r\n","export let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n\r\nlet ticking = false;\r\nconst scrollFunctions = [];\r\n\r\nfunction animate() {\r\n scrollFunctions.forEach(funcRef => funcRef());\r\n\r\n ticking = false;\r\n}\r\n\r\nfunction requestTick() {\r\n if (!ticking) {\r\n requestAnimationFrame(animate);\r\n ticking = true;\r\n }\r\n}\r\n\r\nfunction scrollHandler() {\r\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n requestTick();\r\n}\r\n\r\n/**\r\n * Adds a function to a function array, executed on a single scroll-event set on window.\r\n * This avoids the memory load and possible hickups of setting multiple eventlisteners for the same event.\r\n * Also this optimizes rendering by utilising the requestAnimationFrame for these scroll-events.\r\n *\r\n * @param {Function} handler - function to be called on scroll\r\n * @param {boolean} triggerNow - Should the function be called at once\r\n */\r\nexport function onScroll(handler, triggerNow = false) {\r\n // if first call: setup eventlistener on window\r\n !scrollFunctions.length ? initScroll() : null;\r\n\r\n // Trigger function\r\n triggerNow ? handler() : null;\r\n\r\n scrollFunctions.push(handler);\r\n}\r\n\r\nexport function initScroll() {\r\n window.addEventListener('scroll', scrollHandler);\r\n}\r\n\r\n/**\r\n * Scrolls the viewport to an hash-id\r\n * if found in querystring\r\n */\r\nexport function scrollToUrlHash() {\r\n if (window.location.hash) {\r\n const element = document.getElementById(window.location.hash.replace('#', ''));\r\n const topPos = element?.getBoundingClientRect().top + window.pageYOffset;\r\n\r\n if (element) {\r\n window.scrollTo(element, topPos);\r\n }\r\n }\r\n}\r\n","import { getElementScroll } from './elementProperties';\r\nimport { scrollLocked } from './scrollLock';\r\nimport { onScroll } from './scroll';\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element - element to add sticky class to\r\n * @param {string} className - sticky class name to add on scroll\r\n * @param {number} scrollInPixels - number of pixels before activating scroll\r\n * @param {string} goingUpClass - class added when scrolling up\r\n */\r\nexport function stickyNavOnScroll(element, className = 'nav--sticky', scrollInPixels = 30, goingUpClass = 'nav--going-up') {\r\n let scrollTimer;\r\n let lastScrollPosition;\r\n\r\n const scrollHandler = () => {\r\n\r\n clearTimeout(scrollTimer);\r\n\r\n if (!scrollLocked) {\r\n scrollTimer = setTimeout(() => {\r\n const windowScroll = getElementScroll();\r\n\r\n if (windowScroll.top > scrollInPixels) {\r\n element.classList.add(className);\r\n\r\n if (lastScrollPosition > windowScroll.top) {\r\n element.classList.add(goingUpClass);\r\n } else {\r\n element.classList.remove(goingUpClass);\r\n }\r\n\r\n lastScrollPosition = windowScroll.top;\r\n } else {\r\n element.classList.remove(className);\r\n element.classList.remove(goingUpClass);\r\n }\r\n }, 30);\r\n }\r\n\r\n };\r\n\r\n onScroll(scrollHandler, true);\r\n}\r\n","import settings from '../../settings.json';\r\n\r\nexport const breakpoints = settings.breakpoints;\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint;\r\nexport let currentBreakpointIndex = 0;\r\nlet resizeTimer;\r\n\r\nconst resizeFunctions = [];\r\n\r\n/**\r\n * Get various window sizes - width, height etc.\r\n * This function is fired automatically upon page load. and run each time the window changes size.\r\n *\r\n */\r\nfunction getWindowSizes() {\r\n currentWindowWidth = window.innerWidth;\r\n currentWindowHeight = window.innerHeight;\r\n\r\n // Calculate which breakpoint is currently active, based on the screen width compared to the breakpoint definitions.\r\n\r\n let lastFoundWidth = 0;\r\n\r\n breakpointKeys.forEach((key, index) => {\r\n const width = breakpoints[key];\r\n if (currentWindowWidth >= width && width > lastFoundWidth) {\r\n lastFoundWidth = width;\r\n currentBreakpoint = key;\r\n currentBreakpointIndex = index;\r\n }\r\n });\r\n}\r\n\r\nfunction resizeHandler() {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n getWindowSizes();\r\n resizeFunctions.forEach(funcRef => funcRef());\r\n }, 100);\r\n}\r\n\r\nexport function onWindowResize(handler) {\r\n if (!currentBreakpoint) {\r\n initWindowResize();\r\n }\r\n\r\n resizeFunctions.push(handler);\r\n}\r\n\r\nexport function initWindowResize() {\r\n getWindowSizes();\r\n window.addEventListener('resize', resizeHandler);\r\n window.addEventListener('orientationchange', resizeHandler);\r\n}\r\n","import { stickyNavOnScroll } from '../utils/stickyNavOnScroll';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\nimport { breakpoints, currentWindowWidth, onWindowResize } from '../utils/windowResize';\r\n\r\nexport let nav;\r\nexport let languageSelector;\r\n\r\nexport function setupNavigation(selector = '.navigation', sticky = true) {\r\n nav = document.body.querySelector(selector);\r\n\r\n if (nav) {\r\n const navBurger = nav.querySelector('.navigation__burger');\r\n const subLinks = nav.querySelectorAll('.navigation__item--sub > .navigation__link');\r\n\r\n if (navBurger) {\r\n navBurger.addEventListener('click', toggleMenuOpen);\r\n }\r\n\r\n if (sticky) {\r\n stickyNavOnScroll(nav, 'navigation--sticky', 30, 'navigation--going-up');\r\n }\r\n\r\n Array.from(subLinks).forEach(subLink => {\r\n subLink.addEventListener('click', e => {\r\n\r\n if (currentWindowWidth < (breakpoints['lg'] - .02)) {\r\n e.preventDefault();\r\n\r\n const navItem = e.target.parentNode;\r\n if (navItem) {\r\n const subNavElm = navItem.querySelector('.navigation__sub-navigation');\r\n if (subNavElm) {\r\n if (!navItem.classList.contains('navigation__item--sub-closed')) {\r\n closeSubNavigation(navItem, subLink, subNavElm);\r\n } else {\r\n openSubNavigation(navItem, subLink, subNavElm);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n setupLanguageSelector();\r\n onWindowResize(setupLanguageSelector);\r\n }\r\n}\r\n\r\nfunction setupLanguageSelector () {\r\n const languageSelectorActiveItem = nav.querySelector('.navigation__language-selector-item--active');\r\n languageSelector = nav.querySelector('.navigation__language-selector');\r\n\r\n if (languageSelectorActiveItem && languageSelector) {\r\n languageSelectorActiveItem.addEventListener('click', toggleLanguageSelector);\r\n }\r\n}\r\n\r\nfunction toggleMenuOpen() {\r\n if (nav.classList.contains('navigation--open')) {\r\n disableScrollLock();\r\n nav.classList.remove('navigation--open');\r\n\r\n if (window.pageYOffset > 50) {\r\n setTimeout(() => nav.classList.add('navigation--going-up'), 40);\r\n }\r\n\r\n } else {\r\n enableScrollLock();\r\n nav.classList.add('navigation--open');\r\n }\r\n}\r\n\r\nfunction openSubNavigation(navItem, link, subNavElm) {\r\n subNavElm.style.height = `${subNavElm.scrollHeight}px`;\r\n subNavElm.addEventListener('transitionend', function(e) {\r\n if (e.propertyName === 'height') {\r\n subNavElm.style.height = null;\r\n }\r\n });\r\n\r\n navItem.classList.remove('navigation__item--sub-closed');\r\n // subNavElm.setAttribute('aria-hidden', false);\r\n // link.setAttribute('aria-expanded', true);\r\n}\r\n\r\nfunction closeSubNavigation(navItem, link, subNavElm) {\r\n subNavElm.style.height = `${subNavElm.scrollHeight}px`;\r\n setTimeout(() => {\r\n subNavElm.style.height = '0';\r\n }, 0);\r\n\r\n navItem.classList.add('navigation__item--sub-closed');\r\n // subNavElm.setAttribute('aria-hidden', true);\r\n // link.setAttribute('aria-expanded', false);\r\n}\r\n\r\nfunction toggleLanguageSelector(e) {\r\n e.preventDefault();\r\n\r\n if (currentWindowWidth > breakpoints['lg']) {\r\n if (languageSelector.classList.contains('navigation__language-selector--closed')) {\r\n languageSelector.style.height = `${languageSelector.scrollHeight}px`;\r\n languageSelector.addEventListener('transitionend', function(e) {\r\n if (e.propertyName === 'height') {\r\n languageSelector.style.height = null;\r\n }\r\n });\r\n\r\n languageSelector.classList.remove('navigation__language-selector--closed');\r\n }\r\n else {\r\n languageSelector.style.height = `${languageSelector.scrollHeight}px`;\r\n setTimeout(() => {\r\n languageSelector.style.height = '100%';\r\n }, 0);\r\n\r\n languageSelector.classList.add('navigation__language-selector--closed');\r\n }\r\n }\r\n}","let YT;\r\nlet videoModulesArray = [];\r\nconst queue = {\r\n content: null,\r\n push(fn) {\r\n this.content = fn;\r\n },\r\n pop() {\r\n this.content.call();\r\n this.content = null;\r\n }\r\n};\r\n\r\nfunction loadYouTubeApi() {\r\n const tag = document.createElement('script');\r\n tag.src = `${window.location.protocol}//www.youtube.com/iframe_api`;\r\n const firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n}\r\n\r\nfunction onPlayerReady(event) {\r\n // Remove \"video--no-youtube-api\" class on the current video module\r\n const iframe = event.target.getIframe();\r\n if (iframe) {\r\n const videoModule = iframe.closest('.video');\r\n if (videoModule) {\r\n videoModule.classList.remove('video--no-youtube-api');\r\n }\r\n }\r\n\r\n // Call the function in the queue\r\n if (queue.content) {\r\n queue.pop();\r\n }\r\n}\r\n\r\nfunction isPlayerReady(player) {\r\n return player && typeof player.playVideo === 'function';\r\n}\r\n\r\nfunction playVideo(player) {\r\n // If the player is not ready, queue player.playVideo() and invoke it when the player is ready\r\n isPlayerReady(player) ? player.playVideo() : queue.push(() => {\r\n player.playVideo();\r\n });\r\n}\r\n\r\nwindow.onYouTubeIframeAPIReady = function() {\r\n // Define the global \"YT\" variable\r\n YT = window.YT;\r\n\r\n // Create Youtube players\r\n Array.from(videoModulesArray).forEach(videoModule => {\r\n const iframe = videoModule.querySelector('.video__iframe');\r\n if (iframe) {\r\n const player = new YT.Player(iframe, {\r\n events: {\r\n 'onReady': onPlayerReady,\r\n 'onStateChange': event => {\r\n if (!videoModule.classList.contains('video--loading') && event.data === YT.PlayerState.UNSTARTED) {\r\n videoModule.classList.add('video--loading');\r\n }\r\n\r\n if (event.data === YT.PlayerState.PLAYING) {\r\n videoModule.classList.remove('video--loading');\r\n videoModule.classList.add('video--playing');\r\n }\r\n\r\n if (event.data === YT.PlayerState.ENDED) {\r\n videoModule.classList.remove('video--playing');\r\n }\r\n }\r\n }\r\n });\r\n\r\n const playTriggers = videoModule.querySelectorAll('.video__play, .video__image-wrap');\r\n Array.from(playTriggers).forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n videoModule.classList.add('video--loading');\r\n playVideo(player);\r\n });\r\n });\r\n }\r\n });\r\n};\r\n\r\nexport function setupVideoModules(selector = '.video') {\r\n const videoModules = document.querySelectorAll(selector);\r\n if (videoModules.length > 0) {\r\n\r\n // Set the global 'videoModulesArray' variable\r\n videoModulesArray = videoModules;\r\n\r\n // Load Youtube API if it doesn't exist already\r\n if (!YT) {\r\n loadYouTubeApi();\r\n }\r\n }\r\n}","\n// ------------------------------------------\n// Rellax.js\n// Buttery smooth parallax library\n// Copyright (c) 2016 Moe Amaya (@moeamaya)\n// MIT license\n//\n// Thanks to Paraxify.js and Jaime Cabllero\n// for parallax concepts\n// ------------------------------------------\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.Rellax = factory();\n }\n}(typeof window !== \"undefined\" ? window : global, function () {\n var Rellax = function(el, options){\n \"use strict\";\n\n var self = Object.create(Rellax.prototype);\n\n var posY = 0;\n var screenY = 0;\n var posX = 0;\n var screenX = 0;\n var blocks = [];\n var pause = true;\n\n // check what requestAnimationFrame to use, and if\n // it's not supported, use the onscroll event\n var loop = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n function(callback){ return setTimeout(callback, 1000 / 60); };\n\n // store the id for later use\n var loopId = null;\n\n // Test via a getter in the options object to see if the passive property is accessed\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function() {\n supportsPassive = true;\n }\n });\n window.addEventListener(\"testPassive\", null, opts);\n window.removeEventListener(\"testPassive\", null, opts);\n } catch (e) {}\n\n // check what cancelAnimation method to use\n var clearLoop = window.cancelAnimationFrame || window.mozCancelAnimationFrame || clearTimeout;\n\n // check which transform property to use\n var transformProp = window.transformProp || (function(){\n var testEl = document.createElement('div');\n if (testEl.style.transform === null) {\n var vendors = ['Webkit', 'Moz', 'ms'];\n for (var vendor in vendors) {\n if (testEl.style[ vendors[vendor] + 'Transform' ] !== undefined) {\n return vendors[vendor] + 'Transform';\n }\n }\n }\n return 'transform';\n })();\n\n // Default Settings\n self.options = {\n speed: -2,\n\t verticalSpeed: null,\n\t horizontalSpeed: null,\n breakpoints: [576, 768, 1201],\n center: false,\n wrapper: null,\n relativeToWrapper: false,\n round: true,\n vertical: true,\n horizontal: false,\n verticalScrollAxis: \"y\",\n horizontalScrollAxis: \"x\",\n callback: function() {},\n };\n\n // User defined options (might have more in the future)\n if (options){\n Object.keys(options).forEach(function(key){\n self.options[key] = options[key];\n });\n }\n\n function validateCustomBreakpoints () {\n if (self.options.breakpoints.length === 3 && Array.isArray(self.options.breakpoints)) {\n var isAscending = true;\n var isNumerical = true;\n var lastVal;\n self.options.breakpoints.forEach(function (i) {\n if (typeof i !== 'number') isNumerical = false;\n if (lastVal !== null) {\n if (i < lastVal) isAscending = false;\n }\n lastVal = i;\n });\n if (isAscending && isNumerical) return;\n }\n // revert defaults if set incorrectly\n self.options.breakpoints = [576, 768, 1201];\n console.warn(\"Rellax: You must pass an array of 3 numbers in ascending order to the breakpoints option. Defaults reverted\");\n }\n\n if (options && options.breakpoints) {\n validateCustomBreakpoints();\n }\n\n // By default, rellax class\n if (!el) {\n el = '.rellax';\n }\n\n // check if el is a className or a node\n var elements = typeof el === 'string' ? document.querySelectorAll(el) : [el];\n\n // Now query selector\n if (elements.length > 0) {\n self.elems = elements;\n }\n\n // The elements don't exist\n else {\n console.warn(\"Rellax: The elements you're trying to select don't exist.\");\n return;\n }\n\n // Has a wrapper and it exists\n if (self.options.wrapper) {\n if (!self.options.wrapper.nodeType) {\n var wrapper = document.querySelector(self.options.wrapper);\n\n if (wrapper) {\n self.options.wrapper = wrapper;\n } else {\n console.warn(\"Rellax: The wrapper you're trying to use doesn't exist.\");\n return;\n }\n }\n }\n\n // set a placeholder for the current breakpoint\n var currentBreakpoint;\n\n // helper to determine current breakpoint\n var getCurrentBreakpoint = function (w) {\n var bp = self.options.breakpoints;\n if (w < bp[0]) return 'xs';\n if (w >= bp[0] && w < bp[1]) return 'sm';\n if (w >= bp[1] && w < bp[2]) return 'md';\n return 'lg';\n };\n\n // Get and cache initial position of all elements\n var cacheBlocks = function() {\n for (var i = 0; i < self.elems.length; i++){\n var block = createBlock(self.elems[i]);\n blocks.push(block);\n }\n };\n\n\n // Let's kick this script off\n // Build array for cached element values\n var init = function() {\n for (var i = 0; i < blocks.length; i++){\n self.elems[i].style.cssText = blocks[i].style;\n }\n\n blocks = [];\n\n screenY = window.innerHeight;\n screenX = window.innerWidth;\n currentBreakpoint = getCurrentBreakpoint(screenX);\n\n setPosition();\n\n cacheBlocks();\n\n animate();\n\n // If paused, unpause and set listener for window resizing events\n if (pause) {\n window.addEventListener('resize', init);\n pause = false;\n // Start the loop\n update();\n }\n };\n\n // We want to cache the parallax blocks'\n // values: base, top, height, speed\n // el: is dom object, return: el cache values\n var createBlock = function(el) {\n var dataPercentage = el.getAttribute( 'data-rellax-percentage' );\n var dataSpeed = el.getAttribute( 'data-rellax-speed' );\n var dataXsSpeed = el.getAttribute( 'data-rellax-xs-speed' );\n var dataMobileSpeed = el.getAttribute( 'data-rellax-mobile-speed' );\n var dataTabletSpeed = el.getAttribute( 'data-rellax-tablet-speed' );\n var dataDesktopSpeed = el.getAttribute( 'data-rellax-desktop-speed' );\n var dataVerticalSpeed = el.getAttribute('data-rellax-vertical-speed');\n var dataHorizontalSpeed = el.getAttribute('data-rellax-horizontal-speed');\n var dataVericalScrollAxis = el.getAttribute('data-rellax-vertical-scroll-axis');\n var dataHorizontalScrollAxis = el.getAttribute('data-rellax-horizontal-scroll-axis');\n var dataZindex = el.getAttribute( 'data-rellax-zindex' ) || 0;\n var dataMin = el.getAttribute( 'data-rellax-min' );\n var dataMax = el.getAttribute( 'data-rellax-max' );\n var dataMinX = el.getAttribute('data-rellax-min-x');\n var dataMaxX = el.getAttribute('data-rellax-max-x');\n var dataMinY = el.getAttribute('data-rellax-min-y');\n var dataMaxY = el.getAttribute('data-rellax-max-y');\n var mapBreakpoints;\n var breakpoints = true;\n\n if (!dataXsSpeed && !dataMobileSpeed && !dataTabletSpeed && !dataDesktopSpeed) {\n breakpoints = false;\n } else {\n mapBreakpoints = {\n 'xs': dataXsSpeed,\n 'sm': dataMobileSpeed,\n 'md': dataTabletSpeed,\n 'lg': dataDesktopSpeed\n };\n }\n\n // initializing at scrollY = 0 (top of browser), scrollX = 0 (left of browser)\n // ensures elements are positioned based on HTML layout.\n //\n // If the element has the percentage attribute, the posY and posX needs to be\n // the current scroll position's value, so that the elements are still positioned based on HTML layout\n var wrapperPosY = self.options.wrapper ? self.options.wrapper.scrollTop : (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);\n // If the option relativeToWrapper is true, use the wrappers offset to top, subtracted from the current page scroll.\n if (self.options.relativeToWrapper) {\n var scrollPosY = (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);\n wrapperPosY = scrollPosY - self.options.wrapper.offsetTop;\n }\n var posY = self.options.vertical ? ( dataPercentage || self.options.center ? wrapperPosY : 0 ) : 0;\n var posX = self.options.horizontal ? ( dataPercentage || self.options.center ? self.options.wrapper ? self.options.wrapper.scrollLeft : (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft) : 0 ) : 0;\n\n var blockTop = posY + el.getBoundingClientRect().top;\n var blockHeight = el.clientHeight || el.offsetHeight || el.scrollHeight;\n\n var blockLeft = posX + el.getBoundingClientRect().left;\n var blockWidth = el.clientWidth || el.offsetWidth || el.scrollWidth;\n\n // apparently parallax equation everyone uses\n var percentageY = dataPercentage ? dataPercentage : (posY - blockTop + screenY) / (blockHeight + screenY);\n var percentageX = dataPercentage ? dataPercentage : (posX - blockLeft + screenX) / (blockWidth + screenX);\n if(self.options.center){ percentageX = 0.5; percentageY = 0.5; }\n\n // Optional individual block speed as data attr, otherwise global speed\n var speed = (breakpoints && mapBreakpoints[currentBreakpoint] !== null) ? Number(mapBreakpoints[currentBreakpoint]) : (dataSpeed ? dataSpeed : self.options.speed);\n var verticalSpeed = dataVerticalSpeed ? dataVerticalSpeed : self.options.verticalSpeed;\n var horizontalSpeed = dataHorizontalSpeed ? dataHorizontalSpeed : self.options.horizontalSpeed;\n\n // Optional individual block movement axis direction as data attr, otherwise gobal movement direction\n var verticalScrollAxis = dataVericalScrollAxis ? dataVericalScrollAxis : self.options.verticalScrollAxis;\n var horizontalScrollAxis = dataHorizontalScrollAxis ? dataHorizontalScrollAxis : self.options.horizontalScrollAxis;\n\n var bases = updatePosition(percentageX, percentageY, speed, verticalSpeed, horizontalSpeed);\n\n // ~~Store non-translate3d transforms~~\n // Store inline styles and extract transforms\n var style = el.style.cssText;\n var transform = '';\n\n // Check if there's an inline styled transform\n var searchResult = /transform\\s*:/i.exec(style);\n if (searchResult) {\n // Get the index of the transform\n var index = searchResult.index;\n\n // Trim the style to the transform point and get the following semi-colon index\n var trimmedStyle = style.slice(index);\n var delimiter = trimmedStyle.indexOf(';');\n\n // Remove \"transform\" string and save the attribute\n if (delimiter) {\n transform = \" \" + trimmedStyle.slice(11, delimiter).replace(/\\s/g,'');\n } else {\n transform = \" \" + trimmedStyle.slice(11).replace(/\\s/g,'');\n }\n }\n\n return {\n baseX: bases.x,\n baseY: bases.y,\n top: blockTop,\n left: blockLeft,\n height: blockHeight,\n width: blockWidth,\n speed: speed,\n verticalSpeed: verticalSpeed,\n horizontalSpeed: horizontalSpeed,\n verticalScrollAxis: verticalScrollAxis,\n horizontalScrollAxis: horizontalScrollAxis,\n style: style,\n transform: transform,\n zindex: dataZindex,\n min: dataMin,\n max: dataMax,\n minX: dataMinX,\n maxX: dataMaxX,\n minY: dataMinY,\n maxY: dataMaxY\n };\n };\n\n // set scroll position (posY, posX)\n // side effect method is not ideal, but okay for now\n // returns true if the scroll changed, false if nothing happened\n var setPosition = function() {\n var oldY = posY;\n var oldX = posX;\n\n posY = self.options.wrapper ? self.options.wrapper.scrollTop : (document.documentElement || document.body.parentNode || document.body).scrollTop || window.pageYOffset;\n posX = self.options.wrapper ? self.options.wrapper.scrollLeft : (document.documentElement || document.body.parentNode || document.body).scrollLeft || window.pageXOffset;\n // If option relativeToWrapper is true, use relative wrapper value instead.\n if (self.options.relativeToWrapper) {\n var scrollPosY = (document.documentElement || document.body.parentNode || document.body).scrollTop || window.pageYOffset;\n posY = scrollPosY - self.options.wrapper.offsetTop;\n }\n\n\n if (oldY != posY && self.options.vertical) {\n // scroll changed, return true\n return true;\n }\n\n if (oldX != posX && self.options.horizontal) {\n // scroll changed, return true\n return true;\n }\n\n // scroll did not change\n return false;\n };\n\n // Ahh a pure function, gets new transform value\n // based on scrollPosition and speed\n // Allow for decimal pixel values\n var updatePosition = function(percentageX, percentageY, speed, verticalSpeed, horizontalSpeed) {\n var result = {};\n var valueX = ((horizontalSpeed ? horizontalSpeed : speed) * (100 * (1 - percentageX)));\n var valueY = ((verticalSpeed ? verticalSpeed : speed) * (100 * (1 - percentageY)));\n\n result.x = self.options.round ? Math.round(valueX) : Math.round(valueX * 100) / 100;\n result.y = self.options.round ? Math.round(valueY) : Math.round(valueY * 100) / 100;\n\n return result;\n };\n\n // Remove event listeners and loop again\n var deferredUpdate = function() {\n window.removeEventListener('resize', deferredUpdate);\n window.removeEventListener('orientationchange', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : window).removeEventListener('scroll', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : document).removeEventListener('touchmove', deferredUpdate);\n\n // loop again\n loopId = loop(update);\n };\n\n // Loop\n var update = function() {\n if (setPosition() && pause === false) {\n animate();\n\n // loop again\n loopId = loop(update);\n } else {\n loopId = null;\n\n // Don't animate until we get a position updating event\n window.addEventListener('resize', deferredUpdate);\n window.addEventListener('orientationchange', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : window).addEventListener('scroll', deferredUpdate, supportsPassive ? { passive: true } : false);\n (self.options.wrapper ? self.options.wrapper : document).addEventListener('touchmove', deferredUpdate, supportsPassive ? { passive: true } : false);\n }\n };\n\n // Transform3d on parallax element\n var animate = function() {\n var positions;\n for (var i = 0; i < self.elems.length; i++){\n // Determine relevant movement directions\n var verticalScrollAxis = blocks[i].verticalScrollAxis.toLowerCase();\n var horizontalScrollAxis = blocks[i].horizontalScrollAxis.toLowerCase();\n var verticalScrollX = verticalScrollAxis.indexOf(\"x\") != -1 ? posY : 0;\n var verticalScrollY = verticalScrollAxis.indexOf(\"y\") != -1 ? posY : 0;\n var horizontalScrollX = horizontalScrollAxis.indexOf(\"x\") != -1 ? posX : 0;\n var horizontalScrollY = horizontalScrollAxis.indexOf(\"y\") != -1 ? posX : 0;\n\n var percentageY = ((verticalScrollY + horizontalScrollY - blocks[i].top + screenY) / (blocks[i].height + screenY));\n var percentageX = ((verticalScrollX + horizontalScrollX - blocks[i].left + screenX) / (blocks[i].width + screenX));\n\n // Subtracting initialize value, so element stays in same spot as HTML\n positions = updatePosition(percentageX, percentageY, blocks[i].speed, blocks[i].verticalSpeed, blocks[i].horizontalSpeed);\n var positionY = positions.y - blocks[i].baseY;\n var positionX = positions.x - blocks[i].baseX;\n\n // The next two \"if\" blocks go like this:\n // Check if a limit is defined (first \"min\", then \"max\");\n // Check if we need to change the Y or the X\n // (Currently working only if just one of the axes is enabled)\n // Then, check if the new position is inside the allowed limit\n // If so, use new position. If not, set position to limit.\n\n // Check if a min limit is defined\n if (blocks[i].min !== null) {\n if (self.options.vertical && !self.options.horizontal) {\n positionY = positionY <= blocks[i].min ? blocks[i].min : positionY;\n }\n if (self.options.horizontal && !self.options.vertical) {\n positionX = positionX <= blocks[i].min ? blocks[i].min : positionX;\n }\n }\n\n // Check if directional min limits are defined\n if (blocks[i].minY != null) {\n positionY = positionY <= blocks[i].minY ? blocks[i].minY : positionY;\n }\n if (blocks[i].minX != null) {\n positionX = positionX <= blocks[i].minX ? blocks[i].minX : positionX;\n }\n\n // Check if a max limit is defined\n if (blocks[i].max !== null) {\n if (self.options.vertical && !self.options.horizontal) {\n positionY = positionY >= blocks[i].max ? blocks[i].max : positionY;\n }\n if (self.options.horizontal && !self.options.vertical) {\n positionX = positionX >= blocks[i].max ? blocks[i].max : positionX;\n }\n }\n\n // Check if directional max limits are defined\n if (blocks[i].maxY != null) {\n positionY = positionY >= blocks[i].maxY ? blocks[i].maxY : positionY;\n }\n if (blocks[i].maxX != null) {\n positionX = positionX >= blocks[i].maxX ? blocks[i].maxX : positionX;\n }\n\n var zindex = blocks[i].zindex;\n\n // Move that element\n // (Set the new translation and append initial inline transforms.)\n var translate = 'translate3d(' + (self.options.horizontal ? positionX : '0') + 'px,' + (self.options.vertical ? positionY : '0') + 'px,' + zindex + 'px) ' + blocks[i].transform;\n self.elems[i].style[transformProp] = translate;\n }\n self.options.callback(positions);\n };\n\n self.destroy = function() {\n for (var i = 0; i < self.elems.length; i++){\n self.elems[i].style.cssText = blocks[i].style;\n }\n\n // Remove resize event listener if not pause, and pause\n if (!pause) {\n window.removeEventListener('resize', init);\n pause = true;\n }\n\n // Clear the animation loop to prevent possible memory leak\n clearLoop(loopId);\n loopId = null;\n };\n\n // Init\n init();\n\n // Allow to recalculate the initial values whenever we want\n self.refresh = init;\n\n return self;\n };\n return Rellax;\n}));\n","import { isVisible } from '../utils/elementProperties';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\n\r\nlet activeOverlay;\r\nlet activeOverlayInner;\r\nlet activeOverlayCloseBtn;\r\n\r\nconst openClass = 'employee-list__overlay--open';\r\n\r\nfunction outsideClickListener(e) {\r\n if (!activeOverlayInner.contains(e.target) && isVisible(activeOverlayInner)) {\r\n // or use: event.target.closest(selector) === null\r\n overlayClose(e);\r\n activeOverlay.removeEventListener('click', outsideClickListener);\r\n }\r\n}\r\n\r\nfunction overlayOpen(e) {\r\n const employeeItem = e.currentTarget.closest('.employee-list__employee');\r\n const target = e.target;\r\n activeOverlay = employeeItem.closest('.employee-list').querySelector('.employee-list__overlay');\r\n\r\n if (!target.classList.contains('employee-list__employee-link')) {\r\n typeof e.preventDefault == 'function' ? e.preventDefault() : null;\r\n\r\n if (activeOverlay) {\r\n activeOverlay.classList.add(openClass);\r\n activeOverlayInner = activeOverlay.querySelector('.employee-list__overlay-inner');\r\n activeOverlayCloseBtn = activeOverlay.querySelector('.employee-list__overlay-close');\r\n\r\n if (activeOverlayCloseBtn) {\r\n activeOverlayCloseBtn.addEventListener('click', overlayClose);\r\n }\r\n\r\n activeOverlay.addEventListener('click', outsideClickListener);\r\n\r\n // append content to overlay\r\n const overlayContent = activeOverlay.querySelector('.employee-list__overlay-content');\r\n if (overlayContent) {\r\n const employeeItemCloned = employeeItem.cloneNode(true);\r\n\r\n overlayContent.innerHTML = '';\r\n overlayContent.appendChild(employeeItemCloned);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction overlayClose(e) {\r\n e.preventDefault();\r\n disableScrollLock();\r\n activeOverlay.classList.remove(openClass);\r\n\r\n if (activeOverlayCloseBtn) {\r\n activeOverlayCloseBtn.removeEventListener('click', overlayClose);\r\n }\r\n}\r\n\r\nexport function setupEmployeeList(selector = '.employee-list') {\r\n const employeeLists = document.querySelectorAll(selector);\r\n\r\n Array.from(employeeLists).forEach(employeeList => {\r\n const employeeReadMoreLinks = employeeList.querySelectorAll('.employee-list__list .employee-list__employee-read-more-link');\r\n\r\n Array.from(employeeReadMoreLinks).forEach(employeeReadMoreLink => {\r\n employeeReadMoreLink.addEventListener('click', overlayOpen);\r\n });\r\n });\r\n}\r\n","function filterClick(filter, filterValue, filters, filterItems, moduleId) {\r\n const visibleFilterItems = [];\r\n const cleanFilterValue = filterValue.trim().toLowerCase();\r\n\r\n // toggle aria-selected for filters\r\n for (let i = 0; i < filters.length; i++) {\r\n const filterItem = filters[i];\r\n\r\n if (filterItem == filter) {\r\n filterItem.setAttribute('aria-selected', true);\r\n } else {\r\n filterItem.setAttribute('aria-selected', false);\r\n }\r\n }\r\n\r\n // show/hide filter items\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if (filterValue !== '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n item.setAttribute('aria-hidden', true);\r\n } else {\r\n item.setAttribute('aria-hidden', false);\r\n visibleFilterItems.push(item);\r\n }\r\n\r\n // remove even/odd classes\r\n item.classList.remove('even');\r\n item.classList.remove('odd');\r\n }\r\n\r\n // add even/odd classes\r\n for (let i = 0; i < visibleFilterItems.length; i++) {\r\n const item = visibleFilterItems[i];\r\n\r\n if (i % 2 == 0) {\r\n item.classList.add('even');\r\n } else {\r\n item.classList.add('odd');\r\n }\r\n }\r\n}\r\n\r\nexport function setupFilters(selector = '[data-action*=\"filter\"]') {\r\n const filterContainers = document.body.querySelectorAll(selector);\r\n\r\n Array.from(filterContainers).forEach(filterContainer => {\r\n const filters = filterContainer.querySelectorAll('[data-filter]');\r\n const targetContainer = document.querySelector(filterContainer.getAttribute('data-target-container'));\r\n const module = filterContainer.closest('.module');\r\n const moduleId = module ? `#${module.id}` : '';\r\n\r\n if (targetContainer) {\r\n const filterItems = targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n Array.from(filters).forEach(filter => {\r\n const filterValue = filter.getAttribute('data-filter');\r\n\r\n // filter by click\r\n filter.addEventListener('click', () => {\r\n filterClick(filter, filterValue, filters, filterItems, moduleId);\r\n });\r\n });\r\n }\r\n });\r\n}\r\n","\r\n/**\r\n * Simply adds a class to target field if it has a value and removes it if not.\r\n *\r\n * @param {Object || HTMLElement} e - Event or field element\r\n */\r\n function checkFieldValue(e) {\r\n const field = e.currentTarget || e;\r\n const fieldWrap = field.closest('.form__field-wrap');\r\n\r\n if (fieldWrap) {\r\n field.value ? fieldWrap.classList.add('js-has-value') : fieldWrap.classList.remove('js-has-value');\r\n }\r\n}\r\n\r\n/**\r\n * Sets up 'change'-eventhandler as checkValidation on given fields\r\n *\r\n * @param {HTMLElement} form - Form container with fields to validate\r\n */\r\n\r\nexport function watchFormFields(selector = '[data-action*=\"form-watch-fields\"]') {\r\n const form = document.body.querySelectorAll(selector);\r\n\r\n if (form) {\r\n for (let f = 0; f < form.length; f++) {\r\n const fields = form[f].querySelectorAll('input, select, textarea');\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n\r\n //Check for prefilled fields\r\n checkFieldValue(field);\r\n if (field.type === 'select-one' || field.type === 'select-multiple') {\r\n field.addEventListener('change', checkFieldValue);\r\n } else {\r\n field.addEventListener('keyup', checkFieldValue);\r\n }\r\n }\r\n }\r\n }\r\n}","function loadOsirisScript(callback) {\r\n const osirisScript = document.getElementById('osiris-script');\r\n\r\n // Check if the script has already been loaded\r\n if (!osirisScript) {\r\n const script = document.createElement('script');\r\n script.id = 'osiris-script';\r\n script.src = 'https://accunia.os.fundconnect.com/lib/osiris.umd.js';\r\n script.type = 'text/javascript';\r\n\r\n script.onload = function() {\r\n callback();\r\n };\r\n\r\n document.head.appendChild(script);\r\n }\r\n else {\r\n callback();\r\n }\r\n}\r\n\r\nfunction createOsirisInstance(osirisContainerId) {\r\n const osirisInstance = new window.osiris.FcnOsiris();\r\n\r\n osirisInstance.mount({\r\n solution: 'default',\r\n server: 'accunia',\r\n env: 'prod',\r\n pageName: 'InnerValue',\r\n containerId: osirisContainerId,\r\n params: {\r\n language: 'da-DK',\r\n currency: 'DKK'\r\n }\r\n });\r\n\r\n // Add osiris stylesheet\r\n const currentDate = new Date();\r\n const day = currentDate.getDate().toString()\r\n .padStart(2, '0');\r\n const month = (currentDate.getMonth() + 1).toString().padStart(2, '0');\r\n const year = currentDate.getFullYear();\r\n const hours = currentDate.getHours().toString()\r\n .padStart(2, '0');\r\n const minutes = currentDate.getMinutes().toString()\r\n .padStart(2, '0');\r\n\r\n const timestamp = `${day}${month}${year}${hours}${minutes}`;\r\n\r\n osirisInstance.addStylesheet(`/assets/css/osiris.min.css?v=${timestamp}`);\r\n}\r\n\r\nexport function setupOsiris(selector = '[data-action*=\"osiris\"]') {\r\n const osirisElements = document.querySelectorAll(selector);\r\n Array.from(osirisElements).forEach(osirisElm => {\r\n const osirisContainerId = osirisElm.getAttribute('data-osiris-container');\r\n if (osirisContainerId) {\r\n\r\n // Load osiris\r\n loadOsirisScript(() =>\r\n {\r\n let checkOsirisCount = 0;\r\n const checkOsiris = setInterval(() => {\r\n checkOsirisCount++;\r\n\r\n if (checkOsirisCount < 16) {\r\n if (window.osiris) {\r\n // Create the osiris instance\r\n createOsirisInstance(osirisContainerId);\r\n\r\n // Clear the interval\r\n clearInterval(checkOsiris);\r\n }\r\n }\r\n else {\r\n clearInterval(checkOsiris);\r\n }\r\n }, 100);\r\n });\r\n }\r\n });\r\n}\r\n","import { onReady } from './utils/onReady';\r\nimport { isTouch, initVhUnitOverwrite } from './utils/helpers';\r\nimport { setupNavigation } from './layout/navigation';\r\nimport { setupRellax } from './components/rellax';\r\nimport { setupVideoModules } from './modules/video';\r\nimport { setupEmployeeList } from './modules/employee-list';\r\nimport { setupFilters } from './components/filter';\r\nimport { watchFormFields } from './components/form';\r\nimport { setupOsiris } from './modules/osiris';\r\n\r\nfunction init() {\r\n document.body.classList.remove('standby');\r\n\r\n // Detect touch\r\n if (isTouch) {\r\n document.body.classList.add('touch-device');\r\n }\r\n\r\n onReady(() => {\r\n initVhUnitOverwrite();\r\n setupNavigation();\r\n setupRellax();\r\n setupVideoModules();\r\n setupEmployeeList();\r\n setupFilters();\r\n watchFormFields();\r\n setupOsiris();\r\n });\r\n}\r\n\r\ninit();","import Rellax from 'rellax';\r\nimport { onWindowResize } from '../utils/windowResize';\r\n\r\nexport function setupRellax(xSelector = '[data-rellax-vertical-scroll-axis=x]', ySelector = '[data-rellax-vertical-scroll-axis=y]') {\r\n\r\n // Rellax on X axes\r\n const rellaxXElements = document.querySelectorAll(xSelector);\r\n if (rellaxXElements.length > 0) {\r\n const rellaxX = new Rellax(xSelector, {\r\n horizontal: true\r\n });\r\n\r\n onWindowResize(() => {\r\n rellaxX.refresh();\r\n });\r\n }\r\n\r\n // Rellax on Y axes\r\n const rellaxYElements = document.querySelectorAll(ySelector);\r\n if (rellaxYElements.length > 0) {\r\n const rellaxY = new Rellax(ySelector);\r\n\r\n onWindowResize(() => {\r\n rellaxY.refresh();\r\n });\r\n }\r\n}"],"names":["functionReferences","readyState","document","readyEventBound","emptyCallbackArrays","length","tempArray","slice","forEach","funcRef","onReady","functionReference","addEventListener","push","window","CookieInformation","getConsentGivenFor","isTouch","setVhProp","event","delay","undefined","type","setTimeout","vh","innerHeight","documentElement","style","setProperty","isElement","element","Element","Document","Window","getElementScroll","left","pageXOffset","scrollLeft","top","pageYOffset","scrollTop","scrollX","scrollY","console","warn","scrollLocked","disableScrollLock","scrollPosition","htmlTag","classList","remove","marginTop","position","overflow","width","body","removeAttribute","scrollTo","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","onScroll","handler","triggerNow","initScroll","stickyNavOnScroll","scrollTimer","lastScrollPosition","className","scrollInPixels","goingUpClass","clearTimeout","windowScroll","add","currentBreakpoint","resizeTimer","nav","languageSelector","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","innerWidth","resizeFunctions","getWindowSizes","lastFoundWidth","key","index","resizeHandler","onWindowResize","setupLanguageSelector","languageSelectorActiveItem","querySelector","toggleLanguageSelector","toggleMenuOpen","contains","overflowY","enableScrollLock","openSubNavigation","navItem","link","subNavElm","height","scrollHeight","e","propertyName","closeSubNavigation","preventDefault","YT","root","factory","global","Rellax","el","options","self","create","prototype","posY","screenY","posX","screenX","blocks","pause","loop","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","callback","loopId","supportsPassive","opts","defineProperty","get","removeEventListener","clearLoop","cancelAnimationFrame","mozCancelAnimationFrame","transformProp","testEl","createElement","transform","vendors","vendor","speed","verticalSpeed","horizontalSpeed","center","wrapper","relativeToWrapper","round","vertical","horizontal","verticalScrollAxis","horizontalScrollAxis","Array","isArray","lastVal","isAscending","isNumerical","i","validateCustomBreakpoints","elements","querySelectorAll","elems","nodeType","init","cssText","w","bp","setPosition","block","createBlock","cacheBlocks","update","mapBreakpoints","dataPercentage","getAttribute","dataSpeed","dataXsSpeed","dataMobileSpeed","dataTabletSpeed","dataDesktopSpeed","dataVerticalSpeed","dataHorizontalSpeed","dataVericalScrollAxis","dataHorizontalScrollAxis","dataZindex","dataMin","dataMax","dataMinX","dataMaxX","dataMinY","dataMaxY","xs","sm","md","lg","wrapperPosY","offsetTop","blockTop","getBoundingClientRect","blockHeight","clientHeight","offsetHeight","blockLeft","blockWidth","clientWidth","offsetWidth","scrollWidth","percentageY","percentageX","Number","bases","updatePosition","searchResult","exec","trimmedStyle","delimiter","indexOf","replace","baseX","x","baseY","y","zindex","min","max","minX","maxX","minY","maxY","oldY","oldX","parentNode","scrollPosY","result","valueX","valueY","Math","deferredUpdate","passive","positions","toLowerCase","verticalScrollX","verticalScrollY","horizontalScrollX","positionY","positionX","translate","destroy","refresh","module","exports","activeOverlay","activeOverlayInner","activeOverlayCloseBtn","videoModulesArray","queue","content","fn","pop","call","loadYouTubeApi","tag","src","location","protocol","firstScriptTag","getElementsByTagName","insertBefore","onPlayerReady","iframe","target","getIframe","videoModule","closest","onYouTubeIframeAPIReady","from","player","Player","events","data","PlayerState","UNSTARTED","PLAYING","ENDED","playTriggers","trigger","playVideo","isPlayerReady","openClass","outsideClickListener","elem","getClientRects","overlayClose","overlayOpen","employeeItem","currentTarget","overlayContent","employeeItemCloned","cloneNode","innerHTML","appendChild","filterClick","filter","filterValue","filters","filterItems","moduleId","visibleFilterItems","cleanFilterValue","trim","filterItem","setAttribute","item","itemFilterValues","split","map","value","checkFieldValue","field","fieldWrap","loadOsirisScript","getElementById","script","id","onload","head","createOsirisInstance","osirisContainerId","osirisInstance","osiris","FcnOsiris","mount","solution","server","env","pageName","containerId","params","language","currency","currentDate","Date","day","getDate","toString","padStart","month","getMonth","year","getFullYear","hours","getHours","minutes","getMinutes","timestamp","addStylesheet","selector","sticky","navBurger","subLinks","subLink","setupNavigation","xSelector","ySelector","rellaxXElements","rellaxX","rellaxYElements","rellaxY","setupRellax","videoModules","setupVideoModules","employeeLists","employeeList","employeeReadMoreLinks","employeeReadMoreLink","setupEmployeeList","filterContainers","filterContainer","targetContainer","setupFilters","form","f","fields","watchFormFields","osirisElements","osirisElm","checkOsirisCount","checkOsiris","setInterval","clearInterval","setupOsiris"],"mappings":"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"}