PageSourceSearch

https://visibility.sk/wp-content/themes/visibility/js/megamenu.js?v=4.8

js visibility.sk collected 2026-09-26 07:45:08 UTC 7,061 bytes, 219 lines download raw bytes

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.