您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This script is a modified version of garrettforster and gongadan's script to work in season 17. CampPen33 EDIT: Just messing around with the output page design.
// ==UserScript== // @name GLB Power Rankings Season 17 fix (Updated Output Design) - pabst_fix // @namespace pbr/glbprs17f // @description This script is a modified version of garrettforster and gongadan's script to work in season 17. CampPen33 EDIT: Just messing around with the output page design. // @include http://goallineblitz.com/game/league.pl?league_id=* // @include http://glb.warriorgeneral.com/game/league.pl?league_id=* // @version 2010.12.25 // @author garrettfoster + Gongadan + numone + CampPen33 + pabst // ==/UserScript== //Basic script rundown //Signal to start script recieved from button //get the user input //gather the needed data //crunch the data //output the results window.setTimeout( function() { runPowerRankings(); }, 60 ); // GLOBALS--Modify as needed var debugging_on = 0; // set to 1 to get a bunch of debugging crap you can copy into Excel var preseasonGames = 4; // how many games in the preseason? var season = 20; // what season number are we in? //------------------------------------Build a button to send a start signal and checkboxes to gather user input function runPowerRankings(){ //locate an area to place the button var location = document.getElementById('conferences'); if(!location){ return; } // get the teams for the dropdown here. We'll get these again later, but it doesn't take much effort var teamId = new Array(); var teamName = new Array(); var j=0; var i=0; for (i=1; i<34; i++) { if (i == 17) i++; var teamPage = location.getElementsByTagName('tr')[i].childNodes[3].firstChild.href.split('=', 2); if (teamPage[0] == '/game/league.pl?league_id') { // WORLD LEAGUE teamPage = location.getElementsByTagName('tr')[i].childNodes[5].firstChild.href.split('=', 2); teamName[j] = location.getElementsByTagName('tr')[i].childNodes[5].firstChild.innerHTML; } else { teamName[j] = location.getElementsByTagName('tr')[i].childNodes[3].firstChild.innerHTML; } teamId[j] = teamPage[1]; j++; } var Team1Select = document.createElement('select'); Team1Select.id = 'Fantasy1'; var blankop = document.createElement('option'); blankop.value = 0; blankop.innerHTML = ''; Team1Select.appendChild(blankop); var Team2Select = document.createElement('select'); Team2Select.id = 'Fantasy2'; var blankop2 = document.createElement('option'); blankop2.value = 0; blankop2.innerHTML = ''; Team2Select.appendChild(blankop2); for (i=0; i < j; i++) { var op = document.createElement('option'); op.value = teamId[i]; op.innerHTML = teamName[i]; Team1Select.appendChild(op); var op2 = document.createElement('option'); op2.value = teamId[i]; op2.innerHTML = teamName[i]; Team2Select.appendChild(op2); } //build a div to put in the location var div = document.createElement('div'); div.setAttribute('id', 'rankings'); //place the div location.parentNode.insertBefore(div, location); //horizontal rule to make things pretty var hr = document.createElement('hr'); location.parentNode.insertBefore(hr, location); //locate the div to place the button and user input in location = document.getElementById('rankings'); //build a div to store the input div = document.createElement('div'); div.setAttribute('id', 'rankingInput'); location.appendChild(div); //build a div to store the data temporarily div = document.createElement('div'); div.setAttribute('id', 'rankingData'); div.setAttribute("style","visibility: hidden; display:none;"); location.appendChild(div); //build a div to store pages temporarily div = document.createElement('div'); div.setAttribute('id', 'rankingTemp'); div.setAttribute("style","visibility: hidden; display:none;"); location.appendChild(div); //locate the div to place the button and user input in location = document.getElementById('rankingInput'); //build and place the button var button = document.createElement('input'); button.setAttribute('type', 'button'); button.setAttribute('id', 'startRankings'); button.setAttribute('value', 'Rankings'); button.addEventListener('click', getRankings, false); location.appendChild(button); button = document.createElement('input'); button.setAttribute('type', 'button'); button.setAttribute('id', 'showOptions'); button.setAttribute('name', '0'); button.setAttribute('value', 'Options >>'); button.addEventListener('click', showOptions, false); location.appendChild(button); div = document.createElement('div'); div.setAttribute('id', 'rankingForm'); div.setAttribute("style","visibility: hidden; display:none;"); location.appendChild(div); rankingForm = document.getElementById('rankingForm'); //build a form form = '<hr />' + '<p style="font-weight: bold;">Which part(s) of the season do you want to include?</p>' + '<p style="padding-left: 2%;">' + '<i>Note: Playoff games do not include post season scrimmages. If selecting only playoffs, the ties will be messed up.</i><br />' + '<input type="checkbox" class="seasonChk" />' + '<span style="padding-right: 1%;">Pre-Season</span>' + '<input type="checkbox" class="seasonChk" checked />' + '<span style="padding-right: 1%;">Regular Season</span>' + '<input type="checkbox" class="seasonChk" />' + '<span style="padding-right: 1%;">Playoffs</span>' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Do you want to consider pre-season, regular season, and playoff games to be equal?' + '</span>' + '<input type="radio" name="equalGames" class="equalGames" value="1" checked>Yes </input>' + '<input type="radio" name="equalGames" class="equalGames" value="0">No </input>' + '<span style="font-style: italic;"> (If no, then please specify how games should be weighted below)</span>' + '</p>' + '<p style="padding-left: 2%;">' + '<i>Note: A larger number indicates more importance or weight.</i><br />' + '<input id="preSeason" style="width: 10px;" type="text" value="1" /> Pre-Season<br />' + '<input id="regularSeason" style="width: 10px;" type="text" value="4" /> Regular Season<br />' + '<input id="playoffs" style="width: 10px;" type="text" value="2" /> Playoffs<br />' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Do you want recently played games to weigh more than an older game?' + '</span>' + '<input type="radio" class="includeMomentum" name="includeMomentum" value="1" >Yes </input>' + '<input type="radio" class="includeMomentum" name="includeMomentum" value="0" checked>No </input>' + '<span style="font-style: italic;"> (If yes, then please specify how games should be weighted below)</span>' + '</p>' + '<p style="padding-left: 2%;">' + 'Make the past' + '<input id="momentumSteps" style="width: 10px;" type="text" value ="4"/>' + ' games worth ' + '<input id="momentumMax" style="width: 10px;" type="text" value="2" />' + ' times the oldest game.<br />' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Do you want to include team talent?' + '</span>' + '<input type="radio" class="talent" name="talent"value="1" >Yes </input>' + '<input type="radio" class="talent" name="talent" value="0" checked>No </input>' + '</p>' + '<p style="padding-left: 2%; font-style: italic;">' + 'Note: This is helpful early in the season.' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Do you want to include the lifetime record of each team?' + '</span>' + '<input type="radio" class="history" name="history" value="1" >Yes </input>' + '<input type="radio" class="history" name="history" value="0" checked>No </input>' + '</p>' + '<p style="padding-left: 2%; font-style: italic;">' + 'Note: This is helpful early in the season.' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Do you want the results to be formatted for easy posting into the forums?' + '</span>' + '<input type="radio" class="forumformat" name="forumformat" value="1" checked>Yes </input>' + '<input type="radio" class="forumformat" name="forumformat" value="0">No </input>' + '</p>' + '<p>' + '<span style="padding-left: 2%; font-style: italic; padding-right: 1%;">' + 'Include team record next to team name in the predictions output?' + '</span>' + '<input type="radio" class="teamrecord" name="teamrecord" value="1">Yes </input>' + '<input type="radio" class="teamrecord" name="teamrecord" value="0" checked>No </input>' + '</p>' + '<br />' + '<p>' + '<span style="font-weight: bold; padding-right: 1%;">' + 'Output next week\'s projected scores (only works from weeks 2-15)?' + '</span>' + '<input type="radio" class="matchups" name="matchups" value="1" checked>Yes </input>' + '<input type="radio" class="matchups" name="matchups" value="0">No </input>' + '</p>' + '<br />' + '<p>' + '<b>You may select two teams to calculate a fantasy matchup</b><br />' + '</p>' + '<p style="padding-left: 2%; font-style: italic;">' + 'Note: Cross-conference matchups are harder to predict accurately.' + '</p>'; rankingForm.innerHTML = form; rankingForm.appendChild(Team1Select); rankingForm.appendChild(Team2Select); } function showOptions(){ var state = document.getElementById('showOptions').name; if (state == 0){ document.getElementById('rankingForm').setAttribute('style',''); document.getElementById('showOptions').name = 1; document.getElementById('showOptions').value = 'Hide Options <<'; } if (state == 1){ document.getElementById('rankingForm').setAttribute('style','visibility: hidden; display:none;'); document.getElementById('showOptions').name = 0; document.getElementById('showOptions').value = 'Show Options >>'; } }; //-------------------------------Main Function function getRankings(){ var userInput = new Array(); getUserInput(userInput); gatherData(userInput); } //-------------------------------First level Functions function getUserInput(userInput){ //User Input Key // 0 = pre-season // 1 = regular season // 2 = playoffs // 3 = Games are equal yes/no // 4 = pre-season weight // 5 = regular season weight // 6 = playoff weight // 7 = include momentum // 8 = mometum weight // 9 = momentum steps //10 = include talent //11 = include history //12 = preSeason length //13 = current season //14 = forum post formatted //15 = output matchups //16 = fantasy matchup teamId 1 //17 = fantasy matchup teamId 2 //18 = show team record in matchups for (var i=0; i<3; i++){ if(document.getElementsByClassName('seasonChk')[i].checked == true){ userInput[i] = 1; } else { userInput[i] = 0; } } if(document.getElementsByClassName('equalGames')[1].checked == true){ userInput[3] = 0; userInput[4] = parseInt(document.getElementById('preSeason').value); userInput[5] = parseInt(document.getElementById('regularSeason').value); userInput[6] = parseInt(document.getElementById('playoffs').value); } else { userInput[3] = 1; userInput[4] = 1; userInput[5] = 1; userInput[6] = 1; } if(document.getElementsByClassName('includeMomentum')[0].checked == true){ userInput[7] = 1; userInput[8] = parseInt(document.getElementById('momentumMax').value); userInput[9] = parseInt(document.getElementById('momentumSteps').value); } else { userInput[7] = 0; userInput[8] = 1; userInput[9] = 1; } if(document.getElementsByClassName('talent')[0].checked == true){ userInput[10] = 1; } else { userInput[10] = 0; } if(document.getElementsByClassName('history')[0].checked == true){ userInput[11] = 1; } else { userInput[11] = 0; } if(document.getElementsByClassName('forumformat')[0].checked == true){ userInput[14] = 1; } else { userInput[14] = 0; } if(document.getElementsByClassName('teamrecord')[0].checked == true){ userInput[18] = 1; } else { userInput[18] = 0; } if(document.getElementsByClassName('matchups')[0].checked == true){ userInput[15] = 1; } else { userInput[15] = 0; } //set Pre-season length here (handles up to 4) userInput[12] = preseasonGames; //set current season number here userInput[13] = season; // set the two teams based on the dropdowns userInput[16] = parseInt(document.getElementById('Fantasy1').value); userInput[17] = parseInt(document.getElementById('Fantasy2').value); } function gatherData(userInput) { //clear the rankingInput and give the user progress feedback document.getElementById('rankingInput').innerHTML = '<span id="progress">Getting Rankings: 0%</span><span id="working">.</span>'; //build a table in rankingData location = document.getElementById('rankingData'); var table = document.createElement('table'); table.setAttribute('id', 'rankingDataTable'); location.appendChild(table); location = document.getElementById('rankingDataTable'); for(var i=0; i<32; i++){ tr = document.createElement('tr'); tr.style.borderStyle="solid"; location.appendChild(tr); tr = location.getElementsByTagName('tr')[i]; for(var j=0; j<78; j++){ var td = document.createElement('td'); td.innerHTML = ''; tr.appendChild(td); } } //----------fill the table with data var teamId = new Array(); var j=0; //fill in the team name column and set the row id to the team id for (var i=0; i<34; i++){ if(i == 0 || i == 17){ i++; } var teamPage = document.getElementById('conferences').getElementsByTagName('tr')[i].childNodes[3].firstChild.href.split('=', 2); if (teamPage[0] == "/game/league.pl?league_id") { // WORLD LEAGUE teamPage = document.getElementById('conferences').getElementsByTagName('tr')[i].childNodes[5].firstChild.href.split('=', 2); var teamName = document.getElementById('conferences').getElementsByTagName('tr')[i].childNodes[5].firstChild.innerHTML; } else { var teamName = document.getElementById('conferences').getElementsByTagName('tr')[i].childNodes[3].firstChild.innerHTML; } teamId[j] = teamPage[1]; document.getElementById('rankingDataTable').getElementsByTagName('tr')[j].id = teamId[j]; document.getElementById(teamId[j]).getElementsByTagName('td')[0].innerHTML = teamName; document.getElementById(teamId[j]).getElementsByTagName('td')[0].setAttribute('class', 'completed'); j++; updateProgress(userInput); } //get team overall if needed if(userInput[10] == 1){ for(var i=0; i<32; i++){ getOverall(teamId[i], userInput); updateProgress(userInput); } } else { for(var i=0; i<32; i++){ document.getElementById(teamId[i]).getElementsByTagName('td')[1].innerHTML = ''; document.getElementById(teamId[i]).getElementsByTagName('td')[1].setAttribute('class', 'completed'); updateProgress(userInput); } } //get historical data if needed if(userInput[11] == 1){ for(var i=0; i<32; i++){ document.getElementById(teamId[i]).getElementsByTagName('td')[2].innerHTML = 0; document.getElementById(teamId[i]).getElementsByTagName('td')[3].innerHTML = 0; for(var j=1; j<userInput[13]; j++){ getHistoricalRecord(teamId[i], j, userInput); updateProgress(userInput); } updateProgress(userInput); } } else { for(var i=0; i<32; i++){ document.getElementById(teamId[i]).getElementsByTagName('td')[2].innerHTML = ''; document.getElementById(teamId[i]).getElementsByTagName('td')[2].setAttribute('class', 'completed'); document.getElementById(teamId[i]).getElementsByTagName('td')[3].innerHTML = ''; document.getElementById(teamId[i]).getElementsByTagName('td')[3].setAttribute('class', 'completed'); updateProgress(userInput); } } //figure out how many regular season games we need to look at var gamesPlayed = getGamesPlayed(); for(var i=0; i<32; i++){ getTeamPage(gamesPlayed, userInput, teamId[i], userInput); } } function calculateResults(userInput){ //clear the rankingInput and give the user progress feedback document.getElementById('rankingInput').innerHTML = "<p>Calculating Rankings<span id='working'>.</span></p>"; var results = new Array(); for(i=0; i<32; i++){ results[i] = new Array(); location = document.getElementById('rankingDataTable').getElementsByTagName('tr'); results[i][0] = parseInt(location[i].id); //Team Id location = location[i].getElementsByTagName('td'); results[i][1] = location[0].innerHTML; //Team Name if(userInput[10] == 1){ results[i][2] = parseInt(location[1].innerHTML); //Overall results[i][3] = parseInt(location[4].innerHTML); //Chemistry //calculate talent results[i][4] = results[i][2] - (100 - results[i][3])/10; //Computed Talent } if(userInput[11] == 1){ //calculate historical winning % var temp = parseInt(location[3].innerHTML)/parseInt(location[2].innerHTML); results[i][5] = temp.toFixed(3); //Historical Winning % } results[i][6] = parseInt(location[5].innerHTML) - 1; //Last Game //calculate wins, losses, games, points var wins = 0; var losses = 0; var games = 0; var pointsFor = 0.0001; var pointsAlw = 0.0001; if(userInput[0] == 1){ for(var j=0; j<userInput[12]; j++){ var k = 6 + 3*(j+4-userInput[12]); if(location[k].innerHTML != ''){ games++; k++; var score1 = parseInt(location[k].innerHTML); k++; var score2 = parseInt(location[k].innerHTML); if(score1 > score2){ wins++; } if(score1 < score2){ losses++; } pointsFor += score1; pointsAlw += score2; } else { j=4; } } } if(userInput[1] == 1){ for(var j=0; j<16; j++){ var k = 18 + j*3; if(location[k].innerHTML != ''){ games++; k++; var score1 = parseInt(location[k].innerHTML); k++ var score2 = parseInt(location[k].innerHTML); if(score1 > score2){ wins++; } if(score1 < score2){ losses++; } pointsFor += score1; pointsAlw += score2; } else { j=16; } } } if(userInput[2] == 1){ for(var j=0; j<4; j++){ var k = 66 + j*3; if(location[k].innerHTML != ''){ games++; k++; var score1 = parseInt(location[k].innerHTML); k++ var score2 = parseInt(location[k].innerHTML); if(score1 > score2){ wins++; } if(score1 < score2){ losses++; } pointsFor += score1; pointsAlw += score2; } else { j=4; } } } results[i][7] = games; //total games played results[i][8] = wins; //total games won results[i][9] = losses; //total games lost results[i][10] = pointsFor; //total points for results[i][11] = pointsAlw; //total points allowed } //put all the games in an array var games = new Array(); for(i=0; i<32; i++){ games[i] = new Array(); for(var j=0; j<24; j++){ games[i][j] = new Array(); var k = 6 + 3*j; games[i][j][0] = results[i][0]; //team1Id games[i][j][1] = document.getElementById(results[i][0]).getElementsByTagName('td')[k].innerHTML;//team2Id k++; games[i][j][2] = parseInt(document.getElementById(results[i][0]).getElementsByTagName('td')[k].innerHTML);//team1Score k++; games[i][j][3] = parseInt(document.getElementById(results[i][0]).getElementsByTagName('td')[k].innerHTML);//team2Score } } //calculate opponents points for and against, & SOR (overall, teams beaten, and teams lost to) for(i=0; i<32; i++){ results[i][12] = 0; //--Opponents Points Allowed-- TEMP results[i][13] = 0; //--Opponents Points Scored-- TEMP results[i][14] = 0; //--Opponent Wins-- TEMP results[i][15] = 0; //--Opponent Games --TEMP results[i][16] = 0; //--Op Wins that you beat --TEMP results[i][17] = 0; //--Op Games that you beat --TEMP results[i][18] = 0; //--Op Wins that you lost to --TEMP results[i][19] = 0; //--Op Games that you lost to-- TEMP for(var j=0; j<24; j++){ oppTeam = games[i][j][1]; if (oppTeam != ''){ for (var k=0; k<32; k++){ if (oppTeam == results[k][0]){ results[i][12] += results[k][11]; results[i][13] += results[k][10]; results[i][14] += results[k][8]; results[i][15] += results[k][7]; if (games[i][j][2] > games[i][j][3]){ //you won results[i][16] += results[k][8]; results[i][17] += results[k][7]; } if (games[i][j][3] > games[i][j][2]) { //you lost results[i][18] += results[k][8]; results[i][19] += results[k][7]; } } } } } //write semi-permanent variables var temp = results[i][12]/results[i][15]; results[i][12] = temp.toFixed(3); //Average Opponent Points Allw temp = results[i][13]/results[i][15]; results[i][13] = temp.toFixed(3); //Average Opponent Points Scr temp = results[i][14]/results[i][15]; results[i][14] = temp.toFixed(3); //SOR (all opps win percentage) temp = results[i][16]/results[i][17]; results[i][15] = temp.toFixed(3); //SOR (teams you beat) (defeated teams' win pcts) temp = results[i][18]/results[i][19]; results[i][16] = temp.toFixed(3); //SOR (teams you lost to) (lost-to teams' win pcts) results[i][17] = results[i][10]/results[i][12]; //offensive efficiency results[i][18] = results[i][11]/results[i][13]; //defensive efficiency } //calculate raw game grades for(var i=0; i<32; i++){ //each team for(var j=0; j<24; j++){ //each game if(games[i][j][1] != ''){ for(var k=0; k<32; k++){ //find opponent if(games[i][j][1] == results[k][0]){ //once opponent is found var expected1 = ((results[i][10]/results[i][7])+(results[k][11]/results[k][7]))/2; var expected2 = ((results[k][10]/results[k][7])+(results[i][11]/results[i][7]))/2; if (expected1 > 255) expected1 = 255; if (expected2 > 255) expected2 = 255; //compare actual to expected var oGrade = (games[i][j][2]/expected1)-1; var dGrade = 1-(games[i][j][3]/expected2); if (oGrade > 1) oGrade = 1; if (dGrade < -1) dGrade = -1; if(games[i][j][2] > games[i][j][3]){ //you won var grade = .67 + (oGrade)/4 + (dGrade)/4; } else if(games[i][j][2] < games[i][j][3]){ //you lost var grade = .33 + (oGrade)/4 + (dGrade)/4; } else { //you tied var grade = .5 + (oGrade)/4 + (dGrade)/4; } if(grade > 1) grade = 1; if(grade < 0) grade = 0; // if (debugging_on) // console.log(results[i][1] + ' v. ' + results[k][1] + '\nexpected: ' + expected1 + ' - ' + expected2 + '\nactual: ' + games[i][j][2] + ' - ' + games[i][j][3] + '\nograde: ' + oGrade + ' dgrade: ' + dGrade + ' grade: ' + grade); games[i][j][2] = oGrade; //oGrade games[i][j][3] = dGrade; //dGrade games[i][j][4] = grade; //Grade k = 32; } } } } } var momentum = new Array(); for (var i = 0; i < 32; i++) { momentum[i] = new Array(); for (var j = 0; j < 24; j++) { momentum[i][j] = 1; } } //set up modifiers for momentum if needed if(userInput[7] == 1){ for(var i=0; i<32; i++){ for(var j=results[i][6]; j>(results[i][6]-userInput[9]); j--){ momentum[i][j] *= userInput[8]; } } } if(userInput[3] == 0){ for(var i=0; i<32; i++){ for(var j=0; j<4; j++){ momentum[i][j] *= userInput[4]; } for(var j=4; j<20; j++){ momentum[i][j] *= userInput[5]; } for(var j=20; j<21; j++){ momentum[i][j] *= userInput[6]; } } } //---------------------round robin----------------------------- for(var i=0; i<32; i++){ pf = 0; pa = 0; rrw = 0; for(var j=0; j<32; j++){ if(results[i][0] != results[j][0]){ temp1 = (((results[i][10]/results[i][7])*results[j][18])+((results[j][11]/results[j][7])*results[i][17]))/2; temp2 = (((results[j][10]/results[j][7])*results[i][18])+((results[i][11]/results[i][7])*results[j][17]))/2; pf += temp1; pa += temp2; if(temp1 > temp2){ rrw++; } } } results[i][24] = pf; results[i][25] = pa; results[i][30] = rrw/31; } //---------------------elo time-------------------------------- //get total game grade (ie record) for each team for (var i = 0; i < 32; i++) { //each team results[i][19] = 0; //initialize team rating } //elo done=0; i=0; do { done++; do { diff = getDiff(i, results, games); if(Math.abs(diff) > .5) { done = 0; results[i][19] += diff; } } while (diff > .5) if(i==31){ i=0; } else { i++; } updateIcon(); } while (done < 32) function getDiff(i, results, games){ diff=0; rating=0; for (var j=0; j < 24; j++) { //each game if(games[i][j][1] != ''){ for (var k = 0; k < 32; k++) { //find opponent rating if(games[i][j][1] == results[k][0]){ rating=results[k][19]; k=32; } } temp = results[i][19] - rating; if (temp > 50) { temp = 50; } else if(temp < -50) { temp = -50; } diff += (games[i][j][4] - ((temp/100)+.5))*momentum[i][j]; } } return diff; } //--------------------------elo done ----------- //calculate ovr, off, and def score // for(var i=0; i<32; i++){ // results[i][24] = 0; //offScore // results[i][25] = 0; //defScore // for(var j=0; j<24; j++){ // if(games[i][j][1] == ''){ // } else { // results[i][19] += games[i][j][4] * momentum[i][j]; // results[i][24] += games[i][j][2] * momentum[i][j]; // results[i][25] += games[i][j][3] * momentum[i][j]; // } // } // } //calculate overall rank for (i = 0; i < 32; i++) { results[i][20] = .75*(results[i][19]+50); } if (userInput[10] == 1) { for (i = 0; i < 32; i++) { results[i][20] += .2 * ((results[i][4] / 70) * 100); } } if(userInput[11]==1){ for (i = 0; i < 32; i++) { results[i][20] += .5 * (results[i][5] * 100); } } //define rank for (var i=0; i<32; i++){ results[i][21] = 1; //overall rank results[i][22] = 1; //offense rank results[i][23] = 1; //defense rank for (var j = 0; j < 32; j++) { if (results[i][0] != results[j][0]) { //don't compare to yourself if (results[i][20] < results[j][20]) { results[i][21]++; } if(results[i][24] < results[j][24]){ results[i][22]++; } if(results[i][25] > results[j][25]){ results[i][23]++; } } } } //sort ranks var output = new Array(); for (var i=0; i<32; i++){ output[i]=new Array(); } for(var i=0; i<32; i++){ var temp = 33; var rank = 33; for(var j=0; j<32; j++){ if (rank > results[j][21]){ temp = j; rank= results[j][21]; } } output[i] = results[temp]; output[i][26] = results[temp][21]; results[temp][21]=33; } outputResults(userInput, output); if (userInput[15]) { // if they want to see matchups if (userInput[0]) { // if we're counting preseason if ((results[0][7]>0) && (results[0][7]< (16+userInput[12]))) // season's started but not over yet! outputMatchups(userInput, results, games); } else { // not counting preseason if ((results[0][7]>0) && (results[0][7]<16)) // season's started but not over yet! outputMatchups(userInput, results, games); } } if (userInput[16] && userInput[17]) outputFantasyMatchup(userInput,results,games); } function getRecord(includePreseason, resultsLine) { var record = resultsLine[8] + '-' + resultsLine[9]; var ties = ( 1 + resultsLine[6] - resultsLine[8] - resultsLine[9] ); if (!includePreseason) // include preseason in W-L-T ties = ( ties - preseasonGames ); if (ties) record += '-' + ties; return record; } function outputResults(userInput, output){ var teamRecord; var html = ''; if (userInput[14]) { html = '<table><tr>' + '<th>[u]Rank[/u]</th>' + '<td>...</td>' + '<th>[u]OFF[/u]</th>' + '<td>...</td>' + '<th>[u]DEF[/u]</th>' + '<td>...</td>' + '<th>[u]S.o.S.[/u]</th>' + '<td>........</td>' + '<th>[u]W-L-T[/u]</th>' + '<th>[u]Team[/u]</th>'; } else { html = '<table><tr>' + '<th>Rank</th>' + '<td> </td>' + '<th>Offense</th>' + '<td> </td>' + '<th>Defense</th>' + '<td> </td>' + '<th>S.o.S.</th>' + '<td> </td>' + '<th>W-L-T</th>' + '<th>Team</th>'; } if (debugging_on==1) { html += '<td>last gm</td>'; html += '<td>games</td>'; html += '<td>win</td>'; html += '<td>loss</td>'; html += '<td>PF</td>'; html += '<td>PA</td>'; html += '<td>Opp Avg PA</td>'; html += '<td>Opp Avg PF</td>'; html += '<td>Opp Win pct</td>'; html += '<td>Def Opp Win pct</td>'; html += '<td>lost-to Opp win pct</td>'; html += '<td>PF / OppAvgPA</td>'; html += '<td>PA / Opp Avg PF</td>'; html += '<td>Team Rating</td>'; html += '<td>Raw Rank</td>'; html += '<td>Overall Rank</td>'; html += '<td>Off Rank</td>'; html += '<td>Def Rank</td>'; html += '<td>pf rr</td>'; html += '<td>pa rr</td>'; html += '<td>overall rank output</td>'; html += '<td>rrw / 31</td>'; } html += '</tr>'; for(var i=0; i<32; i++){ html += '<tr><td>' + output[i][26]; if (userInput[14] && output[i][26] < 10) html += '..'; html += '</td><td>......'; if (userInput[14] && output[i][22] < 10) html += '..'; html += '</td><td>' + output[i][22] + '</td><td>......'; if (userInput[14] && output[i][23] < 10) html += '..'; html += '</td><td>' + output[i][23] + '</td><td>........</td>' + '<td>' + output[i][14] + '</td>' + //14 '<td>........</td>'; teamRecord = getRecord(userInput[0],output[i]); html += '<td>' + teamRecord; if (userInput[14] && teamRecord.length < 6) // justifying for length html += '..'; if (userInput[14] && teamRecord.length < 5) html += '..'; if (userInput[14] && teamRecord.length < 4) html += '..'; html += '</td><td>' + output[i][1] + '</td>'; if (debugging_on==1) { for (var jj=6; jj<27; jj++) html += '<td>' + output[i][jj] + '</td>'; html += '<td>' + output[i][30] + '</td>'; } html += '</tr>'; } html += '</table>'; location = document.getElementById('rankings'); location.innerHTML = html; //build table } function output_a_prediction(resultLine1, resultLine2, userInput) { var expected1 = resultLine1[10] / resultLine1[7]; // T1 avg PF expected1 *= resultLine2[11] / resultLine2[7]; // T2 avg PA expected1 /= Math.sqrt(resultLine1[12] * resultLine2[13]); // geometric mean of T1 OppAvgPA and T2 OppAvgPF if (expected1 > 255) expected1 = 255; var expected2 = resultLine2[10] / resultLine2[7]; // T2 avg PF expected2 *= resultLine1[11] / resultLine1[7]; // T1 avg PA expected2 /= Math.sqrt(resultLine2[12] * resultLine1[13]); // geometric mean of T2 OppAvgPA and T1 OppAvgPF if (expected2 > 255) expected2 = 255; // pick a winner and loser if (expected2 > expected1) { var Winner = resultLine2; var Loser = resultLine1; var wScore = expected2; var lScore = expected1; } else { var Winner = resultLine1; var Loser = resultLine2; var wScore = expected1; var lScore = expected2; } // people always complain about teams showing 1 point. Frankly 2 points is unlikely too, // as are 4, 5, and 8 (in GLB). I just get rid of 1, 4 and 5, and make 2 unlikely. if (wScore < 2.0) wScore = 0.0; if (lScore < 2.0) lScore = 0.0; // may as well get rid of 4 & 5 too if (wScore.toFixed(0)==4 || wScore.toFixed(0)==5) { if (wScore < 4.5) wScore = 3.0; else wScore = 6.0; } if (lScore.toFixed(0)==4 || lScore.toFixed(0)==5) { if (lScore < 4.5) lScore = 3.0; else lScore = 6.0; } // output var html = '<table><tr><td>'; wScore = wScore.toFixed(0); lScore = lScore.toFixed(0); // output the predicted score if (userInput[14] && wScore < 100) html += '&nbsp;&nbsp;' if (userInput[14] && wScore < 10) html += ' &nbsp;' html += wScore + ' - '; if (userInput[14] && lScore < 100) html += '&nbsp;&nbsp;' if (userInput[14] && lScore < 10) html += ' &nbsp;' html += lScore; if (userInput[14]) html += '&nbsp; &nbsp;'; html += '</td>'; html += '<td>' + Winner[1]; if (userInput[18]) html += ' (' + getRecord(userInput[0],Winner) + ')'; if (wScore == lScore) html += ' ties '; else html += ' def. '; html += Loser[1]; if (userInput[18]) html += ' (' + getRecord(userInput[0],Loser) + ')'; html += '</td></tr></table>'; location = document.getElementById('rankings'); location.innerHTML += html; } function outputMatchups(userInput, results, games) { var html = '<br><br>'; if (userInput[14]) { html += '<p>[b]NEXT WEEK\'S MATCHUPS[/b]</p>'; html += '<table><tr><td>[u]Exp Score[/u]</td><td>&nbsp;[u]Matchup[/u]</td></tr></table>'; } else { html += '<p><b>NEXT WEEK\'S MATCHUPS</b></p>'; html += '<table><tr><td><u>Exp Score</u></td><td><u>Matchup</u></td></tr></table>'; } location = document.getElementById('rankings'); location.innerHTML += html; for(var i=0; i<32; i++){ //each team // next game var j = results[i][6]+1; if(games[i][j][3] != '') { // 3 is opponent if the game hasn't been played yet for(var k=i+1; k<32; k++){ //find opponent if(games[i][j][3] == results[k][0]){ //once opponent is found output_a_prediction(results[i],results[k],userInput); k=32; } } } } } function outputFantasyMatchup(userInput, results, games) { var team1Id = userInput[16]; var team2Id = userInput[17]; var html = '<br><br>'; if (userInput[14]) { html += '<p>[b]Head-to-Head Fantasy matchup[/b]</p>'; html += '<table><tr><td>[u]Exp Score[/u]</td><td>&nbsp;[u]Matchup[/u]</td></tr></table>'; } else { html += '<p><b>FANTASY MATCHUP</b></p>'; html += '<table><tr><td><u>Exp Score</u></td><td><u>Matchup</u></td></tr></table>'; } // make sure not same team if (team1Id == team2Id) html+= '<tr><td>ERROR: Please select two different teams</tr></td>'; else { // find team1 for(var i=0; i<33 && results[i][0] != team1Id; i++) ; if (i==32) html += '<tr><td>ERROR: Team 1 not found</tr></td>'; // find team2 for(var j=0; j<33 && results[j][0] != team2Id; j++) ; if (j==32) html += '<tr><td>ERROR: Team 2 not found</tr></td>'; } location = document.getElementById('rankings'); location.innerHTML += html; if (i < 32 && j < 32 && (team1Id!=team2Id)) output_a_prediction(results[i],results[j],userInput); } //----------------------------------Supporting Functions function getOverall(teamId, userInput){ GM_xmlhttpRequest({ method: 'GET', url: '/game/compare_teams.pl?team1=' + teamId + '&team2=' + teamId, headers: { 'User-agent': navigator.userAgent, 'Accept': 'text/xml' }, onload: function(response){ var txt = response.responseText.toString().replace(/\<img/g,"<div"); txt = txt.replace(/\<\/img\>/g,"</div>"); document.getElementById('rankingTemp').innerHTML = txt; // document.getElementById('rankingTemp').innerHTML = response.responseText; var overall = document.getElementById('rankingTemp').getElementsByClassName('rating_bar_fill')[0].innerHTML; document.getElementById(teamId).getElementsByTagName('td')[1].innerHTML = overall; document.getElementById(teamId).getElementsByTagName('td')[1].setAttribute('class', 'completed'); updateProgress(userInput); } }); } function updateProgress(userInput){ updateIcon(); var progress = document.getElementsByClassName('completed'); var denom = 2496 - 3*32*(4-userInput[12]); document.getElementById('progress').innerHTML = 'Getting Rankings: ' + parseInt((progress.length/denom)*100) + '%'; if(progress.length == denom){ calculateResults(userInput); } } function updateIcon(){ working = document.getElementById('working'); switch(working.innerHTML){ case '.': working.innerHTML = '..'; break; case '..': working.innerHTML = '...'; break; case '...': working.innerHTML = '....'; break; case '....': working.innerHTML = '.....'; break; case '.....': working.innerHTML = '......'; break; case '......': working.innerHTML = '.......'; break; case '.......': working.innerHTML = '........'; break; case '........': working.innerHTML = '.........'; break; default : working.innerHTML = '.'; break; } } function getGamesPlayed(){ record = document.getElementById('conferences').getElementsByTagName('tr')[1].childNodes[5].innerHTML; var a = parseInt(record.split('-', 3)[0]); var b = parseInt(record.split('-', 3)[1]); var c = parseInt(record.split('-', 3)[2]); var dataLength = (a + b + c); return dataLength; } function getHistoricalRecord(teamId, season, userInput){ GM_xmlhttpRequest({ method: 'GET', url: '/game/team.pl?season=' + season + '&team_id=' + teamId, headers: { 'User-agent': navigator.userAgent, 'Accept': 'text/xml' }, onload: function(response){ var txt = response.responseText.toString().replace(/\<img/g,"<div"); txt = txt.replace(/\<\/img\>/g,"</div>"); document.getElementById('rankingTemp').innerHTML = txt; // document.getElementById('rankingTemp').innerHTML = response.responseText; var record = document.getElementById('team_record').innerHTML.split(': ', 2)[1]; var wins = parseInt(record.split('-', 3)[0]); var losses = parseInt(record.split('-', 3)[1]); var ties = parseInt(record.split('-', 3)[2]); var games = parseInt(wins + losses + ties); games = parseInt(games + parseInt(document.getElementById(teamId).getElementsByTagName('td')[2].innerHTML)); wins = parseInt(wins + parseInt(document.getElementById(teamId).getElementsByTagName('td')[3].innerHTML)); document.getElementById(teamId).getElementsByTagName('td')[2].innerHTML = games; document.getElementById(teamId).getElementsByTagName('td')[2].setAttribute('class', 'completed'); document.getElementById(teamId).getElementsByTagName('td')[3].innerHTML = wins; document.getElementById(teamId).getElementsByTagName('td')[3].setAttribute('class', 'completed'); updateProgress(userInput); } }); } function getTeamPage(gamesPlayed, userInput, teamId){ GM_xmlhttpRequest({ method: 'GET', url: '/game/team.pl?team_id=' + teamId, headers: { 'User-agent': navigator.userAgent, 'Accept': 'text/xml' }, onload: function(response){ var txt = response.responseText.toString().replace(/\<img/g,"<div"); txt = txt.replace(/\<\/img\>/g,"</div>"); document.getElementById('rankingTemp').innerHTML = txt; // document.getElementById('rankingTemp').innerHTML = response.responseText; location = document.getElementById('rankingTemp'); var scheduleContent = location.getElementsByClassName('schedule_content'); var gameCount=(4-userInput[12]); //getting team chemistry if needed if(userInput[10] == 1){ var chemistry = parseInt(location.getElementsByClassName('rating_bar_fill')[0].innerHTML); document.getElementById(teamId).getElementsByTagName('td')[4].innerHTML = chemistry; document.getElementById(teamId).getElementsByTagName('td')[4].setAttribute('class', 'completed'); } else { document.getElementById(teamId).getElementsByTagName('td')[4].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[4].setAttribute('class', 'completed'); } //get pre-season games if needed if(userInput[0] == 1){ var section = parseInt(scheduleContent.length - 1); //this tells me which section to look for (var i=0; i<userInput[12]; i++){ var j = 2 + 2*i; var k = 6 + 3*(i+4-userInput[12]); var location = scheduleContent[section].childNodes[1].childNodes[j].childNodes[5].childNodes[0]; if (location.innerHTML != 'Matchup'){ var gameId = location.href.split('game_id=', 2)[1]; } else { var gameId = ''; } if (gameId != ''){ //alert('1'); var temp = location.parentNode.parentNode.childNodes[3]; if(temp.firstChild.tagName.toUpperCase() == 'SPAN'){ var team2Id = temp.childNodes[1].href.split('=', 2)[1]; }else{ var team2Id = temp.firstChild.href.split('=', 2)[1]; } var team1Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[0]); var team2Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[1]); document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Id; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team1Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); gameCount++; } else { document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); } updateProgress(userInput); } } else { for (var i=0; i<userInput[12]; i++){ var k = 6 + 3*(i+4-userInput[12]); document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); updateProgress(userInput); } } //load regular season data << this is the default var section = 0; //this tells me which section to look if(userInput[1] == 1){ gameCount=4; for (var i=0; i<16; i++){ var j = 2 + 2*i; var k = 18 + 3*i; var location = scheduleContent[section].childNodes[1].childNodes[j].childNodes[5].childNodes[0]; if (location.innerHTML != 'Matchup'){ var gameId = location.href.split('game_id=', 2)[1]; } else { var gameId = ''; } if (gameId != ''){ //alert(location.parentNode.parentNode.innerHTML); //alert(location.parentNode.parentNode.childNodes[3].innerHTML); var temp = location.parentNode.parentNode.childNodes[3]; if(temp.firstChild.tagName.toUpperCase() == 'SPAN'){ var team2Id = temp.childNodes[1].href.split('=', 2)[1]; }else{ var team2Id = temp.firstChild.href.split('=', 2)[1]; } var team1Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[0]); var team2Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[1]); document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Id; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team1Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); gameCount++; } else { document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; //alert('3'); var temp = location.parentNode.parentNode.childNodes[3]; if(temp.firstChild.tagName.toUpperCase() == 'SPAN'){ var team2Id = temp.childNodes[1].href.split('=', 2)[1]; }else{ var team2Id = temp.firstChild.href.split('=', 2)[1]; } document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Id; // save this here for next matchup document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); } updateProgress(userInput); } } else { for (var i=0; i<16; i++){ var k = 18 + 3*i; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); updateProgress(userInput); } } //load the playoff data if (userInput[2] == 1 && scheduleContent.length == 3){ gameCount = 20; var section = 1; for (var i=0; i<4; i++){ var j = 2 + 2*i; var k = 66 + 3*i; if (scheduleContent[section].childNodes[1].childNodes.length > j) { var location = scheduleContent[section].childNodes[1].childNodes[j].childNodes[5].childNodes[0]; if (location && location.innerHTML != 'Matchup'){ var gameId = location.href.split('game_id=', 2)[1]; } else { var gameId = ''; } } else { var gameId = ''; } if (gameId != ''){ //alert(location.parentNode.parentNode.innerHTML); var temp = location.parentNode.parentNode.childNodes[3]; if(temp.firstChild.tagName.toUpperCase() == 'SPAN'){ var team2Id = temp.childNodes[1].href.split('=', 2)[1]; }else{ var team2Id = temp.firstChild.href.split('=', 2)[1]; } var team1Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[0]); var team2Score = parseInt(location.innerHTML.split(' ', 2)[1].split('-', 2)[1]); document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Id; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team1Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = team2Score; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); gameCount++; } else { document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); } updateProgress(userInput); } } else { for (var i=0; i<4; i++){ var k = 66 + 3*i; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); k++; document.getElementById(teamId).getElementsByTagName('td')[k].innerHTML = ''; document.getElementById(teamId).getElementsByTagName('td')[k].setAttribute('class', 'completed'); updateProgress(userInput); } } //write the gameCount to the table document.getElementById(teamId).getElementsByTagName('td')[5].innerHTML = gameCount; document.getElementById(teamId).getElementsByTagName('td')[5].setAttribute('class', 'completed'); updateProgress(userInput); if (debugging_on) console.log("updateProgress: finished getTeamPage for " + teamId); } }); }