BTGame = function(targetElem) {
	this.targetElem = targetElem;
	this.targetElem.className = 'gameArea';
	this.gameSpeed = 100;
	this.playfield = new Object();
	this.display = new Object();
	this.animCnt = 0;
	this.animY = 5;
	
	this.initPlayfield();
}

BTGame.prototype.initPlayfield = function() {
	this.playfield = document.createElement('div');
	for (var i=0;i<32;i++) {
		this.playfield.appendChild(document.createElement('div'));
		for (j=0;j<60;j++) {
			bTag = document.createElement('b');
			bTag.className = 'e';
			bTag.appendChild(document.createTextNode('.'));
			this.playfield.lastChild.appendChild(bTag);
		}
	}
	this.renderString (this.playfield,7,1,'1 U P     H I - S C O R E','t t t     t t t t t t t t');
	this.renderString (this.playfield,50,1,'PEPPER','rrrrrr');
	for (i=0;i<BTGame.levelData[0].length;i++) {
		lData = BTGame.levelData[0][i];
		for (var j=0;j<lData.length;j++) {
			x=4+(Math.floor(j/2)*12)+((j%2)*4);
			y=4+i*2;

			switch (lData.charAt(j)) {
				case 'n':
					this.renderObject (this.playfield,x,y,BTGame.levelObjects.ladder)
					this.renderObject (this.playfield,x,y+1,BTGame.levelObjects.landingLadder)
					break;
				case 'm':
					this.renderObject (this.playfield,x,y+1,BTGame.levelObjects.landing)
					break;
				case 'q':
					this.renderObject (this.playfield,x+2,y,BTGame.levelObjects.ladder)
					this.renderObject (this.playfield,x,y+1,BTGame.levelObjects.platformLadder)
					break;
				case 'p':
					this.renderObject (this.playfield,x,y+1,BTGame.levelObjects.platform)
					break;
				case 'l':
					this.renderObject (this.playfield,4+(j*6),y,BTGame.levelObjects.ladder)
					this.renderObject (this.playfield,4+(j*6),y+1,BTGame.levelObjects.ladder)
					break;
				case 'g':
					this.renderObject (this.playfield,x,y+1,BTGame.levelObjects.goal)
				default:
					break;
			}
		}
	}
	this.renderObject (this.playfield,32,5,BTGame.levelObjects.burger0);
	this.renderObject (this.playfield,32,9,BTGame.levelObjects.burger1);
	this.renderObject (this.playfield,32,15,BTGame.levelObjects.burger2);
	this.renderObject (this.playfield,32,23,BTGame.levelObjects.burger3);

	this.renderObject (this.playfield,44,25,BTGame.levelObjects.burger0);
	this.renderObject (this.playfield,44,26,BTGame.levelObjects.burger1);
	this.renderObject (this.playfield,44,27,BTGame.levelObjects.burger2);
	this.renderObject (this.playfield,44,28,BTGame.levelObjects.burger3);
	
	this.display = this.playfield.cloneNode(true);
	this.targetElem.appendChild(this.display);
}

BTGame.prototype.renderString = function(target,x,y,output,style) {
	for (var i=0;i<output.length;i++) {
		if (output.charAt(i)!=' ') {
			bTag = target.childNodes[y].childNodes[x+i];
			bTag.className = style.charAt(i);
			bTag.firstChild.nodeValue = output.charAt(i);
		}
	}
}

BTGame.prototype.renderObject = function(target,x,y,obj) {
	if (isArray(obj.chars)) {
		for (w=0;w<obj.chars.length;w++) {
			this.renderString (target,x,y-obj.chars.length+w+1,obj.chars[w],obj.cssClass[w]);
		}
	} else {
		this.renderString (target,x,y,obj.chars,obj.cssClass);
	}
}

BTGame.prototype.clearObject = function(x,y,obj) {
	if (isArray(obj.chars)) {
		for (w=0;w<obj.chars.length;w++) {
			for (v=0;v<obj.chars[w].length;v++) {
				bTag =  this.playfield.childNodes[y-w].childNodes[x+v].cloneNode(true);
				this.display.childNodes[y-w].replaceChild(bTag,this.display.childNodes[y-w].childNodes[x+v]);
			}
		}
	} else {
		this.renderString (target,x,y,obj.chars,obj.cssClass);
	}
}

BTGame.prototype.updateDisplay = function() {
	this.clearObject (16,this.animY,BTGame.levelObjects['chef'+this.animCnt]);
	this.clearObject (28,this.animY,BTGame.levelObjects['dog'+this.animCnt]);
	this.clearObject (40,this.animY,BTGame.levelObjects['egg'+this.animCnt]);
	if (++this.animCnt>3) {
		this.animY = this.animY>22 ? 23 : ++this.animY;
		this.animCnt=0
	}
	this.renderObject (this.display,16,this.animY,BTGame.levelObjects['chef'+this.animCnt]);
	this.renderObject (this.display,28,this.animY,BTGame.levelObjects['dog'+this.animCnt]);
	this.renderObject (this.display,40,this.animY,BTGame.levelObjects['egg'+this.animCnt]);
	
	x=rand(60);
	y=rand(30);
	this.display.childNodes[y].childNodes[x].firstChild.nodeValue = 'abcdefghijklmnopqrstuvwxyz'.charAt(Math.floor(Math.random()*26));	
}

BTGame.prototype.start = function() {
	this.callwrapper = new CCallWrapper(this, this.gameSpeed, 'updateDisplay');
	CCallWrapper.asyncExecute(this.callwrapper);
}

BTGame.levelObjects = new Array();

BTGame.levelObject = function(chars,cssClass) {
	this.chars = chars;
	this.cssClass = cssClass;
}

BTGame.addLevelObject = function(itemName,chars,cssClass) {
	BTGame.levelObjects[itemName] = new BTGame.levelObject(chars,cssClass);
}

BTGame.addLevelObject('platform','________','pppppppp');
BTGame.addLevelObject('platformLadder','________','pppqqppp');
BTGame.addLevelObject('ladder',' __ ','llll');
BTGame.addLevelObject('landing','____','mmmm');
BTGame.addLevelObject('landingLadder','____','mnnm');
BTGame.addLevelObject('goal','\'------\'','gggggggg');

BTGame.addLevelObject('chef',[' || ',' ## '],['cccc','cccc']);
BTGame.addLevelObject('chef0',[' || ','\'#" '],['cccc','cccc']);
BTGame.addLevelObject('chef1',[' || ',' ## '],['cccc','cccc']);
BTGame.addLevelObject('chef2',[' || ',' "#\''],['cccc','cccc']);
BTGame.addLevelObject('chef3',[' || ',' ## '],['cccc','cccc']);

BTGame.addLevelObject('dog0',[' (\\ ','_(//'],['uuuu','vuuv']);
BTGame.addLevelObject('dog1',[' (\\ ','.(/_'],['uuuu','vuuv']);
BTGame.addLevelObject('dog2',[' /) ','\\\\)_'],['uuuu','vuuv']);
BTGame.addLevelObject('dog3',[' /) ','_\\).'],['uuuu','vuuv']); 

BTGame.addLevelObject('egg0',['./\'\\','\\_O/'],['wwxw','wyyw']);
BTGame.addLevelObject('egg1',['./\'\\','\\O_/'],['wwxw','wyyw']);
BTGame.addLevelObject('egg2',['./\'\\','\\O_/'],['wwxw','wyyw']);
BTGame.addLevelObject('egg3',['./\'\\','\\_O/'],['wwxw','wyyw']); 

BTGame.addLevelObject('burger0','/\'.\'.\'.\\','hjjjjjjh');
BTGame.addLevelObject('burger1','&%$&%$&%','dddddddd');
BTGame.addLevelObject('burger2','(######)','bbbbbbbb');
BTGame.addLevelObject('burger3','\\,,,,,,/','ijjjjjji');
		
BTGame.levelData = [
	[
		'mpmpmpmpm',
		'l lll l l',
		'npnlnpnpn',
		' lnqnll l',
		'mqn llnpn',
		'llnpnqnl ',
		'lll l nqm',
		'nqnpnpnll',
		'l l l lll',
		'npnpnpnqn',
		'         ',
		'         ',
		' g g g g '
	]
];

function onloadHandler() {
	myGame = new BTGame(document.getElementById('gameDiv'));
	myGame.start();
}

function rand(v) {
	return Math.floor(Math.random()*v);
}

function isArray(obj) {
	if (obj.constructor.toString().indexOf("Array") == -1)
		return false;
	else
		return true;
}
