PageSourceSearch

https://www.usa.edu/wp-content/plugins/usahs-deadlines/assets/frontend.js?ver=1790029357

js usa.edu collected 2026-09-24 08:42:00 UTC 8,175 bytes, 274 lines download raw bytes

1(function () {
2	'use strict';
3
4	var STATE_CLASSES = [
5		'usahs-deadline-card--priority',
6		'usahs-deadline-card--extended',
7		'usahs-deadline-card--still_accepting'
8	];
9	var MOBILE_BREAKPOINT_QUERY = '(max-width: 640px)';
10
11	function isMobileViewport() {
12		if (typeof window.matchMedia === 'function') {
13			return window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches;
14		}
15		return window.innerWidth <= 640;
16	}
17
18	function applyMobileRailShift(cardEl, mode) {
19		var railEl = cardEl.querySelector('.usahs-deadline-card__term-rail');
20		if (!railEl) {
21			return;
22		}
23
24		var termEls = Array.prototype.slice.call(railEl.querySelectorAll('[data-deadline-term]'));
25		if (!termEls.length) {
26			return;
27		}
28
29		termEls.forEach(function (el) {
30			el.style.transform = '';
31		});
32
33		if (!isMobileViewport() || termEls.length < 4) {
34			railEl.scrollLeft = 0;
35			cardEl.removeAttribute('data-mobile-rail-shift');
36			return;
37		}
38
39		var shiftMode = mode === 'end' ? 'end' : 'start';
40		var targetLeft = shiftMode === 'end'
41			? Math.max(railEl.scrollWidth - railEl.clientWidth, 0)
42			: 0;
43
44		railEl.scrollTo({
45			left: targetLeft,
46			behavior: 'smooth'
47		});
48
49		cardEl.setAttribute('data-mobile-rail-shift', shiftMode);
50	}
51
52	function syncMobileRailForTerm(cardEl, termEl) {
53		var terms = Array.prototype.slice.call(cardEl.querySelectorAll('[data-deadline-term]'));
54		if (terms.length < 4) {
55			applyMobileRailShift(cardEl, 'start');
56			return;
57		}
58
59		var activeIndex = terms.indexOf(termEl);
60		var currentMode = cardEl.getAttribute('data-mobile-rail-shift') || 'start';
61
62		if (activeIndex === 0) {
63			applyMobileRailShift(cardEl, 'start');
64			return;
65		}
66
67		if (activeIndex === terms.length - 1) {
68			applyMobileRailShift(cardEl, 'end');
69			return;
70		}
71
72		applyMobileRailShift(cardEl, currentMode);
73	}
74
75	function syncAllCardsMobileRails() {
76		document.querySelectorAll('[data-deadline-card]').forEach(function (cardEl) {
77			var activeTerm = cardEl.querySelector('[data-deadline-term].is-active') || cardEl.querySelector('[data-deadline-term]');
78			if (!activeTerm) {
79				return;
80			}
81			syncMobileRailForTerm(cardEl, activeTerm);
82		});
83	}
84
85	function getStateIntroFallback(state) {
86		if (state === 'priority') {
87			return 'Priority deadline: apply by this date to receive an earlier admission decision.';
88		}
89		if (state === 'extended') {
90			return 'Extended deadline: applications are still being accepted while space remains.';
91		}
92		if (state === 'still_accepting') {
93			return 'There is still time to apply. Submit your application and take the next step toward your career.';
94		}
95		return '';
96	}
97
98	function getTodayYmd() {
99		var now = new Date();
100		var year = now.getFullYear();
101		var month = String(now.getMonth() + 1).padStart(2, '0');
102		var day = String(now.getDate()).padStart(2, '0');
103		return year + '-' + month + '-' + day;
104	}
105
106	function resolveStateFromDates(termEl) {
107		var today = getTodayYmd();
108		var priority = termEl.getAttribute('data-term-priority-deadline') || '';
109		var extended = termEl.getAttribute('data-term-extended-deadline') || '';
110		var termStart = termEl.getAttribute('data-term-start-date') || '';
111
112		if (priority && today <= priority) {
113			return 'priority';
114		}
115		if (extended && today <= extended) {
116			return 'extended';
117		}
118		if (termStart && today < termStart) {
119			return 'still_accepting';
120		}
121
122		return '';
123	}
124
125	function resolveTermState(termEl, label, value) {
126		var fromDates = resolveStateFromDates(termEl);
127		if (fromDates) {
128			return fromDates;
129		}
130
131		var fromAttr = termEl.getAttribute('data-term-state') || termEl.getAttribute('data-deadline-state') || '';
132		if (fromAttr) {
133			return fromAttr;
134		}
135
136		var labelLower = (label || '').toLowerCase();
137		var valueLower = (value || '').toLowerCase();
138		if (valueLower.indexOf('still accepting') !== -1 || labelLower.indexOf('apply now') !== -1) {
139			return 'still_accepting';
140		}
141		if (labelLower.indexOf('apply by') !== -1) {
142			return 'priority';
143		}
144
145		return 'still_accepting';
146	}
147
148	function activateTerm(cardEl, termEl) {
149		var labelEl = cardEl.querySelector('[data-deadline-current-label]') || cardEl.querySelector('[data-deadline-label]');
150		var valueEl = cardEl.querySelector('[data-deadline-current-value]') || cardEl.querySelector('[data-deadline-value]');
151		var termNameEl = cardEl.querySelector('[data-deadline-current-term-name]') || cardEl.querySelector('[data-deadline-term-name]');
152		var introEl = cardEl.querySelector('[data-deadline-current-intro]') || cardEl.querySelector('[data-deadline-intro]') || cardEl.querySelector('.usahs-deadline-card__intro');
153		var label = termEl.getAttribute('data-term-label') || termEl.getAttribute('data-deadline-label') || '';
154		var value = termEl.getAttribute('data-term-value') || termEl.getAttribute('data-deadline-value') || '';
155		var state = resolveTermState(termEl, label, value);
156		var termName = termEl.getAttribute('data-term-name') || termEl.getAttribute('data-deadline-term-name') || '';
157		var introFromData = termEl.getAttribute('data-term-intro') || termEl.getAttribute('data-deadline-intro') || '';
158		var intro = introFromData || getStateIntroFallback(state);
159
160		cardEl.querySelectorAll('[data-deadline-term]').forEach(function (el) {
161			el.classList.remove('is-active');
162			el.setAttribute('aria-pressed', 'false');
163		});
164
165		termEl.classList.add('is-active');
166		termEl.setAttribute('aria-pressed', 'true');
167
168		if (labelEl) {
169			labelEl.textContent = label;
170		}
171		if (valueEl) {
172			valueEl.textContent = value;
173		}
174		if (termNameEl) {
175			termNameEl.textContent = termName;
176		}
177		if (introEl) {
178			if (intro) {
179				introEl.innerHTML = intro;
180				introEl.hidden = false;
181			} else {
182				introEl.innerHTML = '';
183				introEl.hidden = true;
184			}
185		}
186
187		STATE_CLASSES.forEach(function (cls) {
188			cardEl.classList.remove(cls);
189		});
190		cardEl.classList.add('usahs-deadline-card--' + state);
191		syncMobileRailForTerm(cardEl, termEl);
192	}
193
194	function initDynamicTooltips() {
195		var portal = document.getElementById('hbg-global-tooltip');
196		if (!portal) {
197			portal = document.createElement('div');
198			portal.id = 'hbg-global-tooltip';
199			document.body.appendChild(portal);
200		}
201
202		document.querySelectorAll('[data-deadline-card] .hbg-tooltip').forEach(function (tooltip) {
203			tooltip.setAttribute('data-usahs-dl-tooltip-bound', 'true');
204		});
205
206		document.addEventListener('mouseover', function (event) {
207			var tooltip = event.target.closest('[data-deadline-card] .hbg-tooltip');
208			if (!tooltip || tooltip.getAttribute('data-usahs-dl-tooltip-bound')) {
209				return;
210			}
211			if (event.relatedTarget && tooltip.contains(event.relatedTarget)) {
212				return;
213			}
214
215			var content = tooltip.querySelector('.hbg-tooltip-text');
216			if (!content) {
217				return;
218			}
219
220			portal.innerHTML = content.innerHTML;
221			portal.style.display = 'block';
222			var rect = tooltip.getBoundingClientRect();
223			var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
224			var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
225			portal.style.top = (rect.bottom + scrollTop + 10) + 'px';
226			portal.style.left = (rect.left + scrollLeft + (rect.width / 2) - (portal.offsetWidth / 2)) + 'px';
227		});
228
229		document.addEventListener('mouseout', function (event) {
230			var tooltip = event.target.closest('[data-deadline-card] .hbg-tooltip');
231			if (!tooltip || tooltip.getAttribute('data-usahs-dl-tooltip-bound')) {
232				return;
233			}
234			if (event.relatedTarget && tooltip.contains(event.relatedTarget)) {
235				return;
236			}
237
238			portal.style.display = 'none';
239		});
240	}
241
242	function onActivate(event) {
243		var termEl = event.target.closest('[data-deadline-term]');
244		if (!termEl) {
245			return;
246		}
247
248		var cardEl = termEl.closest('[data-deadline-card]');
249		if (!cardEl) {
250			return;
251		}
252
253		activateTerm(cardEl, termEl);
254	}
255
256	document.addEventListener('click', onActivate);
257	document.addEventListener('keydown', function (event) {
258		if (event.key !== 'Enter' && event.key !== ' ') {
259			return;
260		}
261
262		var termEl = event.target.closest('[data-deadline-term]');
263		if (!termEl) {
264			return;
265		}
266
267		event.preventDefault();
268		onActivate(event);
269	});
270
271	initDynamicTooltips();
272	window.addEventListener('resize', syncAllCardsMobileRails);
273	syncAllCardsMobileRails();
274})();

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.