1/* JS for preset "Header Thor" */ 2$(function() { 3 init(); 4}); 5 6// Make :active pseudo classes work on iOS 7document.addEventListener("touchstart", function() {}, false); 8 9var init = function() { 10 // menu-wrapper-spacer height calc for non-jumpy sticky 11 var menuSpacer = function() { 12 $('.menu-wrapper-spacer').each(function() { 13 var mwh = $('.menu-wrapper', this).outerHeight(); 14 $(this).get(0).style.setProperty("--spacer-height", mwh + 'px'); 15 // dont write inline css in cms because it will get saved 16 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 17 return; 18 } 19 $(this).css('height', mwh); 20 }); 21 } 22 23 // call initial and then call on every resize 24 menuSpacer(); 25 26 $(window).resize(function() { 27 menuSpacer(); 28 }); 29 30 // scope 31 $('.header').each(function() { 32 33 var isOnePager = true; 34 35 // Commonly used elements 36 var $menu = $('.ed-menu', this); 37 var $menuLinks = $('a', $menu); 38 var $menuTrigger = $('.menu-trigger', this); 39 var $backToTop = $('.back-to-top', this); 40 var $menuWrapper = $('.menu-wrapper', this); 41 42 var headerHeight = $(this).outerHeight(); 43 var menuWrapperHeight = $menuWrapper.outerHeight() || 0; 44 45 // if gefion check for nav and add additional classes 46 var $closeTrigger = $('.nav').length ? $('.menu-backdrop, .logo', this) : $(); 47 var $toggleClasses = $('.nav').length ? $('.nav', this).add($('body')) : $menu; 48 49 toggleClassOnClick($toggleClasses, $menuTrigger, $closeTrigger, 'open'); 50 51 clickToTop($backToTop); 52 activateSticky($menuWrapper, 'sticky', function(params) { 53 menuWrapperHeight = $menuWrapper.outerHeight() || 0; 54 params.offset = Math.max(menuWrapperHeight, headerHeight - menuWrapperHeight - 2); 55 }); 56 57 // Activate functions that are needed for one-pagers 58 if (isOnePager) { 59 activateSmoothScroll($menuLinks.add($('.scroll a'))); 60 addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3); 61 } 62 }); 63 64}; 65 66/** 67 * Toggles class on a target when a trigger is clicked 68 * 69 * @param {jQuery} The target to apply the CSS class to 70 * @param {jQuery} The Trigger 71 * @param {string} CSS Class to toggle on the target 72 * @param {Boolean} If off canvas menu is used 73 */ 74var toggleClassOnClick = function($target, $trigger, $closeTrigger, cssClass) { 75 // Reset in case class "open" was saved accidentally 76 $target.removeClass(cssClass); 77 $trigger.removeClass(cssClass); 78 79 // Click on trigger toggles class "open" 80 $trigger.off('.toggle').on('click.toggle', function() { 81 $(this).toggleClass(cssClass); 82 $target.toggleClass(cssClass); 83 }); 84 85 // Close target when link inside is clicked 86 $target.find('a').click(function() { 87 $target.removeClass(cssClass); 88 $trigger.removeClass(cssClass); 89 }); 90 91 $closeTrigger.on('click', function() { 92 $target.removeClass(cssClass); 93 $trigger.removeClass(cssClass); 94 }) 95}; 96 97/** 98 * Scroll to the top of the page when element is clicked 99 * 100 * @param {jQuery} The element which triggers scroll to top 101 */ 102var clickToTop = function($trigger) { 103 $trigger.removeClass('show'); 104 105 $trigger.click(function(e) { 106 e.preventDefault(); 107 viewport.scrollTo(0, 'top', 500, 0); 108 }); 109 110 // Show back to top only below the fold 111 viewport.observe('scroll', function() { 112 if (viewport.getScrollTop() > viewport.getHeight()) { 113 $trigger.addClass('show'); 114 } else { 115 $trigger.removeClass('show'); 116 } 117 }); 118} 119 120/** 121 * Smooth scroll to link targets 122 * 123 * @param {jQuery} The links 124 * @param {jQuery} Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu) 125 */ 126var activateSmoothScroll = function($scrollLinks, scrollOffset) { 127 if (typeof scrollOffset === 'undefined') { 128 scrollOffset = 0; 129 } 130 131 var determineTarget = function($trigger, hash) { 132 if (hash == '#!next') { 133 return $trigger.parents('.ed-element').last().next(); 134 } 135 136 return $(hash); 137 } 138 139 $scrollLinks.click(function(e) { 140 var $target = determineTarget($(this), this.hash); 141 if (!$target.length) return; 142 143 e.preventDefault(); 144 viewport.scrollTo($target, 'top', 500, -scrollOffset); 145 }); 146}; 147 148/** 149 * Adds a class to an element when not currently visible 150 * 151 * @param {jQuery} Element 152 * @param {string} CSS class to be applied to the element when it's outside the viewport 153 * @param {string} Can be set to 'top', 'bottom' or 'full' 154 * @param {int|function} Custom offset after which cssClass is applied. If not set, default to $element's position 155 */ 156var activateSticky = function($element, cssClass, offset, mode) { 157 var self = this; 158 159 self.offset = 0; 160 self.height = 0; 161 162 $element.removeClass(cssClass); 163 164 var updateOffset = function() { 165 if (typeof offset === 'undefined') { 166 self.offset = $element.offset().top; 167 self.height = $element.outerHeight(); 168 } else if (typeof offset === 'function') { 169 offset(self); 170 } else { 171 self.offset = offset; 172 self.height = 0; 173 } 174 } 175 viewport.observe('resize', updateOffset); 176 viewport.observe('animation.end', updateOffset); 177 updateOffset(); 178 179 var isVisible = function(mode) { 180 return ( 181 (typeof mode === 'undefined' && (self.offset + self.height) > viewport.getScrollTop()) || 182 ((mode === true || mode == 'full') && self.offset > viewport.getScrollTop()) ||
183 (mode == 'top' && self.offset > viewport.getScrollTop()) || 184 (mode == 'bottom' && (self.offset + self.height) > viewport.getScrollTop()) 185 ); 186 }; 187 188 viewport.observe('scroll', function() { 189 if (!$element.length) return; 190 if (!isVisible(mode)) { 191 $element.addClass(cssClass); 192 } else { 193 $element.removeClass(cssClass); 194 } 195 }); 196}; 197 198/** 199 * Adds a class to links whose target is currently inside the viewport 200 * 201 * @param {jQuery} Link(s) to be observed 202 * @param {string} CSS Class to be applied 203 * @param {float} Ratio by which the target should be within the viewport 204 */ 205var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) { 206 if (typeof sectionViewportRatio === 'undefined') { 207 sectionViewportRatio = 1 / 2; 208 } 209 210 var menuTargets = []; 211 var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0); 212 213 var links = $links.filter(function() { 214 var $target = $(this.hash); 215 if (!$target.length) { 216 return false; 217 } 218 219 // Cache offset position to improve performance (update on resize) 220 var updateOffset = function() { 221 $target.data('offset', $target.offset().top); 222 }; 223 224 viewport.observe('resize', updateOffset); 225 viewport.observe('animation.end', updateOffset); 226 updateOffset(); 227 228 menuTargets.push($target); 229 return true; 230 }); 231 232 // No hash links found, so don't handle it at all 233 if (!links.length) { 234 return; 235 } 236 237 var checkVisibility = function() { 238 $links.removeClass('active'); 239 240 // Check section position reversely 241 for (var i = menuTargets.length - 1; i >= 0; i--) { 242 var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio); 243 if (viewport.getScrollTop() >= desiredScrollPosition) { 244 links.eq(i).addClass(cssClass); 245 return; 246 } 247 } 248 249 // Fallback to originally active item 250 activeLink.addClass(cssClass); 251 }; 252 253 viewport.observe('scroll', checkVisibility); 254 checkVisibility(); 255}; 256/* End JS for preset "Header Thor" */ 257 258/* JS for preset "Cookie Consent Bar V3" */ 259$(function() { 260 $('#cookieClose').click(function(e) { 261 e.preventDefault(); 262 createCookie('cookieConsentBar', "rejected", 0.5); 263 $('.cookie-consent-bar').hide(); 264 265 // If inside of an overlay, close it too 266 if ($('.cookie-consent-bar').closest('.mfp-content').length) { 267 $.magnificPopup.close(); 268 return; 269 } 270 }); 271 272 $('#acceptCookie').click(function(e) { 273 e.preventDefault(); 274 createCookie('cookieConsentBar', "accepted", 0.5); 275 $('.cookie-consent-bar').hide(); 276 277 if (typeof ThirdPartyScripts !== "undefined") { 278 ThirdPartyScripts.unblock(); 279 } 280 281 // If inside of an overlay, close it too 282 if ($('.cookie-consent-bar').closest('.mfp-content').length) { 283 $.magnificPopup.close(); 284 return; 285 } 286 }); 287 288 var preview = false; 289 290 var listener = function() { 291 if (!preview && document.body.classList.contains('preview')) { 292 console.log("entering preview"); 293 preview = true; 294 } else if (preview && !document.body.classList.contains('preview')) { 295 console.log("leaving preview"); 296 $('.cookie-consent-bar').show(); 297 preview = false; 298 } 299 requestAnimationFrame(listener); 300 }; 301 302 requestAnimationFrame(listener); 303 304 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 305 return; 306 } 307 308 309 // Cookie bar 310 if (readCookie('cookieConsentBar') == "accepted") { 311 $('.cookie-consent-bar').hide(); 312 window.setTimeout(function() { 313 if (typeof ThirdPartyScripts !== "undefined") { 314 ThirdPartyScripts.unblock(); 315 } 316 }, 100); 317 } else if (readCookie('cookieConsentBar') == "rejected") { 318 $('.cookie-consent-bar').hide(); 319 } else { 320 $('.cookie-consent-bar').show(); 321 } 322 323 function readCookie(name) { 324 var nameEQ = name + "="; 325 var ca = document.cookie.split(';'); 326 for (var i = 0; i < ca.length; i++) { 327 var c = ca[i]; 328 while (c.charAt(0) == ' ') c = c.substring(1, c.length); 329 if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); 330 } 331 return null; 332 } 333 334 function createCookie(name, value, days) { 335 if (days) { 336 var date = new Date(); 337 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 338 var expires = "; expires=" + date.toGMTString(); 339 } else expires = ""; 340 document.cookie = name + "=" + value + expires + "; path=/"; 341 } 342 343 // Fix for hiding Content till page is loaded 344 $(document).ready(function() { 345 $('.hide-cookie-content').removeClass("hide-cookie-content"); 346 }); 347}); 348/* End JS for preset "Cookie Consent Bar V3" */
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.