1jQuery(document).ready(function ($) { 2 3 $('.slick-slider').slick(); 4 5 $('.format-tab').on('shown.bs.tab', function (e) { 6 const target = $(e.target).attr("data-bs-target"); 7 8 $(target).find('.slick-formats').slick('setPosition'); 9 }); 10 11 $('.header_burger').click(function (event) { 12 $('.header_burger, .navbar-collapse').toggleClass('show'); 13 $('body').toggleClass('lock'); 14 }); 15 16 $('.list-toggle').click(function () { 17 // Move up DOM tree to nearest list 18 // Toggle collapsed and expanded classes 19 $(this).closest('ul').toggleClass('collapsed').toggleClass('expanded'); 20 }); 21 22 23 // Glossary 24 document.querySelectorAll('.glossary-block__btn').forEach(link => { 25 link.addEventListener('click', (e) => { 26 e.currentTarget.parentElement.classList.toggle('expanded'); 27 }); 28 }); 29 30 function glossaryFilter() { 31 const input = document.getElementById('glossary-filter'); 32 const navButtons = document.querySelectorAll('.btn-glossary-nav'); 33 34 function clearFields(termBlocks, termItems, inputField) { 35 termBlocks.forEach(block => block.classList.remove('inactive')); 36 termItems.forEach(item => item.style.display = ''); 37 inputField.value = ''; 38 } 39 40 if (input) { 41 input.addEventListener('keyup', () => { 42 const termBlocks = document.querySelectorAll('.glossary-block'); 43 const termItems = document.querySelectorAll('.glossary-block__item'); 44 const searchTerm = input.value.toUpperCase(); 45 46 navButtons.forEach(button => button.classList.remove('current')); 47 48 termBlocks.forEach(block => block.classList.add('inactive')); 49 termItems.forEach(item => item.style.display = 'none'); 50 51 termItems.forEach(item => { 52 if (item.dataset.item.toUpperCase().includes(searchTerm)) { 53 item.style.display = 'block'; 54 item.closest('.glossary-block').classList.remove('inactive'); 55 } 56 }); 57 }); 58 59 navButtons.forEach(button => { 60 button.addEventListener('click', (e) => { 61 const navData = button.dataset.nav; 62 const termBlocks = document.querySelectorAll('.glossary-block'); 63 const termItems = document.querySelectorAll('.glossary-block__item'); 64 65 clearFields(termBlocks, termItems, input); 66 67 navButtons.forEach(btn => btn.classList.remove('current')); 68 e.target.classList.add('current'); 69 70 if (navData !== 'all') { 71 termBlocks.forEach(block => { 72 if (block.dataset.term !== navData) { 73 block.classList.add('inactive'); 74 } 75 }); 76 } 77 }); 78 }); 79 } 80 } 81 82 glossaryFilter(); 83 84 85 const btnNav = document.getElementById('btnNav'); 86 btnNav && btnNav.addEventListener('click', () => { 87 document.body.classList.toggle('menu-open'); 88 }); 89 90 const btnSubmenu = document.querySelectorAll('.header-navigation__item-icon'); 91 btnSubmenu.forEach(b => { 92 b.addEventListener('click', function () { 93 const openSubmenuParent = document.querySelector('.header-navigation__item.show'); 94 if (openSubmenuParent && openSubmenuParent !== this.parentNode) { 95 openSubmenuParent.classList.remove('show'); 96 } 97 98 const submenu = this.parentNode.querySelector('.header-navigation__sub'); 99 if (submenu) { 100 this.parentNode.classList.toggle('show') 101 } 102 }) 103 }) 104 105 // Table of content 106 const container = document.getElementById('ez-toc-container'); 107 if (container) { 108 const anchors = document.querySelectorAll('.ez-toc-section'); 109 const links = document.querySelectorAll('.ez-toc-link'); 110 const activeClasses = 'current'; 111 const headerHeight = document.getElementById('header').offsetHeight; 112 113 links.forEach((link) => { 114 link.addEventListener('click', (e) => { 115 e.preventDefault(); 116 const target = e.currentTarget.getAttribute('href').substring(1); 117 const el = document.getElementById(target); 118 const elementPosition = el.getBoundingClientRect().top + window.pageYOffset; 119 window.scrollTo({ 120 top: elementPosition - headerHeight - 30, 121 behavior: 'smooth' 122 }); 123 }); 124 }); 125 126 window.addEventListener('scroll', () => { 127 let scrollTop = window.scrollY; 128 129 links.forEach((link) => { 130 link.classList.remove(activeClasses); 131 }); 132 133 for (let i = anchors.length - 1; i >= 0; i--) { 134 const anchorTop = anchors[i].getBoundingClientRect().top + scrollTop - headerHeight - 40; 135 136 if (scrollTop >= anchorTop) { 137 links[i].classList.add(activeClasses); 138 break; 139 } 140 } 141 }); 142 } 143 144 // Referral links 145 (function () { 146 const STORAGE_KEY = 'utmData'; 147 const SIGNUP_PATH = 'auth/signUp'; 148 const UTM_PARAMS = [ 149 'utm_rid', 150 'utm_source', 151 'utm_medium', 152 'utm_campaign', 153 'utm_content', 154 'utm_term', 155 'rfd' 156 ]; 157 158 function collectUtmFromUrl() { 159 const params = new URLSearchParams(window.location.search); 160 const data = {}; 161 UTM_PARAMS.forEach(key => { 162 const value = params.get(key); 163 if (value) data[key] = value; 164 }); 165 return data; 166 } 167 168 function getStoredUtmData() {
169 try { 170 const raw = localStorage.getItem(STORAGE_KEY); 171 return raw ? JSON.parse(raw) : {}; 172 } catch { 173 return {}; 174 } 175 } 176 177 function saveUtmData(newData) { 178 const existingData = getStoredUtmData(); 179 const merged = { ...existingData, ...newData }; 180 if (Object.keys(merged).length > 0) { 181 localStorage.setItem(STORAGE_KEY, JSON.stringify(merged)); 182 } 183 return merged; 184 } 185 186 function addUtmToSignupLinks(utmData) { 187 if (!utmData || Object.keys(utmData).length === 0) { 188 return; 189 } 190 191 const links = document.querySelectorAll(`a[href*="${SIGNUP_PATH}"]`); 192 links.forEach(link => { 193 try { 194 const url = new URL(link.href); 195 Object.entries(utmData).forEach(([key, value]) => { 196 url.searchParams.set(key, value); 197 }); 198 link.href = url.toString(); 199 } catch {} 200 }); 201 } 202 203 const utmFromUrl = collectUtmFromUrl(); 204 const mergedUtmData = saveUtmData(utmFromUrl); 205 addUtmToSignupLinks(mergedUtmData); 206 })(); 207 208 // Tooltips 209 const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') 210 const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) 211 212 // Tabs 213 const triggerTabList = document.querySelectorAll('.formats-nav__button'); 214 let currentIndex = 0; 215 216 const btnNextTab = document.getElementById('btnNextTab'); 217 const btnPrevTab = document.getElementById('btnPrevTab'); 218 219 if (btnNextTab) { 220 btnNextTab.addEventListener('click', function () { 221 currentIndex = (currentIndex + 1) % triggerTabList.length; 222 223 const nextTabTrigger = new bootstrap.Tab(triggerTabList[currentIndex]); 224 nextTabTrigger.show(); 225 }); 226 } 227 228 if (btnPrevTab) { 229 btnPrevTab.addEventListener('click', function () { 230 currentIndex = (currentIndex - 1 + triggerTabList.length) % triggerTabList.length; 231 232 const prevTabTrigger = new bootstrap.Tab(triggerTabList[currentIndex]); 233 prevTabTrigger.show(); 234 }); 235 } 236 237 238 // Adaptive table 239 const wysiwygDivs = document.querySelectorAll("div.wysiwyg"); 240 241 wysiwygDivs.forEach(div => { 242 const tables = div.querySelectorAll("table"); 243 244 tables.forEach(table => { 245 const wrapper = document.createElement("div"); 246 wrapper.style.overflowX = "auto"; 247 wrapper.style.width = "100%"; 248 249 table.parentNode.insertBefore(wrapper, table); 250 251 wrapper.appendChild(table); 252 }); 253 }); 254 255}); 256
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.