1 2 3 4<head> 5 <link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,400;0,500;0,700;0,800;0,900;1,300;1,400;1,600;1,800&display=swap" rel="stylesheet"> 6 <link rel="stylesheet" type="text/css" href="/static/base_style.css?v=4b55ee0"> 7 <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"> 8 9 <meta name="viewport" content="width=device-width, initial-scale=1"> 10 11
11<script src="https://cdn.jsdelivr.net/npm/reefjs@7/dist/reef.min.js"></script>
11 12 13 14 <!-- 15 <meta name="twitter:card" content="summary"></meta> 16 <meta name="twitter:site" content="@theMMAStats"></meta> 17 <meta name="twitter:title" content="MMAstats - statistics and ratings"></meta> 18 <meta name="twitter:description" content="Weekly updated cross-promotional MMA statistics and ratings based on ELO for 19 mula"></meta> 20 <meta name="twitter:image" content="https://mmastats.org/static/MMAstats.jpg"> 21 --> 22 23 <!-- 24 <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png"> 25 <link rel="icon" type="image/png" sizes="96x96" href="/static/favicon-96x96.png"> 26 <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png"> 27 --> 28 29 <link rel="icon" type="svg+xml" href="/static/favicon.svg"> 30 31 <meta property="og:type" content="website"></meta> 32 <meta property="og:url" content="https://www.chess-boost.com"></meta> 33 <meta property="og:title" content="Chess Boost - improve and analyze your chess game"></meta> 34 <meta property="og:description" content="Book individual or group chess lessons from our best coaches, or use our novel tools to analyze chess. Coaching available for kids and for adults."></meta> 35 <meta property="og:image" content="https://www.chess-boost.com/static/share-chessboost-green.jpg"> 36 37 <meta name="description" content="Book individual or group chess lessons from our best coaches, or use our novel tools to analyze chess. Coaching available for kids and for adults."> 38 39 <link rel="canonical" href="https://www.chess-boost.com"/> 40 41 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 68 bytes, lines 41-42
41 42 <script async src="https://www.googletagmanager.com/gtag/js?id=
42G-DX20TKNGZF
vendor: 16 bytes, lines 42-43
42"></script> 43
43<script> 44
vendor: 152 bytes, lines 44-48
44window.dataLayer = window.dataLayer || []; 45 function gtag(){dataLayer.push(arguments);} 46 gtag('js', new Date()); 47 48 gtag('config', '
48G-DX20TKNGZF
vendor: 8 bytes, lines 48-49
48'); 49
49</script>
49 50 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 68 bytes, lines 50-51
50 51 <script async src="https://www.googletagmanager.com/gtag/js?id=
51UA-183377203-1
vendor: 21 bytes, lines 51-53
51"> 52 </script> 53
53<script> 54
vendor: 140 bytes, lines 54-58
54window.dataLayer = window.dataLayer || []; 55 function gtag(){dataLayer.push(arguments);} 56 gtag('js', new Date()); 57 58 gtag('config', '
58UA-183377203-1
vendor: 8 bytes, lines 58-59
58'); 59
59</script>
59 60 61 <!-- Google Tag Manager -->
62<script>
vendor: 327 bytes, lines 62-66
62(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 63new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 64j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 65'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 66})(window,document,'script','dataLayer','
66GTM-WR5GF26
vendor: 3 bytes, line 66
66');
66</script>
66 67<!-- End Google Tag Manager -->
vendor: 80 bytes, lines 67-72
67 68 69 70 <script src="https://www.google.com/recaptcha/api.js"></script> 71 72
72<link rel="stylesheet" type="text/css" href="/static/checkout_style.css?v=4b55ee0"> 73 <title>Chess Boost - Contact</title> 74 75</head> 76 77<body> 78 <!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 78-79
78 79<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
79GTM-WR5GF26
vendor: 83 bytes, lines 79-80
79" 80height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
81<!-- End Google Tag Manager (noscript) --> 82 83 <div class="cb-cart-bg" id="cart_bg"></div> 84 <div id="cart" class="cb-cart"></div> 85
86<script> 87 class ReefCart { 88 constructor(cartId, callbacks, items = []) { 89 this.cartId = cartId; 90 91 this.callbacks = callbacks ? callbacks : {}; 92 const defaultCallbacks = { 93 onAdd: function() {}, 94 onRemove: function() {}, 95 } 96 97 for (let key of Object.keys(defaultCallbacks)) { 98 if (!this.callbacks.hasOwnProperty(key)) { 99 this.callbacks[key] = defaultCallbacks[key]; 100 } 101 } 102 103 console.log("Init with items: ", items); 104 105 this.comp = new Reef(cartId, { 106 data: { 107 items: items, 108 }, 109 110 template: function(props) { 111 const totalPrice = props.items.reduce((a, b) => a + parseFloat(b.price), 0); 112 113 function formatDescription(desc) { 114 return desc.substring(0, 35) + ((desc.length > 35) ? "..." : ""); 115 } 116 117 let tableHtml = ""; 118 for (let item of props.items) { 119 const dateText = ('date' in item) ? `DATE: ${item.date} TIME: ${item.time}` : formatDescription(item.description); 120 const subLen = 15; 121 const itemTitle = (item.title.length > subLen) ? item.title.substring(0, subLen) + "..." : item.title; 122 tableHtml += ` 123 <tr class="cb-cart-row"> 124 <td class="cb-cart-cell cb-cart-title-cell"> 125 <div class="cb-circle cb-cart-circle"> 126 <img src="/static/lesson.svg"> 127 </div> 128 <div class="cb-cart-item-info"> 129 <h4>${itemTitle}</h4> 130 <span class="cb-cart-date-span">${dateText}</span> 131 </div> 132 </td> 133 <td class="cb-cart-cell cb-cart-price-cell"> 134 $ ${item.price} 135 </td> 136 <td class="cb-cart-cell cb-cart-remove-cell"> 137 <i class="fas fa-times-circle" onclick="cart.remove(${item.id})"></i> 138 </td> 139 </tr> 140 `; 141 } 142 143 return ` 144 <div class="cb-cart-header"> 145 <span>your cart</span> 146 </div> 147 148 <table class="cb-cart-table"> 149 ${tableHtml} 150 </table> 151 152 <h3 class="cb-cart-total-price">TOTAL: <b>$ ${totalPrice}<b></h3> 153 154 <div class="cb-cart-footer-div"> 155 <button class="cb-basic-btn cb-cart-footer-btn cb-dark-btn" onclick="cart.toggleShow()">Back to shopping</button> 156 <form action="/checkout"> 157 <input type="submit" class="cb-btn-shadow cb-basic-btn cb-cart-footer-btn" value="Checkout"> 158 </form> 159 </div> 160 `; 161 } 162 }); 163 164 this.comp.render(); 165 } 166 167 async add(item) { 168 this.comp.data.items.push(item); 169 this.show(); 170 171 const response = await fetch(`/api/cart/add/${item.id}`, { 172 method: 'POST', 173 credentials: 'same-origin', 174 }); 175 176 const data = await response.json(); 177 178 // TODO: handle errors when we fail to add to the cart 179 if (data.status === 'OK') { 180 console.log(data); 181 this.callbacks.onAdd(item.id); 182 } 183 } 184 185 async remove(itemId) { 186 const index = this.comp.data.items.map(item => item.id).indexOf(itemId); 187 this.comp.data.items.splice(index, 1); 188 if (index == -1) { 189 // TODO: let's flash an error or something 190 console.error("Somehow this element doesn't exist: ", this.comp.data.items, itemId); 191 } else { 192 const response = await fetch(`/api/cart/remove/${itemId}`); 193 const data = await response.json(); 194 // TODO: we have to handle errors when we fail to remove from the cart 195 console.log(data); 196 this.callbacks.onRemove(itemId); 197 } 198 } 199 200 show() { 201 document.getElementById('cart_bg').classList.add('cb-cart-show'); 202 document.querySelector(this.cartId).classList.add('cb-cart-show'); 203 } 204 205 toggleShow() { 206 document.getElementById('cart_bg').classList.toggle('cb-cart-show'); 207 document.querySelector(this.cartId).classList.toggle('cb-cart-show'); 208 } 209 210 setCallbacks(callbacks) { 211 this.callbacks = callbacks; 212 } 213 214 has(itemId) { 215 return this.comp.data.items.some(item => item.id == itemId); 216 } 217 } 218</script>
218 219 220
220<script> 221 const items = [ 222 223 ]; 224 var cart = new ReefCart('#cart', null, items); 225 </script>
225 226 227 <div class="cb-top-bg"> 228 <div class="cb-top-bg-img "></div> 229 <div class="cb-top-content"> 230 <header> 231 <nav> 232 <ul class="cb-navbar-menu"> 233 <li class="cb-navbar-logo"> 234 <a href="/"> 235 <img src="/static/chessboost-svetli.svg"> 236 </a> 237 </li> 238 239 240 <li class="cb-navbar-item "> 241 <a href="/booklessons">Book a lesson</a> 242 </li> 243 244 <li class="cb-navbar-item "> 245 <a href="/studies">Courses</a> 246 </li> 247 248 <li class="cb-navbar-item "> 249 <a href="/analyse">Analyse</a> 250 </li> 251 252 <li class="cb-navbar-item "> 253 <a href="/coaches">Coaches</a> 254 </li> 255 256 <li class="cb-navbar-item cb-navbar-item-active"> 257 <a href="/contact">Contact</a> 258 </li> 259 260 261 <li class="cb-navbar-pm" onclick="cart.show()"> 262 <i class="fas fa-shopping-cart fa-2x"></i> 263 </li> 264 265 266 <li class="cb-navbar-login cb-navbar-pm"><a class="cb-basic-btn" href="/login">Log in</a></li> 267 268 269 <li class="cb-navbar-toggle"> 270 <i class="fas fa-bars fa-2x"></i> 271 </li> 272 </ul> 273 </nav> 274 </header> 275 276 277 <div class="cb-main"> 278 <h1>Contact</h1> 279 </div> 280
281<script> 282 function addFlash(text, type) { 283 const list = document.querySelector(".cb-flash-list"); 284 const newElem = document.createElement('li'); 285 newElem.classList.add('cb-flash-error'); 286 const img = type === 'cb-flash-error' ? 'fa-times' : 'fa-check-square'; 287 newElem.innerHTML = ` 288 <i class="fas ${img}"></i> 289 ${text} 290 `; 291 list.appendChild(newElem); 292 } 293</script>
293 294 295 296 <ul class="cb-flash-list"> 297 298 </ul> 299 300 301 </div> 302 </div> 303 304 <div class="cb-middle-bg"> 305 306 <div class="cb-main cb-row"> 307 <div class="cb-contact-text"> 308 <h2>Chess Boost</h2> 309 <p>If you have any questions or requests, please don't hesitate to contact us. You can use the form on this page, or directly email [email protected]</p> 310 </div> 311 <form action="" class="cb-manual-analysis-form" method="POST"> 312 <input id="csrf_token" name="csrf_token" type="hidden" value="Ijg1MWRkODI5MWM5ZjhmNDdkMjNlNGRiYTI3ZGU1Mjk0YzllOWFlMTYi.asd_Ig.-hjgq49IM5OSNXFtEBUSCP7F-eA"> 313 <input class="cb-manual-analysis-input" id="name" name="name" placeholder="Name" required type="text" value=""> 314 <input class="cb-manual-analysis-input" id="email" name="email" placeholder="Email" required type="email" value=""> 315 <textarea class="cb-manual-analysis-input" id="message" name="message" placeholder="Message" required> 316</textarea>
vendor: 90 bytes, lines 316-318
316 317 318<script src='https://www.google.com/recaptcha/api.js' async defer></script>
319<div class="g-recaptcha" data-sitekey="6Lf4NagaAAAAAE527MHVNGQAPvHE784LNLEGwYZF" id="recaptcha"></div> 320 321 <input class="cb-manual-analysis-input cb-basic-btn" id="send" name="send" type="submit" value="Send"> 322 </form> 323 </div> 324 325 </div> 326 327 <footer> 328 <div class="cb-row cb-sb-ac cb-edge-row"> 329 <div class="cb-copyright">@ Chess Boost</div> 330 331 <div class="cb-row"> 332 <span>Follow us @</span> 333 <a class="cb-footer-social-link" href="https://www.instagram.com/chessboost/"> 334 <i class="fab fa-instagram"></i> 335 </a> 336 <a class="cb-footer-social-link" href="https://www.facebook.com/thechessboost"> 337 <i class="fab fa-facebook-square"></i> 338 </a> 339 </div> 340 </div> 341 </footer> 342 343
343<script> 344 const menuEl = document.querySelector('.cb-navbar-menu'); 345 const toggleEl = document.querySelector('.cb-navbar-toggle'); 346 347 function menuToggle(event) { 348 if (menuEl.classList.contains("cb-navbar-menu-active")) { 349 toggleEl.innerHTML = '<i class="fas fa-bars fa-2x"></i>'; 350 } else { 351 toggleEl.innerHTML = '<i class="fas fa-times fa-2x"></i>'; 352 } 353 menuEl.classList.toggle("cb-navbar-menu-active") 354 } 355 356 toggleEl.addEventListener('click', menuToggle, false); 357 </script>
357 358</body>
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.