// ==UserScript==
// @name Cumulative Team Results
// @namespace pbr/trb
// @include http://goallineblitz.com/game/team.pl?*team_id=*
// @include http://glb.warriorgeneral.com/game/team.pl?*team_id=*
// @copyright 2011, pabst
// @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
// @version 13.12.29
// @description Get a teams cumulative GLB record.
// ==/UserScript==
var blowout = 55;
var maxLeaders = 10;
var gamelinks = [ ];
window.setTimeout(function() {
boxSetup();
}, 3000);
var teamPageName = null;
var teamPageId = parseInt(document.location.toString().split("team_id=")[1]);
var earliestSeason = null;
var currentSeason = null;
var useAllGames = false;
var gameTotals = new Array();
var gameHistory = new Array();
function getSeasons() {
var inp = document.getElementById("seasonsTRB");
var seasons = inp.value.split(",");
var output = [];
for (var i=0; i<seasons.length; i++) {
if (seasons[i].split("-").length > 1) {
var first = parseInt(seasons[i].split("-")[0]);
var second = parseInt(seasons[i].split("-")[1])
for (var j=Math.min(first,second); j<=Math.max(first,second); j++) {
output.push(j);
}
}
else {
output.push(parseInt(seasons[i]));
}
}
return output.sort(function(a,b) { return a-b; });
}
function mainHistorical() {
var btn = document.getElementById("rbtbutton");
btn.disabled = true;
useAllGames = document.getElementById("allGamesTeam").checked;
var links = new Array();
var href = document.location.toString();
if (href.match("season") != null) {
href = href.split("season=")[0]+href.split("&")[1];
}
var seasons = getSeasons();
for (var i=0; i<seasons.length; i++) {
links.push(href+"&season="+seasons[i]);
console.log(href+"&season="+seasons[i]);
}
getInetPage(links[0], getGameLinks, links.slice(1));
}
function getGameLinks(address, page, data) {
document.getElementById("rbtbutton").value = data.length+" seasons left";
var div = document.createElement("div");
div.innerHTML = page.responseText.replace(/<img/g,"<div").replace(/\/img/g,"/div>");
var season = parseInt(address.split("season=")[1]);
gameTotals[season] = new Array();
var count = 0;
var links = div.getElementsByTagName("a");
for (var i=0; i<links.length; i++) {
var a = links[i];
if (a.href.toString().indexOf("game.pl?game_id=") != -1) {
gamelinks.push(a.href.toString());
count++;
var obj = new Object();
obj.opp = links[i-1].innerHTML;
obj.oppid = parseInt(links[i-1].href.split("=")[1]);
obj.result = links[i].innerHTML;
obj.type = "n";
var b = a.parentNode.parentNode.parentNode.parentNode.previousSibling.previousSibling.innerHTML;
if (b.indexOf("Playoff") != -1) obj.type = "p";
else if (b.indexOf("Scrimmage") != -1) obj.type = "s";
var b = a.parentNode.parentNode.innerHTML;
if (b.indexOf(" (R)</b>") != -1) obj.type = "r";
else if (b.indexOf(" (T)</b>") != -1) obj.type = "t";
gameTotals[season].push(obj);
if (gameHistory.indexOf(parseInt(obj.oppid)) == -1) {
gameHistory.push(parseInt(obj.oppid));
}
}
}
if (data.length > 0) {
console.log(data.length+": "+data[0]);
getInetPage(data[0], getGameLinks, data.slice(1));
}
else {
console.log(gamelinks.length+" games requested");
document.getElementById("rbtbutton").value = "Calculating Seasons. This might take a while.";
console.log("calculating seasons");
seasonTotals();
document.getElementById("rbtbutton").value = "Calculating Teams. This might take a while.";
console.log("calculating teams");
historicalTotals();
document.getElementById("rbtbutton").value = "Done.";
}
}
function createRecordTBody(title) {
var tbody = document.createElement("tbody");
var hrow = document.createElement("tr");
hrow.setAttribute("class", "nonalternating_color");
var head = ["","Overall","Playoff","<"+1*blowout,"<"+2*blowout,"<"+3*blowout,">"+3*blowout,"Ranked","Tourn.","Scrim."];
for (var i=0; i<head.length; i++) {
var h = head[i];
var th = document.createElement("th");
if (h != "") {
th.setAttribute("style","text-align: center");
th.colSpan = 3;
}
else {
th.setAttribute("style","text-align: center");
th.colSpan = 1;
}
th.innerHTML = h;
hrow.appendChild(th);
}
tbody.appendChild(hrow);
var hrow = document.createElement("tr");
hrow.setAttribute("class", "nonalternating_color2");
var h2 = [title];
for (var i=1; i<head.length; i++) {
h2.push("W");
h2.push("L");
h2.push("T");
}
for (var i=0; i<h2.length; i++) {
var h = h2[i];
var th = document.createElement("th");
if (h == title) {
th.setAttribute("style","color: black; text-align: left");
th.colSpan = 1;
}
else {
th.setAttribute("style","color: black; text-align: right");
}
th.innerHTML = h;
hrow.appendChild(th);
}
tbody.appendChild(hrow);
return tbody;
}
function historicalTotals() {
var table = document.createElement("table");
table.setAttribute("class","bscTable");
table.cellSpacing = "0";
table.cellPadding = "0";
table.style.marginBottom = "0px";
table.style.width = "960px";
var tbody = createRecordTBody("Opponent");
for (var z=0; z<gameHistory.length; z++) {
var id = gameHistory[z];
var opp = null;
var record = [0,0,0];
var playoff = [0,0,0];
var scrimmage = [0,0,0];
var ranked = [0,0,0];
var tourn = [0,0,0];
var spreads = new Array();
for (var s=0; s<gameTotals.length; s++) {
if (gameTotals[s] != null) {
for (var y=0; y<gameTotals[s].length; y++) {
var g = gameTotals[s][y];
if (g.oppid != id) continue;
opp = g.opp;
var res;
if (g.result.indexOf("W") != -1) {
res = 0;
}
else if (g.result.indexOf("L") != -1) {
res = 1;
}
else if (g.result.indexOf("T") != -1) {
res = 2;
}
if ((useAllGames == true) || ((g.type == "n") || (g.type == "p"))) {
record[res]++;
var s1 = parseInt(g.result.split(" ")[1].split("-")[0]);
var s2 = parseInt(g.result.split(" ")[1].split("-")[1]);
var spread = Math.max(s1,s2) - Math.min(s1,s2);
if (spreads[Math.min(Math.floor(spread/blowout),3)] == null) {
spreads[Math.min(Math.floor(spread/blowout),3)] = [0,0,0];
}
spreads[Math.min(Math.floor(spread/blowout),3)][res]++;
}
if (g.type == "p") playoff[res]++;
if (g.type == "s") scrimmage[res]++;
if (g.type == "r") ranked[res]++;
if (g.type == "t") tourn[res]++;
}
}
}
var href = "/game/team.pl?team_id="+id;
var str = "<tr class='alternating_color"+((id%2)+1)+"'><td><a href='"+href+"'>"+opp+"</a></td>";
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+record[i]+"</td>";
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+playoff[i]+"</td>";
}
for (var i=0; i<4; i++) {
for (var j=0; j<3; j++) {
if ((spreads[i] == null) || (spreads[i][j] == null)) {
str += "<td style='text-align:right'>0</td>";
}
else {
str += "<td style='text-align:right'>"+spreads[i][j]+"</td>";
}
}
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+ranked[i]+"</td>";
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+tourn[i]+"</td>";
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+scrimmage[i]+"</td>";
}
str += "</tr>";
tbody.innerHTML += str;
}
table.appendChild(tbody);
for (var i=2; i<table.rows.length-1; i++) {
for (var j=i+1; j<table.rows.length; j++) {
var r1w = parseInt(table.rows[i].cells[1].innerHTML);
var r1l = parseInt(table.rows[i].cells[2].innerHTML);
var r1t = parseInt(table.rows[i].cells[3].innerHTML);
var r2w = parseInt(table.rows[j].cells[1].innerHTML);
var r2l = parseInt(table.rows[j].cells[2].innerHTML);
var r2t = parseInt(table.rows[j].cells[3].innerHTML);
if ((r2w+r2l+r2t) > (r1w+r1l+r1t)) {
table.insertRow(i);
table.rows[i].innerHTML = table.rows[j+1].innerHTML;
var r = table.deleteRow(j+1);
}
else if (((r2w+r2l+r2t) == (r1w+r1l+r1t)) && (r2l < r1l)) {
table.insertRow(i);
table.rows[i].innerHTML = table.rows[j+1].innerHTML;
var r = table.deleteRow(j+1);
}
table.rows[i].setAttribute("class","alternating_color"+((i%2)+1));
}
}
var div = document.createElement("div");
div.appendChild(table);
document.getElementById("footer").parentNode.appendChild(div);
}
function seasonTotals() {
var table = document.createElement("table");
table.setAttribute("class","bscTable");
table.cellSpacing = "0";
table.cellPadding = "0";
table.style.marginBottom = "0px";
table.style.width = "960px";
var tbody = createRecordTBody("Season");
var totals = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for (var s=0; s<gameTotals.length; s++) {
var record = [0,0,0];
var playoff = [0,0,0];
var scrimmage = [0,0,0];
var ranked = [0,0,0];
var tourn = [0,0,0];
var spreads = new Array();
if (gameTotals[s] != null) {
var str = "<tr class='alternating_color"+((s%2)+1)+"'>";
str += "<td>"+s+"</td>";
for (var z=0; z<gameTotals[s].length; z++) {
var g = gameTotals[s][z];
var res;
if (g.result.indexOf("W") != -1) {
res = 0;
}
else if (g.result.indexOf("L") != -1) {
res = 1;
}
else if (g.result.indexOf("T") != -1) {
res = 2;
}
if ((useAllGames == true) || ((g.type == "n") || (g.type == "p"))) {
record[res]++;
var s1 = parseInt(g.result.split(" ")[1].split("-")[0]);
var s2 = parseInt(g.result.split(" ")[1].split("-")[1]);
var spread = Math.max(s1,s2) - Math.min(s1,s2);
if (spreads[Math.min(Math.floor(spread/blowout),3)] == null) {
spreads[Math.min(Math.floor(spread/blowout),3)] = [0,0,0];
}
spreads[Math.min(Math.floor(spread/blowout),3)][res]++;
}
if (g.type == "p") playoff[res]++;
if (g.type == "s") scrimmage[res]++;
if (g.type == "r") ranked[res]++;
if (g.type == "t") tourn[res]++;
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+record[i]+"</td>";
totals[i] += record[i];
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+playoff[i]+"</td>";
totals[i+3] += playoff[i];
}
for (var i=0; i<4; i++) {
for (var j=0; j<3; j++) {
if ((spreads[i] == null) || (spreads[i][j] == null)) {
str += "<td style='text-align:right'>0</td>";
}
else {
str += "<td style='text-align:right'>"+spreads[i][j]+"</td>";
totals[3+3+i*3+j] += spreads[i][j];
}
}
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+ranked[i]+"</td>";
totals[i+18] += ranked[i];
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+tourn[i]+"</td>";
totals[i+21] += tourn[i];
}
for (var i=0; i<3; i++) {
str += "<td style='text-align:right'>"+scrimmage[i]+"</td>";
totals[i+24] += scrimmage[i];
}
str += "</tr>";
tbody.innerHTML += str;
}
}
var str = "<tr class='alternating_color"+((s%2)+1)+"'><td>Total</td>";
for (var i=0; i<totals.length; i++) {
str += "<td style='text-align:right'>"+totals[i]+"</td>";
}
str += "</tr>";
tbody.innerHTML += str;
table.appendChild(tbody);
var div = document.createElement("div");
div.appendChild(table);
document.getElementById("footer").parentNode.appendChild(div);
}
function boxSetup() {
var div = document.createElement("div");
div.style.clear = "both";
var button = document.createElement("input");
button.setAttribute("value","Collect Team History");
button.setAttribute("type","button");
button.setAttribute("id","rbtbutton");
button.addEventListener("click",mainHistorical,false);
div.appendChild(button);
var checkBox = document.createElement("input");
checkBox.setAttribute("type","checkbox");
checkBox.setAttribute("id","allGamesTeam");
checkBox.setAttribute("class","GScheckbox");
checkBox.style.marginLeft = "3px";
checkBox.style.marginRight = "3px";
div.appendChild(checkBox);
var span = document.createElement("span");
span.innerHTML = "Use All Games";
div.appendChild(span);
var selects = document.getElementsByTagName("select");
for (var i=0; i<selects.length; i++) {
if (selects[i].name == "season") {
earliestSeason = selects[i].value;
currentSeason = selects[i].options[0].value;
}
}
var textBox = document.createElement("input");
textBox.setAttribute("type","text");
textBox.size = 16;
textBox.defaultValue = earliestSeason+"-"+currentSeason;
textBox.setAttribute("id","seasonsTRB");
textBox.setAttribute("class","GStextbox");
textBox.style.marginLeft = "3px";
textBox.style.marginRight = "3px";
textBox.addEventListener("mouseover",function(e) { over(e,false); }, false);
textBox.addEventListener("mouseout",function(e) { out(e,false); }, false);
div.appendChild(textBox);
var span = document.createElement("span");
span.innerHTML = "Seasons";
div.appendChild(span);
var content = document.getElementById("content");
content.parentNode.insertBefore(div, content.nextSibling);
}
function over(e, left) {
unsafeWindow.set_tip("Ex. 1,2,3,10,18,19,20 or 1-3,10,18-20", left, null, true);
}
function out(e) {
unsafeWindow.unset_tip();
}
function merge(a, b, sortidx) {
if (a.length == 0) return b;
if (b.length == 0) return a;
var output = new Array();
var idx = 0, aidx = 0, bidx = 0;
while ((aidx < a.length) && (bidx < b.length)) {
if (parseFloat(a[aidx].cells[sortidx].textContent) > parseFloat(b[bidx].cells[sortidx].textContent)) {
output.push(a[aidx++]);
}
else {
output.push(b[bidx++]);
}
}
for (; aidx<a.length; aidx++) {
output.push(a[aidx]);
}
for (; bidx<b.length; bidx++) {
output.push(b[bidx]);
}
return output;
}
function sortColumn(data, sortidx) {
// sort broken?
if (data.length == 1) return data;
var center = Math.round(data.length/2);
var left = data.slice(0,center);
left = sortColumn(left, sortidx);
var right = data.slice(center);
right = sortColumn(right, sortidx);
var output = merge(left, right, sortidx);
return output;
}
function emit(target) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click",false,false);
target.dispatchEvent(evt);
}
function makeSortable() {
var tables = document.getElementsByClassName("bscTable");
for (var j=0; j<tables.length; j++) {
var t = tables[j];
var head = t.getElementsByTagName("th");
for (var i=0; i<head.length; i++) {
var th = head[i];
th.addEventListener("click", sort, false);
}
}
}
function sort(event) {
var tbl = event.target.parentNode.parentNode;
var tbody = tbl.getElementsByTagName("tbody")[0];
var idx = event.target.cellIndex;
if (idx == -1) return;
tbl.style.visibility = "hidden";
var stime = new Date();
var results = sortColumn(getArray(tbl.rows), idx);
var time = new Date() - stime;
console.log("sort time : "+time.toFixed(0)+"ms");
var stime = new Date();
while (tbl.rows.length > 2) {
tbl.deleteRow(2);
}
var time = new Date() - stime;
console.log("delete time : "+time.toFixed(0)+"ms");
var stime = new Date();
for (var i=0; i<Math.min(results.length, results.length+2); i++) {
results[i].setAttribute("class","alternating_color"+(i%2+1));
if (gameLeaders == true) {
if (i > (maxLeaders+2)) {
results[i].style.visibility = "hidden";
results[i].style.display = "none";
}
else {
results[i].style.visibility = "visible";
results[i].style.display = null;
}
}
tbl.appendChild(results[i]);
}
results = null;
var time = new Date() - stime;
console.log("append time : "+time.toFixed(0)+"ms");
tbl.style.visibility = "visible";
}
function getInetPage(address, func, data) {
var req = new XMLHttpRequest();
req.open( 'GET', address, true );
req.onload = function() {
if (this.status != 200) {
inetErrors++;
func(address, this, data);
}
else {
func(address, this, data);
}
};
req.send(null);
return req;
}