1<!doctype html> 2<html lang="en"> 3 4<head> 5 <!-- Performance Optimizations --> 6 <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin> 7 <link rel="preconnect" href="https://code.jquery.com" crossorigin> 8 <link rel="dns-prefetch" href="https://cdn.jsdelivr.net"> 9 <link rel="dns-prefetch" href="https://code.jquery.com"> 10 <link rel="dns-prefetch" href="https://maxcdn.bootstrapcdn.com"> 11 <link rel="preload" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" as="style"> 12 <!-- meta tags --> 13 <meta charset="utf-8"> 14 <title>ContactUs</title> 15 <meta name="viewport" content="width=device-width, initial-scale=1"> 16 17 <meta name="keywords" content="tennessee, high school sports, dobyns-bennett, sullivan south, tri-cities, tri-cities sports, high school football, high school basketball, sports in tennessee, tennessee high school, arbys classic, bristol, golf, prep sports, basketball, football, high,"> 18 <meta name="description" content="Tri-Cities Sports - Your Source for Local Sports!!"> 19 <link rel="shortcut icon" href="/favicon.ico?v=1790346378"> 20
20<script type="text/javascript" language="javascript" src="/lib/bl2.js"></script>
20 21 22 <!-- bootstrap --> 23 <link type="text/css" rel="stylesheet" href="/layout.css"> 24 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> 25
25<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
25 26 <link type="text/css" rel="stylesheet" href="https://bulletlink.com/bootstrap.css"> 27 <!-- /bootstrap --> 28 29 <!-- jQuery --> 30
30<script src="https://code.jquery.com/jquery-1.7.min.js" integrity="sha256-/05Jde9AMAT4/o5ZAI23rUf1SxDYTHLrkOco0eyRV84=" crossorigin="anonymous"></script>
30 31 <!-- /jQuery --> 32 33 <!-- system --> 34
34<script type="text/javascript" language="javascript" src="/settings.js?v=1790346378"></script>
34 35
35<script type="text/javascript" language="javascript" src="/ads.js?v=1790346378"></script>
35 36
36<script type="text/javascript" language="javascript" src="/menu_horizontal.js?v=1790346378"></script>
36 37
37<script type="text/javascript" language="javascript" src="/sections.js?v=1790346378"></script>
37 38
38<script type="text/javascript" language="javascript" src="/polls.js?v=1790346378"></script>
38 39
39<script type="text/javascript" language="javascript" src="/articles.js?v=1790346378"></script>
39 40
40<script type="text/javascript" language="javascript" src="/lib/iframeResizer.min.js"></script>
40 41 <!-- /system --> 42 43 <!-- fontAwesome--> 44 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" /> 45 <link rel="preconnect" href="https://fonts.googleapis.com"> 46 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 47 <link href="https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@300;400;700&display=swap" rel="stylesheet"> 48 <!-- /fontAwesome--> 49 50 <!-- general --> 51
51<script type="text/javascript" language="javascript" src="/jscript1.js?v=1790346378"></script>
51 52 <link type="text/css" rel="stylesheet" href="/custom.css?v=1790346378"> 53
53<script type="text/javascript" language="javascript" src="/custom.js?v=1790346378"></script>
53 54 <!-- /general --> 55 56 <!--StartMH--> 57 <!--MetaSharing--> 58 <!--EndMH--> 59 60 <!-- live-Builder --> 61 <link type="text/css" rel="stylesheet" href="/ufields.css?v=1790346378" /> 62
62<script type="text/javascript" src="/ufields.js?v=1790346378"></script>
62 63 <!-- /live-Builder --> 64 65<style>:root{--cms-theme-color: #555;}</style><link rel="stylesheet" href="/sys-popup.css?v=1790346378"><style id="universal-submit-spinner"> 66.form-submit-spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.4);border-top-color:#fff;border-radius:50%;animation:frmSpin .7s linear infinite;vertical-align:middle;margin-right:6px} 67@keyframes frmSpin{to{transform:rotate(360deg)}} 68</style></head> 69 70<body id="blbodymain" class="blbody cus-select-red"><a href="https://tricitiessports.com/cdn-cgi/content?id=VqCxEtQpMdSXGB1mBAJ0yv923MJ5usZz7kEsvyvefa0-1790379760.1860566-1.2.1.1-0lLIJQZAMMrCQvEBmvnYkH7uspBitjPguGlV30oT0E4KhwRGo68MN0B.5ecdEapR" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a> 71 <div class="mainbody"> 72 <!-- sticky ads--> 73 <span class="cus-sticky-ads"></span> 74 <!-- /sticky ads--> 75 <div class="container-fluid bg-black"> 76 <div class="container-bl px-0 px-lg-2"> 77 <div class="bg-black"> 78 <div class="row border-bottom p-3 mx-lg-0 ps-lg-0"> 79<div class="col-1 fw-bold text-uppercase text-white fs-6 pt-0">
80<script type="text/javascript" language="javascript" src="/menu_sandwich.js?v=1790346378"></script>
80
81<script type="text/javascript" language="javascript">GetMenuSandwich();</script>
81 82</div> 83<div class="col-2 fw-bold text-uppercase text-white fs-6 pt-0">
83<script type="text/javascript" language="JavaScript">AdGroup17();</script>
83</div> 84 <div class="col-lg-5 col-12 ps-0"> 85 <a class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" href="https://tricitiessports.com">HOME</a> 86 <a class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" href="/about-us-p114331-579.htm">ABOUT</a> 87 <a class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" href="/ContactUs">CONTACT</a> 88 <a class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" href="/PAID_subscribers">SUBSCRIBE</a> 89<a 90 id="subscriber-login" 91 class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" 92 href="/LoginSubscriber" 93 style="display:none !important;" 94 onclick="if(window.PaywallWidget){PaywallWidget.showLoginModal();return false;}" 95> 96 LOGIN 97</a> 98 99<a 100 id="subscriber-logout" 101 class="text-decoration-none fw-bold text-uppercase text-white fs-6 me-3 cus-toplink-1-133-link text-red-hover" 102 href="#" 103 style="display:none !important;" 104 onclick="document.cookie='subscriber_token=; path=/; max-age=0'; location.href='/'; return false;" 105> 106 LOGOUT 107</a> 108 109 </div> 110 111 112 <div class="col-lg-2"> <div class="col-lg-12"> 113 <!-- search --> 114
114<script type="text/javascript" language="JavaScript">GetGoogleCustomSearch();</script>
114 115 <div class="d-inline position-relative"> 116 <div class="cus-101-search hpe-gsearch shadow-sm border border-white"> 117 <div class="cus-101-search-box"> <div id="custom-search-box"></div>
117<script>newCustomSearch();</script>
117</div> 118 </div> 119 <div class="cus-101-search-result"><gcse:searchresults></gcse:searchresults></div> 120 </div> 121 <style> 122 .gsc-adBlock {display: none !important;} 123 #gsc-i-id1{color:#000!important} 124 #gsc-i-id1::placeholder{color:#555!important;opacity:1;font-size:inherit!important} 125 .search_content{display:flex;display:-webkit-flex;-ms-display:flex;align-items:center;-webkit-align-items:center;-ms-align-items:center;justify-content:center;-webkit-justify-content:center;-ms-justify-content:center;background-color:rgba(255,255,255,.98);height:100%;position:fixed;top:100%;opacity:0;left:0;width:100%;z-index:2147483647;transition: 400ms ease-in-out;} 126 .search-flex{top: 0;opacity: 1;display:flex;display:-webkit-flex;-ms-display:flex;align-items:center;-webkit-align-items:center;-ms-align-items:center;justify-content:center;-webkit-justify-content:center;-ms-justify-content:center;transition: 300ms ease-in-out;} 127 .search_remove{cursor:pointer;user-select:none;position:absolute;top:10px;left:3%;} 128 .search_remove:hover{color:#ff4500} 129 .gsc-control-cse.gsc-control-cse-en{background-color:transparent;border-width:0;position:absolute} 130 .gsib_b,.gsst_a{display:none!important} 131 .gscb_a{display:none!important} 132 .gsc-input{background-image:none!important} 133 .gsc-input{background-color:transparent!important} 134 .gsc-input-box{background-color:transparent!important;border-bottom:0 solid #ff4500!important;border-width:0!important} 135 .gsc-input{border-width:0!important;color:#fff!important;font-size:16px !important;} 136 .gsc-adBlock{display:none!important} 137 .search-icon-desk{cursor:pointer} 138 .search-icon-desk{float:right;height:54px;margin-right:10px} 139 .search-icon-desk i{border:1px solid #ddd;border-radius:4px;color:#000;display:block;line-height:35px;margin-top:9px;padding:0 12px} 140 .search-icon-desk i:hover{color:#79655d} 141 .gsc-results-wrapper-overlay.gsc-results-wrapper-visible {width: 100%;left: 0;top: 0;height: 100%;} 142 .gcsc-branding {display: none;} 143 .gsc-search-button.gsc-search-button-v2{padding-left:20px;padding-right:20px;line-height:20px;display:inline-block!important;background:#0056e5;border-color:#0056e5; border-radius: 0 !important;} 144 .gsc-search-button{width:auto!important;float:right!important} 145 .gsc-search-button.gsc-search-button-v2:hover{background:#ddd!important} 146 .gsc-search-button-v2 svg{fill:#fff!important} 147 .gsc-search-button.gsc-search-button-v2:hover{background:#495e71 !important;border-color:#495e71 !important;} 148 .gsc-search-box.gsc-search-box-tools {background: white !important;margin-bottom: 0 !important;} 149 table.gsc-search-box {margin-bottom: 0;} 150 #gsc-i-id1 {color: #0d6efd !important;} 151 #gsc-i-id1::placeholder {color: #0d6efd !important;opacity: 0.5;} 152 </style> 153
153<script> 154 window.addEventListener('DOMContentLoaded', function(){ 155 setTimeout(function(){ 156 document.getElementById("gsc-i-id1").setAttribute("placeholder", "Search Here..."); 157 document.getElementsByClassName('gsc-search-button')[0].addEventListener('click', function() { 158 if (document.getElementById('gsc-i-id1').value == "") { 159 alert('<i class="fa fa-exclamation-circle fs-1 text-danger mb-3" aria-hidden="true"></i><br> Please write keyword to search.'); 160 } 161 }); 162 },1000); 163 }); 164 </script>
164 165 <!-- /search --> 166 167 </div> 168 </div> 169 <div class="col-lg-2"> 170 <div class="cus-social-links col-sm-12 float-sm-start d-flex justify-content-center d-sm-inline-block"> 171 <div class="float-sm-end"> 172 <a class="text-decoration-none text-light rounded ms-3 fs-4 d-inline-block lh-1 cus-social-1-133-icon" href="https://www.facebook.com/profile.php?id=100064601897460" target="_blank"><i class="fa fa-facebook-square text-red-hover" aria-hidden="true"></i></a> 173 <a class="text-decoration-none text-light rounded ms-3 fs-4 d-inline-block lh-1 cus-social-1-133-icon" href="https://twitter.com/parrotheadvol" target="_blank"><i class="fa fa-twitter-square text-red-hover" aria-hidden="true"></i></a> 174 175 </div> 176 </div> 177 </div> 178 </div> 179 <!-- logo--> 180 <div class="row pt-3 pb-2 mx-0 align-items-center mb-2"> 181 <div class="hpe-logo col-lg-6 px-lg-0"><div data-cms-el="logo">
181<script type="text/javascript" language="JavaScript">GetLogo();</script>
181</div></div> 182 <div class="col-lg-6 pe-lg-0 mt-2 mt-lg-0"><div data-cms-block="adgroup-15" data-cms-block-label="Advertisement 15" data-cms-el="adgroup" data-cms-adgroup="15">
182<script type="text/javascript" language="JavaScript">AdGroup15();</script>
182</div></div> 183 </div> 184 <!-- /top-links --> 185 186 <!-- menu --> 187 <div class="mb-4"> 188 <div class="col-12 px-0"> 189
189<script type="text/javascript" language="JavaScript"> 190 GetMenuH(); 191 </script>
191 192 </div> 193 </div> 194 <!-- /menu --> 195 196 </div> 197 <!-- top-links --> 198 </div> 199</div> 200 201 202 <div class="container-bl"> 203 <!-- /logo --> 204 205 <div class="row"> 206 <div class="col-lg-6 pe-0"><div data-cms-block="highlight-8" data-cms-block-label="Highlights 8" data-cms-el="highlight" data-cms-highlight="8">
206<script type="text/javascript" language="JavaScript">GetHighlights8();</script>
206</div> </div> 207 <div class="col-lg-6 ps-0"><div data-cms-block="highlight-5" data-cms-block-label="Highlights 5" data-cms-el="highlight" data-cms-highlight="5">
207<script type="text/javascript" language="JavaScript">GetHighlights5();</script>
207</div> </div> 208 </div> 209 <!-- <div class="col-lg-12 ps-0"></div>--> 210 <!-- 2-columns --> 211 <div class="cus-column-133-row row mb-4"> 212 <div class="cus-column-133-1 col-lg-9"> 213 <div data-sticky="10"> 214 <div class="row bg-white p-3 my-4 border rounded mx-0"> 215 <div class="col-lg-12"><div data-cms-popup-root="1"><style> 216#CustomForm {background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='32' viewBox='0 0 16 32'%3E%3Cg fill='%23c9d1cb' fill-opacity='0.16'%3E%3Cpath fill-rule='evenodd' d='M0 24h4v2H0v-2zm0 4h6v2H0v-2zm0-8h2v2H0v-2zM0 0h4v2H0V0zm0 4h2v2H0V4zm16 20h-6v2h6v-2zm0 4H8v2h8v-2zm0-8h-4v2h4v-2zm0-20h-6v2h6V0zm0 4h-4v2h4V4zm-2 12h2v2h-2v-2zm0-8h2v2h-2V8zM2 8h10v2H2V8zm0 8h10v2H2v-2zm-2-4h14v2H0v-2zm4-8h6v2H4V4zm0 16h6v2H4v-2zM6 0h2v2H6V0zm0 24h2v2H6v-2z'/%3E%3C/g%3E%3C/svg%3E");background-attachment: fixed;} 217.form-check-label:hover {color: #0d6efd;cursor: pointer;} 218.cus-form-loader .cus-form-loading {display: block !important;} 219.cus-form-loader .formbody fieldset, .cus-form-loader .system_text.footer_text {opacity: 0.5;pointer-events: none;} 220#cus-form-button-loader {display:none;} 221.cus-form-loader footer, .cus-form-loader button {cursor: no-drop;} 222.fast-spin {-webkit-animation: fa-spin 1s infinite linear;animation: fa-spin 1s infinite linear;} 223.cus-form-loader #SUBMIT1 {display:none;} 224.cus-form-loader #cus-form-button-loader {display:inline-block;} 225.form-floating > .form-control:focus ~ label {color: #0d6efd !important;} 226.form-control:not(:disabled):not([readonly])::file-selector-button {position: absolute;right: 0;border-radius: 5px !important;} 227.input-file-preview {display: none;} 228.input-file-preview img {max-width: 30%;max-height: 200px;border: 1px solid #ced4da;border-radius: 5px;padding: 5px;box-sizing: border-box;cursor: zoom-in;} 229.w-96 {width: 96% !important;} 230.p-valid {color: green;} 231.p-valid:before {position: relative;left: -10px;content: "â";} 232.p-invalid {color: red;} 233.p-invalid:before {position: relative;left: -10px;content: "â";font-size: 0.875rem !important;} 234.open-eye, .close-eye {position: absolute;right: 2%;top: 50%;transform: translate(0,-50%);cursor: pointer;} 235.open-eye i:hover, .close-eye i:hover {color: gray !important;} 236.cus-form-help:before {content: "\f05a";font-family: FontAwesome;padding-left: 0.5rem;padding-right: 0.5rem;} 237.cus-form-help {display: none;} 238.cus-form-help:empty {display: none !important;} 239.form-control:focus ~ .cus-form-help {display: block;} 240.formdivider.formdivider_custom {border-left: 5px solid #ffc107;} 241.form-floating > .form-control {caret-color: #0d6efd;} 242</style> 243<style id="force-form-styles" data-version="2026-01-26-v2"> 244 textarea, textarea.form-control, textarea.formfieldinput { min-height: 120px !important; height: 120px !important; } 245 246 /* Enhanced Spinner Styles - More visible and animated */ 247 .form-spinner-ring { 248 display: inline-block; 249 width: 18px; 250 height: 18px; 251 border: 3px solid rgba(255,255,255,0.4); 252 border-top-color: #fff; 253 border-radius: 50%; 254 animation: formSpin 0.7s linear infinite; 255 margin-right: 8px; 256 vertical-align: middle; 257 } 258 @keyframes formSpin { 259 0% { transform: rotate(0deg); } 260 100% { transform: rotate(360deg); } 261 } 262 263 /* Submit Button Loading State */ 264 button.btn-loading, input.btn-loading { 265 position: relative; 266 pointer-events: none; 267 opacity: 0.85; 268 } 269 button.btn-loading::after { 270 content: ''; 271 position: absolute; 272 width: 18px; 273 height: 18px; 274 top: 50%; 275 left: 12px; 276 margin-top: -9px; 277 border: 3px solid rgba(255,255,255,0.4); 278 border-top-color: #fff; 279 border-radius: 50%; 280 animation: formSpin 0.7s linear infinite; 281 } 282 283 /* Form Overlay during submission */ 284 .form-loading-overlay { 285 position: absolute; 286 top: 0; 287 left: 0; 288 right: 0; 289 bottom: 0; 290 background: rgba(255,255,255,0.7); 291 display: flex; 292 align-items: center; 293 justify-content: center; 294 z-index: 9999; 295 border-radius: inherit; 296 } 297 .form-loading-overlay .spinner-container { 298 display: flex; 299 flex-direction: column; 300 align-items: center; 301 gap: 12px; 302 padding: 30px; 303 background: white; 304 border-radius: 12px; 305 box-shadow: 0 4px 20px rgba(0,0,0,0.15); 306 } 307 .form-loading-overlay .spinner-large { 308 width: 40px; 309 height: 40px; 310 border: 4px solid #e0e0e0; 311 border-top-color: #007bff; 312 border-radius: 50%; 313 animation: formSpin 0.8s linear infinite; 314 } 315 .form-loading-overlay .loading-text { 316 color: #333; 317 font-size: 14px; 318 font-weight: 500; 319 } 320 321 /* Bootstrap 5 Floating Label Fix - Force proper behavior */ 322 .form-floating > .form-control:focus ~ label, 323 .form-floating > .form-control:not(:placeholder-shown) ~ label, 324 .form-floating > .form-select ~ label { 325 opacity: 0.65 !important; 326 transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem) !important; 327 } 328 .form-floating > .form-control::placeholder { 329 color: transparent !important; 330 } 331 .form-floating > label { 332 position: absolute !important; 333 top: 0 !important; 334 left: 0 !important; 335 height: 100% !important; 336 padding: 1rem 0.75rem !important; 337 pointer-events: none !important; 338 border: 1px solid transparent !important; 339 transform-origin: 0 0 !important; 340 transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out !important; 341 } 342 </style> 343<style>.grecaptcha-badge{visibility:hidden!important;position:fixed!important;bottom:14px!important;right:14px!important;}</style>
344<script src="/iframe-resizer-master/js/iframeResizer.contentWindow.js"></script>
vendor: 1 bytes, line 344
344
345<script type="text/javascript" language="javascript" src="https://tricitiessports.com/lib/bl.js"></script>
vendor: 1 bytes, line 345
345
346<script> 347function ChangeInputFocus(obj, evt, cname) { 348/*if (evt.type == "focus") 349obj.className = cname; 350else if (evt.type == "blur") 351/*obj.className = cname;*/ 352} 353</script>
vendor: 1 bytes, line 353
353
354<script src="https://recaptcha.net/recaptcha/api.js?render=6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM"></script>
vendor: 1 bytes, line 354
354
355<script> 356(function(){ 357 function setToken(t){ 358 var els = document.querySelectorAll('.g-recaptcha-token'); 359 for (var i = 0; i < els.length; i++) els[i].value = t; 360 } 361 function refresh(){ 362 if (typeof grecaptcha === 'undefined') return; 363 grecaptcha.ready(function(){ 364 grecaptcha.execute('6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM', {action: 'submit'}).then(setToken); 365 }); 366 } 367 // Submit-time minter. Login pages call this in their submit handler and await it, 368 // so the request always carries a freshly-minted token instead of reading the 369 // pre-filled hidden field â which may still be empty when a user with saved 370 // credentials presses Enter before the page-load mint resolves (-> recaptcha_missing, 371 // a hard block). Resolves to a fresh token, or falls back to whatever's already in 372 // the field (and never hangs the form: 3s timeout, and resolves if grecaptcha is 373 // unavailable). Also updates the hidden field so FormData-based submits pick it up. 374 window.cmsMintCaptchaToken = function(){ 375 return new Promise(function(resolve){ 376 var els = document.querySelectorAll('.g-recaptcha-token'); 377 var fallback = (els[0] && els[0].value) || ''; 378 var done = false; 379 var to = setTimeout(function(){ if(!done){ done = true; resolve(fallback); } }, 3000); 380 function fin(v){ if(done) return; done = true; clearTimeout(to); setToken(v); resolve(v); } 381 function attempt(){ 382 if (typeof grecaptcha === 'undefined' || !grecaptcha.execute) return false; 383 try { 384 grecaptcha.ready(function(){ 385 grecaptcha.execute('6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM', {action: 'submit'}) 386 .then(function(t){ fin(t || fallback); }) 387 .catch(function(){ fin(fallback); }); 388 }); 389 return true; 390 } catch(_) { return false; } 391 } 392 // grecaptcha may still be loading -- common when the form is rendered 393 // inside a popup, where api.js was injected only moments ago. Poll until 394 // it's ready (or the 3s timeout fires) instead of bailing immediately. 395 if (!attempt()) { 396 var iv = setInterval(function(){ 397 if (done) { clearInterval(iv); return; } 398 if (attempt()) clearInterval(iv); 399 }, 150); 400 } 401 }); 402 }; 403 refresh(); 404 setTimeout(refresh, 5000); 405 setInterval(refresh, 120000); 406})(); 407</script>
407 408<div class="formbody"> 409<div class="body p-2"> 410<!--FormError--> 411<!--FormMessage--> 412<form class="custom-form p-3 mx-0 border rounded" enctype="multipart/form-data" autocomplete="off" id="CustomForm" method="post" name="CustomForm" onsubmit="return unifiedSubmitForm(event)"> 413<div aria-hidden="true" style="position:absolute;left:-9999px;top:-9999px;height:0;width:0;overflow:hidden;"> 414 <label for="website_url_hp">Website (leave blank)</label> 415 <input type="text" name="website_url" id="website_url_hp" tabindex="-1" autocomplete="off" value=""> 416</div> 417<input type="hidden" name="token" class="g-recaptcha-token" value=""> 418<!--FKeys--> 419<input type="hidden" name="SystemEmailSubject" value="mywebsite.com: Contact Us"> 420<input type="hidden" name="SystemEmailConfirmMessage" value="Your message has been forwarded to appropriate personnel. <br><br>Thank you."> 421<input type="hidden" name="SystemEmailFormat" value="HTML"> 422<input type="hidden" name="SystemEmailTo" value="[email protected]"> 423<input type="hidden" name="SystemEmailCC" value="[email protected]"> 424<center class="fw-bold mb-3 fs-3 text-secondary">ContactUs</center> 425<fieldset> 426<div class="system_text Header_text mb-5 text-center"><html> 427 <head> 428 <link href="asp.css" rel="stylesheet"> 429 </head> 430 <body > 431 <div align="left" class="d-none"><font class="CH2"><b>CONTACT US:</b></font> </div> 432 <div align="left"> </div> 433 <div align="left">PLEASE NOTE: Use this form for letters to departments. You may also use this form to submit story ideas to the editor, request information about advertising, let us know of a sports event or send  LETTERS TO THE EDITOR.</div> 434 <div align="left"> </div> 435 <div align="left">If you have questions or a problem to discuss, please call 423-676-5470.</div> 436 437<!-- Form Script v2026-01-26-v2 --> 438<!-- Modern Popup Modal for Messages --> 439<div id="form-message-modal" style="display:none; position:fixed; inset:0; background:rgba(0,0,0,0.7); z-index:99999; align-items:center; justify-content:center; padding:20px;"> 440 <div style="background:#fff; min-width:320px; max-width:400px; border-radius:12px; padding:24px; box-shadow:0 25px 50px -12px rgba(0,0,0,0.5);"> 441 <div id="form-message-text" style="margin-bottom:20px; font-size:15px; color:#333; text-align:center; line-height:1.5;"></div> 442 <button id="form-message-ok" style="width:100%; padding:12px 20px; font-size:14px; font-weight:600; background:#007bff; color:white; border:none; border-radius:8px; cursor:pointer; transition:all 0.2s ease;" onmouseover="this.style.background='#0056b3'" onmouseout="this.style.background='#007bff'">OK</button> 443 </div> 444</div> 445
446<script> 447// Resolve the URL to POST the form to. On a normal page load the form lives at 448// its own URL, so window.location.pathname is correct. But when the form is 449// opened inside a popup (sys-popup.js), the page URL is the HOST page, not the 450// form's URL -- sys-popup stamps the real form path onto the form as 451// data-form-action, which we prefer when present. 452function cmsResolvePostUrl(form) { 453 var f = form || document.querySelector('form'); 454 var a = f && f.getAttribute && f.getAttribute('data-form-action'); 455 return a || window.location.pathname; 456} 457 458// Modern message popup function 459// onClose callback is called when user clicks OK (useful for resetting button on error) 460function showFormMessage(text, isSuccess = false, onClose = null) { 461 const modal = document.getElementById('form-message-modal'); 462 const modalMsg = document.getElementById('form-message-text'); 463 const modalOk = document.getElementById('form-message-ok'); 464 465 if (modal && modalMsg && modalOk) { 466 modalMsg.innerHTML = isSuccess 467 ? '<div style="display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:20px;"><div style="width:50px;height:50px;background:linear-gradient(135deg,#28a745,#20c997);border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 15px rgba(40,167,69,0.3);flex-shrink:0;"><span style="color:white;font-size:28px;font-weight:bold;">â</span></div><span style="color:#28a745;font-size:28px;font-weight:600;">Success</span></div>' + text 468 : text; 469 modal.style.display = 'flex'; 470 modalOk.onclick = function() { 471 modal.style.display = 'none'; 472 if (isSuccess) { 473 (window.top || window).location.href = '/'; 474 } else if (onClose) { 475 onClose(); 476 } 477 }; 478 // Also close on backdrop click 479 modal.onclick = function(e) { 480 if (e.target === modal) { 481 modal.style.display = 'none'; 482 if (isSuccess) { 483 (window.top || window).location.href = '/'; 484 } else if (onClose) { 485 onClose(); 486 } 487 } 488 }; 489 } else { 490 // Fallback to alert if modal not found 491 alert(text); 492 if (isSuccess) { 493 (window.top || window).location.href = '/'; 494 } else if (onClose) { 495 onClose(); 496 } 497 } 498} 499 500// Accept.js card input modal for Authorize.net 501async function showAcceptJsCardInput(clientConfig, form, originalFormData, paymentResult) { 502 console.log('[forms] Loading Accept.js for card tokenization'); 503 504 // Load Accept.js script dynamically 505 if (!window.Accept) { 506 await new Promise((resolve, reject) => { 507 const script = document.createElement('script'); 508 script.src = clientConfig.jsUrl; 509 script.onload = resolve; 510 script.onerror = () => reject(new Error('Failed to load Accept.js')); 511 document.head.appendChild(script); 512 }); 513 } 514 515 // Create card input modal 516 const modalHtml = ` 517 <div id="acceptjs-modal" style="position:fixed;inset:0;background:rgba(0,0,0,0.7);z-index:99999;display:flex;align-items:center;justify-content:center;padding:20px;"> 518 <div style="background:#fff;max-width:400px;width:100%;border-radius:12px;padding:30px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5);"> 519 <h3 style="margin:0 0 20px;color:#333;">Payment Information</h3> 520 <p style="margin:0 0 20px;color:#666;">Amount: <strong>$${paymentResult.amount}</strong></p> 521 522 <div style="margin-bottom:15px;"> 523 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Card Number *</label> 524 <input type="text" id="ajs-card-number" placeholder="4111 1111 1111 1111" maxlength="19" 525 style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;box-sizing:border-box;"> 526 </div> 527 528 <div style="display:flex;gap:15px;margin-bottom:15px;"> 529 <div style="flex:1;"> 530 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Exp Month *</label> 531 <select id="ajs-exp-month" style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;"> 532 <option value="">MM</option> 533 ${[...Array(12)].map((_,i) => '<option value="'+String(i+1).padStart(2,'0')+'">'+String(i+1).padStart(2,'0')+'</option>').join('')} 534 </select> 535 </div> 536 <div style="flex:1;"> 537 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Exp Year *</label> 538 <select id="ajs-exp-year" style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;"> 539 <option value="">YYYY</option> 540 ${[...Array(15)].map((_,i) => { const y=new Date().getFullYear()+i; return '<option value="'+y+'">'+y+'</option>'; }).join('')} 541 </select> 542 </div> 543 <div style="width:100px;"> 544 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">CVV *</label> 545 <input type="text" id="ajs-cvv" placeholder="123" maxlength="4" 546 style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;box-sizing:border-box;"> 547 </div> 548 </div> 549 550 <div id="ajs-error" style="color:#dc3545;margin-bottom:15px;
550display:none;"></div> 551 552 <div style="display:flex;gap:10px;"> 553 <button type="button" id="ajs-cancel" style="flex:1;padding:12px;background:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:16px;">Cancel</button> 554 <button type="button" id="ajs-submit" style="flex:1;padding:12px;background:#28a745;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:16px;">Pay Now</button> 555 </div> 556 </div> 557 </div> 558 `; 559 560 document.body.insertAdjacentHTML('beforeend', modalHtml); 561 562 const modal = document.getElementById('acceptjs-modal'); 563 const cardInput = document.getElementById('ajs-card-number'); 564 const cvvInput = document.getElementById('ajs-cvv'); 565 const errorDiv = document.getElementById('ajs-error'); 566 567 // Format card number 568 cardInput.addEventListener('input', function(e) { 569 let v = e.target.value.replace(/\s+/g, '').replace(/[^0-9]/g, ''); 570 let f = ''; 571 for (let i = 0; i < v.length; i++) { if (i > 0 && i % 4 === 0) f += ' '; f += v[i]; } 572 e.target.value = f; 573 }); 574 575 // Only numbers in CVV 576 cvvInput.addEventListener('input', function(e) { 577 e.target.value = e.target.value.replace(/[^0-9]/g, ''); 578 }); 579 580 // Cancel button - also reset the submit button 581 document.getElementById('ajs-cancel').onclick = function() { 582 modal.remove(); 583 // Reset the original form's submit button 584 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 585 if (submitBtn) { 586 submitBtn.disabled = false; 587 if (submitBtn.tagName === 'INPUT') { 588 submitBtn.value = 'Submit'; 589 } else { 590 submitBtn.innerHTML = 'Submit'; 591 } 592 } 593 }; 594 595 // Submit button 596 document.getElementById('ajs-submit').onclick = async function() { 597 const cardNumber = cardInput.value.replace(/\s+/g, ''); 598 const expMonth = document.getElementById('ajs-exp-month').value; 599 const expYear = document.getElementById('ajs-exp-year').value; 600 const cvv = cvvInput.value; 601 602 // Validate 603 if (!cardNumber || cardNumber.length < 13) { 604 errorDiv.textContent = 'Please enter a valid card number'; 605 errorDiv.style.display = 'block'; 606 return; 607 } 608 if (!expMonth || !expYear) { 609 errorDiv.textContent = 'Please select expiration date'; 610 errorDiv.style.display = 'block'; 611 return; 612 } 613 if (!cvv || cvv.length < 3) { 614 errorDiv.textContent = 'Please enter CVV'; 615 errorDiv.style.display = 'block'; 616 return; 617 } 618 619 errorDiv.style.display = 'none'; 620 this.disabled = true; 621 this.innerHTML = '<span class="form-spinner-ring" style="border-color:rgba(255,255,255,0.4);border-top-color:#fff;"></span> Processing...'; 622 623 // Test card detection - skip Accept.js tokenization 624 var TEST_CARDS_V3 = ['4111111111111111', '4000000000000000', '5500000000000004', '370000000000002', '6011000000000004']; 625 if (TEST_CARDS_V3.indexOf(cardNumber) !== -1) { 626 console.log('[forms] Test card detected - skipping tokenization'); 627 originalFormData.append('dataDescriptor', 'TEST_CARD'); 628 originalFormData.append('dataValue', 'TEST'); 629 originalFormData.append('pf-card-number-input', cardNumber); 630 631 try { 632 const testResp = await fetch(cmsResolvePostUrl(), { 633 method: 'POST', 634 body: originalFormData, 635 headers: { 'Accept': 'application/json' } 636 }); 637 const testResult = await testResp.json(); 638 modal.remove(); 639 if (testResult.success && testResult.isPaymentComplete) { 640 if (testResult.subscriberToken) { 641 try { 642 var tp2 = JSON.parse(atob(testResult.subscriberToken.split('.')[1])); 643 var ma2 = tp2.exp ? (tp2.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 644 document.cookie = 'subscriber_token=' + encodeURIComponent(testResult.subscriberToken) + '; path=/; max-age=' + ma2 + '; SameSite=Lax'; 645 } catch (e) { /* ignore */ } 646 } 647 var msg = testResult.confirmMessage 648 ? testResult.confirmMessage + '<br><br><small>Transaction ID: ' + testResult.transactionId + '</small>' 649 : 'Test payment successful! Transaction ID: ' + testResult.transactionId; 650 var retUrl = null; 651 try { retUrl = localStorage.getItem('subscriber_return_url'); } catch (e) { /* ignore */ } 652 if (!retUrl) { try { retUrl = new URLSearchParams(window.location.search).get('return_url'); } catch (e) { /* ignore */ } } 653 if (retUrl) { 654 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 655 msg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 656 showFormMessage(msg, true); 657 setTimeout(function() { window.location.href = retUrl; }, 2000); 658 } else { 659 showFormMessage(msg, true); 660 } 661 form.reset(); 662 } else { 663 showFormMessage(testResult.error || 'Payment failed.', false); 664 } 665 } catch (e) { 666 modal.remove(); 667 showFormMessage('Network error. Please try again.', false); 668 } 669 return; 670 } else { 671 // Build Accept.js request 672 const secureData = { 673 authData: { 674 clientKey: clientConfig.clientKey, 675 apiLoginID: clientConfig.apiLoginId 676 }, 677 cardData: { 678 cardNumber: cardNumber, 679 month: expMonth, 680 year: expYear, 681 cardCode: cvv 682 } 683 }; 684 685 // Tokenize via Accept.js 686 Accept.dispatchData(secureData, async function(response) { 687 if (response.messages.resultCode === 'Error') { 688 const errorText = response.messages.message.map(m => m.text).join(', '); 689 errorDiv.textContent = errorText; 690 errorDiv.style.display = 'block'; 691 const ajsBtn = document.getElementById('ajs-submit'); 692 ajsBtn.disabled = false;
693 ajsBtn.innerHTML = 'Pay Now'; 694 return; 695 } 696 697 console.log('[forms] Card tokenized successfully, resubmitting form'); 698 699 // Add token to form data and resubmit 700 originalFormData.append('dataDescriptor', response.opaqueData.dataDescriptor); 701 originalFormData.append('dataValue', response.opaqueData.dataValue); 702 703 try { 704 const response2 = await fetch(cmsResolvePostUrl(), { 705 method: 'POST', 706 body: originalFormData, 707 headers: { 'Accept': 'application/json' } 708 }); 709 const result2 = await response2.json(); 710 711 modal.remove(); 712 713 // Get the submit button to reset on error 714 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 715 const resetButton = function() { 716 if (submitBtn) { 717 submitBtn.disabled = false; 718 if (submitBtn.tagName === 'INPUT') { 719 submitBtn.value = 'Submit'; 720 } else { 721 submitBtn.innerHTML = 'Submit'; 722 } 723 } 724 }; 725 726 if (result2.success && result2.isPaymentComplete) { 727 // Auto-login: set subscriber_token cookie if provided 728 if (result2.subscriberToken) { 729 try { 730 var tp = JSON.parse(atob(result2.subscriberToken.split('.')[1])); 731 var ma = tp.exp ? (tp.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 732 document.cookie = 'subscriber_token=' + encodeURIComponent(result2.subscriberToken) + '; path=/; max-age=' + ma + '; SameSite=Lax'; 733 console.log('[forms] Auto-login: subscriber_token cookie set (Accept.js path)'); 734 } catch (e) { console.warn('[forms] Auto-login cookie error', e); } 735 } 736 // Build success message with custom confirm message if available 737 let successMsg = 'Payment successful! Transaction ID: ' + result2.transactionId; 738 if (result2.confirmMessage) { 739 successMsg = result2.confirmMessage + '<br><br><small>Transaction ID: ' + result2.transactionId + '</small>'; 740 } 741 var retUrl2 = null; 742 try { retUrl2 = localStorage.getItem('subscriber_return_url'); } catch (e) { /* ignore */ } 743 if (!retUrl2) { try { retUrl2 = new URLSearchParams(window.location.search).get('return_url'); } catch (e) { /* ignore */ } } 744 if (retUrl2) { 745 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 746 successMsg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 747 showFormMessage(successMsg, true); 748 setTimeout(function() { window.location.href = retUrl2; }, 2000); 749 } else { 750 showFormMessage(successMsg, true); 751 } 752 form.reset(); 753 } else { 754 showFormMessage(result2.error || 'Payment failed. Please try again.', false, resetButton); 755 } 756 } catch (e) { 757 modal.remove(); 758 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 759 showFormMessage('Network error. Please try again.', false, function() { 760 if (submitBtn) { 761 submitBtn.disabled = false; 762 if (submitBtn.tagName === 'INPUT') { 763 submitBtn.value = 'Submit'; 764 } else { 765 submitBtn.innerHTML = 'Submit'; 766 } 767 } 768 }); 769 } 770 }); 771 } // end else (real card tokenization) 772 }; 773} 774 775// Initialize File Uploader on load to handle image cropping/uploading. 776// Defined as a named function (not an inline DOMContentLoaded callback) so it can 777// also run immediately when the DOM is ALREADY parsed -- e.g. when this form is 778// injected into a popup after DOMContentLoaded has already fired. Without that, 779// the uploader (image cropper) never initializes inside the modal. 780async function cmsInitFormUploader() { 781 // Restore form data if user cancelled payment 782 try { 783 const pendingData = sessionStorage.getItem('_pendingFormData'); 784 if (pendingData) { 785 const formData = JSON.parse(pendingData); 786 const form = document.getElementById('CustomForm') || document.querySelector('form'); 787 if (form) { 788 for (const [key, value] of Object.entries(formData)) { 789 if (value && typeof value === 'string') { 790 const field = form.querySelector('[name="' + key + '"]'); 791 if (field) { 792 if (field.tagName === 'SELECT') { 793 field.value = value; 794 } else if (field.type !== 'file' && field.type !== 'hidden') { 795 field.value = value; 796 } 797 } 798 } 799 } 800 console.log('[forms] Restored form data from cancelled payment'); 801 } 802 // Clear the stored data 803 sessionStorage.removeItem('_pendingFormData'); 804 sessionStorage.removeItem('_pendingFormUrl'); 805 } 806 } catch (e) { 807 console.error('[forms] Error restoring form data:', e); 808 } 809 810 try { 811 const { UnifiedFileUploader } = await import('/sys-components-UnifiedFileUploader.js?v=' + Date.now()); 812 window.unifiedUploader = new UnifiedFileUploader(); 813 window.unifiedUploader.init(); 814 } catch (e) { 815 console.error('Failed to init uploader:', e); 816 } 817}
818// Normal page load: wait for DOMContentLoaded. Popup: the form is injected after 819// DOMContentLoaded already fired, so run immediately when the DOM is already 820// parsed -- otherwise the uploader (image cropper) never initializes in the 821// modal. The earlier empty-box / stuck-button symptom was FontAwesome 4 vs 6 822// (the FA6 spinner glyph was missing); the form now injects FA6, so the cropper 823// controls and spinner render and the uploader completes normally here too. 824if (document.readyState === 'loading') { 825 document.addEventListener('DOMContentLoaded', cmsInitFormUploader); 826} else { 827 cmsInitFormUploader(); 828} 829 830async function unifiedSubmitForm(event) { 831 console.log('[forms] unifiedSubmitForm called v5 - 2026-01-26 Enhanced spinner'); 832 if (event) { event.preventDefault(); event.stopPropagation(); } 833 834 // Use event.target if available (most reliable) 835 const form = (event && event.target && event.target.tagName === 'FORM') ? event.target : (document.getElementById('CustomForm') || document.querySelector('form')); 836 837 // Enforce native constraint validation (required / type=email / pattern ...) 838 // BEFORE anything else. This handler preventDefault()s the native submit on its 839 // first line, which also bypasses the browser's own required-field check -- so 840 // without this call a blank required field would fetch-POST straight through 841 // (legacy custom forms had no client-side guard at all). reportValidity() focuses 842 // the first invalid field, shows the browser's validation bubble, and bails. 843 // Runs before the submit button is put into its spinner/disabled state so a 844 // blocked submit leaves the form fully usable. 845 if (form && typeof form.reportValidity === 'function' && !form.reportValidity()) { 846 return false; 847 } 848 849 // Ensure any processed files are in the form before submission 850 if (window.unifiedUploader && window.unifiedUploader.ensureProcessedFilesInForm) { 851 window.unifiedUploader.ensureProcessedFilesInForm(); 852 } 853 854 const btn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 855 const originalHtml = btn ? (btn.tagName === 'INPUT' ? btn.value : btn.innerHTML) : 'Submit'; 856 857 // Show loading state with spinner 858 if (btn) { 859 btn.disabled = true; 860 if (btn.tagName === 'INPUT') { 861 // Inputs can't hold an inline span, so use the class-based ::after spinner. 862 btn.classList.add('btn-loading'); 863 btn.value = ' Processing...'; 864 btn.style.paddingLeft = '35px'; 865 } else { 866 // Buttons: the inline ring span is the single spinner. Do NOT add the 867 // btn-loading class here -- button.btn-loading::after renders a SECOND 868 // spinner, which produced two spinning icons at once on submit. Keep the 869 // disabled look via inline styles instead (robust even in popups where the 870 // injected spinner CSS may be absent). 871 btn.style.pointerEvents = 'none'; 872 btn.style.opacity = '0.85'; 873 btn.innerHTML = '<span class="form-spinner-ring"></span> Processing...'; 874 } 875 } 876 877 // Single spinner only: the disabled submit button already shows a spinner 878 // ("Processing..."), so we intentionally do NOT add the full-form overlay 879 // spinner here -- it produced two spinning icons at once (most visible in the 880 // popup). overlay stays null; the cleanup checks below are guarded for it. 881 let overlay = null; 882 try { 883 // Mint a fresh reCAPTCHA token before reading the form. On popup-rendered 884 // forms the on-load mint may not have fired yet (api.js was injected only 885 // moments ago by sys-popup's executeScripts), so without this the hidden 886 // token field is still empty and the server blocks as recaptcha_missing. 887 if (typeof window.cmsMintCaptchaToken === 'function') { 888 try { await window.cmsMintCaptchaToken(); } catch (e) {} 889 } 890 const formData = new FormData(form); 891 892 // Capture display TEXT for all select, radio, and checkbox elements 893 // Add as fieldname_text so email shows human-readable labels instead of raw values 894 form.querySelectorAll('select').forEach(function(select) { 895 if (select.name && select.selectedIndex >= 0) { 896 if (select.multiple) { 897 // Multi-select: join the text of EVERY selected option, not just the first 898 var multiTexts = Array.prototype.map.call(select.selectedOptions, function(o) { return o.text; }); 899 formData.append(select.name + '_text', multiTexts.join(', ')); 900 } else { 901 const selectedOption = select.options[select.selectedIndex]; 902 if (selectedOption) { 903 formData.append(select.name + '_text', selectedOption.text); 904 } 905 } 906 } 907 }); 908 // Capture checked radio button labels 909 var radiosDone = {}; 910 form.querySelectorAll('input[type="radio"]:checked').forEach(function(radio) { 911 if (radio.name && !radiosDone[radio.name]) { 912 radiosDone[radio.name] = true; 913 var label = form.querySelector('label[for="' + radio.id + '"]'); 914 if (label) { 915 formData.append(radio.name + '_text', label.textContent.trim()); 916 } 917 } 918 }); 919 // Capture checked checkbox labels 920 var checkboxTexts = {}; 921 form.querySelectorAll('input[type="checkbox"]:checked').forEach(function(cb) { 922 if (cb.name) { 923 var cleanName = cb.name.replace('[]', ''); 924 var label = form.querySelector('label[for="' + cb.id + '"]'); 925 var text = label ? label.textContent.trim() : (cb.value === 'on' ? 'Yes' : cb.value); 926 if (!checkboxTexts[cleanName]) checkboxTexts[cleanName] = []; 927 checkboxTexts[cleanName].push(text); 928 } 929 });
930 Object.keys(checkboxTexts).forEach(function(name) { 931 formData.append(name + '_text', checkboxTexts[name].join(', ')); 932 }); 933 const response = await fetch(cmsResolvePostUrl(form), { 934 method: 'POST', 935 body: formData, 936 headers: { 'Accept': 'application/json' } 937 }); 938 const result = await response.json(); 939 console.log('[forms] v3 Server response:', JSON.stringify(result)); 940 console.log('[forms] v3 Keys in result:', Object.keys(result).join(', ')); 941 console.log('[forms] v3 requiresCardInput:', result.requiresCardInput, 'clientConfig:', !!result.clientConfig); 942 console.log('[forms] v3 isPaymentRedirect:', result.isPaymentRedirect, 'redirectUrl:', result.redirectUrl); 943 if (result.success) { 944 // PRIORITY 0: Check if payment is already complete (Authorize.net Accept.js) 945 if (result.isPaymentComplete) { 946 console.log('[forms] Payment complete! Transaction:', result.transactionId); 947 948 // Auto-login: set subscriber_token cookie if provided 949 if (result.subscriberToken) { 950 try { 951 var tokenPayload = JSON.parse(atob(result.subscriberToken.split('.')[1])); 952 var maxAge = tokenPayload.exp ? (tokenPayload.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 953 document.cookie = 'subscriber_token=' + encodeURIComponent(result.subscriberToken) + '; path=/; max-age=' + maxAge + '; SameSite=Lax'; 954 console.log('[forms] Auto-login: subscriber_token cookie set'); 955 } catch (e) { 956 console.warn('[forms] Auto-login: failed to set cookie', e); 957 } 958 } 959 960 // Build success message with custom confirm message if available 961 let successMsg = 'Payment successful! Transaction ID: ' + result.transactionId; 962 if (result.confirmMessage) { 963 successMsg = result.confirmMessage + '<br><br><small>Transaction ID: ' + result.transactionId + '</small>'; 964 } 965 966 // Redirect back to article if return URL is available (from paywall subscribe flow) 967 var returnUrl = null; 968 try { 969 returnUrl = localStorage.getItem('subscriber_return_url'); 970 } catch (e) { /* ignore */ } 971 // Also check URL query param 972 if (!returnUrl) { 973 try { 974 var params = new URLSearchParams(window.location.search); 975 returnUrl = params.get('return_url'); 976 } catch (e) { /* ignore */ } 977 } 978 979 if (returnUrl) { 980 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 981 // Show brief success message then redirect 982 successMsg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 983 showFormMessage(successMsg, true); 984 setTimeout(function() { window.location.href = returnUrl; }, 2000); 985 } else { 986 showFormMessage(successMsg, true); 987 } 988 form.reset(); 989 return; 990 } 991 992 // PRIORITY 1: Check for payment redirect FIRST (Stripe Checkout) 993 // Payment forms MUST redirect to the payment gateway before showing any message 994 if (result.isPaymentRedirect && result.redirectUrl) { 995 console.log('[forms] Payment redirect detected, redirecting to:', result.redirectUrl); 996 window.location.href = result.redirectUrl; 997 return; 998 } 999 1000 // PRIORITY 1.5: Check if card input is required (Authorize.net Accept.js)
1001 console.log('[forms] v3 Checking requiresCardInput:', result.requiresCardInput, 'clientConfig exists:', !!result.clientConfig); 1002 if (result.requiresCardInput && result.clientConfig) { 1003 console.log('[forms] v3 Card input required! Showing Accept.js modal...'); 1004 try { 1005 await showAcceptJsCardInput(result.clientConfig, form, formData, result); 1006 console.log('[forms] v3 showAcceptJsCardInput completed'); 1007 } catch (modalError) { 1008 console.error('[forms] v3 showAcceptJsCardInput error:', modalError); 1009 } 1010 return; 1011 } 1012 1013 // PRIORITY 2: Check for regular redirect URL 1014 if (result.redirectUrl && result.redirectUrl !== window.location.href) { 1015 console.log('[forms] Redirecting to:', result.redirectUrl); 1016 window.location.href = result.redirectUrl; 1017 return; 1018 } 1019 1020 // PRIORITY 3: Show thanks content (email_confirm_message, etc.) 1021 if (result.thanksContent) { 1022 // CRITICAL: Scroll to top BEFORE replacing content to avoid layout shifts 1023 window.scrollTo({ top: 0, behavior: 'smooth' }); 1024 1025 // Check if standalone thank you page is requested 1026 if (result.standaloneThankYou) { 1027 // Replace entire page content with standalone thank you page 1028 document.body.innerHTML = '<div style="min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f5f5f5;padding:20px;"><div style="max-width:800px;width:100%;background:#fff;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,0.1);padding:40px;">' + result.thanksContent + '</div></div>'; 1029 window.scrollTo({ top: 0, behavior: 'instant' }); 1030 return; 1031 } 1032 1033 // Replace form content with thanks message (embedded mode) 1034 form.innerHTML = '<div id="form-thanks-message" style="padding:40px;text-align:center;min-height:200px">' + result.thanksContent + '</div>'; 1035 1036 // CRITICAL: Force scroll to top using multiple methods for maximum compatibility 1037 const forceScrollToTop = () => { 1038 console.log('[forms] Executing robust scroll-to-top'); 1039 1040 // 1. Standard window scroll 1041 window.scrollTo({ top: 0, behavior: 'smooth' }); 1042 1043 // 2. Element-based scroll (most reliable when embedded) 1044 const thanksEl = document.getElementById('form-thanks-message'); 1045 if (thanksEl) { 1046 thanksEl.scrollIntoView({ behavior: 'smooth', block: 'start' }); 1047 } 1048 1049 // 3. Recursive parent scroll (for nested scrollable containers) 1050 try { 1051 let parent = form.parentElement; 1052 while (parent && parent !== document.body) { 1053 if (parent.scrollHeight > parent.clientHeight) { 1054 console.log('[forms] Resetting parent scroll:', parent); 1055 parent.scrollTop = 0; 1056 } 1057 parent = parent.parentElement; 1058 } 1059 } catch (e) {} 1060 1061 // 4. Fallback for older/mobile browsers 1062 document.body.scrollTop = 0; 1063 document.documentElement.scrollTop = 0; 1064 1065 // 5. Hash trick to force top 1066 if (window.location.hash !== '') { 1067 window.location.hash = ''; 1068 } 1069 1070 // 6. If inside iframe, try to scroll parent window 1071 try { 1072 if (window.parent && window.parent !== window) { 1073 window.parent.scrollTo({ top: 0, behavior: 'smooth' }); 1074 } 1075 } catch (e) {} 1076 }; 1077 1078 // Execute in multiple phases to ensure layout is settled 1079 forceScrollToTop(); 1080 requestAnimationFrame(forceScrollToTop); 1081 setTimeout(forceScrollToTop, 100); 1082 setTimeout(forceScrollToTop, 500); 1083 setTimeout(forceScrollToTop, 1000); 1084 setTimeout(forceScrollToTop, 2000); 1085 } else { 1086 // Default: redirect to home 1087 window.location.href = "/"; 1088 } 1089 } else { 1090 // Remove overlay and reset button on error 1091 if (overlay && overlay.parentNode) overlay.remove(); 1092 showFormMessage(result.error || "Submission failed"); 1093 if (btn) { 1094 btn.disabled = false;
1095 btn.classList.remove('btn-loading'); 1096 btn.style.paddingLeft = ''; 1097 btn.style.pointerEvents = ''; 1098 btn.style.opacity = ''; 1099 if (btn.tagName === 'INPUT') { 1100 btn.value = originalHtml; 1101 } else { 1102 btn.innerHTML = originalHtml; 1103 } 1104 } 1105 } 1106 } catch (e) { 1107 console.error(e); 1108 // Remove overlay and reset button on network error 1109 if (overlay && overlay.parentNode) overlay.remove(); 1110 showFormMessage("Network error. Please check your connection and try again."); 1111 if (btn) { 1112 btn.disabled = false; 1113 btn.classList.remove('btn-loading'); 1114 btn.style.paddingLeft = ''; 1115 btn.style.pointerEvents = ''; 1116 btn.style.opacity = ''; 1117 if (btn.tagName === 'INPUT') { 1118 btn.value = originalHtml; 1119 } else { 1120 btn.innerHTML = originalHtml; 1121 } 1122 } 1123 } 1124 return false; 1125} 1126 1127// ========== STRIPE PAYMENT SUCCESS HANDLER ========== 1128// Check for payment success redirect from Stripe on page load 1129(function checkStripePaymentSuccess() { 1130 const urlParams = new URLSearchParams(window.location.search); 1131 const paymentStatus = urlParams.get('payment'); 1132 const sessionId = urlParams.get('session_id'); 1133 const returnUrl = urlParams.get('return_url'); 1134 1135 if (paymentStatus === 'success' && sessionId) { 1136 console.log('[forms] Detected Stripe payment success, session:', sessionId); 1137 console.log('[forms] Return URL:', returnUrl || 'none'); 1138 1139 // Show loading message 1140 showFormMessage('Processing payment confirmation...'); 1141 1142 // Fetch session details from our API 1143 fetch((typeof __CMS_BASE_PATH !== 'undefined' ? __CMS_BASE_PATH : '') + '/api/payment/session/' + encodeURIComponent(sessionId)) 1144 .then(response => response.json()) 1145 .then(data => { 1146 if (data.success) { 1147 const amount = data.amount ? '$' + parseFloat(data.amount).toFixed(2) : ''; 1148 const txId = data.transaction_id || sessionId; 1149 1150 // Build success message 1151 let msg = '<div style="margin-bottom:15px;font-size:16px;">Your subscription has been activated!</div>'; 1152 msg += '<div style="margin-bottom:15px;font-size:18px;font-weight:600;">Thank you for subscribing.</div>'; 1153 if (amount) { 1154 msg += '<div style="margin-bottom:10px;color:#666;">Amount: <strong>' + amount + '</strong></div>'; 1155 } 1156 if (data.description && data.description !== 'Payment') { 1157 msg += '<div style="margin-bottom:10px;color:#666;">Plan: <strong>' + data.description + '</strong></div>'; 1158 } 1159 msg += '<div style="background:#e8f5e9;padding:10px;border-radius:4px;margin-top:15px;"><strong>Transaction ID:</strong> <span style="font-family:monospace;user-select:all;">' + txId + '</span></div>'; 1160 1161 // If there's a return URL, add redirect notice 1162 if (returnUrl) { 1163 msg += '<div style="margin-top:15px;color:#666;font-size:14px;">Redirecting you back to your article in 3 seconds...</div>'; 1164 } 1165 1166 showFormMessage(msg, true); 1167 1168 // Clean up URL (remove query params) 1169 if (window.history && window.history.replaceState) { 1170 const cleanUrl = window.location.pathname; 1171 window.history.replaceState({}, document.title, cleanUrl); 1172 } 1173 1174 // Redirect to return URL after 3 seconds (back to the article) 1175 if (returnUrl) { 1176 setTimeout(function() { 1177 // Ensure return URL is same origin for security 1178 try { 1179 const returnUrlObj = new URL(returnUrl, window.location.origin); 1180 if (returnUrlObj.origin === window.location.origin) { 1181 window.location.href = returnUrl; 1182 } 1183 } catch (e) { 1184 // If it starts with /, treat as relative URL 1185 if (returnUrl.startsWith('/')) { 1186 window.location.href = returnUrl; 1187 } 1188 } 1189 }, 3000); 1190 } 1191 } else { 1192 showFormMessage('Payment was processed but we could not retrieve details. Your payment was successful.', true); 1193 // Still redirect if return URL exists 1194 if (returnUrl) { 1195 setTimeout(function() { window.location.href = returnUrl; }, 3000); 1196 } 1197 } 1198 }) 1199 .catch(err => { 1200 console.error('[forms] Error fetching session:', err); 1201 // Still show success even if API fails - payment went through 1202 showFormMessage('<div style="margin-bottom:15px;">Payment successful!</div><div style="background:#e8f5e9;padding:10px;border-radius:4px;"><strong>Session ID:</strong> <span style="font-family:monospace;">' + sessionId + '</span></div>', true); 1203 // Still redirect if return URL exists 1204 if (returnUrl) { 1205 setTimeout(function() { window.location.href = returnUrl; }, 3000); 1206 } 1207 }); 1208 } else if (paymentStatus === 'cancelled') { 1209 showFormMessage('Payment was cancelled. You can try again when ready.'); 1210 // Clean up URL 1211 if (window.history && window.history.replaceState) { 1212 const cleanUrl = window.location.pathname; 1213 window.history.replaceState({}, document.title, cleanUrl); 1214 } 1215 } 1216})(); 1217</script>
vendor: 1 bytes, line 1217
1217
1218<script> 1219// Form data restoration (runs on page load) - reads from COOKIE 1220(function() { 1221 console.log('[forms] Restoration script running...'); 1222 console.log('[forms] Current cookies:', document.cookie); 1223 try { 1224 var cookies = document.cookie.split('; '); 1225 var pendingCookie = null; 1226 for (var i = 0; i < cookies.length; i++) { 1227 if (cookies[i].indexOf('_pendingFormData=') === 0) { 1228 pendingCookie = cookies[i]; 1229 break; 1230 } 1231 } 1232 console.log('[forms] Found pending cookie:', !!pendingCookie); 1233 if (pendingCookie) { 1234 var cookieValue = pendingCookie.substring('_pendingFormData='.length); 1235 console.log('[forms] Cookie value length:', cookieValue.length); 1236 var formData = JSON.parse(decodeURIComponent(cookieValue)); 1237 console.log('[forms] Parsed form data:', Object.keys(formData)); 1238 var form = document.getElementById('CustomForm') || document.querySelector('form'); 1239 console.log('[forms] Found form:', !!form, form ? form.id : 'no id'); 1240 if (form) { 1241 Object.keys(formData).forEach(function(key) { 1242 var value = formData[key]; 1243 if (value && typeof value === 'string') { 1244 var field = form.querySelector('[name="' + key + '"]'); 1245 if (field) { 1246 console.log('[forms] Restoring field:', key, '=', value.substring(0, 20)); 1247 if (field.tagName === 'SELECT') { 1248 field.value = value; 1249 } else if (field.type !== 'file' && field.type !== 'hidden') { 1250 field.value = value; 1251 } 1252 // Trigger change event for floating labels 1253 field.dispatchEvent(new Event('input', { bubbles: true })); 1254 field.dispatchEvent(new Event('change', { bubbles: true })); 1255 } 1256 } 1257 }); 1258 console.log('[forms] Form data restored successfully'); 1259 } 1260 // Clear the cookies 1261 document.cookie = '_pendingFormData=; path=/; max-age=0'; 1262 document.cookie = '_pendingFormUrl=; path=/; max-age=0'; 1263 console.log('[forms] Cookies cleared'); 1264 } 1265 } catch (e) { 1266 console.error('[forms] Error restoring form data:', e); 1267 } 1268})(); 1269</script>
vendor: 1 bytes, line 1269
1269
1270<script> 1271(function(){ 1272 document.addEventListener('submit',function(e){ 1273 var form=e.target;if(!form||form.tagName!=='FORM')return; 1274 var btn=form.querySelector('button[type="submit"],input[type="submit"],.survey-btn-submit,#SUBMIT1'); 1275 if(!btn||btn.disabled)return; 1276 btn.disabled=true; 1277 if(btn.tagName==='INPUT'){btn.value=' Submitting...';} 1278 else{btn.innerHTML='<span class="form-submit-spinner"></span> Submitting...';} 1279 },true); 1280})(); 1281</script>
1281<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a40de2fd2d09071e',t:'MTc5MDM3OTc2MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1281</body> 1282</html></div> 1283 1284 1285 1286<section class="w-100 mb-3 mt-5"> 1287<div class="label w-100 mb-2"> 1288<div class="inp_custom"> 1289<div class="formdivider formdivider_custom" style="border-bottom: 2px solid #343a40;"> 1290<span class="text-white d-inline-block fw-bold bg-dark px-3 py-2">Contact Us</span> 1291</div> 1292</div> 1293</div> 1294</section> 1295 1296 1297 1298<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1299<div class="input w-100 form-floating"> 1300<INPUT NAME="Name:" VALUE="" id="Name:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1301<label for="Name:" class="form-label text-muted">* Name:</label> 1302</div> 1303</section> 1304 1305 1306 1307 1308<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1309<div class="input w-100 form-floating"> 1310<INPUT NAME="Address:" VALUE="" id="Address:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1311<label for="Address:" class="form-label text-muted">* Address:</label> 1312</div> 1313</section> 1314 1315 1316 1317 1318<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1319<div class="input w-100 form-floating"> 1320<INPUT NAME="City:" VALUE="" id="City:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1321<label for="City:" class="form-label text-muted">* City:</label> 1322</div> 1323</section> 1324 1325 1326 1327 1328<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1329<div class="input w-100 form-floating"> 1330<INPUT NAME="State:" VALUE="" id="State:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1331<label for="State:" class="form-label text-muted">* State:</label> 1332</div> 1333</section> 1334 1335 1336 1337 1338<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1339<div class="input w-100 form-floating"> 1340<INPUT NAME="Zip:" VALUE="" id="Zip:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1341<label for="Zip:" class="form-label text-muted">* Zip:</label> 1342</div> 1343</section> 1344 1345 1346 1347 1348<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1349<div class="input w-100 form-floating"> 1350<INPUT NAME="Daytime_phone:" VALUE="" id="Daytime_phone:" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 1351<label for="Daytime_phone:" class="form-label text-muted">* Daytime phone:</label> 1352</div> 1353</section> 1354 1355 1356 1357 1358<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1359<div class="input w-100 form-floating"> 1360<INPUT NAME="Email_Address:" VALUE="" id="Email_Address:" maxlength="" placeholder=" " type="Email" class="formfieldinput formfieldinput_custom form-control" required> 1361<label for="Email_Address:" class="form-label text-muted">* Email Address:</label> 1362</div> 1363</section> 1364 1365 1366 1367 1368<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 1369<div class="input w-100 form-floating"> 1370<textarea name="Write_your_comments_here:" id="Write_your_comments_here:" placeholder=" " class="formfieldinput formfieldinput_custom form-control" required rows="3" style="min-height: 120px !important; height: 120px !important; line-height: 1.5 !important; display: block !important; width: 100% !important; padding-top: 1.5rem !important;; min-height: 120px !important; height: 120px !important;" rows="3"></textarea> 1371<label for="Write_your_comments_here:" class="form-label text-muted">* Write your comments here:</label> 1372</div> 1373</section> 1374 1375 1376 1377 1378</fieldset> 1379<footer class="text-center mt-3"> 1380<button class="button btn btn-primary shadow text-capitalize" id="SUBMIT1" type="submit" onclick="document.getElementById('CustomForm').classList.add('was-validated');"><span class="py-1 px-3 d-inline-block">submit</span></button>
1381<i id="cus-form-button-loader" class='fa fa-circle-o-notch fa-spin fast-spin fs-1 text-primary'></i> 1382</footer> 1383<div class="system_text footer_text mt-5 mb-3 text-center"><html> 1384 <head> 1385 <link href="asp.css" rel="stylesheet"> 1386 </head> 1387 <body > 1388 <div align="left">If you would like to contact us in other ways:</div> 1389 <div> </div> 1390 <div>Telephone: (423) 726-2057</div> 1391 <div>Fax: (423) 726-2057</div> 1392 <div> </div> 1393 <div>Mail: TC SPORTS. LLC</div> 1394 <div>         P.O. Box 3385</div> 1395 <div>         Kingsport, TN  37660</div> 1396 <div> </div> 1397 <div>President: Mike Holt <a href="mailto:[email protected]">[email protected]</a></div> 1398 <div>Advertising & Sales A.B. Clevinger <a href="mailto:[email protected]">[email protected]</a></div> 1399 <div>Media Technology & Publishing Steve Wilmoth <a href="mailto:[email protected]">[email protected]</a></div> 1400 <div> </div> 1401 </body> 1402</html></div> 1403</form> 1404</div>
1405<script language="javascript">GetGoogleAnalytics('FORM:ContactUs');</script>
1405 1406<!-- Tooltip -->
1407<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
vendor: 2 bytes, line 1407
1407
1408<script> 1409var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) 1410var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 1411return new bootstrap.Tooltip(tooltipTriggerEl) 1412}) 1413</script>
1413 1414<!-- /Tooltip --> 1415</div> 1416</div></div> 1417 <div class="col-lg-12"> <div data-cms-block="highlight-1" data-cms-block-label="Highlights 1" data-cms-el="highlight" data-cms-highlight="1">
1417<script type="text/javascript" language="JavaScript">GetHighlights1();</script>
1417</div></div> 1418 1419 <div class="col-lg-12"> <div data-cms-block="highlight-4" data-cms-block-label="Highlights 4" data-cms-el="highlight" data-cms-highlight="4">
1419<script type="text/javascript" language="JavaScript">GetHighlights4();</script>
1419</div></div> 1420 <div class="col-lg-12"> <div data-cms-block="highlight-6" data-cms-block-label="Highlights 6" data-cms-el="highlight" data-cms-highlight="6">
1420<script type="text/javascript" language="JavaScript">GetHighlights6();</script>
1420</div></div> 1421 <div class="col-lg-12"> <div data-cms-block="highlight-7" data-cms-block-label="Highlights 7" data-cms-el="highlight" data-cms-highlight="7">
1421<script type="text/javascript" language="JavaScript">GetHighlights7();</script>
1421</div></div> 1422 <div class="col-lg-12"> <div data-cms-block="highlight-9" data-cms-block-label="Highlights 9" data-cms-el="highlight" data-cms-highlight="9">
1422<script type="text/javascript" language="JavaScript">GetHighlights9();</script>
1422</div></div> 1423 <div class="col-lg-12">
1423<script type="text/javascript" language="JavaScript" src="/articlegroup174.js?v=1790346378"></script>
1423<script type="text/javascript" language="JavaScript">GetArticleGroup174();</script>
1423</div> 1424 1425 <div class="col-lg-12">
1425<script type="text/javascript" language="JavaScript" src="/articlegroup104.js?v=1790346378"></script>
1425<script type="text/javascript" language="JavaScript">GetArticleGroup104();</script>
1425</div> 1426 1427 <div class="col-lg-12">
1427<script type="text/javascript" language="JavaScript" src="/articlegroup105.js?v=1790346378"></script>
1427<script type="text/javascript" language="JavaScript">GetArticleGroup105();</script>
1427</div> 1428<div class="col-lg-12"> 1429<div class="row border-top"> 1430<div class="col-lg-12 mb-2"><div data-cms-block="section-file-585" data-cms-block-label="Section 585" data-cms-el="section" data-cms-section="585"><div class="cus-videogallery-121"> 1431 <p class="cus-121-label my-2 position-relative"><span class="text-dark fw-bold text-uppercase border-top border-4 border-red position-relative z-index-2">VIDEO GALLERY</span></p> 1432 <div class="row mx-0 hp-parent"> 1433 1434 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1435 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('qYAjcpWb-t8');"> 1436 <div class="ratio-16-9"> 1437 <div class="img-content cus-dark-img"> 1438 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/qYAjcpWb-t8/hqdefault.jpg" data-src="/no-image.png" alt="LIVE -- Dobyns-Bennett vs West Ridge" data-was-processed="true" loading="lazy"> 1439 </div> 1440 </div> 1441 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1442 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="LIVE -- Dobyns-Bennett vs West Ridge"><span class="line-1">LIVE -- Dobyns-Bennett vs West Ridge</span></p> 1443 </a> 1444 </div> 1445 1446 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1447 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('Z-BqSlN57bk');"> 1448 <div class="ratio-16-9"> 1449 <div class="img-content cus-dark-img"> 1450 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/Z-BqSlN57bk/hqdefault.jpg" data-src="/no-image.png" alt="Announcing the Field at the 2026 Classic at Tennessee High" data-was-processed="true" loading="lazy"> 1451 </div> 1452 </div> 1453 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1454 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Announcing the Field at the 2026 Classic at Tennessee High"><span class="line-1">Announcing the Field at the 2026 Classic at Tennessee High</span></p> 1455 </a> 1456 </div> 1457 1458 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1459 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('EPvpooKUxW4');"> 1460 <div class="ratio-16-9"> 1461 <div class="img-content cus-dark-img"> 1462 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/EPvpooKUxW4/hqdefault.jpg" data-src="/no-image.png" alt="I & TRI Sports Podcast - Episode 1.2" data-was-processed="true" loading="lazy"> 1463 </div> 1464 </div> 1465 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1466 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="I & TRI Sports Podcast - Episode 1.2"><span class="line-1">I & TRI Sports Podcast - Episode 1.2</span></p> 1467 </a> 1468 </div> 1469 1470 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1471 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('njT9nKwlU6A');"> 1472 <div class="ratio-16-9"> 1473 <div class="img-content cus-dark-img"> 1474 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/njT9nKwlU6A/hqdefault.jpg" data-src="/no-image.png" alt="Tennessee vs Kennesaw State Highlights" data-was-processed="true" loading="lazy"> 1475 </div> 1476 </div> 1477 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1478 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tennessee vs Kennesaw State Highlights"><span class="line-1">Tennessee vs Kennesaw State Highlights</span></p> 1479 </a> 1480 </div> 1481 1482 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1483 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('vfQoctW2GNg');"> 1484 <div class="ratio-16-9"> 1485 <div class="img-content cus-dark-img"> 1486 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/vfQoctW2GNg/hqdefault.jpg" data-src="/no-image.png" alt="2026 WCYB Prep P
1486icks - Week 5" data-was-processed="true" loading="lazy"> 1487 </div> 1488 </div> 1489 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1490 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="2026 WCYB Prep Picks - Week 5"><span class="line-1">2026 WCYB Prep Picks - Week 5</span></p> 1491 </a> 1492 </div> 1493 1494 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1495 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('NmIbpnhwFWU');"> 1496 <div class="ratio-16-9"> 1497 <div class="img-content cus-dark-img"> 1498 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/NmIbpnhwFWU/hqdefault.jpg" data-src="/no-image.png" alt="Tennessee vs Georgia Tech Game Highlights" data-was-processed="true" loading="lazy"> 1499 </div> 1500 </div> 1501 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1502 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tennessee vs Georgia Tech Game Highlights"><span class="line-1">Tennessee vs Georgia Tech Game Highlights</span></p> 1503 </a> 1504 </div> 1505 1506 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1507 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('gi5rrQoHtzk');"> 1508 <div class="ratio-16-9"> 1509 <div class="img-content cus-dark-img"> 1510 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/gi5rrQoHtzk/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Oak Ridge - September 11, 2026" data-was-processed="true" loading="lazy"> 1511 </div> 1512 </div> 1513 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1514 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Oak Ridge - September 11, 2026"><span class="line-1">Dobyns-Bennett vs Oak Ridge - September 11, 2026</span></p> 1515 </a> 1516 </div> 1517 1518 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1519 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('JBBapq3C4g8');"> 1520 <div class="ratio-16-9"> 1521 <div class="img-content cus-dark-img"> 1522 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/JBBapq3C4g8/hqdefault.jpg" data-src="/no-image.png" alt="I & TRI Sports Podcast - Episode 1.1" data-was-processed="true" loading="lazy"> 1523 </div> 1524 </div> 1525 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1526 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="I & TRI Sports Podcast - Episode 1.1"><span class="line-1">I & TRI Sports Podcast - Episode 1.1</span></p> 1527 </a> 1528 </div> 1529 1530 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1531 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('rkSyPfVcWLg');"> 1532 <div class="ratio-16-9"> 1533 <div class="img-content cus-dark-img"> 1534 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/rkSyPfVcWLg/hqdefault.jpg" data-src="/no-image.png" alt="2026 WCYB Prep Picks - Week 4" data-was-processed="true" loading="lazy"> 1535 </div> 1536 </div> 1537 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1538 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="2026 WCYB Prep P
1538icks - Week 4"><span class="line-1">2026 WCYB Prep Picks - Week 4</span></p> 1539 </a> 1540 </div> 1541 1542 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1543 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('N660DoL1rBo');"> 1544 <div class="ratio-16-9"> 1545 <div class="img-content cus-dark-img"> 1546 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/N660DoL1rBo/hqdefault.jpg" data-src="/no-image.png" alt="Tennessee vs Furman Game Highlights" data-was-processed="true" loading="lazy"> 1547 </div> 1548 </div> 1549 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1550 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tennessee vs Furman Game Highlights"><span class="line-1">Tennessee vs Furman Game Highlights</span></p> 1551 </a> 1552 </div> 1553 1554 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1555 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('vRv2F4cAFwU');"> 1556 <div class="ratio-16-9"> 1557 <div class="img-content cus-dark-img"> 1558 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/vRv2F4cAFwU/hqdefault.jpg" data-src="/no-image.png" alt="2026 WCYB Prep Picks - Week 3" data-was-processed="true" loading="lazy"> 1559 </div> 1560 </div> 1561 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1562 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="2026 WCYB Prep Picks - Week 3"><span class="line-1">2026 WCYB Prep Picks - Week 3</span></p> 1563 </a> 1564 </div> 1565 1566 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1567 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('-CTbswJgfW0');"> 1568 <div class="ratio-16-9"> 1569 <div class="img-content cus-dark-img"> 1570 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/-CTbswJgfW0/hqdefault.jpg" data-src="/no-image.png" alt="2026 WCYB Prep Picks - Week 2" data-was-processed="true" loading="lazy"> 1571 </div> 1572 </div> 1573 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1574 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="2026 WCYB Prep Picks - Week 2"><span class="line-1">2026 WCYB Prep Picks - Week 2</span></p> 1575 </a> 1576 </div> 1577 1578 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1579 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('3Ln7Okj4Sro');"> 1580 <div class="ratio-16-9"> 1581 <div class="img-content cus-dark-img"> 1582 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/3Ln7Okj4Sro/hqdefault.jpg" data-src="/no-image.png" alt="Dolly Parton - "He's Alive"" data-was-processed="true" loading="lazy"> 1583 </div> 1584 </div> 1585 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1586 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dolly Parton - "He's Alive""><span class="line-1">Dolly Parton - "He's Alive"</span></p> 1587 </a> 1588 </div> 1589 1590 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1591 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('e2qvHyFVm20');"> 1592 <div class="ratio-16-9"> 1593 <div class="img-content cus-dark-img"> 1594 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/e2qvHyFVm20/hqdefault.jpg" data-src="/no-image.png" alt="Dolly Parton - "Southern Accents"" data-was-processed="true" loading="lazy"> 1595 </div> 1596 </div> 1597 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1598 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dolly Parton - "Southern Accents""><span class="line-1">Dolly Parton - "Southern Accents"</span></p> 1599 </a> 1600 </div> 1601 1602 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1603 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('_EA7WrDt3Sc');"> 1604 <div class="ratio-16-9"> 1605 <div class="img-content cus-dark-img"> 1606 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/_EA7WrDt3Sc/hqdefault.jpg" data-src="/no-image.png" alt="Dolly Parton - "Rocky Top Tennessee" @ Neyland Stadium" data-was-processed="true" loading="lazy"> 1607 </div> 1608 </div> 1609 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1610 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dolly Parton - "Rocky Top Tennessee" @ Neyland Stadium"><span class="line-1">Dolly Parton - "Rocky Top Tennessee" @ Neyland Stadium</span></p> 1611 </a> 1612 </div> 1613 1614 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1615 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('jE5Mx-qD_5o');"> 1616 <div class="ratio-16-9"> 1617 <div class="img-content cus-dark-img"> 1618 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/jE5Mx-qD_5o/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Knox Central - August 21, 2026" data-was-processed="true" loading="lazy"> 1619 </div> 1620 </div> 1621 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1622 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Knox Central - August 21, 2026"><span class="line-1">Dobyns-Bennett vs Knox Central - August 21, 2026</span></p> 1623 </a> 1624 </div> 1625 1626 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1627 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('rLTmvR9Lmas');"> 1628 <div class="ratio-16-9"> 1629 <div class="img-content cus-dark-img"> 1630 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/rLTmvR9Lmas/hqdefault.jpg" data-src="/no-image.png" alt="2026 WCYB Prep P
1630icks - Week 1" data-was-processed="true" loading="lazy"> 1631 </div> 1632 </div> 1633 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1634 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="2026 WCYB Prep Picks - Week 1"><span class="line-1">2026 WCYB Prep Picks - Week 1</span></p> 1635 </a> 1636 </div> 1637 1638 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1639 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('Xtqr2zq_VRU');"> 1640 <div class="ratio-16-9"> 1641 <div class="img-content cus-dark-img"> 1642 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/Xtqr2zq_VRU/hqdefault.jpg" data-src="/no-image.png" alt=""Runnin' Through That T" - Thomas Edwards" data-was-processed="true" loading="lazy"> 1643 </div> 1644 </div> 1645 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1646 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title=""Runnin' Through That T" - Thomas Edwards"><span class="line-1">"Runnin' Through That T" - Thomas Edwards</span></p> 1647 </a> 1648 </div> 1649 1650 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1651 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('BzRLviNpr9c');"> 1652 <div class="ratio-16-9"> 1653 <div class="img-content cus-dark-img"> 1654 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/BzRLviNpr9c/hqdefault.jpg" data-src="/10-06-2026-10-49-09-pm-7855376.jpg" alt="Grant Williams - Boys' & Girls' Club of Kingsport Night of Champions Keynote Speaker" data-was-processed="true" loading="lazy"> 1655 </div> 1656 </div> 1657 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1658 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Grant Williams - Boys' & Girls' Club of Kingsport Night of Champions Keynote Speaker"><span class="line-1">Grant Williams - Boys' & Girls' Club of Kingsport Night of Champions Keynote Speaker</span></p> 1659 </a> 1660 </div> 1661 1662 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1663 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('lLDPNH5UPO4');"> 1664 <div class="ratio-16-9"> 1665 <div class="img-content cus-dark-img"> 1666 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/lLDPNH5UPO4/hqdefault.jpg" data-src="/no-image.png" alt="11/14/2025 - Dobyns-Bennett vs Blackman" data-was-processed="true" loading="lazy"> 1667 </div> 1668 </div> 1669 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1670 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="11/14/2025 - Dobyns-Bennett vs Blackman"><span class="line-1">11/14/2025 - Dobyns-Bennett vs Blackman</span></p> 1671 </a> 1672 </div> 1673 1674 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1675 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('CDZHb37TfHA');"> 1676 <div class="ratio-16-9"> 1677 <div class="img-content cus-dark-img"> 1678 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/CDZHb37TfHA/hqdefault.jpg" data-src="/no-image.png" alt="11/7/2025 - Dobyns-Bennett vs Faragut" data-was-processed="true" loading="lazy"> 1679 </div> 1680 </div> 1681 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1682 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="11/7/2025 - Dobyns-Bennett vs Faragut"><span class="line-1">11/7/2025 - Dobyns-Bennett vs Faragut</span></p> 1683 </a> 1684 </div> 1685 1686 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1687 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('PVaNp82u-Dk');"> 1688 <div class="ratio-16-9"> 1689 <div class="img-content cus-dark-img"> 1690 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/PVaNp82u-Dk/hqdefault.jpg" data-src="/no-image.png" alt="10/3/2025 - Dobyns-Bennett vs Jefferson County" data-was-processed="true" loading="lazy"> 1691 </div> 1692 </div> 1693 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1694 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="10/3/2025 - Dobyns-Bennett vs Jefferson County"><span class="line-1">10/3/2025 - Dobyns-Bennett vs Jefferson County</span></p> 1695 </a> 1696 </div> 1697 1698 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1699 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('OBIJzChje2Y');"> 1700 <div class="ratio-16-9"> 1701 <div class="img-content cus-dark-img"> 1702 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/OBIJzChje2Y/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Greeneville Livestream" data-was-processed="true" loading="lazy"> 1703 </div> 1704 </div> 1705 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1706 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Greeneville Livestream"><span class="line-1">Dobyns-Bennett vs Greeneville Livestream</span></p> 1707 </a> 1708 </div> 1709 1710 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1711 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('0W_ozen8MmM');"> 1712 <div class="ratio-16-9"> 1713 <div class="img-content cus-dark-img"> 1714 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/0W_ozen8MmM/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Morristown West Livestream" data-was-processed="true" loading="lazy"> 1715 </div> 1716 </div> 1717 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1718 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Morristown West Livestream"><span class="line-1">Dobyns-Bennett vs Morristown West Livestream</span></p> 1719 </a> 1720 </div> 1721 1722 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1723 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);
1723" onclick="OpenYouTube('gfZu3JqnMd0');"> 1724 <div class="ratio-16-9"> 1725 <div class="img-content cus-dark-img"> 1726 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/gfZu3JqnMd0/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Science Hill Livestream" data-was-processed="true" loading="lazy"> 1727 </div> 1728 </div> 1729 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1730 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Science Hill Livestream"><span class="line-1">Dobyns-Bennett vs Science Hill Livestream</span></p> 1731 </a> 1732 </div> 1733 1734 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1735 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('5xEIvbKI2Mc');"> 1736 <div class="ratio-16-9"> 1737 <div class="img-content cus-dark-img"> 1738 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/5xEIvbKI2Mc/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs West Ridge Livestream" data-was-processed="true" loading="lazy"> 1739 </div> 1740 </div> 1741 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1742 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs West Ridge Livestream"><span class="line-1">Dobyns-Bennett vs West Ridge Livestream</span></p> 1743 </a> 1744 </div> 1745 1746 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1747 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('7e-4ryTgHyA');"> 1748 <div class="ratio-16-9"> 1749 <div class="img-content cus-dark-img"> 1750 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/7e-4ryTgHyA/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Daniel Boone Livestream" data-was-processed="true" loading="lazy"> 1751 </div> 1752 </div> 1753 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1754 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Daniel Boone Livestream"><span class="line-1">Dobyns-Bennett vs Daniel Boone Livestream</span></p> 1755 </a> 1756 </div> 1757 1758 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1759 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('Dn21Y1xtb2g');"> 1760 <div class="ratio-16-9"> 1761 <div class="img-content cus-dark-img"> 1762 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/Dn21Y1xtb2g/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs South Greene Livestream" data-was-processed="true" loading="lazy"> 1763 </div> 1764 </div> 1765 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1766 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs South Greene Livestream"><span class="line-1">Dobyns-Bennett vs South Greene Livestream</span></p> 1767 </a> 1768 </div> 1769 1770 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1771 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('5y3yUjElOKI');"> 1772 <div class="ratio-16-9"> 1773 <div class="img-content cus-dark-img"> 1774 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/5y3yUjElOKI/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Science Hill" data-was-processed="true" loading="lazy"> 1775 </div> 1776 </div> 1777 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1778 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Science Hill"><span class="line-1">Dobyns-Bennett vs Science Hill</span></p> 1779 </a> 1780 </div> 1781 1782 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1783 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('k50IQd_b9QE');"> 1784 <div class="ratio-16-9"> 1785 <div class="img-content cus-dark-img"> 1786 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/k50IQd_b9QE/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Morristown East" data-was-processed="true" loading="lazy"> 1787 </div> 1788 </div> 1789 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1790 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Morristown East"><span class="line-1">Dobyns-Bennett vs Morristown East</span></p> 1791 </a> 1792 </div> 1793 1794 <div class="col-sm-6 col-md-4 px-1 mb-2"> 1795 <a class="cus-videogallery-121-link position-relative d-block text-decoration-none border rounded overflow-hidden" href="javascript:void(0);" onclick="OpenYouTube('bfZ1Kc70mC4');"> 1796 <div class="ratio-16-9"> 1797 <div class="img-content cus-dark-img"> 1798 <img class="cus-videogallery-121-img img-fluid lazy loaded" src="https://img.youtube.com/vi/bfZ1Kc70mC4/hqdefault.jpg" data-src="/no-image.png" alt="Dobyns-Bennett vs Greeneville" data-was-processed="true" loading="lazy"> 1799 </div> 1800 </div> 1801 <span class="cus-videogallery-121-play position-absolute translate-middle top-50 start-50"><i class="fa fa-play fs-1 text-white text-shadow-1" aria-hidden="true"></i></span> 1802 <p class="cus-videogallery-121-heading mb-0 bg-dark text-white p-2 fs-6 lh-lg fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Dobyns-Bennett vs Greeneville"><span class="line-1">Dobyns-Bennett vs Greeneville</span></p> 1803 </a> 1804 </div> 1805 1806 </div> 1807</div> 1808<style> 1809 .cus-121-label::before {content: "";position: absolute;width: 100%;height: 0.2rem;background: rgba(221, 7, 7, 0.2);margin-top: -0.2rem;z-index: 2;} 1810 .cus-photogallery-121-icon {opacity: 0; transition: 200ms linear;} 1811 .cus-photogallery-121-popup:hover .cus-photogallery-121-icon {opacity: 1; transition: 300ms linear;} 1812</style></div></div> 1813 1814 <div class="col-lg-12 mt-3"> <div data-cms-block="adgroup-12" data-cms-block-label="Advertisement 12" data-cms-el="adgroup" data-cms-adgroup="12">
1814<script type="text/javascript" language="JavaScript">AdGroup12();</script>
1814</div></div> 1815</div> 1816</div> 1817 1818 </div> 1819 </div> 1820 </div> 1821 <div class="cus-column-133-2 col-lg-3 mt-4"> 1822 <div data-sticky="10"> 1823 <div class="col-lg-12 bg-white p-3 mb-4 border rounded"> 1824 <div data-cms-block="adgroup-19" data-cms-block-label="Advertisement 19" data-cms-el="adgroup" data-cms-adgroup="19">
1824<script type="text/javascript" language="JavaScript">AdGroup19();</script>
1824</div> 1825 <div data-cms-block="adgroup-11" data-cms-block-label="Advertisement 11" data-cms-el="adgroup" data-cms-adgroup="11">
1825<script type="text/javascript" language="JavaScript">AdGroup11();</script>
1825</div> 1826 <div data-cms-block="poll-1" data-cms-block-label="Poll 1" data-cms-el="poll" data-poll-id="1">
1826<script type="text/javascript" language="JavaScript">GetPoll1();</script>
1826</div> 1827 <div data-cms-block="adgroup-18" data-cms-block-label="Advertisement 18" data-cms-el="adgroup" data-cms-adgroup="18">
1827<script type="text/javascript" language="JavaScript">AdGroup18();</script>
1827</div> 1828 <div data-cms-block="highlight-2" data-cms-block-label="Highlights 2" data-cms-el="highlight" data-cms-highlight="2">
1828<script type="text/javascript" language="JavaScript">GetHighlights2();</script>
1828</div> 1829 </div> 1830 <div class="col-lg-12 bg-white p-3 mb-4 border rounded"> 1831 <div data-cms-block="adgroup-13" data-cms-block-label="Advertisement 13" data-cms-el="adgroup" data-cms-adgroup="13">
1831<script type="text/javascript" language="JavaScript">AdGroup13();</script>
1831</div> 1832 <div data-cms-block="adgroup-15" data-cms-block-label="Advertisement 15" data-cms-el="adgroup" data-cms-adgroup="15">
1832<script type="text/javascript" language="JavaScript">AdGroup15();</script>
1832</div> 1833 </div> 1834 <div class="col-lg-12 bg-white p-3 mb-4 border rounded"><div data-cms-block="adgroup-13" data-cms-block-label="Advertisement 13" data-cms-el="adgroup" data-cms-adgroup="13">
1834<script type="text/javascript" language="JavaScript">AdGroup13();</script>
1834</div></div> 1835 </div> 1836 </div> 1837 <style>@media (max-width: 992px) {.cus-column-133-2 {border-width: 0 !important;} }</style> 1838 </div> 1839 <!-- /2-columns --> 1840 1841 1842 1843 </div> 1844 <!-- footer --> 1845 <div class="container-fluid bg-black py-4"> 1846 <div class="container-bl"> 1847 <footer class="cus-footer-1-133-footer row p-2 mx-0 "> 1848 1849 <div class="col-lg-4"> 1850 <div class="col-lg-12 col-lg-3 d-flex justify-content-center px-0"> 1851 <div data-cms-el="logo">
1851<script type="text/javascript" language="JavaScript">GetLogo();</script>
1851</div> 1852 </div> 1853 <div class="col-lg-12 mb-2 mt-3 mb-lg-0 text-light fw-bold">Visitors:
1853<script type="text/javascript" language="JavaScript">HitCounter();</script>
1853 1854 </div> 1855 <div class="col-lg-12 text-light d-none"> 1856 1857 <i class="fa fa-phone text-light pe-2 text-light" aria-hidden="true"></i>
1857<script type="text/javascript">Section6();</script>
1857 1858 1859 </div> 1860 </div> 1861 <div class="col-lg-4">
1861<script type="text/javascript" language="JavaScript" src="/articlegroup100.js?v=1790346378"></script>
1861<script type="text/javascript" language="JavaScript">GetArticleGroup100();</script>
1861</div> 1862 <div class="col-lg-4"> 1863 <h1 class="text-light"> Connect With US</h1> 1864 <a href="/headlines.rss"><i class="fa fa-rss text-light"></i></a> 1865 <a href="https://www.instagram.com/tricitiessports"><i class="fa fa-instagram text-light"></i></a> 1866 <a href="https://twitter.com/parrotheadvol"><i class="fa fa-twitter text-light"></i></a> 1867 <a href="https://www.facebook.com/profile.php?id=100064601897460"><i class="fa fa-facebook text-light"></i></a> 1868 </div> 1869 1870 1871 </footer> 1872 </div> 1873 <div class="container-bl border-top border-secondary mt-2 pt-3"> 1874 <span class="copyright"><div data-cms-block="section-7" data-cms-block-label="Section 7" data-cms-el="section" data-cms-section="7">
1874<script type="text/javascript">Section7();</script>
1874</div></span> 1875 </div> 1876 </div> 1877 <!-- /footer --> 1878 1879 </div> 1880 <!-- go to top --><div class="cus-scroll-top position-fixed bg-dark text-white fs-4 px-2 rounded-circle d-flex align-items-center justify-content-center"><i class="fa fa-angle-up lh-base text-shadow-3"></i></div>
1880<script> if (document.getElementsByClassName("cus-scroll-top")) { window.addEventListener("scroll", function() { if (document.body.scrollTop > 600 || document.documentElement.scrollTop > 600) { document.getElementsByClassName('cus-scroll-top')[0].style.bottom = '20px'; } else { document.getElementsByClassName('cus-scroll-top')[0].style.bottom = "-100px"; } }); document.getElementsByClassName('cus-scroll-top')[0].addEventListener('click', function() { window.scrollTo(0, 0); }); }</script>
1880<style> .cus-scroll-top {cursor: pointer; right:20px; bottom: auto;transition: 400ms linear;opacity: 0.8; width:40px;height: 40px;} .cus-scroll-top:hover {transition: 300ms linear;box-shadow: 0 0 0 15px rgba(0,0,0,0.3) !important;opacity: 1;}</style><!-- /go to top --> 1881 <div class="cus-g-analytics-133">
1881<script language="javascript">GetGoogleAnalytics('MENU:HOME PAGE-THE FRONT PAGE');</script>
1881</div> 1882 <!-- tooltip --> 1883
1883<script> 1884 var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) 1885 var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 1886 return new bootstrap.Tooltip(tooltipTriggerEl) 1887 }); 1888 </script>
1888 1889 <!-- /tooltip --> 1890<!--sticky column css-js --> 1891<style>@media (min-width: 992px) {[data-sticky] {position: sticky; width: 100%;} }</style>
1892<script> 1893 document.addEventListener('readystatechange', event => { 1894 if (event.target.readyState === "complete") { 1895 var sp = document.querySelectorAll("[data-sticky]"); 1896 var sw = window.innerHeight; 1897 var sf = () => { 1898 if (sp != null) { 1899 sp.forEach(x => { 1900 var ds = x.getAttribute("data-sticky") != "" ? x.getAttribute("data-sticky") : 10; 1901 var st = x.offsetHeight - sw + 10; 1902 if(st >= 0) { 1903 x.style.top = `-${st}px`; 1904 } else if(st < 0) { 1905 if(st > -ds) { 1906 x.style.top =`${Math.abs(st)}px`; 1907 } 1908 else { 1909 x.style.top = `${ds}px`; 1910 } 1911 } 1912 }); 1913 } 1914 } 1915 sf(); 1916 setTimeout(() => {sf();}, 500); 1917 setTimeout(() => {sf();}, 1000); 1918 setTimeout(() => {sf();}, 3000); 1919 } 1920 }); 1921</script>
vendor: 2 bytes, line 1921
1921
1922<script src="/js/paywall-widget.js" defer></script>
vendor: 2 bytes, line 1922
1922
1923<script defer src="/sys-popup.js?v=1790346378"></script>
1923 1924<!--/sticky column css-js -->
1925<script defer src="/sys-popup.js?v=1790346378"></script>
1925</body> 1926<!--Template-112--> 1927</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.