HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/pietvanmierlo/stempelbv.nl/wwwroot/js/site/app.js.map
{"version":3,"sources":["webpack:///./resources/js/site/global/scrollHandler.js","webpack:///./node_modules/process/browser.js","webpack:///./resources/js/site/components/overlayMenuHandler.js","webpack:///./resources/js/site/components/youtubeHandler.js","webpack:///./resources/js/site/components/scrollToHandler.js","webpack:///./resources/js/global/polyfills/promise.js","webpack:///./resources/js/global/polyfills/isInteger.js","webpack:///./resources/js/site/components/sliderHandler.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./resources/js/site/components/mapsHandler.js","webpack:///./resources/js/site/components/chocolateFactory.js","webpack:///./resources/js/site/app.js","webpack:///./resources/js/site/global/browserHandler.js","webpack:///./resources/js/site/global/helpers.js","webpack:///(webpack)/buildin/global.js","webpack:///./resources/js/site/components/cookieHandler.js"],"names":["ScrollHandler","time","Date","now","timeout","waitThrottle","waitDebounce","lastScrollTopPosition","scrollDirectionDown","scrollDirectionUp","init","triggerOnInit","window","addEventListener","triggerThrottle","triggerSmooth","isset","clearTimeout","setTimeout","triggerDebounce","triggerElementInViewportAnimation","detectScrollDirection","toggleStickyHeader","detectIfElementIsPartlyInViewport","el","rect","getBoundingClientRect","windowHeight","innerHeight","document","documentElement","clientHeight","windowWidth","innerWidth","clientWidth","verticalInView","top","height","horizontalInView","left","width","detectIfElementIsFullyInViewport","bottom","scrollTopPosition","pageYOffset","scrollTop","elements","querySelectorAll","elementsLength","length","e","element","classList","remove","stickyHeader","querySelector","subnavList","subNavIsVisible","hidden","i","getComputedStyle","visibility","body","add","cachedSetTimeout","cachedClearTimeout","process","module","exports","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","call","this","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","len","run","marker","runClearTimeout","Item","array","noop","nextTick","args","Array","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","bodyScrollLock","require","OverlayMenuHandler","overlayMenuTriggerList","overlayMenuTriggerListCount","overlayMenuTrigger","initOverlayMenu","toggleOverlayMenu","event","overlayMenuNav","enableBodyScroll","contains","forEach","elem","tabIndex","disableBodyScroll","toggle","YoutubeHandler","youtubeClass","players","youtubePlayers","youtubePlayersAmount","youtubePlayer","getAttribute","youtubeElement","id","link","autoPlay","parseInt","console","log","initYoutube","YT","Player","onYouTubePlayerAPIReady","loadPlayers","getScript","player","videoId","host","playerVars","modestbranding","rel","disablekb","autoplay","events","onStateChange","onReady","playerContainerId","target","getIframe","data","PlayerState","ENDED","playVideo","ScrollToHandler","offset","duration","start","change","currentTime","allowAnimation","scrollToAnimation","easing","anchorLinks","anchorLinksAmount","prepareScrollTo","preventDefault","elementId","substr","indexOf","scrollToElementPosition","getElementById","Math","max","startTime","performance","getTime","requestAnimationFrame","animateScroll","abortScrollAnimation","timestamp","progress","min","EasingFunctions","newScrollTop","cancelAnimationFrame","factory","finallyConstructor","callback","constructor","then","value","resolve","reason","reject","setTimeoutFunc","Promise","fn","TypeError","_state","_handled","_value","undefined","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","thisArg","_unhandledRejectionFn","Handler","done","ex","prom","all","arr","slice","remaining","res","val","race","values","setImmediate","err","warn","globalNS","global","define","Number","isInteger","isFinite","floor","Sliders","sliderContainers","sliderContainersLength","slider","sliderId","Slidersetting","SliderSetting","slideQuery","navigationButtons","dots","autoSlider","Slider","prepareParameters","settingsObject","sliderInterval","setSliderId","string","setAutoSlider","boolean","setSliderInterval","integer","setSlideQuery","setNavigationButtons","setDots","getSliderId","getAutoSlider","autoSlide","getSliderInterval","getSlideQuery","getNavigationButtons","getDots","fill","settingsObjectKeys","Object","keys","settingsObjectLength","key","settings","sliderObject","activeSlideId","previousSlideId","nextSlideId","availableSlides","slides","autoSliderInterval","setSlide","swipeGestures","Hammer","resetAutoSlider","nextSlide","previousSlide","navigationButtonsLength","clickNavigationButton","dotsLength","clickDot","clearInterval","setInterval","slidesLength","slide","style","pointerEvents","setActiveDot","navButton","navButtonDirection","clickedDot","dot","dotOrder","Function","Timeout","clearFn","_id","_clearFn","scope","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","registerImmediate","html","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","doc","attachTo","getPrototypeOf","toString","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","canUsePostMessage","MessageChannel","port1","port2","createElement","script","onreadystatechange","removeChild","appendChild","random","source","attachEvent","task","MapsHandler","map","location","lat","lng","styling","hasAttribute","parseFloat","setCustomStyling","google","maps","drawMap","Map","zoom","center","disableDefaultUI","styles","contentString","infowindow","InfoWindow","content","Marker","position","open","ChocolateFactory","bannedVisitor","enter","chocolateFactories","amountOfChocolateFactories","ChocolateBar","_flashTicket","chocolateBar","goldenTicket","enjoyTheTour","chocolateFactory","tourGroup","oompaLoompas","amountOfOompaLoompas","tourGroupSize","visitor","visitorName","_isVisitorBanned","_getArrangement","_finishTour","nodeName","group","_addWillieWonka","Ajax","post","HttpRequest","response","JSON","parse","status","_thanksForVisiting","redirectUrl","_giveFeedbackToMembers","errors","_unknownGapInFactory","_willie","feedbackArea","innerHTML","_clearPreviousMarkedJackets","jacket","visitorFeedbackArea","visitorNode","_grabVisitorJacket","visitorFeedback","visitorFeedbackAmount","visitorFeedbackLine","currentFeedbackArea","capitalizeFirstLetter","markedJackets","markedJacketsAmount","currentLayer","safetyBreak","parentNode","tagName","nextStop","BrowserHandler","userAgent","browserInfo","navigator","getBrowserInfo","handleIE","handleSafari","msie","ielt11","ie11","match","substring","getElementsByTagName","tem","ua","M","test","exec","appName","appVersion","splice","obj","linear","t","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","async","scripts","prior","onload","_","isAbort","readyState","src","insertBefore","debounce","func","wait","immediate","context","later","callNow","Cookie","set","days","domain","domainParts","date","expires","setTime","toGMTString","split","cookie","shift","join","get","nameEQ","ca","c","charAt","erase","number_format","number","decimals","dec_point","thousands_sep","replace","n","prec","abs","sep","dec","s","k","pow","round","toFixedFix","Element","closest","matches","msMatchesSelector","webkitMatchesSelector","ancestor","parentElement","url","xhr","XMLHttpRequest","token","setRequestHeader","send","stringify","toUpperCase","snakeToCamel","m","indexInParent","node","children","childNodes","num","nodeType","copyToClipboard","editable","contentEditable","readOnly","range","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","setSelectionRange","select","execCommand","bodyOffset","scrollLeft","pageXOffset","g","CookieHandler","cookieBar","cookieOverlay","cookieMessage","cookieSwitch","cookieFadeOutAnimationDuration","acceptTracking","initCookieBar","initCookieOverlay","checkForCookieSettings","initCookieSwitch","closeButton","closeCookieMessage","openCookieSettingsButton","openCookieSettings","toggleTrackingInput","checked","toggleTrackingSetting","acceptButton","setCookieSettings","saveButton","reload"],"mappings":"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","file":"/js/site/app.js","sourcesContent":["/* ==========================================================================\n   Scroll handler\n   - Handler the objects which are bind on scroll events or visible in viewport\n ========================================================================== */\n\nconst ScrollHandler = {\n\n    // Variables for debounce and throttle effects\n    time: Date.now(),\n    timeout: null,\n    waitThrottle: 1000,\n    waitDebounce: 300,\n\n    // Variables for scroll direction\n    lastScrollTopPosition: 0,\n    scrollDirectionDown: true,\n    scrollDirectionUp: false,\n\n    //Initialisation\n    init: function () {\n\n        // Trigger start on start up\n        ScrollHandler.triggerOnInit();\n\n        // Throttle scroll\n        window.addEventListener('scroll', function () {\n            if ((ScrollHandler.time + ScrollHandler.waitThrottle - Date.now()) < 0) {\n                ScrollHandler.triggerThrottle();\n                ScrollHandler.time = Date.now();\n            }\n        });\n\n        // Smooth scroll\n        window.addEventListener('scroll', function () {\n            ScrollHandler.triggerSmooth();\n        });\n\n        // Debounce scroll\n        window.addEventListener('scroll', function () {\n            if(isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);\n            ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);\n        });\n    },\n\n    // Trigger on start up\n    triggerOnInit: function () {\n        ScrollHandler.triggerElementInViewportAnimation();\n    },\n\n    // Trigger scroll functions with throttle (preferred)\n    triggerThrottle: function () {\n        // console.log('Throttled scroll');\n        ScrollHandler.triggerElementInViewportAnimation();\n    },\n\n    // Trigger scroll on debounce\n    triggerDebounce: function () {\n        // console.log('Debounce scroll');\n    },\n\n    // Trigger scroll on the flight\n    triggerSmooth: function () {\n        // console.log('Smooth scroll');\n        ScrollHandler.detectScrollDirection();\n        ScrollHandler.toggleStickyHeader();\n    },\n\n    // Detect if part of a given element is visible in the viewport\n    // El must be a node element\n    detectIfElementIsPartlyInViewport: function(el)\n    {\n        if(isset(el)){\n\n            const rect = el.getBoundingClientRect();\n            // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }\n            const windowHeight = (window.innerHeight || document.documentElement.clientHeight);\n            const windowWidth = (window.innerWidth || document.documentElement.clientWidth);\n\n            const verticalInView = (rect.top <= (windowHeight)) && ((rect.top + rect.height) >= 0);\n            const horizontalInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);\n\n            return (verticalInView && horizontalInView);\n        }\n    },\n\n    // Detect if a given element is fully visible in the viewport\n    // El must be a node element\n    detectIfElementIsFullyInViewport: function(el)\n    {\n        if(isset(el)){\n            const rect = el.getBoundingClientRect();\n\n            return (\n                rect.top >= 0 &&\n                rect.bottom <= window.innerHeight\n            );\n        }\n    },\n\n    detectScrollDirection: function () {\n        const scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: \"https://github.com/qeremy/so/blob/master/so.dom.js#L426\"\n        if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition){\n            ScrollHandler.scrollDirectionDown = true;\n            ScrollHandler.scrollDirectionUp = false;\n        } else {\n            ScrollHandler.scrollDirectionDown = false;\n            ScrollHandler.scrollDirectionUp = true;\n        }\n        ScrollHandler.lastScrollTopPosition = scrollTopPosition;\n    },\n\n    // Trigger animation on elements that have 'element-in-viewport' and that are in the viewport\n    // These animation can only be triggered once, if you want more then that you should write an specific function for this\n    triggerElementInViewportAnimation: function () {\n        const elements = document.querySelectorAll('.element-in-viewport');\n        const elementsLength = elements.length;\n\n        for(let e = 0; e < elementsLength; e++){\n\n            const element = elements[e];\n            if(ScrollHandler.detectIfElementIsPartlyInViewport(element)){\n                element.classList.remove('element-in-viewport');\n            }\n        }\n\n    },\n\n    // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------\n\n    // Hide or show sticky navigation when header isn't visible\n    toggleStickyHeader: function () {\n        const stickyHeader = document.querySelector('.js-sticky-header');\n        const visibleStickyHeaderClass = 'is-sticky-header-visible';\n        const subnavList = document.querySelectorAll('.js-subnav');\n        var subNavIsVisible = false;\n        stickyHeader.hidden = false;\n\n        for (let i = 0; i < subnavList.length; i++) {\n            if (window.getComputedStyle(subnavList[i], null).visibility == \"visible\") {\n                return subNavIsVisible = true;\n            }\n        }\n\n        if(isset(stickyHeader) && !subNavIsVisible){\n            // Hide when scrolling DOWN (OR within offset)\n            if(ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110){\n                document.body.classList.remove(visibleStickyHeaderClass);\n            }\n            // Show when scrolling UP and outside of offset\n            else {\n                document.body.classList.add(visibleStickyHeaderClass);\n            }\n        }\n    },\n\n};\n\nScrollHandler.init();","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/* ==========================================================================\n   Navigation handler\n   - Handles the showing and hiding of the overlay-menu component which has the proper classes.\n ========================================================================== */\n\nconst bodyScrollLock = require('body-scroll-lock');\n\nconst OverlayMenuHandler = {\n\n    // init: function () {\n    //     const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');\n    //     OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);\n    // },\n\n    init: function () {\n\n        const overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');\n        const overlayMenuTriggerListCount = overlayMenuTriggerList.length;\n\n        if(isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0){\n            for(let i = 0; i < overlayMenuTriggerListCount; i++){\n                const overlayMenuTrigger = overlayMenuTriggerList[i];\n                OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);\n            }\n        }\n    },\n\n    initOverlayMenu: function (overlayMenuTrigger) {\n        overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);\n    },\n\n    toggleOverlayMenu: function (event) {\n        const overlayMenuNav = document.querySelector('.js-overlay-menu');\n        // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');\n\n        // Bail if overlayMenu doesn't exist\n        if (!overlayMenuNav) return;\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(overlayMenuNav);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (document.body.classList.contains('is-overlay-menu-active')) {\n            overlayMenuNav.querySelectorAll('[tabindex=\"0\"]').forEach(function(elem) {\n                elem.tabIndex = -1;\n            });\n\n            document.body.classList.remove('is-overlay-menu-active');\n            return;\n        }\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(overlayMenuNav);\n\n        overlayMenuNav.querySelectorAll('[tabindex=\"-1\"]').forEach(function(elem) {\n            elem.tabIndex = 0;\n        });\n\n        // Toggle active overlayMenu by setting a class on the body\n        document.body.classList.toggle('is-overlay-menu-active');\n        overlayMenuNav.hidden = false;\n    }\n};\n\nOverlayMenuHandler.init();","/* ==========================================================================\n    Youtube handler\n ========================================================================== */\n\nconst YoutubeHandler = {\n\n    youtubeClass : '.js-youtube-player',\n    players: [],\n\n    init : function()\n    {\n        // Get the youtube players containers\n        const youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);\n        const youtubePlayersAmount = youtubePlayers.length;\n\n        for(let i = 0; i < youtubePlayersAmount; i++){\n\n            const youtubePlayer = youtubePlayers[i];\n\n\n            const youtubePlayerId = youtubePlayer.getAttribute('id');\n            if(youtubePlayerId !== null )\n            {\n                // Strip the necessary data from the html and create objects from it\n                const youtubeElement = {\n                    id: youtubePlayer.getAttribute('id'),\n                    link: youtubePlayer.getAttribute('data-youtube-link'),\n                    autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play')),\n                };\n\n                YoutubeHandler.players.push(youtubeElement);\n            }\n            else{\n                console.log(\"Element not include because there isn't a id on the player\");\n                console.log(youtubePlayer);\n            }\n        }\n\n        if(youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();\n\n    },\n\n    /**\n     * Check if external script is loaded\n     *\n     */\n    initYoutube: function() {\n        // See if YT variable exists\n        if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') {\n            // Setup API ready function\n            window.onYouTubePlayerAPIReady = function() {\n                YoutubeHandler.loadPlayers();\n            };\n            // Load external script\n            getScript('https://www.youtube.com/iframe_api');\n            // If YT already exists load player\n        } else {\n            YoutubeHandler.loadPlayers();\n        }\n    },\n\n    /**\n     * Create the Youtube player(s) with parameters\n     * And rewrite the players to key them by the element id\n     *\n     */\n    loadPlayers: function() {\n\n        let players = [];\n\n        const youtubePlayersAmount = YoutubeHandler.players.length;\n        for(let i = 0; i < youtubePlayersAmount; i++){\n\n            let youtubePlayer = YoutubeHandler.players[i];\n\n            // Load player\n            youtubePlayer.player = new YT.Player(youtubePlayer.id,{\n                height: 200,\n                width: 200,\n                videoId: youtubePlayer.link,\n                host: 'https://www.youtube-nocookie.com',\n                playerVars: {\n                    modestbranding: 0,\n                    rel: 0,\n                    disablekb: 1,\n                    autoplay: youtubePlayer.autoPlay\n                },\n                events: {\n                    // 'onReady': YoutubeHandler.onReady,\n                    'onStateChange': YoutubeHandler.onStateChange\n                }\n            });\n\n            players[youtubePlayer.id] = youtubePlayer;\n\n        }\n\n        YoutubeHandler.players = players;\n\n    },\n\n    /**\n     * When player is ready to play\n     */\n    onReady : function(event) {\n\n        const playerContainerId = event.target.getIframe().getAttribute('id');\n        const player = YoutubeHandler.players[playerContainerId].player;\n\n        // Show video\n        // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);\n\n        // If not on tablet or mobile, play on high quality\n        // player.mute();\n        // player.playVideo();\n        // player.setPlaybackQuality('hd1080');\n    },\n\n    /**\n     * Listener for Youtube state change\n     */\n    onStateChange : function(event) {\n\n        const playerContainerId = event.target.getIframe().getAttribute('id');\n        const player = YoutubeHandler.players[playerContainerId].player;\n\n        const videoState = event.data;\n\n        // Loop video\n        if (event.data === YT.PlayerState.ENDED ) {\n            player.playVideo();\n        }\n    }\n};\n\nYoutubeHandler.init();","/* ==========================================================================\n    Scroll To Click handler\n ========================================================================== */\n\nconst ScrollToHandler = {\n\n    // Animation settings\n    offset : 60, //pixel\n    duration : 1400, //ms\n\n    // Animation variables\n    body : null,\n    start : 0,\n    change : 0,\n    currentTime : 0,\n    allowAnimation : false,\n    scrollToAnimation : null,\n\n    // Watch the EasingFunction helper for the available methods\n    easing: 'easeInOutQuad',\n\n    init : function(){\n\n        const anchorLinks = document.querySelectorAll('.js-scroll-to-target');\n        const anchorLinksAmount = anchorLinks.length;\n\n        for(let i = 0; i < anchorLinksAmount; i++) {\n\n            const anchorLink = anchorLinks[i];\n\n            anchorLink.addEventListener('click', function (event) {\n                ScrollToHandler.prepareScrollTo(this.getAttribute('href'));\n                event.preventDefault();\n            });\n        }\n    },\n\n    /**\n     * Prepare the Handler for the animation\n     */\n    prepareScrollTo : function(elementId){\n\n        // Get the scroll to element\n        elementId = elementId.substr(elementId.indexOf('#')+1);\n        const scrollToElement = document.getElementById(elementId);\n        const scrollToElementPosition = scrollToElement.getBoundingClientRect();\n\n        // Reset or define the Handler variables\n        ScrollToHandler.body = document.documentElement;\n        ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop\n        ScrollToHandler.change = ((scrollToElementPosition.top + ScrollToHandler.start) - ScrollToHandler.start) - ScrollToHandler.offset;\n        ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();\n        ScrollToHandler.allowAnimation = true;\n\n        // Trigger animation\n        scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);\n\n        // Stop on scroll\n        window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);\n\n    },\n\n    /*\n     * Animate the scroll position\n     */\n    animateScroll : function (timestamp) {\n\n        // Calculate progress from 0 - 1\n        let progress = Math.min(1, (timestamp -  ScrollToHandler.startTime) / ScrollToHandler.duration);\n        if(progress < 0) progress = 0;\n\n        // Convert progress with easing function\n        progress = EasingFunctions[ScrollToHandler.easing](progress);\n\n        const newScrollTop = ScrollToHandler.start + ( ScrollToHandler.change * progress );\n\n        ScrollToHandler.body.scrollTop = newScrollTop;\n        if( ScrollToHandler.body.scrollTop === 0 ) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop\n\n        if(progress < 1 && ScrollToHandler.allowAnimation){\n            scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);\n        }\n\n    },\n\n    /*\n     * Abort the scroll animation\n     */\n    abortScrollAnimation : function (event) {\n        ScrollToHandler.allowAnimation = false;\n        cancelAnimationFrame(ScrollToHandler.scrollToAnimation);\n    }\n\n};\n\nScrollToHandler.init();","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n        typeof define === 'function' && define.amd ? define(factory) :\n            (factory());\n}(this, (function () { 'use strict';\n\n    /**\n     * @this {Promise}\n     */\n    function 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\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\n    var setTimeoutFunc = setTimeout;\n\n    function noop() {}\n\n// Polyfill for Function.prototype.bind\n    function bind(fn, thisArg) {\n        return function() {\n            fn.apply(thisArg, arguments);\n        };\n    }\n\n    /**\n     * @constructor\n     * @param {Function} fn\n     */\n    function 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<!Function>} */\n        this._deferreds = [];\n\n        doResolve(fn, this);\n    }\n\n    function 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\n    function 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\n    function reject(self, newValue) {\n        self._state = 2;\n        self._value = newValue;\n        finale(self);\n    }\n\n    function 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     */\n    function 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     */\n    function 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\n    Promise.prototype['catch'] = function(onRejected) {\n        return this.then(null, onRejected);\n    };\n\n    Promise.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\n    Promise.prototype['finally'] = finallyConstructor;\n\n    Promise.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\n    Promise.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\n    Promise.reject = function(value) {\n        return new Promise(function(resolve, reject) {\n            reject(value);\n        });\n    };\n\n    Promise.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\n    Promise._immediateFn =\n        (typeof setImmediate === 'function' &&\n            function(fn) {\n                setImmediate(fn);\n            }) ||\n        function(fn) {\n            setTimeoutFunc(fn, 0);\n        };\n\n    Promise._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\n    /** @suppress {undefinedVars} */\n    var 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\n    if (!('Promise' in globalNS)) {\n        globalNS['Promise'] = Promise;\n    } else if (!globalNS.Promise.prototype['finally']) {\n        globalNS.Promise.prototype['finally'] = finallyConstructor;\n    }\n\n})));","Number.isInteger = Number.isInteger || function(value) {\n    return typeof value === \"number\" &&\n        isFinite(value) &&\n        Math.floor(value) === value;\n};","\n/* Example\n\nconst headerImageSliderSetting = new SliderProjectorSetting({\n    sliderProjectorId: 'header-image-slider',\n    slideQuery: '#header-image-slider .placeholder figure',\n    dots: '#header-image-slider .slider-navigation-labels .navigation span',\n    autoSlider: true,\n    sliderInterval: 4000\n});\nheaderImageSliderSetting = headerImageSliderSetting.prepareParameters();\n\nconst headerImageSlider = new SliderProjector(headerImageSliderSetting).init();\n\n */\n\n\nlet Sliders = [];\n\nconst sliderContainers = document.querySelectorAll('.js-slider');\nconst sliderContainersLength = sliderContainers.length;\n\nfor(let i =0; i < sliderContainersLength; i++){\n\n    const slider = sliderContainers[i];\n    const sliderId = slider.getAttribute('id');\n\n    if(sliderId !== null){\n\n        const Slidersetting = new SliderSetting({\n            sliderId: sliderId,\n            slideQuery: '#' + sliderId +' .js-slider-slide',\n            navigationButtons: '#' + sliderId +' .js-slider-button',\n            dots: '#' + sliderId +' .js-slider-indicator',\n            autoSlider: slider.getAttribute('data-auto-slide'),\n        });\n\n        Sliders.push( new Slider(Slidersetting.prepareParameters()).init() );\n    }\n    else console.log('An image slider has no id...');\n}\n\n\nfunction SliderSetting(settingsObject) {\n\n    const self = this;\n\n    this.sliderId = '';\n    this.autoSlider = false;\n    this.sliderInterval = 4000;\n    this.navigationButtons = '';\n    this.dots = '';\n    this.slideQuery = '';\n\n    this.setSliderId = function (string) {\n        this.sliderId = string;\n        return this;\n    };\n    this.setAutoSlider = function (boolean) {\n        this.autoSlider = boolean;\n        return this;\n    };\n    this.setSliderInterval = function (integer) {\n        this.sliderInterval = integer;\n        return this;\n    };\n    this.setSlideQuery = function (string) {\n        this.slideQuery = string;\n        return this;\n    };\n    this.setNavigationButtons = function (string) {\n        this.navigationButtons = string;\n        return this;\n    };\n    this.setDots = function (string) {\n        this.dots = string;\n        return this;\n    };\n    this.getSliderId = function () {\n        return this.sliderId;\n    };\n    this.getAutoSlider = function () {\n        let autoSlide = this.autoSlider;\n        if(!Number.isInteger(autoSlide)){\n            if(autoSlide == false) autoSlide = false;\n            else autoSlide = true;\n        }\n        return autoSlide;\n    };\n    this.getSliderInterval = function () {\n        return this.sliderInterval;\n    };\n    this.getSlideQuery = function () {\n        return this.slideQuery;\n    };\n    this.getNavigationButtons = function () {\n        return this.navigationButtons;\n    };\n    this.getDots = function () {\n        return this.dots;\n    };\n\n    // Invert setters to getters\n    this.prepareParameters = function () {\n\n        return {\n            sliderId: self.getSliderId(),\n            autoSlider: self.getAutoSlider(),\n            sliderInterval: self.getSliderInterval(),\n            navigationButtons: self.getNavigationButtons(),\n            dots: self.getDots(),\n            slideQuery: self.getSlideQuery()\n        }\n\n    };\n\n    // Mass assign settings\n    this.fill = function () {\n        // Object.keys(settingsObject).forEach(function (key) {\n        //     self[key] = settingsObject[key];\n        // });\n\n        const settingsObjectKeys = Object.keys(settingsObject);\n        const settingsObjectLength = settingsObjectKeys.length;\n\n        for(let i = 0; i < settingsObjectLength; i++){\n            const key = settingsObjectKeys[i];\n            self[key] = settingsObject[key];\n        }\n\n    };\n\n    this.fill();\n\n    return {\n        sliderId: self.setSliderId,\n        autoSlider: self.setAutoSlider,\n        sliderInterval: self.setSliderInterval,\n        navigationButtons: self.setNavigationButtons,\n        dots: self.setDots,\n        slideQuery: self.setSlideQuery,\n        prepareParameters: self.prepareParameters\n    };\n}\n\nfunction Slider(settings) {\n\n    //Define Slider object\n    const self = this;\n    this.sliderObject = '';\n\n    //SlideParameters\n    this.activeSlideId = 0;\n    this.previousSlideId = 0;\n    this.nextSlideId = 0;\n    this.availableSlides = 1;\n    this.slides = [];\n    this.autoSliderInterval = null;\n\n    this.settings = {};\n\n    this.init = function () {\n\n        //Append settings to self\n        this.settings = settings;\n\n        //Assign needed elements and calculations\n        this.sliderObject = document.getElementById(this.settings.sliderId);\n        this.slides = document.querySelectorAll(this.settings.slideQuery);\n        this.availableSlides = this.slides.length;\n        this.activeSlideId = 0;\n\n        // Set active slide (and possible previous and next classes)\n        this.setSlide();\n\n        // Swipe interaction\n        const swipeGestures = new Hammer(this.sliderObject);\n        swipeGestures.on('swipeleft', function () {\n            self.resetAutoSlider();\n            self.nextSlide();\n            self.setSlide();\n        });\n        swipeGestures.on('swiperight', function () {\n            self.resetAutoSlider();\n            self.previousSlide();\n            self.setSlide();\n        });\n\n\n        if (this.settings.navigationButtons !== '') {\n\n            // Click interaction\n            const navigationButtons = document.querySelectorAll(this.settings.navigationButtons);\n            const navigationButtonsLength = navigationButtons.length;\n            for(let i = 0; i < navigationButtonsLength; i++){\n                const navigationButton = navigationButtons[i];\n                navigationButton.addEventListener('click', function () {\n                    self.clickNavigationButton(this);\n                });\n            }\n        }\n\n        if (this.settings.dots !== '') {\n            // Click interaction\n            const dots = document.querySelectorAll(this.settings.dots);\n            const dotsLength = dots.length;\n            // console.log(this.settings.dots);\n            // console.log(dots);\n            for(let i = 0; i < dotsLength; i++){\n                const dot = dots[i];\n                dot.addEventListener('click', function () {\n                    self.clickDot(this);\n                });\n            }\n        }\n\n        self.autoSlider();\n    };\n\n\n    this.autoSlider = function (){\n\n        // Reset the interval if defined\n        if(this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);\n\n\n        // Check if should auto slide before creating the interval\n        // We do this inhere, because the autoslide function is also called by other functionality\n        if(this.settings.autoSlider !== false && Number.isInteger(this.settings.sliderInterval)  ){\n\n            this.autoSliderInterval = setInterval(function() {\n                    self.nextSlide();\n                    self.setSlide();\n                }, this.settings.sliderInterval\n            );\n        }\n    };\n\n    this.resetAutoSlider = self.autoSlider;\n\n    this.nextSlide = function () {\n        this.activeSlideId++;\n        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;\n    };\n\n    this.previousSlide = function () {\n        this.activeSlideId--;\n        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;\n    };\n\n    this.setSlide = function () {\n\n        // Loop through the form elements\n        const slidesLength = self.slides.length;\n        for(let i = 0; i < slidesLength; i++){\n            const slide = self.slides[i];\n\n            slide.style.pointerEvents = \"none\"; // Needed for swipe functionality\n\n            // Convert data set attribute to desired type\n            const slideOrder = parseInt(slide.getAttribute('data-order'));\n\n            // Remove and set active for all slides\n            if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');\n            else slide.classList.add('is-active');\n        }\n\n        if (self.settings.dots !== '') { self.setActiveDot(); }\n    };\n\n    this.clickNavigationButton = function (navButton) {\n\n        const navButtonDirection = navButton.getAttribute('aria-label');\n\n        if(navButtonDirection === 'next') this.nextSlide();\n        else if(navButtonDirection === 'previous') this.previousSlide();\n\n        self.setSlide();\n        self.resetAutoSlider();\n    };\n\n    this.clickDot = function (clickedDot) {\n        self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));\n        self.setSlide();\n        self.resetAutoSlider();\n    };\n\n    this.setActiveDot = function () {\n\n        const dots = document.querySelectorAll(this.settings.dots);\n        const dotsLength = dots.length;\n        for(let i = 0; i < dotsLength; i++){\n            const dot = dots[i];\n            dotOrder = parseInt(dot.getAttribute('data-order'));\n\n            if(dotOrder !== self.activeSlideId) {\n                dot.classList.remove('is-active');\n                dot.tabIndex = 0;\n            }\n            else {\n                dot.classList.add('is-active');\n                dot.tabIndex = -1;\n            }\n        }\n    };\n}","var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n","(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n","/* ==========================================================================\n    Google Maps handler\n    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map\n ========================================================================== */\n\nconst MapsHandler = {\n\n    map: '',\n    key: 'AIzaSyBq0TlsbT_Kaoct1StK8ZVECIZ6PezAT4s',\n    location: {lat: 51.344410, lng: 5.550140},\n    styling: '',\n\n    init: function () {\n        // Get map by id\n        MapsHandler.map = document.querySelector('.js-google-map');\n\n        // Check if a map is defined\n        if (isset(MapsHandler.map)) {\n\n            if(MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));\n            if(MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));\n\n            MapsHandler.setCustomStyling();\n\n            // See if google variable exists\n            if (typeof(google) == 'undefined' || typeof(google.maps) == 'undefined') {\n                // Load external script\n                getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);\n            } else {\n                MapsHandler.drawMap()\n            }\n\n        }\n    },\n\n    drawMap: function () {\n        // Create a map\n        let map = new google.maps.Map(MapsHandler.map, {\n            zoom: 14,\n            center: MapsHandler.location,\n            disableDefaultUI: true,\n            styles: MapsHandler.styling\n        });\n\n        var contentString = '<div><p>Plan een route op '+\n            '<a target=\"_blank\" href=\"https://www.google.com/maps/dir/?api=1&destination=' + MapsHandler.location.lat + ',' + MapsHandler.location.lng +'\" class=\"link\">'+\n            'google maps</a> '+\n            '</p></div>';\n\n        var infowindow = new google.maps.InfoWindow({\n            content: contentString\n        });\n\n        // Add a marker\n        let marker = new google.maps.Marker({\n            position: MapsHandler.location,\n            map: map,\n            // label: 'A'\n        });\n\n        marker.addListener('click', function() {\n            infowindow.open(map, marker);\n        });\n\n    },\n\n    setCustomStyling: function () {\n\n        MapsHandler.styling =\n            [\n                {\n                    \"featureType\": \"water\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#e9e9e9\"\n                        },\n                        {\n                            \"lightness\": 17\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"landscape\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#f5f5f5\"\n                        },\n                        {\n                            \"lightness\": 20\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.highway\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffffff\"\n                        },\n                        {\n                            \"lightness\": 17\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.highway\",\n                    \"elementType\": \"geometry.stroke\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffffff\"\n                        },\n                        {\n                            \"lightness\": 29\n                        },\n                        {\n                            \"weight\": 0.2\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.arterial\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffffff\"\n                        },\n                        {\n                            \"lightness\": 18\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffffff\"\n                        },\n                        {\n                            \"lightness\": 16\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#f5f5f5\"\n                        },\n                        {\n                            \"lightness\": 21\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.park\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#dedede\"\n                        },\n                        {\n                            \"lightness\": 21\n                        }\n                    ]\n                },\n                {\n                    \"elementType\": \"labels.text.stroke\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"on\"\n                        },\n                        {\n                            \"color\": \"#ffffff\"\n                        },\n                        {\n                            \"lightness\": 16\n                        }\n                    ]\n                },\n                {\n                    \"elementType\": \"labels.text.fill\",\n                    \"stylers\": [\n                        {\n                            \"saturation\": 36\n                        },\n                        {\n                            \"color\": \"#333333\"\n                        },\n                        {\n                            \"lightness\": 40\n                        }\n                    ]\n                },\n                {\n                    \"elementType\": \"labels.icon\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"off\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"transit\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#f2f2f2\"\n                        },\n                        {\n                            \"lightness\": 19\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"administrative\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#fefefe\"\n                        },\n                        {\n                            \"lightness\": 20\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"administrative\",\n                    \"elementType\": \"geometry.stroke\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#fefefe\"\n                        },\n                        {\n                            \"lightness\": 17\n                        },\n                        {\n                            \"weight\": 1.2\n                        }\n                    ]\n                }\n            ];\n\n    }\n};\n\nMapsHandler.init();","/* ==========================================================================\n | Prevent Bots handler\n |\n | We named this chocolate factory and belonging confusing js hooks\n | to prevent smart bots from blocking these variable or functions.\n |\n ========================================================================== */\n\nconst ChocolateFactory = {\n\n    bannedVisitor: [],\n\n    /** Get all the chocolate factory and start\n     *  Looping through those start flashing tickets\n     */\n    enter: function()\n    {\n\n        const chocolateFactories = document.querySelectorAll('.js-chocolate-factory');\n\n        if(isset(chocolateFactories)){\n\n            const amountOfChocolateFactories = chocolateFactories.length;\n            for(let i = 0; i < amountOfChocolateFactories; i++){\n\n                const ChocolateBar = chocolateFactories[i];\n                ChocolateFactory._flashTicket(ChocolateBar);\n            }\n        }\n    },\n\n    /**\n     * If factory has a golden ticket\n     * Then we can make them go on the tour if there has been click on the ticket\n     *\n     * @param chocolateBar\n     * @private\n     */\n    _flashTicket: function (chocolateBar) {\n\n        // Try get the ticket from the chocolateBar\n        const goldenTicket = chocolateBar.querySelector('.js-golden-ticket');\n\n        // Only continue if chocolate bar has a golden ticket\n        if(isset(goldenTicket)){\n\n            goldenTicket.addEventListener('click', function () {\n                ChocolateFactory.enjoyTheTour(chocolateBar);\n            });\n        }\n        else{\n            console.log('To bad, no golden tickets has been found.');\n        }\n    },\n\n    /**\n     * Start the tour through the factory\n     * And get the names and properties of the members of the group\n     * If there are members in the group of course\n     *\n     * @param chocolateFactory\n     */\n    enjoyTheTour(chocolateFactory){\n\n        // Ask for the tour group\n        const tourGroup = chocolateFactory.querySelectorAll('input, textarea');\n\n        if(isset(tourGroup)){\n\n            // For each visitor we want a belonging Oompa Loompa\n            let oompaLoompas = {};\n            let amountOfOompaLoompas = 0;\n\n            const tourGroupSize = tourGroup.length;\n            for(let i = 0; i < tourGroupSize; i++){\n\n                // Get the visitor from the group\n                const visitor = tourGroup[i];\n\n                // Ask for its name\n                const visitorName = visitor.getAttribute('name');\n\n                // Check if the visitor is banned\n                if( ChocolateFactory._isVisitorBanned(visitorName)) continue;\n\n                oompaLoompas[ visitorName ] = ChocolateFactory._getArrangement(visitor);\n                amountOfOompaLoompas++;\n            }\n\n            // Check for insurance that there are oompa loompas\n            if(amountOfOompaLoompas === 0) return;\n\n            // Send submit request\n            ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);\n        }\n        else{\n            console.log('To bad, no members to visit this factory')\n        }\n    },\n\n    /**\n     * Check if the visitor name isn't allow\n     *\n     * @param visitorName\n     * @returns {boolean}\n     * @private\n     */\n    _isVisitorBanned: function(visitorName){\n        if(ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1){\n            return true;\n        }\n        return false;\n    },\n\n    /**\n     * Most get visitor have a normal arrangement\n     * But sometimes there are special cases\n     * Like a Selector or checkbox\n     *\n     * @param visitor\n     * @returns {*}\n     * @private\n     */\n    _getArrangement: function(visitor)\n    {\n\n        const visitorType = visitor.nodeName;\n\n        switch (visitorType) {\n            default:\n                return visitor.value;\n        }\n    },\n\n    /**\n     * Finish the tour\n     * If successful show thanks message\n     * Or show defined error message or fallback\n     *\n     * @param group\n     * @param chocolateFactory\n     * @returns {*|void}\n     * @private\n     */\n    _finishTour: function(group, chocolateFactory)\n    {\n        // Add willie to the group\n        group = ChocolateFactory._addWillieWonka(group);\n\n        // Get the gate for finish the tour\n        const gate = '/contact/process';\n\n        try {\n            Ajax.post(gate, group, function (HttpRequest) {\n\n                const response = JSON.parse(HttpRequest.response);\n\n                switch (HttpRequest.status) {\n                    case 200:\n                        return ChocolateFactory._thanksForVisiting(response.redirectUrl);\n                    case 422:\n                        return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);\n                    default:\n                        break;\n                }\n\n                return ChocolateFactory._unknownGapInFactory(chocolateFactory);\n            });\n        }\n        catch (e) {\n            return ChocolateFactory._unknownGapInFactory(chocolateFactory);\n        }\n    },\n\n    /**\n     * Add willie wonka to the group\n     * Ps... it actually the secret code!\n     *\n     * @param group\n     * @returns {*}\n     * @private\n     */\n    _addWillieWonka: function(group){\n        group._willie = 'wonka';\n        return group;\n    },\n\n    /**\n     * Add the feedback to the desired area.\n     * Most likely to the visitor directly, but sometime to the factory desired feedback area\n     *\n     * @param errors\n     * @param chocolateFactory\n     * @private\n     */\n    _giveFeedbackToMembers: function(errors, chocolateFactory){\n\n        // Grab the factory feedback area\n        const feedbackArea = chocolateFactory.querySelector('.js-error-area');\n\n        // Clear the current html\n        if(isset(feedbackArea)) feedbackArea.innerHTML = '';\n\n        // Clear the previous marked jackets\n        ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);\n\n        Object.keys(errors).forEach(function(visitor) {\n\n            let jacket = null;\n            let visitorFeedbackArea = null;\n\n            // Honey elements doesn't has a accessible element\n            if(visitor !== '_honey' && visitor !== '_secretCode') {\n\n                // Grab the visitor\n                const visitorNode = chocolateFactory.querySelector('#' + visitor);\n\n                // Find the jacket of a visitor\n                jacket = ChocolateFactory._grabVisitorJacket(visitorNode);\n\n                // If found get the desired area\n                if(isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-group-error');\n\n                // Clear the current html\n                if(isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';\n\n            }\n\n            // Get the feedback for this visitor\n            const visitorFeedback = errors[visitor];\n\n            // Spit out each line\n            const visitorFeedbackAmount = visitorFeedback.length;\n            for(let i = 0; i < visitorFeedbackAmount; i++){\n                const visitorFeedbackLine = visitorFeedback[i];\n\n                console.log(visitor, visitorFeedbackLine);\n\n                // Honey elements doesn't has a accessible element area\n                if(visitor !== '_honey' && visitor !== '_secretCode') {\n\n                    // Mark the jacket\n                    if(isset(jacket)) jacket.classList.add('has-error');\n\n                    // Append feedback to visitor feedback area if defined\n                    if(isset(visitorFeedbackArea) && visitorFeedbackLine.length > 0)\n                    {\n                        let currentFeedbackArea = visitorFeedbackArea.innerHTML;\n                        currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';\n                        visitorFeedbackArea.innerHTML = currentFeedbackArea;\n                    }\n                }\n\n                // Append feedback to factory feedback area if defined\n                if(isset(feedbackArea) && visitorFeedbackLine.length > 0){\n                    let currentFeedbackArea = feedbackArea.innerHTML;\n                    currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';\n                    feedbackArea.innerHTML = currentFeedbackArea;\n                }\n            }\n        });\n    },\n\n    /**\n     * Clear the previous marked jackets\n     *\n     * @param chocolateFactory\n     * @private\n     */\n    _clearPreviousMarkedJackets(chocolateFactory) {\n\n        const markedJackets = chocolateFactory.querySelectorAll('.has-error');\n        const markedJacketsAmount = markedJackets.length;\n\n        for(let i = 0; i < markedJacketsAmount; i++){\n            markedJackets[i].classList.remove('has-error');\n        }\n    },\n\n    /**\n     * Grab the jacket of the visitor\n     *\n     * @param visitor\n     * @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}\n     * @private\n     */\n    _grabVisitorJacket: function(visitor){\n\n        // Check if visitor is defined\n        if (!isset(visitor)) return null;\n\n        // Do loop settings\n        currentLayer = visitor;\n        safetyBreak = 0;\n\n        // Grab the next layer till it is the jacket (or safetyBreak has been reached\n        do {\n            safetyBreak++;\n            currentLayer = currentLayer.parentNode;\n            if(currentLayer.classList.contains('js-form-group')) return currentLayer;\n        } while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);\n\n        return null;\n    },\n\n    /**\n     * Redirect the visitor to the thanks page\n     *\n     * @param nextStop\n     * @private\n     */\n    _thanksForVisiting: function (nextStop) {\n        window.location = nextStop;\n    },\n\n    /**\n     * Unknown error occurred, log the error\n     *\n     * @param chocolateFactory\n     * @private\n     */\n    _unknownGapInFactory: function (chocolateFactory) {\n        console.log(chocolateFactory);\n        console.log('ChocolateFactory: Unkown Error');\n    },\n};\n\nChocolateFactory.enter();","/** ==========================================================================\n *  Dependencies\n *  =========================================================================*/\n\n/**\n * External\n */\nrequire('hammerjs');\nrequire('objectFitPolyfill');\n\n/**\n * Global / Shared with KMS\n */\nrequire('./../global/polyfills/eventPolyFill');\nrequire('./../global/polyfills/isInteger');\nrequire('./../global/polyfills/promise');\n\n\n/** ==========================================================================\n *  Global functionalities\n *  =========================================================================*/\n\nrequire('./global/helpers'); // Should be first\nrequire('./global/browserHandler');\n// require('./global/pagetransitionHandler');\n// require('./global/resizeHandler');\nrequire('./global/scrollHandler');\n\n\n/** ==========================================================================\n *  Component functionalities\n *  =========================================================================*/\n\nrequire('./components/chocolateFactory');\nrequire('./components/cookieHandler');\n// require('./components/InputHandler');\nrequire('./components/mapsHandler');\nrequire('./components/overlayMenuHandler');\nrequire('./components/sliderHandler');\nrequire('./components/scrollToHandler');\n// require('./components/searchHandler');\n// require('./components/shareButtonsHandler');\nrequire('./components/youtubeHandler');\n\n/** ==========================================================================\n *  Shop Component functionalities\n *  =========================================================================*/\n\n// require('./../shop/components/shoppingcartHandler');","/* ==========================================================================\n   Browser Handler\n ========================================================================== */\n\nconst BrowserHandler = {\n\n    userAgent: '',\n    browserInfo: '',\n\n\n    init: function () {\n        BrowserHandler.userAgent = window.navigator.userAgent;\n        BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();\n        BrowserHandler.handleIE();\n        BrowserHandler.handleSafari();\n    },\n\n    handleIE: function () {\n\n        // Detect versions below ie11\n        let msie = BrowserHandler.userAgent.indexOf('MSIE ');\n        const ielt11 = msie > 0;\n\n        // Detect ie11\n        const ie11 = !!navigator.userAgent.match(/Trident.*rv\\:11\\./);\n\n        // If Internet Explorer\n        if (ielt11 || ie11) {\n            // Default version\n            let version = '11';\n\n            // Way to detect version < 11\n            if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(\n                msie + 5,\n                BrowserHandler.userAgent.indexOf(\".\", msie)\n            ));\n\n            // Append classes to HTML (we have to do this separately because else ie will fail)\n            document.body.classList.add('ie');\n            document.body.classList.add('v'+version);\n        }\n\n    },\n\n    // Fallback for older safari version\n    handleSafari: function () {\n\n        if(BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10){\n            document.getElementsByTagName('html')[0].classList.add('ie');\n        }\n\n    },\n\n    getBrowserInfo: function () {\n        let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n        if(/trident/i.test(M[1])){\n            tem=/\\brv[ :]+(\\d+)/g.exec(ua) || [];\n            return {name:'IE ',version:(tem[1]||'')};\n        }\n        if(M[1]==='Chrome'){\n            tem=ua.match(/\\bOPR\\/(\\d+)/)\n            if(tem!=null)   {return {name:'Opera', version:tem[1]};}\n        }\n        M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];\n        if((tem=ua.match(/version\\/(\\d+)/i))!=null) {M.splice(1,1,tem[1]);}\n        return {\n            name: M[0],\n            version: M[1]\n        };\n    }\n};\n\nBrowserHandler.init();","/* ==========================================================================\n    Helper functions\n ========================================================================== */\n\n/*\n * Simple isset method for this does not exist in javascript\n */\nwindow.isset = function (obj) {\n    return typeof obj !== 'undefined' && obj !== null;\n};\n\n/*\n * Easing Functions - inspired from http://gizma.com/easing/\n * only considering the t value for the range [0, 1] => [0, 1]\n */\nwindow.EasingFunctions = {\n    // no easing, no acceleration\n    linear: function (t) {\n        return t\n    },\n    // accelerating from zero velocity\n    easeInQuad: function (t) {\n        return t * t\n    },\n    // decelerating to zero velocity\n    easeOutQuad: function (t) {\n        return t * (2 - t)\n    },\n    // acceleration until halfway, then deceleration\n    easeInOutQuad: function (t) {\n        return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n    },\n    // accelerating from zero velocity\n    easeInCubic: function (t) {\n        return t * t * t\n    },\n    // decelerating to zero velocity\n    easeOutCubic: function (t) {\n        return (--t) * t * t + 1\n    },\n    // acceleration until halfway, then deceleration\n    easeInOutCubic: function (t) {\n        return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\n    },\n    // accelerating from zero velocity\n    easeInQuart: function (t) {\n        return t * t * t * t\n    },\n    // decelerating to zero velocity\n    easeOutQuart: function (t) {\n        return 1 - (--t) * t * t * t\n    },\n    // acceleration until halfway, then deceleration\n    easeInOutQuart: function (t) {\n        return t < .5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t\n    },\n    // accelerating from zero velocity\n    easeInQuint: function (t) {\n        return t * t * t * t * t\n    },\n    // decelerating to zero velocity\n    easeOutQuint: function (t) {\n        return 1 + (--t) * t * t * t * t\n    },\n    // acceleration until halfway, then deceleration\n    easeInOutQuint: function (t) {\n        return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t\n    }\n};\n\n/*\n * Vanilla version of the $.getScript\n */\nwindow.getScript = function (source, callback) {\n    let script = document.createElement('script');\n    script.async = 1;\n\n    const scripts = document.getElementsByTagName('script');\n    let prior = scripts[scripts.length - 1];\n\n    script.onload = script.onreadystatechange = function (_, isAbort) {\n        if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {\n            script.onload = script.onreadystatechange = null;\n            script = undefined;\n\n            if (!isAbort) {\n                if (callback) callback();\n            }\n        }\n    };\n\n    script.src = source;\n    prior.parentNode.insertBefore(script, prior);\n};\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param func\n * @param wait\n * @param immediate\n * @returns {Function}\n */\nwindow.debounce = function(func, wait, immediate) {\n    let timeout;\n    return function () {\n        let context = this, args = arguments;\n        let later = function () {\n            timeout = null;\n            if (!immediate) func.apply(context, args);\n        };\n        let callNow = immediate && !timeout;\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n        if (callNow) func.apply(context, args);\n    };\n};\n\n/*\n * Cookie helper class\n */\nwindow.Cookie = {\n    set: function (name, value, days) {\n        let domain, domainParts, date, expires, host;\n\n        if (days) {\n            date = new Date();\n            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n            expires = \"; expires=\" + date.toGMTString();\n        }\n        else {\n            expires = \"\";\n        }\n\n        host = location.host;\n        if (host.split('.').length === 1) {\n            // no \".\" in a domain - it's localhost or something similar\n            document.cookie = name + \"=\" + value + expires + \"; path=/\";\n        }\n        else {\n            // Remember the cookie on all sub domains.\n            //\n            // Start with trying to set cookie to the top domain.\n            // (example: if user is on foo.com, try to set\n            //  cookie to domain \".com\")\n            //\n            // If the cookie will not be set, it means \".com\"\n            // is a top level domain and we need to\n            // set the cookie to \".foo.com\"\n            domainParts = host.split('.');\n            domainParts.shift();\n            domain = '.' + domainParts.join('.');\n\n            // For development purpose, remove this when moving to production\n            // domain = '.komma.pro';\n\n            document.cookie = name + \"=\" + value + expires + \"; path=/; domain=\" + domain;\n\n            // check if cookie was successfuly set to the given domain\n            // (otherwise it was a Top-Level Domain)\n            if (Cookie.get(name) == null || Cookie.get(name) != value) {\n                // append \".\" to current domain\n                domain = '.' + host;\n                document.cookie = name + \"=\" + value + expires + \"; path=/; domain=\" + domain;\n            }\n        }\n    },\n\n    get: function (name) {\n        const nameEQ = name + \"=\";\n        const ca = document.cookie.split(';');\n        for (let i = 0; i < ca.length; i++) {\n            let c = ca[i];\n            while (c.charAt(0) === ' ') {\n                c = c.substring(1, c.length);\n            }\n\n            if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n        }\n        return null;\n    },\n\n    erase: function (name) {\n        Cookie.set(name, '', -1);\n    }\n};\n\n/*\n * Javascript version of the number_format method of PHP\n */\nwindow.number_format = function (number, decimals, dec_point, thousands_sep) {\n    // Strip all characters but numerical ones.\n    number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n    let n = !isFinite(+number) ? 0 : +number,\n        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n        s = '',\n        toFixedFix = function (n, prec) {\n            var k = Math.pow(10, prec);\n            return '' + Math.round(n * k) / k;\n        };\n    // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n    if (s[0].length > 3) {\n        s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n    }\n    if ((s[1] || '').length < prec) {\n        s[1] = s[1] || '';\n        s[1] += new Array(prec - s[1].length + 1).join('0');\n    }\n    return s.join(dec);\n};\n\n\n/**\n * Element.closest() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n */\nif (!Element.prototype.closest) {\n    if (!Element.prototype.matches) {\n        Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n    }\n    Element.prototype.closest = function (s) {\n        var el = this;\n        var ancestor = this;\n        if (!document.documentElement.contains(el)) return null;\n        do {\n            if (ancestor.matches(s)) return ancestor;\n            ancestor = ancestor.parentElement;\n        } while (ancestor !== null);\n        return null;\n    };\n}\n\nwindow.Ajax = {\n\n    //TODO: Can we create a prepare request function ??\n\n    get: function(url, callback) {\n        let xhr = new XMLHttpRequest();\n        let token = document.querySelector('meta[name=\"csrf-token\"]').content;\n\n        xhr.open('get', url, true);\n        xhr.setRequestHeader('Content-Type', 'application/json');\n        xhr.setRequestHeader('X-CSRF-TOKEN', token);\n        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n        xhr.onreadystatechange = function() {\n            if (xhr.readyState === 4) {\n                callback(xhr);\n            }\n        };\n        xhr.send();\n    },\n\n    post: function(url, data, callback) {\n        let xhr = new XMLHttpRequest();\n        let token = document.querySelector('meta[name=\"csrf-token\"]').content;\n\n        xhr.open('post', url, true);\n        xhr.setRequestHeader('Content-Type', 'application/json');\n        xhr.setRequestHeader('X-CSRF-TOKEN', token);\n        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n        xhr.onreadystatechange = function() {\n            if (xhr.readyState === 4) {\n                callback(xhr);\n            }\n        };\n        xhr.send( JSON.stringify(data));\n    }\n};\n\n/**\n * Capitalize the first letter of the string\n * @param string\n * @returns {string}\n */\nwindow.capitalizeFirstLetter = function (string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n};\n\n/**\n * Convert snake case into camelcase\n *\n * @param string\n * @returns {*}\n */\nwindow.snakeToCamel = function (string){\n    return string.replace(/(\\-\\w)/g, function(m){return m[1].toUpperCase();});\n};\n\n/**\n * Get the index of an element inside its parent\n */\nwindow.indexInParent= function (node) {\n    const children = node.parentNode.childNodes;\n    let num = 0;\n    for (let i = 0; i < children.length; i++) {\n        if (children[i] == node) return num;\n        if (children[i].nodeType == 1) num++;\n    }\n    return -1;\n};\n\n/**\n * For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.\n * The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').\n * Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard\n * Code from: https://stackoverflow.com/a/46981847\n */\nwindow.copyToClipboard = function (el) {\n\n    // resolve the element\n    el = (typeof el === 'string') ? document.querySelector(el) : el;\n\n    // handle iOS as a special case\n    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {\n\n        // save current contentEditable/readOnly status\n        const editable = el.contentEditable;\n        const readOnly = el.readOnly;\n\n        // convert to editable with readonly to stop iOS keyboard opening\n        el.contentEditable = true;\n        el.readOnly = true;\n\n        // create a selectable range\n        var range = document.createRange();\n        range.selectNodeContents(el);\n\n        // select the range\n        const selection = window.getSelection();\n        selection.removeAllRanges();\n        selection.addRange(range);\n        el.setSelectionRange(0, 999999);\n\n        // restore contentEditable/readOnly to original state\n        el.contentEditable = editable;\n        el.readOnly = readOnly;\n    }\n    else {\n        el.select();\n    }\n\n    // execute copy command\n    document.execCommand('copy');\n};\n\n/**\n * Get the position of the element related to the body\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\nwindow.bodyOffset = function (el) {\n    const rect = el.getBoundingClientRect(),\n        scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\n        scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n    return { top: rect.top + scrollTop, left: rect.left + scrollLeft }\n};","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/* ==========================================================================\n   Cookie handler\n   - Primary usage for toggling the cookie message and/or switch\n ========================================================================== */\n\nconst CookieHandler = {\n\n    cookieBar : null,\n    cookieOverlay : null,\n    cookieMessage : null,\n\n    cookieSwitch : null,\n\n    cookieFadeOutAnimationDuration : 400,\n    acceptTracking : false,\n\n    // Initialize cookie handler\n    init : function()\n    {\n        // Bind cookie bar or overlay to cookieMessage\n        CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay');\n\n        // Bind cookie bar to cookieBar\n        CookieHandler.cookieBar = document.querySelector('.js-cookie-bar');\n\n        // If isset init the functions for cookie bar\n        if(isset(CookieHandler.cookieBar)){\n            CookieHandler.initCookieBar();\n        }\n        else{\n            // Else try to connect cookie overlay with tracking to cookieOverlay\n            CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay');\n\n            // If isset init the functions for cookie overlay\n            if(isset(CookieHandler.cookieOverlay)){\n                CookieHandler.initCookieOverlay();\n            }\n        }\n\n        // If either type of cookie has been found check if settings are defined\n        if(isset(CookieHandler.cookieMessage)){\n            CookieHandler.checkForCookieSettings();\n        }\n\n        // Bind cookie switch to Handler\n        CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch');\n        // If isset init the functions for cookie switch\n        if(isset(CookieHandler.cookieSwitch)){\n            CookieHandler.initCookieSwitch();\n        }\n    },\n\n    // Init the cookie bar actions\n    initCookieBar: function(){\n        const closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');\n        if(isset(closeButton)){\n            closeButton.addEventListener('click', CookieHandler.closeCookieMessage);\n        }\n    },\n\n    // Init the cookie overlay actions\n    initCookieOverlay: function(){\n\n        // Open the cookie settings event\n        const openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');\n        if(isset(openCookieSettingsButton)){\n            openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);\n        }\n\n        // Toggle of the tracking input\n        const toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');\n        if(isset(toggleTrackingInput)){\n\n            if(toggleTrackingInput.checked === true) {\n                CookieHandler.acceptTracking = true;\n            }\n\n            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);\n        }\n\n        // Accept / Save cookies button event\n        const acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');\n        if(isset(acceptButton)){\n            acceptButton.addEventListener('click', CookieHandler.setCookieSettings);\n        }\n\n    },\n\n    // Init the cookie switch actions\n    initCookieSwitch: function(){\n\n        // Toggle of the tracking input\n        const toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');\n        if(isset(toggleTrackingInput)){\n\n            // Force the state of the cookie switch input because the pop-up is forced on checked\n            // while the switch checks by php if the cookie really exist or not\n            if(toggleTrackingInput.checked === true) {\n                CookieHandler.acceptTracking = true;\n            }\n            else{\n                CookieHandler.acceptTracking = false;\n            }\n\n            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);\n        }\n\n        // Save cookies button event\n        const saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');\n        if(isset(saveButton)){\n            saveButton.addEventListener('click', function(){\n                CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)\n                CookieHandler.setCookieSettings();\n            });\n        }\n\n    },\n\n    checkForCookieSettings: function(){\n        if (Cookie.get('cookieMessage')) {\n            CookieHandler.cookieMessage.classList.add('is-accepted');\n            document.body.classList.add('is-cookies-accepted');\n        }\n        else {\n            CookieHandler.cookieMessage.classList.remove('is-accepted');\n            document.body.classList.remove('is-cookies-accepted');\n        }\n    },\n\n    closeCookieMessage: function (){\n        Cookie.set('cookieMessage', true, 90);\n        CookieHandler.cookieMessage.classList.add('is-transitioning-out');\n        document.body.classList.add('is-cookies-accepted');\n    },\n\n    openCookieSettings: function (){\n        CookieHandler.cookieOverlay.querySelector('.js-cookie-settings').classList.remove('is-hidden');\n        CookieHandler.cookieOverlay.querySelector('.js-cookie-info').classList.add('is-hidden');\n    },\n\n    toggleTrackingSetting: function(){\n        if(CookieHandler.acceptTracking){\n            CookieHandler.acceptTracking = false;\n        }\n        else{\n            CookieHandler.acceptTracking = true;\n        }\n    },\n\n    setCookieSettings: function () {\n\n        // Set tracking cookie or delete it if isset according to the desired settings\n        if(CookieHandler.acceptTracking){\n            Cookie.set('trackingCookieAccepted', 'true', 90);\n        }\n        else{\n            if(Cookie.get('trackingCookieAccepted')){\n                Cookie.erase('trackingCookieAccepted');\n            }\n        }\n\n        CookieHandler.closeCookieMessage();\n\n        // Reload after animation to automatically trigger the tracking after accepting it\n        setTimeout(function(){\n            location.reload()\n        }, CookieHandler.cookieFadeOutAnimationDuration);\n    },\n\n};\n\nCookieHandler.init();"],"sourceRoot":""}