{"version":3,"file":"main.min.js","sources":["../../src/js/utils/windowResize.js","../../src/js/utils/helpers.js","../../src/js/utils/clickOutside.js","../../src/js/modules/navigation.js","../../src/js/modules/search.js","../../src/js/modules/solutions.js","../../../../node_modules/promise-polyfill/src/finally.js","../../../../node_modules/promise-polyfill/src/index.js","../../../../node_modules/promise-polyfill/src/polyfill.js","../../src/js/utils/lazyImage.js","../../src/js/modules/form.js","../../src/js/modules/loader.js","../../src/js/modules/readmore.js","../../src/js/main.js","../../src/js/modules/video.js"],"sourcesContent":["export const breakpoints = {\r\n \"xxs\": 1,\r\n \"xs\": 480,\r\n \"sm\": 768,\r\n \"md\": 1024,\r\n \"lg\": 1280,\r\n \"xl\": 1540,\r\n \"xxl\": 1840\r\n};\r\n\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint = 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\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 = 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 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","\r\nexport const transitionEndEventName = detactTransitionEndEventName();\r\n\r\nexport function toggleClass(e, classTarget = e.currentTarget, className = 'open') {\r\n classTarget.classList.toggle(className);\r\n}\r\n\r\nexport function detactTransitionEndEventName() {\r\n\r\n const transitions = {\r\n \"transition\": \"transitionend\",\r\n \"OTransition\": \"oTransitionEnd\",\r\n \"MozTransition\": \"transitionend\",\r\n \"WebkitTransition\": \"webkitTransitionEnd\"\r\n };\r\n\r\n const el = document.createElement(\"div\");\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return \"\";\r\n}\r\n","export function hideOnClickOutside(element, callback) {\r\n const outsideClickListener = event => {\r\n if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null\r\n callback(event);\r\n removeClickListener();\r\n }\r\n };\r\n\r\n const removeClickListener = () => {\r\n document.removeEventListener('click', outsideClickListener);\r\n };\r\n\r\n document.addEventListener('click', outsideClickListener);\r\n}\r\n\r\nconst isVisible = elem => !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);","import {breakpoints, currentWindowWidth} from \"../utils/windowResize\";\r\nimport {toggleClass} from \"../utils/helpers\";\r\nimport {hideOnClickOutside} from \"../utils/clickOutside\";\r\n\r\nlet nav;\r\nlet navMenu;\r\nlet activeList;\r\nconst openNavClass = 'nav--open';\r\nconst activeClass = 'active';\r\nconst activeOpenClass = 'active--open';\r\n\r\n\r\nfunction disableNavMenu(resetHeight = false) {\r\n\r\n if (activeList) {\r\n activeList.removeAttribute('style');\r\n activeList.classList.remove(activeClass);\r\n activeList.classList.remove(activeOpenClass);\r\n activeList = false;\r\n }\r\n navMenu.classList.remove('nav-menu--open');\r\n navMenu.removeAttribute('style');\r\n\r\n if (resetHeight) {\r\n navMenu.style.height = navMenu.getAttribute('data-height');\r\n }\r\n}\r\n\r\nfunction toggleMenuOpen() {\r\n if (nav.classList.contains(openNavClass)) {\r\n nav.classList.remove(openNavClass);\r\n setTimeout(disableNavMenu, 300);\r\n } else {\r\n nav.classList.add(openNavClass);\r\n navMenu.style.height = `${navMenu.scrollHeight}px`;\r\n }\r\n}\r\n\r\nfunction toggleActiveList(e) {\r\n const targetParent = e.currentTarget.parentNode;\r\n\r\n if (e.currentTarget.getAttribute(\"role\") === \"button\") {\r\n e.preventDefault();\r\n } else {\r\n return;\r\n }\r\n\r\n if (targetParent.classList.contains(activeClass)) {\r\n disableNavMenu(true);\r\n } else {\r\n targetParent.classList.add(activeClass);\r\n\r\n if (activeList) {\r\n activeList.classList.remove(activeClass);\r\n activeList.classList.remove(activeOpenClass);\r\n } else navMenu.setAttribute('data-height', navMenu.style.height);\r\n\r\n hideOnClickOutside(navMenu, () => disableNavMenu(true));\r\n\r\n navMenu.classList.add('nav-menu--open');\r\n activeList = targetParent;\r\n activeList.style.top = `${activeList.offsetTop}px`;\r\n activeList.setAttribute('data-offset', `${activeList.offsetTop}px`);\r\n\r\n setTimeout(() => {\r\n activeList.classList.add(activeOpenClass);\r\n activeList.removeAttribute('style');\r\n navMenu.style.height = `${activeList.scrollHeight}px`;\r\n }, 250);\r\n }\r\n}\r\n\r\n\r\n\r\nexport function setupNav(container) {\r\n if (!nav) {\r\n nav = container;\r\n navMenu = nav.querySelector('.nav-menu');\r\n }\r\n\r\n const navBtn = nav.querySelector('.nav-btn');\r\n const navLang = nav.querySelector('.nav__tool__lang');\r\n const navLinks = navMenu.querySelectorAll('.nav-menu__head');\r\n // Function literal made to be able to remove eventListener\r\n const langClassToggle = e => {\r\n e.preventDefault();\r\n toggleClass(e, navLang);\r\n };\r\n\r\n for (let i = 0; i < navLinks.length; i += 1) {\r\n const navLink = navLinks[i];\r\n navLink.addEventListener('click', toggleActiveList);\r\n }\r\n\r\n if (currentWindowWidth >= breakpoints.md) {\r\n nav.classList.remove(openNavClass);\r\n navBtn.removeEventListener('click', toggleMenuOpen);\r\n navLang.removeEventListener('click', langClassToggle);\r\n } else {\r\n navBtn.addEventListener('click', toggleMenuOpen);\r\n navLang.querySelector('.active').addEventListener('click', langClassToggle);\r\n }\r\n}\r\n","import {breakpoints, currentWindowWidth} from \"../utils/windowResize\";\r\n\r\nlet closeTimer;\r\n\r\nfunction searchClassToggle(e) {\r\n const navSearch = e.currentTarget.parentNode;\r\n const navInputField = navSearch.querySelector('input');\r\n\r\n clearTimeout(closeTimer);\r\n\r\n if (!navInputField.value.trim()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (navSearch.classList.contains('open')) {\r\n navSearch.classList.remove('open');\r\n navInputField.setAttribute('tabindex', -1);\r\n } else {\r\n navSearch.classList.add('open');\r\n navInputField.removeAttribute('tabindex');\r\n navInputField.focus();\r\n }\r\n }\r\n}\r\n\r\nexport function setupSearch(container) {\r\n const navSearch = container.querySelector('.nav__tool__search');\r\n if (navSearch) {\r\n navSearch.querySelector('input').value = '';\r\n navSearch.querySelector('button').addEventListener('click', searchClassToggle);\r\n\r\n if (currentWindowWidth < breakpoints.md) {\r\n navSearch.querySelector('input').addEventListener('blur', () => {\r\n closeTimer = setTimeout(() => {\r\n navSearch.classList.remove('open');\r\n }, 100);\r\n });\r\n }\r\n }\r\n}\r\n","import {breakpoints, currentWindowWidth} from \"../utils/windowResize\";\r\n\r\nlet solutionImages;\r\nlet activeImage;\r\n\r\nfunction solutionHover(e, boxIndex) {\r\n\r\n const img = solutionImages[boxIndex + 1];\r\n\r\n activeImage.classList.remove('active');\r\n\r\n if (e.type === 'mouseenter') {\r\n img.classList.add('active');\r\n activeImage = img;\r\n } else {\r\n activeImage = solutionImages[0];\r\n activeImage.classList.add('active');\r\n }\r\n}\r\n\r\nexport function activateSolutionHover(selector, container = document) {\r\n const solutions = container.querySelector(selector);\r\n\r\n if (solutions && currentWindowWidth >= breakpoints.lg) {\r\n const solutionBoxes = container.querySelectorAll('.section-solutions__box');\r\n solutionImages = solutions.querySelectorAll('.media--bg-wrap .lazy-bg-image');\r\n\r\n activeImage = solutionImages[0];\r\n\r\n for (let i = 0; i < solutionBoxes.length; i++) {\r\n const box = solutionBoxes[i];\r\n\r\n box.addEventListener('mouseenter', e => solutionHover(e, i));\r\n box.addEventListener('mouseleave', e => solutionHover(e, i));\r\n }\r\n }\r\n\r\n}\r\n","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n return constructor.resolve(callback()).then(function() {\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","import promiseFinally from './finally';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!arr || typeof arr.length === 'undefined')\n throw new TypeError('Promise.all accepts an array');\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(values) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, len = values.length; i < len; i++) {\n values[i].then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n (typeof setImmediate === 'function' &&\n function(fn) {\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","import Promise from './index';\nimport promiseFinally from './finally';\n\n/** @suppress {undefinedVars} */\nvar globalNS = (function() {\n // the only reliable means to get the global object is\n // `Function('return this')()`\n // However, this causes CSP violations in Chrome apps.\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n})();\n\nif (!('Promise' in globalNS)) {\n globalNS['Promise'] = Promise;\n} else if (!globalNS.Promise.prototype['finally']) {\n globalNS.Promise.prototype['finally'] = promiseFinally;\n}\n","import {breakpointKeys, currentBreakpoint} from \"../utils/windowResize\";\r\nimport {onWindowResize} from \"./windowResize\";\r\nimport 'promise-polyfill/src/polyfill';\r\n\r\n\r\nconst loadedClassname = \"image--loaded\";\r\nlet lastUsedScreenWidth;\r\nconst lazy = {};\r\n\r\n/**\r\n * Try to decode the image, after it's loaded, and resolve the Promise.\r\n *\r\n * @param {Element} newImage\r\n * @returns {Promise}\r\n */\r\nfunction decodeImage(newImage) {\r\n return (\"decode\" in newImage) ?\r\n newImage.decode().then(() => newImage) :\r\n Promise.resolve(newImage);\r\n}\r\n\r\n/**\r\n * Load an image, and return a Promise that resolves once the image is loaded.\r\n *\r\n * @param {string} path\r\n * @returns {Promise} Promise that will resolve with the loaded image once it's ready.\r\n */\r\nfunction loadImage(path) {\r\n const newImage = new Image();\r\n\r\n return new Promise(resolve => {\r\n newImage.addEventListener(\"load\", () => decodeImage(newImage).then(image => resolve(image)), false);\r\n newImage.src = path;\r\n });\r\n}\r\n\r\n/**\r\n * This function gets the data-src from the image wrapper, based on width of the browser window.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n * @returns {string}\r\n */\r\nfunction getImageSrc(container) {\r\n\r\n let src = \"\";\r\n let largestBreakpointFound = 0;\r\n\r\n breakpointKeys.forEach((breakpointName, index) => {\r\n if (currentBreakpoint >= index) {\r\n if (index === 0 || index > largestBreakpointFound) {\r\n src = container.getAttribute(`data-src-${breakpointName}`) || src;\r\n\r\n // Make sure we won't set the size to a smaller breakpoint later, in case they're not properly ordered.\r\n largestBreakpointFound = index;\r\n }\r\n }\r\n });\r\n\r\n return src;\r\n}\r\n\r\n/**\r\n * This function gets the image wrapper data attributes src and alt text\r\n * and creates an new image tag to download the image.\r\n * It then uses the src as a background-image.\r\n *\r\n * @param {HTMLElement} bgContainer - Image wrapper element\r\n */\r\nexport function loadBgImage(bgContainer) {\r\n\r\n const src = getImageSrc(bgContainer);\r\n\r\n // If no usable source was returned, abort at once.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n const formattedSrc = `url(${src})`;\r\n\r\n if (bgContainer.style.backgroundImage === formattedSrc) {\r\n return;\r\n }\r\n // Start loading the new image.\r\n loadImage(src).then(() => {\r\n bgContainer.style.backgroundImage = formattedSrc;\r\n bgContainer.classList.add(loadedClassname);\r\n });\r\n}\r\n\r\n/**\r\n * This function gets the image wrapper data attributes src and alt text\r\n * and creates an new image tag to download the image.\r\n * It then inserts the image into the given container.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n */\r\nexport function loadLazyImage(container) {\r\n\r\n const src = getImageSrc(container);\r\n\r\n // If no usable source was returned, abort mission.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n // We don't want to start processing if the new URL matches the old one.\r\n const oldImage = container.querySelector('img');\r\n if (oldImage && container.classList.contains(loadedClassname)) {\r\n if (oldImage.getAttribute(\"src\") === src) {\r\n return;\r\n } else {\r\n container.removeChild(oldImage);\r\n }\r\n }\r\n // Start loading the new image.\r\n loadImage(src).then(newImageTag => {\r\n // Set the ALT text.\r\n const altText = container.getAttribute(\"data-alt\") || \"\";\r\n newImageTag.setAttribute(\"alt\", altText);\r\n\r\n container.appendChild(newImageTag);\r\n container.classList.add(loadedClassname);\r\n });\r\n}\r\n\r\n/**\r\n *\r\n * @private\r\n */\r\nfunction refreshAll () {\r\n // If our current screen mode does not match the one we used the last time we made an image lookup,\r\n // perform a new one now. Otherwise, what would be the point?\r\n if (lastUsedScreenWidth < currentBreakpoint) {\r\n for (let i = 0; i < lazy.images.length; i++) {\r\n const lazyImage = lazy.images[i];\r\n loadLazyImage(lazyImage);\r\n }\r\n for (let i = 0; i < lazy.bgImages.length; i++) {\r\n const lazyBgImage = lazy.bgImages[i];\r\n loadBgImage(lazyBgImage);\r\n }\r\n lastUsedScreenWidth = currentBreakpoint;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Load all responsive images on the page.\r\n */\r\nexport function loadAllLazyImages() {\r\n lazy.images = document.querySelectorAll(\".lazy-image\");\r\n lazy.bgImages = document.querySelectorAll(\".lazy-bg-image\");\r\n lastUsedScreenWidth = -1;\r\n refreshAll();\r\n onWindowResize(refreshAll);\r\n}\r\n","import {addLoader, removeLoader} from \"./loader\";\r\n\r\nfunction serialize(form) {\r\n if (!form || form.nodeName !== \"FORM\") {\r\n return;\r\n }\r\n\r\n const q = [];\r\n let i, j;\r\n for (i = form.elements.length - 1; i >= 0; i = i - 1) {\r\n if (form.elements[i].name === \"\") {\r\n continue;\r\n }\r\n switch (form.elements[i].nodeName) {\r\n case 'INPUT':\r\n switch (form.elements[i].type) {\r\n case 'text':\r\n case 'tel':\r\n case 'email':\r\n case 'date':\r\n case 'number':\r\n case 'hidden':\r\n case 'password':\r\n case 'button':\r\n case 'reset':\r\n case 'submit':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (form.elements[i].checked) {\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n }\r\n break;\r\n case 'file':\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'SELECT':\r\n switch (form.elements[i].type) {\r\n case 'select-one':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'select-multiple':\r\n for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {\r\n if (form.elements[i].options[j].selected) {\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].options[j].value)}`);\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n case 'BUTTON':\r\n switch (form.elements[i].type) {\r\n case 'reset':\r\n case 'submit':\r\n case 'button':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n return q.join(\"&\").replace(/%20/g, '+');\r\n}\r\n\r\nexport function initForm(formContainer) {\r\n\r\n const container = document.getElementById(formContainer);\r\n\r\n if (container) {\r\n const contactForm = container.querySelector('form');\r\n contactForm.addEventListener('submit', e => {\r\n e.preventDefault();\r\n const submitBtn = contactForm.querySelector(\"button[type=submit]\");\r\n\r\n addLoader(submitBtn);\r\n\r\n setTimeout(() => removeLoader(submitBtn), 10000);\r\n contactForm.classList.add('sending');\r\n\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(contactForm);\r\n\r\n // Define what happens\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n const json = JSON.parse(this.responseText);\r\n\r\n if (json.status !== 'ok') {\r\n const errorText = contactForm.getAttribute('data-error-message');\r\n alert(errorText);\r\n } else {\r\n const successPage = contactForm.getAttribute('data-success-url');\r\n if (successPage) {\r\n window.location = successPage;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n // Set up our request\r\n XHR.open('POST', '/umbraco/api/mail/sendmultinestedcontent', true);\r\n // Add the required HTTP header for form data POST requests\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n // Finally, send our data.\r\n XHR.send(formData);\r\n });\r\n }\r\n}\r\n","\r\n\r\nexport function addLoader(container, absolute) {\r\n const loader = document.createElement('div');\r\n loader.classList.add('loader');\r\n // Adding the dots\r\n for (let i = 0; i < 4; i++) {\r\n const div = document.createElement('div');\r\n loader.appendChild(div);\r\n }\r\n // Add loader to element\r\n container.appendChild(loader);\r\n container.classList.add(\"loading\");\r\n\r\n if (absolute) {\r\n container.classList.add(\"loading--center\");\r\n }\r\n}\r\n\r\nexport function removeLoader(container) {\r\n const loader = container.querySelector(\".loader\");\r\n\r\n if (loader) {\r\n container.removeChild(loader);\r\n container.classList.remove(\"loading\");\r\n container.classList.remove(\"loading--center\");\r\n }\r\n}\r\n","function toggleReadMore(e) {\r\n const classTarget = e.currentTarget;\r\n const moreTextElem = classTarget.nextElementSibling;\r\n\r\n e.preventDefault();\r\n\r\n if (classTarget.classList.contains('open')) {\r\n classTarget.classList.remove('open');\r\n moreTextElem.style.height = '0px';\r\n } else {\r\n classTarget.classList.add('open');\r\n moreTextElem.style.height = `${moreTextElem.scrollHeight}px`;\r\n }\r\n}\r\n\r\nexport function initReadMore(selector, scopeElement = document.body) {\r\n const readMore = scopeElement.querySelectorAll(selector);\r\n for (let i = 0; i < readMore.length; i++) {\r\n const readMoreElement = readMore[i];\r\n readMoreElement.addEventListener('click', toggleReadMore);\r\n }\r\n}\r\n","import {initWindowResize, onWindowResize} from \"./utils/windowResize\";\r\nimport {setupNav} from './modules/navigation';\r\nimport {setupSearch} from './modules/search';\r\nimport {setupVimeoIframeBg} from \"./modules/video\";\r\nimport {activateSolutionHover} from \"./modules/solutions\";\r\nimport {loadAllLazyImages} from \"./utils/lazyImage\";\r\nimport {initForm} from \"./modules/form\";\r\nimport {initReadMore} from \"./modules/readmore\";\r\n\r\nconst body = document.body;\r\n\r\nfunction init() {\r\n initWindowResize();\r\n\r\n //Remove loading class to start animations\r\n body.classList.remove('loading');\r\n\r\n // Setup top/mobile navigation functionality\r\n const nav = body.querySelector('.nav');\r\n setupNav(nav);\r\n setupSearch(nav); // nav used as query container to save DOM lookup\r\n onWindowResize(setupNav);\r\n\r\n loadAllLazyImages();\r\n\r\n // Load and setup video backgrounds\r\n setupVimeoIframeBg('.header__media[data-vimeoid]', body);\r\n\r\n window.addEventListener('load', () => {\r\n activateSolutionHover('.section-solutions', body);\r\n initReadMore('.read-more__btn', body);\r\n\r\n initForm('contact');\r\n\r\n // Setup click-event on product-images.\r\n // this is to avoid doublet-links\r\n const productImages = body.querySelectorAll(\".section-products .lazy-image\");\r\n\r\n for (let i = 0; i < productImages.length; i++) {\r\n const productImage = productImages[i];\r\n const productWrap = productImage.parentNode;\r\n\r\n const goToProduct = () => {\r\n const readMoreBtn = productWrap.querySelector(\".btn--readmore\");\r\n\r\n if (readMoreBtn) {\r\n window.location = readMoreBtn.href;\r\n }\r\n };\r\n\r\n productImage.addEventListener(\"click\", goToProduct);\r\n\r\n const productHeader = productWrap.querySelector(\".h3\");\r\n\r\n if (productHeader) {\r\n productHeader.addEventListener(\"click\", goToProduct);\r\n }\r\n }\r\n });\r\n}\r\n\r\ninit();\r\n","import {transitionEndEventName} from \"../utils/helpers\";\r\n\r\nexport function setupVimeoIframeBg(selector, container = document) {\r\n const mediaWrap = container.querySelector(selector);\r\n\r\n if (mediaWrap) {\r\n const iframe = mediaWrap.querySelector('iframe') || document.createElement('iframe');\r\n const vimeoId = mediaWrap.getAttribute(\"data-vimeoid\");\r\n const vimeoStartTime = mediaWrap.getAttribute(\"data-start-time\") || '0s';\r\n\r\n if (!iframe.src) {\r\n iframe.setAttribute('frameborder', 0);\r\n iframe.setAttribute('allowtransparency', 'true');\r\n iframe.setAttribute('playsinline', 'true');\r\n\r\n const imageElem = mediaWrap.querySelector('img');\r\n\r\n if (imageElem) {\r\n\r\n iframe.addEventListener('load', function () {\r\n this.parentNode.classList.add('video-loaded');\r\n });\r\n\r\n imageElem.addEventListener(transitionEndEventName, function imageTransitionEnd() {\r\n this.parentNode.classList.add('image-visibile');\r\n this.removeEventListener(transitionEndEventName, imageTransitionEnd);\r\n });\r\n } else {\r\n iframe.addEventListener('load', function () {\r\n this.parentNode.classList.add('video-loaded');\r\n this.parentNode.classList.add('image-visibile');\r\n });\r\n }\r\n\r\n iframe.src = `https://player.vimeo.com/video/${vimeoId}?background=1&dnt=1#t=${vimeoStartTime}`; //Todo remember to remove #t hash if not needed\r\n mediaWrap.appendChild(iframe);\r\n }\r\n }\r\n}"],"names":["resizeTimer","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","window","innerWidth","currentBreakpoint","innerHeight","resizeFunctions","getWindowSizes","lastFoundWidth","forEach","key","index","width","resizeHandler","clearTimeout","setTimeout","funcRef","onWindowResize","handler","push","transitionEndEventName","transitions","el","document","createElement","t","undefined","style","detactTransitionEndEventName","nav","navMenu","activeList","closeTimer","solutionImages","activeImage","isVisible","elem","offsetWidth","offsetHeight","getClientRects","length","openNavClass","activeClass","activeOpenClass","disableNavMenu","resetHeight","removeAttribute","classList","remove","height","getAttribute","toggleMenuOpen","contains","add","scrollHeight","toggleActiveList","e","element","callback","outsideClickListener","removeClickListener","targetParent","currentTarget","parentNode","preventDefault","setAttribute","event","target","removeEventListener","addEventListener","top","offsetTop","setupNav","container","querySelector","navBtn","navLang","navLinks","querySelectorAll","langClassToggle","classTarget","className","toggle","toggleClass","i","md","searchClassToggle","navSearch","navInputField","value","trim","stopPropagation","focus","solutionHover","boxIndex","img","type","finallyConstructor","constructor","this","then","resolve","reason","reject","setTimeoutFunc","noop","Promise","fn","TypeError","_state","_handled","_value","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","thisArg","apply","arguments","_unhandledRejectionFn","len","Handler","done","ex","prototype","prom","promiseFinally","all","arr","args","Array","slice","call","remaining","res","val","race","values","setImmediate","err","console","warn","globalNS","global","Error","lastUsedScreenWidth","loadedClassname","lazy","loadImage","path","newImage","Image","decode","image","src","getImageSrc","largestBreakpointFound","breakpointName","loadBgImage","bgContainer","formattedSrc","backgroundImage","loadLazyImage","oldImage","removeChild","newImageTag","altText","appendChild","refreshAll","images","bgImages","initForm","formContainer","getElementById","contactForm","submitBtn","absolute","loader","div","addLoader","XHR","XMLHttpRequest","formData","form","nodeName","j","q","elements","name","encodeURIComponent","checked","options","selected","join","replace","serialize","onreadystatechange","readyState","DONE","JSON","parse","responseText","status","errorText","alert","successPage","location","open","setRequestHeader","send","toggleReadMore","moreTextElem","nextElementSibling","body","selector","mediaWrap","iframe","vimeoId","vimeoStartTime","imageElem","imageTransitionEnd","setupVimeoIframeBg","solutions","lg","solutionBoxes","box","activateSolutionHover","readMore","initReadMore","productImages","productImage","productWrap","goToProduct","readMoreBtn","href","productHeader","init"],"mappings":"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"}