1(() => { 2 'use strict'; 3 4 const ready = (callback) => { 5 if (document.readyState === 'loading') { 6 document.addEventListener('DOMContentLoaded', callback, { 7 once: true, 8 }); 9 return; 10 } 11 callback(); 12 }; 13 14 const setupMobileMenu = () => { 15 const toggle = document.querySelector('.pfaa91cbf3937-mobile-menu'); 16 const panel = document.querySelector('#pfaa91cbf3937-mobile-navigation'); 17 if (!toggle || !panel) { 18 return; 19 } 20 const setOpen = (open) => { 21 toggle.setAttribute('aria-expanded', String(open)); 22 panel.hidden = !open; 23 document.body.classList.toggle('pfaa91cbf3937-mobile-menu-open', open); 24 }; 25 toggle.addEventListener('click', () => { 26 setOpen(toggle.getAttribute('aria-expanded') !== 'true'); 27 }); 28 document.addEventListener('keydown', (event) => { 29 if (event.key === 'Escape') { 30 setOpen(false); 31 } 32 }); 33 window.addEventListener('resize', () => { 34 if (window.innerWidth > 849) { 35 setOpen(false); 36 } 37 }, { 38 passive: true, 39 }); 40 }; 41 42 const setupSubmenus = () => { 43 document.querySelectorAll('.menu-item-has-children').forEach((item) => { 44 const submenu = item.querySelector(':scope > .sub-menu'); 45 if (!submenu || item.querySelector(':scope > .pfaa91cbf3937-submenu-toggle')) { 46 return; 47 } 48 const button = document.createElement('button'); 49 button.type = 'button'; 50 button.className = 'pfaa91cbf3937-submenu-toggle'; 51 button.setAttribute('aria-expanded', 'false'); 52 button.setAttribute('aria-label', 'Má» trình ÄÆ¡n con'); 53 button.textContent = 'â'; 54 item.insertBefore(button, submenu); 55 button.addEventListener('click', (event) => { 56 const open = button.getAttribute('aria-expanded') !== 'true'; 57 button.setAttribute('aria-expanded', String(open)); 58 item.classList.toggle('is-open', open); 59 }); 60 }); 61 }; 62 63 const setupAccordion = () => { 64 document.querySelectorAll( 65 '.pfaa91cbf3937-accordion-item > button, .accordion-item > .accordion-title', 66 ).forEach((button) => { 67 const panel = button.parentElement.querySelector( 68 ':scope > .pfaa91cbf3937-accordion-panel, :scope > .accordion-inner', 69 ); 70 if (!panel) { 71 return; 72 } 73 const setOpen = (open) => { 74 button.setAttribute('aria-expanded', String(open)); 75 panel.hidden = !open; 76 }; 77 setOpen(button.getAttribute('aria-expanded') === 'true'); 78 button.addEventListener('click', (event) => { 79 if (button.matches('a')) { 80 event.preventDefault(); 81 } 82 const open = button.getAttribute('aria-expanded') !== 'true'; 83 setOpen(open); 84 }); 85 }); 86 }; 87 88 const setupSlider = () => { 89 document.querySelectorAll('.pfaa91cbf3937-slider').forEach((slider) => { 90 const slides = Array.from(slider.querySelectorAll('.pfaa91cbf3937-slide')); 91 const dots = slider.querySelector('.pfaa91cbf3937-slider-dots'); 92 if (slides.length < 2 || !dots) { 93 return; 94 } 95 let activeIndex = Math.max( 96 0, 97 slides.findIndex((slide) => slide.classList.contains('is-active')), 98 ); 99 let timer = 0; 100 const activate = (requestedIndex) => { 101 activeIndex = (requestedIndex + slides.length) % slides.length; 102 slides.forEach((slide, index) => { 103 slide.classList.toggle('is-active', index === activeIndex); 104 slide.setAttribute('aria-hidden', String(index !== activeIndex)); 105 }); 106 dots.querySelectorAll('.pfaa91cbf3937-slider-dot').forEach((dot, index) => { 107 dot.classList.toggle('is-active', index === activeIndex); 108 dot.setAttribute('aria-current', index === activeIndex ? 'true' : 'false'); 109 }); 110 }; 111 const schedule = () => { 112 window.clearInterval(timer); 113 timer = window.setInterval(() => activate(activeIndex + 1), 6500); 114 }; 115 slides.forEach((slide, index) => { 116 const dot = document.createElement('button'); 117 dot.type = 'button'; 118 dot.className = 'pfaa91cbf3937-slider-dot'; 119 dot.setAttribute('aria-label', `Ná»i dung ${index + 1}`); 120 dot.addEventListener('click', () => { 121 activate(index); 122 schedule(); 123 }); 124 dots.appendChild(dot); 125 }); 126 slider.querySelectorAll('[data-direction]').forEach((button) => { 127 button.addEventListener('click', () => { 128 activate( 129 activeIndex + (button.dataset.direction === 'previous' ? -1 : 1), 130 ); 131 schedule(); 132 }); 133 }); 134 slider.addEventListener('mouseenter', () => window.clearInterval(timer)); 135 slider.addEventListener('mouseleave', schedule); 136 activate(activeIndex); 137 if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { 138 schedule(); 139 } 140 }); 141 }; 142 143 const setupToc = () => { 144 document.querySelectorAll( 145 '.pfaa91cbf3937-toc, #ftwp-container, .lwptoc, #ez-toc-container', 146 ).forEach((toc) => { 147 const toggle = toc.querySelector( 148 '.pfaa91cbf3937-toc-toggle, #ftwp-trigger, .lwptoc_header, .ez-toc-toggle', 149 ); 150 if (!toggle) { 151 return; 152 } 153 const list = toc.querySelector( 154 'ol, #ftwp-list, .lwptoc_items, .ez-toc-list', 155 ); 156 const setOpen = (open) => { 157 toggle.setAttribute('aria-expanded', String(open)); 158 toc.classList.toggle('is-collapsed', !open); 159 if (list) { 160 list.hidden = !open; 161 } 162 }; 163 setOpen(!toc.classList.contains('is-collapsed')); 164 toggle.addEventListener('click', (event) => { 165 if (toggle.matches('a')) { 166 event.preventDefault(); 167 } 168 const open = toggle.getAttribute('aria-expanded') !== 'true'; 169 setOpen(open); 170 }); 171 toc.querySelectorAll('a[href*="#"]').forEach((link) => { 172 link.addEventListener('click', () => { 173 if (window.innerWidth <= 549) { 174 setOpen(false); 175 } 176 }); 177 }); 178 }); 179 }; 180 181 const setupBackToTop = () => { 182 const button = document.querySelector('.pfaa91cbf3937-back-to-top'); 183 if (!button) { 184 return; 185 } 186 const update = () => { 187 button.classList.toggle('is-visible', window.scrollY > 500); 188 }; 189 button.addEventListener('click', () => { 190 window.scrollTo({ 191 top: 0, 192 behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches 193 ? 'auto' 194 : 'smooth', 195 }); 196 }); 197 window.addEventListener('scroll', update, { 198 passive: true, 199 }); 200 update(); 201 }; 202 203 ready(() => { 204 setupMobileMenu(); 205 setupSubmenus(); 206 setupAccordion(); 207 setupSlider(); 208 setupToc(); 209 setupBackToTop(); 210 }); 211})();
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.