{"version":3,"sources":["custom.js","hover3d.js","consent-handler.js"],"names":["initTextRotator","rotators","document","querySelectorAll","forEach","rotator","classList","contains","remove","handleContainerOverflow","container","styles","getComputedStyle","getPropertyValue","handleAdSticky","stickyElement","sideBar","observable","querySelector","ResizeObserver","entries","observedElement","find","n","target","style","setProperty","offsetHeight","observe","cutOffInit","nodes","node","lineHeight","dataset","linesHide","firstChild","children","opacity","heightDelta","let","translateTime","add","addEventListener","handleMouseIn","child","element","e","transitionDuration","transform","handleMouseOut","StickyToolbar","stickWrapper","sticky","getBoundingClientRect","top","window","scrollY","offsetElement","stickyOffsetElement","stickyNav","offsetNode","bottom","pageYOffset","innerHeight","InitPixelImages","length","ele","button","this","notClickedIcon","clickedIcon","InitVideoToggle","videoWrappers","videoWrapper","StartVideo","wrapper","preventDefault","src","iframe","createElement","width","height","title","frameBorder","allow","allowFullscreen","append","className","parent","parentElement","offset","animate","margin","duration","fill","onfinish","getTextHeight","textNode","span","parentNode","replaceChild","appendChild","ObserveToolSections","observer","highestIntersectingIndex","highestIntersectingEntry","entry","i","isIntersecting","setArticleStickyAdOffset","sidebar","authorCardHeight","widgetElement","widgetMargin","widgetStyles","parseFloat","marginTop","setCategoryTitleVisibility","cutOffHeight","childElements","Array","from","childNodes","filter","x","nodeName","hideCutOff","hideText","display","marginBottom","reduce","prev","curr","borderTop","borderBottom","computedStyle","borderTopWidth","borderBottomWidth","initToolSectionNavigation","navSlider","Swiper","slidesPerView","cssMode","navigation","nextEl","prevEl","disabledClass","on","init","dispatchEvent","CustomEvent","el","event","activeSection","detail","activeSlideIndex","slides","findIndex","slide","slideTo","initToolGrid","getElementById","vertSlide","freeMode","mousewheel","breakpoints","0","direction","spaceBetween","992","insertNodes","fetch","ENDPOINT","categoryId","method","then","res","text","html","DOMParser","parseFromString","bootstrap","Tooltip","finally","_","categoryLink","href","url","innerText","a","selector","clickedSlide","closest","s","removeChild","applyWindowMetaToDOM","updateDimension","throttle","containerMaxWidth","innerWidth","body","callback","wait","timeoutId","clearTimeout","setTimeout","bind","arguments","initCustomTooltips","show","visibleHeight","actualHeight","createTextNode","tempSpan","parentStyle","textContent","cssText","isNaN","console","log","getAttribute","setAttribute","getOrCreateInstance","loadScriptAsync","Promise","resolve","reject","script","onload","onerror","head","jQuery","ready","setInterval","hasClass","y","lFollowY","lFollowX","parents","lMouseX","Math","max","min","clientX","lMouseY","clientY","moveBackground","translate","css","-webit-transform","-moz-transform","requestAnimationFrame","hover3d","shine","click","removeClass","addClass","hide","loadMoreArticlePageModel","pageSize","parseInt","attr","page","totalCount","excludeHeroArticles","tagId","loadMoreVideosPageModel","pageModel","nodeId","totalCountItems","ajax","Type","data","viewModelId","success","fadeIn","Page","bubbles","cancelable","loadMoreEventsPageModel","expiredMode","getElementsByTagName","catch","toggle","form","ToggleSearch","formNode","input","placeholder","t","categoryTitle","searchToggle","ToggleToolsSearch","searchForm","closeOnBlur","close","removeEventListener","flipDown","timeStamp","Number","stamp","FlipDown","headings","start","b","id","isopteRedrawEvent","sections","IntersectionObserver","section","cutOffNodes","cutOffContainer","evt","sidebarAd","adSticky","$","fn","options","settings","extend","perspective","sensitivity","invert","hoverInClass","hoverOutClass","hoverClass","each","$this","$card","$shine","transformStyle","position","left","right","z-index","w","h","ax","offsetX","ay","offsetY","dy","dx","theta","atan2","angle","PI","timeoutClock","cf","loader","clearInterval","Error","initializeContentBlockers","blockers","unlockButton","blockedContent","nextElementSibling","removeAttribute","setConsent","checked","handleUnlock","cleanUp","hasConsent","type","consent","registerLightbox","bc","pointerEvents","previousElementSibling","handleIframeUnlock","advertising","unlockIFrames","cookieFirstLoaded","blocker","consentCategory","playVideo","tagName","category","cookieFirst","acceptCategory","necessary","performance","functional","updateConsent","contentBlocker","current","currentTarget","magnificPopup","markup","patterns","youtube","index","srcAction"],"mappings":"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","file":"custom-core.min.js","sourcesContent":["jQuery(document).ready(function () {\r\n\r\n setInterval(function () {\r\n jQuery(\".tb_see_more_btn\").html(\"mehr laden\");\r\n }, 1000);\r\n\r\n\r\n if (!jQuery('body').hasClass('device-touch')) {\r\n\r\n var lFollowX = 0,\r\n lFollowY = 0,\r\n x = 0,\r\n y = 0,\r\n friction = 1 / 30;\r\n\r\n function moveBackground() {\r\n x += (lFollowX - x) * friction;\r\n y += (lFollowY - y) * friction;\r\n\r\n translate = 'translate(' + x + 'px, ' + y + 'px) scale(1.1)';\r\n\r\n jQuery('.move-bg').css({\r\n '-webit-transform': translate,\r\n '-moz-transform': translate,\r\n 'transform': translate\r\n });\r\n\r\n window.requestAnimationFrame(moveBackground);\r\n }\r\n\r\n jQuery('.move-bg').parents('.section').on('mousemove click', function (e) {\r\n\r\n var lMouseX = Math.max(-100, Math.min(100, jQuery(window).width() / 2 - e.clientX));\r\n var lMouseY = Math.max(-100, Math.min(100, jQuery(window).height() / 2 - e.clientY));\r\n lFollowX = (20 * lMouseX) / 100; // 100 : 12 = lMouxeX : lFollow\r\n lFollowY = (20 * lMouseY) / 100;\r\n\r\n });\r\n\r\n moveBackground();\r\n }\r\n\r\n jQuery(\".img-hover-wrap\").hover3d({\r\n selector: \".img-hover-card\",\r\n shine: false,\r\n });\r\n\r\n jQuery(\"#btnReadMoreLink\").click(function (e) {\r\n if (jQuery(e.target).hasClass(\"expand\")) {\r\n jQuery(\".readmore\").removeClass(\"expand\");\r\n jQuery(e.target).removeClass(\"expand\");\r\n jQuery(\".readmore-link\").show();\r\n jQuery(e.target).html(' mehr Themen');\r\n } else {\r\n jQuery(\".readmore\").addClass(\"expand\");\r\n jQuery(e.target).addClass(\"expand\");\r\n jQuery(\".readmore-link\").hide();\r\n jQuery(e.target).html(' weniger Themen');\r\n }\r\n });\r\n\r\n var loadMoreArticlePageModel = {\r\n pageSize: parseInt(jQuery(\"#loadMoreArtikel\").attr('data-init-pageSize')),\r\n page: parseInt(jQuery(\"#loadMoreArtikel\").attr('data-init-page')) + 1,\r\n totalCount: parseInt(jQuery(\"#loadMoreArtikel\").attr('data-init-totalCount')),\r\n excludeHeroArticles: jQuery(\"#loadMoreArtikel\").attr('data-init-excludeHeroArticles') === \"True\" ? true : false,\r\n tagId: jQuery(\"#loadMoreArtikel\").attr('data-init-tagId')\r\n };\r\n\r\n jQuery(\"#btnMoreArtikel\").click(function (e) {\r\n jQuery(\"#loadMoreArtikel\").show();\r\n\r\n var pageModel = loadMoreArticlePageModel;\r\n var nodeId = jQuery(this).attr('data-nodeId');\r\n var totalCountItems = parseInt(jQuery(this).attr('data-totalCountItems'))\r\n\r\n jQuery.ajax({\r\n url: \"/umbraco/surface/Artikel/GetArticlePreviewList\",\r\n Type: 'get',\r\n data: {\r\n viewModelId: nodeId,\r\n pageSize: pageModel.pageSize,\r\n page: pageModel.page,\r\n excludeHeroArticles: pageModel.excludeHeroArticles,\r\n tagId: pageModel.tagId\r\n },\r\n success: function (html) {\r\n\r\n jQuery(\"#loadMoreArtikel\").hide();\r\n\r\n jQuery(\"#moreArtikel\").append(html);\r\n jQuery(\"#moreArtikel\").fadeIn(1500);\r\n debugger;\r\n //Model.TotalCount > 0 && (Model.Page * Model.PageSize) < totalCountItems\r\n if ((pageModel.page * pageModel.pageSize) >= totalCountItems) {\r\n jQuery(\"#btnMoreArtikel\").hide();\r\n } else {\r\n jQuery(\"#btnMoreArtikel\").data(\"bs-original-title\", \"(noch \" + pageModel.totalCount - (pageModel.Page * pageModel.pageSize) + \" weitere verfügbar)\")\r\n }\r\n\r\n pageModel.page++;\r\n\r\n window.dispatchEvent(new CustomEvent(\"update-cutoff\"));\r\n // fire event up to the dom to capture at window \r\n\r\n document.getElementById(\"moreArtikel\").dispatchEvent(new CustomEvent(\"paginated\", {\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n });\r\n });\r\n\r\n var loadMoreVideosPageModel = {\r\n pageSize: jQuery(\"#loadMoreVideos\").attr('data-init-pageSize'),\r\n page: parseInt(jQuery(\"#loadMoreVideos\").attr('data-init-page')) + 1,\r\n totalCount: jQuery(\"#loadMoreVideos\").attr('data-init-totalCount'),\r\n excludeHeroArticles: jQuery(\"#loadMoreVideos\").attr('data-init-excludeHeroArticles') === \"True\" ? true : false\r\n };\r\n\r\n jQuery(\"#btnMoreVideos\").click(function (e) {\r\n jQuery(\"#loadMoreVideos\").show();\r\n\r\n var pageModel = loadMoreVideosPageModel;\r\n var nodeId = jQuery(this).attr('data-nodeId');\r\n\r\n jQuery.ajax({\r\n url: \"/umbraco/surface/Video/GetVideoPreviewList\",\r\n Type: 'get',\r\n data: {\r\n viewModelId: nodeId,\r\n pageSize: pageModel.pageSize,\r\n page: pageModel.page,\r\n excludeHeroArticles: pageModel.excludeHeroArticles\r\n },\r\n success: function (html) {\r\n pageModel.page++;\r\n jQuery(\"#loadMoreVideos\").hide();\r\n jQuery(\"#moreVideos\").append(html);\r\n jQuery(\"#moreVideos\").fadeIn(1500);\r\n\r\n if ((pageModel.page * pageModel.pageSize) >= pageModel.totalCount) {\r\n jQuery(\"#btnMoreVideos\").hide();\r\n } else {\r\n jQuery(\"#btnMoreVideos\").data(\"bs-original-title\", \"(noch \" + pageModel.totalCount - (pageModel.Page * pageModel.pageSize) + \" weitere verfügbar)\")\r\n }\r\n window.dispatchEvent(new CustomEvent(\"update-cutoff\"));\r\n document.getElementById(\"moreVideos\").dispatchEvent(new CustomEvent(\"paginated\", {\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n });\r\n });\r\n\r\n var loadMoreEventsPageModel = {\r\n pageSize: jQuery(\"#loadMoreEvents\").attr('data-init-pageSize'),\r\n page: parseInt(jQuery(\"#loadMoreEvents\").attr('data-init-page')) + 1,\r\n totalCount: jQuery(\"#loadMoreEvents\").attr('data-init-totalCount'),\r\n excludeHeroArticles: jQuery(\"#loadMoreEvents\").attr('data-init-excludeHeroArticles') === \"True\" ? true : false,\r\n expiredMode: jQuery(\"#loadMoreEvents\").attr('data-init-expiredMode') === \"True\" ? true : false\r\n };\r\n\r\n jQuery(\"#btnMoreEvents\").click(function (e) {\r\n jQuery(\"#loadMoreEvents\").show();\r\n\r\n var pageModel = loadMoreEventsPageModel;\r\n var nodeId = jQuery(this).attr('data-nodeId');\r\n\r\n jQuery.ajax({\r\n url: \"/umbraco/surface/Event/GetEventPreviewList\",\r\n Type: 'get',\r\n data: {\r\n viewModelId: nodeId,\r\n pageSize: pageModel.pageSize,\r\n page: pageModel.page,\r\n excludeHeroArticles: pageModel.excludeHeroArticles,\r\n expiredMode: pageModel.expiredMode\r\n },\r\n success: function (html) {\r\n\r\n pageModel.page++;\r\n jQuery(\"#loadMoreEvents\").hide();\r\n jQuery(\"#moreEvents\").append(html);\r\n jQuery(\"#moreEvents\").fadeIn(1500);\r\n\r\n if (((pageModel.page - 1) * pageModel.pageSize) >= pageModel.totalCount) {\r\n jQuery(\"#btnMoreEvents\").hide();\r\n } else {\r\n jQuery(\"#btnMoreEvents\").data(\"bs-original-title\", \"(noch \" + pageModel.totalCount - (pageModel.Page * pageModel.pageSize) + \" weitere verfügbar)\")\r\n }\r\n document.getElementById(\"moreEvents\").dispatchEvent(new CustomEvent(\"paginated\", {\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n });\r\n });\r\n\r\n /**\r\n * Listen on the bootstrap tooltip show event and prevent tooltip if text is not cut off\r\n */\r\n jQuery('.cuff-off-tooltip').on('show.bs.tooltip', function (e) {\r\n const textHeight = getTextHeight(e.target?.childNodes[0]);\r\n const parentHeight = e.target?.parentElement.offsetHeight;\r\n if (textHeight <= parentHeight) {\r\n e.preventDefault();\r\n }\r\n })\r\n});\r\n\r\n\r\n/**\r\n * Register the pluginBootstrapReady event and call initCustomTooltips to initialize the custom tooltips\r\n * **/\r\nwindow.addEventListener(\"pluginBootstrapReady\", () => {\r\n initCustomTooltips();\r\n window.addEventListener(\"paginated\", initCustomTooltips);\r\n});\r\n\r\n\r\n/**\r\n * Register the pluginTextRotatorReady event and call initTextRotator to initialize the text rotator\r\n */\r\n\r\nfunction initTextRotator() {\r\n const rotators = document.querySelectorAll(\".text-rotater\");\r\n if (!rotators) {\r\n return;\r\n }\r\n\r\n rotators.forEach(rotator => {\r\n if (rotator.classList.contains(\"hidden\")) {\r\n rotator.classList.remove(\"hidden\");\r\n }\r\n });\r\n}\r\n\r\nwindow.addEventListener(\"pluginTextRotatorReady\", initTextRotator);\r\n\r\nwindow.onload = () => {\r\n\r\n applyWindowMetaToDOM();\r\n const pixelImages = document.getElementsByTagName(\"sp-pixel-image\");\r\n if (pixelImages.length > 0) {\r\n loadScriptAsync(\"/js/WebComponents/spWebComponents.js\")\r\n .then(_ => {\r\n InitPixelImages(document.querySelectorAll(\".pixelMe\"));\r\n }).catch(_ => console.log(\"failed to load spWebComponents.js\"));\r\n }\r\n\r\n InitVideoToggle(document.querySelectorAll(\".yt-video-wrapper\"));\r\n const toggle = document.querySelector('.menu-item > a[data-toggle=\"search\"]')\r\n const form = document.querySelector(\".top-search-form\");\r\n\r\n // check if the toggle and form node exists in the dom\r\n if (toggle && form) {\r\n // add the event listener for the click\r\n toggle.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n ToggleSearch(form);\r\n })\r\n }\r\n\r\n // call setCategoryTitleVisibility to check if the title cutoff needs to be set\r\n const categoryTitle = document.getElementById(\"category-title\");\r\n\r\n\r\n if (categoryTitle) setCategoryTitleVisibility(categoryTitle);\r\n\r\n // set offset based on author card height for sticky add\r\n const sidebar = document.querySelector(\".author-offset:has(.card-author)\");\r\n if (sidebar) {\r\n setArticleStickyAdOffset(sidebar);\r\n }\r\n\r\n const searchToggle = document.querySelector(\".search-toggle\");\r\n if (searchToggle) {\r\n searchToggle.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n ToggleToolsSearch(searchToggle.parentElement);\r\n })\r\n }\r\n\r\n function ToggleToolsSearch(node) {\r\n const searchForm = node.querySelector(\".menu-search\");\r\n\r\n if (searchForm.classList.contains(\"open\")) {\r\n close();\r\n return;\r\n }\r\n\r\n function closeOnBlur(event) {\r\n if (!searchForm.contains(event.target) && !node.contains(event.target)) {\r\n close();\r\n }\r\n }\r\n\r\n function close() {\r\n document.removeEventListener(\"click\", closeOnBlur);\r\n searchForm.classList.remove(\"open\");\r\n }\r\n\r\n document.addEventListener(\"click\", closeOnBlur);\r\n searchForm.classList.add(\"open\");\r\n }\r\n\r\n function ToggleSearch(formNode) {\r\n\r\n const input = formNode.querySelector(\"input\");\r\n const text = input.dataset.placeholder;\r\n let placeholder = \"\";\r\n\r\n if (formNode.classList.contains(\"rendered\")) {\r\n input.setAttribute(\"placeholder\", \"\")\r\n formNode.classList.remove(\"rendered\");\r\n formNode.animate([\r\n {\r\n width: \"0\",\r\n opacity: \"0\"\r\n }\r\n ], {duration: 500, fill: 'forwards'})\r\n } else {\r\n formNode.animate(\r\n [\r\n {\r\n width: \"100%\",\r\n opacity: \"1\"\r\n }\r\n ], {duration: 500, fill: 'forwards'})\r\n //TODO: Need to work on a way to stop the text render execution when toggling \r\n // multiple times in a fast pace\r\n .onfinish = () => {\r\n Array.from(text).forEach((t, i) => {\r\n setTimeout(() => {\r\n placeholder += t;\r\n formNode.querySelector(\"input\").setAttribute(\"placeholder\", placeholder);\r\n }, i * 125)\r\n })\r\n }\r\n formNode.classList.add(\"rendered\");\r\n\r\n }\r\n }\r\n\r\n const flipDown = document.querySelector(\"#flipdown\");\r\n if (flipDown) {\r\n const timeStamp = Number.parseInt(flipDown.dataset.stamp);\r\n new FlipDown(timeStamp, {\r\n headings: ['Tage', 'Stunden', 'Minuten', 'Sekunden']\r\n }).start()\r\n }\r\n\r\n\r\n // register eventListener for sticky tool navbar\r\n const stickWrapper = document.querySelectorAll(\".sticky-wrapper\");\r\n stickWrapper.forEach((e) => {\r\n if (e) {\r\n e.style.height = e.offsetHeight + \"px\";\r\n window.addEventListener(\"scroll\", () => StickyToolbar(e));\r\n StickyToolbar(e);\r\n }\r\n })\r\n document.querySelectorAll(\".expand-btn\").forEach((b) => {\r\n b.addEventListener(\"click\", () => {\r\n let isExpanded = b.classList.contains(\"expand\");\r\n isExpanded ? b.classList.remove(\"expand\") : b.classList.add(\"expand\");\r\n })\r\n })\r\n\r\n document.querySelectorAll(\".cutoff-area-capture\").forEach((b) => {\r\n b.addEventListener(\"click\", (event) => {\r\n if (event.target.classList.contains('plan-exapnd-btn') || event.target.closest('.plan-exapnd-btn')) {\r\n let isExpanded = event.target.closest('.plan-exapnd-btn').classList.contains(\"expand\");\r\n isExpanded\r\n ? event.target.closest('.plan-exapnd-btn').classList.remove(\"expand\")\r\n : event.target.closest('.plan-exapnd-btn').classList.add(\"expand\");\r\n }\r\n\r\n if (b.id === \"pagination-container\") {\r\n const isopteRedrawEvent = new CustomEvent(\"update-isotope\")\r\n b.dispatchEvent(isopteRedrawEvent);\r\n }\r\n })\r\n })\r\n\r\n\r\n // register intersection Observer for tool detail page\r\n const sections = document.querySelectorAll(\"[data-navigate]\");\r\n if (sections.length > 0) {\r\n const observer = new IntersectionObserver(ObserveToolSections, {});\r\n sections.forEach((section) => {\r\n observer.observe(section);\r\n })\r\n }\r\n\r\n /**\r\n * Init Cutoff text Nodes\r\n */\r\n window.addEventListener(\"update-cutoff\", function () {\r\n const cutOffNodes = document.querySelectorAll(\"[data-cutoff='true']\");\r\n if (cutOffNodes.length > 0) {\r\n cutOffInit(cutOffNodes)\r\n }\r\n });\r\n\r\n /**\r\n * Register Tool Description Cutoff Container\r\n */\r\n const cutOffContainer = document.querySelector(\".tool-text .cutoff-text\");\r\n if (cutOffContainer) {\r\n handleContainerOverflow(cutOffContainer)\r\n window.addEventListener(\"resize\", () => handleContainerOverflow(cutOffContainer))\r\n }\r\n\r\n // register htmx event handler for tutorial pagination\r\n document.body.addEventListener('htmx:afterProcessNode', function (evt) {\r\n const target = document.getElementById(\"pagination-container\");\r\n target\r\n });\r\n\r\n\r\n // register and fire all update-cutoff related events\r\n jQuery(document).on('initialized.owl.carousel', '.owl-carousel', function () {\r\n window.dispatchEvent(new CustomEvent(\"update-cutoff\"));\r\n document.querySelectorAll(\".owl-loader\").forEach(ele => {\r\n ele.classList.remove(\"owl-loader\");\r\n });\r\n });\r\n\r\n window.dispatchEvent(new CustomEvent(\"update-cutoff\"));\r\n\r\n // register ad sticky handler\r\n const sidebarAd = document.querySelector(\".sidebar.sticky-sidebar\")\r\n const adSticky = document.getElementById(\"ad-sticky\");\r\n\r\n if (adSticky && sidebarAd) {\r\n handleAdSticky(adSticky, sidebarAd);\r\n }\r\n}\r\n\r\n\r\nfunction handleContainerOverflow(container) {\r\n const styles = getComputedStyle(container);\r\n const lineHeight = styles.getPropertyValue(\"--line-height\");\r\n const lines = styles.getPropertyValue(\"--max-lines\");\r\n}\r\n\r\nfunction handleAdSticky(stickyElement, sideBar) {\r\n if (!sideBar.querySelector(\".observe-mutable\")) {\r\n return;\r\n }\r\n const observable = sideBar.querySelector(\".observe-mutable\");\r\n\r\n const resizeObserver = new ResizeObserver(entries => {\r\n const observedElement = entries.find(n => n.target.classList.contains(\"observe-mutable\"));\r\n sideBar.style.setProperty(\"--category-offset\", `${observedElement.target.offsetHeight}px`);\r\n });\r\n\r\n resizeObserver.observe(observable);\r\n}\r\n\r\n/**\r\n *\r\n * @param nodes - all cutoff that needs to get the events attached on\r\n */\r\nfunction cutOffInit(nodes) {\r\n nodes.forEach((node) => {\r\n if (node.classList.contains(\"cutoff-init\")) return;\r\n\r\n const transitionTimePerPixel = 0.03;\r\n\r\n // grab cutOff settings from node if they exist\r\n const lineHeight = node.dataset.lineHeight;\r\n const linesHide = node.dataset.linesHide;\r\n updateCutOffSettings(node, lineHeight, linesHide);\r\n\r\n // determine if node content has more height than node itself\r\n const firstChild = node.children[0];\r\n if (firstChild.offsetHeight > node.offsetHeight) {\r\n const indicator = node.querySelector(\".cutoff-indicator\");\r\n\r\n // enable indicator if it exists\r\n if (indicator) {\r\n node.querySelector(\".cutoff-indicator\").classList.remove(\"d-none\")\r\n node.querySelector(\".cutoff-indicator\").style.opacity = 1;\r\n }\r\n\r\n const heightDelta = firstChild.offsetHeight - node.offsetHeight;\r\n let translateTime = transitionTimePerPixel * heightDelta + \"s\";\r\n\r\n node.classList.add(\"cutoff-init\");\r\n\r\n // add event listeners for mouse in mouse out\r\n node.addEventListener(\"mouseenter\", (e) => handleMouseIn(e, heightDelta, translateTime));\r\n node.addEventListener(\"mouseleave\", (e) => handleMouseOut(e, translateTime));\r\n }\r\n\r\n })\r\n\r\n\r\n function handleMouseIn(e, heightDelta, translateTime) {\r\n const element = e.target;\r\n const child = element.querySelector(\"p\");\r\n child.style.transitionDuration = translateTime;\r\n child.style.transform = \"translateY(\" + (heightDelta * -1) + \"px)\";\r\n }\r\n\r\n function handleMouseOut(e, translateTime) {\r\n const element = e.target;\r\n const child = element.querySelector(\"p\");\r\n child.style.transitionDuration = translateTime;\r\n child.style.transform = \"translateY(0px)\";\r\n }\r\n\r\n function updateCutOffSettings(node, lineHeight, linesHide) {\r\n if (lineHeight) node.style.setProperty('--line-height', lineHeight + 'px');\r\n if (linesHide) node.style.setProperty('--lines-hide', linesHide)\r\n }\r\n}\r\n\r\n// sticky toolbar script\r\nfunction StickyToolbar(stickWrapper) {\r\n\r\n let sticky = stickWrapper.getBoundingClientRect().top + window.scrollY;\r\n let offsetElement = stickWrapper.dataset.stickyOffsetElement;\r\n\r\n if (offsetElement) {\r\n const offsetNode = document.querySelector(offsetElement);\r\n sticky = sticky - offsetNode.offsetHeight;\r\n }\r\n\r\n const stickyNav = stickWrapper.querySelector(\":first-child\");\r\n const isBottomSticky = stickWrapper.dataset.bottom === \"true\";\r\n\r\n if (isBottomSticky) {\r\n if (window.pageYOffset + window.innerHeight <= sticky) {\r\n stickyNav.classList.add(\"sticky-at-bottom\");\r\n } else {\r\n stickyNav.classList.remove(\"sticky-at-bottom\");\r\n }\r\n } else {\r\n if (window.pageYOffset >= sticky) {\r\n stickyNav.classList.add(\"sticky\");\r\n\r\n } else {\r\n stickyNav.classList.remove(\"sticky\");\r\n }\r\n }\r\n}\r\n\r\n// register the pixelation button eventListener to change the icon based on button State\r\nfunction InitPixelImages(nodes) {\r\n\r\n if (nodes.length === 0) return;\r\n\r\n nodes.forEach((ele) => {\r\n ele.addEventListener(\"click\", function () {\r\n const button = this.querySelector(\"i\");\r\n const notClickedIcon = \"bi-info-circle-fill\";\r\n const clickedIcon = \"bi-x-circle-fill\";\r\n\r\n // button notClicked State\r\n if (button.classList.contains(notClickedIcon)) {\r\n button.classList.remove(notClickedIcon);\r\n button.classList.add(clickedIcon);\r\n }\r\n\r\n // button isClicked State\r\n else {\r\n button.classList.remove(clickedIcon);\r\n button.classList.add(notClickedIcon);\r\n }\r\n })\r\n })\r\n}\r\n\r\n// handle yt video during layout dev\r\nfunction InitVideoToggle(videoWrappers) {\r\n\r\n if (videoWrappers.length === 0) return;\r\n\r\n videoWrappers.forEach((videoWrapper) => {\r\n const button = videoWrapper.querySelector(\".start-yt\");\r\n button.addEventListener(\"click\", function (e) {\r\n StartVideo(e, videoWrapper);\r\n });\r\n });\r\n\r\n\r\n function StartVideo(e, wrapper) {\r\n e.preventDefault();\r\n const src = wrapper.dataset.src;\r\n if (!src) {\r\n return;\r\n }\r\n\r\n const iframe = BuildIframe(src, wrapper);\r\n wrapper.querySelector(\".poster\").remove();\r\n wrapper.querySelector(\".poster-overlay\").remove();\r\n wrapper.append(iframe);\r\n const wrapperNode = GetWrapperNode(wrapper, \"row\").querySelector(\".overlapp\");\r\n animateNode(wrapperNode);\r\n\r\n }\r\n\r\n function animateNode(node) {\r\n // get --overlapp-offset variable from node\r\n let style = getComputedStyle(node);\r\n let offset = style.getPropertyValue(\"--overlapp-offset\");\r\n\r\n if (!offset) {\r\n return\r\n }\r\n\r\n node.animate([\r\n {margin: `-${offset}`},\r\n {margin: '0'}\r\n ], {\r\n duration: 500,\r\n fill: 'forwards'\r\n }).onfinish = () => {\r\n node.animate([\r\n {width: '100%'}\r\n ], {\r\n duration: 500,\r\n fill: 'forwards'\r\n });\r\n };\r\n }\r\n\r\n function GetWrapperNode(wrapper, className) {\r\n let parent = wrapper.parentElement;\r\n while (!parent.classList.contains(className)) {\r\n parent = parent.parentElement;\r\n }\r\n return parent;\r\n }\r\n\r\n function BuildIframe(src, wrapper) {\r\n var iframe = document.createElement('iframe');\r\n iframe.width = '100%';\r\n iframe.height = '100%';\r\n iframe.src = src + \"?autoplay=1\";\r\n iframe.title = 'YouTube video player';\r\n iframe.frameBorder = '0';\r\n iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share';\r\n iframe.allowFullscreen = true;\r\n iframe.classList.add(\"responsive-iframe\");\r\n return iframe;\r\n }\r\n}\r\n\r\n/**\r\n * The Function takes a #textnode and places into the dome to measure the height\r\n * @param textNode\r\n * @returns {number}\r\n */\r\nfunction getTextHeight(textNode) {\r\n if (!textNode) return 0;\r\n const span = document.createElement('span');\r\n textNode.parentNode.replaceChild(span, textNode);\r\n span.appendChild(textNode);\r\n const height = span.offsetHeight;\r\n span.parentNode.replaceChild(textNode, span);\r\n return height;\r\n}\r\n\r\nfunction ObserveToolSections(entries, observer) {\r\n let highestIntersectingIndex = -1;\r\n let highestIntersectingEntry = null;\r\n\r\n entries.forEach((entry, i) => {\r\n if (entry.isIntersecting && i > highestIntersectingIndex) {\r\n highestIntersectingIndex = i;\r\n highestIntersectingEntry = entry;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Sets the sticky ad offset for the article's sidebar.\r\n *\r\n * @param {HTMLElement} sidebar - The sidebar element.\r\n *\r\n * @return {void}\r\n */\r\nfunction setArticleStickyAdOffset(sidebar) {\r\n const offset = 10;\r\n const authorCardHeight = sidebar.querySelector(\".card-author\")?.offsetHeight;\r\n const widgetElement = document.querySelector(\".widget:not(:has(.card-author))\");\r\n let widgetMargin = 0;\r\n\r\n if (widgetElement) {\r\n const widgetStyles = getComputedStyle(widgetElement);\r\n widgetMargin = parseFloat(widgetStyles.marginTop);\r\n }\r\n\r\n sidebar.style.top = authorCardHeight === 0 ? \"0\" : `${(authorCardHeight - offset - widgetMargin) * -1}px`;\r\n}\r\n\r\n/**\r\n * Sets the visibility of the category title in the \"ToolCategory\" partial view.\r\n * @param {HTMLElement} node - The parent node of the category title and related elements.\r\n * @returns {void}\r\n */\r\nfunction setCategoryTitleVisibility(node) {\r\n const offSet = 10;\r\n const cutOffHeight = node.querySelector(\".cutoff-text\")?.offsetHeight;\r\n const childElements = Array.from(node.querySelector(\".cutoff-text\").childNodes)\r\n .filter(x => x.nodeName !== \"#text\");\r\n\r\n if (childElements.length === 0) {\r\n hideCutOff(true, false)\r\n return;\r\n }\r\n\r\n const childrenHeightSum = childElements.reduce((prev, curr) => prev + getComputedHeight(curr), 0)\r\n\r\n if (childrenHeightSum - offSet <= cutOffHeight) {\r\n hideCutOff(false);\r\n }\r\n\r\n function hideCutOff(hideText) {\r\n if (hideText) {\r\n node.querySelector(\".cutoff-text\").style.display = \"none\";\r\n node.querySelector(\".row > div > h1\").style.marginBottom = \"0\";\r\n }\r\n\r\n node.querySelector(\".cutoff-text\").style.height = \"auto\";\r\n node.querySelector(\".cutoff-text\").classList.add(\"disable-fade\");\r\n node.querySelector(\".col-12:has( > .toggle-cutoff)\").style.display = \"none\";\r\n if (node.classList.contains(\"tools-category\")) {\r\n node.classList.remove(\"pb-4\");\r\n node.classList.add(\"pb-5\");\r\n }\r\n }\r\n\r\n function getComputedHeight(element) {\r\n if (element) {\r\n const computedStyle = window.getComputedStyle(element);\r\n\r\n const marginTop = parseFloat(computedStyle.marginTop);\r\n const marginBottom = parseFloat(computedStyle.marginBottom);\r\n\r\n const borderTop = parseFloat(computedStyle.borderTopWidth);\r\n const borderBottom = parseFloat(computedStyle.borderBottomWidth);\r\n\r\n return element.offsetHeight + marginTop + marginBottom + borderTop + borderBottom;\r\n }\r\n return 0;\r\n }\r\n}\r\n\r\n\r\nwindow.addEventListener('pluginSwiperReady', function () {\r\n if (document.getElementById(\"vertical-scroll-swiper\")) {\r\n initToolGrid()\r\n }\r\n\r\n if (document.getElementById(\"tool-nav\")) {\r\n initToolSectionNavigation();\r\n }\r\n\r\n})\r\n\r\nfunction initToolSectionNavigation() {\r\n const navSlider = new Swiper('#tool-nav', {\r\n slidesPerView: \"auto\",\r\n cssMode: true,\r\n navigation: {\r\n nextEl: document.querySelector(\".swiper-button-next\"),\r\n prevEl: document.querySelector(\".swiper-button-prev\"),\r\n disabledClass: \"nav-disabled\"\r\n },\r\n on: {\r\n init: function () {\r\n window.dispatchEvent(new CustomEvent('navSwiperInitialized'));\r\n }\r\n }\r\n });\r\n\r\n navSlider.el.addEventListener(\"activeItemChanged\", function (event) {\r\n const activeSection = event.detail;\r\n let activeSlideIndex = navSlider.slides.findIndex(slide => slide.querySelector(`[href*=\"#${activeSection}\"]`));\r\n if (activeSlideIndex !== -1) {\r\n navSlider.slideTo(activeSlideIndex);\r\n }\r\n });\r\n}\r\n\r\nfunction initToolGrid() {\r\n const activeCategory = 0;\r\n const ENDPOINT = \"/umbraco/surface/ToolPagination/GetToolGridItemsByCategory\";\r\n const container = document.getElementById(\"tools-container\");\r\n const wrapper = document.getElementById(\"filter-tools\");\r\n if (!wrapper) return;\r\n\r\n const vertSlide = new Swiper('#vertical-scroll-swiper', {\r\n freeMode: true,\r\n mousewheel: false,\r\n breakpoints: {\r\n 0: {\r\n slidesPerView: 'auto',\r\n direction: 'horizontal',\r\n spaceBetween: 15\r\n },\r\n\r\n 992: {\r\n slidesPerView: 10,\r\n direction: 'vertical',\r\n }\r\n },\r\n navigation: {\r\n nextEl: '.swiper-button-next',\r\n prevEl: '.swiper-button-prev',\r\n },\r\n });\r\n\r\n\r\n // render the initial tools\r\n const activeSlide = vertSlide.slides.find(a => a.classList.contains(\"swiper-slide-active\"));\r\n insertNodes(activeSlide, container)\r\n\r\n // handle displaying active category\r\n if (vertSlide?.slides?.length) {\r\n vertSlide?.el?.addEventListener(\"click\", function (event) {\r\n const clickedSlide = event.target.closest('.swiper-slide');\r\n if (clickedSlide) {\r\n vertSlide.slides.forEach(s => {\r\n s.classList.remove(\"active\")\r\n s.querySelector(\"i\").classList.remove('animated', 'fadeInLeft', 'faster', 'inline-block');\r\n });\r\n clickedSlide.classList.add(\"active\");\r\n clickedSlide.querySelector(\"i\").classList.add('animated', 'fadeInLeft', 'faster', 'inline-block');\r\n const id = clickedSlide.dataset.categoryId;\r\n // document.getElementById(\"active-category\").innerText = clickedSlide.innerText;\r\n if (id !== activeCategory) {\r\n removeNodes(container, \".tool-grid-item-wrapper\")\r\n insertNodes(clickedSlide, container);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function removeNodes(container, selector) {\r\n const nodes = container.querySelectorAll(selector);\r\n nodes.forEach(n => {\r\n container.removeChild(n);\r\n });\r\n }\r\n\r\n function insertNodes(slide, container) {\r\n fetch(ENDPOINT + `?id=${slide.dataset.categoryId}`, {\r\n method: \"GET\"\r\n })\r\n .then(res => res.text())\r\n .then(html => {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n const nodes = doc.querySelectorAll(\".tool-grid-item-wrapper\")\r\n for (const node of nodes) {\r\n container.appendChild(node);\r\n node.classList.add(\"animated\", \"bounceIn\");\r\n new bootstrap.Tooltip(node)\r\n }\r\n }).finally(_ => {\r\n // update the active category with url and name\r\n const categoryLink = document.querySelector(\"#active-category a\");\r\n categoryLink.href = slide.dataset.url;\r\n categoryLink.innerText = slide.dataset.filter;\r\n\r\n // show slider and grid\r\n document.querySelector('.loading-spinner').style.display = 'none';\r\n wrapper.classList.remove(\"hidden\", \"opacity-0\");\r\n })\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Applies window metadata to DOM elements.\r\n * It sets a CSS variable with the current screen width\r\n * and triggers the updateDimension function.\r\n *\r\n * @function applyWindowMetaToDOM\r\n * @returns {void}\r\n */\r\nfunction applyWindowMetaToDOM() {\r\n updateDimension();\r\n window.addEventListener(\"resize\", throttle(updateDimension, 100))\r\n}\r\n\r\n/**\r\n * This function updates the CSS property '--container-max-width' of the document body based on the given width.\r\n *\r\n * @param {number} width - The width to be used as the container maximum width value when the viewport width is less than 576 pixels.\r\n * @return {undefined}\r\n */\r\nfunction updateDimension() {\r\n let containerMaxWidth;\r\n let width = window.innerWidth;\r\n\r\n if (innerWidth >= 1400) {\r\n containerMaxWidth = 1320;\r\n } else if (innerWidth >= 1200) {\r\n containerMaxWidth = 1140;\r\n } else if (innerWidth >= 992) {\r\n containerMaxWidth = 960;\r\n } else if (innerWidth >= 768) {\r\n containerMaxWidth = 720;\r\n } else if (innerWidth >= 576) {\r\n containerMaxWidth = 540;\r\n } else {\r\n containerMaxWidth = width;\r\n }\r\n document.body.style.setProperty('--screen-width', `${width}px`);\r\n document.body.style.setProperty('--container-max-width', `${containerMaxWidth}px`);\r\n}\r\n\r\n/**\r\n * Creates a throttled function that invokes the provided callback only once within the specified wait duration.\r\n *\r\n * @param {Function} callback - The callback function to be executed.\r\n * @param {number} wait - The amount of time in milliseconds to wait before invoking the callback.\r\n * @return {Function} - The throttled function.\r\n */\r\nfunction throttle(callback, wait) {\r\n let timeoutId;\r\n\r\n return function () {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(callback.bind(this, ...arguments), wait);\r\n }\r\n}\r\n\r\nfunction initCustomTooltips() {\r\n const tooltipNodes = document.querySelectorAll('.bs-tooltip-custom');\r\n\r\n tooltipNodes.forEach((ele) => {\r\n if (ele.getAttribute(\"data-bs-title\") !== null) {\r\n ele.setAttribute(\"data-bs-custom-class\", \"bs-tooltip-custom\");\r\n const instance = bootstrap.Tooltip.getOrCreateInstance(ele);\r\n ele.addEventListener(\"show.bs.tooltip\", show);\r\n }\r\n });\r\n\r\n\r\n function show(event) {\r\n try {\r\n const ele = this;\r\n if (ele.classList.contains(\"mx-rows\") === false)\r\n return;\r\n\r\n if (shouldShow(ele))\r\n event.preventDefault();\r\n\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n\r\n function calcActualHeight(lines, lineHeight) {\r\n return lines * lineHeight;\r\n }\r\n\r\n function shouldShow(ele) {\r\n const visibleHeight = ele.offsetHeight;\r\n let actualHeight = ele.querySelector(\"*:first-of-type\")?.offsetHeight;\r\n\r\n if (!actualHeight) {\r\n actualHeight = getHeightFromTextNode(ele);\r\n }\r\n\r\n if (isNaN(actualHeight) || isNaN(visibleHeight)) {\r\n return false;\r\n }\r\n\r\n\r\n return actualHeight <= visibleHeight;\r\n }\r\n\r\n function getHeightFromTextNode(element) {\r\n\r\n const textNode = document.createTextNode(element.innerText);\r\n\r\n const tempSpan = document.createElement('span');\r\n\r\n tempSpan.textContent = textNode.textContent;\r\n\r\n const parentStyle = window.getComputedStyle(element);\r\n tempSpan.style.cssText = parentStyle.cssText;\r\n tempSpan.style.display = \"inline-block\";\r\n tempSpan.style.opacity = \"0\";\r\n\r\n element.appendChild(tempSpan);\r\n const height = tempSpan.offsetHeight;\r\n tempSpan.remove();\r\n\r\n return height;\r\n }\r\n\r\n}\r\n\r\n\r\nfunction loadScriptAsync(src) {\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = src;\r\n script.onload = resolve;\r\n script.onerror = reject;\r\n document.head.appendChild(script);\r\n })\r\n}\r\n","/*\r\njQuery Hover3d\r\n=================================================\r\nVersion: 1.0.0\r\nAuthor: Rian Ariona\r\nWebsite: http://ariona.net\r\nDocs: http://ariona.github.io/hover3d\r\nRepo: http://github.com/ariona/hover3d\r\nIssues: http://github.com/ariona/hover3d/issues\r\n*/\r\n\r\n(function ($) {\r\n\r\n\t$.fn.hover3d = function (options) {\r\n\r\n\t\tvar settings = $.extend({\r\n\t\t\tselector: null,\r\n\t\t\tperspective: 1000,\r\n\t\t\tsensitivity: 20,\r\n\t\t\tinvert: false,\r\n\t\t\tshine: false,\r\n\t\t\thoverInClass: \"hover-in\",\r\n\t\t\thoverOutClass: \"hover-out\",\r\n\t\t\thoverClass: \"hover-3d\"\r\n\t\t}, options);\r\n\r\n\t\treturn this.each(function () {\r\n\r\n\t\t\tvar $this = $(this),\r\n\t\t\t\t$card = $this.find(settings.selector);\r\n\r\n\t\t\tif (settings.shine) {\r\n\t\t\t\t$card.append('
');\r\n\t\t\t}\r\n\t\t\tvar $shine = $(this).find(\".shine\");\r\n\r\n\t\t\t// Set perspective and transformStyle value\r\n\t\t\t// for element and 3d object\r\n\t\t\t$this.css({\r\n\t\t\t\tperspective: settings.perspective + \"px\",\r\n\t\t\t\ttransformStyle: \"preserve-3d\"\r\n\t\t\t});\r\n\r\n\t\t\t$card.css({\r\n\t\t\t\tperspective: settings.perspective + \"px\",\r\n\t\t\t\ttransformStyle: \"preserve-3d\",\r\n\t\t\t});\r\n\r\n\t\t\t$shine.css({\r\n\t\t\t\tposition: \"absolute\",\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: 0,\r\n\t\t\t\tbottom: 0,\r\n\t\t\t\tright: 0,\r\n\t\t\t\t\"z-index\": 9\r\n\t\t\t});\r\n\r\n\t\t\t// Mouse Enter function, this will add hover-in\r\n\t\t\t// Class so when mouse over it will add transition\r\n\t\t\t// based on hover-in class\r\n\t\t\tfunction enter() {\r\n\t\t\t\t$card.addClass(settings.hoverInClass + \" \" + settings.hoverClass);\r\n\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t$card.removeClass(settings.hoverInClass);\r\n\t\t\t\t}, 1000);\r\n\t\t\t}\r\n\r\n\t\t\t// Mouse movement Parallax effect\r\n\t\t\tfunction move(event) {\r\n\t\t\t\tvar w = $this.innerWidth(),\r\n\t\t\t\t\th = $this.innerHeight(),\r\n\t\t\t\t\tax = settings.invert ? (w / 2 - event.offsetX) / settings.sensitivity : -(w / 2 - event.offsetX) / settings.sensitivity,\r\n\t\t\t\t\tay = settings.invert ? -(h / 2 - event.offsetY) / settings.sensitivity : (h / 2 - event.offsetY) / settings.sensitivity;\r\n\t\t\t\tdy = event.offsetY - h / 2,\r\n\t\t\t\t\tdx = event.offsetX - w / 2,\r\n\t\t\t\t\ttheta = Math.atan2(dy, dx),\r\n\t\t\t\t\tangle = theta * 180 / Math.PI - 90;\r\n\r\n\t\t\t\tif (angle < 0) {\r\n\t\t\t\t\tangle = angle + 360;\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\t$card.css({\r\n\t\t\t\t\tperspective: settings.perspective + \"px\",\r\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\r\n\t\t\t\t\ttransform: \"rotateY(\" + ax + \"deg) rotateX(\" + ay + \"deg)\"\r\n\t\t\t\t});\r\n\r\n\t\t\t\t$shine.css('background', 'linear-gradient(' + angle + 'deg, rgba(255,255,255,' + event.offsetY / h * .5 + ') 0%,rgba(255,255,255,0) 80%)');\r\n\t\t\t}\r\n\r\n\t\t\t// Mouse leave function, will set the transform\r\n\t\t\t// property to 0, and add transition class\r\n\t\t\t// for exit animation\r\n\t\t\tfunction leave() {\r\n\t\t\t\t$card.addClass(settings.hoverOutClass + \" \" + settings.hoverClass);\r\n\t\t\t\t$card.css({\r\n\t\t\t\t\tperspective: settings.perspective + \"px\",\r\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\r\n\t\t\t\t\ttransform: \"rotateX(0) rotateY(0)\"\r\n\t\t\t\t});\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t$card.removeClass(settings.hoverOutClass + \" \" + settings.hoverClass);\r\n\t\t\t\t}, 1000);\r\n\t\t\t}\r\n\r\n\t\t\t// Mouseenter event binding\r\n\t\t\t$this.on(\"mouseenter\", function () {\r\n\t\t\t\treturn enter();\r\n\t\t\t});\r\n\r\n\t\t\t// Mousemove event binding\r\n\t\t\t$this.on(\"mousemove\", function (event) {\r\n\t\t\t\treturn move(event);\r\n\t\t\t});\r\n\r\n\t\t\t// Mouseleave event binding\r\n\t\t\t$this.on(\"mouseleave\", function () {\r\n\t\t\t\treturn leave();\r\n\t\t\t});\r\n\r\n\t\t});\r\n\r\n\t};\r\n\r\n}(jQuery));","jQuery(document).ready(function () {\r\n \"use strict\";\r\n\r\n const LOAD_INTERVALL = 500;\r\n const LOAD_TIMEOUT = 30;\r\n let timeoutClock = 0;\r\n let cf;\r\n\r\n\r\n const loader = setInterval(() => {\r\n if (timeoutClock === LOAD_TIMEOUT) {\r\n clearInterval(loader);\r\n throw new Error(\"Cannot initialize Cookie First\")\r\n }\r\n\r\n if (cookieFirstIsLoaded() === false) {\r\n timeoutClock++;\r\n return;\r\n }\r\n\r\n clearInterval(loader);\r\n\r\n initializeContentBlockers();\r\n initializeVideoWithContent();\r\n\r\n cf = window[\"CookieFirst\"];\r\n\r\n if (cf.consent?.advertising === true) {\r\n unlockIFrames();\r\n }\r\n\r\n const cookieFirstLoaded = new CustomEvent(\"cookieFirstLoaded\", cf);\r\n window.dispatchEvent(cookieFirstLoaded);\r\n\r\n window.addEventListener(\"cf_consent\", function (event) {\r\n const blockers = document.querySelectorAll(\".content-blocker:not(.d-none)\");\r\n const consent = event.detail;\r\n \r\n for (let i = 0; i < blockers.length; i++) {\r\n const blocker = blockers[i];\r\n const blockedContent = blocker.nextElementSibling;\r\n const category = blockedContent.dataset.consentCategory;\r\n if (consent[category] === true) {\r\n handleUnlock(blockedContent, false, false);\r\n cleanUp(blocker);\r\n }\r\n }\r\n \r\n // unlock video iframes like tool/provider header videos\r\n if (consent['advertising'] === true) {\r\n unlockIFrames();\r\n }\r\n });\r\n\r\n\r\n }, LOAD_INTERVALL);\r\n\r\n\r\n function unlockIFrames() {\r\n const blockedContent = document.querySelectorAll(\".mfp-iframe\");\r\n\r\n blockedContent.forEach((bc) => {\r\n const blocker = bc.previousElementSibling;\r\n\r\n if (!blocker || !blocker.classList.contains(\"content-blocker\")) {\r\n return;\r\n }\r\n\r\n blocker.remove();\r\n bc.removeEventListener(\"click\", handleIframeUnlock);\r\n\r\n });\r\n registerLightbox(\".mfp-iframe\");\r\n\r\n }\r\n\r\n function initializeContentBlockers() {\r\n const blockers = document.querySelectorAll(\".content-blocker:not(.d-none)\");\r\n\r\n for (let i = 0; i < blockers.length; i++) {\r\n const unlockButton = blockers[i].querySelector(\"button[data-unlock]\");\r\n const blockedContent = blockers[i].nextElementSibling;\r\n\r\n if (!unlockButton || blockedContent.getAttribute(\"data-consent-category\") === null) {\r\n throw new Error(\"No Content to unlock found!\")\r\n }\r\n unlockButton.removeAttribute(\"disabled\");\r\n\r\n unlockButton.addEventListener(\"click\", () => {\r\n const setConsent = blockers[i].querySelector(\"input[type='checkbox']\").checked;\r\n const hasUnlocked = handleUnlock(blockedContent, setConsent);\r\n\r\n if (!hasUnlocked) return;\r\n\r\n cleanUp(blockers[i]);\r\n });\r\n }\r\n }\r\n\r\n function handleUnlock(blockedContent, setConsent, playVideo = true) {\r\n let success = false;\r\n const type = blockedContent.tagName;\r\n const category = blockedContent.dataset.consentCategory;\r\n const cookieFirst = window[\"CookieFirst\"];\r\n\r\n if (setConsent) {\r\n let hasAlreadyAccepted = !!cookieFirst[\"consent\"];\r\n\r\n if (hasAlreadyAccepted) {\r\n cookieFirst.acceptCategory(category);\r\n return true;\r\n }\r\n\r\n const consent = {necessary: true, performance: false, functional: false, advertising: false};\r\n consent[category] = true;\r\n cookieFirst.updateConsent(consent);\r\n success = true;\r\n }\r\n\r\n if (type === \"SCRIPT\" && blockedContent.dataset.src) {\r\n blockedContent.src = blockedContent.dataset.src;\r\n success = true;\r\n } else if (type === \"A\") {\r\n blockedContent.classList.remove(\"d-none\");\r\n\r\n if (playVideo) {\r\n blockedContent.click();\r\n }\r\n\r\n success = true;\r\n }\r\n\r\n return success;\r\n }\r\n\r\n function cleanUp(contentBlocker) {\r\n contentBlocker.remove();\r\n }\r\n\r\n function hasConsentFor(type) {\r\n\r\n if (!type || !cf?.consent) {\r\n return false;\r\n }\r\n\r\n return cf?.consent[type] || false;\r\n }\r\n\r\n function cookieFirstIsLoaded() {\r\n return !!window[\"CookieFirst\"];\r\n }\r\n\r\n\r\n /**\r\n * Check if 'advertising' consent was set before initializing lightbox with youtube iframe\r\n */\r\n function initializeVideoWithContent() {\r\n const hasConsent = hasConsentFor('advertising');\r\n const blockedContent = document.querySelectorAll(\".mfp-iframe\");\r\n\r\n // we can enable the lightbox functionality and hide content blockers\r\n if (hasConsent) {\r\n registerLightbox('.mfp-iframe');\r\n blockedContent.forEach((bc) => {\r\n bc.style.pointerEvents = \"unset\";\r\n let blocker = bc.previousElementSibling;\r\n if (blocker) {\r\n bc.previousElementSibling.remove();\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // register an event listener instead to open unlock\r\n blockedContent.forEach((bc) => {\r\n bc.style.pointerEvents = \"unset\";\r\n bc.addEventListener(\"click\", handleIframeUnlock);\r\n });\r\n\r\n }\r\n\r\n\r\n function handleIframeUnlock(event) {\r\n event.preventDefault();\r\n\r\n const current = event.currentTarget;\r\n\r\n const contentBlocker = current.previousElementSibling;\r\n contentBlocker.classList.remove(\"d-none\");\r\n\r\n const unlockButton = contentBlocker.querySelector(\"button\");\r\n unlockButton.removeAttribute(\"disabled\");\r\n\r\n let userChoice = new Promise((resolve) => {\r\n unlockButton.addEventListener(\"click\", resolve);\r\n }).then((_) => {\r\n const unlockAll = contentBlocker.querySelector(\"input[type='checkbox']\").checked;\r\n\r\n if (unlockAll) {\r\n // when cookie first is initialized we only need add the category\r\n if (window[\"CookieFirst\"]?.consent) {\r\n window[\"CookieFirst\"].acceptCategory(\"advertising\");\r\n } else {\r\n\r\n const consent = {necessary: true, performance: false, functional: false, advertising: true}\r\n window[\"CookieFirst\"].updateConsent(consent);\r\n unlockIFrames();\r\n }\r\n\r\n } else {\r\n // unlock only the specific video\r\n registerLightbox(current);\r\n\r\n // cleanup\r\n current.removeEventListener(\"click\", handleIframeUnlock);\r\n contentBlocker.remove();\r\n\r\n current.click();\r\n }\r\n });\r\n }\r\n\r\n function registerLightbox(selector) {\r\n jQuery(selector).magnificPopup({\r\n type: 'iframe',\r\n iframe: {\r\n markup:\r\n '
' +\r\n '
' +\r\n '' +\r\n '
',\r\n\r\n patterns: {\r\n youtube: {\r\n index: 'youtube.com/',\r\n id: 'v=',\r\n src: '//www.youtube.com/embed/%id%?autoplay=1'\r\n }\r\n },\r\n srcAction: 'iframe_src',\r\n }\r\n });\r\n }\r\n});"]}