PageSourceSearch

https://drafthero.com/js/drafthero.signin.js

js drafthero.com collected 2026-10-02 00:29:10 UTC 22,933 bytes, 545 lines download raw bytes

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.