var Tetris = { x:0, y:0, shape:0, rot:0, speed:400, lines:0, paused:0, Shapes:new Array() };
  
for(i=0; i<7; i++)
{
	Tetris.Shapes[i] = new Array();
}

Tetris.Shapes[0][0] = new Array(0,1,0,0, 0,1,0,0, 0,1,0,0, 0,1,0,0);
Tetris.Shapes[0][1] = new Array(0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0);
Tetris.Shapes[0][2] = new Array(0,0,1,0, 0,0,1,0, 0,0,1,0, 0,0,1,0);
Tetris.Shapes[0][3] = new Array(0,0,0,0, 0,0,0,0, 1,1,1,1, 0,0,0,0);

Tetris.Shapes[1][0] = new Array(0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0);
Tetris.Shapes[1][1] = new Array(0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0);
Tetris.Shapes[1][2] = new Array(0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0);
Tetris.Shapes[1][3] = new Array(0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0);

Tetris.Shapes[2][0] = new Array(1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[2][1] = new Array(0,0,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,0);
Tetris.Shapes[2][2] = new Array(0,1,0,0, 0,1,0,0, 0,1,1,0, 0,0,0,0);
Tetris.Shapes[2][3] = new Array(0,0,0,0, 1,1,1,0, 1,0,0,0, 0,0,0,0);

Tetris.Shapes[3][0] = new Array(0,1,1,0, 0,1,0,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[3][1] = new Array(0,0,0,0, 1,1,1,0, 0,0,1,0, 0,0,0,0);
Tetris.Shapes[3][2] = new Array(0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0);
Tetris.Shapes[3][3] = new Array(1,0,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0);

Tetris.Shapes[4][0] = new Array(0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0);
Tetris.Shapes[4][1] = new Array(0,1,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[4][2] = new Array(0,0,0,0, 1,1,1,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[4][3] = new Array(0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0);

Tetris.Shapes[5][0] = new Array(0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0);
Tetris.Shapes[5][1] = new Array(1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0);
Tetris.Shapes[5][2] = new Array(0,0,1,0, 0,1,1,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[5][3] = new Array(0,0,0,0, 1,1,0,0, 0,1,1,0, 0,0,0,0);

Tetris.Shapes[6][0] = new Array(1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0);
Tetris.Shapes[6][1] = new Array(0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0);
Tetris.Shapes[6][2] = new Array(0,1,0,0, 0,1,1,0, 0,0,1,0, 0,0,0,0);
Tetris.Shapes[6][3] = new Array(0,0,0,0, 0,1,1,0, 1,1,0,0, 0,0,0,0);

Tetris.keyin = function(e)
{
	for(i=0;i<200;i++) Tetris.buffer[i]=Tetris.well[i];

	if(!e) e = window.event;
	switch(e.keyCode)
	{
		case 37: Tetris.x--; if(!Tetris.fillshape()) Tetris.x++; break;
		case 39: Tetris.x++; if(!Tetris.fillshape()) Tetris.x--; break;
		case 38: Tetris.rot = (Tetris.rot-1)&3; if(!Tetris.fillshape()) Tetris.rot = (Tetris.rot+1)&3; break;
		case 40: Tetris.speed = 20; break;
	}
	Tetris.fillshape();
	Tetris.render();
}

Tetris.render = function()
{
	var blocks = document.getElementById('tetris').getElementsByTagName('div');
	for(var i=0; i<200; i++)
		blocks[i].className = (Tetris.buffer[i])?('block'+Tetris.buffer[i]):'space';
	
	document.getElementById('score').getElementsByTagName('span')[0].innerHTML = 'Lines: '+Tetris.lines;
}

Tetris.drop = function()
{
	var end = 0;
	
	for(i=0;i<200;i++) Tetris.buffer[i]=Tetris.well[i];
	
	Tetris.y++;
	if(!Tetris.fillshape())
	{
		Tetris.y--;
		Tetris.fillshape();
		if(Tetris.y == -1)
		{
			end = 1;
		}
		else
		{
			Tetris.speed = 400;
			for(i=0; i<200; i++) Tetris.well[i]=Tetris.buffer[i];
			Tetris.killrows();
			Tetris.genshape();
		}
	}
	else
		Tetris.render();
		
	if(!end) Tetris.timer = setTimeout(Tetris.drop, Tetris.speed);
	else alert('Game over');
}

Tetris.killrows = function()
{
	for(i=0; i<20; i++)
	{
		c = 0;
		for(j=0; j<10; j++)
			if(Tetris.well[i*10+j]) c++;
		if(c==10)
		{
			for(j=(i*10)-1; j>=0; j--) Tetris.well[j+10]=Tetris.well[j];
			Tetris.lines++;
		}
	}
}

Tetris.fillshape = function()
{
	var v = new Array(200);
	for(i=0; i<200; i++) v[i]=Tetris.buffer[i];
	var err = 0;
	
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(Tetris.Shapes[Tetris.shape][Tetris.rot][i*4+j])
			{
				if(v[(Tetris.y+i)*10+Tetris.x+j])
					err++;
				else
				{
					if((Tetris.y+i > 19) || (Tetris.y+i < 0) || (Tetris.x+j > 9) || (Tetris.x+j < 0))
						err++;
					else
						v[(Tetris.y+i)*10+Tetris.x+j] = Tetris.shape+1;
				}
			}
		}
	}

	if(err) return false;
	else
	{
		for(i=0;i<200;i++) Tetris.buffer[i]=v[i];
		return true;
	}
}

Tetris.genshape = function()
{
	Tetris.shape = Math.floor(Math.random()*7);
	Tetris.rot = 0;
	Tetris.x = 3;
	Tetris.y = -1;
}

Tetris.pause = function()
{
	if(Tetris.paused)
	{
		Tetris.paused=0;
		Tetris.timer = setTimeout(Tetris.drop, Tetris.speed);
		document.getElementById('pause').innerHTML = 'Pause';
	}
	else
	{
		Tetris.paused=1;
		clearTimeout(Tetris.timer);
		document.getElementById('pause').innerHTML = 'Resume';
	}
	return false;
}

Tetris.init = function()
{
	document.onkeydown = Tetris.keyin;
	document.onkeyup = function() { Tetris.speed=400; };

	document.getElementById('pause').onclick = Tetris.pause;

	Tetris.well = new Array(200);
	Tetris.buffer = new Array(200);

	var block = document.createElement('div');
	block.className = 'space';

	for(var i=0; i<200; i++)
	{
		Tetris.well[i] = 0;
		Tetris.buffer[i] = 0;
		document.getElementById('tetris').appendChild(block);
                document.getElementById('tetris').lastChild.style.left = ((i%10)*16)+'px';
                document.getElementById('tetris').lastChild.style.top = (Math.floor(i/10)*16)+'px';
		block = block.cloneNode(false);
	}

	Tetris.genshape();
	Tetris.drop();
}

window.onload = Tetris.init;

