HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/blijegasten/blijegasten.be/wwwroot/js/site/app.js.map
{"version":3,"sources":["webpack:///./resources/js/site/components/headerHoverHandler.js","webpack:///./resources/js/site/global/scrollHandler.js","webpack:///./node_modules/process/browser.js","webpack:///./resources/js/global/models/checkoutInformationResponse.js","webpack:///./resources/js/site/components/toggleHandler.js","webpack:///./resources/js/global/polyfills/remove.js","webpack:///./resources/js/site/components/overlayMenuHandler.js","webpack:///./resources/js/site/components/youtubeHandler.js","webpack:///./resources/js/site/components/searchHandler.js","webpack:///./resources/js/shop/components/shoppingcartService.js","webpack:///./resources/js/site/components/scrollToHandler.js","webpack:///./resources/js/global/polyfills/promise.js","webpack:///./resources/js/global/polyfills/isInteger.js","webpack:///./resources/js/site/components/modalHandler.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./resources/js/site/components/datePickerHandler.js","webpack:///./resources/js/site/components/mapsHandler.js","webpack:///./resources/js/global/models/errorResponse.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///./node_modules/@babel/runtime/regenerator/index.js","webpack:///./resources/js/site/components/chocolateFactory.js","webpack:///./resources/js/site/components/projectorHandler.js","webpack:///./resources/js/shop/components/checkoutController.js","webpack:///./resources/js/shop/components/shoppingcartController.js","webpack:///./resources/js/shop/components/productController.js","webpack:///./resources/js/site/app.js","webpack:///./resources/js/site/global/browserHandler.js","webpack:///./resources/js/site/global/helpers.js","webpack:///(webpack)/buildin/global.js","webpack:///./resources/js/site/components/cookieHandler.js"],"names":["HeaderHoverHandler","header","document","querySelector","timeout","delay","init","headerHoverTrigger","isset","initHeaderHover","addEventListener","setHeaderHover","unsetHeaderHover","event","clearTimeout","setTimeout","classList","add","remove","ScrollHandler","time","Date","now","waitThrottle","waitDebounce","lastScrollTopPosition","scrollDirectionDown","scrollDirectionUp","triggerOnInit","window","triggerThrottle","triggerSmooth","triggerDebounce","triggerElementInViewportAnimation","detectScrollDirection","toggleStickyHeader","detectIfElementIsPartlyInViewport","el","rect","getBoundingClientRect","windowHeight","innerHeight","documentElement","clientHeight","windowWidth","innerWidth","clientWidth","verticalInView","top","height","horizontalInView","left","width","detectIfElementIsFullyInViewport","bottom","scrollTopPosition","pageYOffset","scrollTop","elements","querySelectorAll","elementsLength","length","e","element","stickyHeader","subnavList","subNavIsVisible","hidden","i","getComputedStyle","visibility","body","cachedSetTimeout","cachedClearTimeout","process","module","exports","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","call","this","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","len","run","marker","runClearTimeout","Item","array","noop","nextTick","args","Array","arguments","push","prototype","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","CheckoutInformationResponse","_totalExVatAndDiscounts","_totalExVatAndDiscountsFormatted","_totalExVat","_totalExVatFormatted","_vatTotal","_vatTotalFormatted","_shippingCosts","_shippingCostsFormatted","_total","_totalFormatted","_vatPercentage","_couponCodes","json","is","jsonObject","JSON","parse","instance","totalExVatAndDiscounts","totalExVatAndDiscountsFormatted","totalExVat","totalExVatFormatted","vatTotal","vatTotalFormatted","shippingCosts","shippingCostsFormatted","total","totalFormatted","vatPercentage","couponCodes","logErrors","console","error","hasOwnProperty","isArray","ToggleHandler","toggleClass","toggleSwitchClass","toggleContentClass","toggleList","toggleListCount","toggle","initToggle","toggleItem","j","children","style","pointerEvents","activateToggle","item","target","parentNode","contains","preventDefault","Element","CharacterData","DocumentType","forEach","Object","defineProperty","configurable","enumerable","writable","value","removeChild","bodyScrollLock","require","OverlayMenuHandler","overlayMenuTriggerList","overlayMenuTriggerListCount","overlayMenuTrigger","initOverlayMenu","toggleOverlayMenu","overlayMenuNav","enableBodyScroll","elem","tabIndex","disableBodyScroll","YoutubeHandler","youtubeClass","players","youtubePlayers","youtubePlayersAmount","youtubePlayer","getAttribute","youtubeElement","id","link","autoPlay","parseInt","log","initYoutube","YT","Player","onYouTubePlayerAPIReady","loadPlayers","getScript","player","videoId","host","playerVars","modestbranding","rel","disablekb","autoplay","events","onStateChange","onReady","playerContainerId","getIframe","data","PlayerState","ENDED","playVideo","SearchHandler","form","apiRoute","searchField","resultsArea","lastSearchValue","searchbar","dataset","typeEvent","debounce","searchEvent","searchValue","showNoResultMessage","a","search","searchResultCategories","resultHtml","keys","key","result","route","typeName","innerHTML","query","Promise","resolve","reject","Ajax","post","xhr","status","response","term","noResultHref","action","noResult","processSearchResponse","validateSearchResponse","resultHolder","firstChild","items","index","type","attributes","translation","appendChild","createElement","setAttribute","innerText","ShoppingcartService","input","quantity","quantityStep","step","quantityCap","max","isNaN","validatedQuantity","validateOrRoundUpQuantityToStep","amount","shoppingCartButtons","getElementsByClassName","sb","redirect","self","productableId","itemType","location","shoppingCartButton","shoppingCartAmount","hasAttribute","updateShoppingCartCounters","itemId","postal","country","ErrorResponse","fromJsonString","get","ScrollToHandler","offset","duration","start","change","currentTime","allowAnimation","scrollToAnimation","easing","anchorLinks","anchorLinksAmount","prepareScrollTo","elementId","substr","indexOf","scrollToElementPosition","getElementById","Math","startTime","performance","getTime","requestAnimationFrame","animateScroll","abortScrollAnimation","timestamp","progress","min","EasingFunctions","newScrollTop","cancelAnimationFrame","factory","finallyConstructor","callback","constructor","then","reason","setTimeoutFunc","fn","TypeError","_state","_handled","_value","undefined","_deferreds","doResolve","handle","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","thisArg","_unhandledRejectionFn","Handler","done","ex","prom","all","arr","slice","remaining","res","val","race","values","setImmediate","err","warn","globalNS","global","define","Number","isInteger","isFinite","floor","ModalHandler","modal","hasFixedPrice","hasRequiredAge","shoppingCartService","productButtons","productButtonsLength","p","productButton","removeEventListener","openModalFromProductEvent","modalCloseElements","modalCloseElementLength","c","modalCloseElement","closeModalEvent","modalAddProductToShoppingCartButton","addToShoppingCartEvent","currentTarget","productId","productType","productName","productPrice","productImage","productStep","populateModal","openModal","modalProductId","modalProductType","modalHeading","modalPrice","modalImage","modalQuantity","modalStackLine","modalStackLineAmount","src","productStepInt","setModalAreas","handleKeyPressed","modalQuantityChanged","showContinue","modalContinueChoices","modalAddToCart","closeModal","submitModalEvent","submitModal","addToShoppingCart","quantityInput","validateProductQuantityInput","_addProductToShoppingcart","Function","Timeout","clearFn","_id","_clearFn","scope","setInterval","clearInterval","close","unref","ref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","registerImmediate","html","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","doc","attachTo","getPrototypeOf","toString","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","canUsePostMessage","MessageChannel","port1","port2","script","onreadystatechange","random","source","attachEvent","task","flatpickr","localize","Dutch","today","setHours","defaultConfig","dateFormat","defaultDate","nextArrow","prevArrow","disableMobile","datePickerElements","datePickerElement","selectedDate","minDate","DatePickerHandler","MapsHandler","maps","map","lat","parseFloat","lng","node","styles","setCustomStyling","google","drawMaps","googleMap","Map","zoom","center","disableDefaultUI","Marker","position","_message","_errors","message","errors","fieldName","runtime","Op","hasOwn","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","method","arg","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","obj","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","invoke","__await","unwrapped","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","object","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","ChocolateFactory","bannedVisitor","enter","chocolateFactories","amountOfChocolateFactories","ChocolateBar","_flashTicket","chocolateBar","goldenTicket","enjoyTheTour","chocolateFactory","tourGroup","oompaLoompas","amountOfOompaLoompas","tourGroupSize","visitor","visitorName","_isVisitorBanned","_getArrangement","_finishTour","nodeName","group","_addWillieWonka","HttpRequest","_thanksForVisiting","redirectUrl","_giveFeedbackToMembers","_unknownGapInFactory","_willie","feedbackArea","_clearPreviousMarkedJackets","jacket","visitorFeedbackArea","visitorNode","_grabVisitorJacket","visitorFeedback","visitorFeedbackAmount","visitorFeedbackLine","currentFeedbackArea","capitalizeFirstLetter","markedJackets","markedJacketsAmount","currentLayer","safetyBreak","tagName","nextStop","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","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","previous","clickedDot","dot","dotOrder","captionsLength","caption","captionOrder","CheckoutController","_checkoutForm","differentShippingAddressCheckbox","orderAsRadioButtons","toggleShippingAddressFields","checked","triggerToggleShippingAddress","bind","triggerChangeOrderAs","controlListeners","enabled","orderAsRadioButtonsLength","orderAsRadioButton","changeOrderAs","shippingFieldsArea","changedRadioButton","orderType","companyFields","ShoppingcartController","shoppingcartService","shoppingCartElement","_addToShoppingcartButtons","_removeFromShoppingcartButtons","changeQuantityShoppingcartInputs","addProduct","invoicePostalElement","invoiceCountryElement","_shoppingcartService","addProductButtonClicked","removeProductButtonClicked","quantityInputChanged","getShippingCosts","toggleShippingBox","enable","addToShoppingcartButtonsLength","removeFromShoppingcartButtonsLength","changeQuantityShoppingcartInputsLength","product","addProductButton","productQuantityInput","button","productQuantity","removeButton","shoppingcartItemId","shoppingCartItem","parentElement","_removeItemFromShoppingcart","updateShoppingCartAmounts","_setItemQuantityInShoppingcart","zipValue","replace","toUpperCase","getShippingCost","postalResponse","receiptTotalElement","shoppingCartSubmit","foundLocationElement","foundLocationSuccessLabel","foundLocationErrorLabel","foundLocationCity","messageElement","price","region_name","zipcode","number_format","setShippingCostToFree","currentDeliveryType","deliveryLocationToggles","deliveryLocationToggle","setDeliveryLocation","deliveryType","deliveryLocation","setToFreeShippingCosts","targetedElement","blur","getCurrentShoppingCart","shoppingCartInfo","shoppingCartProductTotal","shoppingCartReceiptSubtotal","shoppingCartShippingCostCurrency","shoppingCartShippingCost","shoppingCartTotal","shoppingCartVat","shoppingCartDeposit","shoppingCartToPay","itemCount","reload","formated","productTotal","cartTotal","vat","deposit","totalIncludingDeposit","shipping_undefined","shippingCost","useShipping","formatted","ProductController","productPageModel","addProductEvent","productQuantityInputChanged","BrowserHandler","userAgent","browserInfo","navigator","getBrowserInfo","handleIE","handleSafari","msie","ielt11","ie11","match","substring","getElementsByTagName","tem","ua","M","test","exec","appName","appVersion","splice","linear","t","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","scripts","prior","onload","_","isAbort","readyState","insertBefore","func","wait","immediate","later","callNow","Cookie","set","days","domain","domainParts","date","expires","setTime","toGMTString","split","cookie","shift","join","nameEQ","ca","erase","number","decimals","dec_point","thousands_sep","n","prec","abs","sep","dec","s","k","pow","round","toFixedFix","closest","matches","msMatchesSelector","webkitMatchesSelector","ancestor","url","XMLHttpRequest","token","content","open","setRequestHeader","send","stringify","postFormData","snakeToCamel","m","indexInParent","childNodes","num","nodeType","copyToClipboard","editable","contentEditable","readOnly","range","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","setSelectionRange","select","execCommand","bodyOffset","scrollLeft","pageXOffset","g","CookieHandler","cookieBar","cookieOverlay","cookieMessage","cookieSwitch","cookieFadeOutAnimationDuration","acceptTracking","initCookieBar","initCookieOverlay","checkForCookieSettings","initCookieSwitch","closeButton","closeCookieMessage","openCookieSettingsButton","openCookieSettings","toggleTrackingInput","toggleTrackingSetting","acceptButton","setCookieSettings","saveButton"],"mappings":"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SAAUf,EAAI9M,SACd8M,IAAKS,MAUjBH,iBAAkB,WAEd,MAAO,CACC,CACI,YAAe,MACf,YAAe,mBACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,UAAa,QAIzB,CACI,YAAe,iBACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,iBACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,cACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,WACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,uBACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,aACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,qBACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,OACf,YAAe,WACf,QAAW,CACP,CACI,UAAa,SAIzB,CACI,YAAe,OACf,YAAe,SACf,QAAW,CACP,CACI,WAAc,OAElB,CACI,UAAa,SAIzB,CACI,YAAe,eACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,gBACf,YAAe,gBACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,aACf,YAAe,MACf,QAAW,CACP,CACI,WAAc,gBAI1B,CACI,YAAe,aACf,YAAe,gBACf,QAAW,CACP,CACI,OAAU,UAItB,CACI,YAAe,aACf,YAAe,kBACf,QAAW,CACP,CACI,OAAU,UAItB,CACI,YAAe,aACf,YAAe,cACf,QAAW,CACP,CACI,WAAc,QAI1B,CACI,YAAe,aACf,YAAe,mBACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,UAAa,QAIzB,CACI,YAAe,aACf,YAAe,qBACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,UAAa,QAIzB,CACI,YAAe,eACf,YAAe,WACf,QAAW,CACP,CACI,WAAc,MAElB,CACI,UAAa,SAIzB,CACI,YAAe,QACf,YAAe,MACf,QAAW,CACP,CACI,MAAS,gBAQrCR,EAAY3f,Q,mdCvRNuT,E,WACF,c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","file":"/js/site/app.js","sourcesContent":["/* ==========================================================================\n   Navigation handler\n   - Handles the showing and hiding of the overlay-menu component which has the proper classes.\n ========================================================================== */\n\nconst HeaderHoverHandler = {\n    header: document.querySelector('.js-header'),\n    timeout: null,\n    delay: 150,\n\n    init: function () {\n        const headerHoverTrigger = document.querySelector('.js-header-hover');\n\n        if(isset(headerHoverTrigger)){\n            HeaderHoverHandler.initHeaderHover(headerHoverTrigger);\n        }\n    },\n\n    initHeaderHover: function (headerHoverTrigger) {\n        headerHoverTrigger.addEventListener('mouseenter', HeaderHoverHandler.setHeaderHover, false);\n        headerHoverTrigger.addEventListener('mouseleave', HeaderHoverHandler.unsetHeaderHover, false);\n    },\n\n    setHeaderHover: function (event) {\n        if(HeaderHoverHandler.timeout) {\n            clearTimeout(HeaderHoverHandler.timeout);\n        }\n        HeaderHoverHandler.timeout = setTimeout(function () {\n            HeaderHoverHandler.header.classList.add('is-header-light');\n            HeaderHoverHandler.timeout = null;\n        }, HeaderHoverHandler.delay);\n\n    },\n\n    unsetHeaderHover: function (event) {\n        if(HeaderHoverHandler.timeout) {\n            clearTimeout(HeaderHoverHandler.timeout);\n            HeaderHoverHandler.timeout = null;\n        } else {\n            HeaderHoverHandler.header.classList.remove('is-header-light');\n        }\n\n    },\n};\n\nHeaderHoverHandler.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        if(stickyHeader) stickyHeader.hidden = false;\n\n        for (let i = 0; i < subnavList.length; i++) {\n            if (window.getComputedStyle(subnavList[i], null).visibility == \"visible\") {\n                return subNavIsVisible = true;\n            }\n        }\n\n        if(isset(stickyHeader) && !subNavIsVisible){\n            // Hide when scrolling DOWN (OR within offset)\n            if(ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110){\n                document.body.classList.remove(visibleStickyHeaderClass);\n            }\n            // Show when scrolling UP and outside of offset\n            else {\n                document.body.classList.add(visibleStickyHeaderClass);\n            }\n        }\n    },\n\n};\n\nScrollHandler.init();","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","class CheckoutInformationResponse {\n    constructor() {\n        this._totalExVatAndDiscounts = 0;\n        this._totalExVatAndDiscountsFormatted = '';\n        this._totalExVat = 0;\n        this._totalExVatFormatted = '';\n        this._vatTotal = 0;\n        this._vatTotalFormatted = '';\n        this._shippingCosts = 0;\n        this._shippingCostsFormatted = '';\n        this._total = 0;\n        this._totalFormatted = '';\n        this._vatPercentage = 0;\n        this._couponCodes = [];\n    }\n\n    /**\n     * @param {string} json\n     * @return {CheckoutInformationResponse|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._totalExVatAndDiscounts = jsonObject.totalExVatAndDiscounts;\n        instance._totalExVatAndDiscountsFormatted = jsonObject.totalExVatAndDiscountsFormatted;\n        instance._totalExVat = jsonObject.totalExVat;\n        instance._totalExVatFormatted = jsonObject.totalExVatFormatted;\n        instance._vatTotal = jsonObject.vatTotal;\n        instance._vatTotalFormatted = jsonObject.vatTotalFormatted;\n        instance._shippingCosts = jsonObject.shippingCosts;\n        instance._shippingCostsFormatted = jsonObject.shippingCostsFormatted;\n        instance._total = jsonObject.total;\n        instance._totalFormatted = jsonObject.totalFormatted;\n        instance._vatPercentage = jsonObject.vatPercentage;\n        instance._couponCodes = jsonObject.couponCodes;\n\n        return instance;\n    }\n\n    /**\n     * Checks that the given json string represents a CheckoutInformationResponse\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('CheckoutInformationResponse: The given json does not represent a valid CheckoutInformationResponse since the json string was not a valid json');\n            return false;\n        }\n\n        if(!jsonObject.hasOwnProperty('totalExVatFormatted') || typeof jsonObject.totalExVatFormatted !== 'string') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatFormatted property that is a string. Object: ', jsonObject);\n            return false;\n        }\n        if(!jsonObject.hasOwnProperty('totalExVatAndDiscountsFormatted') || typeof jsonObject.totalExVatAndDiscountsFormatted !== 'string') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscountsFormatted property that is a string. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('vatTotalFormatted') || typeof jsonObject.vatTotalFormatted !== 'string') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotalFormatted property that is a string. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('shippingCostsFormatted') || typeof jsonObject.shippingCostsFormatted !== 'string') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCostsFormatted property that is a string. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('totalFormatted') || typeof jsonObject.totalFormatted !== 'string') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a totalFormatted property that is a string. Object: ', jsonObject);\n            return false;\n\n        }\n\n        if(!jsonObject.hasOwnProperty('totalExVatAndDiscounts') || typeof jsonObject.totalExVatAndDiscounts !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscounts property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('totalExVat') || typeof jsonObject.totalExVat !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVat property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('vatTotal') || typeof jsonObject.vatTotal !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotal property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('shippingCosts') || typeof jsonObject.shippingCosts !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCosts property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('total') || typeof jsonObject.total !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a total property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('vatPercentage') || typeof jsonObject.vatPercentage !== 'number') {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a vatPercentage property that is a number. Object: ', jsonObject);\n            return false;\n\n        }\n        if(!jsonObject.hasOwnProperty('couponCodes') || !Array.isArray(jsonObject.couponCodes)) {\n            if(logErrors) console.error('CheckoutInformationResponse: The response object must have a couponCodes property that is an array. Object: ', jsonObject);\n            return false;\n\n        }\n\n        return true;\n    }\n\n\n    get totalExVatAndDiscounts() {\n        return this._totalExVatAndDiscounts;\n    }\n\n    get totalExVatAndDiscountsFormatted() {\n        return this._totalExVatAndDiscountsFormatted;\n    }\n\n    get totalExVat() {\n        return this._totalExVat;\n    }\n\n    get totalExVatFormatted() {\n        return this._totalExVatFormatted;\n    }\n\n    get vatTotal() {\n        return this._vatTotal;\n    }\n\n    get vatTotalFormatted() {\n        return this._vatTotalFormatted;\n    }\n\n    get shippingCosts() {\n        return this._shippingCosts;\n    }\n\n    get shippingCostsFormatted() {\n        return this._shippingCostsFormatted;\n    }\n\n    get total() {\n        return this._total;\n    }\n\n    get totalFormatted() {\n        return this._totalFormatted;\n    }\n\n    get vatPercentage() {\n        return this._vatPercentage;\n    }\n\n    get couponCodes() {\n        return this._couponCodes;\n    }\n}\n\nexport { CheckoutInformationResponse }","/* ==========================================================================\n   Accordion handler\n   - Handles the accordion component which has the proper classes.\n ========================================================================== */\n\nconst ToggleHandler = {\n\n    toggleClass : 'js-toggle',\n    toggleSwitchClass : 'js-toggle-switch',\n    toggleContentClass : 'js-toggle-content',\n\n\n    init: function () {\n\n        const toggleList = document.querySelectorAll('.'+ToggleHandler.toggleClass);\n        const toggleListCount = toggleList.length;\n\n        if(isset(toggleList) && toggleListCount !== 0){\n            for(let i = 0; i < toggleListCount; i++){\n                const toggle = toggleList[i];\n                ToggleHandler.initToggle(toggle);\n            }\n        }\n    },\n\n    initToggle: function (toggle) {\n\n        /*\n        * Set \"pointer events: none\" on all direct children of the toggle\n        * Because we don't want clicks on them to register, only on the parent toggle element\n        */\n        const toggleList = toggle.querySelectorAll('.'+ToggleHandler.toggleSwitchClass);\n        for (var i = 0; i < toggleList.length; i++) {\n            var toggleItem = toggleList[i];\n\n            for (var j = 0; j < toggleItem.children.length; j++) {\n                var toggleChild = toggleItem.children[j];\n\n                toggleChild.style.pointerEvents = \"none\";\n            }\n\n        }\n        toggle.addEventListener('click', ToggleHandler.activateToggle, false);\n    },\n\n    activateToggle: function (event) {\n        const item = event.target.parentNode;\n        const itemList = item.parentNode.children;\n\n        // Bail if we didn't click on the toggle element\n        if (!event.target.classList.contains(ToggleHandler.toggleSwitchClass)) return;\n\n        // Check if content element exists\n        if (!item.querySelector('.'+ToggleHandler.toggleContentClass)) return;\n\n        // Prevent default link behavior\n        event.preventDefault();\n\n        // Toggle the active class\n        item.classList.toggle('is-active');\n    }\n};\n\nToggleHandler.init();","// from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md\n(function (arr) {\n    arr.forEach(function (item) {\n        if (item.hasOwnProperty('remove')) {\n            return;\n        }\n        Object.defineProperty(item, 'remove', {\n            configurable: true,\n            enumerable: true,\n            writable: true,\n            value: function remove() {\n                if (this.parentNode === null) {\n                    return;\n                }\n                this.parentNode.removeChild(this);\n            }\n        });\n    });\n})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);","/* ==========================================================================\n   Navigation handler\n   - Handles the showing and hiding of the overlay-menu component which has the proper classes.\n ========================================================================== */\n\nconst bodyScrollLock = require('body-scroll-lock');\n\nconst OverlayMenuHandler = {\n\n    // init: function () {\n    //     const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');\n    //     OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);\n    // },\n\n    init: function () {\n\n        const overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');\n        const overlayMenuTriggerListCount = overlayMenuTriggerList.length;\n\n        if(isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0){\n            for(let i = 0; i < overlayMenuTriggerListCount; i++){\n                const overlayMenuTrigger = overlayMenuTriggerList[i];\n                OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);\n            }\n        }\n    },\n\n    initOverlayMenu: function (overlayMenuTrigger) {\n        overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);\n    },\n\n    toggleOverlayMenu: function (event) {\n        const overlayMenuNav = document.querySelector('.js-overlay-menu');\n        // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');\n\n        // Bail if overlayMenu doesn't exist\n        if (!overlayMenuNav) return;\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(overlayMenuNav);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (document.body.classList.contains('is-overlay-menu-active')) {\n            overlayMenuNav.querySelectorAll('[tabindex=\"0\"]').forEach(function(elem) {\n                elem.tabIndex = -1;\n            });\n\n            document.body.classList.remove('is-overlay-menu-active');\n            return;\n        }\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(overlayMenuNav);\n\n        overlayMenuNav.querySelectorAll('[tabindex=\"-1\"]').forEach(function(elem) {\n            elem.tabIndex = 0;\n        });\n\n        // Toggle active overlayMenu by setting a class on the body\n        document.body.classList.toggle('is-overlay-menu-active');\n        overlayMenuNav.hidden = false;\n    }\n};\n\nOverlayMenuHandler.init();","/* ==========================================================================\n    Youtube handler\n ========================================================================== */\n\nconst YoutubeHandler = {\n\n    youtubeClass : '.js-youtube-player',\n    players: [],\n\n    init : function()\n    {\n        // Get the youtube players containers\n        const youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);\n        const youtubePlayersAmount = youtubePlayers.length;\n\n        for(let i = 0; i < youtubePlayersAmount; i++){\n\n            const youtubePlayer = youtubePlayers[i];\n\n\n            const youtubePlayerId = youtubePlayer.getAttribute('id');\n            if(youtubePlayerId !== null )\n            {\n                // Strip the necessary data from the html and create objects from it\n                const youtubeElement = {\n                    id: youtubePlayer.getAttribute('id'),\n                    link: youtubePlayer.getAttribute('data-youtube-link'),\n                    autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play')),\n                };\n\n                YoutubeHandler.players.push(youtubeElement);\n            }\n            else{\n                console.log(\"Element not include because there isn't a id on the player\");\n                console.log(youtubePlayer);\n            }\n        }\n\n        if(youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();\n\n    },\n\n    /**\n     * Check if external script is loaded\n     *\n     */\n    initYoutube: function() {\n        // See if YT variable exists\n        if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') {\n            // Setup API ready function\n            window.onYouTubePlayerAPIReady = function() {\n                YoutubeHandler.loadPlayers();\n            };\n            // Load external script\n            getScript('https://www.youtube.com/iframe_api');\n            // If YT already exists load player\n        } else {\n            YoutubeHandler.loadPlayers();\n        }\n    },\n\n    /**\n     * Create the Youtube player(s) with parameters\n     * And rewrite the players to key them by the element id\n     *\n     */\n    loadPlayers: function() {\n\n        let players = [];\n\n        const youtubePlayersAmount = YoutubeHandler.players.length;\n        for(let i = 0; i < youtubePlayersAmount; i++){\n\n            let youtubePlayer = YoutubeHandler.players[i];\n\n            // Load player\n            youtubePlayer.player = new YT.Player(youtubePlayer.id,{\n                height: 200,\n                width: 200,\n                videoId: youtubePlayer.link,\n                host: 'https://www.youtube-nocookie.com',\n                playerVars: {\n                    modestbranding: 0,\n                    rel: 0,\n                    disablekb: 1,\n                    autoplay: youtubePlayer.autoPlay\n                },\n                events: {\n                    // 'onReady': YoutubeHandler.onReady,\n                    'onStateChange': YoutubeHandler.onStateChange\n                }\n            });\n\n            players[youtubePlayer.id] = youtubePlayer;\n\n        }\n\n        YoutubeHandler.players = players;\n\n    },\n\n    /**\n     * When player is ready to play\n     */\n    onReady : function(event) {\n\n        const playerContainerId = event.target.getIframe().getAttribute('id');\n        const player = YoutubeHandler.players[playerContainerId].player;\n\n        // Show video\n        // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);\n\n        // If not on tablet or mobile, play on high quality\n        // player.mute();\n        // player.playVideo();\n        // player.setPlaybackQuality('hd1080');\n    },\n\n    /**\n     * Listener for Youtube state change\n     */\n    onStateChange : function(event) {\n\n        const playerContainerId = event.target.getIframe().getAttribute('id');\n        const player = YoutubeHandler.players[playerContainerId].player;\n\n        const videoState = event.data;\n\n        // Loop video\n        if (event.data === YT.PlayerState.ENDED ) {\n            player.playVideo();\n        }\n    }\n};\n\nYoutubeHandler.init();","/* ==========================================================================\n    Search handler\n\n    TODO: Rewrite this into js-classes when you're using it then commit it back to KMS plx\n ========================================================================== */\n\nconst SearchHandler = {\n\n    form: null,\n    apiRoute: null,\n    searchField: null,\n    resultsArea: null,\n    lastSearchValue: '',\n\n    init: function () {\n\n        SearchHandler.searchbar = document.querySelector('.js-search');\n\n        if (SearchHandler.searchbar) {\n\n            SearchHandler.apiRoute = SearchHandler.searchbar.dataset.apiRoute;\n\n            SearchHandler.searchField = SearchHandler.searchbar.querySelector('.js-search-field');\n            SearchHandler.resultsArea = SearchHandler.searchbar.querySelector('.js-search-results');\n\n            SearchHandler.searchField.addEventListener('focus', SearchHandler.typeEvent);\n            SearchHandler.searchField.addEventListener('keyup', SearchHandler.typeEvent);\n            SearchHandler.searchField.addEventListener('keypress', debounce(SearchHandler.searchEvent, 300));\n\n            // If there is a click on the document\n            document.addEventListener('click', function (event) {\n\n                // And if it's outside the searchbar we close it (else we probably click on a search result :)\n                const isClickInside = SearchHandler.searchbar.contains(event.target);\n                if(!isClickInside) SearchHandler.resultsArea.hidden = true;\n            });\n\n        }\n    },\n\n    typeEvent: function (event) {\n        const searchValue = SearchHandler.searchField.value;\n\n        SearchHandler.resultsArea.hidden = false;\n\n        if(searchValue !== SearchHandler.lastSearchValue) {\n            SearchHandler.showNoResultMessage(searchValue);\n        }\n    },\n\n    searchEvent: async function (event) {\n\n        const searchValue = SearchHandler.searchField.value;\n\n        // We need atleast 3 characters\n        if(searchValue.length <= 3) return;\n\n        SearchHandler.lastSearchValue = searchValue;\n\n        const searchResultCategories = await SearchHandler.search(searchValue);\n\n        if(searchResultCategories.length <= 0) {\n            return;\n        }\n\n        let resultHtml = '';\n\n        Object.keys(searchResultCategories).forEach( key => {\n\n            const resultsForCategory = searchResultCategories[key];\n\n            resultsForCategory.forEach( result => {\n                resultHtml += '<a class=\"c-searchbar__result\" href=\"' + result.route + '\">' + result.name + '<span class=\"c-searchbar__result-category\">in ' + result.typeName +  '</span></a>';\n            });\n        });\n\n        SearchHandler.resultsArea.innerHTML = resultHtml;\n    },\n\n    search: function (query) {\n        return new Promise(function(resolve, reject) {\n            Ajax.post(\n                SearchHandler.apiRoute,\n                {query: query},\n                function (xhr) {\n\n                    if(xhr.status !== 200) {\n                        reject();\n                    }\n\n                    const response = JSON.parse(xhr.response);\n                    resolve(response);\n                }\n            );\n        });\n    },\n\n    showNoResultMessage: function(term) {\n\n        SearchHandler.lastSearchValue = term;\n\n        const noResultHref = SearchHandler.searchbar.action + \"?\" + SearchHandler.searchField.name + \"=\" + term;\n        SearchHandler.resultsArea.innerHTML = \"<a class='c-searchbar__no-results' href='\" + noResultHref + \"'>\" + SearchHandler.resultsArea.dataset.noResult + \" <strong>\" + term + \"</strong></a>\";\n    },\n\n    processSearchResponse: function (response) {\n        if (!SearchHandler.validateSearchResponse(response)) return;\n        if (typeof response.data !== 'undefined' && response.data.length > 0) {\n            while (this.resultHolder.children.length > 0) {\n                this.resultHolder.removeChild(this.resultHolder.firstChild);\n            }\n\n            console.log(response.data);\n            length = response.data.length;\n            let items = [];\n\n            for (let index = 0; index < length; index++) {\n                console.log(response.data[index]);\n                let item = {\n                    id: response.data[index].id,\n                    type: response.data[index].type,\n                    name: response.data[index].attributes.translation[0].attributes.name,\n                };\n                items.push(item);\n            }\n\n            this.resultHolder.appendChild(document.createElement('ul'));\n\n            for (let index = 0; index < length; index++) {\n                let element = document.createElement('li');\n                element.setAttribute('data-id', items[index].id);\n                element.setAttribute('data-type', items[index].type);\n                element.innerText = items[index].name;\n\n                this.resultHolder.children[0].appendChild(element);\n            }\n        } else {\n            while (this.resultHolder.children.length > 0) {\n                this.resultHolder.removeChild(this.resultHolder.firstChild);\n            }\n            this.resultHolder.innerHTML = \"<p>Geen zoekresultaten</p>\";\n        }\n    },\n\n    validateSearchResponse: function (response) {\n        if (\n            isset(response) &&\n            response.hasOwnProperty('data') &&\n            response.hasOwnProperty('meta')\n        ) return response;\n\n        console.error('Search response was not valid');\n        return false;\n    }\n};\n\nSearchHandler.init();","import {ErrorResponse} from \"../../global/models/errorResponse\";\nimport {CheckoutInformationResponse} from \"../../global/models/checkoutInformationResponse\";\n\nclass ShoppingcartService\n{\n\n    /**\n     * Validate a product quantity input.\n     * Will validate that the quantity is a number and a multiply of the steps if needed\n     *\n     * @param input\n     */\n    validateProductQuantityInput(input)\n    {\n        let quantity = parseInt(input.value);\n        let quantityStep = parseInt(input.step);\n        const quantityCap = parseInt(input.max);\n\n        // In case the quantity step is undefined or wrong (aka NaN) we force it to one\n        if(isNaN(quantityStep)) {\n            quantityStep = 1;\n        }\n\n        if(isNaN(quantity)) {\n            quantity = quantityStep;\n            input.value = quantity;\n        }\n\n        /**\n         * Because it has exceeded the cap we set it to the cap and remove one quantity step.\n         * The validateOrRoundUpQuantityToStep function then will automatically round it up.\n         */\n        if(quantity > quantityCap) {\n            quantity = quantityCap - quantityStep;\n        }\n\n        /**\n         * If the quantityStep is one then we can already return.\n         * There is not need to validate if it's a multiply of the quantityStep, because it always is.\n         */\n        if(quantityStep === 1) return;\n\n        const validatedQuantity = this.validateOrRoundUpQuantityToStep(quantity, quantityStep);\n\n        /**\n         * If the validatedQuantity is different the initial quantity, change the input to the validate quantity\n         */\n        if(quantity !== validatedQuantity) input.value = validatedQuantity;\n    }\n\n    /**\n     * Iterative function that will validate the given quantity if it a multiply of the steps.\n     * Else it will increment and try again till it is.\n     * Note: We could also rewrite this into an do/do while function.\n     *\n     * @param quantity\n     * @param step\n     * @returns {*}\n     */\n    validateOrRoundUpQuantityToStep(quantity, step)\n    {\n        // If not increment the quantity and recall the function\n        if(quantity % step !== 0) {\n            quantity++;\n            return this.validateOrRoundUpQuantityToStep(quantity, step);\n        }\n        return quantity;\n    }\n\n    /**\n     * Update the shopping cart items counters\n     *\n     * @param amount\n     */\n    updateShoppingCartCounters(amount)\n    {\n        // If we don't redirect we update the shopping cart amount\n        const shoppingCartButtons = document.getElementsByClassName('js-shopping-cart-amount');\n\n        for (let sb = 0; sb < shoppingCartButtons.length; sb++) {\n            const shoppingCartButton = shoppingCartButtons[sb];\n\n            // Set shopping cart amount to\n            shoppingCartButton.setAttribute('data-items', amount);\n        }\n\n    }\n\n    /**\n     * Adds a product to the shopping cart\n     *\n     * @param id\n     * @param type\n     * @param quantity\n     * @param redirect\n     */\n    _addProductToShoppingcart(id, type, quantity, redirect = true) {\n        const self = this;\n\n        return new Promise(function(resolve, reject) {\n            Ajax.post(\n                '/addProductToShoppingcart',\n                {productableId: id, itemType: type, quantity: quantity},\n                function (xhr) {\n\n                    if (xhr.status === 200) {\n\n                        // Only redirect if variable is true\n                        if (redirect) window.location = xhr.response;\n                        else {\n\n                            const shoppingCartButton = document.querySelector('.js-shopping-cart-amount');\n\n                            let shoppingCartAmount = 0;\n\n                            // If already an amount is set, use that instead\n                            if (shoppingCartButton.hasAttribute('data-items')) shoppingCartAmount = parseInt(shoppingCartButton.getAttribute('data-items'));\n\n                            // Increment amount by the quantity\n                            shoppingCartAmount += parseInt(quantity);\n\n                            self.updateShoppingCartCounters(shoppingCartAmount);\n                        }\n                        resolve();\n\n                    } else {\n                        console.log(id);\n                        console.log(type);\n                        console.log(quantity);\n                        debugger;\n                        reject();\n                    }\n                }\n            );\n        });\n    }\n\n    /**\n     * Remove a product from the shopping cart\n     *\n     * @param id\n     * @param type\n     */\n    _removeItemFromShoppingcart(id,) {\n        return new Promise(function(resolve, reject) {\n            Ajax.post(\n                '/removeItemFromShoppingcart',\n                {itemId: id},\n                function (xhr) {\n                    resolve();\n                }\n            );\n        });\n    }\n\n    /**\n     * Set the quantity of a shopping cart item\n     *\n     * @param id\n     * @param quantity\n     */\n    _setItemQuantityInShoppingcart(id, quantity) {\n        return new Promise(function(resolve, reject) {\n            Ajax.post(\n                '/setItemQuantityInShoppingcart',\n                {itemId: id, quantity: quantity},\n                function (xhr) {\n                    resolve();\n                }\n            );\n        });\n    }\n\n    getShippingCost(postal, country) {\n\n        return new Promise(function (resolve, reject) {\n            Ajax.post(\n                '/getShippingCostsByZipcode',\n                {\n                    'zip': postal,\n                    'country': country\n                },\n                function (xhr) {\n\n                    // let response = JSON.parse(xhr.response);\n                    if (ErrorResponse.is(xhr.response, false) === false) {\n\n                        // Convert json and append the status\n                        let response = JSON.parse(xhr.response);\n                        response.status = xhr.status;\n\n                        resolve(response);\n\n                    } else {\n                        let response = ErrorResponse.fromJsonString(xhr.response);\n                        reject(response);\n                    }\n                }\n            );\n        });\n    }\n\n    setShippingCostToFree()\n    {\n        return new Promise(function(resolve, reject) {\n            Ajax.get(\n                'setShippingCostToFree',\n                function(xhr) {\n                    if(xhr.status === 200) resolve();\n                    reject();\n                }\n            );\n        });\n    }\n\n    /**\n     * Get the current cart information\n     *\n     * @returns {Promise|Promise|Promise}\n     */\n    getCurrentShoppingCart() {\n\n        return new Promise(function(resolve, reject) {\n            Ajax.get(\n                'getShoppingCartInformation',\n                function(xhr) {\n                    let response = JSON.parse(xhr.response);\n                    let isErrorResponse = ErrorResponse.is(xhr.response, false);\n                    // let isCheckoutInformationResponse = CheckoutInformationResponse.is(xhr.response, false);\n\n                    if(!isErrorResponse) {\n                        resolve(response);\n                    } else {\n                        let response = ErrorResponse.fromJsonString(xhr.response);\n                        reject(response);\n                    }\n                }\n            );\n        })\n    }\n}\n\nexport { ShoppingcartService }","/* ==========================================================================\n    Scroll To Click handler\n ========================================================================== */\n\nconst ScrollToHandler = {\n\n    // Animation settings\n    offset : 60, //pixel\n    duration : 1400, //ms\n\n    // Animation variables\n    body : null,\n    start : 0,\n    change : 0,\n    currentTime : 0,\n    allowAnimation : false,\n    scrollToAnimation : null,\n\n    // Watch the EasingFunction helper for the available methods\n    easing: 'easeInOutQuad',\n\n    init : function(){\n\n        const anchorLinks = document.querySelectorAll('.js-scroll-to-target');\n        const anchorLinksAmount = anchorLinks.length;\n\n        for(let i = 0; i < anchorLinksAmount; i++) {\n\n            const anchorLink = anchorLinks[i];\n\n            anchorLink.addEventListener('click', function (event) {\n                ScrollToHandler.prepareScrollTo(this.getAttribute('href'));\n                event.preventDefault();\n            });\n        }\n    },\n\n    /**\n     * Prepare the Handler for the animation\n     */\n    prepareScrollTo : function(elementId){\n\n        // Get the scroll to element\n        elementId = elementId.substr(elementId.indexOf('#')+1);\n        const scrollToElement = document.getElementById(elementId);\n        const scrollToElementPosition = scrollToElement.getBoundingClientRect();\n\n        // Reset or define the Handler variables\n        ScrollToHandler.body = document.documentElement;\n        ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop\n        ScrollToHandler.change = ((scrollToElementPosition.top + ScrollToHandler.start) - ScrollToHandler.start) - ScrollToHandler.offset;\n        ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();\n        ScrollToHandler.allowAnimation = true;\n\n        // Trigger animation\n        scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);\n\n        // Stop on scroll\n        window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);\n        window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);\n\n    },\n\n    /*\n     * Animate the scroll position\n     */\n    animateScroll : function (timestamp) {\n\n        // Calculate progress from 0 - 1\n        let progress = Math.min(1, (timestamp -  ScrollToHandler.startTime) / ScrollToHandler.duration);\n        if(progress < 0) progress = 0;\n\n        // Convert progress with easing function\n        progress = EasingFunctions[ScrollToHandler.easing](progress);\n\n        const newScrollTop = ScrollToHandler.start + ( ScrollToHandler.change * progress );\n\n        ScrollToHandler.body.scrollTop = newScrollTop;\n        if( ScrollToHandler.body.scrollTop === 0 ) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop\n\n        if(progress < 1 && ScrollToHandler.allowAnimation){\n            scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);\n        }\n\n    },\n\n    /*\n     * Abort the scroll animation\n     */\n    abortScrollAnimation : function (event) {\n        ScrollToHandler.allowAnimation = false;\n        cancelAnimationFrame(ScrollToHandler.scrollToAnimation);\n    }\n\n};\n\nScrollToHandler.init();","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n        typeof define === 'function' && define.amd ? define(factory) :\n            (factory());\n}(this, (function () { 'use strict';\n\n    /**\n     * @this {Promise}\n     */\n    function finallyConstructor(callback) {\n        var constructor = this.constructor;\n        return this.then(\n            function(value) {\n                return constructor.resolve(callback()).then(function() {\n                    return value;\n                });\n            },\n            function(reason) {\n                return constructor.resolve(callback()).then(function() {\n                    return constructor.reject(reason);\n                });\n            }\n        );\n    }\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\n    var setTimeoutFunc = setTimeout;\n\n    function noop() {}\n\n// Polyfill for Function.prototype.bind\n    function bind(fn, thisArg) {\n        return function() {\n            fn.apply(thisArg, arguments);\n        };\n    }\n\n    /**\n     * @constructor\n     * @param {Function} fn\n     */\n    function Promise(fn) {\n        if (!(this instanceof Promise))\n            throw new TypeError('Promises must be constructed via new');\n        if (typeof fn !== 'function') throw new TypeError('not a function');\n        /** @type {!number} */\n        this._state = 0;\n        /** @type {!boolean} */\n        this._handled = false;\n        /** @type {Promise|undefined} */\n        this._value = undefined;\n        /** @type {!Array<!Function>} */\n        this._deferreds = [];\n\n        doResolve(fn, this);\n    }\n\n    function handle(self, deferred) {\n        while (self._state === 3) {\n            self = self._value;\n        }\n        if (self._state === 0) {\n            self._deferreds.push(deferred);\n            return;\n        }\n        self._handled = true;\n        Promise._immediateFn(function() {\n            var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n            if (cb === null) {\n                (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                return;\n            }\n            var ret;\n            try {\n                ret = cb(self._value);\n            } catch (e) {\n                reject(deferred.promise, e);\n                return;\n            }\n            resolve(deferred.promise, ret);\n        });\n    }\n\n    function resolve(self, newValue) {\n        try {\n            // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n            if (newValue === self)\n                throw new TypeError('A promise cannot be resolved with itself.');\n            if (\n                newValue &&\n                (typeof newValue === 'object' || typeof newValue === 'function')\n            ) {\n                var then = newValue.then;\n                if (newValue instanceof Promise) {\n                    self._state = 3;\n                    self._value = newValue;\n                    finale(self);\n                    return;\n                } else if (typeof then === 'function') {\n                    doResolve(bind(then, newValue), self);\n                    return;\n                }\n            }\n            self._state = 1;\n            self._value = newValue;\n            finale(self);\n        } catch (e) {\n            reject(self, e);\n        }\n    }\n\n    function reject(self, newValue) {\n        self._state = 2;\n        self._value = newValue;\n        finale(self);\n    }\n\n    function finale(self) {\n        if (self._state === 2 && self._deferreds.length === 0) {\n            Promise._immediateFn(function() {\n                if (!self._handled) {\n                    Promise._unhandledRejectionFn(self._value);\n                }\n            });\n        }\n\n        for (var i = 0, len = self._deferreds.length; i < len; i++) {\n            handle(self, self._deferreds[i]);\n        }\n        self._deferreds = null;\n    }\n\n    /**\n     * @constructor\n     */\n    function Handler(onFulfilled, onRejected, promise) {\n        this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n        this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n        this.promise = promise;\n    }\n\n    /**\n     * Take a potentially misbehaving resolver function and make sure\n     * onFulfilled and onRejected are only called once.\n     *\n     * Makes no guarantees about asynchrony.\n     */\n    function doResolve(fn, self) {\n        var done = false;\n        try {\n            fn(\n                function(value) {\n                    if (done) return;\n                    done = true;\n                    resolve(self, value);\n                },\n                function(reason) {\n                    if (done) return;\n                    done = true;\n                    reject(self, reason);\n                }\n            );\n        } catch (ex) {\n            if (done) return;\n            done = true;\n            reject(self, ex);\n        }\n    }\n\n    Promise.prototype['catch'] = function(onRejected) {\n        return this.then(null, onRejected);\n    };\n\n    Promise.prototype.then = function(onFulfilled, onRejected) {\n        // @ts-ignore\n        var prom = new this.constructor(noop);\n\n        handle(this, new Handler(onFulfilled, onRejected, prom));\n        return prom;\n    };\n\n    Promise.prototype['finally'] = finallyConstructor;\n\n    Promise.all = function(arr) {\n        return new Promise(function(resolve, reject) {\n            if (!arr || typeof arr.length === 'undefined')\n                throw new TypeError('Promise.all accepts an array');\n            var args = Array.prototype.slice.call(arr);\n            if (args.length === 0) return resolve([]);\n            var remaining = args.length;\n\n            function res(i, val) {\n                try {\n                    if (val && (typeof val === 'object' || typeof val === 'function')) {\n                        var then = val.then;\n                        if (typeof then === 'function') {\n                            then.call(\n                                val,\n                                function(val) {\n                                    res(i, val);\n                                },\n                                reject\n                            );\n                            return;\n                        }\n                    }\n                    args[i] = val;\n                    if (--remaining === 0) {\n                        resolve(args);\n                    }\n                } catch (ex) {\n                    reject(ex);\n                }\n            }\n\n            for (var i = 0; i < args.length; i++) {\n                res(i, args[i]);\n            }\n        });\n    };\n\n    Promise.resolve = function(value) {\n        if (value && typeof value === 'object' && value.constructor === Promise) {\n            return value;\n        }\n\n        return new Promise(function(resolve) {\n            resolve(value);\n        });\n    };\n\n    Promise.reject = function(value) {\n        return new Promise(function(resolve, reject) {\n            reject(value);\n        });\n    };\n\n    Promise.race = function(values) {\n        return new Promise(function(resolve, reject) {\n            for (var i = 0, len = values.length; i < len; i++) {\n                values[i].then(resolve, reject);\n            }\n        });\n    };\n\n// Use polyfill for setImmediate for performance gains\n    Promise._immediateFn =\n        (typeof setImmediate === 'function' &&\n            function(fn) {\n                setImmediate(fn);\n            }) ||\n        function(fn) {\n            setTimeoutFunc(fn, 0);\n        };\n\n    Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n        if (typeof console !== 'undefined' && console) {\n            console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n        }\n    };\n\n    /** @suppress {undefinedVars} */\n    var globalNS = (function() {\n        // the only reliable means to get the global object is\n        // `Function('return this')()`\n        // However, this causes CSP violations in Chrome apps.\n        if (typeof self !== 'undefined') {\n            return self;\n        }\n        if (typeof window !== 'undefined') {\n            return window;\n        }\n        if (typeof global !== 'undefined') {\n            return global;\n        }\n        throw new Error('unable to locate global object');\n    })();\n\n    if (!('Promise' in globalNS)) {\n        globalNS['Promise'] = Promise;\n    } else if (!globalNS.Promise.prototype['finally']) {\n        globalNS.Promise.prototype['finally'] = finallyConstructor;\n    }\n\n})));","Number.isInteger = Number.isInteger || function(value) {\n    return typeof value === \"number\" &&\n        isFinite(value) &&\n        Math.floor(value) === value;\n};","import {ShoppingcartService} from \"../../shop/components/shoppingcartService\";\n\nconst ModalHandler = {\n\n    modal: null,\n    hasFixedPrice: false,\n    hasRequiredAge: false,\n    shoppingCartService: new ShoppingcartService(),\n\n    init: function () {\n\n        ModalHandler.modal = document.querySelector('.js-modal');\n\n        // If modal isn't set, we stop the init\n        if (!isset(ModalHandler.modal)) return;\n\n        // Add (and remove previous) events for opening the modal based upon a postal\n        const productButtons = document.getElementsByClassName('js-open-modal-from-product');\n        const productButtonsLength = productButtons.length;\n        for (let p = 0; p < productButtonsLength; p++) {\n\n            const productButton = productButtons[p];\n\n            // Remove all the previous event on the posters\n            productButton.removeEventListener('click', ModalHandler.openModalFromProductEvent);\n            productButton.addEventListener('click', ModalHandler.openModalFromProductEvent);\n        }\n\n        // Add (and remove previous) events for closing or submitting the modal\n        const modalCloseElements = ModalHandler.modal.querySelectorAll('.js-modal-close');\n        const modalCloseElementLength = modalCloseElements.length;\n        for (let c = 0; c < modalCloseElementLength; c++) {\n\n            const modalCloseElement = modalCloseElements[c];\n\n            modalCloseElement.removeEventListener('click', ModalHandler.closeModalEvent);\n            modalCloseElement.addEventListener('click', ModalHandler.closeModalEvent);\n        }\n\n        const modalAddProductToShoppingCartButton = ModalHandler.modal.querySelector('.js-add-product-button');\n        if(isset(modalAddProductToShoppingCartButton)) {\n            modalAddProductToShoppingCartButton.removeEventListener('click', ModalHandler.addToShoppingCartEvent);\n            modalAddProductToShoppingCartButton.addEventListener('click', ModalHandler.addToShoppingCartEvent);\n        }\n\n    },\n\n    openModalFromProductEvent: function (event) {\n\n        const productButton = event.currentTarget;\n\n        const productId = productButton.getAttribute('data-product-id');\n        const productType = productButton.getAttribute('data-product-type');\n        const productName = productButton.getAttribute('data-product-name');\n        const productPrice = productButton.getAttribute('data-product-price');\n        const productImage = productButton.getAttribute('data-product-image');\n        const productStep = productButton.getAttribute('data-product-step');\n\n        ModalHandler.populateModal(productId, productType, productName, productPrice, productImage, productStep);\n        ModalHandler.openModal();\n    },\n\n    populateModal: function (productId, productType, productName, productPrice, productImage, productStep) {\n\n        const modalProductId = ModalHandler.modal.querySelector('.js-modal-product-id');\n        const modalProductType = ModalHandler.modal.querySelector('.js-modal-product-type');\n        const modalHeading = ModalHandler.modal.querySelector('.js-modal-heading');\n        const modalPrice = ModalHandler.modal.querySelector('.js-modal-price');\n        const modalImage = ModalHandler.modal.querySelector('.js-modal-image');\n        const modalQuantity = ModalHandler.modal.querySelector('.js-modal-quantity');\n        const modalStackLine = ModalHandler.modal.querySelector('.js-modal-stack');\n        const modalStackLineAmount = ModalHandler.modal.querySelector('.js-modal-stack-amount');\n\n        modalProductId.value = productId;\n        modalProductType.value = productType;\n        modalHeading.innerHTML = productName;\n        modalPrice.innerHTML = productPrice;\n        modalImage.src = productImage;\n\n        const productStepInt = parseInt(productStep);\n\n        // modalQuantity.min = productStepInt;\n        // modalQuantity.value = productStepInt;\n        // modalQuantity.step = productStepInt;\n\n        modalQuantity.min = 1;\n        modalQuantity.value = 1;\n        modalQuantity.step = 1;\n\n        if(productStepInt <= 1) {\n            modalStackLine.hidden = true;\n        }\n        else {\n            modalStackLine.hidden = false;\n            modalStackLineAmount.innerHTML = productStepInt;\n        }\n\n    },\n\n    openModal: function () {\n\n        // Before showing the modal, set the right modal set\n        ModalHandler.setModalAreas(false);\n\n        ModalHandler.modal.hidden = false;\n        ModalHandler.modal.classList.add('is-modal-visible');\n        window.addEventListener('keydown', ModalHandler.handleKeyPressed);\n\n        const addToShoppingCartButton = ModalHandler.modal.querySelector('.js-modal-quantity');\n        addToShoppingCartButton.addEventListener('change', ModalHandler.modalQuantityChanged);\n    },\n\n    setModalAreas: function(showContinue = true)\n    {\n\n        const modalContinueChoices = ModalHandler.modal.querySelector('.js-modal-continue-choices');\n        const modalAddToCart = ModalHandler.modal.querySelector('.js-modal-add-to-cart');\n\n        // NOTE: because it is the hidden value, we need to flip it\n        modalContinueChoices.hidden = !showContinue;\n        modalAddToCart.hidden = showContinue;\n    },\n\n    closeModalEvent: function (event) {\n        ModalHandler.closeModal();\n    },\n\n    closeModal: function () {\n        ModalHandler.modal.hidden = true;\n        ModalHandler.modal.classList.remove('is-modal-visible');\n        window.removeEventListener('keydown', ModalHandler.handleKeyPressed);\n\n        const addToShoppingCartButton = ModalHandler.modal.querySelector('.js-modal-quantity');\n        addToShoppingCartButton.removeEventListener('change', ModalHandler.modalQuantityChanged);\n    },\n\n    submitModalEvent: function (event) {\n        ModalHandler.submitModal();\n    },\n\n    addToShoppingCartEvent: function(event) {\n        ModalHandler.addToShoppingCart();\n    },\n\n    addToShoppingCart: function () {\n\n        const productId = ModalHandler.modal.querySelector('.js-modal-product-id').value;\n        const productType = ModalHandler.modal.querySelector('.js-modal-product-type').value;\n\n        const quantityInput = ModalHandler.modal.querySelector('.js-modal-quantity');\n\n        ModalHandler.shoppingCartService.validateProductQuantityInput(quantityInput);\n\n        if(isset(productId) && isset(productType) && isset(quantityInput)) {\n            ModalHandler.shoppingCartService._addProductToShoppingcart(productId, productType, parseInt(quantityInput.value), false);\n            ModalHandler.setModalAreas(true);\n        }\n        else console.warn('ModalHandler: Some of the required variables is missing');\n    },\n\n    /**\n     * Input quantity changed.\n     * This will be triggered when the input field has been changed.\n     *\n     * @param event\n     */\n    modalQuantityChanged: function(event) {\n\n        const input = event.currentTarget;\n        ModalHandler.shoppingCartService.validateProductQuantityInput(input);\n    },\n\n    handleKeyPressed: function (event) {\n\n        switch (event.key) {\n            case 'Escape':\n                return ModalHandler.closeModal();\n\n            case 'Enter':\n                return ModalHandler.addToShoppingCart();\n\n            default:\n                // console.log(event);\n        }\n\n    },\n\n};\n\nModalHandler.init();","var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n","(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n","import flatpickr from \"flatpickr\";\nimport { Dutch } from \"flatpickr/dist/l10n/nl\";\nflatpickr.localize(Dutch);\n\nconst today = new Date().setHours(0,0,0,0);\n\nflatpickr.defaultConfig = {\n    dateFormat: \"d-m-Y\",\n    // minDate: today, // Probably bug in flatpickr but doesn't work\n    defaultDate: today,\n    // allowInput: true, // We disable by input, because it's buggy and not working if you change the format style...\n    nextArrow: '<span class=\"lib-flatpickr__arrow  lib-flatpickr__arrow--next\"></span>',\n    prevArrow: '<span class=\"lib-flatpickr__arrow  lib-flatpickr__arrow--prev\"></span>',\n    disableMobile: \"true\" // needs to be disabled, otherwise it crashes on mobile\n\n    // This allows to change the date by changing the input\n    // onClose: function (selectedDates, dateStr, instance) {\n    //     if(selectedDates.length === 1) {\n    //         instance.setDate(dateStr);\n    //         instance.onClose(selectedDates, dateStr, instance);\n    //     }\n    // },\n    \n    // We check in the on change method that it must be before the minDate\n    // onChange: function (selectedDates, dateStr, instance) {\n    //     debugger;\n    // }\n};\n\nconst DatePickerHandler = {\n\n    datePickers: [],\n\n    init: function () {\n\n        const datePickerElements = document.getElementsByClassName('js-date-picker');\n\n        for(let i = 0; i < datePickerElements.length; i++) {\n\n            const datePickerElement = datePickerElements[i];\n            let selectedDate = datePickerElement.value;\n            let minDate = datePickerElement.getAttribute('data-min-date');\n\n            flatpickr(datePickerElements[i], {\n                minDate: minDate,\n                defaultDate: selectedDate,\n            });\n        }\n    },\n\n};\n\nDatePickerHandler.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: 'AIzaSyAv4dUBy-nkEwcvJ0OmEhPX0oo9Ey30BMY',\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 * 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 * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList),\n      PromiseImpl\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","/* ==========================================================================\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 * 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}","import { CheckoutService } from \"./checkoutService\";\n\n/**\n * Controls the checkout form\n */\nclass CheckoutController {\n\n    constructor() {\n\n        const self = this;\n        this._checkoutForm = document.querySelector('.js-checkout-form');\n\n        if(!isset(this._checkoutForm)) return;\n\n        this.differentShippingAddressCheckbox = this._checkoutForm.querySelector('#other_shipping_address');\n        this.orderAsRadioButtons = this._checkoutForm.getElementsByClassName('js-order-type');\n        // this._submitButton = this._checkoutForm.querySelector('.js-submit');\n\n        if(this.differentShippingAddressCheckbox) this.toggleShippingAddressFields(this.differentShippingAddressCheckbox.checked);\n\n        //Bind event listeners to this class.\n        this.triggerToggleShippingAddress = this.triggerToggleShippingAddress.bind(this);\n        this.triggerChangeOrderAs = this.triggerChangeOrderAs.bind(this);\n\n        //Enable the listeners.\n        this.controlListeners(true);\n    }\n\n    /**\n     * @param {boolean} enabled\n     */\n    controlListeners(enabled) {\n        const self = this;\n        this.differentShippingAddressCheckbox.removeEventListener('change', this.triggerToggleShippingAddress);\n\n        const orderAsRadioButtonsLength = this.orderAsRadioButtons.length;\n        for (let index = 0; index < orderAsRadioButtonsLength; index++) {\n            const orderAsRadioButton = this.orderAsRadioButtons[index];\n            orderAsRadioButton.removeEventListener('change', this.triggerChangeOrderAs);\n\n            if( orderAsRadioButton.checked ) {\n                this.changeOrderAs(orderAsRadioButton.value);\n            }\n        }\n\n        if (enabled) {\n            this.differentShippingAddressCheckbox.addEventListener('change', this.triggerToggleShippingAddress);\n            for (let index = 0; index < orderAsRadioButtonsLength; index++) this.orderAsRadioButtons[index].addEventListener('change', this.triggerChangeOrderAs);\n        }\n    }\n\n    /**\n     * Toggle the shipping address fields\n     *\n     * @param event\n     */\n    triggerToggleShippingAddress(event)\n    {\n        const input = event.currentTarget;\n        this.toggleShippingAddressFields(input.checked); \n    }\n\n    toggleShippingAddressFields(value)\n    {\n        const shippingFieldsArea = this._checkoutForm.querySelector('.js-shipping-address-fields');\n\n        if(!value) {\n            shippingFieldsArea.classList.add('is-hidden');\n        } else {\n            shippingFieldsArea.classList.remove('is-hidden');\n        }\n\n        // Hidden is the inverted value of the checked\n        // shippingFieldsArea.hidden = (!value);\n    }\n    \n\n    triggerChangeOrderAs(event)\n    {\n        const changedRadioButton = event.currentTarget;\n        this.changeOrderAs(changedRadioButton.value);\n    }\n\n    changeOrderAs(orderType)\n    {\n        const companyFields = this._checkoutForm.querySelector('.js-company-information');\n\n        if(orderType !== 'business') {\n            companyFields.classList.add('is-hidden');\n        } else {\n            companyFields.classList.remove('is-hidden');\n        }\n    }\n}\n\nexport { CheckoutController }","import {ErrorResponse} from \"../../global/models/errorResponse\";\nimport {CheckoutInformationResponse} from \"../../global/models/checkoutInformationResponse\";\n\n/**\n * Shopping cart form controller.\n */\nclass ShoppingcartController {\n    /**\n     * @param {ShoppingcartService} shoppingcartService\n     */\n    constructor(shoppingcartService) {\n\n\n        this.shoppingCartElement = document.querySelector('.js-cart');\n        if (!isset(this.shoppingCartElement)) {\n            return;\n        }\n\n        // ONLY FOR THE DEV BUTTONS\n        this._addToShoppingcartButtons = document.querySelectorAll('.js-add-product-to-shoppingcart');\n\n\n        this._removeFromShoppingcartButtons = this.shoppingCartElement.querySelectorAll('.js-remove-item-from-shoppingcart');\n        this.changeQuantityShoppingcartInputs = this.shoppingCartElement.querySelectorAll('.js-change-quantity-item');\n        this.addProduct = this.shoppingCartElement.querySelector('.js-add-product');\n\n        this.invoicePostalElement = this.shoppingCartElement.querySelector('.js-invoice-postal-code');\n        this.invoiceCountryElement = this.shoppingCartElement.querySelector('.js-invoice-city');\n\n        this._shoppingcartService = shoppingcartService;\n        if (!shoppingcartService) {\n            console.error('ShoppingCartController: The shoppingCartController was expected to get an instance of ShoppingcartService, but did not get one.');\n            return;\n        }\n\n        // if(isset(this.addProduct)) {\n        //     this.addProductListener();\n        // }\n\n        this.addProductButtonClicked = this.addProductButtonClicked.bind(this);\n        this.removeProductButtonClicked = this.removeProductButtonClicked.bind(this);\n        this.quantityInputChanged = this.quantityInputChanged.bind(this);\n        this.getShippingCosts = this.getShippingCosts.bind(this);\n        this.handleKeyPressed = this.handleKeyPressed.bind(this);\n\n        this.toggleShippingBox();\n\n        this.controlListeners(true);\n    }\n\n    /**\n     * Enable or disable event listeners\n     *\n     * @param enable\n     */\n    controlListeners(enable = true) {\n\n        const self = this;\n        window.addEventListener('keydown', this.handleKeyPressed);\n\n        const addToShoppingcartButtonsLength = this._addToShoppingcartButtons.length;\n        const removeFromShoppingcartButtonsLength = this._removeFromShoppingcartButtons.length;\n        const changeQuantityShoppingcartInputsLength = this.changeQuantityShoppingcartInputs.length;\n\n        for (let index = 0; index < addToShoppingcartButtonsLength; index++) this._addToShoppingcartButtons[index].removeEventListener('click', this.addProductButtonClicked);\n        for (let index = 0; index < removeFromShoppingcartButtonsLength; index++) this._removeFromShoppingcartButtons[index].removeEventListener('click', this.removeProductButtonClicked);\n        for (let index = 0; index < changeQuantityShoppingcartInputsLength; index++) this.changeQuantityShoppingcartInputs[index].removeEventListener('change', this.quantityInputChanged);\n\n        if (isset(this.invoicePostalElement)) this.invoicePostalElement.removeEventListener('keyup', this.getShippingCosts);\n        if (isset(this.invoiceCountryElement)) this.invoiceCountryElement.removeEventListener('change', this.getShippingCosts);\n\n        if (enable) {\n            for (let index = 0; index < addToShoppingcartButtonsLength; index++) this._addToShoppingcartButtons[index].addEventListener('click',  this.addProductButtonClicked);\n            for (let index = 0; index < removeFromShoppingcartButtonsLength; index++) this._removeFromShoppingcartButtons[index].addEventListener('click', this.removeProductButtonClicked);\n            for (let index = 0; index < changeQuantityShoppingcartInputsLength; index++) this.changeQuantityShoppingcartInputs[index].addEventListener('change', this.quantityInputChanged);\n\n            if (isset(this.invoicePostalElement)) this.invoicePostalElement.addEventListener('keyup', this.getShippingCosts);\n            if (isset(this.invoiceCountryElement)) this.invoiceCountryElement.addEventListener('change', this.getShippingCosts);\n\n        }\n    }\n\n    /**\n     * Add Product listener for show page\n     * There the input value will determine the quantity.\n     */\n    addProductListener() {\n\n        const self = this;\n\n        const product = this.addProduct;\n        const addProductButton = this.addProduct.querySelector('.js-add-product-button');\n        const productQuantityInput = this.addProduct.querySelector('.js-add-product-quantity');\n\n        addProductButton.addEventListener('click', function () {\n            const productId = product.dataset.productId;\n            const productType = product.dataset.productType;\n\n            self._shoppingcartService.validateProductQuantityInput(productQuantityInput);\n            self._shoppingcartService._addProductToShoppingcart(productId, productType, parseInt(productQuantityInput.value));\n        });\n\n        productQuantityInput.addEventListener('change', function () {\n            self._shoppingcartService.validateProductQuantityInput(productQuantityInput);\n        });\n    }\n\n    addProductButtonClicked(event) {\n\n        const button = event.currentTarget;\n\n        const productId = button.dataset.productId;\n        const productType = button.dataset.productType;\n        const productQuantity = button.dataset.productQuantity;\n\n        if(!isset(productId) || !isset(productType) || !isset(productQuantity) ) {\n            console.warn('AddProductButtonClicked: One of the required value is undefined');\n            return;\n        }\n\n        this._shoppingcartService._addProductToShoppingcart(productId, productType, productQuantity);\n    }\n\n    /**\n     * @param {MouseEvent} event\n     */\n    async removeProductButtonClicked(event) {\n\n        const removeButton = event.currentTarget;\n        const shoppingcartItemId = removeButton.dataset.shoppingcartItemId;\n\n        if(!isset(shoppingcartItemId) ) {\n            console.warn('removeProductButtonClicked: Shopping cart id is undefined.');\n            return;\n        }\n\n        // if (!(\"productId\" in removeButton.dataset)) {\n        //     console.error('ShoppingCartController: Expected an add button to have the data-product-id attribute set. But did not have that. Not processing click', removeButton.dataset);\n        //     return;\n        // }\n        // if (!(\"productType\" in removeButton.dataset)) {\n        //     console.error('ShoppingCartController: Expected an add button to have the data-type attribute set. But did not have that. Not processing click', removeButton.dataset);\n        //     return;\n        // }\n\n        const shoppingCartItem = removeButton.parentElement.parentElement;\n        if(shoppingCartItem.classList.contains('js-shopping-cart-item')) {\n            await this._shoppingcartService._removeItemFromShoppingcart(shoppingcartItemId);\n            // await this._shoppingcartService._removeItemFromShoppingcart(removeButton.dataset.productId, removeButton.dataset.productType);\n            shoppingCartItem.remove();\n\n            // Update the rest of the shopping cart\n            this.updateShoppingCartAmounts();\n        }\n        else {\n            console.error(\"ShoppingCartController: Not the shopping cart item element is selected or it's missing the 'js-shopping-cart-item' hook.\");\n        }\n    }\n\n    async quantityInputChanged(event) {\n\n        const input = event.currentTarget;\n\n        // const originalQuantity = parseInt(input.dataset.productQuantity);\n        const shoppingcartItemId = input.dataset.shoppingcartItemId;\n\n        if(!isset(shoppingcartItemId) ) {\n            console.warn('quantityInputChanged: Shopping cart id is undefined.');\n            return;\n        }\n\n        this._shoppingcartService.validateProductQuantityInput(input);\n\n        // Make sure that the change really is a different input\n        // if(originalQuantity === parseInt(input.value)) {\n        //     console.warn('quantityInputChanged: Original quantity and the new one is the same. Therefor skip this method');\n        //     return;\n        // }\n\n        const itemQuantity = parseInt(input.value);\n\n        if(itemQuantity === 0) {\n\n            // Grab the shopping cart by calling the parentElement\n            const shoppingCartItem = input.parentElement.parentElement;\n\n            await this._shoppingcartService._removeItemFromShoppingcart(shoppingcartItemId);\n            shoppingCartItem.remove();\n        }\n        else {\n            await this._shoppingcartService._setItemQuantityInShoppingcart(shoppingcartItemId, parseInt(input.value));\n        }\n\n        // Update the rest of the shopping cart\n        this.updateShoppingCartAmounts();\n    }\n\n    async getShippingCosts(event) {\n\n        const country = this.shoppingCartElement.querySelector('#invoice_country');\n\n        // if(isset(event) && event.currentTarget === country) {\n        //     debugger;\n        // }\n        // else if (isset(event) && event.currentTarget === zipcode){\n            // debugger;\n        // }\n\n        if (isset(event) && event.currentTarget === this.invoicePostalElement){\n\n            // Convert zip value without space and uppercase\n            let zipValue = this.invoicePostalElement.value;\n            zipValue = zipValue.replace(/\\s+/g, '');\n            zipValue = zipValue.toUpperCase();\n            this.invoicePostalElement.value = zipValue;\n        }\n\n\n        // if(zipcode.value.length <= 3) return;\n\n        // Get the postal response from shopping cart\n        const postalResponse = await this._shoppingcartService.getShippingCost(this.invoicePostalElement.value, this.invoiceCountryElement.value);\n\n        // Update the rest of the shopping cart\n        this.updateShoppingCartAmounts();\n\n        // Global shopping cart elements\n        const receiptTotalElement = this.shoppingCartElement.querySelector('.js-receipt-total');\n        const shoppingCartSubmit = this.shoppingCartElement.querySelector('.js-shopping-cart-submit');\n\n        // Zipcode search components\n        const foundLocationElement = this.shoppingCartElement.querySelector('.js-found-location');\n        const foundLocationSuccessLabel  = this.shoppingCartElement.querySelector('.js-found-location-success-label');\n        const foundLocationErrorLabel = this.shoppingCartElement.querySelector('.js-found-location-error-label');\n        const foundLocationCity = this.shoppingCartElement.querySelector('#invoice_city');\n        const messageElement = this.shoppingCartElement.querySelector('.js-zipcode-message');\n\n        // Set to default value\n        foundLocationElement.hidden = false;\n        receiptTotalElement.hidden = false;\n        shoppingCartSubmit.hidden = false;\n        messageElement.classList.remove('c-delivery__address--success');\n\n        let shippingCost = null;\n\n        if(!isset(postalResponse.price)) {\n            // receiptTotalElement.hidden = true;\n            // shoppingCartSubmit.hidden = true;\n        }\n\n        if(postalResponse.status === 206 || postalResponse.status === 422) {\n            foundLocationSuccessLabel.hidden = true;\n            foundLocationErrorLabel.hidden = false;\n            messageElement.innerHTML = postalResponse.message;\n            foundLocationCity.value = '';\n        }\n\n        if(postalResponse.status === 200) {\n            foundLocationSuccessLabel.hidden = false;\n            foundLocationErrorLabel.hidden = true;\n            messageElement.classList.add('c-delivery__address--success');\n            messageElement.innerHTML = postalResponse.region_name + '<br/>' + postalResponse.zipcode + '<br/><strong>€' + number_format((postalResponse.price/100), 2, ',', '.') + '</strong>';\n            // zipcode.value = postalResponse.zipcode;\n            foundLocationCity.value = postalResponse.region_name;\n            // zipcode.blur();\n        }\n    }\n\n    async setToFreeShippingCosts() {\n\n        // Disable the hidden attributes\n        const receiptTotalElement = this.shoppingCartElement.querySelector('.js-receipt-total');\n        const shoppingCartSubmit = this.shoppingCartElement.querySelector('.js-shopping-cart-submit');\n\n        receiptTotalElement.hidden = false;\n        shoppingCartSubmit.hidden = false;\n\n        await this._shoppingcartService.setShippingCostToFree();\n\n        // Update the rest of the shopping cart\n        this.updateShoppingCartAmounts();\n    }\n\n    toggleShippingBox() {\n\n        const deliveryLocationToggles = this.shoppingCartElement.querySelectorAll('.js-delivery-location-toggle');\n        const self = this;\n        let currentDeliveryType;\n\n        for (let i = 0; i < deliveryLocationToggles.length; i++) {\n\n            const deliveryLocationToggle = deliveryLocationToggles[i];\n            if(deliveryLocationToggle.checked) currentDeliveryType = deliveryLocationToggle.value;\n\n            deliveryLocationToggle.addEventListener('change', function () {\n                self.setDeliveryLocation(this.value);\n            });\n        }\n\n        if(isset(currentDeliveryType)) {\n            this.setDeliveryLocation(currentDeliveryType);\n        }\n    }\n\n    setDeliveryLocation(deliveryType)\n    {\n        const deliveryLocation = this.shoppingCartElement.querySelector('.js-delivery-location');\n\n        if(deliveryType === 'ship') {\n            deliveryLocation.classList.remove('is-hidden');\n            this.getShippingCosts();\n        }\n        else {\n            deliveryLocation.classList.add('is-hidden');\n            this.setToFreeShippingCosts();\n        }\n    }\n\n    handleKeyPressed(event) {\n        switch (event.key) {\n            case 'Enter':\n                const targetedElement = event.target;\n                if(targetedElement.classList.contains('js-change-quantity-item')) {\n                    event.preventDefault();\n                    targetedElement.blur();\n                }\n                return;\n\n            // case 'Shift':\n            //     this.updateShoppingCartAmounts();\n            //     return;\n\n            default:\n                return;\n        }\n    }\n\n\n    async updateShoppingCartAmounts() {\n\n        const self = this;\n        const shoppingCartInfo = await this._shoppingcartService.getCurrentShoppingCart();\n\n        const shoppingCartProductTotal = this.shoppingCartElement.querySelector('.js-cart-product-total');\n        const shoppingCartReceiptSubtotal = this.shoppingCartElement.querySelector('.js-shoppingcart-subtotal');\n        const shoppingCartShippingCostCurrency = this.shoppingCartElement.querySelector('.js-shipping-cost-currency');\n        const shoppingCartShippingCost = this.shoppingCartElement.querySelector('.js-shipping-costs');\n        const shoppingCartTotal = this.shoppingCartElement.querySelector('.js-shoppingcart-total');\n        const shoppingCartVat = this.shoppingCartElement.querySelector('.js-vat');\n        const shoppingCartDeposit = this.shoppingCartElement.querySelector('.js-deposit');\n        const shoppingCartToPay = this.shoppingCartElement.querySelector('.js-shoppingcart-to-pay');\n\n        // Reload window when item count is zero\n        if(shoppingCartInfo.itemCount === 0) {\n            shoppingCartProductTotal.innerHTML = 0;\n            shoppingCartReceiptSubtotal.innerHTML = 0;\n            shoppingCartTotal.innerHTML = 0;\n            shoppingCartVat.innerHTML = 0;\n            shoppingCartDeposit.innerHTML = 0;\n            shoppingCartToPay.innerHTML = 0;\n\n            // Reload after a magic number\n            setTimeout(function () {\n                window.location.reload();\n            }, 2000);\n\n            return;\n        }\n\n\n        shoppingCartProductTotal.innerHTML = shoppingCartInfo.formated.productTotal;\n        shoppingCartReceiptSubtotal.innerHTML = shoppingCartInfo.formated.productTotal;\n        shoppingCartTotal.innerHTML = shoppingCartInfo.formated.cartTotal;\n        shoppingCartVat.innerHTML = shoppingCartInfo.formated.vat;\n        shoppingCartDeposit.innerHTML = shoppingCartInfo.formated.deposit;\n        shoppingCartToPay.innerHTML = shoppingCartInfo.formated.totalIncludingDeposit;\n\n        // Shipping cost can be free therefor 0 and null for when undefined\n        // When null there is a shipping_undefined\n        if(isset(shoppingCartInfo.shipping_undefined)) {\n            shoppingCartShippingCost.innerHTML = shoppingCartInfo.shipping_undefined;\n            shoppingCartShippingCostCurrency.hidden = true;\n        }\n        else {\n            shoppingCartShippingCost.innerHTML = shoppingCartInfo.formated.shippingCost;\n            shoppingCartShippingCostCurrency.hidden = !shoppingCartInfo.useShipping;\n        }\n\n        // Loop through the items\n        shoppingCartInfo.items.forEach(function(item){\n\n            const shoppingCartItem = self.shoppingCartElement.querySelector('.js-shopping-cart-item[data-id=\"' + item.id + '\"]');\n\n            // Warn if the item isn't found, shouldn't happend...\n            if(!isset(shoppingCartItem)) console.warn('updateCartInformation: Shopping Cart Item not found within the cart for id: \"' + item.id + '\".');\n\n            // Update the total of the item\n            const shoppingCartItemTotal = shoppingCartItem.querySelector('.js-shopping-cart-item-amount');\n            shoppingCartItemTotal.innerHTML = item.formatted;\n        });\n\n        // Update the shopping cart amount buttons\n        this._shoppingcartService.updateShoppingCartCounters(shoppingCartInfo.itemCount);\n    }\n\n}\n\nexport {ShoppingcartController}","/**\n * Product controller.\n */\nclass ProductController {\n    /**\n     * @param {ShoppingcartService} shoppingcartService\n     */\n    constructor(shoppingcartService) {\n\n        this.productPageModel = document.querySelector('.js-add-product');\n\n        if(!isset(this.productPageModel)) return;\n\n        this.addProductButton = this.productPageModel.querySelector('.js-add-product-button');\n        this.productQuantityInput = this.productPageModel.querySelector('.js-add-product-quantity');\n\n        this.shoppingcartService = shoppingcartService;\n        if (!shoppingcartService) {\n            console.error('ShoppingCartController: The shoppingCartController was expected to get an instance of ShoppingcartService, but did not get one.');\n            return;\n        }\n\n        this.addProductEvent = this.addProductEvent.bind(this);\n        this.productQuantityInputChanged = this.productQuantityInputChanged.bind(this);\n\n        this.addProductButton.addEventListener('click', this.addProductEvent);\n        this.productQuantityInput.addEventListener('change', this.productQuantityInputChanged);\n    }\n\n    addProductEvent(event)\n    {\n        const productId = this.productPageModel.dataset.productId;\n        const productType = this.productPageModel.dataset.productType;\n\n        this.shoppingcartService.validateProductQuantityInput(this.productQuantityInput);\n        this.shoppingcartService._addProductToShoppingcart(productId, productType, parseInt(this.productQuantityInput.value));\n    }\n\n    productQuantityInputChanged(event)\n    {\n        this.shoppingcartService.validateProductQuantityInput(event.currentTarget);\n    }\n\n}\n\nexport {ProductController}","/** ==========================================================================\n *  Import ES6 Modules (https://webpack.js.org/api/module-methods/)\n *  =========================================================================*/\n\nimport { CheckoutController } from './../shop/components/checkoutController';\nimport { ShoppingcartController } from '../shop/components/shoppingcartController';\nimport { ShoppingcartService } from \"../shop/components/shoppingcartService\";\nimport { ProductController } from '../shop/components/productController'\n\n// import { CheckoutService } from \"../shop/components/checkoutService\";\n// import { ValidationService } from \"../shop/components/validationService\";\n// import { ErrorController } from \"../shop/components/errorController\";\n\n/** ==========================================================================\n *  Dependencies\n *  =========================================================================*/\n\n/**\n * External\n */\nrequire('hammerjs');\nrequire('objectFitPolyfill');\n\n/**\n * Global / Shared with KMS\n */\nrequire('./../global/polyfills/eventPolyFill');\nrequire('./../global/polyfills/isInteger');\nrequire('./../global/polyfills/promise');\nrequire('./../global/polyfills/remove');\n\n\n/** ==========================================================================\n *  Global functionalities\n *  =========================================================================*/\n\nrequire('./global/helpers'); // Should be first\nrequire('./global/browserHandler');\n// require('./global/pagetransitionHandler');\n// require('./global/resizeHandler');\nrequire('./global/scrollHandler');\n\n\n/** ==========================================================================\n *  Component functionalities\n *  =========================================================================*/\n\n// require('./components/accordionHandler');\nrequire('./components/chocolateFactory');\nrequire('./components/cookieHandler');\nrequire('./components/datePickerHandler');\n// require('./components/InputHandler');\nrequire('./components/mapsHandler');\nrequire('./components/modalHandler');\nrequire('./components/overlayMenuHandler');\nrequire('./components/headerHoverHandler');\nrequire('./components/projectorHandler');\nrequire('./components/scrollToHandler');\nrequire('./components/searchHandler');\n// require('./components/shareButtonsHandler');\nrequire('./components/toggleHandler');\nrequire('./components/youtubeHandler');\n\n/** ==========================================================================\n *  Shop Component functionalities\n *  =========================================================================*/\nnew CheckoutController();\n\nnew ShoppingcartController(new ShoppingcartService());\nnew ProductController(new ShoppingcartService());\n\n// import { RegisterService } from \"./components/RegisterService\";\n// import { RegisterController } from \"./components/RegisterController\";\n// let registerForm = document.getElementById('registerForm');\n// if(registerForm) new RegisterController(registerForm, new RegisterService());\n\n\n// import { CategoryFilter } from \"../shop/components/categoryFilterHandler\"\n// let categoryFilterCheckboxes = document.querySelectorAll('.js-categoryfilter-checkbox');\n// let categoryFilterChecklist = document.querySelector('.js-categoryfilter-checklist');\n// if(categoryFilterCheckboxes && categoryFilterChecklist) new CategoryFilter();\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    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};","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/* ==========================================================================\n   Cookie handler\n   - Primary usage for toggling the cookie message and/or switch\n ========================================================================== */\n\nconst CookieHandler = {\n\n    cookieBar : null,\n    cookieOverlay : null,\n    cookieMessage : null,\n\n    cookieSwitch : null,\n\n    cookieFadeOutAnimationDuration : 400,\n    acceptTracking : false,\n\n    // Initialize cookie handler\n    init : function()\n    {\n        // Bind cookie bar or overlay to cookieMessage\n        CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay');\n\n        // Bind cookie bar to cookieBar\n        CookieHandler.cookieBar = document.querySelector('.js-cookie-bar');\n\n        // If isset init the functions for cookie bar\n        if(isset(CookieHandler.cookieBar)){\n            CookieHandler.initCookieBar();\n        }\n        else{\n            // Else try to connect cookie overlay with tracking to cookieOverlay\n            CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay');\n\n            // If isset init the functions for cookie overlay\n            if(isset(CookieHandler.cookieOverlay)){\n                CookieHandler.initCookieOverlay();\n            }\n        }\n\n        // If either type of cookie has been found check if settings are defined\n        if(isset(CookieHandler.cookieMessage)){\n            CookieHandler.checkForCookieSettings();\n        }\n\n        // Bind cookie switch to Handler\n        CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch');\n        // If isset init the functions for cookie switch\n        if(isset(CookieHandler.cookieSwitch)){\n            CookieHandler.initCookieSwitch();\n        }\n    },\n\n    // Init the cookie bar actions\n    initCookieBar: function(){\n        const closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');\n        if(isset(closeButton)){\n            closeButton.addEventListener('click', CookieHandler.closeCookieMessage);\n        }\n    },\n\n    // Init the cookie overlay actions\n    initCookieOverlay: function(){\n\n        // Open the cookie settings event\n        const openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');\n        if(isset(openCookieSettingsButton)){\n            openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);\n        }\n\n        // Toggle of the tracking input\n        const toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');\n        if(isset(toggleTrackingInput)){\n\n            if(toggleTrackingInput.checked === true) {\n                CookieHandler.acceptTracking = true;\n            }\n\n            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);\n        }\n\n        // Accept / Save cookies button event\n        const acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');\n        if(isset(acceptButton)){\n            acceptButton.addEventListener('click', CookieHandler.setCookieSettings);\n        }\n\n    },\n\n    // Init the cookie switch actions\n    initCookieSwitch: function(){\n\n        // Toggle of the tracking input\n        const toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');\n        if(isset(toggleTrackingInput)){\n\n            // Force the state of the cookie switch input because the pop-up is forced on checked\n            // while the switch checks by php if the cookie really exist or not\n            if(toggleTrackingInput.checked === true) {\n                CookieHandler.acceptTracking = true;\n            }\n            else{\n                CookieHandler.acceptTracking = false;\n            }\n\n            toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);\n        }\n\n        // Save cookies button event\n        const saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');\n        if(isset(saveButton)){\n            saveButton.addEventListener('click', function(){\n                CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)\n                CookieHandler.setCookieSettings();\n            });\n        }\n\n    },\n\n    checkForCookieSettings: function(){\n        if (Cookie.get('cookieMessage')) {\n            CookieHandler.cookieMessage.classList.add('is-accepted');\n        }\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();"],"sourceRoot":""}