PageSourceSearch

https://www.isoa.org/js/header.js?v=b5veKM7TTA4zBZgCY42aGp7F4n3wAtP2o4hlz4WiwlA

js isoa.org collected 2026-09-26 01:49:10 UTC 4,173 bytes, 115 lines download raw bytes

1document.addEventListener('DOMContentLoaded', () => {
2    if (typeof gsap === 'undefined') return;
3
4    const mobileMenu = document.getElementById('iso-mobile-menu');
5    const openBtn = document.querySelector('.tw-iso-header-menu-btn-mobile');
6    const closeBtn = document.getElementById('iso-mobile-menu-close');
7    const submenuToggles = document.querySelectorAll('.js-mobile-submenu-toggle');
8    const searchTrigger = document.getElementById('iso-mobile-search-trigger');
9    const searchPanel = document.getElementById('iso-search-panel');
10    const mainHeader = document.getElementById('iso-main-header');
11    const headerNav = document.querySelector('.tw-iso-header-nav');
12
13    function getAlertH() {
14        const alertWrapper = document.getElementById('iso-alert-wrapper');
15        return (alertWrapper && alertWrapper.offsetHeight > 0) ? alertWrapper.offsetHeight : 0;
16    }
17
18    function getNavH() {
19        return headerNav ? headerNav.offsetHeight : 0;
20    }
21
22    function syncPositions() {           
23        if (mobileMenu) {
24            mobileMenu.style.top = ''; 
25            mobileMenu.style.height = ''; 
26            
27            const menuInner = mobileMenu.querySelector('.tw-iso-header-menu-mobile-inner');
28            if (menuInner) {
29                menuInner.style.paddingTop = ''; 
30            }
31        }
32
33        if (searchPanel) {
34            searchPanel.style.top = ''; 
35        }
36    }
37
38    syncPositions();
39    window.addEventListener('resize', syncPositions, { passive: true });
40
41    function openMenu() {
42        closeSearch();
43        syncPositions();
44        if (mainHeader) {
45            mainHeader.classList.add('is-menu-open');
46            mainHeader.classList.remove('is-search-open');
47        }
48        gsap.fromTo(mobileMenu, 
49            { opacity: 0, y: -20, autoAlpha: 0, display: 'block' },
50            { opacity: 1, y: 0, autoAlpha: 1, duration: 0.4, ease: 'power2.out' }
51        );
52        document.body.style.overflow = 'hidden';
53    }
54
55    function closeMenu() {
56        if (mainHeader) mainHeader.classList.remove('is-menu-open');
57        gsap.to(mobileMenu, {
58            opacity: 0,
59            y: -20,
60            autoAlpha: 0,
61            duration: 0.3,
62            ease: 'power2.in',
63            onComplete: () => {
64                gsap.set(mobileMenu, { display: 'none', y: 0 });
65            }
66        });
67        document.body.style.overflow = '';
68    }
69
70    function closeSearch() {
71        if (!searchPanel) return;
72        searchPanel.classList.remove('is-open');
73        searchPanel.setAttribute('aria-hidden', 'true');
74        if (mainHeader) mainHeader.classList.remove('is-search-open');
75    }
76
77    if (openBtn) openBtn.addEventListener('click', openMenu);
78    if (closeBtn) closeBtn.addEventListener('click', closeMenu);
79
80    submenuToggles.forEach(btn => {
81        btn.addEventListener('click', () => {
82            const submenu = btn.nextElementSibling;
83            const isOpened = btn.classList.contains('is-opened');
84
85            if (!isOpened) {
86                btn.classList.add('is-opened');
87                if (submenu) submenu.classList.add('is-open');
88            } else {
89                btn.classList.remove('is-opened');
90                if (submenu) submenu.classList.remove('is-open');
91            }
92        });
93    });
94
95    if (searchTrigger) {
96        searchTrigger.addEventListener('click', () => {
97            closeMenu();
98            syncPositions();
99            const searchBtnDesktop = document.getElementById('iso-header-search-btn');
100            if (searchBtnDesktop) searchBtnDesktop.click();
101            if (mainHeader) mainHeader.classList.add('is-search-open');
102        });
103    }
104
105    const searchCloseElements = ['iso-search-backdrop', 'iso-search-close-desktop', 'iso-search-close'];
106    searchCloseElements.forEach(id => {
107        const el = document.getElementById(id);
108        if (el) {
109            el.addEventListener('click', () => {
110                closeSearch();
111                document.body.style.overflow = '';
112            });
113        }
114    });
115});

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.