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":""}