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.