1/* JS for preset "Marquee" */ 2$(function() { 3 $('.marquee-wrap').attr('data-items', $('.marquee-wrap > .inner').children().length); 4}); 5/* End JS for preset "Marquee" */ 6 7/* JS for preset "Content Slider" */ 8$(function() { 9 if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) { 10 return; 11 } 12 13 viewport.promise('api.slick.ready', function() { 14 viewport.jQuery('.content-slider-wrap > .inner').slick({ 15 autoplay: false, 16 arrows: true, 17 prevArrow: '<button type="button" data-role="none" class="slick-prev" tabindex="0" role="button"></button>', 18 nextArrow: '<button type="button" data-role="none" class="slick-next" tabindex="0" role="button"></button>', 19 speed: 300, 20 autoplaySpeed: 3000, 21 dots: true, 22 adaptiveHeight: true, 23 fade: false 24 }); 25 }).requireSlick(); 26}); 27 28/* End JS for preset "Content Slider" */ 29 30/* JS for preset "Menu V2" */ 31(function() { 32 $(function() { 33 $('.menu-wrapper').each(function() { 34 initMenu($(this)) 35 }); 36 }); 37 38 // Make :active pseudo classes work on iOS 39 document.addEventListener("touchstart", function() {}, false); 40 41 var initMenu = function($menuWrapper) { 42 var $body = $('body'); 43 var $menu = $('.ed-menu', $menuWrapper); 44 var $menuLinks = $('a', $menu); 45 var $menuTrigger = $('.menu-trigger', $menuWrapper); 46 var $banner = $('.banner').first(); 47 48 var menuWrapperHeight = $menuWrapper.outerHeight(); 49 var bannerHeight = $banner.length ? $banner.outerHeight() : 0; 50 var smoothScrollOffset = 20; 51 52 toggleClassOnClick($body.add($menu), $menuTrigger, null, 'open open-menu'); // Keep open on $menu for backward compatibility 53 activateSmoothScroll($menuLinks.add($('.scroll a')), smoothScrollOffset); 54 addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3); 55 handleSticky($menuWrapper, 'sticky', $banner); 56 }; 57 58 /** 59 * Observe element's height changes and reload the initMenu() function 60 * 61 * @param {HTMLElement} elm Element to observe 62 * @param {function} callback to call when elmement's height changed 63 */ 64 var observeHeightChange = function(elm, callback) { 65 if (!('ResizeObserver' in window) || elm == null) return; 66 67 var ro = new ResizeObserver(callback); 68 ro.observe(elm); 69 } 70 71 /** 72 * Toggles class on a target when a trigger is clicked 73 * 74 * @param {jQuery} $target The target to apply the CSS class to 75 * @param {jQuery} $trigger The Trigger 76 * @param {jQuery} $closeTrigger Optional close trigger 77 * @param {string} cssClass CSS Class to toggle on the target 78 */ 79 var toggleClassOnClick = function($target, $trigger, $closeTrigger, cssClass) { 80 81 // Reset in case class "open" was saved accidentally 82 $target.removeClass(cssClass); 83 $trigger.removeClass(cssClass); 84 85 // Click on trigger toggles class "open" 86 $trigger.off('.toggle').on('click.toggle', function() { 87 $(this).toggleClass(cssClass); 88 $target.toggleClass(cssClass); 89 }); 90 91 // Close target when link inside is clicked 92 $target.find('a').click(function() { 93 $target.removeClass(cssClass); 94 $trigger.removeClass(cssClass); 95 }); 96 97 if (!$closeTrigger || !$closeTrigger.length) { 98 return; 99 } 100 101 $closeTrigger.click(function() { 102 $target.removeClass(cssClass); 103 $trigger.removeClass(cssClass); 104 }); 105 }; 106 107 /** 108 * Smooth scroll to link targets 109 * 110 * @param {jQuery} $scrollLinks The links 111 * @param {jQuery} scrollOffset Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu) 112 */ 113 var activateSmoothScroll = function($scrollLinks, scrollOffset) { 114 if (typeof scrollOffset === 'undefined') { 115 scrollOffset = 0; 116 } 117 118 var determineTarget = function($trigger, hash) { 119 if (hash == '#!next') { 120 return $trigger.closest('.ed-element').next(); 121 } 122 123 return $(hash); 124 } 125 126 $scrollLinks.click(function(e) { 127 var $target = determineTarget($(this), this.hash); 128 if (!$target.length) return; 129 e.preventDefault(); 130 131 viewport.scrollTo($target, 'top', 500, 0); 132 133 }); 134 }; 135 136 /** 137 * We are using the fill property on an element to pass user's choices from CSS to JavaScript 138 * 139 * @param {jQuery} $element 140 */ 141 var getStickyMode = function($element) { 142 var fillValue = getComputedStyle($element[0]).fill; 143 144 return fillValue === 'rgb(255, 0, 0)' ? 145 'sticky_banner' : 146 fillValue === 'rgb(0, 255, 0)' ? 147 'sticky_menu' : 148 fillValue === 'rgb(0, 0, 255)' ? 149 'sticky_instant' : 150 fillValue === 'rgb(255, 255, 255)' ? 151 'sticky_reverse' : 152 'sticky_none'; 153 }; 154 155 /** 156 * Adds a class to an element when not currently visible 157 * 158 * @param {jQuery} $element The element to handle stickyness for 159 * @param {string} cssClass The actual CSS class to be applied to the element when it's above a certain scroll position 160 * @param {jQuery} $banner A banner to reference the scroll position to 161 */ 162 var handleSticky = function($element, cssClass, $banner) { 163 var triggerPos = 0, 164 offset = 0; 165 var menuWrapperHeight = $element.outerHeight(); 166 var mode; 167 var prevScroll = 0; 168 $element.removeClass(cssClass); 169 170 var toggleSpacer = function(toggle) { 171 document.body.style.setProperty('--spacer-height', toggle ? menuWrapperHeight + 'px' : ''); 172 }; 173 174 var handleScroll = function() { 175 if (!$element.length || mode === 'sticky_none') return; 176 177 var isReverse = mode === 'sticky_reverse', 178 curScroll = viewport.getScrollTop(); 179 180 if (triggerPos <= curScroll && (!isReverse || prevScroll > curScroll)) { 181 $element.addClass(cssClass); 182 toggleSpacer(true); 183 } else { 184 $element.removeClass(cssClass); 185 toggleSpacer(false); 186 } 187 188 prevScroll = curScroll; 189 }; 190
191 var updateOffset = function() { 192 mode = getStickyMode($element); 193 menuWrapperHeight = $element.outerHeight(); 194 if (!$element.hasClass(cssClass)) { 195 offset = $element.offset().top; 196 } 197 if (mode === 'sticky_banner' && !$banner.length) { 198 mode = 'sticky_menu'; 199 } 200 if (mode === 'sticky_banner') { 201 triggerPos = $banner.offset().top + ($banner.length ? $banner.outerHeight() : $element.outerHeight()); 202 } 203 if (mode === 'sticky_menu' || mode === 'sticky_reverse') { 204 triggerPos = offset + $element.outerHeight(); 205 } 206 if (mode === 'sticky_instant') { 207 triggerPos = offset; 208 } 209 210 handleScroll(); 211 } 212 213 viewport.observe('resize', updateOffset); 214 viewport.observe('animation.end', updateOffset); 215 observeHeightChange($element[0], updateOffset); 216 updateOffset(); 217 218 viewport.observe('scroll', handleScroll); 219 handleScroll(); 220 }; 221 222 /** 223 * Adds a class to links whose target is currently inside the viewport 224 * 225 * @param {jQuery} $links Link(s) to be observed 226 * @param {string} cssClass CSS Class to be applied 227 * @param {float} sectionViewportRatio Ratio by which the target should be within the viewport 228 */ 229 var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) { 230 if (typeof sectionViewportRatio === 'undefined') { 231 sectionViewportRatio = 1 / 2; 232 } 233 234 var menuTargets = []; 235 var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0); 236 237 var links = $links.filter(function() { 238 var $target = $(this.hash); 239 if (!$target.length) { 240 return false; 241 } 242 243 // Cache offset position to improve performance (update on resize) 244 var updateOffset = function() { 245 $target.data('offset', $target.offset().top); 246 }; 247 248 viewport.observe('resize', updateOffset); 249 viewport.observe('animation.end', updateOffset); 250 updateOffset(); 251 252 menuTargets.push($target); 253 return true; 254 }); 255 256 // No hash links found, so don't handle it at all 257 if (!links.length) { 258 return; 259 } 260 261 var checkVisibility = function() { 262 $links.removeClass('active'); 263 264 // Check section position reversely 265 for (var i = menuTargets.length - 1; i >= 0; i--) { 266 var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio); 267 if (viewport.getScrollTop() >= desiredScrollPosition && menuTargets[i][0].offsetParent !== null) { 268 links.eq(i).addClass(cssClass); 269 return; 270 } 271 } 272 273 // Fallback to originally active item 274 activeLink.addClass(cssClass); 275 }; 276 277 viewport.observe('scroll', checkVisibility); 278 checkVisibility(); 279 }; 280})(); 281/* End JS for preset "Menu V2" */
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.