var aryBlockCoords = new Array(4);
var strCurCoords;
var lBoardHeight = 18;
var lBoardWidth = 10;
var lCurDir = 1;
var lCurPiece = 1;
var lCurX = 5;
var lCurY = 2;
var bolRunning = false;

var blockT = 1;
var blockL = 2;
var blockLR = 3;
var blockS = 4;
var blockSR = 5;
var blockC = 6;
var blockP = 7;

var dir0 = 1;
var dir90 = 2;
var dir180 = 3;
var dir270 = 4;
var dirLeft = 1;
var dirRight = 2;
var dirUp = 3;
var dirDown = 4;


function drawPiece(lType, lY, lX, lDir) {
	var strClass = 'block'+lType;
	switch (lType) {
		case blockT: // T piece
			switch (lDir) {
				case dir0: // Default
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
				case dir90: // 90' CW
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = lY + '-' + (lX - 1);
					aryBlockCoords[2] = lY + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
				case dir180: // 180' CW
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY - 1) + '-' + lX;
					break;
				case dir270: // 270' CW
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = lY + '-' + (lX + 1);
					aryBlockCoords[2] = lY + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
			}
			break;
		case blockL: // L piece
			switch (lDir) {
				case dir0: // Default
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = (lY + 1) + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + (lX + 1);
					break;
				case dir90: // 90' CW
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY + 1) + '-' + (lX - 1);
					break;
				case dir180: // 180' CW
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = (lY - 1) + '-' + (lX - 1);
					aryBlockCoords[2] = lY + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
				case dir270: // 270' CW
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY - 1) + '-' + (lX + 1);
					break;
			}
			break;
		case blockLR: // Backwards L piece
			switch (lDir) {
				case dir0: // Defaut
					aryBlockCoords[0] = (lY - 1)+ '-' + lX;
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = (lY + 1) + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + (lX - 1);
					break;
				case dir90: // 90' CW
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY - 1) + '-' + (lX - 1);
					break;
				case dir180: // 180' CW
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = (lY - 1) + '-' + (lX + 1);
					aryBlockCoords[2] = lY + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
				case dir270: // 270' CW
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY + 1) + '-' + (lX + 1);
					break;
			}
			break;
		case blockS: // S piece
			switch (lDir) {
				case dir0: // Horizontal
				case dir180:
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = (lY + 1) + '-' + (lX + 1);
					break;
				case dir90: // Vertical
				case dir270:
					aryBlockCoords[0] = lY + '-' + lX;
					aryBlockCoords[1] = lY + '-' + (lX + 1);
					aryBlockCoords[2] = (lY + 1) + '-' + (lX - 1);
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
			}
			break;

		case blockSR: // Backwards S piece
			switch (lDir) {
				case dir0: // Horizontal
				case dir180:
					aryBlockCoords[0] = (lY - 1) + '-' + (lX + 1);
					aryBlockCoords[1] = lY + '-' + (lX + 1);
					aryBlockCoords[2] = lY + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + lX;
					break;
				case dir90: // Vertical
				case dir270:
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = (lY + 1) + '-' + lX;
					aryBlockCoords[3] = (lY + 1) + '-' + (lX + 1);
					break;
			}
			break;
		case blockC: // [] piece
			aryBlockCoords[0] = lY + '-' + lX;
			aryBlockCoords[1] = lY + '-' + (lX + 1);
			aryBlockCoords[2] = (lY + 1) + '-' + lX;
			aryBlockCoords[3] = (lY + 1) + '-' + (lX + 1);
			break;
		case blockP: // | piece
			switch (lDir) {
				case dir0: // Horizontal
				case dir180:
					aryBlockCoords[0] = (lY - 1) + '-' + lX;
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = (lY + 1) + '-' + lX;
					aryBlockCoords[3] = (lY + 2) + '-' + lX;
					break;
				case dir90: // Vertical
				case dir270:
					aryBlockCoords[0] = lY + '-' + (lX - 1);
					aryBlockCoords[1] = lY + '-' + lX;
					aryBlockCoords[2] = lY + '-' + (lX + 1);
					aryBlockCoords[3] = lY + '-' + (lX + 2);
					break;
			}
			break;
	}
	cellColor(aryBlockCoords[0], strClass);
	cellColor(aryBlockCoords[1], strClass);
	cellColor(aryBlockCoords[2], strClass);
	cellColor(aryBlockCoords[3], strClass);
}

function cellColored(lY, lX) {
	var strCellName = lY + '-' + lX;
	var objCell = document.getElementById(strCellName);
	if (objCell.className.length > 0) {
		return true;
	} else {
		return false;
	}
}

function checkCollision(lDirection) {
	switch (lCurPiece) {
		case blockC:
			switch (lDirection) {
				case dirLeft:
					break;
				case dirRight:
					if (!cellColored(lCurY, lCurX + 2) && !cellColored(lCurY + 1, lCurX + 2)) {
						return false;
					} else {
						return true;
					}
					break;
				case dirDown:
					break;
			}
			break;
		default:
			return false;
			break;
	}
}

function moveDown() {
	switch (lCurPiece) {
		case blockT:
			switch (lCurDir) {
				case dir0:
				case dir90:
				case dir270:
					if (lCurY < lBoardHeight - 1) {
						if (!checkCollision(dirDown)) {
							lCurY++;
						}
					}
					break;
				case dir180:
					if (lCurY < lBoardHeight) {
						if (!checkCollision(dirDown)) {
							lCurY++;
						}
					}
					break;
			}
			break;
	}
	updateCurPiece();
	return true;
}

function moveLeft() {
	switch (lCurPiece) {
		case blockT:
			switch (lCurDir) {
				case dir0:
				case dir90:
				case dir180:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir270:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
		case blockL:
			switch (lCurDir) {
				case dir0:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir90:
				case dir180:
				case dir270:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
		case blockLR:
			switch (lCurDir) {
				case dir180:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir0:
				case dir90:
				case dir270:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
		case blockS:
			switch (lCurDir) {
				case dir0:
				case dir180:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir90:
				case dir270:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
		case blockSR:
			switch (lCurDir) {
				case dir0:
				case dir180:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir90:
				case dir270:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
		case blockC:
			if (lCurX > 1) {
				if (!checkCollision(dirLeft)) {
					lCurX--;
				}
			}
			break;
		case blockP:
			switch (lCurDir) {
				case dir0:
				case dir180:
					if (lCurX > 1) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
				case dir90:
				case dir270:
					if (lCurX > 2) {
						if (!checkCollision(dirLeft)) {
							lCurX--;
						}
					}
					break;
			}
			break;
	}
	updateCurPiece();
	return true;
}

function moveRight() {
	switch (lCurPiece) {
		case blockT:
			switch (lCurDir) {
				case dir0:
				case dir180:
				case dir270:
					if (lCurX < 9) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
				case dir90:
					if (lCurX < 10) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
			}
			break;
		case blockL:
			switch (lCurDir) {
				case dir180:
					if (lCurX < 10) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
				case dir0:
				case dir90:
				case dir270:
					if (lCurX < 9) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
			}
			break;
		case blockLR:
			switch (lCurDir) {
				case dir0:
					if (lCurX < 10) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
				case dir90:
				case dir180:
				case dir270:
					if (lCurX < 9) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
			}
			break;
		case blockS:
			if (lCurX < 9) {
				if (!checkCollision(dirRight)) {
					lCurX++;
				}
			}
			break;
		case blockSR:
			if (lCurX < 9) {
				if (!checkCollision(dirRight)) {
					lCurX++;
				}
			}
			break;
		case blockC:
			if (lCurX < 9) {
				if (!checkCollision(dirRight)) {
					lCurX++;
				}
			}
			break;
		case blockP:
			switch (lCurDir) {
				case dir0:
				case dir180:
					if (lCurX < 10) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
				case dir90:
				case dir270:
					if (lCurX < 8) {
						if (!checkCollision(dirRight)) {
							lCurX++;
						}
					}
					break;
			}
			break;
	}
	updateCurPiece();
	return true;
}

function rotateClockwise() {
	bolRotate = false;
	switch (lCurPiece) {
		case blockT:
			if (lCurX > 1 && lCurX < 10) {
				bolRotate = true;
			}
			break;
		case blockL:
			if (lCurX > 1 && lCurX < 10) {
				bolRotate = true;
			}
			break;
		case blockLR:
			if (lCurX > 1 && lCurX < 10) {
				bolRotate = true;
			}
			break;
		case blockS:
			if (lCurX > 1 && lCurX < 10) {
				bolRotate = true;
			}
			break;
		case blockSR:
			if (lCurX > 1 && lCurX < 10) {
				bolRotate = true;
			}
			break;
		case blockC:
			bolRotate = true;
			break;
		case blockP:
			switch (lCurDir) {
				case dir0:
				case dir180:
					if (lCurX < 9 && lCurX > 1) {
						bolRotate = true;
					}
					break;
				case dir90:
				case dir270:
					if (lCurY > 1 && lCurY < 15) {
						bolRotate = true;
					}
					break;
			}
			break;
	}
	if (bolRotate) {
		if (lCurDir < 4) {
			lCurDir++;
		} else {
			lCurDir = 1;
		}
	}
	updateCurPiece();
	return true;
}

function updateCurPiece() {
		clearOldBlock();
		drawPiece(lCurPiece, lCurY, lCurX, lCurDir);
}

function clearOldBlock() {
	for (lCount = 0; lCount < 4; lCount++) {
		cellColor(aryBlockCoords[lCount], '');
	}
}

function cellColor(strCellID, strCellClass) {
	objCell = document.getElementById(strCellID);
	objCell.className = strCellClass;
}

function initGame() {
	document.onkeypress = keyHandler;
	drawPiece(lCurPiece, lCurY, lCurX, lCurDir);
}

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 '1':
			lCurPiece = blockT;
			matchedkey = true;
			break;
		case '2':
			lCurPiece = blockL;
			matchedkey = true;
			break;
		case '3':
			lCurPiece = blockLR;
			matchedkey = true;
			break;
		case '4':
			lCurPiece = blockS;
			matchedkey = true;
			break;
		case '5':
			lCurPiece = blockSR;
			matchedkey = true;
			break;
		case '6':
			lCurPiece = blockC;
			matchedkey = true;
			break;
		case '7':
			lCurPiece = blockP;
			matchedkey = true;
			break;
		case 'UP':
		case 'i':
		case 'e': // Up
			rotateClockwise();
			matchedkey = true;
			break;
		case 'LEFT':
		case 'j':
		case 's': // Left
			moveLeft();
			matchedkey = true;
			break;
		case 'DOWN':
		case 'k':
		case 'd': // Down
			moveDown();
			matchedkey = true;
			break;
		case 'RIGHT':
		case 'l':
		case 'f': // Right
			moveRight();
			matchedkey = true;
			break;
		default:
			//alert(keyCode);
			break;
	}
	if (matchedkey) {
		updateCurPiece();
		return false;
	} else {
		return true;
	}
}

function startButton() {
	var objSB = document.getElementById('startbutton');
	if (bolRunning) {
		objSB.innerHTML = 'Start';
		bolRunning = false;
	} else {
		objSB.innerHTML = 'Stop';
		bolRunning = true;
	}
}