1$(function() { 2 initMenu(); 3}); 4 5// Make :active pseudo classes work on iOS 6document.addEventListener("touchstart", function() {}, false); 7 8var initMenu = function() { 9 //Temporary JS start 10 $('.menu-wrapper-js-anchor').each(function() { 11 //Temporary JS end 12 if ($(this)[0].getAttribute('class').match(/(?:^| )preset\-/) === null) { 13 return; 14 } 15 16 // Commonly used elements 17 var $menu = $('.ed-menu', this); 18 var $menuLinks = $('a', $menu); 19 var $menuTrigger = $('.menu-trigger', this); 20 var menuWrapperHeight = $(this).outerHeight(); 21 var $banner = $(this).next('.banner'); 22 23 if (!$banner.length) { 24 $banner = $(this).closest('.banner'); 25 } 26 27 var bannerHeight = $banner.length ? $banner.outerHeight() : 0; 28 var smoothScrollOffset = 20; 29 30 toggleClassOnClick($menu, $menuTrigger, $(), 'open'); 31 32 // getComputedStyle(elm).fill returns rgb(0,0,0) by default. it's a useless property on a non-svg, so if we have activated sticky in preset settings we set it to the color red 33 var isSticky = getComputedStyle($(this)[0]).fill !== 'rgb(0, 0, 0)' ? true : false; 34 35 if (isSticky) { 36 activateSticky($(this), 'sticky', $banner.length ? Math.max(menuWrapperHeight, bannerHeight - menuWrapperHeight - 10) : $(this).offset().top, undefined, $banner.length); 37 } 38 39 activateSmoothScroll($menuLinks.add($('.scroll a')), smoothScrollOffset); 40 addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3); 41 }); 42 43}; 44 45/** 46 * Toggles class on a target when a trigger is clicked 47 * 48 * @param {jQuery} The target to apply the CSS class to 49 * @param {jQuery} The Trigger 50 * @param {string} CSS Class to toggle on the target 51 * @param {Boolean} If off canvas menu is used 52 */ 53var toggleClassOnClick = function($target, $trigger, $closeTrigger, cssClass) { 54 // Reset in case class "open" was saved accidentally 55 $target.removeClass(cssClass); 56 $trigger.removeClass(cssClass); 57 58 // Click on trigger toggles class "open" 59 $trigger.off('.toggle').on('click.toggle', function() { 60 $(this).toggleClass(cssClass); 61 $target.toggleClass(cssClass); 62 }); 63 64 // Close target when link inside is clicked 65 $target.find('a').click(function() { 66 $target.removeClass(cssClass); 67 $trigger.removeClass(cssClass); 68 }); 69 70 if (!$closeTrigger) { 71 return; 72 } 73 74 $closeTrigger.on('click', function() { 75 $target.removeClass(cssClass); 76 $trigger.removeClass(cssClass); 77 }); 78}; 79 80/** 81 * Smooth scroll to link targets 82 * 83 * @param {jQuery} The links 84 * @param {jQuery} Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu) 85 */ 86var activateSmoothScroll = function($scrollLinks, scrollOffset) { 87 if (typeof scrollOffset === 'undefined') { 88 scrollOffset = 0; 89 } 90 91 var determineTarget = function($trigger, hash) { 92 if (hash == '#!next') { 93 return $trigger.parents('.ed-element').last().next(); 94 } 95 96 return $(hash); 97 } 98 99 $scrollLinks.click(function(e) { 100 var $target = determineTarget($(this), this.hash); 101 if (!$target.length) return; 102 103 e.preventDefault(); 104 if ($(this.hash).parent().offset().top === 0){ 105 viewport.scrollTo($target, 'top', 500, 0); 106 }else{ 107 viewport.scrollTo($target, 'top', 500, scrollOffset); 108 } 109 }); 110}; 111 112/** 113 * Adds a class to an element when not currently visible 114 * 115 * @param {jQuery} Element 116 * @param {string} CSS class to be applied to the element when it's outside the viewport 117 * @param {string} Can be set to 'top', 'bottom' or 'full' 118 * @param {int|function} Custom offset after which cssClass is applied. If not set, default to $element's position 119 */ 120var activateSticky = function($element, cssClass, offset, mode, hasBanner) { 121 var self = this; 122 self.offset = offset; 123 $element.removeClass(cssClass); 124 125 var updateOffset = function() { 126 if ($element.hasClass('sticky') || hasBanner) { 127 self.offset = offset; 128 } else { 129 self.offset = $element.offset().top; 130 } 131 } 132 133 viewport.observe('resize', updateOffset); 134 viewport.observe('animation.end', updateOffset); 135 updateOffset(); 136 137 var isVisible = function(mode) { 138 return ( 139 (typeof mode === 'undefined' && (self.offset) > viewport.getScrollTop()) || 140 ((mode === true || mode == 'full') && self.offset > viewport.getScrollTop()) ||
141 (mode == 'top' && self.offset > viewport.getScrollTop()) || 142 (mode == 'bottom' && (self.offset) > viewport.getScrollTop()) 143 ); 144 }; 145 146 var mwh = $element.outerHeight(); 147 148 var addMargin = function() { 149 if (!$element.length || !$element.next().length) { 150 return; 151 } 152 153 $element.next().get(0).style.setProperty("--spacer-height", mwh + 'px'); 154 155 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 156 return; 157 } 158 $element.next().css('margin-top', mwh); 159 } 160 var removeMargin = function() { 161 if (!$element.length || !$element.next().length) { 162 return; 163 } 164 $element.next().get(0).style.setProperty("--spacer-height", ''); 165 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 166 return; 167 } 168 $element.next().css('margin-top', ''); 169 } 170 171 viewport.observe('scroll', function() { 172 if (!$element.length) return; 173 if (!isVisible(mode)) { 174 $element.addClass(cssClass); 175 addMargin(); 176 } else { 177 $element.removeClass(cssClass); 178 removeMargin(); 179 } 180 }); 181}; 182 183/** 184 * Adds a class to links whose target is currently inside the viewport 185 * 186 * @param {jQuery} Link(s) to be observed 187 * @param {string} CSS Class to be applied 188 * @param {float} Ratio by which the target should be within the viewport 189 */ 190var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) { 191 if (typeof sectionViewportRatio === 'undefined') { 192 sectionViewportRatio = 1 / 2; 193 } 194 195 var menuTargets = []; 196 var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0); 197 198 var links = $links.filter(function() { 199 var $target = $(this.hash); 200 if (!$target.length) { 201 return false; 202 } 203 204 // Cache offset position to improve performance (update on resize) 205 var updateOffset = function() { 206 $target.data('offset', $target.offset().top); 207 }; 208 209 viewport.observe('resize', updateOffset); 210 viewport.observe('animation.end', updateOffset); 211 updateOffset(); 212 213 menuTargets.push($target); 214 return true; 215 }); 216 217 // No hash links found, so don't handle it at all 218 if (!links.length) { 219 return; 220 } 221 222 var checkVisibility = function() { 223 $links.removeClass('active'); 224 225 // Check section position reversely 226 for (var i = menuTargets.length - 1; i >= 0; i--) { 227 var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio); 228 if (viewport.getScrollTop() >= desiredScrollPosition) { 229 links.eq(i).addClass(cssClass); 230 return; 231 } 232 } 233 234 // Fallback to originally active item 235 activeLink.addClass(cssClass); 236 }; 237 238 viewport.observe('scroll', checkVisibility); 239 checkVisibility(); 240}; 241 242/* JS for preset "Menu" */ 243$(function() { 244 initMenu(); 245}); 246 247// Make :active pseudo classes work on iOS 248document.addEventListener("touchstart", function() {}, false); 249 250var initMenu = function() { 251 //Temporary JS start 252 $('.menu-wrapper-js-anchor').each(function() { 253 //Temporary JS end 254 if ($(this)[0].getAttribute('class').match(/(?:^| )preset\-/) === null) { 255 return; 256 } 257 258 // Commonly used elements 259 var $menu = $('.ed-menu', this); 260 var $menuLinks = $('a', $menu); 261 var $menuTrigger = $('.menu-trigger', this); 262 var menuWrapperHeight = $(this).outerHeight(); 263 var $banner = $(this).next('.banner'); 264 265 if (!$banner.length) { 266 $banner = $(this).closest('.banner'); 267 } 268 269 var bannerHeight = $banner.length ? $banner.outerHeight() : 0; 270 var smoothScrollOffset = 20; 271 272 toggleClassOnClick($menu, $menuTrigger, $(), 'open'); 273 274 // getComputedStyle(elm).fill returns rgb(0,0,0) by default. it's a useless property on a non-svg, so if we have activated sticky in preset settings we set it to the color red 275 var isSticky = getComputedStyle($(this)[0]).fill !== 'rgb(0, 0, 0)' ? true : false; 276 277 if (isSticky) { 278 activateSticky($(this), 'sticky', $banner.length ? Math.max(menuWrapperHeight, bannerHeight - menuWrapperHeight - 10) : $(this).offset().top, undefined, $banner.length); 279 } 280 281 activateSmoothScroll($menuLinks.add($('.scroll a')), smoothScrollOffset); 282 addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3); 283 }); 284 285}; 286 287/** 288 * Toggles class on a target when a trigger is clicked 289 * 290 * @param {jQuery} The target to apply the CSS class to 291 * @param {jQuery} The Trigger 292 * @param {string} CSS Class to toggle on the target 293 * @param {Boolean} If off canvas menu is used 294 */ 295var toggleClassOnClick = function($target, $trigger, $closeTrigger,
295cssClass) { 296 // Reset in case class "open" was saved accidentally 297 $target.removeClass(cssClass); 298 $trigger.removeClass(cssClass); 299 300 // Click on trigger toggles class "open" 301 $trigger.off('.toggle').on('click.toggle', function() { 302 $(this).toggleClass(cssClass); 303 $target.toggleClass(cssClass); 304 }); 305 306 // Close target when link inside is clicked 307 $target.find('a').click(function() { 308 $target.removeClass(cssClass); 309 $trigger.removeClass(cssClass); 310 }); 311 312 if (!$closeTrigger) { 313 return; 314 } 315 316 $closeTrigger.on('click', function() { 317 $target.removeClass(cssClass); 318 $trigger.removeClass(cssClass); 319 }); 320}; 321 322/** 323 * Smooth scroll to link targets 324 * 325 * @param {jQuery} The links 326 * @param {jQuery} Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu) 327 */ 328var activateSmoothScroll = function($scrollLinks, scrollOffset) { 329 if (typeof scrollOffset === 'undefined') { 330 scrollOffset = 0; 331 } 332 333 var determineTarget = function($trigger, hash) { 334 if (hash == '#!next') { 335 return $trigger.parents('.ed-element').last().next(); 336 } 337 338 return $(hash); 339 } 340 341 $scrollLinks.click(function(e) { 342 var $target = determineTarget($(this), this.hash); 343 if (!$target.length) return; 344 345 e.preventDefault(); 346 if ($(this.hash).parent().offset().top === 0){ 347 viewport.scrollTo($target, 'top', 500, 0); 348 }else{ 349 viewport.scrollTo($target, 'top', 500, scrollOffset); 350 } 351 }); 352}; 353 354/** 355 * Adds a class to an element when not currently visible 356 * 357 * @param {jQuery} Element 358 * @param {string} CSS class to be applied to the element when it's outside the viewport 359 * @param {string} Can be set to 'top', 'bottom' or 'full' 360 * @param {int|function} Custom offset after which cssClass is applied. If not set, default to $element's position 361 */ 362var activateSticky = function($element, cssClass, offset, mode, hasBanner) { 363 var self = this; 364 self.offset = offset; 365 $element.removeClass(cssClass); 366 367 var updateOffset = function() { 368 if ($element.hasClass('sticky') || hasBanner) { 369 self.offset = offset; 370 } else { 371 self.offset = $element.offset().top; 372 } 373 } 374 375 viewport.observe('resize', updateOffset); 376 viewport.observe('animation.end', updateOffset); 377 updateOffset(); 378 379 var isVisible = function(mode) { 380 return ( 381 (typeof mode === 'undefined' && (self.offset) > viewport.getScrollTop()) || 382 ((mode === true || mode == 'full') && self.offset > viewport.getScrollTop()) || 383 (mode == 'top' && self.offset > viewport.getScrollTop()) || 384 (mode == 'bottom' && (self.offset) > viewport.getScrollTop()) 385 ); 386 }; 387 388 var mwh = $element.outerHeight(); 389 390 var addMargin = function() { 391 if (!$element.length || !$element.next().length) { 392 return; 393 } 394 395 $element.next().get(0).style.setProperty("--spacer-height", mwh + 'px'); 396 397 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 398 return; 399 } 400 $element.next().css('margin-top', mwh); 401 } 402 var removeMargin = function() { 403 if (!$element.length || !$element.next().length) { 404 return; 405 } 406 $element.next().get(0).style.setProperty("--spacer-height", ''); 407 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 408 return; 409 } 410 $element.next().css('margin-top', ''); 411 } 412 413 viewport.observe('scroll', function() { 414 if (!$element.length) return; 415 if (!isVisible(mode)) { 416 $element.addClass(cssClass); 417 addMargin(); 418 } else { 419 $element.removeClass(cssClass); 420 removeMargin(); 421 } 422 }); 423}; 424 425/** 426 * Adds a class to links whose target is currently inside the viewport 427 * 428 * @param {jQuery} Link(s) to be observed 429 * @param {string} CSS Class to be applied 430 * @param {float} Ratio by which the target should be within the viewport 431 */ 432var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) { 433 if (typeof sectionViewportRatio === 'undefined') { 434 sectionViewportRatio = 1 / 2; 435 } 436 437 var menuTargets = []; 438 var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0); 439 440 var links = $links.filter(function() { 441 var $target = $(this.hash); 442 if (!$target.length) { 443 return false;
444 } 445 446 // Cache offset position to improve performance (update on resize) 447 var updateOffset = function() { 448 $target.data('offset', $target.offset().top); 449 }; 450 451 viewport.observe('resize', updateOffset); 452 viewport.observe('animation.end', updateOffset); 453 updateOffset(); 454 455 menuTargets.push($target); 456 return true; 457 }); 458 459 // No hash links found, so don't handle it at all 460 if (!links.length) { 461 return; 462 } 463 464 var checkVisibility = function() { 465 $links.removeClass('active'); 466 467 // Check section position reversely 468 for (var i = menuTargets.length - 1; i >= 0; i--) { 469 var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio); 470 if (viewport.getScrollTop() >= desiredScrollPosition) { 471 links.eq(i).addClass(cssClass); 472 return; 473 } 474 } 475 476 // Fallback to originally active item 477 activeLink.addClass(cssClass); 478 }; 479 480 viewport.observe('scroll', checkVisibility); 481 checkVisibility(); 482}; 483/* End JS for preset "Menu" */ 484 485 486 487/* JS for preset "Back to top button" */ 488$(function() { 489 initBackToTop(); 490}); 491 492var initBackToTop = function() { 493 494 $('body').each(function() { 495 var $backToTop = $('.back-to-top-button-icon', this); 496 clickToTop($backToTop); 497 498 }); 499}; 500 501var clickToTop = function($trigger) { 502 $trigger.removeClass('show'); 503 504 $trigger.click(function(e) { 505 e.preventDefault(); 506 viewport.scrollTo(0, 'top', 500, 0); 507 }); 508 509 // Show back to top only below the fold 510 viewport.observe('scroll', function() { 511 if (viewport.getScrollTop() > (viewport.getHeight() / 3)) { 512 $trigger.addClass('show'); 513 } else { 514 $trigger.removeClass('show'); 515 } 516 }); 517} 518 519/* End JS for preset "Back to top button" */ 520 521/* JS for preset "Header Loki" */ 522$(function() { 523 init(); 524}); 525 526// Make :active pseudo classes work on iOS 527document.addEventListener("touchstart", function() {}, false); 528 529var init = function() { 530 // menu-wrapper-spacer height calc for non-jumpy sticky 531 var menuSpacer = function() { 532 $('.menu-wrapper-spacer').each(function() { 533 var mwh = $('.menu-wrapper', this).outerHeight(); 534 $(this).get(0).style.setProperty("--spacer-height", mwh + 'px'); 535 // dont write inline css in cms because it will get saved 536 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 537 return; 538 } 539 $(this).css('height', mwh); 540 }); 541 } 542 543 // call initial and then call on every resize 544 menuSpacer(); 545 546 $(window).resize(function() { 547 menuSpacer(); 548 }); 549 550 // scope 551 $('.header').each(function() { 552 553 var isOnePager = true; 554 555 // Commonly used elements 556 var $menu = $('.ed-menu', this); 557 var $menuLinks = $('a', $menu); 558 var $menuTrigger = $('.menu-trigger', this); 559 var $backToTop = $('.back-to-top', this); 560 var $menuWrapper = $('.menu-wrapper', this); 561 562 var headerHeight = $(this).outerHeight(); 563 var menuWrapperHeight = $menuWrapper.outerHeight() || 0; 564 565 // if gefion check for nav and add additional classes 566 var $closeTrigger = $('.nav').length ? $('.menu-backdrop, .logo', this) : $(); 567 var $toggleClasses = $('.nav').length ? $('.nav', this).add($('body')) : $menu; 568 569 toggleClassOnClick($toggleClasses, $menuTrigger, $closeTrigger, 'open'); 570 571 clickToTop($backToTop); 572 activateSticky($menuWrapper, 'sticky', function(params) { 573 menuWrapperHeight = $menuWrapper.outerHeight() || 0; 574 params.offset = Math.max(menuWrapperHeight, headerHeight - menuWrapperHeight - 2); 575 }); 576 577 // Activate functions that are needed for one-pagers 578 if (isOnePager) { 579 activateSmoothScroll($menuLinks.add($('.scroll a'))); 580 addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3); 581 } 582 }); 583 584}; 585 586/** 587 * Toggles class on a target when a trigger is clicked 588 * 589 * @param {jQuery} The target to apply the CSS class to 590 * @param {jQuery} The Trigger 591 * @param {string} CSS Class to toggle on the target 592 * @param {Boolean} If off canvas menu is used 593 */ 594var toggleClassOnClick = function($target, $trigger, $closeTrigger, cssClass) { 595 // Reset in case class "open" was saved accidentally 596 $target.removeClass(cssClass); 597 $trigger.removeClass(cssClass); 598 599 // Click on trigger toggles class "open" 600 $trigger.off('.toggle').on('click.toggle', function() { 601 $(this).toggleClass(cssClass); 602 $target.toggleClass(cssClass); 603 }); 604 605 // Close target when link inside is clicked 606 $target.find('a').click(function() { 607 $target.removeClass(cssClass); 608 $trigger.removeClass(cssClass); 609 }); 610 611 $closeTrigger.on('click', function() { 612 $target.removeClass(cssClass); 613 $trigger.removeClass(cssClass); 614 }) 615}; 616 617/** 618 * Scroll to the top of the page when element is clicked 619 * 620 * @param {jQuery} The element which triggers scroll to top 621 */ 622var clickToTop = function($trigger) { 623 $trigger.removeClass('show'); 624 625 $trigger.click(function(e) { 626 e.preventDefault(); 627 viewport.scrollTo(0, 'top', 500, 0); 628 }); 629 630 // Show back to top only below the fold 631 viewport.observe('scroll', function() { 632 if (viewport.getScrollTop() > viewport.getHeight()) { 633 $trigger.addClass('show'); 634 } else { 635 $trigger.removeClass('show'); 636 } 637 }); 638} 639 640/** 641 * Smooth scroll to link targets 642 * 643 * @param {jQuery} The links 644 * @param {jQuery} Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu) 645 */ 646var activateSmoothScroll = function($scrollLinks, scrollOffset) { 647 if (typeof scrollOffset === 'undefined') { 648 scrollOffset = 0; 649 } 650 651 var determineTarget = function($trigger, hash) { 652 if (hash == '#!next') { 653 return $trigger.parents('.ed-element').last().next(); 654 } 655 656 return $(hash); 657 } 658 659 $scrollLinks.click(function(e) { 660 var $target = determineTarget($(this), this.hash); 661 if (!$target.length) return; 662 663 e.preventDefault(); 664 viewport.scrollTo($target, 'top', 500, -scrollOffset); 665 }); 666}; 667 668/** 669 * Adds a class to an element when not currently visible 670 * 671 * @param {jQuery} Element 672 * @param {string} CSS class to be applied to the element when it's outside the viewport 673 * @param {string} Can be set to 'top', 'bottom' or 'full' 674 * @param {int|function} Custom offset after which cssClass is applied. If not set, default to $element's position 675 */ 676var activateSticky = function($element, cssClass, offset, mode) { 677 var self = this; 678 679 self.offset = 0; 680 self.height = 0; 681 682 $element.removeClass(cssClass); 683 684 var updateOffset = function() { 685 if (typeof offset === 'undefined') { 686 self.offset = $element.offset().top; 687 self.height = $element.outerHeight(); 688 } else if (typeof offset === 'function') { 689 offset(self); 690 } else { 691 self.offset = offset; 692 self.height = 0; 693 } 694 } 695 viewport.observe('resize', updateOffset); 696 viewport.observe('animation.end', updateOffset); 697 updateOffset(); 698 699 var isVisible = function(mode) { 700 return ( 701 (typeof mode === 'undefined' && (self.offset + self.height) > viewport.getScrollTop()) || 702 ((mode === true || mode == 'full') && self.offset > viewport.getScrollTop()) ||
703 (mode == 'top' && self.offset > viewport.getScrollTop()) || 704 (mode == 'bottom' && (self.offset + self.height) > viewport.getScrollTop()) 705 ); 706 }; 707 708 viewport.observe('scroll', function() { 709 if (!$element.length) return; 710 if (!isVisible(mode)) { 711 $element.addClass(cssClass); 712 } else { 713 $element.removeClass(cssClass); 714 } 715 }); 716}; 717 718/** 719 * Adds a class to links whose target is currently inside the viewport 720 * 721 * @param {jQuery} Link(s) to be observed 722 * @param {string} CSS Class to be applied 723 * @param {float} Ratio by which the target should be within the viewport 724 */ 725var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) { 726 if (typeof sectionViewportRatio === 'undefined') { 727 sectionViewportRatio = 1 / 2; 728 } 729 730 var menuTargets = []; 731 var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0); 732 733 var links = $links.filter(function() { 734 var $target = $(this.hash); 735 if (!$target.length) { 736 return false; 737 } 738 739 // Cache offset position to improve performance (update on resize) 740 var updateOffset = function() { 741 $target.data('offset', $target.offset().top); 742 }; 743 744 viewport.observe('resize', updateOffset); 745 viewport.observe('animation.end', updateOffset); 746 updateOffset(); 747 748 menuTargets.push($target); 749 return true; 750 }); 751 752 // No hash links found, so don't handle it at all 753 if (!links.length) { 754 return; 755 } 756 757 var checkVisibility = function() { 758 $links.removeClass('active'); 759 760 // Check section position reversely 761 for (var i = menuTargets.length - 1; i >= 0; i--) { 762 var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio); 763 if (viewport.getScrollTop() >= desiredScrollPosition) { 764 links.eq(i).addClass(cssClass); 765 return; 766 } 767 } 768 769 // Fallback to originally active item 770 activeLink.addClass(cssClass); 771 }; 772 773 viewport.observe('scroll', checkVisibility); 774 checkVisibility(); 775}; 776/* End JS for preset "Header Loki" */ 777 778/* JS for preset "Cookie Consent Bar V3" */ 779$(function() { 780 $('#cookieClose').click(function(e) { 781 e.preventDefault(); 782 createCookie('cookieConsentBar', "rejected", 0.5); 783 $('.cookie-consent-bar').hide(); 784 }); 785 786 $('#acceptCookie').click(function(e) { 787 e.preventDefault(); 788 createCookie('cookieConsentBar', "accepted", 0.5); 789 $('.cookie-consent-bar').hide(); 790 ThirdPartyScripts.unblock(); 791 }); 792 793 var preview = false; 794 795 var listener = function() { 796 if (!preview && document.body.classList.contains('preview')) { 797 console.log("entering preview"); 798 preview = true; 799 } else if (preview && !document.body.classList.contains('preview')) { 800 console.log("leaving preview"); 801 $('.cookie-consent-bar').show(); 802 preview = false; 803 } 804 requestAnimationFrame(listener); 805 }; 806 807 requestAnimationFrame(listener); 808 809 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 810 return; 811 } 812 813 814 // Cookie bar 815 if (readCookie('cookieConsentBar') == "accepted") { 816 $('.cookie-consent-bar').hide(); 817 window.setTimeout(function() { 818 ThirdPartyScripts.unblock(); 819 }, 100); 820 } else if (readCookie('cookieConsentBar') == "rejected") { 821 $('.cookie-consent-bar').hide(); 822 } else { 823 $('.cookie-consent-bar').show(); 824 } 825 826 function readCookie(name) { 827 var nameEQ = name + "="; 828 var ca = document.cookie.split(';'); 829 for (var i = 0; i < ca.length; i++) { 830 var c = ca[i]; 831 while (c.charAt(0) == ' ') c = c.substring(1, c.length); 832 if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); 833 } 834 return null; 835 } 836 837 function createCookie(name, value, days) { 838 if (days) { 839 var date = new Date(); 840 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 841 var expires = "; expires=" + date.toGMTString(); 842 } else expires = ""; 843 document.cookie = name + "=" + value + expires + "; path=/"; 844 } 845 846 // Fix for hiding Content till page is loaded 847 $(document).ready(function() { 848 $('.hide-cookie-content').removeClass("hide-cookie-content"); 849 }); 850}); 851/* 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.