PageSourceSearch

https://www.wofford.edu/Content/js/index.js

js wofford.edu collected 2026-09-24 09:07:55 UTC 10,792 bytes, 301 lines download raw bytes

1document.addEventListener('DOMContentLoaded', () => {
2    // Media is video
3    const videoExists = document.querySelector('.home-media-item')
4    const pageContent = document.querySelector('#page-content')
5
6    if (videoExists?.tagName === 'VIDEO') {
7        document.querySelector('#header').classList.add('has-video')
8        videoExists.addEventListener('click', (e) => {
9            if (!videoExists.controls) {
10                if (videoExists.paused) {
11                    videoExists.play()
12                } else {
13                    videoExists.pause()
14                }
15            }
16        })
17    }
18
19    if (pageContent) {
20        if (pageContent.querySelector('.home-section-cta')) {
21            pageContent.style.backgroundColor = '#282829'
22        }
23    }
24
25    // Modal
26    const modalEls = Array.from(document.querySelectorAll('[data-modal]'))
27    const openModalBtns = Array.from(document.querySelectorAll('[data-modal-open]'))
28    const closeModalBtns = Array.from(document.querySelectorAll('[data-modal-close]'))
29
30    // Tab
31    const tabContainers = Array.from(document.querySelectorAll('[data-tab]'))
32
33    // Search input
34    const searchInput = document.querySelector('#search-input')
35    const searchIconClearBtn = document.querySelector('#search-icon-clear')
36
37    // Mobile menu
38    const homeMobileToggleMenu = document.querySelector('#home-mobile-toggle-menu')
39    const homeNavMenu = document.querySelector('#home-nav-menu')
40    const homeNavItems = Array.from(document.querySelectorAll('.home-nav-item'))
41
42    // News story images
43    const newsStoriesContainer = document.querySelector('.news-stories')
44    const newsStories = Array.from(document.querySelectorAll('.news-story'))
45    const prevButton = document.querySelector('.prev-arrow')
46    const nextButton = document.querySelector('.next-arrow')
47
48    // Drawer
49    const drawerItems = Array.from(document.querySelectorAll('.drawer-nav-item'))
50
51    // Fast facts
52    const fastFactsSlider = document.querySelector('.fast-facts-slider')
53    const fastFactsPrevBtn = document.querySelector('.fast-facts-slider .prev-slide')
54    const fastFactsNextBtn = document.querySelector('.fast-facts-slider .next-slide')
55
56    // FAQs
57    const faqs = Array.from(document.querySelectorAll('[data-faq]'))
58
59    // Window size
60    let screenSize
61
62    const getScreenSize = () => {
63        screenSize = window.innerWidth
64
65        if (screenSize > 860) {
66            homeMobileToggleMenu.classList.remove('open')
67            homeNavMenu.classList.remove('show')
68        }
69    }
70
71    window.addEventListener('load', getScreenSize)
72    window.addEventListener('resize', getScreenSize)
73
74    // Modal
75    openModalBtns.map((button) => {
76        button.addEventListener('click', () => {
77            if (button.nextElementSibling.matches('[data-modal]')) {
78                document.body.classList.add('modal-open')
79                button.nextElementSibling.classList.toggle('open')
80            }
81        })
82    })
83
84    closeModalBtns.map((button) => {
85        button.addEventListener('click', () => {
86            document.body.classList.remove('modal-open')
87            button.closest('[data-modal]').classList.remove('open')
88            button.closest('.home-nav-item').classList.remove('active')
89        })
90    })
91
92    modalEls.map((modal) => {
93        modal.addEventListener('click', (e) => {
94            if (e.target === modal) {
95                document.body.classList.remove('modal-open')
96                modal.classList.remove('open')
97                modal.closest('.home-nav-item').classList.remove('active')
98            }
99        })
100    })
101
102    // Tabs
103    tabContainers.map((tabs) => {
104        const tabBtns = Array.from(tabs.querySelectorAll('[data-tab-button]'))
105        const tabEls = Array.from(tabs.querySelectorAll('[data-tab-content]'))
106
107        document.addEventListener('DOMContentLoaded', () => {
108            tabBtnActive = tabs.querySelector('[data-tab-button="1"]')
109            tabContentActive = tabs.querySelector('[data-tab-content="1"]')
110
111            tabBtnActive.classList.add('active')
112            tabContentActive.classList.add('show')
113        })
114
115        tabBtns.map((button) => {
116            button.addEventListener('click', (e) => {
117                if (screenSize > 860) {
118                    if (button.classList.contains('active')) return
119
120                    e.preventDefault()
121
122                    const tabNumber = button.dataset.tabButton
123                    const tabContent = tabs.querySelector(`[data-tab-content="${tabNumber}"]`)
124
125                    const prevActiveBtn = tabBtns.filter((btn) => {
126                        return btn.classList.contains('active')
127                    })
128
129                    if (prevActiveBtn.length > 0 && prevActiveBtn[0] !== button) {
130                        prevActiveBtn[0].classList.remove('active')
131                    }
132
133                    const prevActiveTab = tabEls.filter((tab) => {
134                        return tab.classList.contains('show')
135                    })
136
137                    if (prevActiveTab.length > 0) {
138                        prevActiveTab[0].classList.remove('show')
139                    }
140
141                    button.classList.add('active')
142                    tabContent.classList.add('show')
143                }
144            })
145        })
146    })
147
148    // Search input
149    searchIconClearBtn.addEventListener('click', () => {
150        searchInput.value = ''
151    })
152
153    // Mobile menu
154    homeMobileToggleMenu.addEventListener('click', () => {
155        document.body.classList.toggle('modal-open')
156        homeMobileToggleMenu.classList.toggle('open')
157        homeNavMenu.classList.toggle('show')
158    })
159
160    // Toggle navbar item menus
161    homeNavItems.map((item) => {
162        item.addEventListener('click', (e) => {
163            const prevActiveItem = homeNavItems.filter((i) => {
164                return i.classList.contains('active')
165            })
166
167            if (prevActiveItem.length > 0) {
168                prevActiveItem.map((prevItem) => {
169                    if (prevItem !== item) {
170                        prevItem.classList.remove('active')
171                        prevItem.querySelector('[data-modal]').classList.remove('open')
172                    }
173                })
174            }
175
176            if (e.target === item.children[0] && item.children[0].hasAttribute('data-modal-open')) {
177                item.classList.toggle('active')
178            }
179
180            homeNavMenu.scrollTo({ top: item.offsetTop - 30, behavior: 'smooth' })
181        })
182    })
183
184    // News story images
185    if (Array.isArray(newsStories) && !!newsStories.length) {
186        let story = newsStories.map((story) => story)
187
188        const prevStory = () => {
189            const [prev, main, next] = story
190            story = [next, prev, main]
191
192            newsStoriesContainer.append(...story)
193
194            next.classList.replace('next', 'prev')
195            prev.classList.replace('prev', 'current')
196            main.classList.replace('current', 'next')
197        }
198
199        const nextStory = () => {
200            const [prev, main, next] = story
201            story = [main, next, prev]
202
203            newsStoriesContainer.append(...story)
204
205            next.classList.replace('next', 'current')
206            prev.classList.replace('prev', 'next')
207            main.classList.replace('current', 'prev')
208        }
209
210        prevButton.addEventListener('click', prevStory)
211        nextButton.addEventListener('click', nextStory)
212    }
213
214    // Drawer
215    if (Array.isArray(drawerItems) && !!drawerItems.length) {
216        drawerItems?.map((item, i) => {
217            item.addEventListener('click', (e) => {
218                const drawerContainer = item.querySelector('.drawer-container')
219
220                if (drawerContainer.clientHeight > 0) return
221
222                e.preventDefault()
223            })
224        })
225    }
226
227    // Fast facts
228    if (fastFactsSlider) {
229        const rotateSlides = (direction) => {
230            const timer = 500
231            const slides = fastFactsSlider.querySelectorAll('.fact-slide')
232
233            const slideIndex = direction == 'prev' ? slides.length - 1 : 0
234            const currentSlide = slides[slideIndex]
235
236            const slide = currentSlide.cloneNode(true)
237
238            if (direction === 'prev') {
239                fastFactsSlider.prepend(slide)
240            } else {
241                fastFactsSlider.append(slide)
242            }
243
244            const slideWidth = currentSlide.offsetWidth
245            currentSlide.remove()
246
247            const updatedSlides = fastFactsSlider.querySelectorAll('.fact-slide')
248
249            updatedSlides.forEach((item, i) => {
250                item.animate([{ transform: `translateX(${direction === 'prev' ? '-' : ''}${slideWidth}px)` }, { transform: 'translateX(0)' }], {
251                    duration: timer,
252                    easing: 'ease-in-out',
253                })
254            })
255        }
256
257        if (fastFactsPrevBtn) {
258            fastFactsPrevBtn.addEventListener('click', (e) => rotateSlides('prev'))
259        }
260
261        if (fastFactsNextBtn) {
262            fastFactsNextBtn.addEventListener('click', (e) => rotateSlides('next'))
263        }
264    }
265
266    // FAQs
267    if (Array.isArray(faqs) && !!faqs.length) {
268        faqs.map((faq) => {
269            const faqBtns = Array.from(faq.querySelectorAll('[data-faq-button]'))
270            const faqEls = Array.from(faq.querySelectorAll('[data-faq-content]'))
271
272            faqBtns.map((button) => {
273                button.addEventListener('click', (e) => {
274                    const faqNumber = button.dataset.faqButton
275                    const faqContent = faq.querySelector(`[data-faq-content="${faqNumber}"]`)
276
277                    const prevActiveBtn = faqBtns.filter((btn) => {
278                        return btn.classList.contains('active')
279                    })
280
281                    if (prevActiveBtn.length > 0) {
282                        prevActiveBtn[0].classList.remove('active')
283                    }
284
285                    const prevActiveFaq = faqEls.filter((faq) => {
286                        return faq.classList.contains('show')
287                    })
288
289                    if (prevActiveFaq.length > 0) {
290                        prevActiveFaq[0].classList.remove('show')
291                    }
292
293                    if (prevActiveBtn[0] !== button) {
294                        button.classList.add('active')
295                        faqContent.classList.add('show')
296                    }
297                })
298            })
299        })
300    }
301})

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.