// ==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);
}
});
}