var crateCount = 0;
var brickCount = 0;
var buttonCount = 0;
var pitCount = 0;
var b1w = 5;
var b1h = 5;
var isCake = false;

var roboGuy = new playerChar();
var stageCrates = new Array(stageCC);
for (i = 0; i < stageCrates.length; ++i) {
	stageCrates[i] = new crateObj();
}
var stageButtons = new Array(stageBC);
for (i = 0; i < stageButtons.length; ++i) {
	stageButtons[i] = new buttonObj();
}

function keyHandler(e) {
	var eventObj = window.event? event : e;
	var keyCode = eventObj.charCode? eventObj.charCode : eventObj.keyCode;
	var mChar = String.fromCharCode(keyCode);
	var matchedkey = false;
	switch (keyCode) {
		case 37:
			mChar = 'LEFT';
			break;
		case 38:
			mChar = 'UP';
			break;
		case 39:
			mChar = 'RIGHT';
			break;
		case 40:
			mChar = 'DOWN';
			break;
	}
	switch (mChar) {
		case 'i':
		case 'e':
		case 'UP':
			matchedkey = true;
			moveRobo('up');
			break;
		case 'j':
		case 's':
		case 'LEFT':
			matchedkey = true;
			moveRobo('left');
			break;
		case 'k':
		case 'd':
		case 'DOWN':
			matchedkey = true;
			moveRobo('down');
			break;
		case 'l':
		case 'f':
		case 'RIGHT':
			matchedkey = true;
			moveRobo('right');
			break;
		default:
			break;
	}
	if (matchedkey) {
		return false;
	} else {
		return true;
	}
}

function playerChar() {
	this.X = 0;
	this.Y = 0;
	this.oldX = 0;
	this.oldY = 0;
	this.dir = 'down';
	this.onButton = false;
}

function crateObj() {
	this.ID = '';
	this.X = 0;
	this.Y = 0;
	this.oldX = 0;
	this.oldY = 0;
	this.sunk = false;
	this.onButton = false;
	this.size = 1;
}

function buttonObj() {
	this.ID = '';
	this.X = 0;
	this.Y = 0;
	this.pushed = false;
}

function init() {
	if (document.images) {
		preloadImages();
	}
	document.onkeypress = keyHandler;
	generateStage();
	initController();
	writeStatus('Let\'s Play!');
}

function generateStage() {
	var substagemsg = '';
	if (stageBC > 0) {
		substagemsg = 'Put crates on all of the buttons!';
	} else if (stageCC > 0) {
		substagemsg = 'Get the cake!';
	} else {
		substagemsg = 'Good luck!';
	}
	var ssma = document.getElementById('substage');
	ssma.innerHTML += substagemsg;
	makePlayArea(stageWidth, stageHeight);
	for (sy = 0; sy < stage.length; sy++) {
		for (sx = 0; sx < stage[sy].length; sx++) {
			switch (stage[sy][sx]) {
				case 0: //Do Nothing
					break;
				case 1: // Brick
					createBrick(sx, sy);
					break;
				case 2: // Pit
					createPit(sx, sy);
					break;
				case 3: // Button
					createButton(sx, sy);
					break;
				case 6: // Crate on Button
					createCrateOnButton(sx, sy);
					break;
				case 7: // Sunken Crate
					break;
				case 8: // Crate
					createCrate(sx, sy);
					break;
				case 9: // Delicious Cake
					createCake(sx, sy);
					isCake = true;
					break;
				case 10: // Player
					createRobo(sx, sy);
					break;
				case 11: // Player on button
					createButton(sx, sy);
					createRobo(sx, sy);
					stage[sy][sx] = 3;
					break;
				default: // No Idea
					writeStatus("At "+sx+", "+sy+" I found a "+stage[sx][sy]);
					break;
			}
		}
	}
}

function preloadImages() {
	var robod = newImage('robo-down.gif');
	var robou = newImage('robo-up.gif');
	var robol = newImage('robo-left.gif');
	var robor = newImage('robo-right.gif');
	var crate = newImage('crate.gif');
	var brick = newImage('brick.gif');
	var sunkcrate = newImage('sunken-crate.gif');
	var tile = newImage('tile.gif');
	var pit = newImage('pit.gif');
	var button = newImage('button.gif');
	var cratelight = newImage('crate-light.gif');
	var gtns = newImage('nextstage.png');
	var dcp = newImage('deliciouscake.png');
	return true;
}

function newImage(imgSrc) {
	var imgName = new Image();
	imgName.src = imgSrc;
	return imgName;
}

function hideController($isHidden) {
	var nc = document.getElementById('controller');
	if ($isHidden) {
		nc.display = 'none';
	} else {
		nc.display = 'block';
	}
}

function initController() {
	var nc = document.getElementById('controller');
	var dirUp = document.createElement('div');
	var dirLeft = document.createElement('div');
	var dirDown = document.createElement('div');
	var dirRight = document.createElement('div');
	var buttonReset = document.createElement('div');
/*
	var buttonA = document.createElement('div');
	var buttonB = document.createElement('div');
	var buttonStart = document.createElement('div');
	var buttonSelect = document.createElement('div');
*/
	dirUp.setAttribute('id', 'dirUp');
	dirUp.style.left = '77px';
	dirUp.style.top = '36px';
	dirUp.onmousedown = function () { moveRobo('up'); }
	dirUp.onmouseover = function () { document.getElementById('dirUp').className = 'dirHover'; return true; }
	dirUp.onmouseout = function () { document.getElementById('dirUp').className = ''; return true; }
	dirLeft.setAttribute('id', 'dirLeft');
	dirLeft.style.left = '35px';
	dirLeft.style.top = '78px';
	dirLeft.onmousedown = function () { moveRobo('left'); }
	dirLeft.onmouseover = function () { document.getElementById('dirLeft').className = 'dirHover'; return true; }
	dirLeft.onmouseout = function () { document.getElementById('dirLeft').className = ''; return true; }
	dirDown.setAttribute('id', 'dirDown');
	dirDown.style.left = '77px';
	dirDown.style.top = '116px';
	dirDown.onmousedown = function () { moveRobo('down'); }
	dirDown.onmouseover = function () { document.getElementById('dirDown').className = 'dirHover'; return true; }
	dirDown.onmouseout = function () { document.getElementById('dirDown').className = ''; return true; }
	dirRight.setAttribute('id', 'dirRight');
	dirRight.style.left = '115px';
	dirRight.style.top = '78px';
	dirRight.onmousedown = function () { moveRobo('right'); }
	dirRight.onmouseover = function () { document.getElementById('dirRight').className = 'dirHover'; return true; }
	dirRight.onmouseout = function () { document.getElementById('dirRight').className = ''; return true; }
	buttonReset.setAttribute('id', 'buttonReset');
	buttonReset.style.left = '173px';
	buttonReset.style.top = '47px';
	buttonReset.onmousedown = function() { if (confirm("Are you sure you want to reset?")) { location.reload(true); } }
	buttonReset.onmouseover = function () { document.getElementById('buttonReset').className = 'dirHover'; return true; }
	buttonReset.onmouseout = function () { document.getElementById('buttonReset').className = ''; return true; }

/*
	buttonA.setAttribute('id', 'buttonA');
	buttonA.style.left = '100px';
	buttonA.style.top = '31px';
	buttonA.onmousedown = function() { displayMap(); }
	buttonA.onmouseover = function () { document.getElementById('buttonA').className = 'dirHover'; return true; }
	buttonA.onmouseout = function () { document.getElementById('buttonA').className = ''; return true; }
	buttonB.setAttribute('id', 'buttonB');
	buttonB.style.left = '83px';
	buttonB.style.top = '31px';
	buttonB.onmousedown = function() { displayDebug(); }
	buttonB.onmouseover = function () { document.getElementById('buttonB').className = 'dirHover'; return true; }
	buttonB.onmouseout = function () { document.getElementById('buttonB').className = ''; return true; }
	buttonStart.setAttribute('id', 'buttonStart');
	buttonStart.style.left = '61px';
	buttonStart.style.top = '35px';
	buttonStart.onmousedown = function() { skipStage(); }
	buttonStart.onmouseover = function () { document.getElementById('buttonStart').className = 'dirHover'; return true; }
	buttonStart.onmouseout = function () { document.getElementById('buttonStart').className = ''; return true; }
	buttonSelect.setAttribute('id', 'buttonSelect');
	buttonSelect.style.left = '45px';
	buttonSelect.style.top = '35px';
	buttonSelect.onmousedown = function() { if (confirm("Are you sure you want to reset?")) { location.reload(true); } }
	buttonSelect.onmouseover = function () { document.getElementById('buttonSelect').className = 'dirHover'; return true; }
	buttonSelect.onmouseout = function () { document.getElementById('buttonSelect').className = ''; return true; }
*/
	nc.appendChild(dirUp);
	nc.appendChild(dirLeft);
	nc.appendChild(dirDown);
	nc.appendChild(dirRight);
	nc.appendChild(buttonReset);
/*
	nc.appendChild(buttonA);
	nc.appendChild(buttonB);
	nc.appendChild(buttonStart);
	nc.appendChild(buttonSelect);
*/
	return true;
}

function makePlayArea(paWidth, paHeight) {
	var pa = document.getElementById('playarea');
	pa.style.width = (paWidth * 29) + 'px';
	pa.style.height = (paHeight * 29) + 'px';
	pa.style.left = '50%';
	pa.style.marginLeft = '-' + ((paWidth * 29) / 2) + 'px';
	var np = document.getElementById('controller');
	np.style.top = (pa.offsetTop + pa.offsetHeight + 8) + 'px';
	var sl = document.getElementById('sets');
	sl.style.top = (np.offsetTop + np.offsetHeight + 8) + 'px';
	/*
	var sb = document.getElementById('status');
	sb.style.top = (sl.offsetTop + sl.offsetHeight + 8) + 'px';
	*/
	return true;
}

function createBrick(x, y) {
	brickCount++;
	var pa = document.getElementById('playarea');
	var brickDiv = document.createElement('div');
	brickDiv.setAttribute('id', 'brick'+brickCount);
	brickDiv.style.left = (x * 29) + 'px';
	brickDiv.style.top = (y * 29) + 'px';
	brickDiv.className = 'brick';
	pa.appendChild(brickDiv);
	return true;
}

function createRobo(x, y) {
	var pa = document.getElementById('playarea');
	var roboDiv = document.createElement('div');
	roboDiv.setAttribute('id', 'robo');
	roboDiv.style.left = (x * 29) + 'px';
	roboDiv.style.top = (y * 29) + 'px';
	roboGuy.X = x;
	roboGuy.Y = y;
	roboGuy.oldX = x;
	roboGuy.oldY = y;
	pa.appendChild(roboDiv);
	return true;
}

function skipStage() {
	stageWon();
}

function moveRobo(dir) {
	switch (dir) {
		case 'up':
			if (roboGuy.Y > 0) {
				roboGuy.Y--;
			}
			break;
		case 'down':
			if (roboGuy.Y + 1 < stageHeight) {
				roboGuy.Y++;
			}
			break;
		case 'left':
			if (roboGuy.X > 0) {
				roboGuy.X--;
			}
			break;
		case 'right':
			if (roboGuy.X + 1 < stageWidth) {
				roboGuy.X++;
			}
			break;
		default:
			break;
	}
	var wasOnButton = false;
	if (roboGuy.onButton == true) {
		wasOnButton = true;
	}
	roboGuy.onButton = false;
	switch (stage[roboGuy.Y][roboGuy.X]) {
		case 0: // Nothing here
			break;
		case 3: // Button
			roboGuy.onButton = true;
			break;
		case 6: // Crate On Button
			if (!moveCrate(roboGuy.X, roboGuy.Y, dir)) {
				roboGuy.Y = roboGuy.oldY;
				roboGuy.X = roboGuy.oldX;
			} else {
				roboGuy.onButton = true;
			}
			break;
		case 7: // Sunken Crate
			break;
		case 8: // Crate
			if (!moveCrate(roboGuy.X, roboGuy.Y, dir)) {
				roboGuy.Y = roboGuy.oldY;
				roboGuy.X = roboGuy.oldX;
			}
			break;
		case 9: // DELICIOUS CAKE!
			stageWon();
			break;
		default: // Anything else
			roboGuy.Y = roboGuy.oldY;
			roboGuy.X = roboGuy.oldX;
			break;
	}
	if (roboGuy.X != roboGuy.oldX || roboGuy.Y != roboGuy.oldY) {
		if (stage[roboGuy.oldY][roboGuy.oldX] == 10) {
			if (wasOnButton) {
				stage[roboGuy.oldY][roboGuy.oldX] = 3;
			} else {
				stage[roboGuy.oldY][roboGuy.oldX] = 0;
			}
			stage[roboGuy.Y][roboGuy.X] = 10;
		}
		roboGuy.oldX = roboGuy.X;
		roboGuy.oldY = roboGuy.Y;
	}
	var pa = document.getElementById('playarea');
	var roboDiv = document.getElementById('robo');
	roboDiv.style.backgroundImage = "url('robo-"+dir+".gif')";
	roboDiv.style.left = (roboGuy.X * 29) + 'px';
	roboDiv.style.top = (roboGuy.Y * 29) + 'px';
	return true;
}

function stageWon() {
	dc = document.getElementById('dcake');
	pa = document.getElementById('playarea');
	cp = document.getElementById('controller');
	ns = document.getElementById('nstage');
	dc.style.top = '40px';
	dc.style.display = 'block';
	cp.style.display = 'none';
	var nsAnchor = document.createElement('a');
	nsAnchor.setAttribute('id', 'nstagea');
	nsAnchor.setAttribute('href', '/');
	ns.style.top = dc.offsetTop + dc.offsetHeight;
	ns.appendChild(nsAnchor);
	ns.style.display = 'block';

	writeStatus("Yummy! &lt;3");
	document.cookie="nextstage=yes; path=/; domain=.robosokoban.com";
	writeStatus("<a href=\".\">Next Stage</a>");
}

function createCrate(x, y) {
	crateCount++;
	var pa = document.getElementById('playarea');
	var crateDiv = document.createElement('div');
	var crateID = 'crate'+crateCount;
	crateDiv.setAttribute('id', crateID);
	crateDiv.style.left = (x * 29) + 'px';
	crateDiv.style.top = (y * 29) + 'px';
	crateDiv.className = 'crate';
	pa.appendChild(crateDiv);
	stageCrates[crateCount-1].X = x;
	stageCrates[crateCount-1].Y = y;
	stageCrates[crateCount-1].oldX = x;
	stageCrates[crateCount-1].oldY = y;
	stageCrates[crateCount-1].ID = crateID;
	return true;
}

function createCrateOnButton(x, y) {
	crateCount++;
	buttonCount++;
	var pa = document.getElementById('playarea');
	var crateDiv = document.createElement('div');
	var crateID = 'crate'+crateCount;
	crateDiv.setAttribute('id', crateID);
	crateDiv.style.left = (x * 29) + 'px';
	crateDiv.style.top = (y * 29) + 'px';
	crateDiv.className = 'litcrate';
	var buttonDiv = document.createElement('div');
	var buttonID = 'button'+buttonCount;
	buttonDiv.setAttribute('id', buttonID);
	buttonDiv.style.left = (x * 29) + 'px';
	buttonDiv.style.top = (y * 29) + 'px';
	buttonDiv.className = 'button';
	pa.appendChild(crateDiv);
	pa.appendChild(buttonDiv);
	stageCrates[crateCount-1].X = x;
	stageCrates[crateCount-1].Y = y;
	stageCrates[crateCount-1].oldX = x;
	stageCrates[crateCount-1].oldY = y;
	stageCrates[crateCount-1].ID = crateID;
	stageCrates[crateCount-1].onButton = true;
	stageButtons[buttonCount-1].X = x;
	stageButtons[buttonCount-1].Y = y;
	stageButtons[buttonCount-1].oldX = x;
	stageButtons[buttonCount-1].oldY = y;
	stageButtons[buttonCount-1].ID = buttonID;
	stageButtons[buttonCount-1].pushed = true;
	return true;
}

function createButton(x, y) {
	buttonCount++;
	var pa = document.getElementById('playarea');
	var buttonDiv = document.createElement('div');
	var buttonID = 'button'+buttonCount;
	buttonDiv.setAttribute('id', buttonID);
	buttonDiv.style.left = (x * 29) + 'px';
	buttonDiv.style.top = (y * 29) + 'px';
	buttonDiv.className = 'button';
	pa.appendChild(buttonDiv);
	stageButtons[buttonCount-1].X = x;
	stageButtons[buttonCount-1].Y = y;
	stageButtons[buttonCount-1].oldX = x;
	stageButtons[buttonCount-1].oldY = y;
	stageButtons[buttonCount-1].ID = buttonID;
	return true;
}

function checkForWin() {
	var haswon = true;
	for (i = 0; i < stageButtons.length; ++i) {
		if (stageButtons[i].pushed == false) {
			haswon = false;
		}
	}
	return haswon;
}

function togButton(x, y, isPushed) {
	for (curButton = 0; curButton < stageButtons.length; ++curButton) {
		if (stageButtons[curButton].X == x && stageButtons[curButton].Y == y) {
			stageButtons[curButton].pushed = isPushed;
		}
	}
}

function findButton(x, y) {
	var bid = false;
	var curButton = 0;
	for (curButton = 0; curButton < stageButtons.length; ++curButton) {
		if (stageButtons[curButton].X == x && stageButtons[curButton].Y == y) {
			bid = stageButtons[curButton].ID;
		}
	}
	return bid;
}

function findCrate(x, y) {
	var cid = false;
	var curCrate = 0;
	for (curCrate = 0; curCrate < stageCrates.length; ++curCrate) {
		if (stageCrates[curCrate].X == x && stageCrates[curCrate].Y == y) {
			cid = stageCrates[curCrate].ID;
		}
	}
	return cid;
}

function setButton(butID, butVal) {
	var cButton = 0;
	for (cButton = 0; cButton < stageButtons.length; ++cButton) {
		if (stageButtons[cButton].ID == butID) {
			stageButtons[cButton].pushed = butVal;
		}
	}
}

function togCrateOnButton(crateID) {
	var cid = false;
	var cCrate = 0;
	for (cCrate = 0; cCrate < stageCrates.length; ++cCrate) {
		if (stageCrates[cCrate].ID == crateID) {
			stageCrates[cCrate].onButton = true;
			var sCrate = document.getElementById(crateID);
			sCrate.className = 'litcrate';
		}
	}
}

function checkCratesAndButtons() {
	var cCrate = 0;
	var cButton = 0;
	for (cCrate = 0; cCrate < stageCrates.length; ++cCrate) {
		var cButtonID = findButton(stageCrates[cCrate].X, stageCrates[cCrate].Y);
		var sCrate = document.getElementById(stageCrates[cCrate].ID);
		if (cButtonID != false) {
			stageCrates[cCrate].onButton = true;
			sCrate.className = 'litcrate';
			setButton(cButtonID, true);
		} else {
			sCrate.className = 'crate';
		}
	}
	for (cButton = 0; cButton < stageButtons.length; ++cButton) {
		if (stageButtons[cButton].pushed == true) {
			var cCrateID = findCrate(stageButtons[cButton].X, stageButtons[cButton].Y);
			if (cCrateID != false) {
				togCrateOnButton(cCrateID);
			} else {
				stageButtons[cButton].pushed = false;
			}
		}
	}
}

function moveCrate(x, y, dir) {
	var canmove = false;
	for (curCrate = 0; curCrate < stageCrates.length; ++curCrate) {
		if (stageCrates[curCrate].X == x && stageCrates[curCrate].Y == y) {
			mcID = stageCrates[curCrate].ID;
			if (stageCrates[curCrate].sunk == false) {
				switch (dir) {
					case 'up':
						if (stageCrates[curCrate].Y > 0) {
							canmove = true;
							stageCrates[curCrate].Y--;
						}
						break;
					case 'down':
						if (stageCrates[curCrate].Y + 1 < stageHeight) {
							canmove = true;
							stageCrates[curCrate].Y++;
						}
						break;
					case 'left':
						if (stageCrates[curCrate].X > 0) {
							canmove = true;
							stageCrates[curCrate].X--;
						}
						break;
					case 'right':
						if (stageCrates[curCrate].X + 1 < stageWidth) {
							canmove = true;
							stageCrates[curCrate].X++;
						}
						break;
				}
				var wasOnButton = false;
				if (stageCrates[curCrate].onButton) {
					wasOnButton = true;
				}
				stageCrates[curCrate].onButton = false;
				switch (stage[stageCrates[curCrate].Y][stageCrates[curCrate].X]) {
					case 0: // Nothing here
						break;
					case 2: // Pit!
						stageCrates[curCrate].sunk = true;
						break;
					case 3: // Button
						stageCrates[curCrate].onButton = true;
						break;
					case 7: // Sunken crate
						break;
					case 8: // Another crate
						stageCrates[curCrate].X = stageCrates[curCrate].oldX;
						stageCrates[curCrate].Y = stageCrates[curCrate].oldY;
						canmove = false;
						break;
					case 9: // Delicious cake
						stageCrates[curCrate].X = stageCrates[curCrate].oldX;
						stageCrates[curCrate].Y = stageCrates[curCrate].oldY;
						canmove = false;
						break;
					default: // Anything else
						stageCrates[curCrate].X = stageCrates[curCrate].oldX;
						stageCrates[curCrate].Y = stageCrates[curCrate].oldY;
						canmove = false;
						break;
				}
				if (canmove) {
					if (!stageCrates[curCrate].onButton) {
						$cfbp = findButton(stageCrates[curCrate].X, stageCrates[curCrate].Y);
						if ($cfbp) {
							stage[stageCrates[curCrate].Y][stageCrates[curCrate].X] = 6;
							stageCrates[curCrate].onButton = true;
						} else {
							stage[stageCrates[curCrate].Y][stageCrates[curCrate].X] = 8;
						}
					} else {
						stage[stageCrates[curCrate].Y][stageCrates[curCrate].X] = 6;
						togButton(stageCrates[curCrate].X, stageCrates[curCrate].Y, true);
					}
					if (!wasOnButton) {
						stage[stageCrates[curCrate].oldY][stageCrates[curCrate].oldX] = 0;
					} else {
						stage[stageCrates[curCrate].oldY][stageCrates[curCrate].oldX] = 3;
						togButton(stageCrates[curCrate].oldX, stageCrates[curCrate].oldY, false);
					}
					var pa = document.getElementById('playarea');
					var mc = document.getElementById(mcID);
					mc.style.left = (stageCrates[curCrate].X * 29) + 'px';
					mc.style.top = (stageCrates[curCrate].Y * 29) + 'px';
					if (stageCrates[curCrate].onButton || stage[stageCrates[curCrate].Y][stageCrates[curCrate].X] == 6) {
						mc.className = 'litcrate';
					} else {
						mc.className = 'crate';
					}
					if (stageCrates[curCrate].sunk) {
						mc.className = 'sunkencrate';
						stage[stageCrates[curCrate].Y][stageCrates[curCrate].X] = 7;
					}
					stageCrates[curCrate].oldX = stageCrates[curCrate].X;
					stageCrates[curCrate].oldY = stageCrates[curCrate].Y;
					checkCratesAndButtons();
					if (checkForWin() && !isCake) {
						stageWon();
					}
				}
			} else {
				canmove = true;
			}
			return canmove;
		}
	}
}

function createPit(x, y) {
	pitCount++;
	var pa = document.getElementById('playarea');
	var pitDiv = document.createElement('div');
	pitDiv.setAttribute('id', 'pit'+pitCount);
	pitDiv.style.left = (x * 29) + 'px';
	pitDiv.style.top = (y * 29) + 'px';
	pitDiv.className = 'pit';
	pa.appendChild(pitDiv);
	return true;
}

function createCake(x, y) {
	var pa = document.getElementById('playarea');
	var cakeDiv = document.createElement('div');
	cakeDiv.setAttribute('id', 'cake');
	cakeDiv.style.left = (x * 29) + 'px';
	cakeDiv.style.top = (y * 29) + 'px';
	pa.appendChild(cakeDiv);
	return true;
}

function writeStatus(sText) {
	/*
	var sb = document.getElementById('statusmessages');
	sb.innerHTML += sText+"<br />\n";
	*/
}

function clearStatus() {
	var sb = document.getElementById('statusmessages');
	sb.innerHTML = "";
}

function displayMap() {
	var output = "<pre style=\"font-size: 8pt;\">Stage Data:\n";
	for (sy = 0; sy < stageHeight; sy++) {
		for (sx = 0; sx < stageWidth; sx++) {
			output += "-----";
		}
		output += "-\n";
		for (sx = 0; sx < stageWidth; sx++) {
			if (stage[sy][sx] < 10) {
				output += "|  "+stage[sy][sx]+ " ";
			} else {
				output += "| "+stage[sy][sx]+" ";
			}
		}
		output += "|\n";
	}
	for (sx = 0; sx < stageWidth; sx++) {
		output += "-----";
	}
	output += "-</pre>";
	writeStatus(output);
}

function displayDebug() {
	clearStatus();
	writeStatus("Debug Info");
	writeStatus("-------------------------");
	if (stageCrates.length < 1) {
		writeStatus("-- NO CRATES");
	} else {
		writeStatus("-= Crates =-");
		for (i = 0; i < stageCrates.length; ++i) {
			writeStatus("Crate ID: " + stageCrates[i].ID);
			writeStatus("Crate X: " + stageCrates[i].X);
			writeStatus("Crate Y: " + stageCrates[i].Y);
			writeStatus("Crate oldX: " + stageCrates[i].oldX);
			writeStatus("Crate oldY: " + stageCrates[i].oldY);
			writeStatus("Crate sunk: " + stageCrates[i].sunk);
			writeStatus("Crate onButton: " + stageCrates[i].onButton);
			writeStatus("Crate size: " + stageCrates[i].size);
			writeStatus("--");
		}
	}
	if (stageButtons.length < 1) {
		writeStatus("-- NO BUTTONS");
	} else {
		writeStatus("-= Buttons =-");
		for (i = 0; i < stageButtons.length; ++i) {
			writeStatus("Button ID: " + stageButtons[i].ID);
			writeStatus("Button X: " + stageButtons[i].X);
			writeStatus("Button Y: " + stageButtons[i].Y);
			writeStatus("Button pushed: " + stageButtons[i].pushed);
			writeStatus("--");
		}
	}
}
