Cumulative Team Results

Get a teams cumulative GLB record.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

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