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