/*
tetris, ©Copyright 2006,2007 - bezumie.com, All Rights Reserved
тетрис, ©Copyright 2006,2007 - bezumie.com, Всички права запазени
*/

function random(minValue, maxValue) {
	return Math.floor(Math.random() * (maxValue - minValue + 1) + minValue);
}

function debug(aMessage){
	var deb = document.getElementById('debug');
	deb.innerHTML = aMessage;
}
var lineStats;
var scoreStats;
var elementScore;
var levelStats;
var board = new Array(); // полето за игра (div-ове)
var gameIsPaused;
var gameIsOver;
var deltaTime = 0; // колко милисекунди са изминали от последното "пропадане" на текущия елемент
var nextElementId; // id (вид) на следващия елемент
var nextElementDivs = new Array(); // div-овете на следващия елемент
var lmntId; // id(вид) на текущия елемент
var lmnt = null; // Array - текущият елемент 
var lmntDivs = new Array(); // div-овете образуващи текущия елемент
var lmntLeft; // позиция на текущия елемент по хоризонтала
var lmntTop; // позиция на текущия елемент по вертикала
var lmnts = new Array([
					[0, 1, 0],
					[1, 1, 0],
					[1, 0, 0]
				],[
					[1, 0, 0],
					[1, 1, 0],
					[0, 1, 0]
				],[ 
					[1, 1],
					[1, 1]
				],[
					[1, 0, 0],
					[1, 0, 0],
					[1, 1, 0]
				],[
					[0, 1, 0],
					[0, 1, 0],
					[1, 1, 0]
				],[ 
					[1, 0, 0],
					[1, 1, 0],
					[1, 0, 0]
				],[
					[0, 1, 0, 0],
					[0, 1, 0, 0],
					[0, 1, 0, 0],
					[0, 1, 0, 0]
				]);
var nextBoxTop = new Array (31, 31, 33, 31, 31, 33, 25);
var nextBoxLeft = new Array (11, 11, 19, 11, 11, 11, 0);

function newGame(){
	gameIsOver = false;
	gameIsPaused = false;
	lineStats = 0;
	scoreStats = 0;
	levelStats = 1;
	elementScore = 20000;
	hideMessage();
	for (var i=0; i<boardHeight; i++){
		board[i] = new Array;
		for (var j=0; j<boardWidth; j++){
			board[i][j]=0;
		}
	}
	showNextElement();
	loop();
}

// Извиква се след pauseGame
function resumeGame(){
	gameIsPaused = false;
	hideMessage();
	loop();
}

// Извиква се при натискане на пауза  или при зареждане на страницата, когато се извиква и newGame
function pauseGame(){
	gameIsPaused = true;
	showMessage(pausedGame);
}

function gameOver(){
	gameIsOver = true;
	showMessage(nextGame);
}

function loop() {
	if (gameIsOver) return;
	if (gameIsPaused) return;
	deltaTime = deltaTime + 50;
	if (deltaTime >= 100 + 600/levelStats){
		makeMove(false);
	}
	if (!gameIsOver && !gameIsPaused)
		setTimeout("loop()", 50);
}

function canFit(aPosTop, aPosLeft, aLmnt){
	for (var i=0; i<aLmnt.length; i++){
		for (var j=0; j<aLmnt[i].length; j++){
			if (aLmnt[i][j]==1){
				if (aPosTop < 0) return false;
				if ((aPosLeft + i) > boardWidth) return false;
				if ((aPosTop + j) > boardHeight-1) return false;
				if ((aPosLeft + i) < 0) return false;
				if (board[aPosTop + j][aPosLeft + i] != 0) return false;
			}
		}
	}
	return true;
}

function removeLine(line){
	var tetris = document.getElementById('tetris');
	for (var j=0; j<boardWidth; j++)
		tetris.removeChild(board[line][j]); 
	for (var i=line; i>=0; i--){
		for (j=0; j<boardWidth; j++){
			if (i==0) board[0][j] = 0;
			else board[i][j]=board[i-1][j];
			if (board[i][j]!=0) board[i][j].style.top = (i*elementSize) + 'px';
		}
	}
}

function removeLines(){
	var removed=0;
	for (var i=boardHeight-1; i>=0; i--){
		for (var j=0; j<=boardWidth; j++){
			if (j==boardWidth) {
				removeLine(i);
				removed++;
				scoreStats = scoreStats + 100 * removed;
				lineStats++;
				putText('lines', lineStats);
				i++; // за да провери отново този ред
			}
			else if (board[i][j]==0) break;
		}
	}
}

function makeMove(aForce){
	var res;
	elementScore = elementScore - deltaTime;
	//debug(random(888, 999));
	if (canFit(lmntTop+1, lmntLeft, lmnt)) {
		lmntTop++;
		var res = true;
	}
	else {
		var res = false;
		var k=0;
		for (var i=0; i<lmnt.length; i++){
			for (var j=0; j<lmnt[i].length; j++){
				if (lmnt[i][j]==1){
					board[lmntTop+j][lmntLeft+i] = lmntDivs[k];
					k++;
				}
			}
		}
		removeLines();
		scoreStats = scoreStats + (Math.floor(elementScore / 2000) * levelStats);
		if (scoreStats > 1300 * levelStats * (levelStats/2)) {
			levelStats++;
			putText('level', levelStats);
		}
		putText('score', scoreStats);
		elementScore = 20000;
		showNextElement();
	}
	if (!aForce) deltaTime = 0;
	drawElement();
	return res;
}

function goDown(){
	makeMove(true)
}

function fall(){
	while (makeMove(true)); 
}

function goLeft(){
	if (canFit(lmntTop, lmntLeft-1, lmnt)) {
		lmntLeft--;
		drawElement();
	}
}

function goRight(){
	if (canFit(lmntTop, lmntLeft+1, lmnt)) lmntLeft++;
	drawElement();
}

function doRotate(){
	var rot = rotate(lmnt);
	if (canFit(lmntTop, lmntLeft, rot)){
		lmnt=rot;
		drawElement();
	}
}

function rotate(el){
	var r = new Array;
	var k = el.length;
	for (var i=0; i<el.length; i++) {
		r[i] = new Array;
		k--;
		for (var j=0; j<el[i].length; j++) 
			r[i][j] = el[j][k];
	}
	return r;
}

function initEvents(){
	// за да не се скролва OPERA (но се появява друг проблем)
	/*if (document.addEventListener) document.addEventListener("keypress", keyDown, true)
	else {
		if ((self.Event) && (self.Event.KEYPRESS)) document.captureEvents(Event.KEYPRESS);
		document.onkeypress = keyDown;
	}*/
	window.document.onkeydown = keyDown;
}

function keyDown(e) {
	var ch;
	var ctrl=false;
	if (e) { // Netscape/Firefox/Opera
		ch=e.which;
		ctrl=((e.ctrlKey) || (e.metaKey) || (e.altKey) || (e.modifiers));
	}
	else if (window.event) { // IE  
		ch=window.event.keyCode;
		ctrl= ((window.event.ctrlKey) || (window.event.altKey) || (window.event.metaKey));
	}
	else return true;
	if (ctrl) return true;

	if (gameIsOver) return;

	switch (ch) {
		case 32: // space - пада директно до долу
			if (!gameIsPaused) fall();
			break; 
		case 37: //left - една позиция наляво
			if (!gameIsPaused) goLeft(); 
			break; 
		case 39: //right - една позиция надясно
			if (!gameIsPaused) goRight(); 
			break; 
		case 38: //up - завъртане
			if (!gameIsPaused) doRotate(); 
			break; 
		case 40: //down - една позиция надолу
			if (!gameIsPaused) goDown(); 
			break; 
		case 80:
		case 19: // P - пауза или Pause/Break
			// ако сме на пауза 
			if (gameIsPaused) resumeGame();
			else pauseGame(); 
			break; 
		default: return true;
	}

	if ((window.event) && (window.event.preventDefault)) window.event.preventDefault()
	else if ((e) && (e.preventDefault)) e.preventDefault();
	if ((window.event) && (window.event.stopPropagation)) window.event.stopPropagation()
	else if ((e) && (e.stopPropagation)) e.stopPropagation();
	if (window.event) window.event.cancelBubble = true;
	return false;
}

function showNextElement(){
	var i, j;
	var ne = document.getElementById('nextElement');
	// ако съществува елемент (в началото на играта няма)
	if (lmnt){
		// изчистване на предишният елемент
		for (i=0; i<nextElementDivs.length; i++){
			ne.removeChild(nextElementDivs[i]);
		}
		nextElementDivs = new Array();
		// присвояваме на елемента за игра, следващият елемент
		lmntId = nextElementId;
		lmnt = lmnts[nextElementId];
	}
	// При началото на играта
	else {
		lmntId = random(0, 6);
		lmnt = lmnts[lmntId];
	}
	pieceStat(lmntId);
	lmntLeft = Math.floor((boardWidth - 3) / 2);
	lmntTop = 0;
	if (!canFit(lmntTop, lmntLeft, lmnt)){
		gameOver();
		return;
	}
	lmntDivs = new Array();
	deltaTime = 1000;
	nextElementId = random(0, 6);
	var nextElement = lmnts[nextElementId];
	var el;
	var le;
	for (var i=0; i<nextElement.length; i++){
		le = nextElement[i];
		for (var j=0; j<le.length; j++){
			if (le[j] == '1'){
				el = document.createElement("div");
				el.className = "kvadrat" + nextElementId;
				el.style.left = (elementSize * i) + nextBoxLeft[nextElementId] + "px";
				el.style.top = (elementSize * j) + nextBoxTop[nextElementId] + "px";
				el.style.width = (elementSize - 1) + 'px';
				el.style.height = (elementSize - 1) + 'px';
				ne.appendChild(el);
				nextElementDivs[nextElementDivs.length] = el;
			}
		}
	}
}

function drawElement(){
	var i;
	var j;
	var k;
	var isnew = (lmntDivs.length == 0);
	var tetris = document.getElementById('tetris');
	var el;
	var le;
	k = 0;
	for (i=0; i<lmnt.length; i++){
		le = lmnt[i];
		for (j=0; j<le.length; j++){
			if (le[j] == '1'){
				if (isnew) {
					el = document.createElement("div");
					el.className = "kvadrat" + lmntId;
					tetris.appendChild(el);
					lmntDivs[lmntDivs.length] = el;
				}
				else {
					el = lmntDivs[k];
					k++;
				}
				el.style.left = elementSize * (i + lmntLeft) + "px";
				el.style.top = elementSize * (j + lmntTop) + "px";
				el.style.width = (elementSize - 1) + 'px';
				el.style.height = (elementSize - 1) + 'px';
			}
		}
	}
}

function pieceStat(aID){
	var el = document.getElementById('count'+aID);
	cnt = el.innerHTML;
	cnt++;
	el.innerHTML=cnt;
}

function putText(aID, aText){
	var el = document.getElementById(aID);
	el.innerHTML = aText;
}

function showMessage(aMessage){
	var msg = document.getElementById('message');
	msg.innerHTML = aMessage;
	msg.style.display = 'inline';
}

function hideMessage() {
	var msg = document.getElementById('message');
	msg.style.display = 'none';
}