Cumulative Team Results

Get a teams cumulative GLB record.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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;
}