PageSourceSearch

https://watersportscamp.com/js/accordion.js

js watersportscamp.com collected 2026-10-04 03:31:04 UTC 2,826 bytes, 117 lines download raw bytes

1// JavaScript Document
2
3// Accordian Script 
4
5
6var acc = document.getElementsByClassName("accordion");
7var panel = document.getElementsByClassName('panel');
8var frame = document.getElementsByClassName('imgframe');
9
10
11for (var i = 0; i < acc.length; i++) {
12    acc[i].onclick = function() {
13        var setClasses = !this.classList.contains('active');
14        setClass(acc, 'active', 'remove');
15		setClass(panel, 'show', 'remove');
16		setClass(frame, 'hide', 'remove');
17
18
19        if (setClasses) {
20            this.classList.toggle("active");
21            this.nextElementSibling.classList.toggle("show");
22			this.firstChild.classList.toggle("hide");
23        }
24
25    }
26}
27
28function setClass(els, className, fnName) {
29    for (var i = 0; i < els.length; i++) {
30        els[i].classList[fnName](className);
31    }
32}
33
34
35
36
37function openAccordionFromHash() {
38  var hash = window.location.hash;
39  if (!hash) return;
40
41  // Prevent default hash jump
42  if ("scrollRestoration" in history) {
43    history.scrollRestoration = "manual";
44  }
45  window.scrollTo(0, 0);
46
47  var panel = document.querySelector(hash);
48  if (!panel) return;
49
50  var accordionBtn = panel.previousElementSibling;
51  if (!accordionBtn || !accordionBtn.classList.contains("accordion")) return;
52
53  // Open the accordion panel
54  accordionBtn.click();
55
56  var hasScrolled = false;
57
58  function scrollToPanel() {
59    if (hasScrolled) return;
60    hasScrolled = true;
61
62    var headerOffset = 100; // adjust if needed
63    var elementPosition = panel.getBoundingClientRect().top;
64    var offsetPosition =
65      elementPosition + window.pageYOffset - headerOffset;
66
67    window.scrollTo({
68      top: offsetPosition,
69      behavior: "smooth"
70    });
71  }
72
73  // Observe panel size changes during expansion
74  var observer = new ResizeObserver(() => {
75    scrollToPanel();
76  });
77
78  observer.observe(panel);
79
80  // Safety stop (matches typical accordion animation duration)
81  setTimeout(() => {
82    observer.disconnect();
83    scrollToPanel();
84  }, 400);
85}
86
87// Run AFTER full page load (images, fonts, layout)
88window.addEventListener("load", () => {
89  openAccordionFromHash();
90});
91
92
93// Handle same-page hash links (accordion-only)
94document.addEventListener("click", function (e) {
95  var link = e.target.closest('a[href^="#"]');
96  if (!link) return;
97
98  var hash = link.getAttribute("href");
99  if (!hash || hash === "#") return;
100
101  var target = document.querySelector(hash);
102  if (!target) return;
103
104  // Is this target part of an accordion?
105  var accordionBtn = target.previousElementSibling;
106  var isAccordion =
107    accordionBtn && accordionBtn.classList.contains("accordion");
108
109  // If NOT an accordion target, let the browser scroll normally
110  if (!isAccordion) return;
111
112  // Otherwise, handle it manually
113  e.preventDefault();
114
115  history.pushState(null, "", hash);
116  openAccordionFromHash();
117});

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.