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 <!-- Required meta tags --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <!--<meta charset="ISO-8859-1"> 15 <title>Contact Us</title>--> 16 <meta charset="UTF-8"> 17 18 <meta name="keywords" content="Kahnawake News, Kahnawake, News, Mohawk, Mohawks, First Nations, Native Americans, Iroquois, Haudenosaunee"> 19 <meta name="description" content="Kahnawake News, on the Web"> 20 21 <link rel="shortcut icon" href="/favicon.ico?v=1789926857"> 22
22<script type="text/javascript" language="javascript" src="/lib/bl2.js"></script>
22 23 24 <!-- bootstrap --> 25 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> 26
26<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
26 27 <link type="text/css" rel="stylesheet" href="https://bulletlink.com/bootstrap.css"> 28 <!-- /bootstrap --> 29 30 <!-- jQuery --> 31
31<script src="https://code.jquery.com/jquery-1.7.min.js" integrity="sha256-/05Jde9AMAT4/o5ZAI23rUf1SxDYTHLrkOco0eyRV84=" crossorigin="anonymous"></script>
31 32 <!--
32<script type="text/javascript" language="javascript" src="/lib/JQuery/jquery.js"></script>
32 --> 33 <!--
33<script type="text/javascript" language="javascript" src="/lib/JQuery/CSSMessageBox/js/jquery.ui.draggable.js"></script>
33 34
34<script type="text/javascript" language="javascript" src="/lib/JQuery/CSSMessageBox/js/jquery.alerts.js"></script>
34 35 <link rel="stylesheet" href="/lib/JQuery/CSSMessageBox/css/jquery.alerts.css"> 36
36<script type="text/javascript" src="/lib/JQuery/fancybox/jquery.mousewheel-3.0.4.pack.js"></script>
36 37
37<script type="text/javascript" src="/lib/JQuery/fancybox/jquery.fancybox-1.3.4.pack.js"></script>
37 38 <link rel="stylesheet" type="text/css" href="/lib/JQuery/fancybox/jquery.fancybox-1.3.4.css" media="screen"> 39
39<script type="text/javascript" language="javascript" src="/lib/JQuery/Gallery3/jqFancyTransitions.js"></script>
39 40 <link rel="stylesheet" href="/lib/JQuery/popup1/popup1.css" type="text/css"> 41
41<script src="/lib/JQuery/popup1/popup1.js"></script>
41 --> 42 <!-- /jQuery --> 43 44 <!-- system --> 45
45<script type="text/javascript" language="javascript" src="/settings.js?v=1789926857"></script>
45 46
46<script type="text/javascript" language="javascript" src="/articles.js?v=1789926857"></script>
46 47
47<script type="text/javascript" language="javascript" src="/ads.js?v=1789926857"></script>
47 48
48<script type="text/javascript" language="javascript" src="/menus.js?v=1789926857"></script>
48 49
49<script type="text/javascript" language="javascript" src="/sections.js?v=1789926857"></script>
49 50
50<script type="text/javascript" language="javascript" src="/polls.js?v=1789926857"></script>
50 51
51<script type="text/javascript" language="javascript" src="/lib/iframeResizer.min.js"></script>
51 52
52<script type="text/javascript" language="javascript" src="/menu_horizontal.js?v=1789926857"></script>
52 53 <!-- /system --> 54 55 <!-- fontAwesome--> 56 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" /> 57 <!-- /fontAwesome--> 58 59 <!-- general --> 60
60<script type="text/javascript" language="javascript" src="/jscript1.js?v=1789926857"></script>
60 61 <link type="text/css" rel="stylesheet" href="/custom.css?v=1789926857"> 62
62<script type="text/javascript" language="javascript" src="/custom.js?v=1789926857"></script>
62 63 <!-- /general --> 64 65 <!--StartMH--> 66 <!--MetaSharing--> 67 <!--EndMH--> 68 69 <!-- live-Builder --> 70
70<script type="text/javascript" src="/ufields.js"></script>
70 71 <!-- /live-Builder --> 72 73 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 74<meta name="facebook-domain-verification" content="eba62c1rivp7gq9ps9juaddd0ukpvv" /> 75 76<!-- Facebook Pixel Code -->
77<script>
vendor: 408 bytes, lines 77-86
77 78!function(f,b,e,v,n,t,s) 79{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 80n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 81if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 82n.queue=[];t=b.createElement(e);t.async=!0; 83t.src=v;s=b.getElementsByTagName(e)[0]; 84s.parentNode.insertBefore(t,s)}(window, document,'script', 85'https://connect.facebook.net/en_US/fbevents.js'); 86fbq('init', '
86870070489835846
vendor: 32 bytes, lines 86-87
86'); 87fbq('track', 'PageView');
88</script>
88 89<noscript><img height="1" width="1" style="display:none" 90src="https://www.facebook.com/tr?id=870070489835846&ev=PageView&noscript=1" 91/ loading="lazy"></noscript> 92<!-- End Facebook Pixel Code --> 93
94<script type="text/javascript" language="javascript">if (!readCookie('firstVisit')) {createCookie('firstVisit', 'Yes');var d_che = new Date();var s_che = d_che.getSeconds();var m_che = d_che.getMinutes();var h_che = d_che.getHours();var dt_che = d_che.getDate();var mnt_che = d_che.getMonth() + 1;var y_che = d_che.getFullYear();var vl_che = dt_che + '' + mnt_che + '' + y_che + '' + h_che + '' + m_che + '' + s_che;var scrt = document.getElementsByTagName("script");var lnks = document.getElementsByTagName("link");var che_js = ["{{PutTFolder}}.", "custom", "Menus-Horizontal", "jscript", "articlegroup"];var che_cs = ["custom", "layout"];for (var i = 0; i < scrt.length; i++) {var c_j;for (c_j = 0; c_j < che_js.length; c_j++) {var scrpt = scrt[i];if (scrpt.src.indexOf(che_js[c_j]) != -1 && scrpt.src.indexOf('js?') != -1) {scrpt.src += "v=" + vl_che;}}}for (var i = 0; i < lnks.length; i++) {var c_cs;for (c_cs = 0; c_cs < che_cs.length; c_cs++) {var link = lnks[i];if (link.href.indexOf(che_cs[c_cs]) != -1 && link.href.indexOf('css?') != -1) {link.href += "v=" + vl_che;}}}}</script>
94 95 96<link href='https://fonts.googleapis.com/css?family=Merriweather' rel='stylesheet' type='text/css'> 97<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 98<link type="text/css" rel="stylesheet" href="https://https://kahnawakenews.com/ufields.css?v=9.000009" />
99<script type="text/javascript" src="https://https://kahnawakenews.com/ufields.js?v=9.000009"></script>
99 100 101<!-- Google Tag Manager -->
102<script>
vendor: 331 bytes, lines 102-106
102(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 103new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 104j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 105'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 106})(window,document,'script','dataLayer','
106GTM-T6TTZ66D
vendor: 3 bytes, line 106
106');
106</script>
106 107<!-- End Google Tag Manager --> 108<style>:root{--cms-theme-color: #555;}</style><link rel="stylesheet" href="/sys-popup.css?v=1789926857"><style id="universal-submit-spinner"> 109.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} 110@keyframes frmSpin{to{transform:rotate(360deg)}} 111</style></head> 112 113<body id="blbodymain" class="blbody"><a href="https://kahnawakenews.com/cdn-cgi/content?id=Mskjeum7O5.nkC6Dt9_1puNOvLlNvJm9BMJ8CpAyFZ0-1791267875.0827887-1.2.1.1-zL3LyYnZWgl9Wdft5THwcN8f1BlF6.d8Si1gY4Mbyd_IXtLWsZoJjta9drmt0PYV" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a> 114<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 114-115
114 115<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
115GTM-T6TTZ66D
vendor: 85 bytes, lines 115-116
115" 116height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
117<!-- End Google Tag Manager (noscript) --> 118 <div class="mainbody"> 119 <!-- stycky ads--> 120 <span class="cus-sticky-ads"><div id="stickybottom" class="stickybottom"><div class="stickyheader" style="text-align: center;"><a href="#" class="stickyminimize" onClick="HideUnhideStickyAd('stickybottomContent');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line></svg></a><a href="#" class="stickyclose" onClick="CloseStickyAd('stickybottom');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></a></div><div id="stickybottomContent">
120<script type="text/javascript" language="JavaScript">AdGroup2();</script>
120</div></div> 121<div id="stickyleft" class="stickyleft"><div class="stickyheader" style="text-align: center;"><a href="#" class="stickyminimize" onClick="HideUnhideStickyAd('stickyleftContent');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line></svg></a><a href="#" class="stickyclose" onClick="CloseStickyAd('stickyleft');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></a></div><div id="stickyleftContent">
121<script type="text/javascript" language="JavaScript">AdGroup3();</script>
121</div></div> 122<div id="stickytop" class="stickytop"><div class="stickyheader" style="text-align: center;"><a href="#" class="stickyminimize" onClick="HideUnhideStickyAd('stickytopContent');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line></svg></a><a href="#" class="stickyclose" onClick="CloseStickyAd('stickytop');"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></a></div><div id="stickytopContent">
122<script type="text/javascript" language="JavaScript">AdGroup4();</script>
122</div></div>
123<script language="javascript">checkStickyAdCookie();</script>
123</span> 124 <!-- /stycky ads--> 125 <div class="container-bl mt-2"> 126 <!-- top-links --> 127 <div class="row mb-3"> 128 <div class="bl-top-links col-sm-8 float-start mb-sm-0 ps-lg-0"> 129 <div class="float-start hpe-top-links"> 130 <!-- search--> 131
131<script type="text/javascript" language="JavaScript">GetGoogleCustomSearch();</script>
131 132 <a class="search-link text-decoration-none text-black fs-6 fw-bold me-3 border rounded p-1 px-2 bl-toplink-1-133-searchlink" href="javascript:void(0)" data-bs-toggle="tooltip" data-bs-placement="right" title="Click to Search Articles..."><i class="fa fa-search" aria-hidden="true"></i> SEARCH</a> 133 <div class="search_content"> 134 <div class="search_box"><gcse:searchbox></gcse:searchbox></div> 135 <div class="search_results"><gcse:searchresults></gcse:searchresults></div> 136 <div class="search_remove"> 137 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-x-lg" viewBox="0 0 16 16"> 138 <path fill-rule="evenodd" d="M13.854 2.146a.5.5 0 0 1 0 .708l-11 11a.5.5 0 0 1-.708-.708l11-11a.5.5 0 0 1 .708 0Z"/> 139 <path fill-rule="evenodd" d="M2.146 2.146a.5.5 0 0 0 0 .708l11 11a.5.5 0 0 0 .708-.708l-11-11a.5.5 0 0 0-.708 0Z"/> 140 </svg> 141 </div> 142 </div> 143
143<script> 144 document.getElementsByClassName('search-link')[0].addEventListener("click", function() { 145 document.getElementById("gsc-i-id1").setAttribute("placeholder", "Search for..."); 146 document.getElementsByClassName('search_content')[0].classList.add("search-flex"); 147 document.getElementsByClassName('search_remove')[0].style.display = "block"; 148 document.getElementsByClassName('gsc-results-close-btn')[0].addEventListener("click", function() { 149 document.getElementsByClassName('search_content')[0].classList.remove("search-flex"); 150 }); 151 }); 152 document.getElementsByClassName('search_remove')[0].addEventListener("click", function() { 153 document.getElementsByClassName('search_content')[0].classList.remove("search-flex"); 154 document.getElementsByClassName('search_remove')[0].style.display = "none"; }); 155 </script>
155 156 <style> 157 .gsc-adBlock {display: none !important;} 158 #gsc-i-id1{color:#000!important} 159 #gsc-i-id1::placeholder{color:#555!important;opacity:1;font-size:inherit!important} 160 .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 linear;} 161 .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 linear;} 162 .search_remove{cursor:pointer;user-select:none;position:absolute;top:10px;left:3%;} 163 .search_remove:hover{color:gray} 164 .gsc-control-cse.gsc-control-cse-en{background-color:transparent;border-width:0;position:absolute}.search_box{border-bottom:2px solid #000;width:70%;padding-bottom:6px} 165 .gsib_b,.gsst_a{display:none!important} 166 .gscb_a{display:none!important} 167 .gsc-input{background-image:none!important} 168 .gsc-input{background-color:transparent!important} 169 .gsc-input-box{background-color:transparent!important;border-bottom:0 solid #ff4500!important;border-width:0!important} 170 .gsc-input{border-width:0!important;color:#fff!important;font-size:20px!important} 171 .gsc-adBlock{display:none!important} 172 .search-icon-desk{cursor:pointer} 173 .search-icon-desk{float:right;height:54px;margin-right:10px} 174 .search-icon-desk i{border:1px solid #ddd;border-radius:4px;color:#000;display:block;line-height:35px;margin-top:9px;padding:0 12px} 175 .search-icon-desk i:hover{color:#79655d} 176 .gsc-results-wrapper-overlay.gsc-results-wrapper-visible {width: 100%;left: 0;top: 0;height: 100%;} 177 .gcsc-branding {display: none;} 178 .gsc-search-button.gsc-search-button-v2{padding:0 18px;line-height:35px;display:inline-block!important;background:#ddd;border-radius:5px;border-color:#555} 179 .gsc-search-button{width:auto!important;float:right!important}.gsc-search-button.gsc-search-button-v2:hover{background:#ddd!important} 180 .gsc-search-button-v2 svg{fill:#000!important} 181 .gsc-search-button.gsc-search-button-v2:hover{background:#05a2d3!important;border-color:#006899!important} 182 .gsc-search-button.gsc-search-button-v2:hover svg{fill:#fff!important} 183 </style> 184 <!-- /search--> 185 <a class="text-decoration-none text-black fs-6 me-3 bl-toplink-1-133-link" href="/index141.htm">ABOUT</a> 186 <a class="text-decoration-none text-black fs-6 me-3 bl-toplink-1-133-link" href="/ContactUs">CONTACT</a> 187 <a class="text-decoration-none text-black fs-6 me-3 bl-toplink-1-133-link" href="/SubscribeToday">SUBSCRIBE</a> 188 </div> 189 </div> 190 <div class="cus-social-links col-sm-4 float-sm-end d-flex justify-content-center d-sm-inline-block pe-lg-0"> 191 192 </div> 193 </div> 194 <!-- /top-links --> 195 <!-- logo--> 196 <div class="row mb-3"> 197 <div class="col-12 d-flex justify-content-center hpe-logo" data-logo-width="1250"><div data-cms-el="logo">
197<script type="text/javascript" language="JavaScript">GetLogo();</script>
197</div></div> 198 </div> 199 <!-- /logo --> 200 <!-- menu --> 201 <div class="row mb-3"> 202 <div class="col-12 px-0"> 203
203<script type="text/javascript" language="JavaScript"> 204 GetMenuH(); 205 </script>
205 206 </div> 207 </div> 208 <!-- /menu --> 209 210 <!-- 2-columns --> 211 <div class="cus-column-133-row row mb-3 border-bottom"> 212 <div class="cus-column-133-1 container col-lg-9 ps-lg-0 pe-lg-3"> 213 <div class="w-100 cus-position-sticky float-start" data-sticky="10"> 214 <div class="row mb-2"> 215 <div class="col-12"> 216 <div data-cms-popup-root="1"><style> 217#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;} 218.form-check-label:hover {color: #0d6efd;cursor: pointer;} 219.cus-form-loader .cus-form-loading {display: block !important;} 220.cus-form-loader .formbody fieldset, .cus-form-loader .system_text.footer_text {opacity: 0.5;pointer-events: none;} 221#cus-form-button-loader {display:none;} 222.cus-form-loader footer, .cus-form-loader button {cursor: no-drop;} 223.fast-spin {-webkit-animation: fa-spin 1s infinite linear;animation: fa-spin 1s infinite linear;} 224.cus-form-loader #SUBMIT1 {display:none;} 225.cus-form-loader #cus-form-button-loader {display:inline-block;} 226.form-floating > .form-control:focus ~ label {color: #0d6efd !important;} 227.form-control:not(:disabled):not([readonly])::file-selector-button {position: absolute;right: 0;border-radius: 5px !important;} 228.input-file-preview {display: none;} 229.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;} 230.w-96 {width: 96% !important;} 231.p-valid {color: green;} 232.p-valid:before {position: relative;left: -10px;content: "â";} 233.p-invalid {color: red;} 234.p-invalid:before {position: relative;left: -10px;content: "â";font-size: 0.875rem !important;} 235.open-eye, .close-eye {position: absolute;right: 2%;top: 50%;transform: translate(0,-50%);cursor: pointer;} 236.open-eye i:hover, .close-eye i:hover {color: gray !important;} 237.cus-form-help:before {content: "\f05a";font-family: FontAwesome;padding-left: 0.5rem;padding-right: 0.5rem;} 238.cus-form-help {display: none;} 239.cus-form-help:empty {display: none !important;} 240.form-control:focus ~ .cus-form-help {display: block;} 241.formdivider.formdivider_custom {border-left: 5px solid #ffc107;} 242.form-floating > .form-control {caret-color: #0d6efd;} 243</style> 244<style id="force-form-styles" data-version="2026-01-26-v2"> 245 textarea, textarea.form-control, textarea.formfieldinput { min-height: 120px !important; height: 120px !important; } 246 247 /* Enhanced Spinner Styles - More visible and animated */ 248 .form-spinner-ring { 249 display: inline-block; 250 width: 18px; 251 height: 18px; 252 border: 3px solid rgba(255,255,255,0.4); 253 border-top-color: #fff; 254 border-radius: 50%; 255 animation: formSpin 0.7s linear infinite; 256 margin-right: 8px; 257 vertical-align: middle; 258 } 259 @keyframes formSpin { 260 0% { transform: rotate(0deg); } 261 100% { transform: rotate(360deg); } 262 } 263 264 /* Submit Button Loading State */ 265 button.btn-loading, input.btn-loading { 266 position: relative; 267 pointer-events: none; 268 opacity: 0.85; 269 } 270 button.btn-loading::after { 271 content: ''; 272 position: absolute; 273 width: 18px; 274 height: 18px; 275 top: 50%; 276 left: 12px; 277 margin-top: -9px; 278 border: 3px solid rgba(255,255,255,0.4); 279 border-top-color: #fff; 280 border-radius: 50%; 281 animation: formSpin 0.7s linear infinite; 282 } 283 284 /* Form Overlay during submission */ 285 .form-loading-overlay { 286 position: absolute; 287 top: 0; 288 left: 0; 289 right: 0; 290 bottom: 0; 291 background: rgba(255,255,255,0.7); 292 display: flex; 293 align-items: center; 294 justify-content: center; 295 z-index: 9999; 296 border-radius: inherit; 297 } 298 .form-loading-overlay .spinner-container { 299 display: flex; 300 flex-direction: column; 301 align-items: center; 302 gap: 12px; 303 padding: 30px; 304 background: white; 305 border-radius: 12px; 306 box-shadow: 0 4px 20px rgba(0,0,0,0.15); 307 } 308 .form-loading-overlay .spinner-large { 309 width: 40px; 310 height: 40px; 311 border: 4px solid #e0e0e0; 312 border-top-color: #007bff; 313 border-radius: 50%; 314 animation: formSpin 0.8s linear infinite; 315 } 316 .form-loading-overlay .loading-text { 317 color: #333; 318 font-size: 14px; 319 font-weight: 500; 320 } 321 322 /* Bootstrap 5 Floating Label Fix - Force proper behavior */ 323 .form-floating > .form-control:focus ~ label, 324 .form-floating > .form-control:not(:placeholder-shown) ~ label, 325 .form-floating > .form-select ~ label { 326 opacity: 0.65 !important; 327 transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem) !important; 328 } 329 .form-floating > .form-control::placeholder { 330 color: transparent !important; 331 } 332 .form-floating > label { 333 position: absolute !important; 334 top: 0 !important; 335 left: 0 !important; 336 height: 100% !important; 337 padding: 1rem 0.75rem !important; 338 pointer-events: none !important; 339 border: 1px solid transparent !important; 340 transform-origin: 0 0 !important; 341 transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out !important; 342 } 343 </style> 344<style>.grecaptcha-badge{visibility:hidden!important;position:fixed!important;bottom:14px!important;right:14px!important;}</style>
345<script src="/iframe-resizer-master/js/iframeResizer.contentWindow.js"></script>
vendor: 1 bytes, line 345
345
346<script type="text/javascript" language="javascript" src="https://kahnawakenews.com/lib/bl2.js"></script>
vendor: 1 bytes, line 346
346
347<script> 348function ChangeInputFocus(obj, evt, cname) { 349/*if (evt.type == "focus") 350obj.className = cname; 351else if (evt.type == "blur") 352/*obj.className = cname;*/ 353} 354</script>
vendor: 1 bytes, line 354
354
355<script src="https://recaptcha.net/recaptcha/api.js?render=6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM"></script>
vendor: 1 bytes, line 355
355
356<script> 357(function(){ 358 function setToken(t){ 359 var els = document.querySelectorAll('.g-recaptcha-token'); 360 for (var i = 0; i < els.length; i++) els[i].value = t; 361 } 362 function refresh(){ 363 if (typeof grecaptcha === 'undefined') return; 364 grecaptcha.ready(function(){ 365 grecaptcha.execute('6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM', {action: 'submit'}).then(setToken); 366 }); 367 } 368 // Submit-time minter. Login pages call this in their submit handler and await it, 369 // so the request always carries a freshly-minted token instead of reading the 370 // pre-filled hidden field â which may still be empty when a user with saved 371 // credentials presses Enter before the page-load mint resolves (-> recaptcha_missing, 372 // a hard block). Resolves to a fresh token, or falls back to whatever's already in 373 // the field (and never hangs the form: 3s timeout, and resolves if grecaptcha is 374 // unavailable). Also updates the hidden field so FormData-based submits pick it up. 375 window.cmsMintCaptchaToken = function(){ 376 return new Promise(function(resolve){ 377 var els = document.querySelectorAll('.g-recaptcha-token'); 378 var fallback = (els[0] && els[0].value) || ''; 379 var done = false; 380 var to = setTimeout(function(){ if(!done){ done = true; resolve(fallback); } }, 3000); 381 function fin(v){ if(done) return; done = true; clearTimeout(to); setToken(v); resolve(v); } 382 function attempt(){ 383 if (typeof grecaptcha === 'undefined' || !grecaptcha.execute) return false; 384 try { 385 grecaptcha.ready(function(){ 386 grecaptcha.execute('6LdXmfgUAAAAAJNuEHBxVCY0w9eA73hvaWsdgPlM', {action: 'submit'}) 387 .then(function(t){ fin(t || fallback); }) 388 .catch(function(){ fin(fallback); }); 389 }); 390 return true; 391 } catch(_) { return false; } 392 } 393 // grecaptcha may still be loading -- common when the form is rendered 394 // inside a popup, where api.js was injected only moments ago. Poll until 395 // it's ready (or the 3s timeout fires) instead of bailing immediately. 396 if (!attempt()) { 397 var iv = setInterval(function(){ 398 if (done) { clearInterval(iv); return; } 399 if (attempt()) clearInterval(iv); 400 }, 150); 401 } 402 }); 403 }; 404 refresh(); 405 setTimeout(refresh, 5000); 406 setInterval(refresh, 120000); 407})(); 408</script>
408 409<div class="formbody"> 410<div class="body p-2"> 411<!--FormError--> 412<!--FormMessage--> 413<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)"> 414<div aria-hidden="true" style="position:absolute;left:-9999px;top:-9999px;height:0;width:0;overflow:hidden;"> 415 <label for="website_url_hp">Website (leave blank)</label> 416 <input type="text" name="website_url" id="website_url_hp" tabindex="-1" autocomplete="off" value=""> 417</div> 418<input type="hidden" name="token" class="g-recaptcha-token" value=""> 419<!--FKeys--> 420<input type="hidden" name="SystemEmailSubject" value="mywebsite.com: Contact Us"> 421<input type="hidden" name="SystemEmailConfirmMessage" value="Your message has been forwarded to appropriate personnel. <br><br>We will contact you within 24 hours.<br><br>Thank you."> 422<input type="hidden" name="SystemEmailFormat" value="HTML"> 423<input type="hidden" name="SystemEmailTo" value="[email protected]"> 424<input type="hidden" name="SystemEmailCC" value=""> 425<center class="fw-bold mb-3 fs-3 text-secondary">Contact Us</center> 426<fieldset> 427<div class="system_text Header_text mb-5 text-center"><CENTER><B>Use the form below for comments or questions.</B></CENTER></div> 428 429 430 431<section class="w-100 mb-3 mt-5"> 432<div class="label w-100 mb-2"> 433<div class="inp_custom"> 434<div class="formdivider formdivider_custom" style="border-bottom: 2px solid #343a40;"> 435<span class="text-white d-inline-block fw-bold bg-dark px-3 py-2">Contact Us</span> 436</div> 437</div> 438</div> 439</section> 440 441 442 443<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 444<div class="input w-100 form-floating"> 445<INPUT NAME="Subject" VALUE="" id="Subject" maxlength="" placeholder=" " type="Text" class="formfieldinput formfieldinput_custom form-control" required> 446<label for="Subject" class="form-label text-muted">* Subject</label> 447</div> 448</section> 449 450 451 452 453<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title="Be sure to enter proper email so we can contact you."> 454<div class="input w-100 form-floating"> 455<INPUT NAME="Email" VALUE="" id="Email" maxlength="" placeholder=" " type="Email" class="formfieldinput formfieldinput_custom form-control" required> 456<label for="Email" class="form-label text-muted">* Email</label> 457</div> 458</section> 459 460 461 462 463<section class="w-96 mb-3" style="margin-left:2%" data-bs-toggle="tooltip" data-bs-placement="auto" title=""> 464<div class="input w-100 form-floating"> 465<textarea name="Message" id="Message" 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> 466<label for="Message" class="form-label text-muted">* Message</label> 467</div> 468</section> 469 470 471 472 473</fieldset> 474<footer class="text-center mt-3"> 475<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> 476<i id="cus-form-button-loader" class='fa fa-circle-o-notch fa-spin fast-spin fs-1 text-primary'></i> 477</footer> 478<div class="system_text footer_text mt-5 mb-3 text-center"></div> 479</form> 480</div>
481<script language="javascript">GetGoogleAnalytics('FORM:ContactUs');</script>
481 482<!-- Tooltip -->
483<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 483
483
484<script> 485var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) 486var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 487return new bootstrap.Tooltip(tooltipTriggerEl) 488}) 489</script>
489 490<!-- /Tooltip --> 491</div> 492 493<!-- Form Script v2026-01-26-v2 --> 494<!-- Modern Popup Modal for Messages --> 495<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;"> 496 <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);"> 497 <div id="form-message-text" style="margin-bottom:20px; font-size:15px; color:#333; text-align:center; line-height:1.5;"></div> 498 <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> 499 </div> 500</div> 501
502<script> 503// Resolve the URL to POST the form to. On a normal page load the form lives at 504// its own URL, so window.location.pathname is correct. But when the form is 505// opened inside a popup (sys-popup.js), the page URL is the HOST page, not the 506// form's URL -- sys-popup stamps the real form path onto the form as 507// data-form-action, which we prefer when present. 508function cmsResolvePostUrl(form) { 509 var f = form || document.querySelector('form'); 510 var a = f && f.getAttribute && f.getAttribute('data-form-action'); 511 return a || window.location.pathname; 512} 513 514// Modern message popup function 515// onClose callback is called when user clicks OK (useful for resetting button on error) 516function showFormMessage(text, isSuccess = false, onClose = null) { 517 const modal = document.getElementById('form-message-modal'); 518 const modalMsg = document.getElementById('form-message-text'); 519 const modalOk = document.getElementById('form-message-ok'); 520 521 if (modal && modalMsg && modalOk) { 522 modalMsg.innerHTML = isSuccess 523 ? '<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 524 : text; 525 modal.style.display = 'flex'; 526 modalOk.onclick = function() { 527 modal.style.display = 'none'; 528 if (isSuccess) { 529 (window.top || window).location.href = '/'; 530 } else if (onClose) { 531 onClose(); 532 } 533 }; 534 // Also close on backdrop click 535 modal.onclick = function(e) { 536 if (e.target === modal) { 537 modal.style.display = 'none'; 538 if (isSuccess) { 539 (window.top || window).location.href = '/'; 540 } else if (onClose) { 541 onClose(); 542 } 543 } 544 }; 545 } else { 546 // Fallback to alert if modal not found 547 alert(text); 548 if (isSuccess) { 549 (window.top || window).location.href = '/'; 550 } else if (onClose) { 551 onClose(); 552 } 553 } 554} 555 556// Accept.js card input modal for Authorize.net 557async function showAcceptJsCardInput(clientConfig, form, originalFormData, paymentResult) { 558 console.log('[forms] Loading Accept.js for card tokenization'); 559 560 // Load Accept.js script dynamically 561 if (!window.Accept) { 562 await new Promise((resolve, reject) => { 563 const script = document.createElement('script'); 564 script.src = clientConfig.jsUrl; 565 script.onload = resolve; 566 script.onerror = () => reject(new Error('Failed to load Accept.js')); 567 document.head.appendChild(script); 568 }); 569 } 570 571 // Create card input modal 572 const modalHtml = ` 573 <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;"> 574 <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);"> 575 <h3 style="margin:0 0 20px;color:#333;">Payment Information</h3> 576 <p style="margin:0 0 20px;color:#666;">Amount: <strong>$${paymentResult.amount}</strong></p> 577 578 <div style="margin-bottom:15px;"> 579 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Card Number *</label> 580 <input type="text" id="ajs-card-number" placeholder="4111 1111 1111 1111" maxlength="19" 581 style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;box-sizing:border-box;"> 582 </div> 583 584 <div style="display:flex;gap:15px;margin-bottom:15px;"> 585 <div style="flex:1;"> 586 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Exp Month *</label> 587 <select id="ajs-exp-month" style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;"> 588 <option value="">MM</option> 589 ${[...Array(12)].map((_,i) => '<option value="'+String(i+1).padStart(2,'0')+'">'+String(i+1).padStart(2,'0')+'</option>').join('')} 590 </select> 591 </div> 592 <div style="flex:1;"> 593 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">Exp Year *</label> 594 <select id="ajs-exp-year" style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;"> 595 <option value="">YYYY</option> 596 ${[...Array(15)].map((_,i) => { const y=new Date().getFullYear()+i; return '<option value="'+y+'">'+y+'</option>'; }).join('')} 597 </select> 598 </div> 599 <div style="width:100px;"> 600 <label style="display:block;margin-bottom:5px;font-weight:600;color:#333;">CVV *</label> 601 <input type="text" id="ajs-cvv" placeholder="123" maxlength="4" 602 style="width:100%;padding:12px;border:1px solid #ccc;border-radius:4px;font-size:16px;box-sizing:border-box;"> 603 </div> 604 </div> 605 606 <div id="ajs-error" style="color:#dc3545;margin-bottom:15px;
606display:none;"></div> 607 608 <div style="display:flex;gap:10px;"> 609 <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> 610 <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> 611 </div> 612 </div> 613 </div> 614 `; 615 616 document.body.insertAdjacentHTML('beforeend', modalHtml); 617 618 const modal = document.getElementById('acceptjs-modal'); 619 const cardInput = document.getElementById('ajs-card-number'); 620 const cvvInput = document.getElementById('ajs-cvv'); 621 const errorDiv = document.getElementById('ajs-error'); 622 623 // Format card number 624 cardInput.addEventListener('input', function(e) { 625 let v = e.target.value.replace(/\s+/g, '').replace(/[^0-9]/g, ''); 626 let f = ''; 627 for (let i = 0; i < v.length; i++) { if (i > 0 && i % 4 === 0) f += ' '; f += v[i]; } 628 e.target.value = f; 629 }); 630 631 // Only numbers in CVV 632 cvvInput.addEventListener('input', function(e) { 633 e.target.value = e.target.value.replace(/[^0-9]/g, ''); 634 }); 635 636 // Cancel button - also reset the submit button 637 document.getElementById('ajs-cancel').onclick = function() { 638 modal.remove(); 639 // Reset the original form's submit button 640 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 641 if (submitBtn) { 642 submitBtn.disabled = false; 643 if (submitBtn.tagName === 'INPUT') { 644 submitBtn.value = 'Submit'; 645 } else { 646 submitBtn.innerHTML = 'Submit'; 647 } 648 } 649 }; 650 651 // Submit button 652 document.getElementById('ajs-submit').onclick = async function() { 653 const cardNumber = cardInput.value.replace(/\s+/g, ''); 654 const expMonth = document.getElementById('ajs-exp-month').value; 655 const expYear = document.getElementById('ajs-exp-year').value; 656 const cvv = cvvInput.value; 657 658 // Validate 659 if (!cardNumber || cardNumber.length < 13) { 660 errorDiv.textContent = 'Please enter a valid card number'; 661 errorDiv.style.display = 'block'; 662 return; 663 } 664 if (!expMonth || !expYear) { 665 errorDiv.textContent = 'Please select expiration date'; 666 errorDiv.style.display = 'block'; 667 return; 668 } 669 if (!cvv || cvv.length < 3) { 670 errorDiv.textContent = 'Please enter CVV'; 671 errorDiv.style.display = 'block'; 672 return; 673 } 674 675 errorDiv.style.display = 'none'; 676 this.disabled = true; 677 this.innerHTML = '<span class="form-spinner-ring" style="border-color:rgba(255,255,255,0.4);border-top-color:#fff;"></span> Processing...'; 678 679 // Test card detection - skip Accept.js tokenization 680 var TEST_CARDS_V3 = ['4111111111111111', '4000000000000000', '5500000000000004', '370000000000002', '6011000000000004']; 681 if (TEST_CARDS_V3.indexOf(cardNumber) !== -1) { 682 console.log('[forms] Test card detected - skipping tokenization'); 683 originalFormData.append('dataDescriptor', 'TEST_CARD'); 684 originalFormData.append('dataValue', 'TEST'); 685 originalFormData.append('pf-card-number-input', cardNumber); 686 687 try { 688 const testResp = await fetch(cmsResolvePostUrl(), { 689 method: 'POST', 690 body: originalFormData, 691 headers: { 'Accept': 'application/json' } 692 }); 693 const testResult = await testResp.json(); 694 modal.remove(); 695 if (testResult.success && testResult.isPaymentComplete) { 696 if (testResult.subscriberToken) { 697 try { 698 var tp2 = JSON.parse(atob(testResult.subscriberToken.split('.')[1])); 699 var ma2 = tp2.exp ? (tp2.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 700 document.cookie = 'subscriber_token=' + encodeURIComponent(testResult.subscriberToken) + '; path=/; max-age=' + ma2 + '; SameSite=Lax'; 701 } catch (e) { /* ignore */ } 702 } 703 var msg = testResult.confirmMessage 704 ? testResult.confirmMessage + '<br><br><small>Transaction ID: ' + testResult.transactionId + '</small>' 705 : 'Test payment successful! Transaction ID: ' + testResult.transactionId; 706 var retUrl = null; 707 try { retUrl = localStorage.getItem('subscriber_return_url'); } catch (e) { /* ignore */ } 708 if (!retUrl) { try { retUrl = new URLSearchParams(window.location.search).get('return_url'); } catch (e) { /* ignore */ } } 709 if (retUrl) { 710 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 711 msg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 712 showFormMessage(msg, true); 713 setTimeout(function() { window.location.href = retUrl; }, 2000); 714 } else { 715 showFormMessage(msg, true); 716 } 717 form.reset(); 718 } else { 719 showFormMessage(testResult.error || 'Payment failed.', false); 720 } 721 } catch (e) { 722 modal.remove(); 723 showFormMessage('Network error. Please try again.', false); 724 } 725 return; 726 } else { 727 // Build Accept.js request 728 const secureData = { 729 authData: { 730 clientKey: clientConfig.clientKey, 731 apiLoginID: clientConfig.apiLoginId 732 }, 733 cardData: { 734 cardNumber: cardNumber, 735 month: expMonth, 736 year: expYear, 737 cardCode: cvv 738 } 739 }; 740 741 // Tokenize via Accept.js 742 Accept.dispatchData(secureData, async function(response) { 743 if (response.messages.resultCode === 'Error') { 744 const errorText = response.messages.message.map(m => m.text).join(', '); 745 errorDiv.textContent = errorText; 746 errorDiv.style.display = 'block'; 747 const ajsBtn = document.getElementById('ajs-submit'); 748 ajsBtn.disabled = false;
749 ajsBtn.innerHTML = 'Pay Now'; 750 return; 751 } 752 753 console.log('[forms] Card tokenized successfully, resubmitting form'); 754 755 // Add token to form data and resubmit 756 originalFormData.append('dataDescriptor', response.opaqueData.dataDescriptor); 757 originalFormData.append('dataValue', response.opaqueData.dataValue); 758 759 try { 760 const response2 = await fetch(cmsResolvePostUrl(), { 761 method: 'POST', 762 body: originalFormData, 763 headers: { 'Accept': 'application/json' } 764 }); 765 const result2 = await response2.json(); 766 767 modal.remove(); 768 769 // Get the submit button to reset on error 770 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 771 const resetButton = function() { 772 if (submitBtn) { 773 submitBtn.disabled = false; 774 if (submitBtn.tagName === 'INPUT') { 775 submitBtn.value = 'Submit'; 776 } else { 777 submitBtn.innerHTML = 'Submit'; 778 } 779 } 780 }; 781 782 if (result2.success && result2.isPaymentComplete) { 783 // Auto-login: set subscriber_token cookie if provided 784 if (result2.subscriberToken) { 785 try { 786 var tp = JSON.parse(atob(result2.subscriberToken.split('.')[1])); 787 var ma = tp.exp ? (tp.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 788 document.cookie = 'subscriber_token=' + encodeURIComponent(result2.subscriberToken) + '; path=/; max-age=' + ma + '; SameSite=Lax'; 789 console.log('[forms] Auto-login: subscriber_token cookie set (Accept.js path)'); 790 } catch (e) { console.warn('[forms] Auto-login cookie error', e); } 791 } 792 // Build success message with custom confirm message if available 793 let successMsg = 'Payment successful! Transaction ID: ' + result2.transactionId; 794 if (result2.confirmMessage) { 795 successMsg = result2.confirmMessage + '<br><br><small>Transaction ID: ' + result2.transactionId + '</small>'; 796 } 797 var retUrl2 = null; 798 try { retUrl2 = localStorage.getItem('subscriber_return_url'); } catch (e) { /* ignore */ } 799 if (!retUrl2) { try { retUrl2 = new URLSearchParams(window.location.search).get('return_url'); } catch (e) { /* ignore */ } } 800 if (retUrl2) { 801 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 802 successMsg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 803 showFormMessage(successMsg, true); 804 setTimeout(function() { window.location.href = retUrl2; }, 2000); 805 } else { 806 showFormMessage(successMsg, true); 807 } 808 form.reset(); 809 } else { 810 showFormMessage(result2.error || 'Payment failed. Please try again.', false, resetButton); 811 } 812 } catch (e) { 813 modal.remove(); 814 const submitBtn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 815 showFormMessage('Network error. Please try again.', false, function() { 816 if (submitBtn) { 817 submitBtn.disabled = false; 818 if (submitBtn.tagName === 'INPUT') { 819 submitBtn.value = 'Submit'; 820 } else { 821 submitBtn.innerHTML = 'Submit'; 822 } 823 } 824 }); 825 } 826 }); 827 } // end else (real card tokenization) 828 }; 829} 830 831// Initialize File Uploader on load to handle image cropping/uploading. 832// Defined as a named function (not an inline DOMContentLoaded callback) so it can 833// also run immediately when the DOM is ALREADY parsed -- e.g. when this form is 834// injected into a popup after DOMContentLoaded has already fired. Without that, 835// the uploader (image cropper) never initializes inside the modal. 836async function cmsInitFormUploader() { 837 // Restore form data if user cancelled payment 838 try { 839 const pendingData = sessionStorage.getItem('_pendingFormData'); 840 if (pendingData) { 841 const formData = JSON.parse(pendingData); 842 const form = document.getElementById('CustomForm') || document.querySelector('form'); 843 if (form) { 844 for (const [key, value] of Object.entries(formData)) { 845 if (value && typeof value === 'string') { 846 const field = form.querySelector('[name="' + key + '"]'); 847 if (field) { 848 if (field.tagName === 'SELECT') { 849 field.value = value; 850 } else if (field.type !== 'file' && field.type !== 'hidden') { 851 field.value = value; 852 } 853 } 854 } 855 } 856 console.log('[forms] Restored form data from cancelled payment'); 857 } 858 // Clear the stored data 859 sessionStorage.removeItem('_pendingFormData'); 860 sessionStorage.removeItem('_pendingFormUrl'); 861 } 862 } catch (e) { 863 console.error('[forms] Error restoring form data:', e); 864 } 865 866 try { 867 const { UnifiedFileUploader } = await import('/sys-components-UnifiedFileUploader.js?v=' + Date.now()); 868 window.unifiedUploader = new UnifiedFileUploader(); 869 window.unifiedUploader.init(); 870 } catch (e) { 871 console.error('Failed to init uploader:', e); 872 } 873}
874// Normal page load: wait for DOMContentLoaded. Popup: the form is injected after 875// DOMContentLoaded already fired, so run immediately when the DOM is already 876// parsed -- otherwise the uploader (image cropper) never initializes in the 877// modal. The earlier empty-box / stuck-button symptom was FontAwesome 4 vs 6 878// (the FA6 spinner glyph was missing); the form now injects FA6, so the cropper 879// controls and spinner render and the uploader completes normally here too. 880if (document.readyState === 'loading') { 881 document.addEventListener('DOMContentLoaded', cmsInitFormUploader); 882} else { 883 cmsInitFormUploader(); 884} 885 886async function unifiedSubmitForm(event) { 887 console.log('[forms] unifiedSubmitForm called v5 - 2026-01-26 Enhanced spinner'); 888 if (event) { event.preventDefault(); event.stopPropagation(); } 889 890 // Use event.target if available (most reliable) 891 const form = (event && event.target && event.target.tagName === 'FORM') ? event.target : (document.getElementById('CustomForm') || document.querySelector('form')); 892 893 // Enforce native constraint validation (required / type=email / pattern ...) 894 // BEFORE anything else. This handler preventDefault()s the native submit on its 895 // first line, which also bypasses the browser's own required-field check -- so 896 // without this call a blank required field would fetch-POST straight through 897 // (legacy custom forms had no client-side guard at all). reportValidity() focuses 898 // the first invalid field, shows the browser's validation bubble, and bails. 899 // Runs before the submit button is put into its spinner/disabled state so a 900 // blocked submit leaves the form fully usable. 901 if (form && typeof form.reportValidity === 'function' && !form.reportValidity()) { 902 return false; 903 } 904 905 // Ensure any processed files are in the form before submission 906 if (window.unifiedUploader && window.unifiedUploader.ensureProcessedFilesInForm) { 907 window.unifiedUploader.ensureProcessedFilesInForm(); 908 } 909 910 const btn = form.querySelector('button[type="submit"], #SUBMIT1, input[type="submit"]'); 911 const originalHtml = btn ? (btn.tagName === 'INPUT' ? btn.value : btn.innerHTML) : 'Submit'; 912 913 // Show loading state with spinner 914 if (btn) { 915 btn.disabled = true; 916 if (btn.tagName === 'INPUT') { 917 // Inputs can't hold an inline span, so use the class-based ::after spinner. 918 btn.classList.add('btn-loading'); 919 btn.value = ' Processing...'; 920 btn.style.paddingLeft = '35px'; 921 } else { 922 // Buttons: the inline ring span is the single spinner. Do NOT add the 923 // btn-loading class here -- button.btn-loading::after renders a SECOND 924 // spinner, which produced two spinning icons at once on submit. Keep the 925 // disabled look via inline styles instead (robust even in popups where the 926 // injected spinner CSS may be absent). 927 btn.style.pointerEvents = 'none'; 928 btn.style.opacity = '0.85'; 929 btn.innerHTML = '<span class="form-spinner-ring"></span> Processing...'; 930 } 931 } 932 933 // Single spinner only: the disabled submit button already shows a spinner 934 // ("Processing..."), so we intentionally do NOT add the full-form overlay 935 // spinner here -- it produced two spinning icons at once (most visible in the 936 // popup). overlay stays null; the cleanup checks below are guarded for it. 937 let overlay = null; 938 try { 939 // Mint a fresh reCAPTCHA token before reading the form. On popup-rendered 940 // forms the on-load mint may not have fired yet (api.js was injected only 941 // moments ago by sys-popup's executeScripts), so without this the hidden 942 // token field is still empty and the server blocks as recaptcha_missing. 943 if (typeof window.cmsMintCaptchaToken === 'function') { 944 try { await window.cmsMintCaptchaToken(); } catch (e) {} 945 } 946 const formData = new FormData(form); 947 948 // Capture display TEXT for all select, radio, and checkbox elements 949 // Add as fieldname_text so email shows human-readable labels instead of raw values 950 form.querySelectorAll('select').forEach(function(select) { 951 if (select.name && select.selectedIndex >= 0) { 952 if (select.multiple) { 953 // Multi-select: join the text of EVERY selected option, not just the first 954 var multiTexts = Array.prototype.map.call(select.selectedOptions, function(o) { return o.text; }); 955 formData.append(select.name + '_text', multiTexts.join(', ')); 956 } else { 957 const selectedOption = select.options[select.selectedIndex]; 958 if (selectedOption) { 959 formData.append(select.name + '_text', selectedOption.text); 960 } 961 } 962 } 963 }); 964 // Capture checked radio button labels 965 var radiosDone = {}; 966 form.querySelectorAll('input[type="radio"]:checked').forEach(function(radio) { 967 if (radio.name && !radiosDone[radio.name]) { 968 radiosDone[radio.name] = true; 969 var label = form.querySelector('label[for="' + radio.id + '"]'); 970 if (label) { 971 formData.append(radio.name + '_text', label.textContent.trim()); 972 } 973 } 974 }); 975 // Capture checked checkbox labels 976 var checkboxTexts = {}; 977 form.querySelectorAll('input[type="checkbox"]:checked').forEach(function(cb) { 978 if (cb.name) { 979 var cleanName = cb.name.replace('[]', ''); 980 var label = form.querySelector('label[for="' + cb.id + '"]'); 981 var text = label ? label.textContent.trim() : (cb.value === 'on' ? 'Yes' : cb.value); 982 if (!checkboxTexts[cleanName]) checkboxTexts[cleanName] = []; 983 checkboxTexts[cleanName].push(text); 984 } 985 });
986 Object.keys(checkboxTexts).forEach(function(name) { 987 formData.append(name + '_text', checkboxTexts[name].join(', ')); 988 }); 989 const response = await fetch(cmsResolvePostUrl(form), { 990 method: 'POST', 991 body: formData, 992 headers: { 'Accept': 'application/json' } 993 }); 994 const result = await response.json(); 995 console.log('[forms] v3 Server response:', JSON.stringify(result)); 996 console.log('[forms] v3 Keys in result:', Object.keys(result).join(', ')); 997 console.log('[forms] v3 requiresCardInput:', result.requiresCardInput, 'clientConfig:', !!result.clientConfig); 998 console.log('[forms] v3 isPaymentRedirect:', result.isPaymentRedirect, 'redirectUrl:', result.redirectUrl); 999 if (result.success) { 1000 // PRIORITY 0: Check if payment is already complete (Authorize.net Accept.js) 1001 if (result.isPaymentComplete) { 1002 console.log('[forms] Payment complete! Transaction:', result.transactionId); 1003 1004 // Auto-login: set subscriber_token cookie if provided 1005 if (result.subscriberToken) { 1006 try { 1007 var tokenPayload = JSON.parse(atob(result.subscriberToken.split('.')[1])); 1008 var maxAge = tokenPayload.exp ? (tokenPayload.exp - Math.floor(Date.now() / 1000)) : (30 * 24 * 60 * 60); 1009 document.cookie = 'subscriber_token=' + encodeURIComponent(result.subscriberToken) + '; path=/; max-age=' + maxAge + '; SameSite=Lax'; 1010 console.log('[forms] Auto-login: subscriber_token cookie set'); 1011 } catch (e) { 1012 console.warn('[forms] Auto-login: failed to set cookie', e); 1013 } 1014 } 1015 1016 // Build success message with custom confirm message if available 1017 let successMsg = 'Payment successful! Transaction ID: ' + result.transactionId; 1018 if (result.confirmMessage) { 1019 successMsg = result.confirmMessage + '<br><br><small>Transaction ID: ' + result.transactionId + '</small>'; 1020 } 1021 1022 // Redirect back to article if return URL is available (from paywall subscribe flow) 1023 var returnUrl = null; 1024 try { 1025 returnUrl = localStorage.getItem('subscriber_return_url'); 1026 } catch (e) { /* ignore */ } 1027 // Also check URL query param 1028 if (!returnUrl) { 1029 try { 1030 var params = new URLSearchParams(window.location.search); 1031 returnUrl = params.get('return_url'); 1032 } catch (e) { /* ignore */ } 1033 } 1034 1035 if (returnUrl) { 1036 try { localStorage.removeItem('subscriber_return_url'); } catch (e) { /* ignore */ } 1037 // Show brief success message then redirect 1038 successMsg += '<p style="margin-top:15px;color:#666;">Redirecting you back to your article...</p>'; 1039 showFormMessage(successMsg, true); 1040 setTimeout(function() { window.location.href = returnUrl; }, 2000); 1041 } else { 1042 showFormMessage(successMsg, true); 1043 } 1044 form.reset(); 1045 return; 1046 } 1047 1048 // PRIORITY 1: Check for payment redirect FIRST (Stripe Checkout) 1049 // Payment forms MUST redirect to the payment gateway before showing any message 1050 if (result.isPaymentRedirect && result.redirectUrl) { 1051 console.log('[forms] Payment redirect detected, redirecting to:', result.redirectUrl); 1052 window.location.href = result.redirectUrl; 1053 return; 1054 } 1055 1056 // PRIORITY 1.5: Check if card input is required (Authorize.net Accept.js)
1057 console.log('[forms] v3 Checking requiresCardInput:', result.requiresCardInput, 'clientConfig exists:', !!result.clientConfig); 1058 if (result.requiresCardInput && result.clientConfig) { 1059 console.log('[forms] v3 Card input required! Showing Accept.js modal...'); 1060 try { 1061 await showAcceptJsCardInput(result.clientConfig, form, formData, result); 1062 console.log('[forms] v3 showAcceptJsCardInput completed'); 1063 } catch (modalError) { 1064 console.error('[forms] v3 showAcceptJsCardInput error:', modalError); 1065 } 1066 return; 1067 } 1068 1069 // PRIORITY 2: Check for regular redirect URL 1070 if (result.redirectUrl && result.redirectUrl !== window.location.href) { 1071 console.log('[forms] Redirecting to:', result.redirectUrl); 1072 window.location.href = result.redirectUrl; 1073 return; 1074 } 1075 1076 // PRIORITY 3: Show thanks content (email_confirm_message, etc.) 1077 if (result.thanksContent) { 1078 // CRITICAL: Scroll to top BEFORE replacing content to avoid layout shifts 1079 window.scrollTo({ top: 0, behavior: 'smooth' }); 1080 1081 // Check if standalone thank you page is requested 1082 if (result.standaloneThankYou) { 1083 // Replace entire page content with standalone thank you page 1084 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>'; 1085 window.scrollTo({ top: 0, behavior: 'instant' }); 1086 return; 1087 } 1088 1089 // Replace form content with thanks message (embedded mode) 1090 form.innerHTML = '<div id="form-thanks-message" style="padding:40px;text-align:center;min-height:200px">' + result.thanksContent + '</div>'; 1091 1092 // CRITICAL: Force scroll to top using multiple methods for maximum compatibility 1093 const forceScrollToTop = () => { 1094 console.log('[forms] Executing robust scroll-to-top'); 1095 1096 // 1. Standard window scroll 1097 window.scrollTo({ top: 0, behavior: 'smooth' }); 1098 1099 // 2. Element-based scroll (most reliable when embedded) 1100 const thanksEl = document.getElementById('form-thanks-message'); 1101 if (thanksEl) { 1102 thanksEl.scrollIntoView({ behavior: 'smooth', block: 'start' }); 1103 } 1104 1105 // 3. Recursive parent scroll (for nested scrollable containers) 1106 try { 1107 let parent = form.parentElement; 1108 while (parent && parent !== document.body) { 1109 if (parent.scrollHeight > parent.clientHeight) { 1110 console.log('[forms] Resetting parent scroll:', parent); 1111 parent.scrollTop = 0; 1112 } 1113 parent = parent.parentElement; 1114 } 1115 } catch (e) {} 1116 1117 // 4. Fallback for older/mobile browsers 1118 document.body.scrollTop = 0; 1119 document.documentElement.scrollTop = 0; 1120 1121 // 5. Hash trick to force top 1122 if (window.location.hash !== '') { 1123 window.location.hash = ''; 1124 } 1125 1126 // 6. If inside iframe, try to scroll parent window 1127 try { 1128 if (window.parent && window.parent !== window) { 1129 window.parent.scrollTo({ top: 0, behavior: 'smooth' }); 1130 } 1131 } catch (e) {} 1132 }; 1133 1134 // Execute in multiple phases to ensure layout is settled 1135 forceScrollToTop(); 1136 requestAnimationFrame(forceScrollToTop); 1137 setTimeout(forceScrollToTop, 100); 1138 setTimeout(forceScrollToTop, 500); 1139 setTimeout(forceScrollToTop, 1000); 1140 setTimeout(forceScrollToTop, 2000); 1141 } else { 1142 // Default: redirect to home 1143 window.location.href = "/"; 1144 } 1145 } else { 1146 // Remove overlay and reset button on error 1147 if (overlay && overlay.parentNode) overlay.remove(); 1148 showFormMessage(result.error || "Submission failed"); 1149 if (btn) { 1150 btn.disabled = false;
1151 btn.classList.remove('btn-loading'); 1152 btn.style.paddingLeft = ''; 1153 btn.style.pointerEvents = ''; 1154 btn.style.opacity = ''; 1155 if (btn.tagName === 'INPUT') { 1156 btn.value = originalHtml; 1157 } else { 1158 btn.innerHTML = originalHtml; 1159 } 1160 } 1161 } 1162 } catch (e) { 1163 console.error(e); 1164 // Remove overlay and reset button on network error 1165 if (overlay && overlay.parentNode) overlay.remove(); 1166 showFormMessage("Network error. Please check your connection and try again."); 1167 if (btn) { 1168 btn.disabled = false; 1169 btn.classList.remove('btn-loading'); 1170 btn.style.paddingLeft = ''; 1171 btn.style.pointerEvents = ''; 1172 btn.style.opacity = ''; 1173 if (btn.tagName === 'INPUT') { 1174 btn.value = originalHtml; 1175 } else { 1176 btn.innerHTML = originalHtml; 1177 } 1178 } 1179 } 1180 return false; 1181} 1182 1183// ========== STRIPE PAYMENT SUCCESS HANDLER ========== 1184// Check for payment success redirect from Stripe on page load 1185(function checkStripePaymentSuccess() { 1186 const urlParams = new URLSearchParams(window.location.search); 1187 const paymentStatus = urlParams.get('payment'); 1188 const sessionId = urlParams.get('session_id'); 1189 const returnUrl = urlParams.get('return_url'); 1190 1191 if (paymentStatus === 'success' && sessionId) { 1192 console.log('[forms] Detected Stripe payment success, session:', sessionId); 1193 console.log('[forms] Return URL:', returnUrl || 'none'); 1194 1195 // Show loading message 1196 showFormMessage('Processing payment confirmation...'); 1197 1198 // Fetch session details from our API 1199 fetch((typeof __CMS_BASE_PATH !== 'undefined' ? __CMS_BASE_PATH : '') + '/api/payment/session/' + encodeURIComponent(sessionId)) 1200 .then(response => response.json()) 1201 .then(data => { 1202 if (data.success) { 1203 const amount = data.amount ? '$' + parseFloat(data.amount).toFixed(2) : ''; 1204 const txId = data.transaction_id || sessionId; 1205 1206 // Build success message 1207 let msg = '<div style="margin-bottom:15px;font-size:16px;">Your subscription has been activated!</div>'; 1208 msg += '<div style="margin-bottom:15px;font-size:18px;font-weight:600;">Thank you for subscribing.</div>'; 1209 if (amount) { 1210 msg += '<div style="margin-bottom:10px;color:#666;">Amount: <strong>' + amount + '</strong></div>'; 1211 } 1212 if (data.description && data.description !== 'Payment') { 1213 msg += '<div style="margin-bottom:10px;color:#666;">Plan: <strong>' + data.description + '</strong></div>'; 1214 } 1215 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>'; 1216 1217 // If there's a return URL, add redirect notice 1218 if (returnUrl) { 1219 msg += '<div style="margin-top:15px;color:#666;font-size:14px;">Redirecting you back to your article in 3 seconds...</div>'; 1220 } 1221 1222 showFormMessage(msg, true); 1223 1224 // Clean up URL (remove query params) 1225 if (window.history && window.history.replaceState) { 1226 const cleanUrl = window.location.pathname; 1227 window.history.replaceState({}, document.title, cleanUrl); 1228 } 1229 1230 // Redirect to return URL after 3 seconds (back to the article) 1231 if (returnUrl) { 1232 setTimeout(function() { 1233 // Ensure return URL is same origin for security 1234 try { 1235 const returnUrlObj = new URL(returnUrl, window.location.origin); 1236 if (returnUrlObj.origin === window.location.origin) { 1237 window.location.href = returnUrl; 1238 } 1239 } catch (e) { 1240 // If it starts with /, treat as relative URL 1241 if (returnUrl.startsWith('/')) { 1242 window.location.href = returnUrl; 1243 } 1244 } 1245 }, 3000); 1246 } 1247 } else { 1248 showFormMessage('Payment was processed but we could not retrieve details. Your payment was successful.', true); 1249 // Still redirect if return URL exists 1250 if (returnUrl) { 1251 setTimeout(function() { window.location.href = returnUrl; }, 3000); 1252 } 1253 } 1254 }) 1255 .catch(err => { 1256 console.error('[forms] Error fetching session:', err); 1257 // Still show success even if API fails - payment went through 1258 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); 1259 // Still redirect if return URL exists 1260 if (returnUrl) { 1261 setTimeout(function() { window.location.href = returnUrl; }, 3000); 1262 } 1263 }); 1264 } else if (paymentStatus === 'cancelled') { 1265 showFormMessage('Payment was cancelled. You can try again when ready.'); 1266 // Clean up URL 1267 if (window.history && window.history.replaceState) { 1268 const cleanUrl = window.location.pathname; 1269 window.history.replaceState({}, document.title, cleanUrl); 1270 } 1271 } 1272})(); 1273</script>
1273</div> 1274 </div> 1275 </div> 1276 <div class="row mb-2"> 1277 <div class="col-12"> 1278 <hr class="my-2 text-secondary"> 1279 <div data-cms-block="adgroup-12" data-cms-block-label="Advertisement 12" data-cms-el="adgroup" data-cms-adgroup="12">
1279<script type="text/javascript" language="JavaScript">AdGroup12();</script>
1279</div> 1280 </div> 1281 </div> 1282 </div> 1283 </div> 1284 <div class="cus-column-133-2 container col-lg-3 pe-lg-0 ps-lg-3 border-start"> 1285 <div class="w-100 cus-position-sticky float-start" data-sticky="10"> 1286 <div class="row mb-2"> 1287 <div class="col-12 px-0"> 1288 <div data-cms-block="highlight-2" data-cms-block-label="Highlights 2" data-cms-el="highlight" data-cms-highlight="2">
1288<script type="text/javascript" language="JavaScript">GetHighlights2();</script>
1288</div> 1289 </div> 1290 </div> 1291 <div class="row"> 1292 <div class="col-12"> 1293 <div data-cms-block="poll-1" data-cms-block-label="Poll 1" data-cms-el="poll" data-poll-id="1">
1293<script type="text/javascript" language="JavaScript">GetPoll1();</script>
1293</div> 1294 </div> 1295 </div> 1296 <div class="row mb-2"> 1297 <div class="col-12"> 1298 <hr class="my-2 text-secondary"> 1299 <div data-cms-block="adgroup-11" data-cms-block-label="Advertisement 11" data-cms-el="adgroup" data-cms-adgroup="11">
1299<script type="text/javascript" language="JavaScript">AdGroup11();</script>
1299</div> 1300 <div data-cms-block="adgroup-13" data-cms-block-label="Advertisement 13" data-cms-el="adgroup" data-cms-adgroup="13">
1300<script type="text/javascript" language="JavaScript">AdGroup13();</script>
1300</div> 1301 </div> 1302 </div> 1303 </div> 1304 </div> 1305 <style>@media (max-width: 992px) {.cus-column-133-2 {border-width: 0 !important;} }</style> 1306 </div> 1307 <!-- /2-columns --> 1308 <!-- footer --> 1309 <div class="cus-footer-1-133-footer row bg-light border p-2 py-5 mt-5"> 1310 <div class="container col-12"> 1311 <div class="row mb-2"> 1312 <div class="col-lg-6 mb-2 mb-lg-0 hpe-custom-text-4"> 1313 <i class="fa fa-map-marker text-red" style="padding-right: 0.8rem" aria-hidden="true"></i>
1313<script type="text/javascript">Section4();</script>
1313 1314 </div> 1315 <div class="col-lg-6"> 1316 <div class="float-sm-end hpe-custom-text-6"> 1317 <i class="fa fa-phone text-red pe-2" aria-hidden="true"></i>
1317<script type="text/javascript">Section6();</script>
1317 1318 </div> 1319 </div> 1320 </div> 1321 <div class="row mb-2 pb-2 border-bottom"> 1322 <div class="col-lg-6 mb-2 mb-lg-0 hpe-custom-text-5"> 1323 <i class="fa fa-copyright text-red pe-2" aria-hidden="true"></i>
1323<script type="text/javascript">Section5();</script>
1323 1324 </div> 1325 <div class="col-lg-6"> 1326 <div class="float-sm-end hpe-custom-text-7"> 1327 <i class="fa fa-envelope text-red pe-2" aria-hidden="true"></i> 1328 </div> 1329 </div> 1330 </div> 1331 <div class="row mb-2 d-flex justify-content-center"> 1332 <div class="col-6 col-lg-3 d-flex justify-content-center px-0 hpe-logo" data-logo-width="1250"> 1333 <div data-cms-el="logo">
1333<script type="text/javascript" language="JavaScript">GetLogo();</script>
1333</div> 1334 </div> 1335 </div> 1336 <div class="row d-flex justify-content-center "> 1337 1338 </div> 1339 </div> 1340 </div> 1341 <!-- /footer --> 1342 </div> 1343 </div> 1344 <!-- go to top --> 1345 <div class="cus-scroll-top position-fixed end-0 bg-dark text-white fs-4 px-2" style="cursor: pointer;bottom: auto;transition: 400ms linear;" data-bs-toggle="tooltip" data-bs-placement="top" title="Go to top"><i class="fa fa-angle-up"></i></div> 1346
1346<script> 1347 if (document.getElementsByClassName("cus-scroll-top")) { 1348 window.addEventListener("scroll", function() { 1349 if (document.body.scrollTop > 600 || document.documentElement.scrollTop > 600) { 1350 document.getElementsByClassName('cus-scroll-top')[0].style.bottom = 0; 1351 } else { 1352 document.getElementsByClassName('cus-scroll-top')[0].style.bottom = "-100px"; 1353 } 1354 }); 1355 document.getElementsByClassName('cus-scroll-top')[0].addEventListener('click', function() { 1356 window.scrollTo(0, 0); 1357 }); 1358 } 1359 </script>
1359 1360 <!-- /go to top --> 1361 <div class="cus-g-analytics-133">
1361<script language="javascript">GetGoogleAnalytics('');</script>
1361</div> 1362 <!-- tooltip --> 1363
1363<script> 1364 var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) 1365 var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 1366 return new bootstrap.Tooltip(tooltipTriggerEl) 1367 }); 1368 </script>
1368 1369 <!-- /tooltip -->
1370<script defer src="/sys-popup.js?v=1789926857"></script>
vendor: 1 bytes, line 1370
1370
1371<script> 1372// Form data restoration (runs on page load) - reads from COOKIE 1373(function() { 1374 console.log('[forms] Restoration script running...'); 1375 console.log('[forms] Current cookies:', document.cookie); 1376 try { 1377 var cookies = document.cookie.split('; '); 1378 var pendingCookie = null; 1379 for (var i = 0; i < cookies.length; i++) { 1380 if (cookies[i].indexOf('_pendingFormData=') === 0) { 1381 pendingCookie = cookies[i]; 1382 break; 1383 } 1384 } 1385 console.log('[forms] Found pending cookie:', !!pendingCookie); 1386 if (pendingCookie) { 1387 var cookieValue = pendingCookie.substring('_pendingFormData='.length); 1388 console.log('[forms] Cookie value length:', cookieValue.length); 1389 var formData = JSON.parse(decodeURIComponent(cookieValue)); 1390 console.log('[forms] Parsed form data:', Object.keys(formData)); 1391 var form = document.getElementById('CustomForm') || document.querySelector('form'); 1392 console.log('[forms] Found form:', !!form, form ? form.id : 'no id'); 1393 if (form) { 1394 Object.keys(formData).forEach(function(key) { 1395 var value = formData[key]; 1396 if (value && typeof value === 'string') { 1397 var field = form.querySelector('[name="' + key + '"]'); 1398 if (field) { 1399 console.log('[forms] Restoring field:', key, '=', value.substring(0, 20)); 1400 if (field.tagName === 'SELECT') { 1401 field.value = value; 1402 } else if (field.type !== 'file' && field.type !== 'hidden') { 1403 field.value = value; 1404 } 1405 // Trigger change event for floating labels 1406 field.dispatchEvent(new Event('input', { bubbles: true })); 1407 field.dispatchEvent(new Event('change', { bubbles: true })); 1408 } 1409 } 1410 }); 1411 console.log('[forms] Form data restored successfully'); 1412 } 1413 // Clear the cookies 1414 document.cookie = '_pendingFormData=; path=/; max-age=0'; 1415 document.cookie = '_pendingFormUrl=; path=/; max-age=0'; 1416 console.log('[forms] Cookies cleared'); 1417 } 1418 } catch (e) { 1419 console.error('[forms] Error restoring form data:', e); 1420 } 1421})(); 1422</script>
vendor: 1 bytes, line 1422
1422
1423<script> 1424(function(){ 1425 document.addEventListener('submit',function(e){ 1426 var form=e.target;if(!form||form.tagName!=='FORM')return; 1427 var btn=form.querySelector('button[type="submit"],input[type="submit"],.survey-btn-submit,#SUBMIT1'); 1428 if(!btn||btn.disabled)return; 1429 btn.disabled=true; 1430 if(btn.tagName==='INPUT'){btn.value=' Submitting...';} 1431 else{btn.innerHTML='<span class="form-submit-spinner"></span> Submitting...';} 1432 },true); 1433})(); 1434</script>
1434</body> 1435<!--Template-133--> 1436 1437</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.