1function updateMegamenuHeaderScrolled() { 2 if ($('html').hasClass('megamenu-scroll-lock')) { 3 return; 4 } 5 6 $('.new-megamenu-header').toggleClass('scrolled', $(window).scrollTop() > 100); 7} 8 9function lockPageScroll() { 10 if ($('html').hasClass('megamenu-scroll-lock')) { 11 return; 12 } 13 14 var scrollTop = $(window).scrollTop(); 15 16 // Freeze the header's scrolled/unscrolled state for the duration of the 17 // lock - body becomes position:fixed below, which makes the window's 18 // scrollTop read back as ~0 and would otherwise fire a scroll event that 19 // strips .scrolled (making the header grow) right as the menu opens. 20 $(window).off('scroll', updateMegamenuHeaderScrolled); 21 22 $('html').addClass('megamenu-scroll-lock').data('megamenu-scroll-top', scrollTop); 23 $('body').css('top', -scrollTop); 24} 25 26function unlockPageScroll() { 27 if (!$('html').hasClass('megamenu-scroll-lock')) { 28 return; 29 } 30 31 var scrollTop = $('html').data('megamenu-scroll-top') || 0; 32 33 $('html').removeClass('megamenu-scroll-lock').removeData('megamenu-scroll-top'); 34 $('body').css('top', ''); 35 $(window).scrollTop(scrollTop); 36 37 $(window).on('scroll', updateMegamenuHeaderScrolled); 38 updateMegamenuHeaderScrolled(); 39} 40 41function updateMegamenuScrollFade($panelInner) { 42 if (!$panelInner || !$panelInner.length) { 43 return; 44 } 45 46 var el = $panelInner[0]; 47 var hasOverflow = el.scrollHeight > el.clientHeight + 1; 48 var atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1; 49 50 $panelInner.toggleClass('has-more-below', hasOverflow && !atBottom); 51} 52 53function positionMegamenuPanels() { 54 var $header = $('.new-megamenu-header'); 55 if (!$header.length) { 56 return; 57 } 58 var top = $header[0].getBoundingClientRect().bottom; 59 $('.megamenu-panel').css('top', top); 60 $('.mobile-megamenu').css('top', top); 61} 62 63function clearThirdLevel($panel) { 64 $panel.find('.megamenu-second-level-trigger').removeClass('active'); 65 $panel.find('.megamenu-third-level').removeClass('active').empty(); 66} 67 68function closeMobileAccordion() { 69 $('.mobile-megamenu-trigger').removeClass('active').attr('aria-expanded', 'false'); 70 $('.mobile-megamenu-second-level').removeClass('open'); 71} 72 73function closeMobileMegamenu() { 74 $('.mobile-megamenu').removeClass('open'); 75 $('.mobile-menu-toggler').removeClass('open').attr('aria-expanded', 'false'); 76 $('.new-megamenu-header').removeClass('megamenu-open'); 77 closeMobileAccordion(); 78 unlockPageScroll(); 79} 80 81function closeMegamenu() { 82 $('.megamenu-panel').each(function () { 83 clearThirdLevel($(this)); 84 }); 85 $('.megamenu-panel').removeClass('open'); 86 $('.megamenu-trigger').removeClass('active').attr('aria-expanded', 'false'); 87 $('.new-megamenu-header').removeClass('megamenu-open'); 88 unlockPageScroll(); 89} 90 91function activateThirdLevel($panel, index) { 92 clearThirdLevel($panel); 93 94 var $template = $panel.find('.megamenu-third-level-template[data-third-level-trigger="' + index + '"]'); 95 if (!$template.length) { 96 return; 97 } 98 99 $panel.find('.megamenu-second-level-trigger[data-third-level-trigger="' + index + '"]').addClass('active'); 100 $panel.find('.megamenu-third-level').html($template.html()).addClass('active'); 101} 102 103$( document ).ready(function() { 104 positionMegamenuPanels(); 105 $(window).resize(positionMegamenuPanels); 106 107 updateMegamenuHeaderScrolled(); 108 $(window).on('scroll', updateMegamenuHeaderScrolled); 109 110 $('.megamenu-panel-inner').each(function () { 111 var $panelInner = $(this); 112 updateMegamenuScrollFade($panelInner); 113 $panelInner.on('scroll', function () { 114 updateMegamenuScrollFade($panelInner); 115 }); 116 }); 117 118 $(window).on('resize', function () { 119 $('.megamenu-panel-inner').each(function () { 120 updateMegamenuScrollFade($(this)); 121 }); 122 }); 123 124 $('.megamenu-trigger').on('click', function (e) { 125 e.preventDefault(); 126 127 var index = $(this).data('megamenu-trigger'); 128 var $panel = $('.megamenu-panel[data-megamenu-panel="' + index + '"]'); 129 var isOpen = $panel.hasClass('open'); 130 131 // Close (and unlock, which settles the header's scrolled state) 132 // before measuring - otherwise this can measure a header height 133 // that's about to change once the previous panel's lock releases. 134 closeMegamenu(); 135 positionMegamenuPanels(); 136 137 if (!isOpen) { 138 $panel.addClass('open'); 139 $(this).addClass('active').attr('aria-expanded', 'true'); 140 $('.new-megamenu-header').addClass('megamenu-open'); 141 lockPageScroll(); 142 updateMegamenuScrollFade($panel.find('.megamenu-panel-inner')); 143 } 144 }); 145 146 $('.megamenu-close').on('click', function () { 147 closeMegamenu(); 148 }); 149 150 $('.megamenu-second-level li > a').on('mouseenter focus', function () { 151 var $panel = $(this).closest('.megamenu-panel'); 152 153 if ($(this).hasClass('megamenu-second-level-trigger')) { 154 activateThirdLevel($panel, $(this).data('third-level-trigger')); 155 } else { 156 clearThirdLevel($panel); 157 } 158 159 updateMegamenuScrollFade($panel.find('.megamenu-panel-inner')); 160 }); 161 162 $('.megamenu-panel').on('mouseleave', function () { 163 var $panel = $(this); 164 clearThirdLevel($panel); 165 updateMegamenuScrollFade($panel.find('.megamenu-panel-inner')); 166 }); 167 168 $(document).on('click', function (e) { 169 if (!$(e.target).closest('.has-megamenu, .megamenu-panel, .mobile-menu-toggler, .mobile-megamenu').length) { 170 closeMegamenu(); 171 } 172 }); 173 174 $(document).on('keyup', function (e) { 175 if (e.key === 'Escape') { 176 closeMegamenu(); 177 } 178 }); 179 180 $('.mm-search-icon').on('click', function () { 181 $('#fullsearch').fadeIn('quick'); 182 $('#fullsearch input[type=text]').focus(); 183 }); 184 185 $('.mobile-menu-toggler').on('click', function () { 186 var isOpen = $('.mobile-megamenu').hasClass('open'); 187 188 closeMobileMegamenu(); 189 positionMegamenuPanels(); 190 191 if (!isOpen) { 192 $('.mobile-megamenu').addClass('open'); 193 $('.mobile-menu-toggler').addClass('open').attr('aria-expanded', 'true'); 194 $('.new-megamenu-header').addClass('megamenu-open'); 195 lockPageScroll(); 196 } 197 }); 198 199 $('.mobile-megamenu-trigger').on('click', function (e) { 200 e.preventDefault(); 201 202 var index = $(this).data('mobile-megamenu-trigger'); 203 var $panel = $('.mobile-megamenu-second-level[data-mobile-megamenu-panel="' + index + '"]'); 204 var isOpen = $panel.hasClass('open'); 205 206 closeMobileAccordion(); 207 208 if (!isOpen) { 209 $(this).addClass('active').attr('aria-expanded', 'true'); 210 $panel.addClass('open'); 211 } 212 }); 213 214 $(document).on('keyup', function (e) { 215 if (e.key === 'Escape') { 216 closeMobileMegamenu(); 217 } 218 }); 219});
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.