1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<style> 5 .gam-sport-banner-ad iframe, 6 .gam-sport-banner-ad-2 iframe 7 { 8 width: 100%; 9 height: auto; 10 } 11 12 .prog-mobile-banners #gam-banner-ad, 13 .prog-mobile-banners #gam-banner-ad-2 14 { 15 min-height: 100px; 16 display: flex; 17 align-items: center; 18 justify-content: center; 19 } 20 21 /* Desktop presenting sponsor: cap at native 300x75. */ 22 .gam-presenting-sponsor-2, 23 .gam_ps { 24 max-width: 300px; 25 max-height: 75px; 26 margin: 0 auto; 27 overflow: hidden; 28 } 29 30 .gam-presenting-sponsor-2 iframe, 31 .gam_ps iframe { 32 width: 100%; 33 height: 100%; 34 } 35 36 /* Layout 19 desktop presenting sponsor. 37 The slot is defined as a fixed 300x75 (defineSlot below), so give the iframe its 38 full 300x75 viewport and paint it at 2/3 (200x50) with a transform â same pattern 39 as the mobile slot. The old width:200px!important squeezed the iframe VIEWPORT to 40 200 while the creative document inside stayed 300 wide, clipping the right third 41 of every creative ("Piedmont" -> "Piedm"). The container rules reserve the flex 42 slot so the priority nav measures correctly before the ad loads; GAM tracking is 43 unaffected (the creative loads at native size, it just paints smaller). */ 44 .presenting-sponsor-desktop-19 { 45 width: 212px; 46 min-width: 212px; 47 overflow: hidden; 48 } 49 .presenting-sponsor-desktop-19 .gam-presenting-sponsor-2 { 50 width: 200px; 51 height: 50px; 52 max-width: 200px; 53 max-height: 50px; 54 overflow: hidden; 55 position: relative; 56 } 57 .presenting-sponsor-desktop-19 .gam-presenting-sponsor-2 iframe { 58 width: 300px !important; 59 /* beat the generic img/iframe max-width:100% (would cap the viewport at the 60 200px container and clip the creative's right third) */ 61 max-width: none !important; 62 height: 75px !important; 63 transform: scale(0.6667); 64 transform-origin: top left; 65 border: 0; 66 } 67 68 /* AB-6152: Bootstrap-3 header menus (Style 4/8/9/15/17) render the desktop 69 sponsor inside .presenting-sponsor-mobile-menu, whose template LESS floats 70 #gam-presenting-sponsor-2 off-screen (margin:0 -200px auto; width:250px) â so 71 it's hidden until you scroll and can run off the side / drop below the nav. 72 This GAM <style> loads BEFORE template main.css, so a class rule can't beat the 73 LESS on source order; we beat it on SPECIFICITY by including the slot id 74 (.class #id = 1,1,0 > the LESS .a .b .c = 0,3,0). Pin the slot to the same 75 200x50 right-aligned, clipped box template 19 uses so it stays in the viewport, 76 in both the rest and .fixedbar states. Scoped to .presenting-sponsor-mobile-menu, 77 so template 19 (.presenting-sponsor-desktop-19) is untouched. */ 78 /* DIV wrapper = Style 15 family (the wrap is a div after the menu ul). 79 Absolute + translateY instead of float:right â the float top-aligned the 80 50px slot in the ~76px menu bar, so it rode visibly higher than the nav 81 links ("doesn't line up"). The nearest positioned ancestor is the header 82 .container (position:relative), which spans the bar's full height, so 83 top:50% centers the sponsor on the same line as the links in both the 84 resting and .fixedbar states. */ 85 div.presenting-sponsor-mobile-menu #gam-presenting-sponsor-2 { 86 position: absolute; 87 right: 15px; 88 top: 50%; 89 transform: translateY(-50%); 90 float: none; 91 width: 200px; 92 max-width: 200px; 93 height: 50px; 94 max-height: 50px; 95 margin: 0; 96 overflow: hidden; 97 } 98 /* AB-6152 follow-up (template 5 / Style 15 family): the absolute rule above only 99 holds if an ancestor of the slot is positioned, so right:15px/top:50% anchor to 100 the header .container. Template 5's main.less sets `.custom-nav .navbar 101 { position: inherit }`, which makes the navbar STATIC and removes BS3's default 102 position:relative â so in the resting (unscrolled) state NO ancestor is 103 positioned and the slot anchors to the viewport, dropping the sponsor on top of 104 the nav links. (Scrolled, the position:fixed .fixedbar became the containing 105 block and it looked fine â hence the intermittent behavior.) Re-establish the 106 containing block AB-6152 assumes, for both states. Scoped to .custom-nav so only 107 the Style 15 header family is affected; a no-op for the li-variant (Style 8/9), 108 whose slot is position:relative (in-flow), not absolute. */ 109 .custom-nav #nav-container { 110 position: relative; 111 } 112 /* AB-6152 follow-up #2 (Style-15 family, all-dropdown navs): when the greedy collapser 113 in topmenu2.js runs out of movable items â every remaining item is a .dropdown, which 114 it won't nest into MORE â but the nav still reaches the presenting sponsor, it tags the 115 header .nav-compact (then .nav-compact-2 if one tier isn't enough). That tightens the 116 nav just enough to clear the ad. Applied ONLY in that jammed case and cleared on resize, 117 so sparse navs keep their full padding and text size (and the larger-text preference). 118 Tier 1 trims horizontal padding only â text size is untouched; tier 2 is the last resort 119 and only then nudges letter-spacing. Loaded before template main.css, so we win on 120 specificity (id + 2 classes) + !important, same as the rules above. */ 121 .custom-nav.nav-compact #nav-links > li > a { 122 padding-left: 9px !important; 123 padding-right: 9px !important; 124 } 125 .custom-nav.nav-compact.nav-compact-2 #nav-links > li > a { 126 padding-left: 5px !important; 127 padding-right: 5px !important; 128 letter-spacing: -0.2px; 129 } 130 /* LI wrapper = Style 8/9 (the sponsor is an inline li in the greedy #nav-links). 131 Keep it in flow â the nav JS reserves its width; absolute would collapse the li. */ 132 li.presenting-sponsor-mobile-menu #gam-presenting-sponsor-2 { 133 float: right; 134 width: 200px; 135 max-width: 200px; 136 height: 50px; 137 max-height: 50px; 138 margin: 0; 139 overflow: hidden; 140 position: relative; 141 } 142 .presenting-sponsor-mobile-menu #gam-presenting-sponsor-2 iframe { 143 /* Full 300x75 viewport scaled to 200x50 â a 200px viewport clips the right 144 third of the 300-wide creative document (same bug as the t19 rule above). */ 145 width: 300px !important; 146 max-width: none !important; 147 height: 75px !important; 148 transform: scale(0.6667); 149 transform-origin: top left; 150 border: 0; 151 } 152 153 /* Mobile presenting sponsor: GAM serves a 300x75 creative, so visually 154 scale the whole iframe down to fit the header next to the logo + nav 155 + hamburger. The iframe still loads at native 300x75 so impressions, 156 click tracking, and viewability reporting fire correctly â it just 157 paints smaller. (Pattern ported from the State Association sites.) */ 158 #gam-presenting-sponsor-mobile { 159 width: 200px; 160 height: 50px; 161 overflow: hidden; 162 position: relative; 163 margin: 0; 164 } 165 #gam-presenting-sponsor-mobile iframe { 166 width: 300px !important; 167 max-width: none !important; 168 height: 75px !important; 169 transform: scale(0.6667); 170 transform-origin: top left; 171 border: 0; 172 } 173 @media (max-width: 380px) { 174 #gam-presenting-sponsor-mobile { 175 width: 160px; 176 height: 40px; 177 } 178 #gam-presenting-sponsor-mobile iframe { 179 transform: scale(0.5333); 180 } 181 } 182 183 /* Template 19 mobile: the sponsor has its own full-width row below the nav, 184 so don't clamp it to the inline box the other templates use. 185 Class+id specificity beats the bare #id rules above, including the 380px breakpoint. */ 186 .presenting-sponsor-mobile-19 #gam-presenting-sponsor-mobile { 187 width: auto; 188 max-width: 100%; 189 height: 64px; 190 } 191 192 /* ===== PRESENTING SPONSOR FOLLOWS EACH TEMPLATE'S NATIVE NAV ===== 193 No universal breakpoint. The desktop slot (.gam-presenting-sponsor-2) shows while 194 the header is in desktop mode and the mobile slot (#gam-presenting-sponsor-mobile) 195 shows once it collapses â exactly the Bootstrap visibility classes each header 196 already carries (BS3: hidden-sm hidden-xs / hidden-md hidden-lg; BS4/5: d-none 197 d-md-block / d-block d-md-none). The JS below fills whichever slot the CSS shows, 198 so per-template breakpoints are honored automatically. For the greedy "MORE" nav 199 (Style 8/9/15) the desktop sponsor is an inline <li>; nudgeGreedyNav() re-runs 200 AdjustNav() after the GAM creative paints so the nav reserves the ad's real width 201 and pushes overflow links into MORE instead of wrapping the sponsor below the nav. 202 (An earlier "force mobile sponsor at <=992 everywhere" rule lived here; it was
203 reverted because it misplaced the mobile slot on desktop-nav templates.) */ 204 205</style> 206 207 208 209
209<script src="https://adklip.net/prebid/mascotmedia.js"></script>
209 210
210<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
210 211
211<script> 212 window.googletag = window.googletag || { cmd: [] }; 213 214 function isMobile() { 215 return window.innerWidth <= 768; 216 } 217 218 // The greedy "MORE" nav (topmenu.js, Header Style 8/9/15) lays out BEFORE the GAM 219 // presenting-sponsor iframe paints, so it never reserves the ad's width and the 220 // sponsor wraps to a line below the nav. Re-running AdjustNav() once the creative is 221 // sized makes the nav recount the sponsor <li> and tuck overflow links into MORE, 222 // keeping the sponsor inline. No-op on templates without the greedy nav (AdjustNav 223 // is undefined there), so it's safe to call unconditionally. 224 function nudgeGreedyNav() { 225 if (typeof AdjustNav === 'function') { 226 try { AdjustNav(); } catch (e) { /* greedy nav not present on this template */ } 227 } 228 } 229 230 googletag.cmd.push(function () { 231 var isMobileDevice = isMobile(); 232 var REFRESH_KEY = 'refresh'; 233 var REFRESH_VALUE = 'true'; 234 235 // NEW: programmatic flag + refresh timing 236 var useProgrammaticAds = true; 237 // 30s is Google's minimum refresh interval for any slot AdX can fill do not lower 238 var REFRESH_MS = 30000; 239 240 // NEW: add a body class only when programmatic + mobile (for stable layout) 241 if (useProgrammaticAds && isMobileDevice) { 242 document.body.classList.add('prog-mobile-banners'); 243 } 244 245 // ------- PRESENTING SPONSOR------- 246 // Define BOTH slots unconditionally. Defining a slot does NOT request an ad 247 // (only display()/refresh() does), and the responsive-fill block below 248 // displays exactly ONE at a time â so this adds no load-time impressions. 249 // The old isMobileDevice (innerWidth<=768) branch defined only one slot for 250 // the page's life; combined with CSS that switches the sponsor container at 251 // 992px, that stranded 769-991px on a visible-but-empty slot (the tablet dead 252 // zone). We now align the fill to the 992 CSS boundary (see below). 253 var sponsorSlotsById = {}; 254 sponsorSlotsById['gam-presenting-sponsor-mobile'] = googletag.defineSlot('/22870419559/headerwebmobile', [[300, 75]], 'gam-presenting-sponsor-mobile') 255 .setTargeting(REFRESH_KEY, REFRESH_VALUE) 256 .addService(googletag.pubads()); 257 sponsorSlotsById['gam-presenting-sponsor-2'] = googletag.defineSlot('/22870419559/headerwebdesktop', [[300, 75]], 'gam-presenting-sponsor-2') 258 .setTargeting(REFRESH_KEY, REFRESH_VALUE) 259 .addService(googletag.pubads()); 260 261 // Build base arrays of allowed sizes 262 var desktopTabletProgrammatic = [[640, 100], [728, 90]]; 263 var mobileProgrammatic = [[320, 50]]; // << mobile = 320x50 ONLY 264 var desktopTabletDefault = [[640, 100]]; 265 var mobileDefault = [[640, 100]]; 266 267 var allProgrammaticSizes = [[640, 100], [728, 90], [320, 50]]; 268 var allDefaultSizes = [[640, 100]]; 269 270 var bannerMapping = googletag.sizeMapping() 271 .addSize([1024, 0], useProgrammaticAds ? desktopTabletProgrammatic : desktopTabletDefault) // desktop 272 .addSize([768, 0], useProgrammaticAds ? desktopTabletProgrammatic : desktopTabletDefault) // tablet 273 .addSize([0, 0], useProgrammaticAds ? mobileProgrammatic : mobileDefault) // phones 274 .build(); 275 276 googletag.defineSlot( 277 '/22870419559/bannerweb', 278 useProgrammaticAds ? allProgrammaticSizes : allDefaultSizes, 279 'gam-banner-ad' 280 ) 281 .defineSizeMapping(bannerMapping) 282 .setTargeting(REFRESH_KEY, REFRESH_VALUE) 283 .addService(googletag.pubads()); 284 285 googletag.defineSlot( 286 '/22870419559/bannerweb', 287 useProgrammaticAds ? allProgrammaticSizes : allDefaultSizes, 288 'gam-banner-ad-2' 289 ) 290 .defineSizeMapping(bannerMapping) 291 .setTargeting(REFRESH_KEY, REFRESH_VALUE) 292 .addService(googletag.pubads()); 293 294 googletag.defineSlot('/22870419559/agent', [[300, 75]], 'gam-agent-ad') 295 .setTargeting(REFRESH_KEY, REFRESH_VALUE) 296 .addService(googletag.pubads()); 297 298 googletag.pubads().setTargeting('siteid', '2555757'); 299 googletag.pubads().setTargeting('isschoolpay', '0'); 300 301 googletag.pubads().addEventListener('impressionViewable', function (event) { 302 var slot = event.slot; 303 if (slot.getTargeting(REFRESH_KEY).indexOf(REFRESH_VALUE) > -1) { 304 setTimeout(function () { 305 googletag.pubads().refresh([slot]); 306 }, REFRESH_MS); 307 } 308 }); 309 310 googletag.enableServices(); 311 312 // ------- PRESENTING SPONSOR: responsive fill (AB-6152 follow-up) ------- 313 // The desktop/mobile split is owned entirely by each header's NATIVE Bootstrap 314 // visibility classes (no universal @media here anymore). We fill whichever slot 315 // the CSS currently shows, and re-fill on resize so a breakpoint cross is never 316 // stranded on an empty slot. Only ONE slot is displayed at a time, so load-time 317 // impression volume is unchanged â the filled slot is always the VISIBLE (and 318 // viewable) one. For the greedy "MORE" nav the desktop sponsor is an inline <li>; 319 // nudgeGreedyNav() (called after the creative paints) re-runs AdjustNav so the nav 320 // reserves the ad's width and keeps it inline instead of wrapping it below. 321 (function () { 322 var sponsorDisplayed = { 'gam-presenting-sponsor-2': false, 'gam-presenting-sponsor-mobile': false }; 323 // Is the element actually rendered (not display:none on it or any ancestor)? 324 function isShown(el) { return !!(el && (el.offsetParent !== null || el.getClientRects().length)); } 325 // Fill whichever slot the CSS currently shows. The desktop/mobile split is owned 326 // entirely by the header CSS (the @media block above sets <=992 -> mobile on the 327 // standard menus; layout 19 keeps its reserved desktop slot, etc.), so the JS just 328 // follows it â no width is hard-coded here, and template-specific breakpoints 329 // (e.g. 19's reserved slot) are honored automatically. Fall back to a 993 width 330 // split only if neither container has been laid out yet. 331 function activeSponsorId() { 332 var d = document.getElementById('gam-presenting-sponsor-2'); 333 var m = document.getElementById('gam-presenting-sponsor-mobile'); 334 if (isShown(d)) return 'gam-presenting-sponsor-2'; 335 if (isShown(m)) return 'gam-presenting-sponsor-mobile'; 336 if (!d && !m) return null; 337 return window.innerWidth >= 993 ? 'gam-presenting-sponsor-2' : 'gam-presenting-sponsor-mobile'; 338 } 339 function fillActiveSponsor() { 340 var id = activeSponsorId(); 341 if (!id || !document.getElementById(id)) return; // this template doesn't render that slot 342 var slot = sponsorSlotsById[id]; 343 if (!slot) return; 344 if (!sponsorDisplayed[id]) { 345 googletag.display(id); 346 sponsorDisplayed[id] = true; 347 } else { 348 googletag.pubads().refresh([slot]); // already shown once -> re-serve on return 349 } 350 } 351 function whenReady(fn) { 352 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', fn); 353 else fn(); 354 } 355 whenReady(fillActiveSponsor); 356 // Re-fill the now-visible slot after a resize crosses any template's CSS breakpoint. 357 var resizeTimer; 358 window.addEventListener('resize', function () { 359 clearTimeout(resizeTimer); 360 resizeTimer = setTimeout(fillActiveSponsor, 200);
361 }); 362 })(); 363 364 // Add event listeners for responsive image handling 365 document.addEventListener('DOMContentLoaded', function () { 366 handleResponsiveImages(); 367 368 // Add debounced resize handler 369 var resizeTimeout = null; 370 window.addEventListener('resize', function () { 371 if (resizeTimeout) { 372 clearTimeout(resizeTimeout); 373 } 374 375 resizeTimeout = setTimeout(function () { 376 handleResponsiveImages(); 377 }, 250); 378 }); 379 }); 380 381 // Add slotRenderEnded event to handle styling right after ads render 382 googletag.pubads().addEventListener('slotRenderEnded', function (event) { 383 // Give a small delay to ensure content is available 384 setTimeout(function () { 385 var id = event.slot.getSlotElementId(); 386 var container = document.getElementById(id); 387 if (container) { 388 var iframes = container.querySelectorAll('iframe[id^="google_ads_iframe"]'); 389 iframes.forEach(applyResponsiveStyles); 390 } 391 if (id === 'gam-presenting-sponsor-2') { 392 // Belt-and-suspenders for the greedy nav: re-run after the creative has 393 // settled, covering the cross-origin safe-frame path where 394 // fitPresentingSponsor (and thus its inline nudge) can't measure the ad. 395 setTimeout(nudgeGreedyNav, 250); 396 } 397 }, 50); 398 }); 399 400 // Function to handle responsive images 401 function handleResponsiveImages() { 402 ['gam-banner-ad', 'gam-banner-ad-2', 'gam-sport-banner-ad', 'gam-sport-banner-ad-2', 'gam-presenting-sponsor-2', 'gam-presenting-sponsor-mobile'].forEach(adId => { 403 var adContainer = document.querySelector(`#${adId}`); 404 if (adContainer) { 405 observeIframeInsertion(adContainer); 406 var iframes = adContainer.querySelectorAll('iframe[id^="google_ads_iframe"]'); 407 iframes.forEach(applyResponsiveStyles); 408 } 409 }); 410 } 411 412 // Function to observe iframe insertion - from original code 413 function observeIframeInsertion(container) { 414 var observer = new MutationObserver(function (mutations) { 415 mutations.forEach(function (mutation) { 416 if (mutation.addedNodes) { 417 mutation.addedNodes.forEach(function (node) { 418 if (node.tagName === 'IFRAME' && node.id.startsWith('google_ads_iframe')) { 419 applyResponsiveStyles(node); 420 observeIframeChanges(node); 421 } 422 }); 423 } 424 }); 425 }); 426 427 observer.observe(container, { 428 childList: true, 429 subtree: true 430 }); 431 } 432 433 function applyResponsiveStyles(iframe) { 434 if (!iframe) return; 435 436 // Presenting sponsor (desktop AND mobile, ALL templates): one proportional 437 // fit â scale the creative to its reserved nav slot, no crop. (Previously this 438 // was template-19-only; every other template clipped via the default box.) 439 if (iframe.closest('.gam-presenting-sponsor-2') || iframe.closest('#gam-presenting-sponsor-mobile')) { 440 fitPresentingSponsor(iframe); 441 return; 442 } 443 444 // Banner / sport-banner ads â unchanged. 445 if ( 446 iframe.closest('.gam-banner-ad') || 447 iframe.closest('.gam-banner-ad-2') || 448 iframe.closest('.gam-sport-banner-ad') || 449 iframe.closest('.gam-sport-banner-ad-2') 450 ) { 451 var isTemplate19 = !!document.querySelector('.sticky-header-19'); 452 var isTemplate19Banner = isTemplate19 && iframe.closest('.gam-banner-ad'); 453 454 if (isMobile() && !isTemplate19Banner) { 455 iframe.style.width = '100%'; 456 iframe.style.height = 'auto'; 457 try { 458 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; 459 // Template 19's top banner sits at the very top of the sticky 460 // header with nothing overlapping it; the 20% push-down other 461 // templates use just renders as dead white space above the ad. 462 iframeDoc.querySelectorAll('img').forEach(function (img) { 463 img.style.maxWidth = '100%'; 464 img.style.height = 'auto'; 465 img.style.marginTop = iframe.closest('.gam-banner-ad') ? '20%' : '0'; 466 }); 467 } catch (e) { 468 console.error('Could not access iframe content:', e); 469 } 470 } 471 472 // Template 19's top banner ad: pin the iframe to the creative's true 473 // rendered height on EVERY device, not just mobile (AB-6411 â the 474 // sticky ad row is a fixed 122px box on desktop; see main.less/ 475 // CSSStyle19). Set inline with !important so it wins regardless of 476 // CSS state â GAM ad sizing lives here in JS, not in template CSS, 477 // which is easy to defeat via selector specificity drift (this exact 478 // element had multiple overlapping height:auto rules quietly taking 479 // turns winning). 480 if (isTemplate19Banner) { 481 try { 482 var iframeDoc19 = iframe.contentDocument || iframe.contentWindow.document; 483 if (iframeDoc19.documentElement) { iframeDoc19.documentElement.style.margin = '0'; iframeDoc19.documentElement.style.padding = '0'; } 484 if (iframeDoc19.body) { iframeDoc19.body.style.margin = '0'; iframeDoc19.body.style.padding = '0'; } 485 var bannerImg = iframeDoc19.querySelector('img'); 486 var fitBannerHeight = function () {
487 if (!bannerImg.naturalWidth) return; 488 var w = iframe.getBoundingClientRect().width; 489 var h = Math.round(w * bannerImg.naturalHeight / bannerImg.naturalWidth); 490 if (h > 0) iframe.style.setProperty('height', h + 'px', 'important'); 491 }; 492 if (bannerImg) { 493 bannerImg.style.maxWidth = '100%'; 494 bannerImg.style.height = 'auto'; 495 bannerImg.style.display = 'block'; 496 bannerImg.style.marginTop = '0'; 497 if (bannerImg.complete && bannerImg.naturalWidth) { fitBannerHeight(); } 498 else { bannerImg.addEventListener('load', fitBannerHeight); } 499 } 500 } catch (e) { 501 console.error('Could not access iframe content:', e); 502 } 503 } 504 } 505 } 506 507 // Scale the presenting sponsor to fit its reserved nav slot from the creative's 508 // TRUE dimensions, preserving aspect ratio (never crop). Generalized from the old 509 // template-19-only version so EVERY template gets the same treatment. Per the 510 // business-rules GAM section, sizing lives here in JS â CSS can't reach the creative 511 // inside the friendly iframe. The iframe still loads the native creative so GAM 512 // impression/click/viewability tracking fires correctly; we only change how it paints. 513 function fitPresentingSponsor(iframe) { 514 var container = iframe.closest('.gam-presenting-sponsor-2, #gam-presenting-sponsor-mobile'); 515 if (!container) return; 516 var isMobileSlot = container.id === 'gam-presenting-sponsor-mobile'; 517 518 // Target box = the slot each template reserves in its nav. Read it from the 519 // rendered container; fall back / sanity-cap so an unbounded (e.g. max-width:none) 520 // or not-yet-sized container can't blow the ad out across the nav. 521 var boxW = container.clientWidth; 522 var boxH = container.clientHeight; 523 if (!boxW || boxW < 40 || boxW > 400) boxW = isMobileSlot ? Math.max(200, window.innerWidth - 24) : 240; 524 if (!boxH || boxH < 20 || boxH > 120) boxH = isMobileSlot ? 64 : 72; 525 526 function apply(nativeW, nativeH) { 527 if (!nativeW || !nativeH) return; 528 // Fit WITHIN the box on both dimensions, preserving aspect ratio â no crop. 529 var scale = Math.min(boxW / nativeW, boxH / nativeH); 530 iframe.style.setProperty('width', nativeW + 'px', 'important'); 531 iframe.style.setProperty('height', nativeH + 'px', 'important'); 532 iframe.style.setProperty('transform', 'scale(' + scale + ')', 'important'); 533 iframe.style.transformOrigin = 'top left'; 534 // display:block so the iframe ignores inherited line-height (e.g. 85px on 535 // template 14's .upper-side) and its own vertical-align:bottom, which push an 536 // inline iframe DOWN inside the slot and let overflow:hidden clip the bottom. 537 iframe.style.setProperty('display', 'block', 'important'); 538 // Collapse the container to the painted size so there's no gap or overflow. 539 container.style.width = Math.round(nativeW * scale) + 'px'; 540 container.style.height = Math.round(nativeH * scale) + 'px'; 541 container.style.overflow = 'hidden'; 542 // Desktop sponsor sits inline in the greedy nav â now that it has a real 543 // width, let the nav reserve it (pushes overflow links into MORE). 544 if (!isMobileSlot) nudgeGreedyNav(); 545 } 546 547 try { 548 var doc = iframe.contentDocument || iframe.contentWindow.document; 549 var img = doc && doc.querySelector('img'); 550 if (img) { 551 // GAM's friendly iframe ships an 8px <body> margin that nudges the creative 552 // down/right (then overflow:hidden crops it). Zero margins + block-level the 553 // image to kill the inline baseline gap, then measure true dimensions. 554 if (doc.documentElement) { doc.documentElement.style.margin = '0'; doc.documentElement.style.padding = '0'; } 555 if (doc.body) { doc.body.style.margin = '0'; doc.body.style.padding = '0'; } 556 img.style.display = 'block'; 557 img.style.maxWidth = 'none'; 558 img.style.width = 'auto'; 559 img.style.height = 'auto';
560 if (img.complete && img.naturalWidth) { 561 apply(img.naturalWidth, img.naturalHeight); 562 } else { 563 img.addEventListener('load', function () { 564 apply(img.naturalWidth, img.naturalHeight); 565 }); 566 } 567 } 568 } catch (e) { 569 // Cross-origin (safe-frame) creative â can't measure it; leave the CSS default. 570 console.error('Could not size presenting sponsor:', e); 571 } 572 } 573 574 function observeIframeChanges(iframe) { 575 iframe.addEventListener('load', function () { 576 applyResponsiveStyles(iframe); 577 }); 578 579 var observer = new MutationObserver(function (mutations) { 580 mutations.forEach(function (mutation) { 581 if (mutation.type === 'childList' || (mutation.type === 'attributes' && mutation.attributeName === 'src')) { 582 applyResponsiveStyles(iframe); 583 } 584 }); 585 }); 586 587 observer.observe(iframe, { 588 childList: true, 589 subtree: true, 590 attributes: true, 591 attributeFilter: ['src'] 592 }); 593 } 594 }); 595 </script>
595 596 597 <!-- End GPT Tag --> 598 <!-- Google tag (gtag.js) -->
vendor: 73 bytes, lines 598-599
598 599 <script async src="https://www.googletagmanager.com/gtag/js?id=
599G-HH3VGLKVPH
vendor: 21 bytes, lines 599-600
599"></script> 600
600<script> 601
vendor: 171 bytes, lines 601-605
601window.dataLayer = window.dataLayer || []; 602 function gtag() { dataLayer.push(arguments); } 603 gtag('js', new Date()); 604 605 gtag('config', '
605G-HH3VGLKVPH
vendor: 13 bytes, lines 605-606
605'); 606
606</script>
606 607 608 609 <meta charset="utf-8" /> 610 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes" /> 611 <title>Salisbury High School (Salisbury, NC) Athletics</title> 612 <meta name="description" /> 613 <meta name="keywords" /> 614 <meta property="og:image" content="https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/4d558ca1-e57e-4cff-abf8-e8148ae0f4f4.png"> 615 <link rel="canonical" href="https://www.shshornets.com/boosterclub" /> 616<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" /> 617
617<script type="application/ld+json">{"@context":"https://schema.org","@type":"SportsOrganization","name":"Salisbury High School","url":"https://www.shshornets.com","logo":"https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/4d558ca1-e57e-4cff-abf8-e8148ae0f4f4.png","alternateName":"Salisbury High School Hornets","address":{"@type":"PostalAddress","addressLocality":"Salisbury","addressRegion":"NC"}}</script>
617 618
618<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Salisbury High School","url":"https://www.shshornets.com","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.shshornets.com/search?keyword={search_term_string}"},"query-input":"required name=search_term_string"}}</script>
618 619 620 621 622
622<script src="https://unpkg.com/focus-visible/dist/focus-visible.min.js"></script>
622 623 <!-- latest CDN compiled and minified CSS for lity (simple lightbox) --> 624 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lity/2.3.1/lity.min.css" integrity="sha256-0SZxASYAglrmIuTx+ZYHE3hzTnCZWB7XLu+iA8AG0Z0=" crossorigin="anonymous" /> 625 <!-- latest CDN compiled and minified CSS for bootstrap 3 --> 626 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 627 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> 628 <!-- latest CDN compiled and minified CSS for slick slider --> 629 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.css" integrity="sha256-UK1EiopXIL+KVhfbFa8xrmAWPeBjMVdvYMYkTAEv/HI=" crossorigin="anonymous" /> 630 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick-theme.min.css" integrity="sha256-4hqlsNP9KM6+2eA8VUT0kk4RsMRTeS7QGHIM+MZ5sLY=" crossorigin="anonymous" /> 631 <!-- latest CDN compiled and minified CSS for font awesome --> 632 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" integrity="sha256-NuCn4IvuZXdBaFKJOAcsU2Q3ZpwbdFisd5dux4jkQ5w=" crossorigin="anonymous" /> 633 <!-- locally stored compiled and minified CSS for yamm --> 634 <link rel="stylesheet" href="/lib/yamm3/yamm/yamm.min.css" /> 635 <link rel="stylesheet" href="/lib/datatables/media/css/dataTables.bootstrap.min.css" /> 636 <link rel="stylesheet" href="/less/templates/1/main.min.css?v=2.3" /> 637 <link rel="icon" type="image/png" href="https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/4d558ca1-e57e-4cff-abf8-e8148ae0f4f4.png"> 638 <link href="/lib/sweetalert/dist/sweetalert.css" rel="stylesheet" /> 639 <link rel="stylesheet" href="/less/Components/AIAgent.min.css" /> 640 641 642 643 <style> 644 h1{color: #ee2e24;} 645 body{background: url(https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/d92c3318-75df-41d0-8f36-6eff135b2049.jpg);} 646 .cd-main-content{background-image:url(https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/);} 647 @media (max-width: 500px){ 648 #calendar-link{background-color: #ee2e24;} 649 } 650 #calendar-link > span{color:#ee2e24;} 651 .header-topper:before{background:#ee2e24;} 652 .header-topper .row:before {background:#ee2e24;} 653 .bg-primary{background-color: #ee2e24;} 654 .bg-secondary{background-color: #d49100;} 655 .bg-gradient-primary-dark{background-image: linear-gradient(180deg,#000,#ee2e24);} 656 .text-primary{color: #ee2e24 !important;} 657 .text-secondary{color: #d49100 !important;} 658 .text-primary-font{color: #ffffff;} 659 .right-angle-primary{border-color: rgba(255,255,255,0) #ee2e24 transparent #ee2e24;} 660 .left-angle-secondary{border-color: #fff #d49100 transparent transparent;} 661 .border-all-thin-primary{border: solid 1px #ee2e24;} 662 .border-all-xl-primary{border: 20px solid #ee2e24;} 663 .border-all-sm-secondary{border: 2px solid #d49100;} 664 .border-right-xl-primary{border-right: 20px solid #ee2e24;} 665 .border-right-xl-secondary{border-right: 20px solid #d49100;} 666 .border-top-sm-secondary{border-top: 2px solid #d49100 !important;} 667 .border-bottom-sm-secondary{border-bottom: 2px solid #d49100 !important;}
668 .pins span:before,.pins span:after{border-top: 4px solid #ee2e24; border-bottom: 4px solid #d49100;} 669 .angle-primary-secondary{border-color: #ee2e24 #d49100 #ee2e24 #d49100;} 670 .team-menu .navbar-nav>li.active {background-color: #d49100; color: #ee2e24;} 671 .team-menu .navbar-nav>li.active:after {border-top-color: #d49100;} 672 .team-menu-container{background-image:url(https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/e759f63f-428f-471b-938a-517f0c96c6b7.png);} 673 .news-header-container{background-image:url(https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/e759f63f-428f-471b-938a-517f0c96c6b7.png);} 674 .arrow_box {border-bottom: 4px solid #d49100;} 675 .arrow_box:before {border-top-color: #d49100;} 676 .ticker-19-badge-today, .ticker-19-badge-upcoming, .ticker-19-badge-final { background-color: #ee2e24; } 677 .ticker-19-calendar-link { background-color: #ee2e24; color: #fff !important; min-width: 80px !important; padding: 0 20px !important; border: none !important; border-right: 3px solid rgba(255,255,255,0.3) !important; font-size: 1rem !important; font-weight: 700 !important; text-transform: uppercase !important; letter-spacing: 1px !important; gap: 4px !important; } 678 .ticker-19-calendar-link:hover { filter: brightness(1.15); } 679 .ticker-19-calendar-link i { font-size: 1.3rem !important; } 680 .ticker-19-calendar-link span { color: #fff !important; font-size: 0.7rem !important; font-weight: 700 !important; letter-spacing: 1px !important; } 681 </style> 682 683 684 685 686 687 688 689</head> 690<body viewport="fixed"> 691 <a href="#main-content" class="skip-link">Skip to main content</a> 692 693 <div class="ticker-19-section" aria-label="Game Schedule"> 694 <div class="ticker-19-bar"> 695 <!-- Composite calendar link â LEFT side like OU --> 696 <a href="/calendar" class="ticker-19-calendar-link" aria-label="View full schedule"> 697 <i class="fa fa-calendar" aria-hidden="true"></i> 698 <span>Composite</span> 699 </a> 700 701 <!-- Tabs --> 702 <div class="ticker-19-tabs" role="tablist"> 703 <button class="ticker-19-tab active" id="ticker19-ev-btn" role="tab" aria-controls="ticker19-events" aria-selected="true" tabindex="0">Events</button> 704 <button class="ticker-19-tab" id="ticker19-res-btn" role="tab" aria-controls="ticker19-results" aria-selected="false" tabindex="0">Results</button> 705 </div> 706 707 <!-- Events Panel --> 708 <div class="ticker-19-panel active" id="ticker19-events" role="tabpanel" aria-labelledby="ticker19-ev-btn"> 709 <div class="ticker-19-scroll-container"> 710 <button class="ticker-19-arrow ticker-19-arrow-left" aria-label="Previous games"><i class="fa fa-chevron-left" aria-hidden="true"></i></button> 711 <div class="ticker-19-track events-slider-19"> 712 <div class="ticker-19-empty">No upcoming events <a href="/calendar">View calendar</a></div> 713 </div> 714 <button class="ticker-19-arrow ticker-19-arrow-right" aria-label="Next games"><i class="fa fa-chevron-right" aria-hidden="true"></i></button> 715 </div> 716 </div> 717 718 <!-- Results Panel --> 719 <div class="ticker-19-panel" id="ticker19-results" role="tabpanel" aria-labelledby="ticker19-res-btn" hidden> 720 <div class="ticker-19-scroll-container"> 721 <button class="ticker-19-arrow ticker-19-arrow-left" aria-label="Previous results"><i class="fa fa-chevron-left" aria-hidden="true"></i></button> 722 <div class="ticker-19-track results-slider-19"> 723 <div class="ticker-19-empty">No recent results</div> 724 </div> 725 <button class="ticker-19-arrow ticker-19-arrow-right" aria-label="Next results"><i class="fa fa-chevron-right" aria-hidden="true"></i></button> 726 </div> 727 </div> 728 </div> 729 </div> 730
730<script> 731 (function loadTicker() { 732 if (typeof jQuery !== 'undefined') { 733 var s = document.createElement('script'); 734 s.src = '/js/UpcomingEventsStyle19.js'; 735 document.body.appendChild(s); 736 } else { 737 setTimeout(loadTicker, 50); 738 } 739 })(); 740 </script>
740 741 742<!-- Mobile: collapsible mini schedule (future events only) --> 743 744<style> 745 /* Game footnote (Homecoming, Senior Night, ...) under the matchup */ 746 .ticker-19-footnote { 747 font-size: 0.7rem; 748 font-style: italic; 749 font-weight: 600; 750 color: #444; 751 text-align: center; 752 white-space: nowrap; 753 overflow: hidden; 754 text-overflow: ellipsis; 755 max-width: 190px; 756 margin: 1px auto 0; 757 } 758 759 /* Auto-scroll card text that overflows its max-width (JS flags with .t19-marq) */ 760 .ticker-19-sport.t19-marq, .ticker-19-opp-name.t19-marq { text-overflow: clip; } 761 .t19-marq .t19-marq-inner { 762 display: inline-block; 763 white-space: nowrap; 764 animation: t19-marq-slide var(--t19-marq-dur, 6s) ease-in-out infinite alternate; 765 } 766 .ticker-19-card:hover .t19-marq .t19-marq-inner, 767 .ticker-19-card:focus-within .t19-marq .t19-marq-inner { animation-play-state: paused; } 768 @keyframes t19-marq-slide { 769 0%, 20% { transform: translateX(0); } 770 80%, 100% { transform: translateX(var(--t19-marq-shift, 0px)); } 771 } 772 @media (prefers-reduced-motion: reduce) { 773 .ticker-19-sport.t19-marq, .ticker-19-opp-name.t19-marq { text-overflow: ellipsis; } 774 .t19-marq .t19-marq-inner { animation: none; } 775 } 776 777 .mobile-cal-bar { display: none; } 778 .mobile-mini-sched { display: none; } 779 @media (max-width: 991px) { 780 .ticker-19-section { display: none !important; } 781 782 /* Calendar bar: toggle + full schedule link */ 783 .mobile-cal-bar { 784 display: flex !important; 785 align-items: center; 786 justify-content: center; 787 padding: 0; 788 margin: 0; 789 } 790 .mcb-toggle { 791 flex: 1; 792 display: flex; 793 align-items: center; 794 justify-content: center; 795 gap: 8px; 796 color: #fff; 797 background: transparent; 798 border: none; 799 font-size: 1.1rem; 800 font-weight: 700; 801 text-transform: uppercase; 802 letter-spacing: 0.4px; 803 padding: 8px 14px; 804 cursor: pointer; 805 } 806 .mcb-caret { 807 transition: transform 0.2s; 808 font-size: 0.95rem; 809 } 810 .mcb-toggle[aria-expanded="true"] .mcb-caret { 811 transform: rotate(180deg); 812 } 813 .mcb-full { 814 display: flex; 815 align-items: center; 816 justify-content: center; 817 padding: 8px 16px; 818 color: rgba(255,255,255,0.9); 819 text-decoration: none; 820 border-left: 1px solid rgba(255,255,255,0.15); 821 font-size: 1.05rem; 822 } 823 .mcb-full:hover { color: #fff; text-decoration: none; } 824 825 /* Mini schedule (collapsed by default) */ 826 .mobile-mini-sched { 827 background: #fff; 828 border-bottom: 1px solid #e5e7eb; 829 overflow: hidden; 830 max-height: 0; 831 transition: max-height 0.3s ease; 832 } 833 .mobile-mini-sched.mms-open { 834 display: block; 835 max-height: 1200px; 836 } 837 .mms-event { 838 display: flex; 839 align-items: center; 840 gap: 14px; 841 padding: 14px 16px; 842 border-bottom: 1px solid #f0f0f0; 843 } 844 .mms-event:last-child { border-bottom: none; } 845 .mms-date { 846 display: flex; 847 flex-direction: column; 848 align-items: center; 849 min-width: 56px; 850 flex-shrink: 0; 851 } 852 .mms-month { 853 font-size: 1rem; 854 font-weight: 700; 855 text-transform: uppercase; 856 color: #444; 857 line-height: 1; 858 } 859 .mms-day { 860 font-size: 1.85rem; 861 font-weight: 800; 862 color: #000; 863 line-height: 1.2; 864 } 865 .mms-info { 866 flex: 1; 867 min-width: 0; 868 } 869 .mms-sport { 870 display: block; 871 font-size: 1.05rem; 872 font-weight: 700; 873 text-transform: uppercase; 874 color: #444; 875 letter-spacing: 0.3px; 876 } 877 .mms-matchup { 878 display: flex; 879 align-items: center; 880 gap: 8px; 881 font-size: 1.2rem; 882 font-weight: 700; 883 color: #000; 884 white-space: nowrap; 885 overflow: hidden; 886 text-overflow: ellipsis; 887 } 888 .mms-logo { 889 width: 32px; 890 height: 32px; 891 object-fit: contain; 892 border-radius: 50%; 893 flex-shrink: 0; 894 } 895 .mms-right { 896 flex-shrink: 0; 897 text-align: right; 898 } 899 .mms-time { 900 font-size: 1.15rem; 901 font-weight: 600; 902 color: #000; 903 } 904 .mms-filter { 905 padding: 12px 16px; 906 border-bottom: 1px solid #e5e7eb; 907 } 908 .mms-sport-select { 909 width: 100%; 910 padding: 12px 14px; 911 font-size: 1.2rem; 912 font-weight: 600; 913 border: 1px solid #d1d5db; 914 border-radius: 4px; 915 background: #fff; 916 color: #000; 917 -webkit-appearance: menulist; 918 } 919 .mms-sport-select option { 920 color: #000; 921 background: #fff; 922 font-size: 1.2rem; 923 } 924 .mms-full-link { 925 display: flex; 926 align-items: center; 927 justify-content: center; 928 gap: 10px; 929 padding: 16px; 930 font-size: 1.2rem; 931 font-weight: 700; 932 text-transform: uppercase; 933 letter-spacing: 0.5px; 934 color: #000; 935 text-decoration: none; 936 border-top: 1px solid #e5e7eb; 937 } 938 .mms-full-link:hover { color: #1a1a1a; text-decoration: none; } 939 } 940</style>
941<script> 942document.addEventListener('DOMContentLoaded', function () { 943 var btn = document.getElementById('mcbToggle'); 944 var sched = document.getElementById('mobileMinSched'); 945 var calBar = document.querySelector('.mobile-cal-bar'); 946 if (!btn || !sched || !calBar) return; 947 948 // Move the schedule right after the calendar bar so it expands downward 949 calBar.parentNode.insertBefore(sched, calBar.nextSibling); 950 951 // Toggle expand/collapse 952 btn.addEventListener('click', function () { 953 var open = sched.classList.toggle('mms-open'); 954 sched.hidden = !open; 955 btn.setAttribute('aria-expanded', open ? 'true' : 'false'); 956 }); 957 958 // Sport filter: fetch filtered events from server 959 var filter = document.getElementById('mmsSportFilter'); 960 var eventsContainer = document.getElementById('mmsEvents'); 961 if (filter && eventsContainer) { 962 filter.addEventListener('change', function () { 963 var sport = this.value; 964 eventsContainer.style.opacity = '0.5'; 965 fetch('/api/mobile-events?sport=' + encodeURIComponent(sport)) 966 .then(function (r) { return r.json(); }) 967 .then(function (events) { 968 var html = ''; 969 events.forEach(function (g) { 970 html += '<div class="mms-event" data-sport="' + (g.sport || '') + '">' 971 + '<div class="mms-date"><span class="mms-month">' + g.month + '</span><span class="mms-day">' + g.day + '</span></div>' 972 + '<div class="mms-info"><span class="mms-sport">' + g.sportLabel + '</span>' 973 + '<span class="mms-matchup">' 974 + (g.opponentLogo ? '<img src="' + g.opponentLogo + '" class="mms-logo" alt="" loading="lazy" />' : '') 975 + g.matchup + '</span></div>' 976 + '<div class="mms-right"><span class="mms-time">' + g.time + '</span></div></div>'; 977 }); 978 eventsContainer.innerHTML = html || '<div style="padding:18px;text-align:center;color:#555;font-size:1rem;font-weight:500;">No upcoming events</div>'; 979 eventsContainer.style.opacity = '1'; 980 }) 981 .catch(function () { eventsContainer.style.opacity = '1'; }); 982 }); 983 } 984}); 985</script>
985 986 987 988 <input type="hidden" value="2555757" id="schoolId" /> 989 <input type="hidden" value="false" id="customAppSchool" /> 990 <input type="hidden" value="8/31/2023 12:00:00 AM" id="adServingDateBegins" /> 991 <header> 992 993 994 995 <div class="row"> 996 <div class="col-md-12 no-print"> 997 998 </div> 999 </div> 1000 1001 <div class="header-topper"> 1002 <div class="row"> 1003 <h1 class="site-title text-primary no-print"><small style="color: black;"> <i>THE OFFICIAL SITE OF </i></small><br /><i>Salisbury High School Athletics</i></h1> 1004 </div> 1005 </div> 1006 <div class="row"> 1007 <div class="col-md-12"> 1008 <div class="main-menu-container bg-primary" id="fixedscroll"> 1009 <div class="fixed-menu-container"> 1010 <div class="header-social-media"> 1011 <div class="feed-wrapper"> 1012</div> 1013 1014 </div> 1015 <div id="center"> 1016 <div class="header-gfx border-right-xl-secondary no-print"> 1017 <a href="/"><img src="https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/52b446fc-f9e6-4f48-87f8-b2fa72126a01.png" aria-label="Salisbury" alt="Salisbury Logo" /><span class="mk-blank">-</span></a> 1018 </div> 1019 <div class="primary-line border-right-xl-primary"></div> 1020 </div> 1021 <div class=""> 1022 1023 <nav class="custom-nav" role="navigation" aria-label="Main Navigation" data-sponsor-model="true"> 1024 <div class="navbar yamm navbar-static-top"> 1025 <div class="container" id="nav-container"> 1026 <div class="navbar-header"> 1027 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 1028 <span class="sr-only">Toggle navigation</span> 1029 <span class="icon-bar bg-secondary"></span> 1030 <span class="icon-bar bg-secondary"></span> 1031 <span class="icon-bar bg-secondary"></span> 1032 </button> 1033 <a class="navbar-brand" href="/" aria-label="Return to Salisbury Home Page"> 1034 <img src="https://5starassets.blob.core.windows.net/athleticsites/2555757/119/images/4048602e-6ec8-4bba-b232-21938c65910d.png" class="img-responsive tag" aria-label="Salisbury Logo" alt="Salisbury Logo" /> 1035 </a> 1036 <div class="presenting-sponsor hidden-md hidden-lg"> 1037 <div class="adzone adzone-0 presenting-sponsor"> 1038 <div class="ad-placement"> 1039 <div id='gam-presenting-sponsor-mobile' class="gam_ps"></div> 1040 </div> 1041 1042 </div> 1043 </div> 1044 </div> 1045 <div id="navbar" class="navbar-collapse collapse" aria-expanded="false"> 1046 <ul class="nav navbar-nav" id="nav-links" role="menubar"> 1047 1048 <li class="dropdown yamm-fw" role="presentation"> 1049 <a href="#" data-toggle="dropdown" class="dropdown-toggle text-primary-font" role="menuitem" aria-haspopup="true" aria-expanded="false" tabindex="0">SPORTS</a> 1050 <ul id="dropdown1" class="dropdown-menu two-columns" role="menu"> 1051 </ul> 1052 </li> 1053 <li role="presentation"> 1054 <a class="slanted-btn text-primary-font" href="/broadcasts" role="menuitem" tabindex="0"><span>BROADCASTS</span></a> 1055 </li> 1056 <li role="presentation"> 1057 <a class="slanted-btn text-primary-font" href="/news" role="menuitem" tabindex="0"><span>NEWS</span></a> 1058 </li> 1059 <li role="presentation"> 1060 <a class="slanted-btn text-primary-font" href="/boosterclub" role="menuitem" tabindex="0"><span>BOOSTER CLUB</span></a> 1061 </li> 1062 <li id="more" class="hidden" role="presentation"> 1063 <a class="dropdown-toggle text-primary-font" data-toggle="dropdown" aria-haspopup="true" href="#" role="menuitem" aria-expanded="false" tabindex="0">
1064 More <span class="caret"></span> 1065 </a> 1066 <ul class="dropdown-menu dropdown-menu-right" role="menu"></ul> 1067 </li> 1068 </ul> 1069 1070 <div class="presenting-sponsor-mobile-menu hidden-sm hidden-xs"> 1071 <div class="adzone adzone-0 presenting-sponsor"> 1072 <div class="ad-placement"> 1073 <div id='gam-presenting-sponsor-2' class="gam-presenting-sponsor-2"></div> 1074 </div> 1075 1076 </div> 1077 </div> 1078 </div> 1079 </div> 1080 </div> 1081 <div class="mobile-cal-bar bg-primary"><button type="button" class="mcb-toggle" id="mcbToggle" aria-expanded="false"><i class="fa fa-calendar"></i> Calendar <i class="fa fa-caret-down mcb-caret"></i></button><a href="/calendar" class="mcb-full"><i class="fa fa-arrow-right"></i></a></div> 1082</nav> 1083 1084<!--Centerville--> 1085 1086 1087 </div> 1088 <div class="clearfix"></div> 1089 </div> 1090 </div> 1091 </div> 1092 </div> 1093 1094 </header> 1095 <div class="banner-ad-container-sticky-footer"> 1096 <div class="banner-ad"> 1097 <div class="banner"> 1098 <div class="row"> 1099 <div class="col-md-12 col-sm-12"> 1100 <div class="ad-placement"> 1101 <div id='gam-banner-ad' class="gam-banner-ad"> 1102
1102<script> 1103 googletag.cmd.push(function () { googletag.display('gam-banner-ad'); }); 1104 </script>
1104 1105 </div> 1106 </div> 1107 </div> 1108 </div> 1109</div> 1110 1111 </div> 1112 </div> 1113 <div class="cd-main-content"> 1114 <div class="row"> 1115 <div class="col-md-3"> 1116 <div class="vertical-menu"> 1117 1118 1119<nav class="cd-side-nav" role="navigation"> 1120 <div class="row"> 1121 <div class="feeder-container"> 1122 </div> 1123</div> 1124 1125 <ul> 1126 <li class="cd-label text-secondary border-top-sm-secondary border-bottom-sm-secondary"> 1127 1128 ATHLETICS 1129 1130 </li> 1131 <li class="has-children bg-primary schedules"> 1132 <a href="#" aria-label="SCHEDULES link" aria-expanded="false" aria-haspopup="true">schedules</a> 1133 <ul class="large-submenu bg-primary"> 1134 <li> 1135 <div class="row"> 1136 </div> 1137 </li> 1138 </ul> 1139 </li> 1140 <li class="bg-primary"> 1141 <a href="/news" aria-label="NEWS">news</a> 1142 </li> 1143 <li class="has-children bg-primary rosters"> 1144 <a href="#" aria-label="ROSTERS link" aria-expanded="false" aria-haspopup="true">rosters</a> 1145 <ul class="large-submenu bg-primary"> 1146 <li> 1147 <div class="row"> 1148 </div> 1149 </li> 1150 </ul> 1151 </li> 1152 <li class="has-children bg-primary coaches-and-staff"> 1153 <a href="#" aria-label="COACHES AND STAFF link" aria-expanded="false" aria-haspopup="true">coaches and staff</a> 1154 <ul class="large-submenu bg-primary"> 1155 <li> 1156 <div class="row"> 1157 </div> 1158 </li> 1159 </ul> 1160 </li> 1161 <li class="cd-label text-secondary border-top-sm-secondary border-bottom-sm-secondary"> 1162 1163 RESOURCES 1164 1165 </li> 1166 <li class="bg-primary"> 1167 <a href="/links" aria-label="LINKS">links</a> 1168 </li> 1169 <li class="bg-primary"> 1170 <a href="/documents" aria-label="FORMS">forms</a> 1171 </li> 1172 </ul> 1173</nav> 1174 1175 </div> 1176 </div> 1177 <div class="col-md-9"> 1178 <div class="content-wrapper" id="main-content" role="main"> 1179 <div class="row content-container HallOfFameContainer default-border"> 1180 <div class="col-md-12"> 1181 <div class="booster-club-page"> 1182 <div class="booster-club-header"> 1183 <div class="booster-club-header-image"> 1184 <img class="img-responsive center-block" src="https://5starassets.blob.core.windows.net/athleticsites/2555757/images/0c135a1c-7bb0-4c2e-98a8-9cb6314c3065.jpg" alt="Salisbury Booster Club Information" /> 1185 </div> 1186 </div> 1187 <div class="row"> 1188 <div class="col-sm-12"> 1189 <div class="downloads"> 1190 <h2>Downloads</h2> 1191 <ul> 1192 <li><h3><a target="_blank" href="https://5starassets.blob.core.windows.net/athleticsites/2555757/BoosterClubDownloads/Game on.jpg">Red Black and Gold Gala, Sept 30</a></h3></li> 1193 </ul> 1194 </div> 1195 </div> 1196 </div> 1197</div> 1198 </div> 1199</div> 1200 1201 1202 1203 </div> 1204 </div> 1205 </div> 1206 1207 <footer> 1208 1209 1210 1211 1212 <div class="footer bg-primary"> 1213 <div class="footer-contain"> 1214 <div id="footer-gradient" class="angle-primary-secondary bg-primary"></div> 1215 <div id="footer-gradient-bottom" class="bg-primary"> 1216 <div class="row"> 1217 <div class="col-md-12"> 1218 <div id="address"> 1219 <p> 1220 ATHLETIC OFFICE - (704) 636-1221<br /> 1221 500 LINCOLNTON ROAD<br /> 1222 Salisbury, NC 28144<br /> 1223 </p> 1224 <br /> 1225 <p>Thank you to all of our <a style="color: #fff; text-decoration: underline; padding: 3px;" href="/sponsor/SponsorsPage">Sponsors!</a></p> 1226 </div> 1227 </div> 1228 </div> 1229 <!-- app promotion --> 1230 <div class="footer-items"> 1231 <div class="row"> 1232 <div class="col-md-12"> 1233 <div id="app-downloads"> 1234 <div id="badges"> 1235 <div class="row"> 1236 <div class="col-sm-12"> 1237 <a href="https://itunes.apple.com/us/app/niaaa/id963291250?mt=8" target="_blank"><img class="img-responsive download" src="/images/dl-apple.png" aria-label="Apple App Store Badge" alt="Apple App Store Badge" /></a> 1238 <img class="img-responsive app-icon" src="/images/niaaa-icon.png" aria-label="Mascot Media App Icon Logo" alt="Mascot Media App Icon Logo" /> 1239 1240 <a href="https://play.google.com/store/apps/details?id=com.sidelineaccess.niaaa&hl=en" target="_blank"><img class="img-responsive download" src="/images/dl-google.png" aria-label="Google Play Store Badge" alt="Google Play Store Badge" /></a> 1241 </div> 1242 </div> 1243 </div> 1244 </div> 1245 </div> 1246 </div> 1247 </div> 1248 </div> 1249 </div> 1250 <div class="feeder-schools-footer bg-primary"> 1251 </div> 1252</div> 1253 <div class="footer bg-primary"> 1254 <div class="widget padded-box"> 1255 <div class="footer-items"> 1256 <div class="row"> 1257 <div class="col-md-12"> 1258 1259 </div> 1260 </div> 1261 </div> 1262 </div> 1263</div> 1264 1265 </footer> 1266 </div> 1267 <div class="privacy-terms"> 1268 <a href="http://www.mascotmedia.net/privacy-policy/" target="_blank" rel="noopener noreferrer">PRIVACY POLICY</a> <span class="sr-only">(opens in a new tab)</span> | 1269 1270
1271 <span>© 2026 MASCOT MEDIA, LLC</span> 1272 </div> 1273 <div class="ad-space"> 1274 </div> 1275 1276
1276<script src="/lib/jquery/dist/jquery.min.js"></script>
1276 1277
1277<script src="/js/lity.js"></script>
1277 1278
1278<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
1278 1279
1279<script type="text/javascript" src="/js/scrollfixed.min.js"></script>
1279 1280
1280<script src="/js/topmenu2.min.js?v=1.1"></script>
1280 1281
1281<script src="/js/sidenav.min.js"></script>
1281 1282
1282<script src="/js/latestheadlines.min.js"></script>
1282 1283
1283<script src="/lib/datatables/media/js/jquery.dataTables.min.js"></script>
1283 1284
1284<script src="/lib/datatables/media/js/dataTables.bootstrap.min.js"></script>
1284 1285
1285<script src="/lib/datatables-responsive/js/dataTables.responsive.min.js"></script>
1285 1286
1286<script src="/lib/jquery.menu-aim/jquery.menu-aim.min.js"></script>
1286 1287
1287<script src="https://cdn.jsdelivr.net/jquery.slick/1.3.15/slick.min.js"></script>
1287 1288
1288<script src="/js/StagingButtons.min.js"></script>
1288 1289
1289<script src="/lib/sweetalert/dist/sweetalert.min.js"></script>
1289 1290
1290<script src="/lib/slick-carousel/slick/slick.min.js"></script>
1290 1291
1291<script src="/js/PlatinumSponsorStyle2.min.js"></script>
1291 1292
1292<script src="/js/CommitmentsStyle1.min.js"></script>
1292 1293 1294 1295 1296 1297
1297<script src="/js/site.js"></script>
1297 1298 1299 1300 1301 1302 1303 1304
1304<script type="text/javascript"> 1305 $.extend(true, $.fn.dataTable.defaults, { 1306 language: { 1307 "processing": "<i class='fa fa-refresh fa-spin fa-2x'></i><br />Loading..." 1308 } 1309 }); 1310 1311 $('.dropdown-button').dropdown({ 1312 inDuration: 300, 1313 outDuration: 225, 1314 //alignment: "center", 1315 hover: false, // Activate on hover 1316 }); 1317 </script>
1317 1318
1318<script type='text/javascript'> 1319 var url = ''; 1320 var regex = /([\d]{10,})/g; 1321 var meta = document.createElement('meta'); 1322 meta.setAttribute('name', 'apple-itunes-app'); 1323 meta.setAttribute('content', 'app-id=' + url.match(regex)); 1324 document.getElementsByTagName('head')[0].appendChild(meta); 1325 </script>
1325 1326 1327 <!-- Quantcast Tag --> 1328
1328<script type="text/javascript"> 1329 window._qevents = window._qevents || []; 1330 (function () { 1331 var elem = document.createElement('script'); 1332 elem.src = (document.location.protocol == "https:" ? "https://secure" : "http://edge") + ".quantserve.com/quant.js"; 1333 elem.async = true; 1334 elem.type = "text/javascript"; 1335 var scpt = document.getElementsByTagName('script')[0]; 1336 scpt.parentNode.insertBefore(elem, scpt); 1337 })(); 1338 window._qevents.push({ 1339 qacct: "p-L8Vz-DsnmdfCj", 1340 uid: "__INSERT_EMAIL_HERE__" 1341 }); 1342 </script>
1342 1343 <noscript> 1344 <div style="display:none;"> 1345 <img src="//pixel.quantserve.com/pixel/p-L8Vz-DsnmdfCj.gif" border="0" height="1" width="1" alt="Quantcast" /> 1346 </div> 1347 </noscript> 1348 <!-- End Quantcast tag --> 1349</body> 1350</html>
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.