Greasy Fork

来自缓存

Greasy Fork is available in English.

sckcovinfo

sdfsdf

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

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

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

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

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