PageSourceSearch

https://worldofaviation.com/wp-content/themes/worldofaviation/js/footer.js?ver=-249

js worldofaviation.com collected 2026-09-24 23:35:32 UTC 4,033 bytes, 113 lines download raw bytes

1(function() {
2    'use strict';
3
4    const initFooterMenu = () => {
5        const footerWrappers = document.querySelectorAll('#footerContainer .footer-ul-wrapper');
6        let isTransitioning = false;
7        const DESKTOP_BREAKPOINT = 1200;
8        const clickHandlers = [];
9
10        const toggleMenu = (wrapper, show) => {
11            if (isTransitioning) return;
12            isTransitioning = true;
13
14            const ul = wrapper.nextElementSibling;
15            const chevron = wrapper.querySelector('.fa-chevron-down');
16
17            if (!ul || ul.tagName !== 'UL') {
18                isTransitioning = false;
19                return;
20            }
21
22            if (show) {
23                ul.style.display = 'flex';
24                ul.style.flexDirection = 'column';
25                ul.style.height = '0';
26                ul.style.overflow = 'hidden';
27                const targetHeight = ul.scrollHeight + 'px';
28                ul.style.height = targetHeight;
29                if (chevron) chevron.style.transform = 'rotate(180deg)';
30
31                setTimeout(() => {
32                    ul.style.height = 'auto';
33                    isTransitioning = false;
34                }, 300);
35            } else {
36                ul.style.height = ul.scrollHeight + 'px';
37                setTimeout(() => {
38                    ul.style.height = '0';
39                    if (chevron) chevron.style.transform = 'rotate(0deg)';
40                }, 10);
41
42                setTimeout(() => {
43                    ul.style.display = 'none';
44                    isTransitioning = false;
45                }, 300);
46            }
47        };
48
49        const resetToOriginal = (wrapper) => {
50            const ul = wrapper.nextElementSibling;
51            const chevron = wrapper.querySelector('.fa-chevron-down');
52            if (ul && ul.tagName === 'UL') ul.removeAttribute('style');
53            if (chevron) chevron.removeAttribute('style');
54        };
55
56        const setupMobileStyles = (wrapper) => {
57            const ul = wrapper.nextElementSibling;
58            if (!ul || ul.tagName !== 'UL') return;
59            ul.style.display = 'none';
60            ul.style.overflow = 'hidden';
61            ul.style.transition = 'height 300ms ease-in-out';
62            ul.style.height = '0';
63        };
64
65        const handleFooterMenuClick = () => {
66            if (window.innerWidth < DESKTOP_BREAKPOINT) {
67                footerWrappers.forEach((wrapper, index) => {
68                    if (clickHandlers[index]) {
69                        wrapper.removeEventListener('click', clickHandlers[index]);
70                    }
71                    clickHandlers[index] = () => {
72                        const ul = wrapper.nextElementSibling;
73                        if (!ul || ul.tagName !== 'UL') return;
74                        const isHidden = ul.style.display === 'none' || !ul.style.display;
75                        toggleMenu(wrapper, isHidden);
76                    };
77                    wrapper.addEventListener('click', clickHandlers[index]);
78                });
79            }
80        };
81
82        footerWrappers.forEach((wrapper) => {
83            if (window.innerWidth < DESKTOP_BREAKPOINT) {
84                setupMobileStyles(wrapper);
85            }
86        });
87
88        handleFooterMenuClick();
89
90        let resizeTimer;
91        window.addEventListener('resize', () => {
92            clearTimeout(resizeTimer);
93            resizeTimer = setTimeout(() => {
94                const isDesktop = window.innerWidth >= DESKTOP_BREAKPOINT;
95
96                footerWrappers.forEach((wrapper) => {
97                    if (isDesktop) {
98                        resetToOriginal(wrapper);
99                    } else {
100                        setupMobileStyles(wrapper);
101                        handleFooterMenuClick();
102                    }
103                });
104            }, 250);
105        });
106    };
107
108    if (document.readyState === 'loading') {
109        document.addEventListener('DOMContentLoaded', initFooterMenu);
110    } else {
111        initFooterMenu();
112    }
113})();

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.