PageSourceSearch

https://www.iuoe.org/js/script.js?v=091126

js iuoe.org collected 2026-09-24 19:51:31 UTC 25,718 bytes, 895 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function() {
2  const utilityNav = document.querySelector('.utility-nav');
3  const mainNav = document.querySelector('.navbar');
4  const mobileToggle = document.getElementById('mobileToggle');
5  const navMenu = document.getElementById('navMenu');
6  const navItems = Array.from(document.querySelectorAll('.nav-item'));
7  const memberNavItem = document.querySelector('.nav-item.member-click-only');
8  const utilityMemberTrigger = document.querySelector('.utility-member-trigger');
9  let activeDropdown = null;
10  let isMobile = window.innerWidth <= 1024;
11  const hoverCloseTimers = new WeakMap();
12  const HOVER_CLOSE_DELAY = 140;
13  let lastScrollY = window.scrollY;
14  let scrollDirection = 0;
15  let directionDistance = 0;
16  let headerHidden = false;
17  let headerScrollThreshold = 0;
18  let scrollTicking = false;
19
20  function updateIsMobile() {
21    isMobile = window.innerWidth <= 1024;
22  }
23
24  function getHeaderHeight() {
25    const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0;
26    const mainHeight = mainNav ? mainNav.offsetHeight : 0;
27    return utilityHeight + mainHeight;
28  }
29
30  function syncHeaderMetrics() {
31    const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0;
32    headerScrollThreshold = getHeaderHeight();
33    document.documentElement.style.setProperty('--header-utility-height', `${utilityHeight}px`);
34  }
35
36  function setHeaderHidden(nextHidden) {
37    if (headerHidden === nextHidden) {
38      return;
39    }
40
41    headerHidden = nextHidden;
42    document.body.classList.toggle('nav-scroll-hidden', headerHidden);
43
44    if (headerHidden) {
45      navItems.forEach(item => {
46        deactivateNavItem(item);
47      });
48    }
49  }
50
51  function handleHeaderScroll() {
52    scrollTicking = false;
53
54    if (!mainNav) {
55      return;
56    }
57
58    if (navMenu && navMenu.classList.contains('active')) {
59      setHeaderHidden(false);
60      lastScrollY = window.scrollY;
61      scrollDirection = 0;
62      directionDistance = 0;
63      return;
64    }
65
66    const currentScrollY = Math.max(window.scrollY, 0);
67    const delta = currentScrollY - lastScrollY;
68
69    if (Math.abs(delta) < 2) {
70      return;
71    }
72
73    const nextDirection = delta > 0 ? 1 : -1;
74
75    if (nextDirection !== scrollDirection) {
76      scrollDirection = nextDirection;
77      directionDistance = 0;
78    }
79
80    directionDistance += Math.abs(delta);
81
82    const threshold = Math.max(headerScrollThreshold || getHeaderHeight(), mainNav.offsetHeight);
83
84    if (currentScrollY <= threshold) {
85      setHeaderHidden(false);
86      directionDistance = 0;
87      scrollDirection = 0;
88    } else if (nextDirection === 1 && !headerHidden && directionDistance >= threshold) {
89      setHeaderHidden(true);
90      directionDistance = 0;
91    } else if (nextDirection === -1 && headerHidden && directionDistance >= threshold) {
92      setHeaderHidden(false);
93      directionDistance = 0;
94    }
95
96    lastScrollY = currentScrollY;
97  }
98
99  function updateToggleState(targetItem) {
100    if (!targetItem) {
101      return;
102    }
103
104    const toggleButton = targetItem.querySelector('.nav-expand-toggle');
105    if (toggleButton) {
106      const expanded = targetItem.classList.contains('active');
107      toggleButton.setAttribute('aria-expanded', expanded ? 'true' : 'false');
108    }
109  }
110
111  function updateSectionToggle(section) {
112    if (!section) {
113      return;
114    }
115
116    const toggle = section.querySelector('.section-toggle');
117    if (toggle) {
118      const expanded = section.classList.contains('expanded');
119      toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false');
120    }
121  }
122
123  function updateMemberTriggerState() {
124    if (!utilityMemberTrigger || !memberNavItem) {
125      return;
126    }
127    const expanded = memberNavItem.classList.contains('active');
128    utilityMemberTrigger.setAttribute('aria-expanded', expanded ? 'true' : 'false');
129  }
130
131  function clearHoverCloseTimer(navItem) {
132    const timeoutId = hoverCloseTimers.get(navItem);
133    if (timeoutId) {
134      clearTimeout(timeoutId);
135      hoverCloseTimers.delete(navItem);
136    }
137  }
138
139  function scheduleHoverClose(navItem) {
140    if (!navItem) {
141      return;
142    }
143
144    clearHoverCloseTimer(navItem);
145    const timeoutId = setTimeout(function() {
146      hoverCloseTimers.delete(navItem);
147      if (!isMobile) {
148        deactivateNavItem(navItem);
149      }
150    }, HOVER_CLOSE_DELAY);
151    hoverCloseTimers.set(navItem, timeoutId);
152  }
153
154  function deactivateNavItem(navItem) {
155    if (!navItem) {
156      return;
157    }
158    clearHoverCloseTimer(navItem);
159    navItem.classList.remove('active');
160    if (activeDropdown === navItem) {
161      activeDropdown = null;
162    }
163    updateToggleState(navItem);
164    if (navItem === memberNavItem) {
165      updateMemberTriggerState();
166    }
167  }
168
169  function activateNavItem(navItem) {
170    clearHoverCloseTimer(navItem);
171    navItems.forEach(item => {
172      if (item !== navItem) {
173        deactivateNavItem(item);
174      }
175    });
176    navItem.classList.add('active');
177    activeDropdown = navItem;
178    updateToggleState(navItem);
179    if (navItem === memberNavItem) {
180      updateMemberTriggerState();
181    }
182  }
183
184  function toggleNavItem(navItem) {
185    if (navItem.classList.contains('active')) {
186      deactivateNavItem(navItem);
187    } else {
188      activateNavItem(navItem);
189    }
190  }
191
192  mobileToggle.addEventListener('click', function() {
193    mobileToggle.classList.toggle('active');
194    navMenu.classList.toggle('active');
195    setHeaderHidden(false);
196    
197    if (!navMenu.classList.contains('active')) {
198      navItems.forEach(item => {
199        deactivateNavItem(item);
200      });
201    }
202  });
203
204
205  
206 /*  if (utilityMemberTrigger && memberNavItem) {
207    utilityMemberTrigger.addEventListener('click', function(e) {
208      if (isMobile) {
209        const targetHref = utilityMemberTrigger.getAttribute('data-href') || 'members.html';
210        window.location.href = targetHref;
211        return;
212      }
213
214      e.preventDefault();
215      e.stopPropagation();
216      toggleNavItem(memberNavItem);
217    });
218  } */
219
220  if (utilityMemberTrigger && memberNavItem) {
221      utilityMemberTrigger.addEventListener('click', function() {
222      const targetHref = utilityMemberTrigger.getAttribute('data-href') || '/members/';
223      window.location.href = targetHref;
224      });
225    /* utilityMemberTrigger.addEventListener('click', function(e) {
226      e.preventDefault();
227      e.stopPropagation();
228      toggleNavItem(memberNavItem);
229    }); */
230
231    utilityMemberTrigger.addEventListener('mouseenter', function() {
232      if (isMobile) {
233        return;
234      }
235      clearHoverCloseTimer(memberNavItem);
236      activateNavItem(memberNavItem);
237    });
238
239    utilityMemberTrigger.addEventListener('mouseleave', function(e) {
240      if (isMobile) {
241        return;
242      }
243      const nextTarget = e.relatedTarget;
244      if (nextTarget && (utilityMemberTrigger.contains(nextTarget) || memberNavItem.contains(nextTarget))) {
245        return;
246      }
247      scheduleHoverClose(memberNavItem);
248    });
249  }
250
251/************/
252
253  navItems.forEach(navItem => {
254    const sections = navItem.querySelectorAll('.mega-menu-section');
255    const megaMenu = navItem.querySelector('.mega-menu');
256    const navLink = navItem.querySelector('.nav-link');
257    const navTrigger = navItem.querySelector('.nav-trigger');
258    const isDirectLink = navLink && navLink.classList.contains('nav-link-direct');
259    const hasDropdown = navItem.classList.contains('has-dropdown');
260    
261    sections.forEach(section => {
262      const sectionToggle = section.querySelector('.section-toggle');
263      if (sectionToggle) {
264        sectionToggle.addEventListener('click', function(e) {
265          e.preventDefault();
266          e.stopPropagation();
267          section.classList.toggle('expanded');
268          updateSectionToggle(section);
269        });
270
271        updateSectionToggle(section);
272      }
273    });
274
275    if (navTrigger && hasDropdown) {
276      navTrigger.addEventListener('click', function(e) {
277        if (!isMobile) {
278          return;
279        }
280        if (e.target.closest('.nav-expand-toggle')) {
281          return;
282        }
283        if (e.target.closest('.nav-link')) {
284          return;
285        }
286        e.stopPropagation();
287        toggleNavItem(navItem);
288      });
289    }
290
291    if (hasDropdown) {
292      const hoverTargets = [navTrigger, megaMenu].filter(Boolean);
293
294      hoverTargets.forEach(target => {
295        target.addEventListener('mouseenter', function() {
296          if (isMobile) {
297            return;
298          }
299          clearHoverCloseTimer(navItem);
300          activateNavItem(navItem);
301        });
302
303        target.addEventListener('mouseleave', function(e) {
304          if (isMobile) {
305            return;
306          }
307          const nextTarget = e.relatedTarget;
308          if (nextTarget && hoverTargets.some(hoverTarget => hoverTarget.contains(nextTarget))) {
309            return;
310          }
311          scheduleHoverClose(navItem);
312        });
313      });
314    }
315
316    const toggleButton = navItem.querySelector('.nav-expand-toggle');
317
318    if (toggleButton) {
319      toggleButton.addEventListener('click', function(e) {
320        if (!isMobile) {
321          return;
322        }
323        e.preventDefault();
324        e.stopPropagation();
325        toggleNavItem(navItem);
326      });
327    }
328
329    updateToggleState(navItem);
330  });
331
332  document.addEventListener('click', function(e) {
333    const insideNav = e.target.closest('.navbar') || e.target.closest('.utility-nav') || e.target.closest('.mega-menu');
334    if (!insideNav) {
335      navItems.forEach(item => {
336        deactivateNavItem(item);
337      });
338    }
339  });
340
341  let resizeTimeout;
342  window.addEventListener('resize', function() {
343    clearTimeout(resizeTimeout);
344    resizeTimeout = setTimeout(() => {
345      const wasMobile = isMobile;
346      updateIsMobile();
347      syncHeaderMetrics();
348      setHeaderHidden(false);
349      
350      if (isMobile !== wasMobile) {
351        navMenu.classList.remove('active');
352        mobileToggle.classList.remove('active');
353        navItems.forEach(navItem => {
354          deactivateNavItem(navItem);
355        });
356      }
357    }, 250);
358  });
359
360  document.querySelectorAll('a[href^="#"]').forEach(anchor => {
361    anchor.addEventListener('click', function(e) {
362      const href = this.getAttribute('href');
363      if (href !== '#' && href.length > 1) {
364        const target = document.querySelector(href);
365        if (target) {
366          e.preventDefault();
367          target.scrollIntoView({
368            behavior: 'smooth',
369            block: 'start'
370          });
371          
372          if (isMobile) {
373            navMenu.classList.remove('active');
374            mobileToggle.classList.remove('active');
375            navItems.forEach(item => item.classList.remove('active'));
376          }
377        }
378      }
379    });
380  });
381
382  syncHeaderMetrics();
383  lastScrollY = window.scrollY;
384
385  window.addEventListener('scroll', function() {
386    if (scrollTicking) {
387      return;
388    }
389
390    scrollTicking = true;
391    window.requestAnimationFrame(handleHeaderScroll);
392  }, { passive: true });
393
394});
395
396
397/* const openBtn = document.querySelector(".menu-open");
398const closeBtn = document.querySelector(".menu-close");
399const nav = document.querySelector(".main-nav-wrap");
400
401closeBtn.addEventListener("click", (e) => {
402nav.classList.remove("open");
403nav.classList.add("close");
404nav.addEventListener("transitionend", () => {
405    console.log("animation ended");
406    nav.classList.remove("close");
407});
408e.preventDefault();
409});
410openBtn.addEventListener("click", (e) => {
411nav.classList.remove("close");
412nav.classList.add("open");
413e.preventDefault();
414}); */
415
416    /*import './style.css'
417import { gsap } from 'gsap'
418import { ScrollTrigger } from 'gsap/ScrollTrigger'*/
419/***PIN PROJECT VIDEO***/
420/* gsap.registerPlugin(ScrollTrigger)
421
422const imageWrapper = document.getElementById('imageWrapper')
423const video2 = document.getElementById('video2')
424
425if (imageWrapper && video2) {
426  ScrollTrigger.create({
427    trigger: imageWrapper,
428    start: 'center center',
429    end: () => window.innerHeight * 3 + ' top',
430    pin: true,
431    pinSpacing: true,
432    markers: true
433  })
434
435  const tl = gsap.timeline({
436    scrollTrigger: {
437      trigger: imageWrapper,
438      start: 'center center',
439      end: () => window.innerHeight * 3 + ' top',
440      scrub: true
441    }
442  })
443
444  tl.fromTo(imageWrapper,
445    {
446      height: getComputedStyle(imageWrapper).height,
447      clipPath: getComputedStyle(imageWrapper).clipPath
448    },
449    {
450      height: '100vh',
451      clipPath: 'polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)',
452      duration: 1
453    }
454  )
455  .to(video2, {
456    clipPath: 'inset(0px 0px 0% 0px)',
457    duration: 1
458  }, '+=0.2')
459}
460 */
461
462/* Card sorting (cards page) */
463const cardGrid = document.querySelector('.card-grid-sortable[data-sortable]');
464const sortButtons = document.querySelectorAll('.card-sort__btn');
465
466if (cardGrid && sortButtons.length) {
467  const cards = Array.from(cardGrid.querySelectorAll('.sort-card'));
468  const normalizeCategoryList = (value) => {
469    if (!value) {
470      return [];
471    }
472    return value
473      .split(/[\s,]+/)
474      .map(item => item.trim())
475      .filter(Boolean);
476  };
477
478  sortButtons.forEach(button => {
479    button.addEventListener('click', () => {
480      const target = button.dataset.sort;
481
482      sortButtons.forEach(btn => {
483        const isTarget = btn === button;
484        btn.classList.toggle('is-active', isTarget);
485        btn.setAttribute('aria-pressed', isTarget ? 'true' : 'false');
486      });
487
488      cards.forEach(card => {
489        const categories = normalizeCategoryList(card.dataset.category);
490        const match = target === 'all' || categories.includes(target);
491        card.classList.toggle('is-hidden', !match);
492      });
493    });
494  });
495}
496
497
498/* HERO IMAGE/VIDEO */
499/*   (function () {
500    const figure = document.querySelector('.hero__figure');
501    if (!figure) return;
502
503    const video = figure.querySelector('.hero__media--video');
504    if (!video) return;
504 // image-only: do nothing; image stays visible
505
506    const makeReady = () => {
507      figure.classList.add('is-video-ready'); // triggers image fade-out
508    };
509
510    // If the video is already buffered enough
511    if (video.readyState >= 3) { // HAVE_FUTURE_DATA
512      makeReady();
513    } else {
514      // Wait until it can play
515      video.addEventListener('canplay', makeReady, { once: true });
516    }
517  })(); */
518  (function () {
519  const figure = document.querySelector('.hero__figure');
520  if (!figure) return;
521
522  const video = figure.querySelector('.hero__media--video');
523  const source = video?.querySelector('source[data-src]');
524  if (!video || !source) return;
525
526  const makeReady = () => {
527    figure.classList.add('is-video-ready');
528  };
529
530  const loadVideo = () => {
531    if (source.src) return;
532
533    source.src = source.dataset.src;
534    video.load();
535
536    if (video.readyState >= 3) {
537      makeReady();
538    } else {
539      video.addEventListener('canplay', makeReady, { once: true });
540    }
541
542    video.play().catch(() => {
543      // If autoplay fails, keep the image visible.
544    });
545  };
546
547  if ('requestIdleCallback' in window) {
548    requestIdleCallback(loadVideo, { timeout: 800 });
549  } else {
550    setTimeout(loadVideo, 300);
551  }
552})();
553
554/* SEARCH MODAL */
555  
556  const searchIcon = document.querySelector('.search-icon');
557  const searchModal = document.getElementById('searchModal');
558  const closeBtn = searchModal.querySelector('.search-modal__close');
559  const backdrop = searchModal.querySelector('.search-modal__backdrop');
560  const input = searchModal.querySelector('.search-modal__input');
561
562  function openSearchModal(event) {
563    if (event) event.preventDefault();
564    searchModal.classList.add('is-open');
565    document.body.classList.add('modal-open');
566    // focus the input after open
567    setTimeout(() => input && input.focus(), 100);
568  }
569
570  function closeSearchModal() {
571    searchModal.classList.remove('is-open');
572    document.body.classList.remove('modal-open');
573  }
574
575
576  // Open on icon click
577  searchIcon.addEventListener('click', openSearchModal);
578
579  // Close on close button or backdrop click
580  closeBtn.addEventListener('click', closeSearchModal);
581  backdrop.addEventListener('click', closeSearchModal);
582
583  // Close on ESC key
584  document.addEventListener('keydown', (e) => {
585    if (e.key === 'Escape' && searchModal.classList.contains('is-open')) {
586      closeSearchModal();
587    }
588  }); 
589
590/* History timeline scroll interactions */
591document.addEventListener('DOMContentLoaded', () => {
592  const timeline = document.querySelector('.history-timeline');
593  const historyItems = gsap.utils.toArray('.history-timeline__item');
594  const navLinks = gsap.utils.toArray('.history-nav__link');
595
596  if (!timeline || !historyItems.length) {
597    return;
598  }
599
600  const linkById = new Map();
601  navLinks.forEach((link) => {
602    const target = link.getAttribute('href');
603    if (target && target.startsWith('#')) {
604      linkById.set(target.slice(1), link);
605    }
606  });
607
608  const setActiveNav = (id) => {
609    const activeLink = linkById.get(id);
610    navLinks.forEach((link) => {
611      const isActive = link === activeLink;
612      link.classList.toggle('is-active', isActive);
613      link.setAttribute('aria-current', isActive ? 'true' : 'false');
614    });
615  };
616
617  const getContentShift = (element) => {
618    const shift = window.getComputedStyle(element).getPropertyValue('--history-content-shift').trim();
619    return shift || '0px';
620  };
621
622  const getFixedHeaderOffset = () => {
623    const utilityNav = document.querySelector('.utility-nav');
624    const mainNav = document.querySelector('.navbar');
625    const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0;
626    const mainHeight = mainNav ? mainNav.offsetHeight : 0;
627    return utilityHeight + mainHeight;
628  };
629
630  const getActivationLine = () => {
631    const headerOffset = getFixedHeaderOffset();
632    const viewportTarget = window.innerHeight * 0.32;
633    const minLine = headerOffset + 24;
634    const maxLine = window.innerHeight - 140;
635    return Math.min(Math.max(minLine, viewportTarget), maxLine);
636  };
637
638  navLinks.forEach((link) => {
639    link.addEventListener('click', (event) => {
640      const targetId = link.getAttribute('href');
641      const target = targetId ? document.querySelector(targetId) : null;
642
643      if (target) {
644        event.preventDefault();
645        const offset = getActivationLine();
646        const y = target.getBoundingClientRect().top + window.pageYOffset - offset;
647        window.scrollTo({ top: y, behavior: 'smooth' });
648      }
649    });
650  });
651
652  historyItems.forEach((item, index) => {
653    const media = item.querySelector('.history-timeline__media');
654    const content = item.querySelector('.history-timeline__content');
655    const offsetY = index % 2 === 0 ? -80 : 80;
656    const contentShift = content ? getContentShift(content) : '0px';
657
658    gsap.set(media, { autoAlpha: 0, y: offsetY, scale: 0.9 });
659    gsap.set(content, { autoAlpha: 0, y: offsetY * 0.7, scale: 0.97, x: contentShift });
660
661    gsap.timeline({
662      scrollTrigger: {
663        trigger: item,
664        start: 'top 60%',
665        end: 'bottom 60%',
666        toggleActions: 'play none none reverse',
667        /* markers: true */
668      }
669    })
670    .to(media, { autoAlpha: 1, y: 0, scale: 1, duration: 0.9, ease: 'power2.out' })
671    .to(content, { autoAlpha: 1, y: 0, scale: 1, x: contentShift, duration: 0.85, ease: 'power2.out' }, '-=0.45');
672
673    ScrollTrigger.create({
674      trigger: item,
675      start: () => `top ${getActivationLine()}px`,
676      end: () => `bottom ${getActivationLine()}px`,
677      onEnter: () => item.id && setActiveNav(item.id),
678      onEnterBack: () => item.id && setActiveNav(item.id),
679      onLeave: (self) => {
680        if (self.direction === 1 && item === historyItems[historyItems.length - 1] && item.id) {
681          setActiveNav(item.id);
682        }
683      },
684      onLeaveBack: (self) => {
685        if (self.direction === -1 && item === historyItems[0] && item.id) {
686          setActiveNav(item.id);
687        }
688      }
689    });
690  });
691
692  if (historyItems[0] && historyItems[0].id) {
693    setActiveNav(historyItems[0].id);
694  }
695
696  const syncContentShifts = () => {
697    historyItems.forEach((item) => {
698      const content = item.querySelector('.history-timeline__content');
699      if (!content) return;
700      const contentShift = getContentShift(content);
701      gsap.set(content, { x: contentShift });
702    });
703  };
704
705  let resizeTimeout;
706  window.addEventListener('resize', () => {
707    window.clearTimeout(resizeTimeout);
708    resizeTimeout = window.setTimeout(() => {
709      syncContentShifts();
710      ScrollTrigger.refresh();
711    }, 150);
712  });
713});
714
715/******** SIDEBAR MEMBER NAV *************/
716
717document.addEventListener('DOMContentLoaded', function() {
718  const sidebarNav = document.querySelector('.sidebar-nav');
719  if (!sidebarNav) {
720    return;
721  }
722
723  function getFixedHeaderOffset() {
724    const utilityNav = document.querySelector('.utility-nav');
725    const mainNav = document.querySelector('.navbar');
726    const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0;
727    const mainHeight = mainNav ? mainNav.offsetHeight : 0;
728    return utilityHeight + mainHeight + 12;
729  }
730
731  function updateSidebarToggle(section) {
732    if (!section) {
733      return;
734    }
735
736    const toggle = section.querySelector('.sidebar-nav-toggle');
737    if (toggle) {
738      const expanded = section.classList.contains('is-expanded');
739      toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false');
740    }
741  }
742
743  const sections = sidebarNav.querySelectorAll('.sidebar-nav-section');
744  sections.forEach(section => {
745    const sectionToggle = section.querySelector('.sidebar-nav-toggle');
746    if (sectionToggle) {
747      sectionToggle.addEventListener('click', function(e) {
748        e.preventDefault();
749        e.stopPropagation();
750        section.classList.toggle('is-expanded');
751        updateSidebarToggle(section);
752      });
753      updateSidebarToggle(section);
754    } else {
755      section.classList.add('is-expanded');
756    }
757  });
758
759  sidebarNav.querySelectorAll('a[href^="#"]').forEach(anchor => {
760    anchor.addEventListener('click', function(e) {
761      const href = this.getAttribute('href');
762      if (href !== '#' && href.length > 1) {
763        const target = document.querySelector(href);
764        if (target) {
765          e.preventDefault();
766          const targetTop = target.getBoundingClientRect().top + window.scrollY;
767          const offsetTop = Math.max(0, targetTop - getFixedHeaderOffset());
768          window.scrollTo({
769            top: offsetTop,
770            behavior: 'smooth'
771          });
772        }
773      }
774    });
775  });
776});
777
778/***** DRAWER COMPONENT *****/
779function toggleDrawer(drawerContent, caret, toggleButton) {
780    if (drawerContent.style.maxHeight === "0px" || drawerContent.style.maxHeight === "") {
781        drawerContent.style.maxHeight = drawerContent.scrollHeight + "px";
782        caret.classList.add("rotated");
783        toggleButton.setAttribute("aria-expanded", "true");
784    } else {
785        drawerContent.style.maxHeight = "0px";
786        caret.classList.remove("rotated");
787        toggleButton.setAttribute("aria-expanded", "false");
788    }
789}
790
791// Get all toggle buttons and their corresponding drawer contents
792const toggleButtons = document.querySelectorAll('.toggleDrawer');
793toggleButtons.forEach(toggleButton => {
794    toggleButton.addEventListener('click', function(event) {
795        event.preventDefault();
796        let drawerContent = this.nextElementSibling;
797        let caret = this.querySelector('.caret');
798        toggleDrawer(drawerContent, caret, this);
799    });
800});
801
802document.querySelectorAll('a[href*="iuoe-store"]').forEach(function(link) {
803    link.setAttribute('target', '_blank');
804    link.setAttribute('rel', 'noopener noreferrer');
805});
806
807
808 // Swiper Instances
809    const showcaseSlider = new Swiper(".home-showcaseSlider", {
810      lazy: true,
811      speed: 1000,
812      slidesPerView: 1,
813      parallax: true,
814      loop: true,
815      autoplay: {
816        delay: 4000,
817        disableOnInteraction: false,
818      },
819      pagination: {
820        el: ".showcaseSlider-pagination",
821        clickable: true,
822      },
823      navigation: {
824        nextEl: ".showcaseSlider-next",
825        prevEl: ".showcaseSlider-prev",
826      },
827    });
828
829    const portraitCarousel = new Swiper(".portrait-card-grid", {
830      speed: 650,
831      spaceBetween: 18,
832      slidesPerView: 1.1,
833      grabCursor: true,
834      keyboard: { enabled: true },
835      navigation: {
836        nextEl: ".portrait-next",
837        prevEl: ".portrait-prev",
838      },
839      breakpoints: {
840        600: { slidesPerView: 1.2 },
841        900: { slidesPerView: 3 },
842        1280: { slidesPerView: 4.2 },
843        1440: { slidesPerView: 4.2 },
844      }
845    });
846
847    const newsCarousel = new Swiper(".news-grid", {
848      speed: 650,
849      spaceBetween: 18,
850      slidesPerView: 1.1,
851      grabCursor: true,
852      keyboard: { enabled: true },
853      navigation: {
854        nextEl: ".news-next",
855        prevEl: ".news-prev",
856      },
857      breakpoints: {
858        600: { slidesPerView: 1.2 },
859        900: { slidesPerView: 3 },
860        1280: { slidesPerView: 3.2 }
861      }
862    });
863
864    var tradesSwiper = new Swiper(".trades-swiper", {
865      lazy: true,
866      spaceBetween: 5,
867      slidesPerView: 2.2,
868      loop: true,
869      autoplay: {
870        delay: 2500,
871        disableOnInteraction: false,
872      },
873      breakpoints: {
874        900: { slidesPerView: 3}
875      }
876    });
877    const swiper2 = new Swiper(".mySwiper2", {
878      slidesPerView: 1.3,
879      spaceBetween: 15,
880      loop: true,
881      grabCursor: true,
882      freeMode: true,
883      breakpoints: {
884        768: { slidesPerView: 2 },
885        1024: { slidesPerView: 4 },
886      } ,
887      navigation: {
888            nextEl: ".swiper-button-next",
889            prevEl: ".swiper-button-prev",
890        }
891      /* pagination: {
892        el: ".swiper-pagination",
893        clickable: true
894      } */
895    });

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.