1function setCookie(cname, cvalue) { 2 var d = new Date(); 3 d.setTime(d.getTime() + 90 * 24 * 60 * 60 * 1000); 4 var expires = "expires=" + d.toUTCString(); 5 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 6} 7 8function getCookie(cname) { 9 var name = cname + "="; 10 var ca = document.cookie.split(';'); 11 for (var i = 0; i < ca.length; i++) { 12 var c = ca[i]; 13 while (c.charAt(0) === ' ') { 14 c = c.substring(1); 15 } 16 if (c.indexOf(name) === 0) { 17 return c.substring(name.length, c.length); 18 } 19 } 20 return ""; 21} 22 23function deleteCookie(cname) { 24 document.cookie = cname + "=''; expires=Thu, 01 Jan 1970 00:00:00 UTC;"; 25} 26 27function deleteAllCookies() { 28 document.cookie.split(';').forEach(function (c) { 29 document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;'; 30 }); 31} 32/*****************Notes************************************************************** 33 Modal Controls 34************************************************************************************/ 35 36function openModal(info, header, action, callback) { 37 //Update content 38 if (document.getElementById('modal-info') && document.getElementById('modal-header')) { 39 document.getElementById('modal-info').innerHTML = info; 40 document.getElementById('modal-header').innerHTML = header; 41 if (action) { 42 document.getElementById('modal-button-action').innerHTML = action; 43 //add actions 44 document.getElementById('modal-button-action').style.display = 'inline-block'; 45 document.getElementById('modal-button-action').onclick = function () { 46 callback(); 47 closeModal(); 48 }; 49 } else { 50 document.getElementById('modal-button-action').style.display = 'none'; 51 } 52 //Show modal 53 document.getElementById('modal-button-close').innerHTML = 'Close'; 54 document.getElementById('modal-button-close').onclick = closeModal; 55 document.getElementById('modal-window').style.display = "block"; 56 } 57} 58function openModalTarget(info, header, action, callback, target, targetCallback) { 59 //Update content 60 if (document.getElementById('modal-info-target') && document.getElementById('modal-header-target')) { 61 document.getElementById('modal-info-target').innerHTML = info; 62 document.getElementById('modal-header-target').innerHTML = header; 63 64 //add actions 65 document.getElementById('modal-button-target').innerHTML = action; 66 document.getElementById('modal-button-target').style.display = 'inline-block'; 67 document.getElementById('modal-button-target').onclick = function () { 68 callback(); 69 closeModalTarget(); 70 }; 71 72 //add target next 73 document.getElementById('modal-button-targetnext').innerHTML = target; 74 document.getElementById('modal-button-targetnext').style.display = 'inline-block'; 75 document.getElementById('modal-button-targetnext').onclick = function () { 76 targetCallback(); 77 closeModalTarget(); 78 }; 79 80 //Show modal 81 document.getElementById('modal-button-close-target').innerHTML = 'Close'; 82 document.getElementById('modal-button-close-target').onclick = closeModalTarget; 83 document.getElementById('modal-window-target').style.display = "block"; 84 85 86 } 87} 88function openModalCustom(info, header, action, callback, close, callbackclose, donotclose) { 89 //Update content 90 document.getElementById('modal-info').innerHTML = info; 91 document.getElementById('modal-header').innerHTML = header; 92 if (action) { 93 document.getElementById('modal-button-action').innerHTML = action; 94 //add action 95 document.getElementById('modal-button-action').style.display = 'inline-block'; 96 document.getElementById('modal-button-action').onclick = function () { 97 callback(); 98 if (!donotclose) { 99 closeModal(); 100 } 101 }; 102 } else { 103 document.getElementById('modal-button-action').style.display = 'none'; 104 } 105 106 if (close) document.getElementById('modal-button-close').innerHTML = close; 107 //add close action 108 if (callbackclose) document.getElementById('modal-button-close').onclick = function () { 109 callbackclose(); 110 }; 111 112 //Show modal 113 document.getElementById('modal-window').style.display = "block"; 114} 115function openModalSelect(app) { 116 var header = `<img src="../img/site/${leagueList[leagueSelected].site}" alt="${leagueList[leagueSelected].site} icon"> ${leagueList[leagueSelected].name}`; 117 document.getElementById('modal-header-select').innerHTML = header; 118 119 switch (app) { 120 case 'draft': 121 //existing html is fine 122 break; 123 case 'auction': 124 //Update content 125 //<button type="button" class="button" style="display:inline-flex;align-items:center;height:29px" onclick="closeModalSelect();openApp('sync')"><img style="margin-right:8px" src="../../css/sprite.svg" class="svg svg-linkgray" height="15" width="15" alt="sync league icon" /> SYNC AUCTION</button> 126 document.getElementById('modal-info-select').innerHTML = `<h2>IMPORTANT: For the most optimal dollar value calculations and recommendations, set your bench players to specific positions (QB,RB,WR,TE) instead of the generic BE. Contact us at [email protected] for any questions on the Auction a
126pp.</h2><br><h2>Live Auction sync is not available. Enter the winning bids manually.</h2>`; 127 128 document.getElementById('modal-buttons-select').innerHTML = ` 129 <button type="button" class="button" style="display: inline-flex; align-items: center; height: 29px; margin-left: 6px" onclick="closeModalSelect();openApp('manual')"><img style="margin-right:8px" src="../../css/sprite.svg" class="svg svg-linkgray" height="15" width="15" alt="sync league icon" /> MANUAL AUCTION</button> 130 <button type="button" class="button" style="height: 29px; float:right" onclick="openSettings()">CONFIRM SETTINGS</button> 131 `; 132 break; 133 } 134 135 //Show modal 136 document.getElementById('modal-window-select').style.display = "block"; 137} 138function closeModal() { 139 document.getElementById('modal-window').style.display = "none"; 140} 141function closeModalTarget() { 142 document.getElementById('modal-window-target').style.display = "none"; 143} 144function closeModalSelect() { 145 document.getElementById('modal-window-select').style.display = "none"; 146} 147 148//Local storage functions 149 150function saveLocal(item, obj) { 151 if (typeof Storage !== "undefined") {// Code for localStorage/sessionStorage. 152 var json = JSON.stringify(obj); 153 localStorage.setItem(item, json); 154 } else { 155 alert('Please use Chrome or Edge browser to enable required local storage features.'); 156 } 157} 158function getLocal(item) { 159 var json = {}; 160 var result = localStorage.getItem(item); 161 if (result) { 162 json = JSON.parse(result); 163 } else { 164 json = false; 165 } 166 return json; 167} 168function deleteLocal(item) { 169 localStorage.removeItem(item); 170} 171function resetLocal() { 172 for (item in localStorage) { 173 localStorage.removeItem(item); 174 } 175} 176//load splash page open home or start page if signed in 177function loadSplashPage() { 178 if (getCookie('user')) {//signedin 179 if (getLocal('leagueSelected') > 0) { 180 window.open("/home", "_self"); 181 } else {//no leagues 182 window.open("/start", "_self"); 183 } 184 } 185} 186//signin 187function signIn() { 188 deleteAllCookies(); 189 resetLocal(); 190 191 var email = document.getElementById('email').value; 192 var password = document.getElementById('current-password').value; 193 194 var obj = { 'email': email, 'password': password, 'code': gcode }; 195 196 post(obj, '/signin', function (response) { 197 console.log(response); 198 if (response.success) { 199 //save user to cookie 200 user = { 'email': email, 'password': password, 'status': 'subscribed' }; 201 setCookie('user', JSON.stringify(user)); 202 203 //save subscription 204 if (response.subscription.length > 0) {//if no subscriptions, or refunded, keep demo 205 subscription.current = response.subscription; 206 saveSubscription(); 207 } 208 209 //load all leagues 210 loadLeagues().then(function (result) { 211 if (result) {//leagues added 212 window.open("/home", "_self"); 213 } else {//no leagues 214 window.open("/start", "_self"); 215 } 216 }, function (reject) {//error on setupModel 217 console.log('loadLeagues failed to load'); 218 console.log(reject); 219 logError(reject.message, location.href, 'signin', 'loadLeagues', reject.stack) 220 }); 221 } else { 222 showSignin(); 223 document.getElementById('signin-alert').style.display = 'block'; 224 document.getElementById('signin-alert').innerText = response.message; 225 document.getElementById(response.errorOn).classList.add('input-error'); 226 } 227 }); 228} 229function signedIn() { 230 document.getElementsByTagName('header')[0].classList.add('signedin'); 231} 232function showSignin() { 233 var header = '<img src="../img/logo/icon.webp" alt="Draft Hero Icon"> SIGN IN!'; 234 var html = `<form class="form"> 235 <div style="display:flex; margin-bottom: 1em"> 236 <div>Not already registered?</div> 237 <button type="button" class="button-link" onclick="showRegister()">Register here for free.</button> 238 </div> 239 <div style="margin-bottom:.5em"> 240 <div>Email <span class="hint hint-req">*</span></div> 241 <input type="email" autocomplete="username" id="email" required="" style="border: solid 2px #5584ff"> 242 </div> 243 <div style="margin-bottom:1em"> 244 <div>Password <span class="hint hint-req">*</span></div> 245 <input type="password" autocomplete="current-password" id="current-password" required="" style="border: solid 2px #5584ff"> 246 </div> 247 <input type="checkbox" onclick="togglePassword()"> Show Password 248 <div id="signin-alert" style="display:none; float:right; color:red; font-size:1.2rem"> 249 </div> 250 <div style="display:flex; margin: 1em 0"> 251 <div>Forgot your password?</div> 252 <button type="button" class="button-link" onclick="showReset()">Click here to reset it.</button> 253 </div> 254 </form>`; 255 256 openModal(html, header, 'SIGN IN', function () { 257 signIn(); 258 });
259} 260function register() { 261 deleteAllCookies(); 262 resetLocal(); 263 264 var email = document.getElementById('new-email').value; 265 var password = document.getElementById('new-password').value; 266 267 var obj = { 'email': email, 'password': password, 'code': gcode }; 268 269 //check promo 270 //https://drafthero.com/?promo=rtsports 271 let searchParams = new URLSearchParams(window.location.search); 272 if (searchParams.has('promo')) { 273 obj['promo'] = searchParams.get('promo'); 274 } 275 276 post(obj, '/register', function (response) { 277 console.log(response); 278 if (response === true) { 279 //save user to cookie 280 user = { 'email': email, 'password': password, 'status': 'subscribed' }; 281 setCookie('user', JSON.stringify(user)); 282 283 //show register success modal 284 showRegistered(); 285 286 } else { 287 showRegister(); 288 document.getElementById('register-alert').style.display = 'block'; 289 document.getElementById('register-alert').innerText = response.message; 290 document.getElementById(response.errorOn).classList.add('input-error'); 291 292 } 293 }); 294} 295 296function showRegister() { 297 var header = '<img src="../img/logo/icon.webp" alt="Draft Hero Icon"> REGISTER FOR FREE!'; 298 299 var html = `<form class="form"> 300 <div style="font-size: 1.2rem">Register for free to sync your leagues. Draft and Roster sync require paid subscription.</div> 301 <div style="display:flex; margin-top:1em"> 302 <div>Already a subscriber?</div> 303 <button type="button" class="button-link" onclick="showSignin()">Sign in here.</button> 304 </div> 305 <div> 306 <div>Email <span class="hint hint-req">*</span></div> 307 <input type="email" autocomplete="username" id="new-email" required> 308 </div> 309 <div> 310 <div>Password <span class="hint hint-req">*</span></div> 311 <input type="password" autocomplete="off" id="new-password" required> 312 </div> 313 <input type="checkbox" onclick="togglePassword()">Show Password 314 <div id="register-alert" style="display:none; float:right; color:red; font-size:1.2rem"> 315 </div> 316 </form>`; 317 318 openModal(html, header, 'REGISTER', function () { 319 register(); 320 }); 321} 322 323function showRegistered() { 324 var header = '<img src="../img/logo/icon.webp" alt="Draft Hero Icon"> Congrats and Welcome to Draft Hero!'; 325 326 var html = `<form class="form"> 327 <div>To get started, add your leagues based on each site you play on. You can manually edit each site template or use the Draft Hero Live Sync extension to sync your league settings and draft picks.</div> 328 <div> 329 Contact us at <a href="mailto:[email protected]?subject=New Subscriber Help">[email protected]</a> with any questions. 330 </div> 331 </form>`; 332 333 openModalCustom(html, header, null, null, 'GET STARTED', function () { 334 window.open("/start", "_self"); 335 }); 336} 337function emailPasswordResetLink() { 338 deleteAllCookies(); 339 resetLocal(); 340 341 var email = document.getElementById('new-email').value; 342 var obj = { 'email': email, 'password': 'reset', 'code': gcode }; 343 344 post(obj, '/emailPasswordResetLink', function (response) { 345 console.log(response); 346 if (response.success === true) { 347 var header = '<img src="../img/logo/icon.webp" alt="Draft Hero Icon"> RESET PASSWORD EMAIL SENT'; 348 var html = `We have sent you an email to reset your password. Please check your junk folder if you don't see it in your inbox in a few seconds.`; 349 openModal(html, header, null, null); 350 } else { 351 showReset(); 352 document.getElementById('register-alert').style.display = 'block'; 353 document.getElementById('register-alert').innerText = response.message; 354 document.getElementById(response.errorOn).classList.add('input-error'); 355 356 } 357 });
358} 359function showReset() { 360 var header = '<img src="../img/logo/icon.webp" alt="Draft Hero Icon"> RESET PASSWORD'; 361 362 var html = `<form class="form"> 363 <div style="font-size: 1.2rem">Enter your email. If we find an account for that email, we will send you a link to reset your password.</div> 364 <div> 365 <div>Email <span class="hint hint-req">*</span></div> 366 <input type="email" autocomplete="username" id="new-email" required> 367 </div> 368 <div id="register-alert" style="display:none; float:right; color:red; font-size:1.2rem"> 369 </div> 370 </form>`; 371 372 openModal(html, header, 'SEND PASSWORD RESET EMAIL', function () { 373 emailPasswordResetLink(); 374 }); 375} 376function saveSubscription() { 377 var item = '', categoryArr = []; 378 379 for (category in subscriptionOptions) { 380 subscription[category] = []; 381 categoryArr = subscriptionOptions[category]; 382 for (var i = 0; i < categoryArr.length; i++) { 383 item = categoryArr[i]; 384 if (subscription.current.includes(item) || subscription.current.includes(category + 'All') || subscription.current.includes('Everything')) { 385 subscription[category].push(item); 386 } 387 } 388 } 389 390 //admin 391 if (subscription.current.includes('admin')) { 392 user['admin'] = true; 393 user = { 'email': user.email, 'status': 'subscribed', 'admin': true }; 394 setCookie('user', JSON.stringify(user)); 395 } 396 397 //single league 398 if (subscription.current.includes('single')) subscription['single'] = true; 399
400 setCookie('subscription', JSON.stringify(subscription)); 401 402} 403function loadLeagues() { 404 return new Promise(function (resolve, reject) { 405 //load leagues 406 var obj = { 'email': user.email, 'action': 'get', 'status': user.status, 'code': gcode }; 407 post(obj, '/league', function (response) { 408 console.log(leagues); 409 if (response.success) { 410 var leagues = response.leagues; 411 leagueList = {}; 412 settings = {}; 413 if (Object.keys(response.leagues).length > 0) { 414 var lastID = '0'; 415 for (leagueID in leagues) { 416 if (leagues[leagueID].settings) { 417 settings = getSettings(leagues[leagueID].settings);//json -> obj 418 if (settings) { 419 //save league to local storage 420 saveLocal('settings-' + leagueID, settings);//obj -> json 421 422 //include in list if not hidden 423 if (leagues[leagueID].status !== 'Hidden') { 424 let type = settings.Draft.Style === 'Auction' ? 'Auction' : 'Draft'; 425 leagueList[leagueID] = { 'name': settings.General.Abbrev, 'site': settings.Host.Site, 'type': type }; 426 lastID = leagueID; 427 } 428 429 //save draft picks 430 if (leagues[leagueID].picks) { 431 var draftpicks = getSettings(leagues[leagueID].picks);//json -> obj 432 if (draftpicks) { 433 //save league to local storage 434 saveLocal('picks-' + leagueID, draftpicks);//obj -> json 435 } 436 } 437 438 //save auction picks 439 if (leagues[leagueID].auction) { 440 var auctionpicks = getSettings(leagues[leagueID].auction);//json -> obj 441 if (auctionpicks) { 442 //save league to local storage 443 saveLocal('auction-' + leagueID, auctionpicks);//obj -> json 444 } 445 } 446 447 //save rosters 448 if (leagues[leagueID].rosters) { 449 var rostersObj = getSettings(leagues[leagueID].rosters);//json -> obj 450 if (rostersObj) { 451 //save rosters to local storage 452 saveLocal('rosters-' + leagueID, rostersObj);//obj -> json 453 } 454 } 455 } 456 } 457 } 458 //save league list to local storage 459 saveLocal('leagueSelected', lastID); 460 saveLocal('leagueList', leagueList); 461 resolve(true); 462 } else { 463 //leagueSelected = '0'; 464 //settings = new defaultSettings(); 465 //saveLocal('leagueSelected', '0'); 466 //saveLocal('leagueList', leagueList); 467 //saveLocal('settings-0', settings); 468 resolve(false); 469 } 470 471 } else { 472 //handle error on get leagues 473 reject(response); 474 } 475 }); 476 }); 477} 478function getSettings(json) {//json -> obj 479 var obj = {}; 480 if (json) { 481 try { 482 obj = JSON.parse(json); 483 } catch (error) { 484 console.error(error); 485 return false; 486 } 487 } 488 return obj;
489} 490 491function togglePassword() { 492 var x = document.getElementById("new-password"); 493 if (x !== null) { 494 if (x.type === "password") { 495 x.type = "text"; 496 } else { 497 x.type = "password"; 498 } 499 } else { 500 x = document.getElementById("current-password"); 501 if (x.type === "password") { 502 x.type = "text"; 503 } else { 504 x.type = "password"; 505 } 506 } 507} 508function post(obj, url, callback) { 509 var xhr = new XMLHttpRequest(); 510 xhr.open("POST", url, true); 511 xhr.setRequestHeader("Content-type", "application/json"); 512 xhr.onreadystatechange = function () { 513 if (xhr.readyState === 4 && xhr.status === 200) { 514 var response = JSON.parse(xhr.responseText); 515 callback(response); 516 } 517 }; 518 xhr.onloadend = function () { 519 if (xhr.status === 404) { 520 logError(url, window.location.href, 'post', 'xhr.onloadend', '404'); 521 } 522 }; 523 xhr.onerror = function (e) { 524 var str = JSON.stringify(obj); 525 logError(url, window.location.href, str, 'post: xhr.onerror', 'error'); 526 console.log("Error on post " + url); 527 }; 528 var data = JSON.stringify(obj); 529 xhr.send(data); 530} 531//subscription 532var subscription = { 533 'current': 'Demo,Yahoo', 534 'apps': [], 535 'projections': ['Demo'], 536 'sites': ['Yahoo'], 537 'status': 'Demo' 538}; 539var subscriptionOptions = { 540 'apps': ['Draft', 'Auction', 'Lineup'], 541 'projections': ['4for4', 'FantasyGuru', 'RotoBaller', 'Ultimate', 'RotoWire'], 542 'sites': ['Yahoo', 'ESPN', 'CBS', 'NFL', 'Sleeper', 'MFL', 'RTSports', 'FFPC', 'NFFC'] 543}; 544var user = { 'email': null, 'status': 'Demo' }; 545const gcode = 'qaoufhasodasdfweflclkji';
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.