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