PageSourceSearch

https://www.shshornets.com/boosterclub

html shshornets.com collected 2026-10-04 02:44:47 UTC 67,528 bytes, 1,350 lines download raw bytes

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;">&nbsp;&nbsp;&nbsp;<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>&copy; 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.