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