sckcovinfo

sdfsdf

目前為 2014-05-22 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           sckcovinfo
// @namespace      pbr/inf
// @include        http://goallineblitz.com/game/game.pl?game_id=*&mode=pbp
// @copyright      2009, pabst
// @license        (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
// @version        09.11.02
// @description sdfsdf
// ==/UserScript==

window.setTimeout(
    function() {

        var button = document.createElement("input");
        button.setAttribute("value","Run Coverage");
        button.setAttribute("type","button");
        button.setAttribute("id","coveragebutton");
        button.addEventListener("click",function() { main(); },false);

        var spn = document.createElement("span");
		spn.setAttribute("id","coveragespan");
        spn.appendChild(button);

		var tbl = document.getElementById("pbp");
		tbl.parentNode.insertBefore(spn, tbl);

//		addTeam();
//main();
    }
, 100);

var playText = new Array();
var coverages = new Array();
var teamid = 604;
var maxgames = 1;
var season=14;
var tdiv=1;

function addTeam() {
	getInetPage("http://goallineblitz.com/game/team.pl?season="+season+"&team_id="+teamid, tmf);
}

function addGame(addr, page) {
	var div = document.createElement("div");
	div.innerHTML = page.responseText;
	document.body.appendChild(div);
}

function tmf(addr, page) {
	var div = document.createElement("div");
	div.innerHTML = page.responseText;

	var addr = 0;
	var a = div.getElementsByTagName("a");
	var current = window.location.toString().split("?")[1].split("&")[0];
	for (var i=0; i<a.length; i++) {
		if (a[i].href.toString().indexOf("game.pl") != -1) {
			addr++;
			if (a[i].href.toString().indexOf(current) == -1) {
				getInetPage(a[i].href.toString()+"&mode=pbp", addGame);			
			}
			else {
				console.log("skipping "+addr);
			}
		}
		if (addr == maxgames) break;
	}
}

function Coverage() {
	this.id;
	this.player;
	this.position;
	this.attempts = 0;
	this.completions = 0;
	this.yards = 0;
	this.pd = 0;
	this.toString = function() {
		return this.id+" ("+this.position+") "+this.player+" "+this.completions+"/"+this.attempts+" - "+this.yards;
	}
}

function Rush() {
	this.id;
	this.player;
	this.hurry = 0;
	this.sack = 0;
}

function main() {
//	alert("I am main!");
	tdiv = document.getElementsByClassName("team_logo").length/2;
	console.log("tdiv is ="+tdiv);
	var p = document.getElementsByClassName("pbp_play");
	var plays = new Array();
	for (var i=0; i<p.length/tdiv; i++) {
		plays[i] = p[i];
	}
	console.log(p.length+" -- "+plays.length);
	var replays = document.getElementsByClassName("pbp_replay");


	var threads = document.createElement("div");
	threads.setAttribute("id","threads");
	threads.setAttribute("number",plays.length);
	document.getElementById("footer").appendChild(threads);

	var cnt = 0;
	for (var ri=0; ri<plays.length; ri++) {
		var p = plays[ri];
//		console.log(ri+") "+p.textContent.toString().slice(0,20));
		var t = document.createElement("div");
		t.id = replays[ri].childNodes[0].href;
		threads.appendChild(t);

		if ((p.textContent.indexOf(" pass to ") == -1) && 
		    (p.textContent.indexOf(" sacked by ") == -1)) { 
			var threads = document.getElementById("threads");
			t.innerHTML = "<div></div><div></div>";
			continue;
		}
		playText[replays[ri].childNodes[0].href] = p.textContent;
		getInetPage(replays[ri].childNodes[0].href, def);
		cnt++;
	}
	console.log("count="+cnt);
	setTimeout(function() { finish(); }, 500);
}

function finish(input) {
console.log("input was "+input);
	var threads = document.getElementById("threads");
	var number = threads.getAttribute("number");

	var i = input;
	if (i == null) i = 0;
	for (; i<threads.childNodes.length; i++) {
		if (threads.childNodes[i].childNodes.length != 2) {
//			console.log("no children : "+i);
			document.getElementById("coveragespan").innerHTML = i +
					"/" + threads.childNodes.length;
			setTimeout(function() { finish(i); }, 3000);
			return;
		}
	}

	if (0 == 1) {
	}
	else {
		var spn = document.getElementById("coveragespan");
		spn.parentNode.removeChild(spn);

		var output = combine();
		coverages = output[0];
//		coverages = combineCoverage();
		console.log("done : "+coverages.length);

		var rows = new Array();
		for (var i=0; i<coverages.length; i++) {
//			console.log(coverages[i]);
			rows.push(coverages[i].player);
		}
		var table = getCoverageTable(0,rows);
		var tbl = document.getElementById("pbp");
		tbl.parentNode.insertBefore(table, tbl);
		for (var i=0; i<coverages.length; i++) {
			document.getElementById("cv-0-"+i+"-0").innerHTML = coverages[i].completions;
			document.getElementById("cv-1-"+i+"-0").innerHTML = coverages[i].attempts;
			var num = (100*coverages[i].completions / coverages[i].attempts).toFixed(0);   
			if (isNaN(num) == true) {
				num = 0;
			}
	
			document.getElementById("cv-2-"+i+"-0").innerHTML = num + "%";
			document.getElementById("cv-3-"+i+"-0").innerHTML = coverages[i].yards;
			document.getElementById("cv-4-"+i+"-0").innerHTML = coverages[i].pd;
		}

		var blocking = output[1];
//		coverages = combineBlocking();
		var rows = new Array();
		for (var i=0; i<blocking.length; i++) {
//			console.log(blocking[i]);
			rows.push(blocking[i].player);
		}
		var table = getBlockingTable(0,rows);
		var tbl = document.getElementById("pbp");
		tbl.parentNode.insertBefore(table, tbl);
		for (var i=0; i<blocking.length; i++) {
			document.getElementById("bl-0-"+i+"-0").innerHTML = blocking[i].hurry;
			document.getElementById("bl-1-"+i+"-0").innerHTML = blocking[i].sack;
		}
		var t = document.getElementById("threads");
//		t.parentNode.removeChild(t);
	}
}

function combine() {
	var rush = new Array();
	var pass = new Array();
	var threads = document.getElementById("threads");
//	for (var cidx=0; cidx<threads.childNodes.length; cidx++) {
//		var child = threads.childNodes[cidx];
	var replays = document.getElementsByClassName("pbp_replay");
	for (var cidx=0; cidx<replays.length/tdiv; cidx++) {
		var child = document.getElementById(replays[cidx].childNodes[0].href);
		if (child == null) continue;
		if (child.childNodes.length == 0) continue;

		var p = child.childNodes[0].innerHTML;
		var t = p.split(" ",5);
		if (t.length >= 5) {
			var cov = new Coverage();
			cov.id = parseInt(t[0]);
			cov.completions = parseInt(t[1]);
			cov.attempts = 1;
			cov.yards = parseInt(t[2]);
			cov.pd = parseInt(t[3]);
			cov.player = p.slice(t[0].length+t[1].length+t[2].length+5);
			pass.push(cov);
		}

		if (child.childNodes.length > 1) {
			var bl = child.childNodes[1].innerHTML;

			var t = bl.split(" ",3);
			if (t.length >= 3) {
				var r = new Rush();
				r.id = parseInt(t[0]);
				if (t[1] == "0") r.hurry = 1;
				else r.sack = 1;
				r.player = bl.slice(t[0].length+3);
				rush.push(r);
			}
		}
	}
//	threads.parentNode.removeChild(threads);
console.log("coverages == "+pass.length);
console.log("rushes == "+rush.length);

	var out = new Array();

	c = pass;
	console.log("combine coverage "+c.length);
	var output = new Array();
	for (var j=0; j<c.length; j++) {
		var id = c[j].id;
		var idx = -1;
		for (var i=0; i<output.length; i++) {
			if (c[j].id == output[i].id) {
				idx = i;
				break;
			}
		}
		if (idx == -1) {
			output.push(c[j]);
		}
		else {
			output[idx].completions += c[j].completions;
			output[idx].attempts += c[j].attempts;
			output[idx].yards += c[j].yards;
			output[idx].pd += c[j].pd;
		}
	}
	out[0] = output;

	c = rush;
	console.log("combine blocking "+c.length);
	var output = new Array();
	for (var j=0; j<c.length; j++) {
		var id = c[j].id;
		var idx = -1;
		for (var i=0; i<output.length; i++) {
			if (c[j].id == output[i].id) {
				idx = i;
				break;
			}
		}
		if (idx == -1) {
			output.push(c[j]);
		}
		else {
			output[i].hurry += c[j].hurry;
			output[i].sack += c[j].sack;
		}
	}
	out[1] = output;

	return out;
}

function def(addr, page) {
//console.log("pt-- "+playText[addr]);
//console.log(page.responseText);
    var idx = page.responseText.indexOf("var players =");
    var p = page.responseText.slice(idx+"var players =".length);
    p = p.slice(0,p.indexOf("var play_data"));
    var pd = page.responseText.slice(page.responseText.indexOf("var play_data =")+"var play_data =".length);
    pd = pd.slice(0,pd.indexOf(";"));
    var pt = page.responseText.slice(page.responseText.indexOf("var ptid =")+"var ptid =".length);
    pt = pt.slice(0,pt.indexOf(";"));
    var newplayers = null;
    var newplay_data = null;
    eval("newplayers = "+p);
    newplay_data = eval(pd);
    eval("ptid = "+pt);

//	console.log(newplayers+" -- "+newplay_data.length);
	var res = defender_main(newplayers, newplay_data, playText[addr]);
//	console.log("def end");

	var t = document.getElementById(addr);
	if (t == null) console.log("t element missing : "+addr);
	for (var i=0; i<res.length; i++) {
		var div = document.createElement("div");
		div.innerHTML = res[i];
		t.appendChild(div);
	}
	for (var i=t.childNodes.length; i<2; i++) {
		t.innerHTML += "<div></div>";
	}
}

function defender_main(players, play_data, playText) {
    var output = new Array();
    output[0] = null;
    output[1] = null;
    var playerids = new Array();
    for (var i = 0; i < play_data[0].length; i++) {
        var data = play_data[0][i];
        if (data.id != 'ball') {
            playerids.push (data.id);
        }
    }

    var receiver = getReceiverName(playText);
    //console.log("receiver is : '"+receiver+"'");
    if (receiver != null) {
        var wrid = -1;
        for (var i = 0; i < playerids.length; i++) {
            var plyr = players[playerids[i]];
			//console.log("'"+plyr.name+"' -- '"+receiver+"'");
            if (plyr.name == receiver) {
                wrid = playerids[i];
                break;
            }
        }
        if (wrid == -1) {
//console.log("no receiver : "+playText);
			return ["",""];
		}

        var min = 99999;
        var incY = 99999;
        var catchY = -1;
        var wridx = -1;
        for (var i=0; i<play_data[1].length; i++) {
            if (play_data[1][i].id == wrid) {
                wridx = i;
                break;
            }
        }

        for (var j = 0; j < play_data.length; j++) {
            var balldata = play_data[j][0];
            var snapdata = play_data[j][wridx];

            var ydepth = Math.abs(snapdata.y - balldata.y);
            var xdepth = Math.abs(snapdata.x - balldata.x);
//????            xdepth = xdepth-3;
            var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
            if (distance < min) {
                incY = snapdata.y;
                min = distance;
                distY = balldata.y //added this
            }
            if (distance == 0) {
                catchY = balldata.y
                distY = balldata.y //added this
                break;
            }
        //console.log(min+" : "+balldata+" : "+snapdata+" : "+xdepth+" : "+ydepth);
        }
				var c = -1;
				for (var v=0; v<playerids.length; v++) {
					if (players[playerids[v]].position == "C") {
						for (var w=0; w<play_data[0].length; w++) {
							if (play_data[0][w].id == playerids[v]) {
								c = w;
								break;
							}
						}
						break;
					}
				}
				console.log(playText);
				console.log("C is : "+c+" -- "+(distY*3+40-6)+" : "+(play_data[0][c].y*3+40-6));
				console.log("Pass Length = "+parseInt(distY-play_data[0][c].y)/3);

        try {
            var defPlayers = findDefender(players, play_data, playText);
            if (defPlayers != null) {
                var max = findMax(defPlayers);
                var def = play_data[0][max];
//                console.log(max+"-"+def.id+"-"+players[def.id].position+"-"+players[def.id].name);

		var pd = 0;
		if (playText.indexOf("[deflected by ") != -1) pd = 1;

		var result = null;
		playText = playText.split("(");
		for (var i=0; i<playText.length; i++) {
			if (playText[i].indexOf("yd gain)") != -1) {
				result = parseFloat(playText[i]);				
				break;
			}
			else if (playText[i].indexOf("yd loss)") != -1) {
				result = parseFloat(playText[i]);				
				break;
			}
			else if (playText[i].indexOf("no gain)") != -1) {
				result = 0;				
				break;
			}
		}
//console.log("result is : "+players[def.id].position+"-"+players[def.id].name+" : "+result);
		var c = new Coverage();
		c.id = def.id;
		c.position = players[def.id].position;
		c.player = players[def.id].name;
		c.attempts = 1;
		c.completions = 0;
		c.yards = 0;
		if (result != null) {
			c.completions++;
			c.yards += result;
		}
		else {
			c.pd = pd;
		}
//		coverages.push(c);
//		console.log(c);
		output[0] = c.id+" "+c.completions+" "+c.yards+" "+c.pd+" "+c.player;
            }
        }
        catch (err) {
            console.log("yac defenders: "+err);
			output = "";
        }
    }

    
    try {
        var blockers = findBlocker(players, play_data, playText);
        if (blockers != null) {
            var max = findMax(blockers);
//console.log(blockers);
            var def = play_data[0][max];
//            console.log(max+"-"+def.id);
if (def.id == "ball") {
	max = findMax(blockers.slice(1));
}
            var def = play_data[0][max];
//            console.log(max+"-"+def.id);
//	    console.log(players[def.id].position+"-"+players[def.id].name);
	    
	    var sh = "0";
	    if (playText.indexOf(" sacked by ") != -1) {
		sh = "1";
	    }
	
//   	    console.log(def.id+" "+sh+" "+players[def.id].name);
   	    output[1] = def.id+" "+sh+" "+players[def.id].name;
//            addBlocker(players[def.id].position+"-"+players[def.id].name);
        }
	else { 
//	    console.log("no blockers : "+playText); 
	}
    }
    catch (err) {
        console.log("yac blockers: "+err);
		output[1] = "";
    }

	return output;	    
}

function findDefender(players, play_data, outcome) {
    var playerids = new Array();
    for (var i = 1; i < play_data[0].length; i++) {
        var data = play_data[0][i];
        if (data.id != 'ball') {
            playerids.push (data.id);
        }
    }

    var playText = outcome;
    var receiver = getReceiverName(playText);

    var wrid = -1;
    for (var i = 0; i < playerids.length; i++) {
        var plyr = players[playerids[i]];
        if (plyr.name == receiver) {
            wrid = playerids[i];
            break;
        }
    }
    if (wrid == -1) return null;

    var wridx = -1;
    for (var i=0; i<play_data[1].length; i++) {
        if (play_data[1][i].id == wrid) {
            wridx = i;
            break;
        }
    }

    var defmin = 99999;
    var defPlayers = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    var j;
    for (j = 0; j < play_data.length; j++) {
        var k=0;
        if (wridx <= 11) {
            k=1;
        }
        var fmin = 99999;
        var fidx = -1;
        for (var i=(k*11)+1; i<(k*11)+12; i++) {
            try{
                //console.log(wridx+" == "+i+" -- "+unsafeWindow.play_data[j][i]);
                var def = play_data[j][i];
                var defydepth = Math.abs(def.y - play_data[j][wridx].y);
                var defxdepth = Math.abs(def.x - play_data[j][wridx].x);
                var defdistance = Math.sqrt(defydepth*defydepth + defxdepth*defxdepth);
                if (defdistance < defmin) {
                    defmin = defdistance;
                }
                if (defdistance < fmin) {
                    fmin = defdistance;
                    fidx = i;
                }
                defPlayers[i] = Math.max(0,defPlayers[i]-0.7);
                //console.log(unsafeWindow.players[def.id].name);
                if ((i != -1) && (defdistance < 18) && (j>5)) {
                    defPlayers[i] += 1.35;
                }
            //console.log(unsafeWindow.play_data[j][i].id+" : "+defPlayers[i]);
            } catch(e) {}
        }
        if (fmin < 12) {
            defPlayers[fidx] += 0.35;
        }
	//console.log(j+" -- "+fmin+" : "+fidx+" -- "+defPlayers);

	try {
  	    var balldata = play_data[j+5][0];
	    var wrdata = play_data[j+5][wridx];
	    //console.log(balldata.x+" - "+wrdata.x+" : "+balldata.y+" - "+wrdata.y);
	    if ((Math.abs(balldata.x - wrdata.x) < 15) && (Math.abs(balldata.y - wrdata.y) < 15)) {
	        break;
	    }
	}
	catch (e) {
	    break;
	}
	if ((j == 0) && ((j+10) < (play_data.length-5))) {
	    j += 9;
	}
    }
    //alert("defmin="+defmin);
    if (defmin > 11) {
        //console.log("HiZ");
        defPlayers = null;
    }
    return defPlayers;
}

function findBlocker(players,play_data, playText) {
    var outcome = playText.toString();
    var playerids = new Array();
    for (var i = 1; i < play_data[0].length; i++) {
        var data = play_data[0][i];
        if (data.id != 'ball') {
            playerids.push (data.id);
        }
    }

    var qbid = 0;
    for (var i = 0; i < playerids.length; i++) {
        var plyr = players[playerids[i]];
        //console.log(i+") "+plyr.position);
        if (plyr.position == "QB") {
            qbid = playerids[i];
            break;
        }
    }

    var qbidx = 0;
    for (var i=0; i<22; i++) {
        if (play_data[0][i].id == qbid) {
            qbidx = i;
            break;
        }
    }

    var lastFrame = play_data.length;
    var last = 32767;
    for (var f=0; f<play_data.length; f++) {
        var balldata = play_data[f][0];
        var qbdata = play_data[f][qbidx];
        var ydepth = Math.abs(qbdata.y - balldata.y);
        var xdepth = Math.abs(qbdata.x - balldata.x);
        var distance = Math.sqrt(ydepth*ydepth + xdepth*xdepth);
        //console.log(f+") "+distance+" --- "+last);
        if (distance > last) {
            lastFrame = f;
            break;
        }
        last = distance;
    }

    //console.log(qbid+" - "+qbidx+" : lf="+lastFrame);
    
    var rusher;
    var idx = outcome.indexOf(" sacked by ")+" sacked by ".length;
    if (idx != 10) {
        rusher = outcome.slice(idx,idx+outcome.slice(idx).indexOf(" ("));
    }
    else {
        idx = outcome.indexOf(", hurried by ")+", hurried by ".length;
        rusher = outcome.slice(idx,idx+outcome.slice(idx).indexOf(", "));
    }

    var rusheridx = -1;
    var rusherid = -1;
    for (var i=0; i<play_data[0].length; i++) {
        var id = play_data[0][i].id;
        if (players[id] != null) {
            if (players[id].name == rusher) {
                rusherid = id;
                rusheridx = i;
                break;
            }
        }
    }
//    console.log("rusher="+rusherid+" : "+rusheridx+" : "+players[rusherid].name);
    if (rusherid == -1) return null;

    var offmin = 99999;
    var offPlayers = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    var offidx = -1;
    var j;
    for (j = 0; j < lastFrame; j++) {
        var k=0;
        if (rusherid <= 11) {
            k=1;
        }
        var offmin = 99999;
        var offidx = -1;
        //console.log(rusher+" - "+unsafeWindow.play_data[j][rusheridx].x+","+unsafeWindow.play_data[j][rusheridx].y);
        for (var i=(k*11)+1; i<(k*11)+12; i++) {
            var off = play_data[j][i];
            var offydist = Math.abs(off.y - play_data[j][rusheridx].y);
            var offxdist = Math.abs(off.x - play_data[j][rusheridx].x);
            var offdistance = Math.sqrt(offydist*offydist + offxdist*offxdist);
            if (offdistance < offmin) {
                offmin = offdistance;
                offidx = i;
            }
            //console.log(rusherid+"/"+rusheridx+" == "+i+" -- "+unsafeWindow.play_data[j][i].id+" = "+offdistance);
            offPlayers[i] = Math.max(0,offPlayers[i]-0.1);
            if (offdistance < 9) {
                //console.log(unsafeWindow.players[off.id].name+" -- "+offdistance+" :: "+off.x+","+off.y);
                offPlayers[i] += 1;
            }
	//console.log(offPlayers);
        }
        if (offmin < 6) {
            offPlayers[offidx] += 0.35;
        }
	if (j == 2) j += 7;
    }
    //console.log(offidx+"-"+offidx+"-"+offmin+"="+offPlayers);
    if (offmin > 15) {
        offidx = -1;
        offPlayers = null;
    }
    return offPlayers;
}

function findMax(arr) {
    if (arr == null) return -1;
    if (arr.length < 1) return -1;

    var idx = 0;
    var max = arr[idx];
    for (var i=1; i<arr.length; i++) {
        if (arr[i] > max) {
            idx = i;
            max = arr[i];
        }
    }
    return idx;
}

function getReceiverName(playText) {
    var sn = playText.indexOf('pass to ')+8;
    var en = 0;

    if (playText.indexOf(', hurried by')!=-1) {
        en = playText.indexOf(', hurried by');
    }
    else if (playText.indexOf(' up the')!=-1) {
        en = playText.indexOf(' up the');
    }
    else if (playText.indexOf(' over the')!= -1) {
        en = playText.indexOf(' over the');
    }
    else {
        return null;
    }

    var name = playText.slice(sn,en);
    return name;
}

function getInetPage(address, func, target) {
//    console.log("getInetPage : "+address);
    var req = new XMLHttpRequest();
	req.open( 'GET', address, true );
	req.onreadystatechange = function() {
		if (target != null) {
			var d = ["..","...","."];
			var str = target.innerHTML.split(" ");
			target.innerHTML = str[0]+" "+d[str[1].length-1];
    	}
	};
	req.onload = function() {
		if (this.status != 200) {
			console.log("pbr gm script: Error "+this.status+" loading "+address);
			getInetPage(address, func, target);
		}
		else {
//			console.log("loaded: "+address)
			func(address,this);
		}
	};

	req.send(null);
	return req;
}

function getCoverageTable(index, rows) {
	var title = "Coverage";
	var columns = ["Name","Cmp", "Att","Pct","Yards", "PD"];

	var r = rows;
	if (rows == null) r = [];
	else if (rows.length == 0) r = [];
	return getTable(title,r,columns,index,"cv",true);
}

function getBlockingTable(index, rows) {
	var title = "Blocking";
	var columns = ["Name","Hurries","Sacks"];

	var r = rows;
	if (rows == null) r = [];
	else if (rows.length == 0) r = [];
	return getTable(title,r,columns,index,"bl",true);
}

function getTable(title, rows, columns, index, prefix, sortable) {
	var t = document.createElement("table");
	t.setAttribute("border","1");
	t.setAttribute("cellspacing","0");
	t.setAttribute("style","width: 485px;visibility: visible;");
	t.setAttribute('id','scout-'+prefix+""+index+'-table');

	var tr = document.createElement("tr");
	tr.setAttribute('class','nonalternating_color pbp_pbr_title');

	var td = document.createElement("td");
	td.setAttribute('id','team'+index+""+prefix);
	td.setAttribute('colspan',columns.length+1);
	td.setAttribute('align','center');
	td.appendChild(document.createTextNode(title));
	tr.appendChild(td);
	t.appendChild(tr);

	var tr2 = document.createElement("tr");
	tr2.setAttribute('class','nonalternating_color2 pbp_pbr_title');
	var first = document.createElement("td");
	first.setAttribute("align","left");
	first.appendChild(document.createTextNode(columns[0]));
	tr2.appendChild(first);
	if (sortable == true) {
		tr2.addEventListener("click",sortEvent,true);
	}
	for (var x=1; x<columns.length; x++) {
		var colname = document.createElement("td");
		var colname = document.createElement("td");
		colname.setAttribute('align','center');
		var tn = document.createTextNode(columns[x]);
		colname.appendChild(tn);
		tr2.appendChild(colname);
	}
	t.appendChild(tr2);

	for (var y=0; y<rows.length; y++) {
		var tr3 = document.createElement("tr");
		tr3.setAttribute('class','alternating_color'+(y%2+1)+' pbp_pbr_title_row');
		var rowname = document.createElement("td");
		rowname.appendChild(document.createTextNode(rows[y]));
		tr3.appendChild(rowname);
		for (var x=1; x<columns.length; x++) {
			var stat = document.createElement("td");
			stat.setAttribute('id',prefix+'-'+(x-1)+'-'+y+'-'+index);
			stat.setAttribute('align','center');
			stat.appendChild(document.createTextNode('('+(x-1)+','+y+')'));
			tr3.appendChild(stat);
		}
		t.appendChild(tr3);
	}
	return t;
}

function sortEvent(evt) {
	sortTable(evt.target.parentNode.parentNode,evt.target.cellIndex);
	return true;
}

function sortTable(table, column) {
	var rows = table.rows;
	var viz = table.getAttribute("style");
	table.setAttribute("style","visibility: hidden;");
	for (var i=2; i<rows.length-1; i++) {
		var idx = i;
		for (var j=i; j<rows.length-1; j++) {
			var lrow = rows.item(idx);
			var lcell = lrow.cells.item(column);
			var rrow = rows.item(j+1);
			var rcell = rrow.cells.item(column);
			var left = parseFloat(lcell.innerHTML);
			var right = parseFloat(rcell.innerHTML);
			if (isNaN(left) || isNaN(right)) {
				left = lcell.innerHTML.toLowerCase();
				right = rcell.innerHTML.toLowerCase();
				if (left > right) {
					idx = j+1;
				}
			}
			else {
				if (left < right) {
					idx = j+1;
				}
			}
		}
		if (idx != -1) {
			var r = table.rows.item(idx);
			table.deleteRow(idx);
			var newRow = table.insertRow(i);
			newRow.setAttribute("class","alternating_color"+(i%2+1)+" pbp_pbr_title_row");
			for (var x=0; x<r.cells.length; x++) {
				var cell = newRow.insertCell(x);		
				cell.setAttribute("align",r.cells.item(x).getAttribute("align"));
				cell.setAttribute("id",r.cells.item(x).getAttribute("id"));
				cell.innerHTML = r.cells.item(x).innerHTML;
			}
		}
	}
	if (rows.length != 2) {
		var lastRow = table.rows.item(rows.length-1);
		lastRow.setAttribute("class","alternating_color"+((rows.length-1)%2+1)+" pbp_pbr_title_row");
	}
	table.setAttribute("style",viz);
}