GLB Canvas Replay Conversion

sdfsdf

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        GLB Canvas Replay Conversion
// @namespace   pbr/canvas
// @include     http://goallineblitz.com/game/replay.pl?game_id=*&pbp_id=*
// @copyright   2012, pabst
// @license     (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
// @version	12.11.30
// @description sdfsdf
// ==/UserScript==

/*
 *
 * pabst did this 12/11/27+
 *
 *
 */

unsafeWindow.pause();
document.getElementById("offense_container").style.visibility = "hidden";
document.getElementById("defense_container").style.visibility = "hidden";
document.getElementById("offense_container").style.display = "none";
document.getElementById("defense_container").style.display = "none";

var play_data = null;
var imageData = [];

if (!window.requestAnimationFrame) {
	requestAnimFrame = (function () {
		return  window.requestAnimationFrame       || 
	        	window.webkitRequestAnimationFrame || 
	              	window.mozRequestAnimationFrame    || 
	              	window.oRequestAnimationFrame      || 
	              	window.msRequestAnimationFrame     || 
	              	function(callback, element) {
				console.log("no request animation frame!!");
	                	window.setTimeout(callback, 1000 / 20);
	              	};
	}) ();
};

window.setTimeout(
	function() {
		if (unsafeWindow.defaultFrameSpeed != 100) {
			console.log("replays must be set to 10fps for this script to work : "+unsafeWindow.defaultFrameSpeed);
			unsafeWindow.play();
		}
		else {
			main();
		}
	}
, 100);

function main() {
	var container = document.getElementById("replay_container")
	container.style.height = "500px";
	container.style.width = "520px";
	var area = document.getElementById("replay_area");
	container.removeChild(area);

	play_data = fixFrames();
	fixButtons();

	initBackground();
	initForeground();
	initOffense();
	initDefense();
	initReplayInfo();

	drawFrame(0,0);
	setTimeout(function() { 
		isPlaying = true;
		document.getElementById("pause_button").visibility = "visible";
		document.getElementById("play_button").visibility = "hidden";
		render(); 
	}, 2500);
}

function initBackground() {
	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.setAttribute("id","background");
	canvas.setAttribute("width","520px");
	canvas.setAttribute("height","500px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);

	var context = canvas.getContext("2d");
	context.save();
}

function initForeground() {
	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.setAttribute("id","foreground");
	canvas.setAttribute("width","520px");
	canvas.setAttribute("height","500px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);

	var context = canvas.getContext("2d");
	context.save();
}

function initOffense() {
	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.style.top = "20px";

	canvas.setAttribute("id","offense");
	canvas.setAttribute("width","20px");
	canvas.setAttribute("height","460px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);

	canvas.addEventListener("click", offenseClicked, false);
}

function offenseClicked() {
	renderOffenseLineup();
}

function initDefense() {
	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.style.left = "500px";
	canvas.style.top = "20px";

	canvas.setAttribute("id","defense");
	canvas.setAttribute("width","20px");
	canvas.setAttribute("height","460px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);

	canvas.addEventListener("click", defenseClicked, false);
}

function defenseClicked() {
	renderDefenseLineup();
}

function initReplayInfo() {
	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.setAttribute("id","replayInfo");
	canvas.setAttribute("width","520px");
	canvas.setAttribute("height","20px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);

	var canvas = document.createElement("canvas");
	canvas.style.position = 'absolute';
	canvas.style.top = "480px";
	canvas.setAttribute("id","playResults");
	canvas.setAttribute("width","520px");
	canvas.setAttribute("height","20px");

	var container = document.getElementById("replay_container")
	container.appendChild(canvas);
}

function getTeamBColor(id) {
	var team = unsafeWindow.ptid[id];
	var position = unsafeWindow.players[id].position;
	var fcolor = unsafeWindow.home_color2+"_border_home";
	var bcolor = unsafeWindow.home_color1;
	if (unsafeWindow.home != team) {
		fcolor = unsafeWindow.away_color2+"_border";
		bcolor = unsafeWindow.away_color1;
	}
	bcolor = bcolor.replace("mid_","medium");	
	bcolor = bcolor.replace("_","");
	return bcolor;
}

function getTeamFColor(bcolor) {
	var canvas = document.createElement("canvas");
	var context = canvas.getContext("2d");
	context.strokeStyle = bcolor;
	var color = context.strokeStyle.toString().slice(1);
	var r = parseInt(color.slice(0,2), 16);
	var g = parseInt(color.slice(2,4), 16);
	var b = parseInt(color.slice(4,6), 16);
	if ((r+g+b)/3 > 128) {
		return "black";
	}
	else {
		return "white";
	}
}

function renderReplayInfo() {
	if (imageData["replayInfo"] == null) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("width","520px");
		canvas.setAttribute("height","20px");
		var context = canvas.getContext("2d");

		var gradient = context.createLinearGradient(0,0,0,20);
		gradient.addColorStop(0,"rgb(100,100,100)");
		gradient.addColorStop(1,"rgb(40,40,40)");

		context.lineWidth = 2;
		context.fillStyle = gradient;
		context.fillRect(0,0,520,20);

		context.font = "bold 18px sans-serif";
		context.fillStyle = "#ffcc00";
		var info = document.getElementsByTagName("h1")[0].textContent;
		var length = context.measureText(info.toString());
		context.fillText(info.toString(), 260-length.width/2,16);

		var p = play_data[0][1];
		var id = p.id;
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.lineWidth = 2;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;

		context.beginPath();
		context.moveTo(0,0);
		context.lineTo(40, 0);
		context.lineTo(60,20);
		context.lineTo(0,20);
		context.lineTo(0,0);
		context.closePath();
		context.fill();
		context.stroke();
		
		context.font="bold 16px sans-serif";
		var score = document.getElementById("off_score").textContent;
		var length = context.measureText(score.toString());
		context.fillStyle = fcolor;
		context.fillText(score.toString(), 20-length.width/2,16);

		var p = play_data[0][12];
		var id = p.id;
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.lineWidth = 2;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;

		context.beginPath();
		context.moveTo(520,0);
		context.lineTo(480, 0);
		context.lineTo(460,20);
		context.lineTo(520,20);
		context.lineTo(520,0);
		context.closePath();
		context.fill();
		context.stroke();

		context.font="bold 16px sans-serif";
		var score = document.getElementById("def_score").textContent;
		var length = context.measureText(score.toString());
		context.fillStyle = fcolor;
		context.fillText(score.toString(), 500-length.width/2,16);

		imageData["replayInfo"] = canvas;
	}
	var canvas = document.getElementById("replayInfo");
	var context = canvas.getContext("2d");
	context.drawImage(imageData["replayInfo"],0,0);

	if (imageData["playResults"] == null) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("width","520px");
		canvas.setAttribute("height","20px");
		var context = canvas.getContext("2d");

		var gradient = context.createLinearGradient(0,0,0,20);
		gradient.addColorStop(0,"rgb(100,100,100)");
		gradient.addColorStop(1,"rgb(40,40,40)");

		context.lineWidth = 2;
		context.fillStyle = gradient;
		context.fillRect(0,0,520,20);

		var size = 14;
		do {
			context.font = "bold "+size+"px sans-serif";
			context.fillStyle = "#ffcc00";
			var info = document.getElementById("outcome_content").textContent;
			var length = context.measureText(info.toString());
			size--;
		}
		while (length.width > 520);
		context.fillText(info.toString(), 260-length.width/2,14);
		imageData["playResults"] = canvas;
	}
	var canvas = document.getElementById("playResults");
	var context = canvas.getContext("2d");
	context.drawImage(imageData["playResults"],0,0);
}

function renderOffenseBar(frame, pct, loc) {
	if (imageData["offenseBar"] == null) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("width","20px");
		canvas.setAttribute("height","480px");
		var context = canvas.getContext("2d");
	
		var p = play_data[0][1];
		var id = p.id;
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.lineWidth = 3;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;
		context.fillRect(0,0, 20,460);
		context.strokeRect(0,0, 20,460);
	
		var teamName = document.getElementsByClassName("secondary_container")[0].textContent;
		context.fillStyle = fcolor;
		context.lineWidth=1;
		context.font="bold 14px sans-serif";
		context.save();
	
		context.rotate(Math.PI/2);
		context.fillText(teamName, 50,-6);
		context.restore();
	
		imageData["offenseBar"] = canvas;
	}

	var canvas = document.getElementById("offense");
	var context = canvas.getContext("2d");
	context.drawImage(imageData["offenseBar"],0,0);

}

var offenseLineupVisible = false;
function renderOffenseLineup(frame, pct, loc) {
	offenseLineupVisible = !offenseLineupVisible;
	
	if (offenseLineupVisible == true) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("id","offenseLineup");
		canvas.setAttribute("width","200px");
		canvas.setAttribute("height","480px");
		canvas.style.position = "absolute";
		canvas.style.left = "20px";
		var context = canvas.getContext("2d");

		var id = unsafeWindow.play_data[0][1].id;
		var team = unsafeWindow.ptid[id];
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.font="14px sans-serif";
		context.lineWidth = 2;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;
		context.fillRect(0,130, 200,500);
		context.strokeRect(0,130, 200,500);

		for (var i=1; i<12; i++) {
			var id = unsafeWindow.play_data[0][i].id;
			var position = unsafeWindow.players[id].position;
			var name = unsafeWindow.players[id].name;

			var x = i;
			var y = 216;
			context.fillStyle = bcolor
			context.fillRect(0,(x-1)*24+y, 200,x*24+y);
			context.strokeRect(0,(x-1)*24+y, 200,x*24+y);
			context.fillStyle = fcolor;
			context.fillText(name, 25, x*24-10+y+3);
			context.drawImage(imageData[id], 5, (x-1)*24+y+4);
		}

		var image = new Image();
		image.src = "http://goallineblitz.com/game/team_pic.pl?team_id="+team;
		var imgcanvas = document.createElement("canvas");
		var imgcontext = imgcanvas.getContext("2d");
		imgcontext.scale(75/image.width, 75/image.height);
		imgcontext.drawImage(image, 0, 0);

		context.drawImage(imgcanvas, 5,135);

		context.font = "64px sans-serif";
		context.fillColor = fcolor;
		var score = document.getElementById("off_score").textContent;
		var length = context.measureText(score.toString());
		context.fillText(score.toString(), 138-length.width/2,200);

		var container = document.getElementById("replay_container");
		container.appendChild(canvas);		
	}
	else {
		var lineup = document.getElementById("offenseLineup");
		lineup.parentNode.removeChild(lineup);
	}
}

function renderDefenseBar(frame, pct, loc) {
	if (imageData["defenseBar"] == null) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("width","20px");
		canvas.setAttribute("height","460px");
		var context = canvas.getContext("2d");
		
		var p = play_data[0][12];
		var id = p.id;
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.lineWidth = 3;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;
		context.fillRect(0,0, 20,460);
		context.strokeRect(0,0, 20,460);
	
		var teamName = document.getElementsByClassName("secondary_container")[1].textContent;
		context.fillStyle = fcolor;
		context.lineWidth=1;
		context.font="bold 14px sans-serif";
		context.save();
	
		context.rotate(Math.PI/2);
		context.fillText(teamName, 50,-6);
		context.restore();
	
		imageData["defenseBar"] = canvas;
	}

	var canvas = document.getElementById("defense");
	var context = canvas.getContext("2d");
	context.drawImage(imageData["defenseBar"],0,0);
}

var defenseLineupVisible = false;
function renderDefenseLineup(frame, pct, loc) {
	defenseLineupVisible = !defenseLineupVisible;
	
	if (defenseLineupVisible == true) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute("id","defenseLineup");
		canvas.setAttribute("width","200px");
		canvas.setAttribute("height","480px");
		canvas.style.position = "absolute";
		canvas.style.left = "300px";
		var context = canvas.getContext("2d");

		var id = unsafeWindow.play_data[0][13].id;
		var team = unsafeWindow.ptid[id];
		var bcolor = getTeamBColor(id);
		var fcolor = getTeamFColor(bcolor);

		context.font="14px sans-serif";
		context.lineWidth = 2;
		context.fillStyle = bcolor;
		context.strokeStyle = fcolor;
		context.fillRect(0,130, 200,460);
		context.strokeRect(0,130, 200,460);

		for (var i=12; i<23; i++) {
			var id = unsafeWindow.play_data[0][i].id;
			var position = unsafeWindow.players[id].position;
			var name = unsafeWindow.players[id].name;

			var x = i-11;
			var y = 216;
			context.fillStyle = bcolor;
			context.fillRect(0,(x-1)*24+y, 200,x*24+y);
			context.strokeRect(0,(x-1)*24+y, 200,x*24+y);
			context.fillStyle = fcolor;
			context.fillText(name, 25, x*24-10+y+3);
			context.drawImage(imageData[id], 5, (x-1)*24+y+4);
		}

		var image = new Image();
		image.src = "http://goallineblitz.com/game/team_pic.pl?team_id="+team;
		var imgcanvas = document.createElement("canvas");
		var imgcontext = imgcanvas.getContext("2d");
		imgcontext.scale(75/image.width, 75/image.height);
		imgcontext.drawImage(image, 0, 0);

		context.drawImage(imgcanvas, 5,135);

		context.font = "64px sans-serif";
		context.fillColor = fcolor;
		var score = document.getElementById("def_score").textContent;
		var length = context.measureText(score.toString());
		context.fillText(score.toString(), 138-(length.width/2),200);

		var container = document.getElementById("replay_container");
		container.appendChild(canvas);		
	}
	else {
		var lineup = document.getElementById("defenseLineup");
		lineup.parentNode.removeChild(lineup);
	}
}

function drawFrame(frame, pct) {
	var loc = renderField(frame, pct);

	var canvas = document.getElementById("foreground");
	var context = canvas.getContext("2d");
	context.restore();
	context.save();
        context.clearRect(20, 0, 500, 1160);

	renderFirstDown(frame, pct, loc);
	renderVisionCone(frame, pct, loc);
	renderPlayers(frame, pct, loc);
	renderBall(frame, pct, loc);
	renderIcons(frame, pct, loc);

	renderOffenseBar(frame, pct, loc);
	renderDefenseBar(frame, pct, loc);
	renderReplayInfo();
}

var initialTime = null;
var currentTime = null;
var isPlaying = false;

var frameMultiplier = 1;

function render() {
	if (isPlaying == false) return;

 	currentTime = new Date();
	if (initialTime == null) {
		initialTime = currentTime;
	}

	var diff = currentTime - initialTime;
	var frame = diff/100 * frameMultiplier;
	pct = frame - Math.floor(frame);
	frame = Math.floor(frame) % play_data.length;

        try {
		drawFrame(frame, pct);
		lastTime = currentTime;
		var scrubber = 480/play_data.length*(frame+pct);
		document.getElementById("scrubber_handle").style.left = scrubber+"px";
        }
	catch (e) {
                window.console.log(e);
        }

	measureFps();

	if (frame >= play_data.length-1) {
		initialTime = null;
		setTimeout(function() { 
			drawFrame(0,0); 
			setTimeout(function() { render(); }, 2500);			
		}, 2500);
	}
	else {
	        requestAnimFrame(render);
	}
}

function renderIcons(frame, pct, loc) {
	var canvas = document.getElementById("foreground");
	var context = canvas.getContext("2d");

	for (var p=1; p<play_data[frame].length; p++) {
		var left = play_data[frame];
		if (left[p].icon != null) {
			var right = play_data[Math.min(frame+1, play_data.length-1)];
	
			var xdiff = right[p].x - left[p].x;
			var ydiff = right[p].y - left[p].y;
			var x = left[p].x + xdiff * pct;
			var y = left[p].y + ydiff * pct + loc - 20;
	
			var image = new Image();
			image.src = "/images/replay_icons/"+left[p].icon+".gif"; 
			context.drawImage(image, x-14, y-16);
		}
	}
}

function renderVisionCone(frame, pct, loc) {
	var p = play_data[frame][0];
	if ((p.tx != null) && (p.ty != null)) {
		var left = play_data[frame][0];
		var right = play_data[Math.min(frame+1, play_data.length-1)][0];

		var xdiff = right.x - left.x;
		var ydiff = right.y - left.y;
		var ballx = left.x + xdiff * pct - 16;
		var bally = left.y + ydiff * pct + loc;

		var xdiff = right.tx - left.tx;
		var ydiff = right.ty - left.ty;
		var targetx = left.tx + xdiff * pct - 16;
		var targety = left.ty + ydiff * pct + loc - 20;

		var canvas = document.getElementById("foreground");
		var context = canvas.getContext("2d");
		context.drawImage(imageData["target"], targetx+11, targety-5);

/*
		var gradient = context.createRadialGradient(250,900,0,300,950,1);
		gradient.addColorStop(0,"rgba(200,200,200,1)");
		gradient.addColorStop(1,"rgba(200,200,200,0.0)");
		context.beginPath();
		context.moveTo(250,900);
		context.lineTo(250,950);
		context.lineTo(300,900);
		context.lineTo(250,900);
		context.closePath();
		context.fillStyle = gradient;
		context.strokeStyle = gradient;
		context.fill();
		context.stroke();
*/
	}
}

function renderFirstDown(frame, pct, loc) {
	for (var i=1; i<play_data[0].length; i++) {
		var p = play_data[0][i];
		if ((unsafeWindow.players[p.id].position == "C") || (unsafeWindow.players[p.id].position == "LS")) {
			var y = p.y+loc;

			var canvas = document.getElementById("foreground");
			var context = canvas.getContext("2d");

			var dir = document.getElementById("time_ytg");
			var dirText = dir.innerHTML;
			var togo = "";
			if (dirText.indexOf(" inches ") != -1) {
				togo = 0.3;
			}
			else {
				if (dirText.indexOf(" G on ") == -1) {
					var p2 = dirText.indexOf(" &amp; ")+7;
					var p1 = dirText.indexOf(" on ");
					togo = parseFloat(dirText.substring(p2,p1));
					if (dirText.substring(p2-10,p2-9) == "4") {
						context.strokeStyle = "rgb(255,0,0)";
					}
					else {
						context.strokeStyle = "rgb(255,255,0)";
					}
				}
			}
	
			var dy = togo * 9;
			if (parseFloat(play_data[0][1].y) > parseFloat(play_data[0][0].y)) {
				dy = dy * -1;
			}

			context.beginPath();
			context.moveTo(20,y-dy);
			context.lineTo(500,y-dy);
			context.stroke();

			context.lineWidth = 2;
			context.beginPath();
			context.strokeStyle = "rgb(0,0,255)";
			context.moveTo(20,y);
			context.lineTo(500,y);
			context.stroke();
			break;
		}
	}
}

function renderField(frame, pct) {
	var left = play_data[frame];
	var right = play_data[Math.min(frame+1, play_data.length-1)];

	var ydiff = right[0].y - left[0].y;
	var y = left[0].y + ydiff * pct;

	var location = -1 * y + 250;
	location = Math.max(location, -660);
	location = Math.min(location, 0);

	var canvasbg = document.getElementById("background");
	var contextbg = canvasbg.getContext("2d");

	contextbg.drawImage(imageData["field"], 20, 0-location, 480, 500, 20, 0, 480, 500);
	return location;
}

function renderPlayers(frame, pct, loc) {
/*
	for (var f=0; f<play_data.length; f++) {
		for (var p=0; p<play_data[f].length; p++) {
if (play_data[f][p].icon != null) {
			console.log(f+") "+p+" -- "+play_data[f][p].icon);
}			
		}
	}
*/
	
	var canvas = document.getElementById("foreground");
	var context = canvas.getContext("2d");

	for (var p=1; p<play_data[frame].length; p++) {
		var left = play_data[frame];
		var right = play_data[Math.min(frame+1, play_data.length-1)];

		var xdiff = right[p].x - left[p].x;
		var ydiff = right[p].y - left[p].y;
		var x = left[p].x + xdiff * pct;
		var y = left[p].y + ydiff * pct + loc - 20;

		if (imageData[left[p].id] != null) {
			context.drawImage(imageData[left[p].id], x, y);
		}
	}

 }

function renderBall(frame, pct, loc) {
	var left = play_data[frame];
	var right = play_data[Math.min(frame+1, play_data.length-1)];

	var xdiff = right[0].x - left[0].x;
	var ydiff = right[0].y - left[0].y;
	var x = left[0].x + xdiff * pct + 3;
	var y = left[0].y + ydiff * pct + loc - 20;

	var canvasfg = document.getElementById("foreground");
	var contextfg = canvasfg.getContext("2d");

	if ((left[0].z < 5) || (right[0].z < 5)) {
		contextfg.drawImage(imageData["ball"], x, y);
	}
	else {
		if (imageData["rotated-ball"] == null) {
			var mul = 1;
			if (left[0].x < right[0].x) {
				mul = 1;
			}
			else {
				mul = -1;
			}
			if (left[0].y < right[0].y) {
				mul = mul * -1;
			}
			else {
				mul = mul * 1;
			}
			var rotation = mul * Math.atan(Math.abs(left[0].x-right[0].x)/Math.abs(left[0].y-right[0].y));
			rotation += 2*Math.PI;
		
			var canvas = document.createElement("canvas");
			canvas.setAttribute("width",16);
			canvas.setAttribute("height",16);
			var context = canvas.getContext("2d");
			context.save();
			context.translate(8, 8);
			context.rotate(rotation);
			context.drawImage(imageData["passing-ball"], -8, -8);
			context.restore();

			imageData["rotated-ball"] = canvas;
		}
		contextfg.drawImage(imageData["rotated-ball"], x, y); //fix me!!
	}
}

function getFromCanvas(src, w, h) {
	var image = new Image();
	image.src = src;

	var canvas = document.createElement("canvas");
	canvas.setAttribute("width",w);
	canvas.setAttribute("height",h);

	var context = canvas.getContext("2d");
	context.drawImage(image,0,0);

	return canvas;
}

function prepareImages() {
	imageData["ball"] = getFromCanvas("http://goallineblitz.com/images/ball.gif", 16, 16);
	imageData["passing-ball"] = getFromCanvas("http://goallineblitz.com/images/passing-ball.gif", 16, 16); //fix me!!
	imageData["kicking-ball"] = getFromCanvas("http://goallineblitz.com/images/kicking-ball.gif", 16, 16); //fix me!!
	imageData["field"] = getFromCanvas("http://goallineblitz.com/images/game/fields/"+unsafeWindow.field+".jpg", 520, 1160);

	var canvas = document.createElement("canvas");
	canvas.setAttribute("width","26");
	canvas.setAttribute("height","26");
	var context = canvas.getContext("2d");
	context.beginPath();
	context.strokeStyle = "rgb(255,255,255)";
	context.lineWidth = 3;
	context.moveTo(13,0);
	context.lineTo(13,26);
	context.moveTo(0,13);
	context.lineTo(26,13);
	context.stroke();
	context.beginPath();
	context.strokeStyle = "rgb(255,0,0)";
	context.lineWidth = 2;
	context.arc(13, 13, 10, 0, 2*Math.PI, false); 
	context.closePath();
	context.stroke();
	imageData["target"] = canvas;
	canvas = null;

	var done = [];
	for (var i=1; i<unsafeWindow.play_data[0].length; i++) {
		var p = unsafeWindow.play_data[0][i];
		var id = p.id;
		if (imageData[id] != null) continue;

		var team = unsafeWindow.ptid[id];
		var position = unsafeWindow.players[id].position;
		var fcolor = unsafeWindow.home_color2+"_border_home";
		var bcolor = unsafeWindow.home_color1;
		if (unsafeWindow.home != team) {
			fcolor = unsafeWindow.away_color2+"_border";
			bcolor = unsafeWindow.away_color1;
		}

		var fimage = new Image();
		fimage.src = "http://goallineblitz.com/images/dots/"+fcolor+"/"+position+".gif";

		var bimage = new Image();
		bimage.src = "http://goallineblitz.com/images/dots/"+bcolor+".gif";

		var canvas = document.createElement("canvas");
		canvas.setAttribute("width","16");
		canvas.setAttribute("height","16");
		var context = canvas.getContext("2d");

		if ((bimage.complete == false) || (fimage.complete == false)) {
			if (bimage.complete == false) {
				done.push(fimage.src);
			}
			if (fimage.complete == false) {
				done.push(fimage.src);
			}
		}
		else {
			context.drawImage(bimage,0,0);
			context.drawImage(fimage,0,0);
			imageData[id] = canvas;
		}
	}
	if (done.length > 0) {
		console.log("noooooo greasemonkey, no one would ever want to use worker threads...");
		console.log(done);
		setTimeout(prepareImages, 250);
	}
}

function beginPressed() {
	pausePressed();
	initialTime = null;
	currentTime = null;
	drawFrame(0,0);	
}

function rwPressed() {
	if (isPlaying == true) {
		frameMultiplier = Math.max(frameMultiplier - 0.25, 0);
		console.log(frameMultiplier);
	}
	else {
		currentTime = currentTime.setMilliseconds(currentTime.getMilliseconds() - 100);
		currentTime = new Date(currentTime);
		var diff = currentTime - initialTime;
		var frame = diff/100 * frameMultiplier;
		pct = frame - Math.floor(frame);
		frame = Math.floor(frame) % play_data.length;
		if (frame < 0) frame += play_data.length;
		drawFrame(frame, pct);
	}
}

function pausePressed() {
	console.log("pause");

	document.getElementById("pause_button").visibility = "hidden";
	document.getElementById("play_button").visibility = "visible";

	isPlaying = false;
}

function playPressed() {
	console.log("play");
	
	document.getElementById("pause_button").visibility = "visible";
	document.getElementById("play_button").visibility = "hidden";
 
	isPlaying = true;
	var t = currentTime;
	currentTime = new Date();
	initialTime = currentTime - (t-initialTime);

	render();
}

function ffPressed() {
	if (isPlaying == true) {
		frameMultiplier = frameMultiplier + 0.25;
		console.log(frameMultiplier);
	}
	else {
		currentTime = currentTime.setMilliseconds(currentTime.getMilliseconds() + 100);
		currentTime = new Date(currentTime);
		var diff = currentTime - initialTime;
		var frame = diff/100 * frameMultiplier;
		pct = frame - Math.floor(frame);
		frame = Math.floor(frame) % play_data.length;
		drawFrame(frame, pct);
	}
}

function endPressed() {
	pausePressed();
	initialTime = null;
	currentTime = null;
	drawFrame(play_data.length-1,0);	
}

function fixButtons() {
	var buttons = document.getElementsByClassName("button left");
	
	var begin = buttons[2];
	begin.addEventListener("click",beginPressed);

	var rewind = buttons[3];
	rewind.addEventListener("click",rwPressed);

	var pause = buttons[4];
	pause.addEventListener("click",playPressed);

	var play = buttons[5];
	play.addEventListener("click",pausePressed);

	var ff = buttons[6];
	ff.addEventListener("click",ffPressed);

	var end = buttons[7];
	end.addEventListener("click",endPressed);
}

function fixFrames() {
	var stime = new Date();
	var uwpd = new Array();
	for (var i=0; i<unsafeWindow.play_data.length; i++) {
		uwpd.push(new Array());
	}

	var missing = 0;
	for (var p=0; p<unsafeWindow.play_data[0].length; p++) {
		var id = unsafeWindow.play_data[0][p].id;

		for (var cf=0; cf<unsafeWindow.play_data.length; cf++) {
			var found = false;
			for (var i=0; i<unsafeWindow.play_data[cf].length; i++) {
				if (id == unsafeWindow.play_data[cf][i].id) {
					found = true;
					uwpd[cf].push(eval(uneval(unsafeWindow.play_data[cf][i])));
					break;
				}
			}
			if (!found) {
				uwpd[cf].push(eval(uneval(uwpd[cf-1][p])));
				missing++;
			}
		}
	}
	var time = new Date() - stime;
    	console.log("uwpd copy ("+missing+" missing): "+time.toFixed(0)+"ms");

	for (var p=1; p<uwpd[0].length; p++) {
		for (var f=uwpd.length-1; f>0; f--) {
			if (uwpd[f][p].icon != null) {
				for (var z=f+1; z<Math.min(uwpd.length, f+8); z++) {
					uwpd[z][p].icon = uwpd[f][p].icon;
				}
			}
		}
	}
	var time = new Date() - stime;
    	console.log("uwpd icons: "+time.toFixed(0)+"ms");

	prepareImages();

	return uwpd;
}

var frameCounter = 0;
var lastTime = 0;
var fps = [];
function measureFps() {
	frameCounter++;
        if (frameCounter > 300) {
	    var now = new Date();
	    var delta = now - lastTime;
            fps.push(frameCounter / delta);

            frameCounter = 0;
	    lastTime = now;
        }

	if (fps.length == 10) {
		console.log(fps);
		fps = [];
	}

}