HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers95/rentman.io/wwwroot/js/site/app.js.map
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/vanilla-lazyload/dist/lazyload.min.js","webpack:///./resources/assets/js/site/scrollHandler.js","webpack:///./resources/assets/js/site/accordionHandler.js","webpack:///./resources/assets/js/site/bookADemoButtonHandler.js","webpack:///./resources/assets/js/site/browserHandler.js","webpack:///./resources/assets/js/site/chocolateFactory.js","webpack:///./resources/assets/js/site/cookieHandler.js","webpack:///./resources/assets/js/site/compareTableHandler.js","webpack:///./resources/assets/js/site/createPlanDropdownHandler.js","webpack:///./resources/assets/js/site/customerLogosHandler.js","webpack:///./resources/assets/js/site/mapsHandler.js","webpack:///./resources/assets/js/site/modalHandler.js","webpack:///./resources/assets/js/site/overlayMenuHandler.js","webpack:///./resources/assets/js/site/InputHandler.js","webpack:///./resources/assets/js/site/languageSelectorHandler.js","webpack:///./resources/assets/js/site/pricingDropdownHandler.js","webpack:///./resources/assets/js/site/pricingHandler.js","webpack:///./resources/assets/js/site/pricingSectionDropdownHandler.js","webpack:///./resources/assets/js/site/recruiteeHandler.js","webpack:///./resources/assets/js/site/resizeHandler.js","webpack:///./resources/assets/js/site/scrollToHandler.js","webpack:///./resources/assets/js/site/searchHandler.js","webpack:///./resources/assets/js/site/shareButtonsHandler.js","webpack:///./resources/assets/js/site/submenuHandler.js","webpack:///./resources/assets/js/site/tabHandler.js","webpack:///./resources/assets/js/site/tabSliderHandler.js","webpack:///./resources/assets/js/site/timelineHandler.js","webpack:///./resources/assets/js/site/youtubeHandler.js","webpack:///./resources/assets/js/site/youtubeModalHandler.js","webpack:///./resources/assets/js/site/slideProjectorHandler.js","webpack:///./resources/assets/js/site/sliderHandler.js","webpack:///./resources/assets/js/site/updateGridHandler.js","webpack:///./resources/assets/js/site/customerLogoSliderHandler.js","webpack:///./resources/assets/js/site/Announcements.js","webpack:///./resources/assets/js/site/app.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","assign","arguments","length","e","apply","this","window","navigator","test","userAgent","document","createElement","a","devicePixelRatio","elements_selector","container","threshold","thresholds","data_src","data_srcset","data_sizes","data_bg","data_bg_hidpi","data_bg_multi","data_bg_multi_hidpi","data_bg_set","data_poster","class_applied","class_loading","class_loaded","class_error","class_entered","class_exited","unobserve_completed","unobserve_entered","cancel_on_exit","callback_enter","callback_exit","callback_applied","callback_loading","callback_loaded","callback_error","callback_finish","callback_cancel","use_native","restore_on_error","CustomEvent","detail","instance","createEvent","initCustomEvent","dispatchEvent","u","f","_","g","v","b","h","y","getAttribute","k","w","setAttribute","removeAttribute","A","L","O","x","C","N","classList","add","className","M","remove","replace","RegExp","z","llTempImage","T","_observer","unobserve","R","loadingCount","G","toLoadCount","j","children","tagName","push","D","parentNode","forEach","H","V","F","B","J","P","S","U","$","q","K","Q","W","X","Y","IMG","IFRAME","VIDEO","load","OBJECT","Z","nn","tn","addEventListener","llEvLisnrs","en","removeEventListener","on","an","rn","cn","ln","indexOf","backgroundImage","style","concat","split","map","join","un","sn","dn","_n","gn","HTMLImageElement","bn","Array","slice","mn","querySelectorAll","pn","hn","filter","En","_settings","IntersectionObserver","isIntersecting","intersectionRatio","target","vn","root","rootMargin","_onlineHandler","update","disconnect","observe","loadAll","destroy","restoreAll","fn","resetStatus","lazyLoadOptions","ScrollHandler","time","Date","now","timeout","waitThrottle","waitDebounce","lastScrollTopPosition","scrollDirectionDown","scrollDirectionUp","init","triggerOnInit","triggerThrottle","triggerSmooth","isset","clearTimeout","setTimeout","triggerDebounce","triggerElementInViewportAnimation","triggerElementFullyInViewportAnimation","detectScrollDirection","toggleStickyHeader","toggleStickyOverlayMenu","detectIfElementIsPartlyInViewport","el","rect","getBoundingClientRect","windowHeight","innerHeight","documentElement","clientHeight","windowWidth","innerWidth","clientWidth","verticalInView","top","height","horizontalInView","left","width","detectIfElementIsFullyInViewport","bottom","scrollTopPosition","pageYOffset","scrollTop","elements","elementsLength","element","stickyHeader","querySelector","subnavList","subNavIsVisible","getComputedStyle","visibility","body","openStickyMenus","mobileNavigation","contains","AccordionHandler","accordionList","accordionListCount","accordion","initAccordion","toggleList","toggleItem","pointerEvents","toggleAccordion","event","item","itemList","preventDefault","toggle","BookADemoButtonHandler","triggerButtons","hubspot","HubSpotConversations","history","pushState","widget","refresh","open","BrowserHandler","browserInfo","getBrowserInfo","handleIE","handleSafari","msie","ielt11","ie11","match","version","parseInt","substring","getElementsByTagName","tem","ua","exec","appName","appVersion","splice","ChocolateFactory","bannedVisitor","enter","chocolateFactories","amountOfChocolateFactories","ChocolateBar","_flashTicket","chocolateBar","goldenTicket","enjoyTheTour","console","log","chocolateFactory","tourGroup","oompaLoompas","amountOfOompaLoompas","tourGroupSize","visitor","visitorName","_isVisitorBanned","_getArrangement","_finishTour","nodeName","group","_addWillieWonka","Ajax","post","HttpRequest","response","JSON","parse","status","_thanksForVisiting","redirectUrl","_giveFeedbackToMembers","errors","_unknownGapInFactory","_willie","feedbackArea","innerHTML","otherErrorMessages","_clearPreviousMarkedJackets","keys","jacket","visitorFeedbackArea","visitorNode","_grabVisitorJacket","visitorFeedback","visitorFeedbackAmount","visitorFeedbackLine","currentFeedbackArea","capitalizeFirstLetter","otherErrorMessagesHtml","markedJackets","markedJacketsAmount","currentLayer","safetyBreak","nextStop","location","CookieHandler","cookieBar","cookieOverlay","cookieMessage","cookieSwitch","cookieFadeOutAnimationDuration","acceptTracking","initCookieBar","initCookieOverlay","checkForCookieSettings","initCookieSwitch","closeButton","closeCookieMessage","openCookieSettingsButton","openCookieSettings","toggleTrackingInput","checked","toggleTrackingSetting","acceptButton","setCookieSettings","saveButton","Cookie","set","erase","reload","CompareTableHandler","compareTableList","compareTableListCount","toggleCompareTable","parentElement","createPlanDropdownHandler","dropdownToggler","toggleDropdown","isOpen","CustomerLogosHandler","customerLogosArea","amountEach","reorderLogos","moreLogosButton","showMoreLogos","hiddenCustomerLogos","hiddenCustomerLogosLength","amountToShow","request","amountOfActiveLogos","customerLogoList","customerLogos","data","customerLogo","customerLogoNode","id","insertBefore","firstChild","customerLogosNodes","MapsHandler","lat","lng","styling","getElementById","mapWidth","mapHeight","hasAttribute","parseFloat","setCustomStyling","google","maps","getScript","drawMap","Map","zoom","center","disableDefaultUI","styles","Marker","position","icon","ModalHandler","triggers","activeHash","modal","modalThead","modalHeader","self","hash","substr","toggleOverlay","currentTarget","bodyScrollLock","enableBodyScroll","handleKeyPressed","modalOverlayScroller","title","pathname","search","disableBodyScroll","closeButtons","getElementsByClassName","OverlayMenuHandler","overlayMenuTrigger","initOverlayMenu","overlayNavSubmenuTriggers","toggleSubMenu","toggleOverlayMenu","overlayMenu","overlayMenuBody","evt","menu","InputHandler","inputFields","inputLength","input","inputId","inputLabel","addEventListenersToInput","removeFocus","loopedInput","addFocus","errorMessage","inputValue","LanguageSelectorHandler","languageSelectors","languageSelectorsCount","languageSelector","initLanguageSelector","node","languageIso","link","href","PricingDropdownHandler","firstItem","dropdownItems","display","PricingHandler","pricingSwitch","pricingSymbolsList","pricingPricesList","pricingSymbols","preventClickElements","count","toggleCurrency","symbol","elem","eur","usd","price","textContent","PricingSectionDropdownHandler","RecruiteeHandler","readMoreTranslation","jobs","jobKeys","amountOfJobs","recruiteeOverlay","overlayedJob","description","requirement","applyLink","navigation","previous","next","handleAjax","toggleRecruiteeOverlay","setJob","recruiteeHtml","offers","appendJob","jobElements","error","jobId","job","requirements","careers_apply_url","jobKey","previousKey","nextKey","html","department","ResizeHandler","squareableElements","squareableElement","ratio","minHeight","ScrollToHandler","duration","start","change","currentTime","allowAnimation","scrollToAnimation","easing","anchorLinks","anchorLinksAmount","elementId","scrollToElement","prepareScrollTo","offset","scrollToElementPosition","Math","max","startTime","performance","getTime","requestAnimationFrame","animateScroll","abortScrollAnimation","timestamp","progress","min","EasingFunctions","newScrollTop","cancelAnimationFrame","SearchHandler","form","searchBar","resultHolder","searchUrl","dataset","languageId","debug","debounce","term","page","amount","language_id","xhr","XMLHttpRequest","token","content","queryParams","queryUrlPart","param","encodeURIComponent","responseType","setRequestHeader","onreadystatechange","readyState","processSearchResponse","statusText","send","validateSearchResponse","removeChild","items","index","type","attributes","translation","appendChild","innerText","ShareButtonsHandler","shareButtonsElement","shareMessageElement","shareMessage","convertShareMessageToObject","buttons","buttonsLength","button","social","functionName","messageObject","attributesLength","attribute","attributeName","snakeToCamel","clickFacebookButton","FB","ui","method","mobile_iframe","url","clickTwitterButton","encodeName","encodeUrl","clickLinkedinButton","encodeSummary","clickMailButton","clickLinkButton","select","copyToClipboard","flashMessage","SubmenuHandler","activeMenu","submenuTriggers","toggleMenu","subsubmenuTriggers","subsubmenuTrigger","mouseIn","mouseOut","listenerToClickOutside","clickOutsideMenu","outsideClick","toggleSubmenu","direction","subMenu","subsubMenu","notelem","clickedOut","TabHandler","tabContainer","tabs","intendedTab","tab","activeTab","deactivateAllTabs","tabNumber","activateTabs","TabsliderHandler","tabsliderList","tabslider","currentIndex","tabsliderListCount","initTabslider","images","arrow_prev","arrow_next","toggleTabslider","tabId","tabsliderTab","tabsliderTrigger","closest","tabsliderImage","TimelineHandler","timeline","lastUpdateYear","updatesRoute","readMoreLabel","getMoreUpdates","languageString","lang","currentAmountOfUpdates","addUpdateToTimeline","json","timelineContent","timelineContentHtml","updates","date","year","_appendTimelineYearItem","_appendTimelineItem","updatesLeft","month","day","monthName","image","slug","YoutubeHandler","youtubeClass","players","youtubePlayers","youtubePlayersAmount","youtubePlayer","youtubeElement","autoPlay","initYoutube","YT","Player","onYouTubePlayerAPIReady","loadPlayers","player","videoId","host","playerVars","modestbranding","rel","disablekb","autoplay","mute","events","onStateChange","onReady","playerContainerId","getIframe","PlayerState","ENDED","playVideo","YoutubeModalHandler","youtubeModal","youtubeId","video","openModal","loadVideoById","stopVideo","SliderProjectorSetting","settingsObject","sliderId","definedPreviousNext","autoSlider","sliderInterval","navigationButtons","dots","captions","slideQuery","setSliderProjectorId","string","setDefinedPreviousNext","boolean","setAutoSlider","setSliderInterval","integer","setSlideQuery","setNavigationButtons","setDots","setCaptions","getSliderProjectorId","getDefinedPreviousNext","getAutoSlider","getSliderInterval","getSlideQuery","getNavigationButtons","getDots","getCaptions","prepareParameters","fill","settingsObjectKeys","settingsObjectLength","SliderProjector","settings","sliderObject","activeSlideId","previousSlideId","nextSlideId","availableSlides","slides","autoSliderInterval","setPreviousAndNextSlide","setSlide","swipeGestures","Hammer","resetAutoSlider","nextSlide","previousSlide","navigationButtonsLength","clickNavigationButton","dotsLength","clickDot","clearInterval","Number","isInteger","setInterval","slidesLength","slide","slideOrder","setActiveDot","setActiveCaption","navButton","clickedDot","dot","captionsLength","caption","SliderSetting","setSliderId","getSliderId","Slider","UpdateGridHandler","loadMoreButton","updateGridItems","updateCategoryId","activeUpdateCategory","clicks","endpoint","fetch","categoryId","insertAdjacentHTML","CustomerLogoSliderHandler","customerLogoSliderArea","customerLogoSlides","activeLogo","lazyLoadInstance","replaceSources","hasSwipeEvents","_loadCountryBasedLogos","addEvents","addSwipeEvents","nextLogo","updateSlider","previousLogo","getLogoIds","customerLogosLength","customerLogoIds","customerLogoId","ids","finishLoading","resetLogosOrder","previousLocator","_calcPreviousPositions","previouser","_calcNextPositions","nexter","nexterLocator","$amount","customerLogosHtml","_prepareCustomerLogoHtml","alreadyRenderLogo","customerLogoContainer","currentInnerHtml","Announcements","announcements","country","announcement","countrySetting","countryIds","countries","CountrySetting","ALL","shouldFadeIn","SPECIFIC","includes","EXCEPT","fadeInDelay","getAllAnnouncements","getCountryByIp","then","showAnnouncements","serviceWorker","register","LazyLoad","announcementsElement","slideProjectors","slideProjectorContainers","slideProjectorContainersLength","slideProjectorId","slideProjectorSetting","Sliders","sliderContainers","sliderContainersLength","Slidersetting"],"mappings":"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","file":"/js/site/app.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","!function(n,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(n=\"undefined\"!=typeof globalThis?globalThis:n||self).LazyLoad=t()}(this,(function(){\"use strict\";function n(){return n=Object.assign||function(n){for(var t=1;t<arguments.length;t++){var e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n},n.apply(this,arguments)}var t=\"undefined\"!=typeof window,e=t&&!(\"onscroll\"in window)||\"undefined\"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),i=t&&\"IntersectionObserver\"in window,o=t&&\"classList\"in document.createElement(\"p\"),a=t&&window.devicePixelRatio>1,r={elements_selector:\".lazy\",container:e||t?document:null,threshold:300,thresholds:null,data_src:\"src\",data_srcset:\"srcset\",data_sizes:\"sizes\",data_bg:\"bg\",data_bg_hidpi:\"bg-hidpi\",data_bg_multi:\"bg-multi\",data_bg_multi_hidpi:\"bg-multi-hidpi\",data_bg_set:\"bg-set\",data_poster:\"poster\",class_applied:\"applied\",class_loading:\"loading\",class_loaded:\"loaded\",class_error:\"error\",class_entered:\"entered\",class_exited:\"exited\",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1,restore_on_error:!1},c=function(t){return n({},r,t)},l=function(n,t){var e,i=\"LazyLoad::Initialized\",o=new n(t);try{e=new CustomEvent(i,{detail:{instance:o}})}catch(n){(e=document.createEvent(\"CustomEvent\")).initCustomEvent(i,!1,!1,{instance:o})}window.dispatchEvent(e)},u=\"src\",s=\"srcset\",d=\"sizes\",f=\"poster\",_=\"llOriginalAttrs\",g=\"data\",v=\"loading\",b=\"loaded\",m=\"applied\",p=\"error\",h=\"native\",E=\"data-\",I=\"ll-status\",y=function(n,t){return n.getAttribute(E+t)},k=function(n){return y(n,I)},w=function(n,t){return function(n,t,e){var i=\"data-ll-status\";null!==e?n.setAttribute(i,e):n.removeAttribute(i)}(n,0,t)},A=function(n){return w(n,null)},L=function(n){return null===k(n)},O=function(n){return k(n)===h},x=[v,b,m,p],C=function(n,t,e,i){n&&(void 0===i?void 0===e?n(t):n(t,e):n(t,e,i))},N=function(n,t){o?n.classList.add(t):n.className+=(n.className?\" \":\"\")+t},M=function(n,t){o?n.classList.remove(t):n.className=n.className.replace(new RegExp(\"(^|\\\\s+)\"+t+\"(\\\\s+|$)\"),\" \").replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")},z=function(n){return n.llTempImage},T=function(n,t){if(t){var e=t._observer;e&&e.unobserve(n)}},R=function(n,t){n&&(n.loadingCount+=t)},G=function(n,t){n&&(n.toLoadCount=t)},j=function(n){for(var t,e=[],i=0;t=n.children[i];i+=1)\"SOURCE\"===t.tagName&&e.push(t);return e},D=function(n,t){var e=n.parentNode;e&&\"PICTURE\"===e.tagName&&j(e).forEach(t)},H=function(n,t){j(n).forEach(t)},V=[u],F=[u,f],B=[u,s,d],J=[g],P=function(n){return!!n[_]},S=function(n){return n[_]},U=function(n){return delete n[_]},$=function(n,t){if(!P(n)){var e={};t.forEach((function(t){e[t]=n.getAttribute(t)})),n[_]=e}},q=function(n,t){if(P(n)){var e=S(n);t.forEach((function(t){!function(n,t,e){e?n.setAttribute(t,e):n.removeAttribute(t)}(n,t,e[t])}))}},K=function(n,t,e){N(n,t.class_applied),w(n,m),e&&(t.unobserve_completed&&T(n,t),C(t.callback_applied,n,e))},Q=function(n,t,e){N(n,t.class_loading),w(n,v),e&&(R(e,1),C(t.callback_loading,n,e))},W=function(n,t,e){e&&n.setAttribute(t,e)},X=function(n,t){W(n,d,y(n,t.data_sizes)),W(n,s,y(n,t.data_srcset)),W(n,u,y(n,t.data_src))},Y={IMG:function(n,t){D(n,(function(n){$(n,B),X(n,t)})),$(n,B),X(n,t)},IFRAME:function(n,t){$(n,V),W(n,u,y(n,t.data_src))},VIDEO:function(n,t){H(n,(function(n){$(n,V),W(n,u,y(n,t.data_src))})),$(n,F),W(n,f,y(n,t.data_poster)),W(n,u,y(n,t.data_src)),n.load()},OBJECT:function(n,t){$(n,J),W(n,g,y(n,t.data_src))}},Z=[\"IMG\",\"IFRAME\",\"VIDEO\",\"OBJECT\"],nn=function(n,t){!t||function(n){return n.loadingCount>0}(t)||function(n){return n.toLoadCount>0}(t)||C(n.callback_finish,t)},tn=function(n,t,e){n.addEventListener(t,e),n.llEvLisnrs[t]=e},en=function(n,t,e){n.removeEventListener(t,e)},on=function(n){return!!n.llEvLisnrs},an=function(n){if(on(n)){var t=n.llEvLisnrs;for(var e in t){var i=t[e];en(n,e,i)}delete n.llEvLisnrs}},rn=function(n,t,e){!function(n){delete n.llTempImage}(n),R(e,-1),function(n){n&&(n.toLoadCount-=1)}(e),M(n,t.class_loading),t.unobserve_completed&&T(n,e)},cn=function(n,t,e){var i=z(n)||n;on(i)||function(n,t,e){on(n)||(n.llEvLisnrs={});var i=\"VIDEO\"===n.tagName?\"loadeddata\":\"load\";tn(n,i,t),tn(n,\"error\",e)}(i,(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_loaded),w(t,b),C(e.callback_loaded,t,i),o||nn(e,i)}(0,n,t,e),an(i)}),(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_error),w(t,p),C(e.callback_error,t,i),e.restore_on_error&&q(t,B),o||nn(e,i)}(0,n,t,e),an(i)}))},ln=function(n,t,e){!function(n){return Z.indexOf(n.tagName)>-1}(n)?function(n,t,e){!function(n){n.llTempImage=document.createElement(\"IMG\")}(n),cn(n,t,e),function(n){P(n)||(n[_]={backgroundImage:n.style.backgroundImage})}(n),function(n,t,e){var i=y(n,t.data_bg),o=y(n,t.data_bg_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage='url(\"'.concat(r,'\")'),z(n).setAttribute(u,r),Q(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_multi),o=y(n,t.data_bg_multi_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage=r,K(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_set);if(i){var o=i.split(\"|\"),a=o.map((function(n){return\"image-set(\".concat(n,\")\")}));n.style.backgroundImage=a.join(),\"\"===n.style.backgroundImage&&(a=o.map((function(n){return\"-webkit-image-set(\".concat(n,\")\")})),n.style.backgroundImage=a.join()),K(n,t,e)}}(n,t,e)}(n,t,e):function(n,t,e){cn(n,t,e),function(n,t,e){var i=Y[n.tagName];i&&(i(n,t),Q(n,t,e))}(n,t,e)}(n,t,e)},un=function(n){n.removeAttribute(u),n.removeAttribute(s),n.removeAttribute(d)},sn=function(n){D(n,(function(n){q(n,B)})),q(n,B)},dn={IMG:sn,IFRAME:function(n){q(n,V)},VIDEO:function(n){H(n,(function(n){q(n,V)})),q(n,F),n.load()},OBJECT:function(n){q(n,J)}},fn=function(n,t){(function(n){var t=dn[n.tagName];t?t(n):function(n){if(P(n)){var t=S(n);n.style.backgroundImage=t.backgroundImage}}(n)})(n),function(n,t){L(n)||O(n)||(M(n,t.class_entered),M(n,t.class_exited),M(n,t.class_applied),M(n,t.class_loading),M(n,t.class_loaded),M(n,t.class_error))}(n,t),A(n),U(n)},_n=[\"IMG\",\"IFRAME\",\"VIDEO\"],gn=function(n){return n.use_native&&\"loading\"in HTMLImageElement.prototype},vn=function(n,t,e){n.forEach((function(n){return function(n){return n.isIntersecting||n.intersectionRatio>0}(n)?function(n,t,e,i){var o=function(n){return x.indexOf(k(n))>=0}(n);w(n,\"entered\"),N(n,e.class_entered),M(n,e.class_exited),function(n,t,e){t.unobserve_entered&&T(n,e)}(n,e,i),C(e.callback_enter,n,t,i),o||ln(n,e,i)}(n.target,n,t,e):function(n,t,e,i){L(n)||(N(n,e.class_exited),function(n,t,e,i){e.cancel_on_exit&&function(n){return k(n)===v}(n)&&\"IMG\"===n.tagName&&(an(n),function(n){D(n,(function(n){un(n)})),un(n)}(n),sn(n),M(n,e.class_loading),R(i,-1),A(n),C(e.callback_cancel,n,t,i))}(n,t,e,i),C(e.callback_exit,n,t,i))}(n.target,n,t,e)}))},bn=function(n){return Array.prototype.slice.call(n)},mn=function(n){return n.container.querySelectorAll(n.elements_selector)},pn=function(n){return function(n){return k(n)===p}(n)},hn=function(n,t){return function(n){return bn(n).filter(L)}(n||mn(t))},En=function(n,e){var o=c(n);this._settings=o,this.loadingCount=0,function(n,t){i&&!gn(n)&&(t._observer=new IntersectionObserver((function(e){vn(e,n,t)}),function(n){return{root:n.container===document?null:n.container,rootMargin:n.thresholds||n.threshold+\"px\"}}(n)))}(o,this),function(n,e){t&&(e._onlineHandler=function(){!function(n,t){var e;(e=mn(n),bn(e).filter(pn)).forEach((function(t){M(t,n.class_error),A(t)})),t.update()}(n,e)},window.addEventListener(\"online\",e._onlineHandler))}(o,this),this.update(e)};return En.prototype={update:function(n){var t,o,a=this._settings,r=hn(n,a);G(this,r.length),!e&&i?gn(a)?function(n,t,e){n.forEach((function(n){-1!==_n.indexOf(n.tagName)&&function(n,t,e){n.setAttribute(\"loading\",\"lazy\"),cn(n,t,e),function(n,t){var e=Y[n.tagName];e&&e(n,t)}(n,t),w(n,h)}(n,t,e)})),G(e,0)}(r,a,this):(o=r,function(n){n.disconnect()}(t=this._observer),function(n,t){t.forEach((function(t){n.observe(t)}))}(t,o)):this.loadAll(r)},destroy:function(){this._observer&&this._observer.disconnect(),t&&window.removeEventListener(\"online\",this._onlineHandler),mn(this._settings).forEach((function(n){U(n)})),delete this._observer,delete this._settings,delete this._onlineHandler,delete this.loadingCount,delete this.toLoadCount},loadAll:function(n){var t=this,e=this._settings;hn(n,e).forEach((function(n){T(n,t),ln(n,e,t)}))},restoreAll:function(){var n=this._settings;mn(n).forEach((function(t){fn(t,n)}))}},En.load=function(n,t){var e=c(t);ln(n,e)},En.resetStatus=function(n){A(n)},t&&function(n,t){if(t)if(t.length)for(var e,i=0;e=t[i];i+=1)l(n,e);else l(n,t)}(En,window.lazyLoadOptions),En}));\n","/* ==========================================================================\n   Scroll handler\n   - Handler the objects which are bind on scroll events or visible in viewport\n ========================================================================== */\n\nexport const 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        ScrollHandler.triggerElementFullyInViewportAnimation();\n    },\n\n    // Trigger scroll functions with throttle (preferred)\n    triggerThrottle: function () {\n        // console.log('Throttled scroll');\n        ScrollHandler.triggerElementInViewportAnimation();\n        ScrollHandler.triggerElementFullyInViewportAnimation();\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        ScrollHandler.toggleStickyOverlayMenu();\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\n        if (scrollTopPosition == ScrollHandler.lastScrollTopPosition){\n            return;\n        }\n        else 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 'js-partly-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('.js-partly-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('js-partly-in-viewport');\n            }\n        }\n    },\n\n    // Trigger animation on elements that have 'js-fully-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    triggerElementFullyInViewportAnimation: function () {\n        const elements = document.querySelectorAll('.js-fully-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.detectIfElementIsFullyInViewport(element)){\n                element.classList.remove('js-fully-in-viewport');\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\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                const openStickyMenus = stickyHeader.querySelectorAll('.js-submenu.is-open');\n                if(isset(openStickyMenus) && openStickyMenus.length > 0) {\n                    for(let i = 0; i < openStickyMenus.length; i++) {\n                        openStickyMenus[i].classList.remove('is-open');\n                    }\n                }\n            }\n            // Show when scrolling UP and outside of offset\n            else {\n                document.body.classList.add(visibleStickyHeaderClass);\n            }\n        }\n    },\n\n    toggleStickyOverlayMenu: function () {\n        const mobileNavigation = document.querySelector('.js-overlay-menu');\n        const toggleBarClass = 'is-bar-hidden';\n\n        // Also check if overlay menu isn't active/opened\n        if(isset(mobileNavigation) && !document.body.classList.contains('is-overlay-menu-active') ){\n            // Hide mobile navigation when scrolling down\n            if(ScrollHandler.scrollDirectionDown && ScrollHandler.lastScrollTopPosition >= 60){\n                mobileNavigation.classList.add(toggleBarClass);\n            }\n            // When scrolling back up\n            else {\n                mobileNavigation.classList.remove(toggleBarClass);\n            }\n        }\n    },\n\n};\n","/* ==========================================================================\n   Accordion handler\n   - Handles the accordion component which has the proper classes.\n ========================================================================== */\n\nexport const AccordionHandler = {\n\n    init: function () {\n\n        const accordionList = document.querySelectorAll('.js-accordion');\n        const accordionListCount = accordionList.length;\n\n        if(isset(accordionList) && accordionListCount !== 0){\n            for(let i = 0; i < accordionListCount; i++){\n                const accordion = accordionList[i];\n                AccordionHandler.initAccordion(accordion);\n            }\n        }\n    },\n\n    initAccordion: function (accordion) {\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 = accordion.querySelectorAll('.js-accordion-toggle');\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        accordion.addEventListener('click', AccordionHandler.toggleAccordion, false);\n    },\n\n    toggleAccordion: 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('js-accordion-toggle')) return;\n\n        // Check if content element exists\n        if (!item.querySelector('.js-accordion-content')) return;\n\n        // Prevent default link behavior\n        event.preventDefault();\n\n        // If the item is already active, collapse it and quit\n        if (item.classList.contains('is-active')) {\n            item.classList.remove('is-active');\n            return;\n        }\n\n        // Loop through all open accordion items, and close them\n        for (var i = 0; i < itemList.length; i++) {\n            itemList[i].classList.remove('is-active');\n        }\n\n        // Toggle our content by setting the active class\n        item.classList.toggle('is-active');\n    }\n};","export const BookADemoButtonHandler = {\n\n    init: function () {\n\n        const triggerButtons = document.querySelectorAll('.js-trigger-demo-chat');\n\n        if (isset(triggerButtons) && triggerButtons !== 0) {\n\n            for (let i = 0; i < triggerButtons.length; i++) {\n\n                const triggerButton = triggerButtons[i];\n\n                triggerButton.addEventListener('click', function (event) {\n\n                    if(isset(window.hubspot) && isset(window.HubSpotConversations)){\n\n                        event.preventDefault();\n\n                        history.pushState(null, null, '?bookdemo=en');\n\n                        window.HubSpotConversations.widget.refresh();\n\n                        setTimeout(function () {\n                            // window.hubspot.messages.EXPERIMENTAL_API.requestWidgetOpen();\n                            window.HubSpotConversations.widget.open();\n                        }, 400);\n                    }\n\n                });\n            }\n        }\n    },\n};","/* ==========================================================================\n   Browser Handler\n ========================================================================== */\n\nexport const 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 | 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\nexport const 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        const otherErrorMessages = chocolateFactory.querySelector('.js-other-errors');\n        if(isset(otherErrorMessages)) otherErrorMessages.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                else{\n\n                    let otherErrorMessagesHtml = otherErrorMessages.innerHTML;\n                    otherErrorMessagesHtml += '<div>' + capitalizeFirstLetter(visitorFeedbackLine) + '</div>';\n\n                    otherErrorMessages.innerHTML = otherErrorMessagesHtml;\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            const errorMessage = markedJackets[i].querySelector('.js-form-element-error');\n            errorMessage.innerHTML = '';\n\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   Cookie handler\n   - Primary usage for toggling the cookie message and/or switch\n ========================================================================== */\n\nexport const 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.querySelector('.js-subfooter').classList.add('c-subfooter--cookie-padding');\n        }\n    },\n\n    closeCookieMessage: function (){\n        Cookie.set('cookieMessage', true, 90);\n        CookieHandler.cookieMessage.classList.add('fade-out');\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   CompareTableHandler handler\n   - Handles the CompareTable component which has the proper classes.\n ========================================================================== */\n\nexport const CompareTableHandler = {\n\n    init: function () {\n\n        const compareTableList = document.querySelectorAll('.js-compare-table');\n        const compareTableListCount = compareTableList.length;\n\n        if(isset(compareTableList) && compareTableListCount !== 0){\n            for(let i = 0; i < compareTableListCount; i++){\n                const compareTable = compareTableList[i];\n                compareTable.addEventListener('click', CompareTableHandler.toggleCompareTable, false);\n            }\n        }\n    },\n\n    toggleCompareTable: function (event) {\n        const item = event.target;\n\n        // Bail if we didn't click on the toggle element\n        if (!item.classList.contains('js-toggle-description')) return;\n\n        item.classList.toggle('hide-description');\n        item.parentElement.classList.toggle('is-open');\n\n        // var index = indexInParent(item);\n        // var parentIndex = indexInParent(item.parentNode);\n        // var packages = item.closest('.js-compare-table').querySelectorAll('.package');\n        //\n        // for (var i = 0; i < packages.length; i++) {\n        //     var section = packages[i].children[parentIndex];\n        //     section.children[index].classList.toggle('open');\n        // }\n        //\n        // // Toggle our content by setting the active class\n        // item.classList.toggle('open');\n    }\n};\n","export const createPlanDropdownHandler = {\n\n    init: function () {\n\n        const dropdownToggles = document.querySelectorAll('.js-create-plan-dropdown');\n\n        dropdownToggles.forEach(dropdownToggler => {\n            dropdownToggler.addEventListener('click', (e) => this.toggleDropdown(e.target));\n            dropdownToggler.isOpen = false;\n        });\n    },\n\n    toggleDropdown: function (toggle) {\n        toggle.classList.toggle('is-open');\n    }\n}\n","/* ==========================================================================\n   Customer logos handler\n   - Show more logos on button click.\n ========================================================================== */\nexport const CustomerLogosHandler = {\n\n    customerLogosArea: null,\n    amountEach: 8,\n\n    init: function () {\n\n        CustomerLogosHandler.customerLogosArea = document.querySelector('.js-customer-logos');\n\n        // Only continue the init if the customer logo area is found\n        if (isset(CustomerLogosHandler.customerLogosArea)) {\n\n            Ajax.get('/api/customerLogos/slider?limit=0', CustomerLogosHandler.reorderLogos);\n\n            // Add click event to button to load more updates\n            const moreLogosButton = CustomerLogosHandler.customerLogosArea.querySelector('.js-show-more-logos');\n            if(isset(moreLogosButton)){\n                moreLogosButton.addEventListener('click', CustomerLogosHandler.showMoreLogos);\n            }\n        }\n    },\n\n    /**\n     * Show more logos\n     * and possibly remove more button\n     */\n    showMoreLogos: function () {\n\n        // Get the hidden customer logos and remove\n        const hiddenCustomerLogos = CustomerLogosHandler.customerLogosArea.querySelectorAll('.js-customer-logo.is-hidden');\n        const hiddenCustomerLogosLength = hiddenCustomerLogos.length;\n\n        // Get the amount to grab\n        let amountToShow = CustomerLogosHandler.amountEach;\n\n        // Check if the amount of hidden logos is the less or equal, equal so we know when to remove the button\n        if(amountToShow >= hiddenCustomerLogosLength){\n\n            // Overwrite the amountToShow to prevent error\n            amountToShow = hiddenCustomerLogosLength;\n\n            // Remove button area\n            CustomerLogosHandler.customerLogosArea.querySelector('.js-show-more-logos-container').remove();\n        }\n\n        for(let i = 0; i < amountToShow; i++)\n        {\n            const hiddenCustomerLogo = hiddenCustomerLogos[i];\n            hiddenCustomerLogo.classList.remove('is-hidden');\n        }\n    },\n\n    reorderLogos: function (request) {\n\n        const amountOfLogos = CustomerLogosHandler.customerLogosArea.querySelectorAll('.c-logos__item').length;\n        const amountOfHiddenLogos = CustomerLogosHandler.customerLogosArea.querySelectorAll('.c-logos__item.is-hidden').length;\n        const amountOfActiveLogos = amountOfLogos - amountOfHiddenLogos;\n\n        const customerLogoList = CustomerLogosHandler.customerLogosArea.querySelector('.js-customer-logos-list');\n\n        if(request.status === 200) {\n\n            const customerLogoResponse = JSON.parse(request.response);\n            const customerLogos = customerLogoResponse.data;\n\n            // Loop through the customer logos from the ajax response\n            for(let i = 0; i < customerLogos.length; i++) {\n                const customerLogo = customerLogos[i];\n                const customerLogoNode = CustomerLogosHandler.customerLogosArea.querySelector('.c-logos__item[data-customer-id=\"' + customerLogo.id + '\"]');\n\n                // If the customer logo node is found append it to the front\n                if(isset(customerLogoNode)) customerLogoList.insertBefore(customerLogoNode, customerLogoList.firstChild);\n            }\n        }\n\n        // Then reset the active labels.\n        const customerLogosNodes = customerLogoList.querySelectorAll('.c-logos__item');\n        for(let i = 0; i < customerLogosNodes.length; i++){\n\n            const customerLogoNode = customerLogosNodes[i];\n            if(i < amountOfActiveLogos) customerLogoNode.classList.remove('is-hidden');\n            else customerLogoNode.classList.add('is-hidden');\n        }\n    }\n\n};\n","/* ==========================================================================\n    Google Maps handler\n    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map\n ========================================================================== */\n\nexport const MapsHandler = {\n\n    map: '',\n    key: 'AIzaSyBbqF_8gcFAkSYusr2dxHWwdKWDUjebCM0',\n    location: {lat: 51.2618222, lng: 5.5965538},\n    styling: '',\n\n    init: function () {\n        // Get map by id\n        MapsHandler.map = document.getElementById('map');\n\n        // Check if a map is defined\n        if (isset(MapsHandler.map)) {\n\n            //create height of element\n            var mapWidth = window.getComputedStyle(MapsHandler.map).width;\n            mapWidth = parseInt(mapWidth.slice(0, -2));\n            let mapHeight = mapWidth / 2;\n            if (mapHeight < 350) mapHeight = 350;\n            if (mapHeight > 400) mapHeight = 400;\n            MapsHandler.map.style.height = mapHeight + 'px';\n\n            if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));\n            if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));\n\n            MapsHandler.setCustomStyling();\n\n            // See if google variable exists\n            if (typeof (google) == 'undefined' || typeof (google.maps) == 'undefined') {\n                // Load external script\n                getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);\n            } else {\n                MapsHandler.drawMap()\n            }\n\n        }\n    },\n\n    drawMap: function () {\n        // Create a map\n        const map = new google.maps.Map(MapsHandler.map, {\n            zoom: 14,\n            center: MapsHandler.location,\n            disableDefaultUI: true,\n            styles: MapsHandler.styling\n        });\n        // Add a marker\n        const marker = new google.maps.Marker({\n            position: MapsHandler.location,\n            map: map,\n            icon: '/img/googleMapsMarker.png'\n        });\n    },\n\n    setCustomStyling: function () {\n\n        MapsHandler.styling = [\n            {\n                \"featureType\": \"landscape\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"hue\": \"#FFBB00\"\n                    },\n                    {\n                        \"saturation\": 43.400000000000006\n                    },\n                    {\n                        \"lightness\": 37.599999999999994\n                    },\n                    {\n                        \"gamma\": 1\n                    }\n                ]\n            },\n            {\n                \"featureType\": \"poi\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"saturation\": -1.0989010989011234\n                    },\n                    {\n                        \"lightness\": 11.200000000000017\n                    },\n                    {\n                        \"gamma\": 1\n                    },\n                    {\n                        \"visibility\": \"on\"\n                    }\n                ]\n            },\n            {\n                \"featureType\": \"road.highway\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"hue\": \"#FFC200\"\n                    },\n                    {\n                        \"saturation\": -61.8\n                    },\n                    {\n                        \"lightness\": 45.599999999999994\n                    },\n                    {\n                        \"gamma\": 1\n                    }\n                ]\n            },\n            {\n                \"featureType\": \"road.arterial\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"hue\": \"#FF0300\"\n                    },\n                    {\n                        \"saturation\": -100\n                    },\n                    {\n                        \"lightness\": 51.19999999999999\n                    },\n                    {\n                        \"gamma\": 1\n                    }\n                ]\n            },\n            {\n                \"featureType\": \"road.local\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"hue\": \"#FF0300\"\n                    },\n                    {\n                        \"saturation\": -100\n                    },\n                    {\n                        \"lightness\": 52\n                    },\n                    {\n                        \"gamma\": 1\n                    }\n                ]\n            },\n            {\n                \"featureType\": \"water\",\n                \"elementType\": \"all\",\n                \"stylers\": [\n                    {\n                        \"hue\": \"#0078FF\"\n                    },\n                    {\n                        \"saturation\": -13.200000000000003\n                    },\n                    {\n                        \"lightness\": 2.4000000000000057\n                    },\n                    {\n                        \"gamma\": 1\n                    }\n                ]\n            }\n        ];\n    }\n};\n","/* ==========================================================================\n   ModalHandler\n ========================================================================== */\n \nexport const ModalHandler = {\n\n    triggers: null,\n    activeHash: null,\n    modal: null,\n\n    init: function () {\n\n        // get all modals\n        const modals = document.querySelectorAll('.o-modal__content');\n        modals.forEach(modal => {\n            // if modal has thead, set top to height of modal header (stacked sticky elements offset)\n            const modalThead = modal.querySelector('.o-modal__thead');\n            const modalHeader = modal.querySelector('.o-modal__header');\n            if (modalThead) { modalThead.style.top = `${modalHeader.clientHeight}px` }\n        })\n\n        const self = this\n        ModalHandler.triggers = document.querySelectorAll('.js-modal-trigger');\n\n        if(window.location.hash) {\n            let hash = window.location.hash;\n            self.activeHash = hash.substr(1)\n\n            ModalHandler.modal = document.querySelector('.js-modal[data-hash=\"' + self.activeHash + '\"]');\n            if(ModalHandler.modal) ModalHandler.toggleOverlay()\n        }\n\n\n        for(let i = 0; i < ModalHandler.triggers.length; i++) {\n\n            const modalTrigger = ModalHandler.triggers[i];\n\n            modalTrigger.addEventListener('click', function () {\n\n                const el = event.currentTarget;\n                let hash = el.getAttribute('href');\n                self.activeHash = hash.substr(1)\n\n                ModalHandler.modal = document.querySelector('.js-modal[data-hash=\"' + self.activeHash + '\"]');\n                 if(ModalHandler.modal) ModalHandler.toggleOverlay()\n            });\n        }\n    },\n\n    toggleOverlay: function () {\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(ModalHandler.modal);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (ModalHandler.modal.classList.contains('is-active')) {\n\n            window.removeEventListener(\"keydown\", ModalHandler.handleKeyPressed);\n\n            // Trigger fade out animation\n            ModalHandler.modal.classList.add('fade-out');\n\n            // Then remove the classes\n            setTimeout(function () {\n\n                // Reset the scroll position on close to top\n                const modalOverlayScroller = ModalHandler.modal.querySelector('.js-modal-scroller');\n                if(modalOverlayScroller) modalOverlayScroller.scrollTop = 0;\n\n                ModalHandler.modal.classList.remove('is-active');\n                ModalHandler.modal.classList.remove('fade-out');\n\n                history.pushState(\"\", document.title, window.location.pathname + window.location.search);\n\n            }, 300);\n\n            return;\n        }\n\n        window.addEventListener(\"keydown\", ModalHandler.handleKeyPressed);\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(ModalHandler.modal);\n\n        // Toggle active overlayMenu by setting a class on the body\n        ModalHandler.modal.classList.toggle('is-active');\n\n        const closeButtons = ModalHandler.modal.getElementsByClassName('js-close-modal');\n        for( let i = 0; i < closeButtons.length; i++) {\n            closeButtons[i].addEventListener('click', function () {\n                ModalHandler.toggleOverlay();\n            });\n        }\n\n    },\n\n    /**\n     *\n     * @param {KeyboardEvent} event\n     * @return {undefined}\n     */\n    handleKeyPressed: function (event) {\n        switch (event.key) {\n            case 'Escape':\n                ModalHandler.toggleOverlay();\n            default:\n        }\n\n    },\n\n};\n","/* ==========================================================================\n   Navigation handler\n   - Handles the showing and hiding of the overlay-menu component which has the proper classes.\n ========================================================================== */\n\nexport const OverlayMenuHandler = {\n\n    init: function () {\n        const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');\n        OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);\n\n        const overlayNavSubmenuTriggers = document.querySelectorAll('.js-overlay-menu-trigger');\n        if(isset(overlayNavSubmenuTriggers) && overlayNavSubmenuTriggers.length > 0){\n            for(let i = 0; i < overlayNavSubmenuTriggers.length; i++){\n                const overlayNavSubmenuTrigger = overlayNavSubmenuTriggers[i];\n\n                overlayNavSubmenuTrigger.addEventListener('click', OverlayMenuHandler.toggleSubMenu)\n            }\n        }\n    },\n\n    initOverlayMenu: function (overlayMenuTrigger) {\n        overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);\n    },\n\n    toggleOverlayMenu: function (event) {\n        const overlayMenu = 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 (!overlayMenu) return;\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(overlayMenuBody);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (document.body.classList.contains('is-overlay-menu-active')) {\n            document.body.classList.remove('is-overlay-menu-active');\n            return;\n        }\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(overlayMenuBody);\n\n        // Toggle active overlayMenu by setting a class on the body\n        document.body.classList.toggle('is-overlay-menu-active');\n    },\n\n    toggleSubMenu: function (evt) {\n        evt.currentTarget.classList.toggle('toggled');\n\n        const el = evt.currentTarget.parentElement;\n        const menu = el.querySelector('.js-overlay-menu-target');\n        if(isset(menu)) menu.classList.toggle('is-open');\n    },\n};\n","/* ==========================================================================\n    Input handler\n\n    This handler can be remove when the css support for :focus-within is better\n ========================================================================== */\n\nexport const InputHandler = {\n\n    inputFields: null,\n\n    init : function()\n    {\n        // Get the form inputs\n        InputHandler.inputFields = document.querySelectorAll('form input, form textarea');\n\n        const inputLength = InputHandler.inputFields.length;\n        for(let i = 0; i < inputLength; i++){\n\n            const input = InputHandler.inputFields[i];\n            const inputId = input.getAttribute('id');\n\n            // Check if there is an id on the input\n            if(isset(inputId)){\n\n                const inputLabel = document.querySelector('form label[for=\"'+inputId+'\"]');\n\n                // // And if there is a belonging label\n                if(isset(inputLabel)){\n                    InputHandler.addEventListenersToInput(input);\n                }\n            }\n\n        }\n    },\n\n    addEventListenersToInput : function(input)\n    {\n        // Add the fill class and trigger removeFocus so the input will be automatic be marked as filled or not\n        const parentElement = input.parentNode;\n        parentElement.classList.add('filled');\n        InputHandler.removeFocus(input);\n\n        input.addEventListener('focus', function () {\n\n            // We loop through the input elements because autocomplete (on chrome) triggers al the focus elements but none focus out\n            const inputLength = InputHandler.inputFields.length;\n            for(let i = 0; i < inputLength; i++){\n                const loopedInput = InputHandler.inputFields[i];\n\n                // Trigger add focus on this focused element\n                if(loopedInput === input){\n                    InputHandler.addFocus(this);\n                }\n                // Remove focus on all other input/textarea elements\n                else{\n                    InputHandler.removeFocus(loopedInput);\n                }\n            }\n\n        });\n\n        input.addEventListener('focusout', function () {\n            InputHandler.removeFocus(this);\n        });\n\n    },\n\n    addFocus  : function (input) {\n        if(isset(input)) {\n\n            const inputId = input.getAttribute('id');\n\n            const parentElement = input.parentNode;\n            parentElement.classList.add('focused');\n            parentElement.classList.add('filled');\n\n            // If there is a error message remove it on focus\n            const errorMessage = document.querySelector('form .error-message#' + inputId + '-error');\n            if (isset(errorMessage)) {\n                errorMessage.classList.add('fade-out');\n            }\n        }\n\n    },\n\n    // Reset the label location only if the input is empty\n    removeFocus : function (input) {\n        if(isset(input)){\n\n            const inputValue = input.value;\n\n            const parentElement = input.parentNode;\n            parentElement.classList.remove('focused');\n\n            if(!isset(inputValue) || inputValue === ''){\n                parentElement.classList.remove('filled');\n            }\n        }\n    },\n\n};\n","/* ==========================================================================\n   Language Selector Handler\n   - Intercepts the link and first adds the language cookie before continuing\n ========================================================================== */\n\nexport const LanguageSelectorHandler = {\n\n    init: function () {\n\n        const languageSelectors = document.querySelectorAll('.js-language-selector');\n        const languageSelectorsCount = languageSelectors.length;\n\n        if (isset(languageSelectors) && languageSelectorsCount !== 0) {\n            for (let i = 0; i < languageSelectorsCount; i++) {\n                const languageSelector = languageSelectors[i];\n                LanguageSelectorHandler.initLanguageSelector(languageSelector);\n            }\n        }\n    },\n\n    initLanguageSelector: function (node) {\n        node.addEventListener('click', function (event) {\n            event.preventDefault();\n\n            const languageIso = node.getAttribute('data-language-iso');\n            const link = node.getAttribute('href');\n\n            // Set the cookie for 10 years\n            Cookie.set('RM-LANG', languageIso, 3650);\n\n            // Set location to link\n            window.location.href = link;\n        });\n    }\n};\n","export const PricingDropdownHandler = {\n\n    firstItem: null,\n    dropdownItems: null,\n    isOpen: false,\n\n    init: function () {\n        this.firstItem = document.querySelector('.c-pricing-dropdown__item--first');\n        this.dropdownItems = document.querySelector('.c-pricing-dropdown__nav');\n        this.firstItem ? this.firstItem.addEventListener('click', this.toggleDropdown) : null;\n    },\n\n    toggleDropdown: function () {\n        PricingDropdownHandler.dropdownItems.style.display = PricingDropdownHandler.isOpen ? 'none' : 'block';\n        PricingDropdownHandler.isOpen = !PricingDropdownHandler.isOpen;\n\n        PricingDropdownHandler.firstItem.classList.toggle('is-open');\n    }\n}\n","/* ==========================================================================\n   PricingHandler handler\n   - Handles the Pricing component which has the proper classes.\n ========================================================================== */\n\nexport const PricingHandler = {\n    pricingSwitch : null,\n    pricingSymbolsList : null,\n    pricingPricesList: null,\n    pricingSymbols: ['€', '$'],\n\n    init: function () {\n        PricingHandler.pricingSwitch = document.querySelector('.js-pricing-switch');\n        PricingHandler.pricingSymbolsList = document.querySelectorAll('.js-pricing-symbol');\n        PricingHandler.pricingPricesList = document.querySelectorAll('.js-pricing-price');\n        PricingHandler.preventClickElements = document.querySelectorAll('.js-pricing-prevent-click');\n\n        if(isset(PricingHandler.pricingSwitch) && PricingHandler.pricingSwitch.count !== 0) {\n            PricingHandler.pricingSwitch.addEventListener('change', PricingHandler.toggleCurrency, false);\n        }\n\n        for( let i = 0; i < PricingHandler.preventClickElements.length; i++) {\n            const preventClickElement =  PricingHandler.preventClickElements[i];\n            preventClickElement.addEventListener('click', function (event) {\n                event.preventDefault();\n            });\n        }\n\n    },\n\n    toggleCurrency: function (event) {\n        const toggle = event.target;\n\n        for (let i = 0; i < PricingHandler.pricingSymbolsList.length; i++) {\n            const symbol = toggle.checked ? PricingHandler.pricingSymbols[1] : PricingHandler.pricingSymbols[0];\n            PricingHandler.pricingSymbolsList[i].setAttribute('data-currency-symbol', symbol);\n        }\n\n        for (let i = 0; i < PricingHandler.pricingPricesList.length; i++) {\n            const symbol = toggle.checked ? PricingHandler.pricingSymbols[1] : PricingHandler.pricingSymbols[0];\n            const elem = PricingHandler.pricingPricesList[i];\n            const eur = elem.getAttribute('data-price-eur');\n            const usd = elem.getAttribute('data-price-usd');\n            const price = toggle.checked ? usd : eur;\n            elem.textContent = price;\n        }\n    }\n};\n\n","export const PricingSectionDropdownHandler = {\n\n    init: function () {\n\n        const dropdownToggles = document.querySelectorAll('.js-pricing-section-dropdown');\n\n        dropdownToggles.forEach(dropdownToggler => {\n            dropdownToggler.addEventListener('click', (e) => this.toggleDropdown(e.target));\n            dropdownToggler.isOpen = false;\n        });\n    },\n\n    toggleDropdown: function (toggle) {\n        toggle.classList.toggle('is-open');\n    }\n}\n","/* ==========================================================================\n   Recruitee handler\n   - Provide the timeline with new updates if needed.\n ========================================================================== */\n\nexport const RecruiteeHandler = {\n\n    element: null,\n    readMoreTranslation: null,\n    jobs: [],\n    jobKeys: [],\n    amountOfJobs: 0,\n    recruiteeOverlay: null,\n    overlayedJob: {\n        title: null,\n        description: null,\n        requirement: null,\n        applyLink: null,\n        navigation: null,\n        previous: null,\n        next: null,\n    },\n\n    init: function () {\n\n        RecruiteeHandler.element = document.getElementById('recruitee-jobs');\n        RecruiteeHandler.recruiteeOverlay = document.querySelector('.js-recruitee-job-overlay');\n\n        if(isset(RecruiteeHandler.element)) {\n\n            RecruiteeHandler.readMoreTranslation = RecruiteeHandler.element.getAttribute('data-read-more');\n\n            Ajax.get('https://rentman1.recruitee.com/api/offers', RecruiteeHandler.handleAjax);\n\n        }\n\n        if(isset(RecruiteeHandler.recruiteeOverlay)) {\n\n            // Bind element to overlayed job object\n            RecruiteeHandler.overlayedJob.title = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-title');\n            RecruiteeHandler.overlayedJob.description = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-description');\n            RecruiteeHandler.overlayedJob.requirement = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-requirements');\n            RecruiteeHandler.overlayedJob.applyLink = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-link');\n\n            RecruiteeHandler.overlayedJob.navigation = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-overlay-navigation');\n            RecruiteeHandler.overlayedJob.previous = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-overlay-previous');\n            RecruiteeHandler.overlayedJob.next = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-overlay-next');\n\n            // Add toggle (close) events to all the close buttons\n            const closeButtons = RecruiteeHandler.recruiteeOverlay.getElementsByClassName('js-close-recruitee-job-overlay');\n\n            for( let i = 0; i < closeButtons.length; i++) {\n\n                closeButtons[i].addEventListener('click', function () {\n                    RecruiteeHandler.toggleRecruiteeOverlay();\n                });\n            }\n\n            // Add next and previous events to all the navigation buttons\n            RecruiteeHandler.overlayedJob.previous.addEventListener('click', function () {\n                RecruiteeHandler.setJob(this.getAttribute('data-job-id'));\n            });\n            RecruiteeHandler.overlayedJob.next.addEventListener('click', function () {\n                RecruiteeHandler.setJob(this.getAttribute('data-job-id'));\n            });\n\n        }\n    },\n\n    handleAjax: function (data) {\n\n        if(data.status !== 200) {\n            console.error('RecruiteHandler: Unexpected response ' + data.status);\n            return;\n        }\n\n        let recruiteeHtml = RecruiteeHandler.element.innerHTML;\n\n        const response = JSON.parse(data.response);\n        RecruiteeHandler.amountOfJobs = response.offers.length;\n\n        for(let i = 0; i < RecruiteeHandler.amountOfJobs; i++) {\n            recruiteeHtml = RecruiteeHandler.appendJob(response.offers[i], recruiteeHtml);\n        }\n\n        RecruiteeHandler.element.innerHTML = recruiteeHtml;\n\n        const jobElements = RecruiteeHandler.element.getElementsByClassName('js-open-recruitee-job-model');\n\n        for(let i = 0; i < jobElements.length; i++) {\n            const jobElement = jobElements[i];\n            jobElement.addEventListener('click', function () {\n\n                RecruiteeHandler.setJob(this.getAttribute('data-job-id'));\n                RecruiteeHandler.toggleRecruiteeOverlay();\n\n            });\n        }\n\n    },\n\n    setJob: function (jobId) {\n\n        // Get the saved job object\n        const job = RecruiteeHandler.jobs[jobId];\n\n        // Update the overlayed job to the clicked job\n        RecruiteeHandler.overlayedJob.title.innerHTML = job.title;\n        RecruiteeHandler.overlayedJob.description.innerHTML = job.description;\n        RecruiteeHandler.overlayedJob.requirement.innerHTML = job.requirements;\n        RecruiteeHandler.overlayedJob.applyLink.setAttribute('href', job.careers_apply_url);\n\n        const jobKey = RecruiteeHandler.jobKeys.indexOf(jobId);\n\n        if(jobKey !== -1) {\n\n            let previousKey = jobKey - 1;\n            let nextKey = jobKey + 1;\n\n            // Handle the exceptions\n            if(previousKey <= -1) previousKey = RecruiteeHandler.jobKeys.length - 1;\n            if(nextKey === RecruiteeHandler.jobKeys.length) nextKey = 0;\n\n            // Set the next and previous\n            RecruiteeHandler.overlayedJob.previous.setAttribute('data-job-id', RecruiteeHandler.jobKeys[previousKey]);\n            RecruiteeHandler.overlayedJob.next.setAttribute('data-job-id', RecruiteeHandler.jobKeys[nextKey]);\n\n        }\n    },\n\n    toggleRecruiteeOverlay: function () {\n\n        // If there is none or only 1 job available, we hide the previous and next buttons\n        if(RecruiteeHandler.amountOfJobs <= 1 && isset(RecruiteeHandler.overlayedJob.navigation)) {\n            RecruiteeHandler.overlayedJob.navigation.classList.add('is-hidden');\n        }\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(RecruiteeHandler.recruiteeOverlay);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (document.body.classList.contains('is-recruitee-job-overlay-active')) {\n\n            // Trigger fade out animation\n            document.body.classList.add('is-recruitee-job-overlay-fade-out');\n\n            // Then remove the classes\n            setTimeout(function () {\n\n                // Reset the scroll position on close to top\n                const overlayScroller = RecruiteeHandler.recruiteeOverlay.querySelector('.js-recruitee-job-overlay-scroller');\n                overlayScroller.scrollTop = 0;\n\n                document.body.classList.remove('is-recruitee-job-overlay-active');\n                document.body.classList.remove('is-recruitee-job-overlay-fade-out');\n            }, 300);\n\n            return;\n        }\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(RecruiteeHandler.recruiteeOverlay);\n\n        // Toggle active overlayMenu by setting a class on the body\n        document.body.classList.toggle('is-recruitee-job-overlay-active');\n\n    },\n\n    appendJob: function (job, html) {\n\n        RecruiteeHandler.jobs['job-' + job.id] = job;\n        RecruiteeHandler.jobKeys.push('job-' + job.id);\n\n        html += '<div class=\"c-recruitee-jobs__item  js-open-recruitee-job-model\" target=\"_blank\" data-job-id=\"job-' + job.id + '\">';\n        html += '<div class=\"c-recruitee-jobs__heading\">';\n        html += '<h4 class=\"c-recruitee-jobs__title\">' + job.title + '</h4>';\n        if(isset(job.department)) html += '<span class=\"c-recruitee-jobs__department\">' + job.department + '</span>';\n        html += '</div>';\n        html += '<span class=\"c-recruitee-jobs__link\">' + RecruiteeHandler.readMoreTranslation + '</span>';\n        html += '<div class=\"c-recruitee-jobs__icon\">' +\n            '            <span class=\"c-recruitee-jobs__arrow\">' +\n            '               <svg width=\"16px\" height=\"12px\" viewBox=\"0 0 16 12\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n            '                   <path fill=\"currentColor\" d=\"M13.3998179,6.7826087 L0.761575693,6.7826087 C0.340969052,6.7826087 1.12798659e-13,6.43222285 1.12798659e-13,6 C1.12798659e-13,5.56777715 0.340969052,5.2173913 0.761575693,5.2173913 L13.3998179,5.2173913 L9.62273769,1.33599661 C9.32532388,1.0303689 9.32532388,0.534848487 9.62273769,0.22922078 C9.9201515,-0.0764069266 10.4023546,-0.0764069266 10.6997684,0.22922078 L15.7769396,5.44661208 C16.0743535,5.75223979 16.0743535,6.24776021 15.7769396,6.55338792 L10.6997684,11.7707792 C10.4023546,12.0764069 9.9201515,12.0764069 9.62273769,11.7707792 C9.32532388,11.4651515 9.32532388,10.9696311 9.62273769,10.6640034 L13.3998179,6.7826087 Z\"></path>' +\n            '                </svg>' +\n            '            </span>' +\n            '        </div>' +\n            '</div>';\n\n        return html;\n    }\n};\n","/* ==========================================================================\n   Resize handler\n   - Handler the objects which are or need to be recalculated on resize\n ========================================================================== */\n\nexport const ResizeHandler = {\n\n    time: Date.now(),\n    timeout: null,\n    waitThrottle: 1000,\n    waitDebounce: 500,\n\n    //Initialisation\n    init: function () {\n\n        // Trigger start up resize\n        ResizeHandler.triggerOnInit();\n\n        // Throttle Resize\n        window.addEventListener('resize', function () {\n            if ((ResizeHandler.time + ResizeHandler.waitThrottle - Date.now()) < 0) {\n                ResizeHandler.triggerThrottle();\n                ResizeHandler.time = Date.now();\n            }\n        });\n\n        // Smooth Resize\n        window.addEventListener('resize', function () {\n            ResizeHandler.triggerSmooth();\n        });\n\n        // Debounce Resize\n        window.addEventListener('resize', function () {\n            if(isset(ResizeHandler.timeout)) clearTimeout(ResizeHandler.timeout);\n            ResizeHandler.timeout = setTimeout(ResizeHandler.triggerDebounce, ResizeHandler.waitDebounce);\n        });\n    },\n\n    // Trigger on start up\n    // All function should be in here\n    triggerOnInit: function () {\n        // ResizeHandler.resizeWhatDoesItCostAdvantageFigure();\n        // console.log('Initial Resize');\n        this.triggerThrottle();\n    },\n\n    // Trigger resize functions with throttle (preferred)\n    triggerThrottle: function () {\n        // console.log('Throttled Resize');\n\n        const squareableElements = document.querySelectorAll('.js-square-ratio');\n        for(let i = 0; i < squareableElements.length; i++) {\n            const squareableElement = squareableElements[i];\n\n            const ratio = parseFloat(squareableElement.getAttribute('data-ratio'));\n            let minHeight = squareableElement.clientWidth * ratio;\n            squareableElement.style.minHeight = minHeight + 'px';\n        }\n\n    },\n\n    // Trigger resize on debounce\n    triggerDebounce: function () {\n        // console.log('Debounce Resize');\n        // ResizeHandler.resizeWhatDoesItCostAdvantageFigure();\n    },\n\n    // Trigger resize on the flight\n    triggerSmooth: function () {\n        // console.log('Smooth Resize');\n        // _subnavHandler.resizeSubnav();\n    },\n\n    // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------\n\n    // Example function\n    // resizeWhatDoesItCostAdvantageFigure: function () {\n    //     var el = document.querySelector('.advantages-own-guiding-row figure');\n    //     if(isset(el)){\n    //         el.style.maxHeight = 'none';\n    //         el.style.maxHeight = el.offsetHeight + 'px';\n    //     }\n    // },\n\n};\n","/* ==========================================================================\n    Scroll To Click handler\n ========================================================================== */\n\nexport const ScrollToHandler = {\n\n    // Animation settings\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('.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\n                let elementId = this.getAttribute('href');\n\n                elementId = elementId.substr(elementId.indexOf('#')+1);\n                const scrollToElement = document.getElementById(elementId);\n\n                ScrollToHandler.prepareScrollTo(scrollToElement);\n                event.preventDefault();\n            });\n        }\n    },\n\n    /**\n     * Prepare the Handler for the animation\n     */\n    prepareScrollTo : function(node, offset = 60){\n\n        // Get the scroll to element position\n        const scrollToElementPosition = node.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) - 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","export const SearchHandler = {\n\n    form: document.getElementById('searchForm'),\n    searchBar: document.getElementById('searchbar'),\n    resultHolder: document.getElementById('searchresults'),\n    searchUrl: null,\n\n    init : function() {\n        if(this.form && isset(this.form.dataset.searchUrl)) {\n            this.searchUrl = this.form.dataset.searchUrl;\n            let languageId = this.searchBar.dataset.languageId;\n            console.debug('searchHandler initialized with searchUrl: ' + this.searchUrl);\n\n            this.searchBar.addEventListener('keydown', debounce(function () {\n                SearchHandler.search(SearchHandler.searchBar.value, 1, 5, languageId);\n            }, 200));\n        }\n    },\n\n    search: function(term, page = 1, amount = 10, language_id = null) {\n        if(term === \"\") return;\n\n        let xhr = new XMLHttpRequest();\n        let token = document.querySelector('meta[name=\"csrf-token\"]').content;\n\n        let queryParams = {\n            'term': term,\n            'page': page,\n            'amount': amount,\n            'language_id': language_id\n        };\n\n        let queryUrlPart = '';\n        for(let param in queryParams) queryUrlPart += ((queryUrlPart !== '') ? '&' : '?')+param+'='+encodeURIComponent(queryParams[param]);\n\n        xhr.open('get', this.searchUrl+queryUrlPart, true);\n        xhr.responseType = 'json';\n        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n        xhr.setRequestHeader('X-CSRF-TOKEN', token);\n        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n        xhr.onreadystatechange = function() {\n            if (xhr.readyState === 4) {\n                if(xhr.status === 200) {\n                    SearchHandler.processSearchResponse(xhr.response);\n                } else {\n                    console.error('SearchHandler: Could not search because of an error. '+xhr.statusText);\n                }\n            }\n        };\n        xhr.send();\n    },\n\n    processSearchResponse: function(response)\n    {\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    {\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","/* ==========================================================================\n    Share buttons handler\n ========================================================================== */\n\nexport const ShareButtonsHandler = {\n\n    shareButtonsElement: null,\n    shareMessageElement: null,\n    shareMessage: null,\n\n    init: function () {\n        // Get the youtube players containers\n        ShareButtonsHandler.shareButtonsElement = document.getElementById('js-shareButtons');\n        ShareButtonsHandler.shareMessageElement = document.getElementById('js-shareButtonData');\n\n        if (isset(ShareButtonsHandler.shareButtonsElement) && isset(ShareButtonsHandler.shareMessageElement)) {\n            ShareButtonsHandler.convertShareMessageToObject();\n\n            const items = ShareButtonsHandler.shareButtonsElement.querySelectorAll('.js-social-media-item');\n            const buttons = ShareButtonsHandler.shareButtonsElement.querySelectorAll('.js-social-media-button');\n            const buttonsLength = buttons.length;\n\n            for (let i = 0; i < buttonsLength; i++) {\n                const button = buttons[i];\n                const item = items[i];\n\n                button.addEventListener('click', function () {\n                    const social = item.getAttribute('data-social');\n                    let functionName = 'click' + capitalizeFirstLetter(social) + 'Button';\n\n                    if(typeof ShareButtonsHandler[functionName] === 'function'){\n                        ShareButtonsHandler[functionName]();\n                    }\n                    else{\n                        console.log('Method not build yet: ' + functionName);\n                    }\n                });\n            }\n        }\n    },\n\n    convertShareMessageToObject: function () {\n        let messageObject = {};\n        for (let i = 0, attributes = ShareButtonsHandler.shareMessageElement.attributes, attributesLength = attributes.length; i < attributesLength; i++) {\n            const attribute = attributes[i];\n            let attributeName = attribute.name;\n            attributeName = attributeName.replace(/data-/g, '');\n            attributeName = snakeToCamel(attributeName);\n\n            messageObject[attributeName] = attribute.value;\n        }\n        ShareButtonsHandler.shareMessage = messageObject;\n    },\n\n    clickFacebookButton: function () {\n        FB.ui({\n            method: 'share',\n            mobile_iframe: true,\n            href: ShareButtonsHandler.shareMessage.url,\n        }, function (response) {\n        });\n    },\n\n    clickTwitterButton: function () {\n        window.open('https://twitter.com/intent/tweet?text=' + ShareButtonsHandler.shareMessage.encodeName + '&url=' + ShareButtonsHandler.shareMessage.encodeUrl  , 'newwindow', 'width=500, height=600');\n    },\n\n    clickLinkedinButton: function () {\n        window.open('https://www.linkedin.com/shareArticle?mini=true&url='+ ShareButtonsHandler.shareMessage.encodeUrl +'&title='+ ShareButtonsHandler.shareMessage.encodeName +'&summary=' + ShareButtonsHandler.shareMessage.encodeSummary, 'newwindow', 'width=500, height=600');\n    },\n\n    clickMailButton: function () {\n        window.open('mailto:?subject='+ShareButtonsHandler.shareMessage.name+'&body='+ShareButtonsHandler.shareMessage.url, '_self');\n    },\n\n    clickLinkButton: function () {\n        ShareButtonsHandler.shareMessageElement.select();\n        copyToClipboard('#js-shareButtonData');\n\n        const flashMessage = ShareButtonsHandler.shareButtonsElement.querySelector('.js-link-copied-message');\n        flashMessage.classList.add('clicked');\n\n        setTimeout(function () {\n            flashMessage.classList.remove('clicked');\n        }, 2000);\n\n    },\n\n};\n","/* ==========================================================================\n   Subnav handler\n   - Handles the subnav component which has the proper classes.\n ========================================================================== */\n\nexport const SubmenuHandler = {\n\n    activeMenu: null,\n\n    init: function () {\n\n        const submenuTriggers = document.querySelectorAll('.js-submenu-trigger');\n        if(isset(submenuTriggers) && submenuTriggers.length !== 0){\n\n            for(let i = 0; i < submenuTriggers.length; i++){\n                const submenuTrigger = submenuTriggers[i];\n                submenuTrigger.addEventListener('click', SubmenuHandler.toggleMenu);\n            }\n        }\n\n        const subsubmenuTriggers = document.querySelectorAll('.js-subsubmenu-trigger')\n        if(isset(subsubmenuTriggers) && subsubmenuTriggers.length !== 0){\n            for(let i = 0; i < subsubmenuTriggers.length; i++){\n                const subsubmenuTrigger = subsubmenuTriggers[i];\n                subsubmenuTrigger.addEventListener('mouseover', SubmenuHandler.mouseIn);\n                subsubmenuTrigger.addEventListener('mouseout', SubmenuHandler.mouseOut);\n\n            }\n        }\n    },\n\n    toggleMenu: function (evt) {\n        const el = evt.currentTarget.parentElement;\n        const menu = el.querySelector('.js-submenu');\n        if(isset(menu)) {\n            menu.classList.toggle('is-open');\n            SubmenuHandler.listenerToClickOutside(menu);\n        }\n    },\n\n    listenerToClickOutside: function (menu) {\n        if(menu.classList.contains('is-open')) {\n            SubmenuHandler.activeMenu = menu;\n            window.addEventListener('click', SubmenuHandler.clickOutsideMenu);\n        }\n        else {\n            SubmenuHandler.activeMenu = null;\n            window.removeEventListener('click', SubmenuHandler.clickOutsideMenu);\n        }\n    },\n\n    clickOutsideMenu: function (evt) {\n\n        if(!isset(SubmenuHandler.activeMenu)) return;\n\n        if (SubmenuHandler.outsideClick(evt, SubmenuHandler.activeMenu) && !evt.target.classList.contains('js-submenu-trigger')) {\n            SubmenuHandler.activeMenu.classList.remove('is-open');\n            SubmenuHandler.activeMenu.classList.remove('hovering');\n            SubmenuHandler.listenerToClickOutside(SubmenuHandler.activeMenu);\n        }\n    },\n\n    toggleSubmenu: function (el, direction = 0) {\n        const subMenu = el.parentElement.parentElement;\n        const subsubMenu = el.querySelector('.js-subsubmenu');\n\n        if(direction === 0) {\n            subMenu.classList.add('hovering');\n            subsubMenu.classList.add('is-open');\n            subMenu.style.minHeight = subsubMenu.clientHeight + 'px';\n        }\n        else {\n            subMenu.classList.remove('hovering');\n            subsubMenu.classList.remove('is-open');\n            subMenu.style.minHeight = null;\n        }\n    },\n\n    mouseIn: function (evt) {\n        const el = evt.currentTarget;\n        SubmenuHandler.toggleSubmenu(el);\n    },\n    mouseOut: function (evt) {\n        const el = evt.currentTarget;\n        SubmenuHandler.toggleSubmenu(el, 1);\n    },\n\n    outsideClick: function (event, notelem)\t{\n        let clickedOut = true;\n        if (event.target == notelem || notelem.contains(event.target)) clickedOut = false;\n        return clickedOut\n    }\n};\n","/* ==========================================================================\n   Accordion handler\n   - Handles the accordion component which has the proper classes.\n ========================================================================== */\n\nexport const TabHandler = {\n\n    tabContainer: '',\n    tabs: '',\n\n    init: function () {\n        TabHandler.tabContainer = document.querySelector('.js-webinar-tabs')\n        TabHandler.tabs = document.querySelectorAll('.js-tab')\n\n        const intendedTab = window.location.href.split('#', 2)[1] ?? null;\n\n        TabHandler.tabs.forEach((tab) => {\n            tab.addEventListener('click', () => TabHandler.activeTab(tab))\n            if (tab.href.split('#', 2)[1] === intendedTab) {\n                TabHandler.activeTab(tab)\n            }\n        })\n    },\n\n    activeTab: function (tab) {\n        TabHandler.deactivateAllTabs()\n        const tabNumber = tab.getAttribute('data-tab');\n        const activateTabs = TabHandler.tabContainer.querySelectorAll(`[data-tab=\"${tabNumber}\"]`);\n\n        if (activateTabs.length > 0) {\n            activateTabs.forEach((tab) => {\n                tab.classList.add('active')\n            })\n        }\n    },\n\n    deactivateAllTabs: function () {\n        const tabs = TabHandler.tabContainer.querySelectorAll('[data-tab]')\n\n        tabs.forEach((tab) => {\n            tab.classList.remove('active')\n        })\n    }\n};\n","/* ==========================================================================\n   Tabslider handler\n   - Handles the tabslider component which has the proper classes.\n ========================================================================== */\n\nexport const TabsliderHandler = {\n\n    tabsliderList : null,\n    tabslider : null,\n    currentIndex: 1,\n\n    init: function () {\n        TabsliderHandler.tabsliderList = document.querySelectorAll('.js-tabslider');\n        const tabsliderListCount = TabsliderHandler.tabsliderList.length;\n\n        if(isset(TabsliderHandler.tabsliderList) && tabsliderListCount !== 0){\n            for(let i = 0; i < tabsliderListCount; i++){\n                const tabslider = TabsliderHandler.tabsliderList[i];\n                TabsliderHandler.initTabslider(tabslider);\n            }\n        }\n    },\n\n    initTabslider: function (tabslider) {\n        const container = tabslider.querySelector('.js-tabslider-container');\n\n        // Check if container element exists\n        if (container == null) {\n            console.error(`There is no container for the content tabs defined.`);\n            return;\n        }\n\n        const triggers = tabslider.querySelectorAll('.js-tabslider-trigger');\n        const tabs = container.querySelectorAll('.js-tabslider-content');\n        const images = document.querySelectorAll('.js-tabslider-image');\n        const arrow_prev = tabslider.querySelector('.js-tabslider-arrow-prev');\n        const arrow_next = tabslider.querySelector('.js-tabslider-arrow-next');\n\n        // Check if number of triggers and tabs match\n        if (triggers.length !== tabs.length) {\n            console.error(`There are ${triggers.length} trigger buttons and ${tabs.length} tabs. These must match.`)\n        }\n\n        if (arrow_prev !== null) {\n            arrow_prev.addEventListener('click', function (event) {\n                if (TabsliderHandler.currentIndex !== 1) {\n                    //decrease tabslider\n                    TabsliderHandler.currentIndex--\n                    TabsliderHandler.toggleTabslider(triggers, tabs, images);\n                    arrow_next.classList.remove('is-disabled')\n                    if (TabsliderHandler.currentIndex === 1) {\n                        arrow_prev.classList.add('is-disabled')\n                    }\n                }\n            })\n        }\n\n        if (arrow_next !== null) {\n            arrow_next.addEventListener('click', function (event) {\n                if (TabsliderHandler.currentIndex !== triggers.length) {\n                    //increase tabslider\n                    TabsliderHandler.currentIndex++\n                    TabsliderHandler.toggleTabslider(triggers, tabs, images);\n                    arrow_prev.classList.remove('is-disabled')\n                    if (TabsliderHandler.currentIndex === triggers.length) {\n                        arrow_next.classList.add('is-disabled')\n                    }\n                }\n            })\n        }\n\n\n        tabslider.addEventListener('click', function (event) {\n\n            // Bail if we didn't click on the trigger element\n            if (!event.target.classList.contains('js-tabslider-trigger')) return;\n\n            // Bail if already active\n            if (event.target.classList.contains('is-active')) { return; }\n            TabsliderHandler.currentIndex = parseInt(event.target.dataset.tabId)\n            TabsliderHandler.toggleTabslider(triggers, tabs, images);\n\n            if (arrow_next !== null) {\n                if(TabsliderHandler.currentIndex === triggers.length)\n                    arrow_next.classList.add('is-disabled')\n                else\n                    arrow_next.classList.remove('is-disabled')\n            }\n\n            if (arrow_prev !== null) {\n                if (TabsliderHandler.currentIndex === 1)\n                    arrow_prev.classList.add('is-disabled')\n                else\n                    arrow_prev.classList.remove('is-disabled')\n            }\n\n            if(window.innerWidth <= 600) {\n                ScrollToHandler.prepareScrollTo(tabs[0], 20);\n            }\n            // console.log(window.innerWidth);\n\n        });\n    },\n\n    toggleTabslider: function (triggers, tabs, images) {\n\n        if(isset(triggers) && triggers.length > 0){\n\n            // Loop through all tabs\n            for(let i = 0; i < triggers.length; i++){\n                const tabsliderTab = tabs[i];\n                const tabsliderTrigger = triggers[i];\n\n                tabsliderTrigger.classList.remove('is-active');\n                tabsliderTab.classList.remove('is-active');\n\n                if (tabsliderTab.dataset.tabId == TabsliderHandler.currentIndex) {\n                    tabsliderTab.classList.add('is-active');\n                    tabsliderTrigger.classList.add('is-active');\n                    // event.target.classList.toggle('is-active');\n                }\n\n                // Check if images in header are set for the tabslider\n                if(images.length > 0) {\n\n                    // Bail if not the first tabslider. Only the first tabslider gets to control the header/hero images\n                    if (tabsliderTab.closest('.js-tabslider') !== TabsliderHandler.tabsliderList[0]) { return; }\n\n                    const tabsliderImage = images[i];\n\n                    if(typeof tabsliderImage != 'undefined') {\n                        tabsliderImage.classList.remove('is-active');\n                        if (tabsliderImage.dataset.tabId == TabsliderHandler.currentIndex) {\n                            tabsliderImage.classList.add('is-active');\n                        }\n                    }\n                    else {\n                        console.error(`There are ${triggers.length} trigger buttons and ${images.length} tabslider images. These must match.`);\n                    }\n                }\n\n            }\n        }\n    }\n};\n","/* ==========================================================================\n   Timeline handler\n   - Provide the timeline with new updates if needed.\n ========================================================================== */\n\nexport const TimelineHandler = {\n\n    timeline: null,\n    lastUpdateYear: null,\n    updatesRoute: null,\n    readMoreLabel: null,\n\n    init: function () {\n\n        TimelineHandler.timeline = document.querySelector('.js-timeline');\n\n        // Only continue the init if the timeline object is found\n        if (isset(TimelineHandler.timeline)) {\n\n            // Get the required attribute for adding more updates\n            TimelineHandler.lastUpdateYear = TimelineHandler.timeline.getAttribute('data-last-update-year');\n            TimelineHandler.updatesRoute = TimelineHandler.timeline.getAttribute('data-updates-route');\n            TimelineHandler.readMoreLabel = TimelineHandler.timeline.getAttribute('data-read-more-label');\n\n            // Add click event to button to load more updates\n            const moreUpdatesButton = TimelineHandler.timeline.querySelector('.js-get-more-updates');\n            moreUpdatesButton.addEventListener('click', TimelineHandler.getMoreUpdates);\n        }\n    },\n\n    /**\n     * Get updates from timeline\n     * we pass the amount of already found items as segment, so we know how many we can skip\n     */\n    getMoreUpdates: function () {\n\n        const languageString = '?lang=' + document.documentElement.lang;\n\n        const currentUpdates = TimelineHandler.timeline.querySelectorAll('.js-timeline-item');\n        const currentAmountOfUpdates = currentUpdates.length;\n\n        Ajax.get('/api/updates/timeline/' + currentAmountOfUpdates + languageString, TimelineHandler.addUpdateToTimeline);\n\n    },\n\n    /**\n     * Append loaded update to timeline\n     *\n     * @param data\n     */\n    addUpdateToTimeline: function (data) {\n\n        if(data.status !== 200) {\n            console.log('TimelineHandler: Unexpected response ' + data.status);\n            return;\n        }\n\n        const json = JSON.parse(data.response);\n\n        // Get the timeline content and extract the current html\n        const timelineContent = TimelineHandler.timeline.querySelector('.js-timeline-items');\n        let timelineContentHtml = timelineContent.innerHTML;\n\n        json.updates.forEach(function (item) {\n\n            // Check if we need to add a year timeline item\n            if (item.date.year < TimelineHandler.lastUpdateYear) {\n\n                timelineContentHtml = TimelineHandler._appendTimelineYearItem(timelineContentHtml, item.date.year);\n\n                // Update Timeline Last update year\n                TimelineHandler.lastUpdateYear = item.date.year;\n            }\n\n            timelineContentHtml = TimelineHandler._appendTimelineItem(timelineContentHtml, item);\n\n            // Insert the appended timelineContentHtml\n            timelineContent.innerHTML = timelineContentHtml;\n\n        });\n\n        if(!json.updatesLeft){\n            TimelineHandler.timeline.querySelector('.js-get-more-updates-container').remove();\n            TimelineHandler.timeline.querySelector('.js-no-more-updates-available').classList.remove('is-hidden');\n        }\n\n    },\n\n    /**\n     * Append year timeline item HTML\n     *\n     * @param html\n     * @param year\n     * @returns {*}\n     * @private\n     */\n    _appendTimelineYearItem(html, year) {\n        html += ' <div class=\"c-timeline__item  c-timeline__item--divider\">' +\n            '<div class=\"c-timeline__year\">' + year + '</div>' +\n            '</div>';\n\n        return html;\n    },\n\n    /**\n     * Append timeline item HTML\n     *\n     * @param html\n     * @param item\n     * @returns {*}\n     * @private\n     */\n    _appendTimelineItem(html, item) {\n\n        html +=\n            '<div class=\"c-timeline__item  js-timeline-item\">' +\n            '       <div class=\"c-timeline__container\">' +\n            '           <div class=\"c-timeline__header\">' +\n            '               <time class=\"c-timeline__date\"' +\n            '                     datetime=\"' + item.date.year + '-' + item.date.month + '-' + item.date.day + '2019-01-01\">' + item.date.day + ' ' + item.date.monthName + '</time>' +\n            '               <h3 class=\"c-timeline__title\">' + item.name + '</h3>' +\n            '           </div>' +\n            '        <div class=\"c-timeline__body\">';\n\n        // Add image if not null\n        if (isset(item.image)) html += '<a href=\"/' + TimelineHandler.updatesRoute + '/' + item.slug + '\"><img class=\"c-timeline__image\" src=\"' + item.image + '\"/></a>';\n\n        html +=\n            '    <div class=\"c-timeline__content  s-text  checklist-has-x-small-font\">' + item.description + '</div>' +\n            '       <div class=\"c-timeline__action\">' +\n            '          <a class=\"c-button c-button--ghost c-button--icon\" href=\"/' + TimelineHandler.updatesRoute + '/' + item.slug + '\">' +\n            '              <span class=\"c-button__text\">' + TimelineHandler.readMoreLabel + '</span>' +\n            '              <i class=\"c-button__icon\">' +\n            '                 <svg id=\"arrow\" width=\"16px\" height=\"12px\" viewBox=\"0 0 16 12\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n            '                    <path fill=\"currentColor\" d=\"M13.3998179,6.7826087 L0.761575693,6.7826087 C0.340969052,6.7826087 1.12798659e-13,6.43222285 1.12798659e-13,6 C1.12798659e-13,5.56777715 0.340969052,5.2173913 0.761575693,5.2173913 L13.3998179,5.2173913 L9.62273769,1.33599661 C9.32532388,1.0303689 9.32532388,0.534848487 9.62273769,0.22922078 C9.9201515,-0.0764069266 10.4023546,-0.0764069266 10.6997684,0.22922078 L15.7769396,5.44661208 C16.0743535,5.75223979 16.0743535,6.24776021 15.7769396,6.55338792 L10.6997684,11.7707792 C10.4023546,12.0764069 9.9201515,12.0764069 9.62273769,11.7707792 C9.32532388,11.4651515 9.32532388,10.9696311 9.62273769,10.6640034 L13.3998179,6.7826087 Z\"></path>' +\n            '                 </svg>' +\n            '              </i>' +\n            '          </a>' +\n            '        </div>' +\n            '    </div>' +\n            '</div>';\n\n        return html;\n    }\n\n};\n\n","/* ==========================================================================\n    Youtube handler\n ========================================================================== */\n\nexport const 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                    mute: 1\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","/* ==========================================================================\n   YoutubeModalHandler\n ========================================================================== */\n \nexport const YoutubeModalHandler = {\n\n    triggers: null,\n    youtubeModal: null,\n    youtubeId: '',\n    video: null,\n\n    init: function () {\n\n        YoutubeModalHandler.triggers = document.querySelectorAll('.js-youtube-modal-button');\n        YoutubeModalHandler.youtubeModal = document.querySelector('.js-youtube-modal-overlay');\n\n        if(isset(YoutubeModalHandler.youtubeModal) && isset(YoutubeModalHandler.triggers) && YoutubeModalHandler.triggers.length >= 1) {\n\n            for(let i = 0; i < YoutubeModalHandler.triggers.length; i++) {\n\n                const youtubeModelTrigger = YoutubeModalHandler.triggers[i];\n\n                youtubeModelTrigger.addEventListener('click', function () {\n                    YoutubeModalHandler.youtubeId = this.getAttribute('data-youtube');\n                    YoutubeModalHandler.initYoutube();\n                });\n            }\n\n            // Add toggle (close) events to all the close buttons\n            const closeButtons = YoutubeModalHandler.youtubeModal.getElementsByClassName('js-close-youtube-modal-overlay');\n\n            for( let i = 0; i < closeButtons.length; i++) {\n\n                closeButtons[i].addEventListener('click', function () {\n                    YoutubeModalHandler.toggleOverlay();\n                });\n            }\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                YoutubeModalHandler.openModal();\n            };\n            // Load external script\n            getScript('https://www.youtube.com/iframe_api');\n            // If YT already exists load player\n        } else {\n            YoutubeModalHandler.openModal();\n        }\n    },\n\n    openModal: function () {\n\n        if(!isset(YoutubeModalHandler.video)) {\n            YoutubeModalHandler.video = new YT.Player('youtube-modal-video',{\n                height: 200,\n                width: 200,\n                videoId: YoutubeModalHandler.youtubeId,\n                host: 'https://www.youtube-nocookie.com',\n                playerVars: {\n                    modestbranding: 0,\n                    rel: 0,\n                    disablekb: 1,\n                    autoplay: true,\n                },\n            });\n        }\n        else {\n            YoutubeModalHandler.video.loadVideoById(YoutubeModalHandler.youtubeId);\n\n            if(isset(YoutubeModalHandler.video.playVideo) ) {\n                YoutubeModalHandler.video.playVideo();\n            }\n        }\n\n        YoutubeModalHandler.toggleOverlay();\n    },\n\n    toggleOverlay: function () {\n\n        // Clear previously locked scroll on the body\n        bodyScrollLock.enableBodyScroll(YoutubeModalHandler.youtubeModal);\n\n        // If the overlayMenu is already active, collapse it and quit\n        if (document.body.classList.contains('is-youtube-modal-active')) {\n\n            // Stop the video if function is defined\n            if(isset(YoutubeModalHandler.video.stopVideo)) YoutubeModalHandler.video.stopVideo();\n\n            // Trigger fade out animation\n            document.body.classList.add('is-youtube-modal-fade-out');\n\n            // Then remove the classes\n            setTimeout(function () {\n\n                // Reset the scroll position on close to top\n                const overlayScroller = YoutubeModalHandler.youtubeModal.querySelector('.js-youtube-modal-overlay-scroller');\n                overlayScroller.scrollTop = 0;\n\n                document.body.classList.remove('is-youtube-modal-active');\n                document.body.classList.remove('is-youtube-modal-fade-out');\n\n            }, 300);\n\n            return;\n        }\n        // else {\n        //     console.log(YoutubeModalHandler.video);\n            // YoutubeModalHandler.video.playVideo();\n        // }\n\n        // Lock scrolling on the body\n        bodyScrollLock.disableBodyScroll(YoutubeModalHandler.youtubeModal);\n\n        // Toggle active overlayMenu by setting a class on the body\n        document.body.classList.toggle('is-youtube-modal-active');\n\n    },\n\n    handleKeyPressed: function (event) {\n\n        switch (event.key) {\n            case 'Escape':\n                return YoutubeModalHandler.toggleOverlay();\n\n            default:\n            // console.log(event);\n        }\n\n    },\n\n};\n","/**\n * Created by Pascal on 06/12/17.\n * (Name changes by Rob on 18/03/18)\n */\n\n/* Example\n\nconst headerImageSliderSetting = new SliderProjectorSetting({\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    autoSlider: true,\n    sliderInterval: 4000\n});\nheaderImageSliderSetting = headerImageSliderSetting.prepareParameters();\n\nconst headerImageSlider = new SliderProjector(headerImageSliderSetting).init();\n\n */\n\n// let slideProjectors = [];\n//\n// const slideProjectorContainers = document.querySelectorAll('.js-slide-projector');\n// const slideProjectorContainersLength = slideProjectorContainers.length;\n//\n// for(let i =0; i < slideProjectorContainersLength; i++){\n//\n//     const slideProjector = slideProjectorContainers[i];\n//     const slideProjectorId = slideProjector.getAttribute('id');\n//\n//     if(slideProjectorId !== null){\n//\n//         const slideProjectorSetting = new SliderProjectorSetting({\n//             sliderId: slideProjectorId,\n//             slideQuery: '#' + slideProjectorId +' .js-slide-projector__slide',\n//             navigationButtons: '#' + slideProjectorId +' .js-slide-projector__button' ,\n//             autoSlider: true,\n//             sliderInterval: 4000\n//         });\n//\n//         slideProjectors.push( new SliderProjector(slideProjectorSetting.prepareParameters()).init() );\n//     }\n//     else console.log('An image slider has no id...');\n// }\n\n\nexport function SliderProjectorSetting(settingsObject) {\n\n    const self = this;\n\n    this.sliderId = '';\n    this.definedPreviousNext = true;\n    this.autoSlider = false;\n    this.sliderInterval = 4000;\n    this.navigationButtons = '';\n    this.dots = '';\n    this.captions = '';\n    this.slideQuery = '';\n\n    this.setSliderProjectorId = function (string) {\n        this.sliderId = string;\n        return this;\n    };\n    this.setDefinedPreviousNext = function (boolean) {\n        this.definedPreviousNext = boolean;\n        return this;\n    };\n    this.setAutoSlider = function (boolean) {\n        this.autoSlider = boolean;\n        return this;\n    };\n    this.setSliderInterval = function (integer) {\n        this.sliderInterval = integer;\n        return this;\n    };\n    this.setSlideQuery = function (string) {\n        this.slideQuery = string;\n        return this;\n    };\n    this.setNavigationButtons = function (string) {\n        this.navigationButtons = string;\n        return this;\n    };\n    this.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.getSliderProjectorId = function () {\n        return this.sliderId;\n    };\n    this.getDefinedPreviousNext = function () {\n        return this.definedPreviousNext;\n    };\n    this.getAutoSlider = function () {\n        return this.autoSlider;\n    };\n    this.getSliderInterval = function () {\n        return this.sliderInterval;\n    };\n    this.getSlideQuery = function () {\n        return this.slideQuery;\n    };\n    this.getNavigationButtons = function () {\n        return this.navigationButtons;\n    };\n    this.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.getSliderProjectorId(),\n            definedPreviousNext: self.getDefinedPreviousNext(),\n            autoSlider: self.getAutoSlider(),\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.setSliderProjectorId,\n        definedPreviousNext: self.setDefinedPreviousNext,\n        autoSlider: self.setAutoSlider,\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\nexport function SliderProjector(settings) {\n\n    //Define SliderProjector object\n    const self = this;\n    this.sliderObject = '';\n\n    //SlideParameters\n    this.activeSlideId = 0;\n    this.previousSlideId = 0;\n    this.nextSlideId = 0;\n    this.availableSlides = 1;\n    this.slides = [];\n    this.autoSliderInterval = null;\n\n    this.settings = {};\n\n    this.init = function () {\n\n        //Append settings to self\n        this.settings = settings;\n\n        //Assign needed elements and calculations\n        this.sliderObject = document.getElementById(this.settings.sliderId);\n        this.slides = document.querySelectorAll(this.settings.slideQuery);\n        this.availableSlides = this.slides.length;\n        this.activeSlideId = 0;\n\n        //Define previous and next if we want to use those\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n\n        // Set active slide (and possible previous and next classes)\n        this.setSlide();\n\n        // Swipe interaction\n        const swipeGestures = new Hammer(this.sliderObject);\n        swipeGestures.on('swipeleft', function () {\n            self.resetAutoSlider();\n            self.nextSlide();\n            self.setSlide();\n        });\n        swipeGestures.on('swiperight', function () {\n            self.resetAutoSlider();\n            self.previousSlide();\n            self.setSlide();\n        });\n\n\n\n        if (this.settings.navigationButtons !== '') {\n\n            // Click interaction\n            const navigationButtons = document.querySelectorAll(this.settings.navigationButtons);\n            const navigationButtonsLength = navigationButtons.length;\n            for(let i = 0; i < navigationButtonsLength; i++){\n                const navigationButton = navigationButtons[i];\n                navigationButton.addEventListener('click', function () {\n                    self.clickNavigationButton(this);\n                });\n            }\n\n        }\n\n        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.autoSlider();\n    };\n\n\n    this.autoSlider = function (){\n\n        if(this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);\n\n        if(this.settings.autoSlider && Number.isInteger(this.settings.sliderInterval) ){\n\n            this.autoSliderInterval = setInterval(function() {\n                    self.nextSlide();\n                    self.setSlide();\n                }, this.settings.sliderInterval\n            );\n        }\n    };\n\n    this.resetAutoSlider = self.autoSlider;\n\n\n    this.nextSlide = function () {\n        this.activeSlideId++;\n        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.previousSlide = function () {\n        this.activeSlideId--;\n        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.setPreviousAndNextSlide = function () {\n        this.nextSlideId = this.activeSlideId + 1;\n        if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;\n\n        this.previousSlideId = this.activeSlideId - 1;\n        if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;\n    };\n\n    this.setSlide = function () {\n\n        // Loop through the form elements\n        const slidesLength = self.slides.length;\n        for(let i = 0; i < slidesLength; i++){\n            const slide = self.slides[i];\n\n            // 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.resetAutoSlider();\n\n        // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;\n        // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;\n    };\n\n    this.clickDot = function (clickedDot) {\n        self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));\n        self.setSlide();\n        self.resetAutoSlider();\n    };\n\n    this.setActiveDot = function () {\n\n        const dots = document.querySelectorAll(this.settings.dots);\n        const dotsLength = dots.length;\n        for(let i = 0; i < dotsLength; i++){\n            const dot = dots[i];\n            const 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            const captionOrder = parseInt(caption.getAttribute('data-order'));\n\n            if(captionOrder !== self.activeSlideId) caption.classList.remove('is-active');\n            else caption.classList.add('is-active');\n        }\n    };\n}","\n/* Example\n\nconst headerImageSliderSetting = new SliderProjectorSetting({\n    sliderProjectorId: 'header-image-slider',\n    slideQuery: '#header-image-slider .placeholder figure',\n    dots: '#header-image-slider .slider-navigation-labels .navigation span',\n    autoSlider: true,\n    sliderInterval: 4000\n});\nheaderImageSliderSetting = headerImageSliderSetting.prepareParameters();\n\nconst headerImageSlider = new SliderProjector(headerImageSliderSetting).init();\n\n */\n\n//\n// let Sliders = [];\n//\n// const sliderContainers = document.querySelectorAll('.js-slider');\n// const sliderContainersLength = sliderContainers.length;\n//\n// for(let i =0; i < sliderContainersLength; i++){\n//\n//     const slider = sliderContainers[i];\n//     const sliderId = slider.getAttribute('id');\n\nexport function SliderSetting(settingsObject) {\n\n    const self = this;\n\n    this.sliderId = '';\n    this.definedPreviousNext = true;\n    this.autoSlider = false;\n    this.sliderInterval = 4000;\n    this.navigationButtons = '';\n    this.dots = '';\n    this.slideQuery = '';\n\n    this.setSliderId = function (string) {\n        this.sliderId = string;\n        return this;\n    };\n    this.setDefinedPreviousNext = function (boolean) {\n        this.definedPreviousNext = boolean;\n        return this;\n    };\n    this.setAutoSlider = function (boolean) {\n        this.autoSlider = boolean;\n        return this;\n    };\n    this.setSliderInterval = function (integer) {\n        this.sliderInterval = integer;\n        return this;\n    };\n    this.setSlideQuery = function (string) {\n        this.slideQuery = string;\n        return this;\n    };\n    this.setNavigationButtons = function (string) {\n        this.navigationButtons = string;\n        return this;\n    };\n    this.setDots = function (string) {\n        this.dots = string;\n        return this;\n    };\n    this.getSliderId = function () {\n        return this.sliderId;\n    };\n    this.getDefinedPreviousNext = function () {\n        return this.definedPreviousNext;\n    };\n    this.getAutoSlider = function () {\n        return this.autoSlider;\n    };\n    this.getSliderInterval = function () {\n        return this.sliderInterval;\n    };\n    this.getSlideQuery = function () {\n        return this.slideQuery;\n    };\n    this.getNavigationButtons = function () {\n        return this.navigationButtons;\n    };\n    this.getDots = function () {\n        return this.dots;\n    };\n\n    // Invert setters to getters\n    this.prepareParameters = function () {\n\n        return {\n            sliderId: self.getSliderId(),\n            definedPreviousNext: self.getDefinedPreviousNext(),\n            autoSlider: self.getAutoSlider(),\n            sliderInterval: self.getSliderInterval(),\n            navigationButtons: self.getNavigationButtons(),\n            dots: self.getDots(),\n            slideQuery: self.getSlideQuery()\n        }\n\n    };\n\n    // Mass assign settings\n    this.fill = function () {\n        // Object.keys(settingsObject).forEach(function (key) {\n        //     self[key] = settingsObject[key];\n        // });\n\n        const settingsObjectKeys = Object.keys(settingsObject);\n        const settingsObjectLength = settingsObjectKeys.length;\n\n        for(let i = 0; i < settingsObjectLength; i++){\n            const key = settingsObjectKeys[i];\n            self[key] = settingsObject[key];\n        }\n\n    };\n\n    this.fill();\n\n    return {\n        sliderId: self.setSliderId,\n        definedPreviousNext: self.setDefinedPreviousNext,\n        autoSlider: self.setAutoSlider,\n        sliderInterval: self.setSliderInterval,\n        navigationButtons: self.setNavigationButtons,\n        dots: self.setDots,\n        slideQuery: self.setSlideQuery,\n        prepareParameters: self.prepareParameters\n    };\n}\n\nexport function Slider(settings) {\n\n    //Define Slider object\n    const self = this;\n    this.sliderObject = '';\n\n    //SlideParameters\n    this.activeSlideId = 0;\n    this.previousSlideId = 0;\n    this.nextSlideId = 0;\n    this.availableSlides = 1;\n    this.slides = [];\n    this.autoSliderInterval = null;\n\n    this.settings = {};\n\n    this.init = function () {\n\n        //Append settings to self\n        this.settings = settings;\n\n        //Assign needed elements and calculations\n        this.sliderObject = document.getElementById(this.settings.sliderId);\n        this.slides = document.querySelectorAll(this.settings.slideQuery);\n        this.availableSlides = this.slides.length;\n        this.activeSlideId = 0;\n\n        //Define previous and next if we want to use those\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n\n        // Set active slide (and possible previous and next classes)\n        this.setSlide();\n\n        // Swipe interaction\n        const swipeGestures = new Hammer(this.sliderObject);\n        swipeGestures.on('swipeleft', function () {\n            self.resetAutoSlider();\n            self.nextSlide();\n            self.setSlide();\n        });\n        swipeGestures.on('swiperight', function () {\n            self.resetAutoSlider();\n            self.previousSlide();\n            self.setSlide();\n        });\n\n\n\n        if (this.settings.navigationButtons !== '') {\n\n            // Click interaction\n            const navigationButtons = document.querySelectorAll(this.settings.navigationButtons);\n            const navigationButtonsLength = navigationButtons.length;\n            for(let i = 0; i < navigationButtonsLength; i++){\n                const navigationButton = navigationButtons[i];\n                navigationButton.addEventListener('click', function () {\n                    self.clickNavigationButton(this);\n                });\n            }\n\n        }\n\n        if (this.settings.dots !== '') {\n            // Click interaction\n            const dots = document.querySelectorAll(this.settings.dots);\n            const dotsLength = dots.length;\n            // console.log(this.settings.dots);\n            // console.log(dots);\n            for(let i = 0; i < dotsLength; i++){\n                const dot = dots[i];\n                dot.addEventListener('click', function () {\n                    self.clickDot(this);\n                });\n            }\n\n        }\n\n        self.autoSlider();\n    };\n\n\n    this.autoSlider = function (){\n\n        if(this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval);\n\n        if(this.settings.autoSlider && Number.isInteger(this.settings.sliderInterval) ){\n\n            this.autoSliderInterval = setInterval(function() {\n                    self.nextSlide();\n                    self.setSlide();\n                }, this.settings.sliderInterval\n            );\n        }\n    };\n\n    this.resetAutoSlider = self.autoSlider;\n\n\n    this.nextSlide = function () {\n        this.activeSlideId++;\n        if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.previousSlide = function () {\n        this.activeSlideId--;\n        if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;\n\n        if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();\n    };\n\n    this.setPreviousAndNextSlide = function () {\n        this.nextSlideId = this.activeSlideId + 1;\n        if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;\n\n        this.previousSlideId = this.activeSlideId - 1;\n        if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;\n    };\n\n    this.setSlide = function () {\n\n        // Loop through the form elements\n        const slidesLength = self.slides.length;\n        for(let i = 0; i < slidesLength; i++){\n            const slide = self.slides[i];\n\n            // 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    };\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.resetAutoSlider();\n\n        // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;\n        // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;\n    };\n\n    this.clickDot = function (clickedDot) {\n        self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));\n        self.setSlide();\n        self.resetAutoSlider();\n    };\n\n    this.setActiveDot = function () {\n\n        const dots = document.querySelectorAll(this.settings.dots);\n        const dotsLength = dots.length;\n        for(let i = 0; i < dotsLength; i++){\n            const dot = dots[i];\n            let 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}","export const UpdateGridHandler = {\n    init: function () {\n\n        const loadMoreButton = document.querySelector('.js-show-more-updates');\n        const updateGridItems = document.querySelector('.js-update-grid-items');\n\n        if(!updateGridItems) {\n            return;\n        }\n\n        const updateCategoryId = updateGridItems.dataset.activeUpdateCategory;\n\n        let clicks = 0;\n\n        loadMoreButton.addEventListener('click', async (e) => {\n            e.preventDefault();\n            clicks++;\n\n            const endpoint = updateCategoryId\n                ? `/api/updates/timeline/${clicks * 9}?category=${updateCategoryId}`\n                : `/api/updates/timeline/${clicks * 9}`\n\n            const response = await fetch(endpoint);\n            const data = await response.json();\n\n            if (!data.updatesLeft) loadMoreButton.style.display = 'none';\n\n            data.updates.forEach(update => {\n                let html = `<a class=\"c-update-card js-update-grid-card\" href=\"${update.url}\" data-category-id=\"${update.categoryId}\">`;\n                if (update.image) html += `<img class=\"c-update-card__image\" src=\"${update.image}\" alt=\"${update.name}\" />`;\n                html += `<div class=\"c-update-card__body\">\n                            <h3 class=\"c-card__title\"> ${update.name}</h3>\n                            <div class=\"c-update-card__date\">\n                                ${update.date.day}/${update.date.month}/${update.date.year}\n                            </div>\n                            <div class=\"c-update-card__description\">\n                                ${update.description}\n                            </div>\n                            <div class=\"c-card__action\">\n                                <p class=\"c-text-button  c-text-button--icon \">\n                                    <span class=\"c-text-button__text\">${data.readMoreTranslation}</span>\n                                    <i class=\"c-text-button__icon\">\n                                        <svg width=\"21\" height=\"13\" viewBox=\"0 0 21 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                            <path d=\"M14.2759 12.2429L20.2461 6.27273L14.2759 0.302556L12.793 1.77273L16.2127 5.19247H0.136719V7.35298H16.2127L12.793 10.7599L14.2759 12.2429Z\" fill=\"currentColor\"></path>\n                                        </svg>\n                                    </i>\n                                </p>\n                            </div>\n                        </div>\n                    </a>`\n                updateGridItems.insertAdjacentHTML('beforeend', html);\n            })\n        })\n    }\n}\n","/* ==========================================================================\n   Customer logos slider handler\n   - Slide to next logo.\n ========================================================================== */\n\nexport const CustomerLogoSliderHandler = {\n\n    customerLogoSliderArea: null,\n    customerLogoSlides: null,\n    activeLogo: 2,\n    lazyLoadInstance: null,\n\n    init: function (lazyLoadInstance) {\n\n        CustomerLogoSliderHandler.customerLogoSliderArea = document.querySelector('.js-customer-logo-slider');\n        CustomerLogoSliderHandler.lazyLoadInstance = lazyLoadInstance;\n\n        // Only continue the init if the customer logo area is found\n        if (isset(CustomerLogoSliderHandler.customerLogoSliderArea)) {\n\n            CustomerLogoSliderHandler.replaceSources = CustomerLogoSliderHandler.customerLogoSliderArea.getAttribute('data-replace-source')\n            CustomerLogoSliderHandler.hasSwipeEvents = CustomerLogoSliderHandler.customerLogoSliderArea.getAttribute('data-has-swipe-events')\n\n                CustomerLogoSliderHandler.customerLogoSlides = CustomerLogoSliderHandler.customerLogoSliderArea.querySelectorAll('.js-customer-logo-slide');\n\n            if (CustomerLogoSliderHandler.customerLogoSlides.length >= 5 && CustomerLogoSliderHandler.replaceSources === 'true') {\n                // debugger\n\n                // Ajax.post('/api/customerLogos/slider', CustomerLogoSliderHandler.getLogoIds(), CustomerLogoSliderHandler._loadCountryBasedLogos);\n                Ajax.get('/api/customerLogos/slider', CustomerLogoSliderHandler._loadCountryBasedLogos);\n\n            } else {\n                console.log('CustomerLogoSlider: Add more customer logos to the slider');\n            }\n\n            CustomerLogoSliderHandler.addEvents();\n\n            if (CustomerLogoSliderHandler.hasSwipeEvents === 'true') {\n                CustomerLogoSliderHandler.addSwipeEvents();\n            }\n\n        }\n    },\n\n    addEvents: function () {\n\n        const next = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.c-customer-logo-slider__button.next');\n        const previous = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.c-customer-logo-slider__button.previous');\n\n        next.addEventListener('click', function () {\n            CustomerLogoSliderHandler.nextLogo();\n            CustomerLogoSliderHandler.updateSlider();\n        });\n        previous.addEventListener('click', function () {\n            CustomerLogoSliderHandler.previousLogo();\n            CustomerLogoSliderHandler.updateSlider();\n        });\n    },\n\n    addSwipeEvents: function () {\n\n        // Swipe interaction\n        const swipeGestures = new Hammer(CustomerLogoSliderHandler.customerLogoSliderArea);\n        swipeGestures.on('swipeleft', function () {\n            CustomerLogoSliderHandler.nextLogo();\n            CustomerLogoSliderHandler.updateSlider();\n        });\n\n        swipeGestures.on('swiperight', function () {\n            CustomerLogoSliderHandler.previousLogo();\n            CustomerLogoSliderHandler.updateSlider();\n        });\n\n    },\n\n\n    getLogoIds: function() {\n\n        const customerLogosLength = CustomerLogoSliderHandler.customerLogoSlides.length;\n        let customerLogoIds = [];\n\n        for(let i =0; i < customerLogosLength; i++) {\n\n            const customerLogo = CustomerLogoSliderHandler.customerLogoSlides[i];\n            const customerLogoId = customerLogo.getAttribute('data-logo-id');\n            customerLogoIds.push(customerLogoId);\n        }\n\n        return {ids: customerLogoIds};\n    },\n\n    finishLoading: function() {\n        CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide-container').classList.remove('is-loading');\n        CustomerLogoSliderHandler.lazyLoadInstance.update();\n    },\n\n    nextLogo: function () {\n        // Increment active logo id\n        CustomerLogoSliderHandler.activeLogo++;\n\n        // If it's the same as length then reset it to zero\n        if (CustomerLogoSliderHandler.activeLogo === CustomerLogoSliderHandler.customerLogoSlides.length) CustomerLogoSliderHandler.activeLogo = 0;\n    },\n\n    previousLogo: function () {\n\n        // Decrement active logo id\n        CustomerLogoSliderHandler.activeLogo--;\n\n        // If it's below zero reset it to last item\n        if (CustomerLogoSliderHandler.activeLogo < 0) CustomerLogoSliderHandler.activeLogo = CustomerLogoSliderHandler.customerLogoSlides.length - 1;\n\n    },\n\n    resetLogosOrder: function() {\n\n        CustomerLogoSliderHandler.customerLogoSlides = CustomerLogoSliderHandler.customerLogoSliderArea.querySelectorAll('.js-customer-logo-slide');\n        const customerLogosLength = CustomerLogoSliderHandler.customerLogoSlides.length;\n        for(let i = 0; i < customerLogosLength; i++) {\n            const customerLogo = CustomerLogoSliderHandler.customerLogoSlides[i];\n            customerLogo.setAttribute('data-slide-id', i);\n        }\n\n        CustomerLogoSliderHandler.updateSlider();\n\n    },\n\n    updateSlider: function () {\n\n        const previousLocator = CustomerLogoSliderHandler._calcPreviousPositions(3);\n        const previouser = CustomerLogoSliderHandler._calcPreviousPositions(2);\n        const previous = CustomerLogoSliderHandler._calcPreviousPositions(1);\n        const next = CustomerLogoSliderHandler._calcNextPositions(1);\n        const nexter = CustomerLogoSliderHandler._calcNextPositions(2);\n        const nexterLocator = CustomerLogoSliderHandler._calcNextPositions(3);\n\n        for (let i = 0; i < CustomerLogoSliderHandler.customerLogoSlides.length; i++) {\n\n            const slide = CustomerLogoSliderHandler.customerLogoSlides[i];\n\n            // Reset all possible classes\n            slide.classList.remove('c-customer-logo-slider__item--pre-previous');\n            slide.classList.remove('c-customer-logo-slider__item--position-1');\n            slide.classList.remove('c-customer-logo-slider__item--position-2');\n            slide.classList.remove('c-customer-logo-slider__item--position-3');\n            slide.classList.remove('c-customer-logo-slider__item--position-4');\n            slide.classList.remove('c-customer-logo-slider__item--position-5');\n            slide.classList.remove('c-customer-logo-slider__item--pre-next');\n            slide.classList.remove('is-hidden');\n\n            switch (i) {\n                case previousLocator:\n                    slide.classList.add('c-customer-logo-slider__item--pre-previous');\n                    break;\n                case previouser:\n                    slide.classList.add('c-customer-logo-slider__item--position-1');\n                    break;\n                case previous:\n                    slide.classList.add('c-customer-logo-slider__item--position-2');\n                    break;\n                case CustomerLogoSliderHandler.activeLogo:\n                    slide.classList.add('c-customer-logo-slider__item--position-3');\n                    break;\n                case next:\n                    slide.classList.add('c-customer-logo-slider__item--position-4');\n                    break;\n                case nexter:\n                    slide.classList.add('c-customer-logo-slider__item--position-5');\n                    break;\n                case nexterLocator:\n                    slide.classList.add('c-customer-logo-slider__item--pre-next');\n                    break;\n                default:\n                    slide.classList.add('is-hidden');\n            }\n\n        }\n\n    },\n\n    _calcPreviousPositions: function($amount) {\n        let location = CustomerLogoSliderHandler.activeLogo - $amount;\n        if (location < 0) return CustomerLogoSliderHandler.customerLogoSlides.length + location;\n        return location\n    },\n\n    _calcNextPositions: function($amount) {\n        let location = CustomerLogoSliderHandler.activeLogo + $amount;\n        if(location >= CustomerLogoSliderHandler.customerLogoSlides.length) return location - CustomerLogoSliderHandler.customerLogoSlides.length;\n        return location;\n\n    },\n\n    _loadCountryBasedLogos:function (request) {\n\n        if(request.status === 204) {\n            console.log('CustomerLogoSlider: Empty response');\n            CustomerLogoSliderHandler.finishLoading();\n            return;\n        }\n\n        if(request.status !== 200) {\n            console.log('CustomerLogoSlider: Unexpected response ' + request.status);\n            CustomerLogoSliderHandler.finishLoading();\n            return;\n        }\n\n        const customerLogoResponse = JSON.parse(request.response);\n        const customerLogos = customerLogoResponse.data;\n\n        let customerLogosHtml = '';\n\n        customerLogos.forEach(function (item) {\n            customerLogosHtml = CustomerLogoSliderHandler._prepareCustomerLogoHtml(customerLogosHtml, item);\n\n            // Check if a logo is already from generated in the cache / blade\n            const alreadyRenderLogo = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide[data-logo-id=\"' + item.id + '\"]');\n            if(isset(alreadyRenderLogo)){\n\n                // console.log('delete: ' + item.id);\n\n                // Delete if found because it would be at the end.\n                alreadyRenderLogo.remove();\n            }\n        });\n\n        const customerLogoContainer = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide-container');\n        let currentInnerHtml = customerLogoContainer.innerHTML;\n        customerLogoContainer.innerHTML = customerLogosHtml + currentInnerHtml;\n\n        CustomerLogoSliderHandler.resetLogosOrder();\n\n        CustomerLogoSliderHandler.finishLoading();\n    },\n\n    _prepareCustomerLogoHtml: function(customerLogosHtml, customerLogo) {\n\n        if(isset(customerLogo.url) && customerLogo.url !== '') customerLogosHtml += '<a target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"' + customerLogo.url + '\" aria-label=\"Go to our partners website: ' + customerLogo.url + '\" ';\n        else customerLogosHtml += '<div';\n        customerLogosHtml += ' class=\"c-customer-logo-slider__item  js-customer-logo-slide\" ';\n        customerLogosHtml += 'data-slide-id=\"\" data-logo-id=\"' + customerLogo.id + '\">' +\n            '<div class=\"c-customer-logo-slider__logo  js-lazy\" data-bg=\"' + customerLogo.image + '\"></div>';\n\n        if(isset(customerLogo.url)  && customerLogo.url !== '') customerLogosHtml += '</a>';\n        else customerLogosHtml += '</div>';\n\n        return customerLogosHtml;\n\n    }\n};\n","export default class Announcements {\n    constructor(element) {\n        this.element = element;\n        this.fadeInDelay = 600;\n        this.country = null;\n        this.announcements = [];\n\n        this.getAllAnnouncements();\n        this.getCountryByIp().then(() => {\n            this.showAnnouncements();\n        });\n    }\n\n    // PHP equivalent: app/Komma/Announcements/AnnouncementCountrySetting.php\n    static CountrySetting = {\n        'ALL': 0,\n        'SPECIFIC': 1,\n        'EXCEPT': 2\n    }\n\n    getAllAnnouncements = () => this.announcements = [...this.element.querySelectorAll('.js-announcements-item')];\n    getCountryByIp = async () => {\n        try {\n            const response = await fetch('/api/country');\n            this.country = await response.json();\n        } catch (error) {\n            console.log(error);\n        }\n    }\n\n    showAnnouncements = () => {\n        if (this.country) {\n            for (const announcement of this.announcements) {\n                const countrySetting = parseInt(announcement.dataset.countrySetting);\n\n                const countryIds = announcement.dataset.countries\n                    ?.split(',')\n                    .map(id => parseInt(id));\n\n                switch (countrySetting) {\n                    case Announcements.CountrySetting.ALL:\n                        announcement.shouldFadeIn = true;\n                        break;\n                    case Announcements.CountrySetting.SPECIFIC:\n                        announcement.shouldFadeIn = countryIds.includes(this.country.id);\n                        break;\n                    case Announcements.CountrySetting.EXCEPT:\n                        debugger\n                        announcement.shouldFadeIn = !countryIds.includes(this.country.id);\n                        break;\n                    default:\n                        announcement.shouldFadeIn = false;\n                        break;\n                }\n            }\n        }\n\n        this.announcements.forEach((announcement, index) => {\n            if (!announcement.shouldFadeIn) return;\n            setTimeout(() => {\n                announcement.classList.remove('hidden');\n            }, index * this.fadeInDelay);\n        });\n    }\n\n}","import {ScrollHandler} from \"./scrollHandler\";\nimport LazyLoad from \"vanilla-lazyload\";\nimport {AccordionHandler} from \"./accordionHandler\";\nimport {BookADemoButtonHandler} from \"./bookADemoButtonHandler\";\nimport {BrowserHandler} from \"./browserHandler\";\nimport {ChocolateFactory} from \"./chocolateFactory\";\nimport {CookieHandler} from \"./cookieHandler\";\nimport {CompareTableHandler} from \"./compareTableHandler\";\nimport {createPlanDropdownHandler} from \"./createPlanDropdownHandler\";\nimport {CustomerLogosHandler} from \"./customerLogosHandler\";\nimport {MapsHandler} from \"./mapsHandler\";\nimport {ModalHandler} from \"./modalHandler\";\nimport {OverlayMenuHandler} from \"./overlayMenuHandler\";\nimport {InputHandler} from \"./InputHandler\";\nimport {LanguageSelectorHandler} from \"./languageSelectorHandler\";\nimport {PricingDropdownHandler} from \"./pricingDropdownHandler\";\nimport {PricingHandler} from \"./pricingHandler\";\nimport {PricingSectionDropdownHandler} from \"./pricingSectionDropdownHandler\";\nimport {RecruiteeHandler} from \"./recruiteeHandler\";\nimport {ResizeHandler} from \"./resizeHandler\";\nimport {ScrollToHandler} from \"./scrollToHandler\";\nimport {SearchHandler} from \"./searchHandler\";\nimport {ShareButtonsHandler} from \"./shareButtonsHandler\";\nimport {SubmenuHandler} from \"./submenuHandler\";\nimport {TabHandler} from \"./tabHandler\";\nimport {TabsliderHandler} from \"./tabSliderHandler\";\nimport {TimelineHandler} from \"./timelineHandler\";\nimport {YoutubeHandler} from \"./youtubeHandler\";\nimport {YoutubeModalHandler} from \"./youtubeModalHandler\";\nimport {SliderProjector, SliderProjectorSetting} from \"./slideProjectorHandler\";\nimport {Slider, SliderSetting} from \"./sliderHandler\";\nimport {UpdateGridHandler} from \"./updateGridHandler\";\nimport {CustomerLogoSliderHandler} from \"./customerLogoSliderHandler\";\nimport Announcements from \"./Announcements\";\n\nwindow.addEventListener(\"load\", () => {\n    if (\"serviceWorker\" in navigator) {\n        navigator.serviceWorker.register(\"/sw.js\");\n    }\n});\n\nconst lazyLoadInstance = new LazyLoad({\n    elements_selector: '.js-lazy'\n});\n\nconst announcementsElement = document.querySelector('.js-announcements');\nif (announcementsElement) new Announcements(announcementsElement);\n\nChocolateFactory.enter();\nBrowserHandler.init();\nAccordionHandler.init();\nCookieHandler.init();\nBookADemoButtonHandler.init();\nCompareTableHandler.init();\ncreatePlanDropdownHandler.init();\nCustomerLogosHandler.init();\nInputHandler.init();\nLanguageSelectorHandler.init();\nMapsHandler.init();\nModalHandler.init();\nOverlayMenuHandler.init();\nPricingDropdownHandler.init();\nPricingHandler.init();\nPricingSectionDropdownHandler.init();\nRecruiteeHandler.init();\nResizeHandler.init();\nScrollHandler.init();\nScrollToHandler.init();\nSearchHandler.init();\nShareButtonsHandler.init();\nSubmenuHandler.init();\nTabHandler.init();\nTabsliderHandler.init();\nTimelineHandler.init();\nUpdateGridHandler.init();\nYoutubeHandler.init();\nYoutubeModalHandler.init();\nCustomerLogoSliderHandler.init(lazyLoadInstance);\n\n\n\nlet slideProjectors = [];\nconst slideProjectorContainers = document.querySelectorAll('.js-slide-projector');\nconst slideProjectorContainersLength = slideProjectorContainers.length;\n\nfor(let i =0; i < slideProjectorContainersLength; i++){\n\n    const slideProjector = slideProjectorContainers[i];\n    const slideProjectorId = slideProjector.getAttribute('id');\n\n    if(slideProjectorId !== null){\n\n        const slideProjectorSetting = new SliderProjectorSetting({\n            sliderId: slideProjectorId,\n            slideQuery: '#' + slideProjectorId +' .js-slide-projector__slide',\n            navigationButtons: '#' + slideProjectorId +' .js-slide-projector__button' ,\n            autoSlider: true,\n            sliderInterval: 4000\n        });\n\n        slideProjectors.push( new SliderProjector(slideProjectorSetting.prepareParameters()).init() );\n    }\n    else console.log('An image slider has no id...');\n}\n\nlet Sliders = [];\n\nconst sliderContainers = document.querySelectorAll('.js-slider');\nconst sliderContainersLength = sliderContainers.length;\n\nfor(let i =0; i < sliderContainersLength; i++){\n\n    const slider = sliderContainers[i];\n    const sliderId = slider.getAttribute('id');\n\n    if(sliderId !== null){\n\n        const Slidersetting = new SliderSetting({\n            sliderId: sliderId,\n            slideQuery: '#' + sliderId +' .js-slider-slide',\n            navigationButtons: '#' + sliderId +' .js-slider-button' ,\n            dots: '#' + sliderId +' .js-slider-indicator',\n        });\n\n        Sliders.push( new Slider(Slidersetting.prepareParameters()).init() );\n    }\n    else console.log('An image slider has no id...');\n}\n"],"sourceRoot":""}