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/SBogers54/csbinstallatietechniek.nl/wwwroot/js/app.js.map
{"version":3,"sources":["webpack:///./node_modules/process/browser.js","webpack:///./resources/js/components/scrollToHandler.js","webpack:///./resources/js/components/mapsHandler.js","webpack:///./resources/js/global/scrollHandler.js","webpack:///./resources/js/global/polyfills/promise.js","webpack:///./resources/js/global/polyfills/isInteger.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./resources/js/components/youtubeHandler.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./resources/js/components/projectorHandler.js","webpack:///./resources/js/global/models/errorResponse.js","webpack:///./resources/js/global/models/language.js","webpack:///./resources/js/global/models/countryLanguagesResponse.js","webpack:///./resources/js/components/GlobalisationService.js","webpack:///./resources/js/components/RegisterController.js","webpack:///./resources/js/app.js","webpack:///./resources/js/global/helpers.js","webpack:///./resources/js/components/heroSliderHandler.js","webpack:///./resources/js/global/browserHandler.js","webpack:///./resources/js/components/chocolateFactory.js","webpack:///./resources/js/components/overlayMenuHandler.js","webpack:///./resources/js/components/cookieHandler.js","webpack:///(webpack)/buildin/global.js"],"names":["cachedSetTimeout","cachedClearTimeout","process","module","exports","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","setTimeout","e","call","this","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","length","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","noop","nextTick","args","Array","arguments","i","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","ScrollToHandler","offset","duration","body","start","change","currentTime","allowAnimation","scrollToAnimation","easing","init","anchorLinks","document","querySelectorAll","anchorLinksAmount","addEventListener","event","prepareScrollTo","getAttribute","preventDefault","elementId","substr","indexOf","scrollToElementPosition","getElementById","getBoundingClientRect","documentElement","Math","max","scrollTop","window","pageYOffset","top","startTime","performance","now","Date","getTime","requestAnimationFrame","animateScroll","abortScrollAnimation","timestamp","progress","min","EasingFunctions","newScrollTop","cancelAnimationFrame","MapsHandler","maps","key","map","hasAttribute","lat","parseFloat","lng","node","location","styles","setCustomStyling","google","getScript","drawMaps","googleMap","Map","zoom","center","disableDefaultUI","Marker","position","featureType","elementType","stylers","color","lightness","visibility","weight","ScrollHandler","time","waitThrottle","waitDebounce","lastScrollTopPosition","scrollDirectionDown","scrollDirectionUp","triggerOnInit","triggerThrottle","triggerSmooth","isset","triggerDebounce","triggerElementInViewportAnimation","detectScrollDirection","toggleStickyHeader","detectIfElementIsPartlyInViewport","el","rect","windowHeight","innerHeight","clientHeight","windowWidth","innerWidth","clientWidth","verticalInView","height","horizontalInView","left","width","detectIfElementIsFullyInViewport","bottom","scrollTopPosition","elements","elementsLength","element","classList","remove","stickyHeader","querySelector","subnavList","subNavIsVisible","hidden","getComputedStyle","add","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","_typeof","finale","thisArg","_unhandledRejectionFn","Handler","done","ex","prom","all","arr","slice","remaining","res","val","race","values","setImmediate","err","console","warn","globalNS","global","__WEBPACK_AMD_DEFINE_RESULT__","define","__WEBPACK_AMD_DEFINE_FACTORY__","__webpack_require__","Number","isInteger","isFinite","floor","scope","Function","Timeout","id","clearFn","_id","_clearFn","setInterval","clearInterval","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","YoutubeHandler","youtubeClass","players","youtubePlayers","youtubePlayersAmount","youtubePlayer","youtubeElement","link","autoPlay","parseInt","log","initYoutube","YT","Player","onYouTubePlayerAPIReady","loadPlayers","player","videoId","host","playerVars","modestbranding","rel","disablekb","autoplay","events","onStateChange","onReady","playerContainerId","target","getIframe","data","PlayerState","ENDED","playVideo","registerImmediate","html","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","doc","attachTo","Object","getPrototypeOf","toString","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","canUsePostMessage","MessageChannel","port1","port2","createElement","script","onreadystatechange","removeChild","appendChild","random","source","attachEvent","task","projectors","projectorContainers","projectorContainersLength","projectorId","projectorSetting","ProjectorSetting","sliderId","slideQuery","navigationButtons","dots","autoSlide","sliderInterval","Projector","prepareParameters","settingsObject","definedPreviousNext","captions","setProjectorId","string","setDefinedPreviousNext","boolean","setAutoSlide","setSliderInterval","integer","setSlideQuery","setNavigationButtons","setDots","setCaptions","getProjectorId","getDefinedPreviousNext","getAutoSlide","getSliderInterval","getSlideQuery","getNavigationButtons","getDots","getCaptions","fill","settingsObjectKeys","keys","settingsObjectLength","settings","sliderObject","activeSlideId","previousSlideId","nextSlideId","availableSlides","slides","autoSlideInterval","setPreviousAndNextSlide","setSlide","swipeGestures","Hammer","resetAutoSlide","nextSlide","previousSlide","navigationButtonsLength","clickNavigationButton","dotsLength","clickDot","slidesLength","slide","slideOrder","setActiveDot","setActiveCaption","navButton","next","previous","setAttribute","clickedDot","dot","dotOrder","captionsLength","caption","captionOrder","ErrorResponse","_classCallCheck","_message","_errors","json","is","jsonObject","JSON","parse","instance","message","errors","logErrors","error","hasOwnProperty","fieldName","isArray","Language","language_classCallCheck","_name","_displayName","_nativeName","_twoLetterIsoLanguageName","_threeLetterIsoLanguageName","displayName","nativeName","twoLetterIsoLanguageName","threeLetterIsoLanguageName","CountryLanguagesResponse","countryLanguagesResponse_classCallCheck","_languages","languageCount","languages","index","languageObject","language","countryLanguagesResponse_typeof","GlobalisationService","GlobalisationService_classCallCheck","_baseRoute","countryIso3","Ajax","post","xhr","isErrorResponse","response","isCountryLanguagesResponse","fromJsonString","countryLanguagesResponse","RegisterController","wrapper","globalisationService","RegisterController_classCallCheck","_wrapper","tagName","_countrySelect","_languageSelect","_languageSelectWrapper","_globalisationService","_hiddenClass","_domParser","DOMParser","_countryChanged","bind","controlListeners","enable","removeEventListener","getLanguagesForCountryWithIso3","_clearLanguageSelect","optionElement","_createHtmlElementFromString","errorResponse","children","firstChild","from","parseFromString","require","registerForm","obj","linear","t","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","async","scripts","getElementsByTagName","prior","onload","_","isAbort","readyState","test","src","parentNode","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","substring","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","contains","parentElement","url","XMLHttpRequest","token","content","open","setRequestHeader","send","stringify","postFormData","capitalizeFirstLetter","toUpperCase","snakeToCamel","m","indexInParent","childNodes","num","nodeType","copyToClipboard","navigator","userAgent","match","editable","contentEditable","readOnly","range","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","setSelectionRange","select","execCommand","bodyOffset","scrollLeft","pageXOffset","Sliders","sliderContainers","sliderContainersLength","Slidersetting","SliderSetting","sliderCurrent","sliderMeterVal","Slider","autoSlider","setSliderId","setAutoSlider","setSliderCurrent","setSliderMeterVal","getSliderId","getAutoSlider","getSliderCurrent","getSliderMeterVal","autoSliderInterval","resetAutoSlider","style","pointerEvents","meterVal","transform","innerHTML","BrowserHandler","browserInfo","getBrowserInfo","handleIE","handleSafari","msie","ielt11","ie11","tem","ua","M","exec","appName","appVersion","splice","ChocolateFactory","bannedVisitor","enter","chocolateFactories","amountOfChocolateFactories","ChocolateBar","_flashTicket","chocolateBar","goldenTicket","enjoyTheTour","chocolateFactory","tourGroup","oompaLoompas","amountOfOompaLoompas","tourGroupSize","visitor","visitorName","_isVisitorBanned","_getArrangement","_finishTour","nodeName","group","_addWillieWonka","HttpRequest","status","_thanksForVisiting","redirectUrl","_giveFeedbackToMembers","_unknownGapInFactory","_willie","feedbackArea","_clearPreviousMarkedJackets","forEach","jacket","visitorFeedbackArea","visitorNode","_grabVisitorJacket","visitorFeedback","visitorFeedbackAmount","visitorFeedbackLine","currentFeedbackArea","markedJackets","markedJacketsAmount","currentLayer","safetyBreak","nextStop","bodyScrollLock","OverlayMenuHandler","overlayMenuTriggerList","overlayMenuTriggerListCount","overlayMenuTrigger","initOverlayMenu","toggleOverlayMenu","overlayMenuNav","enableBodyScroll","elem","tabIndex","disableBodyScroll","toggle","CookieHandler","cookieBar","cookieOverlay","cookieMessage","cookieSwitch","cookieFadeOutAnimationDuration","acceptTracking","initCookieBar","initCookieOverlay","checkForCookieSettings","initCookieSwitch","closeButton","closeCookieMessage","openCookieSettingsButton","openCookieSettings","toggleTrackingInput","checked","toggleTrackingSetting","acceptButton","setCookieSettings","saveButton","reload","g"],"mappings":"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","file":"/js/app.js","sourcesContent":["// 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    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();","/* ==========================================================================\n    Google Maps handler\n    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map\n ========================================================================== */\n\nconst MapsHandler = {\n\n    maps: [],\n    key: '',\n\n    init: function () {\n\n        // Get map elements\n        const maps = document.querySelectorAll('.js-google-map');\n\n        // If there are map elements loop through them and draw the maps\n        if(maps.length !== 0 ) {\n\n            // Convert elements into object for callback when script as been loaded\n            for(let i = 0; i < maps.length; i++) {\n\n                // Get map from nodeList\n                const map = maps[i];\n\n                if(!map.hasAttribute('data-google-lat') || !map.hasAttribute('data-google-lng')) continue;\n\n                let lat = parseFloat(map.getAttribute('data-google-lat'));\n                let lng = parseFloat(map.getAttribute('data-google-lng'));\n\n                MapsHandler.maps.push({\n                    node: map,\n                    location: {\n                        lat: lat,\n                        lng: lng,\n                    },\n                    styles: MapsHandler.setCustomStyling()\n                });\n            }\n\n            // See if google variable exists\n            if (typeof(google) == 'undefined' || typeof(google.maps) == 'undefined') {\n                // Load external script with drawMaps callback\n                getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMaps);\n            } else {\n                // If already loaded draw maps\n                MapsHandler.drawMaps()\n            }\n        }\n    },\n\n    /**\n     * Draw the google maps\n     */\n    drawMaps: function () {\n\n        for (let i = 0; i < MapsHandler.maps.length; i++)  {\n\n            const map = MapsHandler.maps[i];\n\n            // Create a map\n            const googleMap = new google.maps.Map(map.node, {\n                zoom: 11,\n                center: map.location,\n                disableDefaultUI: true,\n                styles: map.styles\n            });\n\n            // Add a marker\n            const marker = new google.maps.Marker({\n                position: map.location,\n                map: googleMap\n            });\n        }\n    },\n\n    /**\n     * Set the custom styling for the Google Maps\n     *\n     * @returns {*[]}\n     */\n    setCustomStyling: function () {\n\n        return [\n                {\n                    \"featureType\": \"poi\",\n                    \"elementType\": \"labels.text.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#747474\"\n                        },\n                        {\n                            \"lightness\": \"23\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.attraction\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#f38eb0\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.government\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ced7db\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.medical\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffa5a8\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.park\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#c7e5c8\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.place_of_worship\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#d6cbc7\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.school\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#c4c9e8\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"poi.sports_complex\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#b1eaf1\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"lightness\": \"100\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road\",\n                    \"elementType\": \"labels\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"off\"\n                        },\n                        {\n                            \"lightness\": \"100\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.highway\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffd4a5\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.arterial\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#ffe9d2\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"all\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"simplified\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"geometry.fill\",\n                    \"stylers\": [\n                        {\n                            \"weight\": \"3.00\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"geometry.stroke\",\n                    \"stylers\": [\n                        {\n                            \"weight\": \"0.30\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"labels.text\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"on\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"labels.text.fill\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#747474\"\n                        },\n                        {\n                            \"lightness\": \"36\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"road.local\",\n                    \"elementType\": \"labels.text.stroke\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#e9e5dc\"\n                        },\n                        {\n                            \"lightness\": \"30\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"transit.line\",\n                    \"elementType\": \"geometry\",\n                    \"stylers\": [\n                        {\n                            \"visibility\": \"on\"\n                        },\n                        {\n                            \"lightness\": \"100\"\n                        }\n                    ]\n                },\n                {\n                    \"featureType\": \"water\",\n                    \"elementType\": \"all\",\n                    \"stylers\": [\n                        {\n                            \"color\": \"#d2e7f7\"\n                        }\n                    ]\n                }\n            ];\n    }\n};\n\nMapsHandler.init();","/* ==========================================================================\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();","(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};","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","/* ==========================================================================\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();","(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 * Created by Pascal on 06/12/17.\n * (Name changes by Rob on 18/03/18)\n */\n\n/* Example\n\nconst headerImageSliderSetting = new ProjectorSetting({\n    sliderProjectorId: 'header-image-slider',\n    slideQuery: '#header-image-slider .placeholder figure',\n    dots: '#header-image-slider .slider-navigation-labels .navigation span',\n    captions: '#header-image-slider .slider-navigation-labels .caption p',\n    autoSlide: true,\n    sliderInterval: 4000\n});\nheaderImageSliderSetting = headerImageSliderSetting.prepareParameters();\n\nconst headerImageSlider = new Projector(headerImageSliderSetting).init();\n\n */\n\nlet projectors = [];\n\nconst projectorContainers = document.querySelectorAll('.js-projector');\nconst projectorContainersLength = projectorContainers.length;\n\nfor(let i =0; i < projectorContainersLength; i++){\n\n    const projector = projectorContainers[i];\n    const projectorId = projector.getAttribute('id');\n\n    if(projectorId !== null){\n\n        const projectorSetting = new ProjectorSetting({\n            sliderId: projectorId,\n            slideQuery: '#' + projectorId +' .js-projector-slide',\n            navigationButtons: '#' + projectorId +' .js-projector-button' ,\n            dots: '#' + projectorId +' .js-projector-indicator' ,\n            autoSlide: true,\n            sliderInterval: 4000\n        });\n\n        projectors.push( new Projector(projectorSetting.prepareParameters()).init() );\n    }\n    else console.log('An image slider has no id...');\n}\n\n\nfunction ProjectorSetting(settingsObject) {\n\n    const self = this;\n\n    this.sliderId = '';\n    this.definedPreviousNext = true;\n    this.autoSlide = false;\n    this.sliderInterval = 4000;\n    this.navigationButtons = '';\n    this.dots = '';\n    this.captions = '';\n    this.slideQuery = '';\n\n    this.setProjectorId = function (string) {\n        this.sliderId = string;\n        return this;\n    };\n    this.setDefinedPreviousNext = function (boolean) {\n        this.definedPreviousNext = boolean;\n        return this;\n    };\n    this.setAutoSlide = function (boolean) {\n        this.autoSlide = 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.setCaptions = function (string) {\n        this.captions = string;\n        return this;\n    };\n    this.getProjectorId = function () {\n        return this.sliderId;\n    };\n    this.getDefinedPreviousNext = function () {\n        return this.definedPreviousNext;\n    };\n    this.getAutoSlide = function () {\n        return this.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    this.getCaptions = function () {\n        return this.captions;\n    };\n\n\n    // Invert setters to getters\n    this.prepareParameters = function () {\n\n        return {\n            sliderId: self.getProjectorId(),\n            definedPreviousNext: self.getDefinedPreviousNext(),\n            autoSlide: self.getAutoSlide(),\n            sliderInterval: self.getSliderInterval(),\n            navigationButtons: self.getNavigationButtons(),\n            dots: self.getDots(),\n            captions: self.getCaptions(),\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.setProjectorId,\n        definedPreviousNext: self.setDefinedPreviousNext,\n        autoSlide: self.setAutoSlide,\n        sliderInterval: self.setSliderInterval,\n        navigationButtons: self.setNavigationButtons,\n        dots: self.setDots,\n        captions: self.setCaptions,\n        slideQuery: self.setSlideQuery,\n        prepareParameters: self.prepareParameters\n    };\n}\n\nfunction Projector(settings) {\n\n    //Define Projector 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.autoSlideInterval = 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        //Define previous and next if we want to use those\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\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.resetAutoSlide();\n            self.nextSlide();\n            self.setSlide();\n        });\n        swipeGestures.on('swiperight', function () {\n            self.resetAutoSlide();\n            self.previousSlide();\n            self.setSlide();\n        });\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\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                // console.log('hier');\n                dot.addEventListener('click', function () {\n                    self.clickDot(this);\n                });\n            }\n\n        }\n\n        self.autoSlide();\n    };\n\n\n    this.autoSlide = function (){\n\n        if(this.autoSlideInterval !== null) clearInterval(this.autoSlideInterval);\n\n        if(this.settings.autoSlide && Number.isInteger(this.settings.sliderInterval) ){\n\n            this.autoSlideInterval = setInterval(function() {\n                    self.nextSlide();\n                    self.setSlide();\n                }, this.settings.sliderInterval\n            );\n        }\n    };\n\n    this.resetAutoSlide = self.autoSlide;\n\n\n    this.nextSlide = function () {\n        this.activeSlideId++;\n        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.previousSlide = function () {\n        this.activeSlideId--;\n        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.setPreviousAndNextSlide = function () {\n        this.nextSlideId = this.activeSlideId + 1;\n        if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;\n\n        this.previousSlideId = this.activeSlideId - 1;\n        if (this.previousSlideId < 0) this.previousSlideId = 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            // 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            // If we use the previous and next, also set those classes\n            if (self.settings.definedPreviousNext) {\n\n                if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');\n                else slide.classList.add('previous');\n\n                if (slideOrder !== self.nextSlideId) slide.classList.remove('next');\n                else slide.classList.add('next');\n            }\n        }\n\n        if (self.settings.dots !== '') { self.setActiveDot(); }\n        if (self.settings.captions !== '') { self.setActiveCaption(); }\n    };\n\n    this.clickNavigationButton = function (navButton) {\n        self.activeSlideId = parseInt(navButton.getAttribute('data-order'));\n        if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();\n        self.setSlide();\n\n        const next = document.querySelector(self.settings.navigationButtons + '.next');\n        const previous = document.querySelector(self.settings.navigationButtons + '.previous');\n\n        next.setAttribute('data-order', self.nextSlideId);\n        previous.setAttribute('data-order', self.previousSlideId);\n\n        self.resetAutoSlide();\n\n        // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;\n        // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;\n    };\n\n    this.clickDot = function (clickedDot) {\n        self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));\n        self.setSlide();\n        self.resetAutoSlide();\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) dot.classList.remove('is-active');\n            else dot.classList.add('is-active');\n        }\n    };\n\n    this.setActiveCaption = function () {\n\n        const captions = document.querySelectorAll(this.settings.captions);\n        const captionsLength = captions.length;\n        for(let i = 0; i < captionsLength; i++){\n            const caption = captions[i];\n            captionOrder = parseInt(caption.getAttribute('data-order'));\n\n            if(captionOrder !== self.activeSlideId) caption.classList.remove('is-active');\n            else caption.classList.add('is-active');\n        }\n    };\n}","/**\n * A laravel error response\n */\nclass ErrorResponse {\n    constructor()\n    {\n        this._message = '';\n        this._errors = {};\n    }\n\n    /**\n     * @param {string} json\n     * @return {ErrorResponse|null}\n     */\n    static fromJsonString(json) {\n        if(!this.is(json)) {\n            return null;\n        }\n        let jsonObject = JSON.parse(json);\n\n        let instance = new this;\n        instance._message = jsonObject.message;\n        instance._errors = jsonObject.errors;\n\n        return instance;\n    }\n\n    /**\n     * Checks that the given json string represents a ErrorResponse\n     *\n     * @param {string} json\n     * @param {boolean} logErrors\n     * @return {boolean}\n     */\n    static is(json, logErrors = true)\n    {\n        let jsonObject = null;\n        try {\n            jsonObject = JSON.parse(json);\n            if(!jsonObject) return false;\n        } catch (e) {\n            if(logErrors) console.error('ErrorResponse: The given json does not represent a valid ErrorResponse since the json string was not a valid json');\n            return false;\n        }\n\n        if(!jsonObject.hasOwnProperty('message') || typeof jsonObject.message !== 'string') {\n            if(logErrors) console.error('ErrorResponse: The response object must have an message property that is a string. Object:', jsonObject);\n            return false;\n        }\n\n        if(!jsonObject.hasOwnProperty('errors') || typeof jsonObject.errors !== 'object') {\n            if(logErrors) console.error('ErrorResponse: The response object must have an errors object that represents valid laravel field errors. Object:', jsonObject);\n            return false;\n        }\n\n        for(let fieldName in jsonObject.errors) {\n            if(jsonObject.errors.hasOwnProperty(fieldName) && !Array.isArray(jsonObject.errors[fieldName])) {\n                if(logErrors) console.error('ErrorResponse: The property \"'+fieldName+'\" in the errors array must have have array as value containing errors strings. Object:', jsonObject);\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Retrurns a comprehensive error message for all the fields.\n     *\n     * @return {string}\n     */\n    get message() {\n        return this._message;\n    }\n\n    /**\n     * @return {Object} returns an object where the property are field names. and the values are arrays containing errors for those field names.\n     */\n    get errors() {\n        return this._errors;\n    }\n}\n\nexport { ErrorResponse }","/**\n * Language.\n *\n * Represents a Language\n */\nclass Language {\n    constructor()\n    {\n        this._name = '';\n        this._displayName = '';\n        this._nativeName = '';\n        this._twoLetterIsoLanguageName = '';\n        this._threeLetterIsoLanguageName = '';\n    }\n\n    /**\n     * @param {string} json\n     * @return {Language|null}\n     */\n    static fromJsonString(json) {\n        if(!this.is(json)) {\n            return null;\n        }\n        let jsonObject = JSON.parse(json);\n\n        let instance = new this;\n        instance._name = jsonObject.name;\n        instance._displayName = jsonObject.displayName;\n        instance._nativeName = jsonObject.nativeName;\n        instance._twoLetterIsoLanguageName = jsonObject.twoLetterIsoLanguageName;\n        instance._threeLetterIsoLanguageName = jsonObject.threeLetterIsoLanguageName;\n\n        return instance;\n    }\n\n    /**\n     * Checks that the given json string represents a ErrorResponse\n     *\n     * @param {string|object} json\n     * @param {boolean} logErrors\n     * @return {boolean}\n     */\n    static is(json, logErrors = true)\n    {\n        let jsonObject = null;\n        \n        if(typeof json === 'string') {\n            try {\n                jsonObject = JSON.parse(json);\n                if (!jsonObject) return false;\n            } catch (e) {\n                console.error('Language: The given json does not represent a Language since the json string was not a valid json. Object: ', jsonObject, json);\n                return false;\n            }\n        } else {\n            jsonObject = json\n        }\n\n        if(!jsonObject.hasOwnProperty('name') || typeof jsonObject.displayName !== 'string') {\n            if(logErrors) console.error('Language: The language object must have a property called name that is a string. Object: ', jsonObject);\n            return false;\n        }\n        if(!jsonObject.hasOwnProperty('displayName') || typeof jsonObject.displayName !== 'string') {\n            if(logErrors) console.error('Language: The language object must have a property called displayName that is a string. Object: ', jsonObject);\n            return false;\n        }\n        if(!jsonObject.hasOwnProperty('nativeName') || typeof jsonObject.nativeName !== 'string') {\n            if(logErrors) console.error('Language: The language object must have a property called nativeName that is a string. Object: ', jsonObject);\n            return false;\n        }\n        if(!jsonObject.hasOwnProperty('twoLetterIsoLanguageName') || typeof jsonObject.twoLetterIsoLanguageName !== 'string') {\n            if(logErrors) console.error('Language: The language object must have a property called twoLetterIsoLanguageName that is a string. Object: ', jsonObject.twoLetterIsoLanguageName);\n            return false;\n        }\n        if(!jsonObject.hasOwnProperty('threeLetterIsoLanguageName') || typeof jsonObject.threeLetterIsoLanguageName !== 'string') {\n            if(logErrors) console.error('Language: The language object must have a property called threeLetterIsoLanguageName that is a string. Object: ', jsonObject);\n            return false;\n        }\n\n        return true;\n    }\n\n\n    /**\n     * @return {{valid: boolean, errors: Array}}\n     * @private\n     */\n    _toJson() {\n        return {\n            'name': this._name,\n            'displayName': this._displayName,\n            'nativeName': this._nativeName,\n            'twoLetterIsoLanguageName': this._twoLetterIsoLanguageName,\n            'threeLetterIsoLanguageName': this._threeLetterIsoLanguageName\n        }\n    }\n\n    get name() {\n        return this._name;\n    }\n\n    set name(value) {\n        this._name = value;\n    }\n\n    get displayName() {\n        return this._displayName;\n    }\n\n    set displayName(value) {\n        this._displayName = value;\n    }\n\n    get nativeName() {\n        return this._nativeName;\n    }\n\n    set nativeName(value) {\n        this._nativeName = value;\n    }\n\n    get twoLetterIsoLanguageName() {\n        return this._twoLetterIsoLanguageName;\n    }\n\n    set twoLetterIsoLanguageName(value) {\n        this._twoLetterIsoLanguageName = value;\n    }\n\n    get threeLetterIsoLanguageName() {\n        return this._threeLetterIsoLanguageName;\n    }\n\n    set threeLetterIsoLanguageName(value) {\n        this._threeLetterIsoLanguageName = value;\n    }\n}\n\nexport { Language }","/**\n * CountryLanguagesResponse.\n *\n * Represents a response that originates from\n */\nimport { Language } from \"./language\";\n\nclass CountryLanguagesResponse {\n    constructor()\n    {\n        this._languages = [];\n    }\n\n    /**\n     * @param {string} json\n     * @return {CountryLanguagesResponse|null}\n     */\n    static fromJsonString(json) {\n        if(!this.is(json)) {\n            return null;\n        }\n        let jsonObject = JSON.parse(json);\n\n        let instance = new this;\n        let languageCount = jsonObject.languages.length;\n        for(let index = 0; index < languageCount; index++)\n        {\n            let languageObject = jsonObject.languages[index];\n            let language = new Language();\n            language.name = languageObject.name;\n            language.displayName = languageObject.displayName;\n            language.nativeName = languageObject.nativeName;\n            language.twoLetterIsoLanguageName = languageObject.twoLetterIsoLanguageName;\n            language.threeLetterIsoLanguageName = languageObject.threeLetterIsoLanguageName;\n\n            instance._languages.push(language)\n        }\n\n        return instance;\n    }\n\n    /**\n     * Checks that the given json string represents a ErrorResponse\n     *\n     * @param {string} json\n     * @param {boolean} logErrors\n     * @return {boolean}\n     */\n    static is(json, logErrors = true)\n    {\n        let jsonObject = null;\n\n        if(typeof json === 'string') {\n            try {\n                jsonObject = JSON.parse(json);\n                if (!jsonObject) return false;\n            } catch (e) {\n                console.error('CountryLanguagesResponse: The given json does not represent a CountryLanguagesResponse since the json string was not a valid json. Object: ', jsonObject);\n                return false;\n            }\n        } else {\n            jsonObject = json\n        }\n\n        if(!jsonObject.hasOwnProperty('languages') || !Array.isArray(jsonObject.languages)) {\n            console.log('CountryLanguagesResponse: The given json must have a property called languages that is an Array, But did not have. Object: ', jsonObject);\n            return false;\n        }\n\n        let languageCount = jsonObject.languages.length;\n        for(let index = 0; index < languageCount; index++)\n        {\n            let languageObject = jsonObject.languages[index];\n            if(typeof languageObject !== 'object' || typeof languageObject === 'function' || !Language.is(languageObject)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n\n    /**\n     * @return {{valid: boolean, errors: Array}}\n     * @private\n     */\n    _toJson() {\n        return {\n            'languages': this._languages\n        }\n    }\n\n    /**\n     * @return {Language[]}\n     */\n    get languages() {\n        return this._languages;\n    }\n}\n\nexport { CountryLanguagesResponse }","import { ErrorResponse } from \"../global/models/errorResponse\";\nimport { CountryLanguagesResponse } from \"../global/models/countryLanguagesResponse\";\n\nclass GlobalisationService\n{\n    constructor()\n    {\n        this._baseRoute = '/';\n    }\n\n    /**\n     * Adds a product to the shopping cart\n     *\n     * @param {string} countryIso3\n     */\n    getLanguagesForCountryWithIso3(countryIso3) {\n        let self = this;\n\n        return new Promise(function(resolve, reject) {\n            Ajax.post(\n                self._baseRoute+'getLanguagesForCountryWithIso3',\n                { countryIso3: countryIso3 },\n                function(xhr) {\n                    // let response = JSON.parse(xhr.response);\n                    let isErrorResponse = ErrorResponse.is(xhr.response, false);\n                    let isCountryLanguagesResponse = CountryLanguagesResponse.is(xhr.response, false);\n\n                    if(!isErrorResponse) {\n                        if(isCountryLanguagesResponse) {\n                            let countryLanguagesResponse = CountryLanguagesResponse.fromJsonString(xhr.response);\n                            resolve(countryLanguagesResponse);\n                        }\n                        else {\n                            console.error('RegisterService:getLanguagesForCountryWithIso3 The response was not a valid CountryLanguagesResponse: '+xhr.response);\n                            reject();\n                        }\n                    } else {\n                        let response = ErrorResponse.fromJsonString(xhr.response);\n                        reject(response);\n                    }\n                }\n            );\n        });\n    };\n}\n\nexport { GlobalisationService }","class RegisterController {\n    /**\n     * @param {HTMLDivElement} wrapper\n     * @param {GlobalisationService} globalisationService\n     */\n    constructor(wrapper, globalisationService) {\n        this._wrapper = wrapper;\n        if(!this._wrapper || this._wrapper.tagName !== \"FORM\")\n        {\n            console.error('RegisterController: The Register form must be a div element but was not or wasn\\'t even specified.');\n            return;\n        }\n\n        this._countrySelect = this._wrapper.querySelector('select[name=\"country\"]');\n        if(!this._countrySelect) {\n            console.error('RegisterController: The Register form must have a select element with name \"country\" but did not have it.');\n            return;\n        }\n\n        this._languageSelect = this._wrapper.querySelector('select[name=\"language\"]');\n        if(!this._countrySelect) {\n            console.error('RegisterController: The Register form must have a select element with name \"language\" but did not have it.');\n            return;\n        }\n\n        this._languageSelectWrapper = this._wrapper.querySelector('.js-language-wrapper');\n        if(!this._languageSelectWrapper || this._languageSelectWrapper.tagName !== \"DIV\") {\n            console.error('RegisterController: The Register form must have a wrapper DIV element with class \"js-language-wrapper\" but did not have it.');\n            return;\n        }\n\n\n        this._globalisationService = globalisationService;\n        if(!globalisationService) {\n            console.error('RegisterController: The Register form was expected to get an instance of RegisterService, but did not get one.');\n            return;\n        }\n\n        this._hiddenClass = 'u-hidden'; //The name of a class that can be applied to things to hide them.\n\n        this._domParser = new DOMParser();\n\n        this._countryChanged = this._countryChanged.bind(this);\n        this.controlListeners(true);\n\n        this._countryChanged();\n    }\n\n    controlListeners(enable = true) {\n        this._countrySelect.removeEventListener('change', this._countryChanged);\n\n        if(enable) {\n            this._countrySelect.addEventListener('change', this._countryChanged);\n        }\n    }\n\n    /**\n     * @private\n     */\n    _countryChanged() {\n        let countryIso3 = this._countrySelect.value;\n        let self = this;\n\n        this._globalisationService.getLanguagesForCountryWithIso3(countryIso3).then(\n            /** @param { CountryLanguagesResponse } countryLanguagesResponse **/\n            function(countryLanguagesResponse) {\n                self._clearLanguageSelect();\n                let languageCount = countryLanguagesResponse.languages.length;\n                for(let index = 0; index < languageCount; index++)\n                {\n                    let language = countryLanguagesResponse.languages[index];\n                    let optionElement = self._createHtmlElementFromString('<option value=\"'+language.threeLetterIsoLanguageName+'\">'+language.nativeName+'</option>');\n                    self._languageSelect.appendChild(optionElement);\n                }\n\n                if(languageCount <= 1) {\n                    self._languageSelectWrapper.classList.add(self._hiddenClass);\n                } else {\n                    self._languageSelectWrapper.classList.remove(self._hiddenClass);\n                }\n            }\n        ).catch(\n            /** @param { ErrorResponse } errorResponse **/\n            function(errorResponse) {\n                console.error(errorResponse);\n            }\n        )\n    }\n\n    /**\n     * @private\n     */\n    _clearLanguageSelect()\n    {\n        while(this._languageSelect.children.length) {\n            this._languageSelect.removeChild(this._languageSelect.firstChild);\n        }\n    }\n\n    /**\n     * @private\n     * @param {string} from\n     * @return {HTMLElement}\n     */\n    _createHtmlElementFromString(from)\n    {\n        let document = this._domParser.parseFromString(from, 'text/html');\n        return document.body.firstChild;\n    }\n}\n\nexport { RegisterController }","/** ==========================================================================\n *  Import ES6 Modules (https://webpack.js.org/api/module-methods/)\n *  =========================================================================*/\nimport { GlobalisationService } from \"./components/GlobalisationService\";\nimport { RegisterController } from \"./components/RegisterController\";\n\nimport { ValidationService } from \"./components/validationService\";\nimport { ErrorController } from \"./components/errorController\";\n\n/** ==========================================================================\n *  Dependencies\n *  =========================================================================*/\n\n/**\n * External\n */\nrequire('hammerjs');\nrequire('objectFitPolyfill');\n\n/** ==========================================================================\n *  Global functionalities\n *  =========================================================================*/\n\nrequire('./global/polyfills/eventPolyFill');\nrequire('./global/polyfills/isInteger');\nrequire('./global/polyfills/promise');\nrequire('./global/helpers'); // Should be first\nrequire('./global/browserHandler');\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/heroSliderHandler');\nrequire('./components/mapsHandler');\nrequire('./components/overlayMenuHandler');\nrequire('./components/projectorHandler');\nrequire('./components/scrollToHandler');\n// require('./components/searchHandler');\n// require('./components/shareButtonsHandler');\nrequire('./components/youtubeHandler');\n\nlet registerForm = document.getElementById('registerForm');\nif(registerForm) new RegisterController(registerForm, new GlobalisationService());\n\n","/* ==========================================================================\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    postFormData: 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('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(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};","\n/* Example\n\nconst headerImageSliderSetting = new SliderProjectorSetting({\n    sliderProjectorId: 'header-image-slider',\n    slideQuery: '#header-image-slider .placeholder figure',\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            sliderCurrent: '#' + sliderId +' .js-slider-current-index',\n            sliderMeterVal: '#' + sliderId +' .js-slider-meter-value',\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.definedPreviousNext = true;\n    this.autoSlider = true;\n    this.sliderInterval = 4000;\n    this.navigationButtons = '';\n    this.sliderCurrent = '';\n    this.sliderMeterVal = '';\n    this.slideQuery = '';\n\n    this.setSliderId = function (string) {\n        this.sliderId = string;\n        return this;\n    };\n    this.setDefinedPreviousNext = function (boolean) {\n        this.definedPreviousNext = boolean;\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.setSliderCurrent = function (string) {\n        this.sliderCurrent = string;\n        return this;\n    };\n    this.setSliderMeterVal = function (string) {\n        this.sliderCurrent = string;\n        return this;\n    };\n    this.getSliderId = function () {\n        return this.sliderId;\n    };\n    this.getDefinedPreviousNext = function () {\n        return this.definedPreviousNext;\n    };\n    this.getAutoSlider = function () {\n        return this.autoSlider;\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.getSliderCurrent = function () {\n        return this.sliderCurrent;\n    };\n    this.getSliderMeterVal = function () {\n        return this.sliderMeterVal;\n    };\n\n    // Invert setters to getters\n    this.prepareParameters = function () {\n\n        return {\n            sliderId: self.getSliderId(),\n            definedPreviousNext: self.getDefinedPreviousNext(),\n            autoSlider: self.getAutoSlider(),\n            sliderInterval: self.getSliderInterval(),\n            navigationButtons: self.getNavigationButtons(),\n            sliderCurrent: self.getSliderCurrent(),\n            sliderMeterVal: self.getSliderMeterVal(),\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        definedPreviousNext: self.setDefinedPreviousNext,\n        autoSlider: self.setAutoSlider,\n        sliderInterval: self.setSliderInterval,\n        navigationButtons: self.setNavigationButtons,\n        sliderCurrent: self.setSliderCurrent,\n        sliderMeterVal: self.setSliderMeterVal,\n        slideQuery: self.setSlideQuery,\n        prepareParameters: self.prepareParameters\n    };\n}\n\nfunction Slider(settings) {\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.sliderCurrent = document.querySelectorAll(this.settings.sliderCurrent);\n        this.sliderMeterVal = document.querySelectorAll(this.settings.sliderMeterVal);\n        this.availableSlides = this.slides.length;\n        this.activeSlideId = 0;\n\n        //Define previous and next if we want to use those\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\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\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\n        self.autoSlider();\n    };\n\n\n    this.autoSlider = function (){\n\n        if(this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);\n\n        if(this.settings.autoSlider && 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\n    this.nextSlide = function () {\n        this.activeSlideId++;\n        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.previousSlide = function () {\n        this.activeSlideId--;\n        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.setPreviousAndNextSlide = function () {\n        this.nextSlideId = this.activeSlideId + 1;\n        if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;\n\n        this.previousSlideId = this.activeSlideId - 1;\n        if (this.previousSlideId < 0) this.previousSlideId = 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            // If we use the previous and next, also set those classes\n            if (self.settings.definedPreviousNext) {\n\n                if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');\n                else slide.classList.add('previous');\n\n                if (slideOrder !== self.nextSlideId) slide.classList.remove('next');\n                else slide.classList.add('next');\n            }\n        }\n\n        // Update meter value\n        let meterVal = (this.activeSlideId + 1) / this.availableSlides;\n        document.querySelector(self.settings.sliderMeterVal).style.transform = `scaleX(${meterVal})`;\n\n        // Update current index\n        document.querySelector(self.settings.sliderCurrent).innerHTML = this.activeSlideId + 1;\n\n    };\n\n    this.clickNavigationButton = function (navButton) {\n        self.activeSlideId = parseInt(navButton.getAttribute('data-order'));\n        if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();\n        self.setSlide();\n\n        // Next & previous\n        const next = document.querySelector(self.settings.navigationButtons + '.next');\n        const previous = document.querySelector(self.settings.navigationButtons + '.previous');\n\n        next.setAttribute('data-order', self.nextSlideId);\n        previous.setAttribute('data-order', self.previousSlideId);\n\n        self.resetAutoSlider();\n\n        // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;\n        // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;\n    };\n}","/* ==========================================================================\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 | 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-element-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                // 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))\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)){\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-element')) 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   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   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        }\n        else {\n            CookieHandler.cookieMessage.classList.remove('is-accepted');\n            document.body.classList.add('is-cookie-bar-visible');\n        }\n    },\n\n    closeCookieMessage: function (){\n        Cookie.set('cookieMessage', true, 90);\n        CookieHandler.cookieMessage.classList.add('is-transitioning-out');\n        document.body.classList.remove('is-cookie-bar-visible');\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();","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"],"sourceRoot":""}