var aShapes = makeShapeLibrary();
var oActive;
var oNext;
var iRotate = 0;
var iLeft = 0;
var iDown = 0;
var bPause = true;
var bGameOver = false;
var iLevel = 0;
var iTotalRows = 0;
function drawShape(s)
{
    var bCrash = false;
    destroyShape();
    oActive = s;
    s = s[iRotate];
    for (var i=0; i<4; i++) 
    {
        if (document.getElementById("tetrisBoard").rows[s[i].x + iDown].cells[s[i].y + iLeft].id == "set") bCrash = true
        document.getElementById("tetrisBoard").rows[s[i].x + iDown].cells[s[i].y + iLeft].id = "shape";
        document.getElementById("tetrisBoard").rows[s[i].x + iDown].cells[s[i].y + iLeft].name = "shape";
    }
    if (bCrash) gameOver();
}
function drawNext()
{
    if (document.getElementById("nextTable") != null)
        document.getElementById("nextTable").parentNode.removeChild(document.getElementById("nextTable"));
    var r;
    var iRows = 0;
    var iCols = 0;
    var x;
    var y;
    var t = document.createElement("table");
    t.id = "nextTable";
    for (var i=0; i<4; i++) 
    {
        x = oNext[0][i].x;
        y = oNext[0][i].y;
        while (iRows <= x)
        {
            iRows++;
            r = t.insertRow(-1);
            while (r.cells.length < iCols) r.insertCell(-1);
        }
        while (iCols <= y) iCols++;
        while (r.cells.length < iCols) r.insertCell(-1);
        t.rows[x].cells[y].id = "nextShape";
    }
    document.getElementById("next").appendChild(t);
}
function rotate()
{
    var iOldRotate = iRotate;

    if (document.getElementById("shape") == null) return;
    iRotate++;
    if (iRotate >= oActive.length) iRotate = 0;
    var s = oActive[iRotate];
    for (var i=0; i<s.length; i++)
        if (s[i].x + iDown > document.getElementById("tetrisBoard").rows.length || 
            s[i].y + iLeft >= document.getElementById("tetrisBoard").rows[0].cells.length ||
            s[i].y + iLeft < 0 ||
            document.getElementById("tetrisBoard").rows[s[i].x + iDown].cells[s[i].y + iLeft].id == "set")
            iRotate = iOldRotate;
    drawShape(oActive);
}
function destroyShape()
{
    while (document.getElementById("shape") != null) document.getElementById("shape").id = "";
    while (document.getElementById("shape") != null) document.getElementById("shape").name = "";
}
function newShape()
{
    if (bGameOver) return;
    var s = aShapes[Math.floor(Math.random() * aShapes.length)];
    iLeft = 4;

    iDown = 0;
    iRotate = 0;
    if (oNext) drawShape(oNext);
    oNext = s;
    drawNext();
}
function moveShapeDown()
{
    if (document.getElementById("shape") == null || bGameOver) return newShape();
    var s = oActive[iRotate];
    for (var i=0; i<s.length; i++)
        if (s[i].x + iDown + 1 >= document.getElementById("tetrisBoard").rows.length ||
            document.getElementById("tetrisBoard").rows[s[i].x + iDown + 1].cells[s[i].y + iLeft].id == "set") return setShape();
    iDown++;
    drawShape(oActive);
}
function moveShape(iMove)
{
    if (document.getElementById("shape") == null) return;
    var s = oActive[iRotate];
    for (var i=0; i<s.length; i++)
        if (s[i].y + iLeft + iMove >= document.getElementById("tetrisBoard").rows[0].cells.length ||
            s[i].y + iLeft + iMove < 0 ||
            document.getElementById("tetrisBoard").rows[s[i].x + iDown].cells[s[i].y + iLeft + iMove].id == "set") return
    iLeft += iMove;
    drawShape(oActive);
}
function setShape()
{
    var bClear = true;
    var iClear = 0;
    var r;
    var iScore;
    var oScore = document.getElementById("score");
    while (document.getElementById("shape") != null) document.getElementById("shape").id = "set";
    for (var iRow=0; iRow<document.getElementById("tetrisBoard").rows.length; iRow++)
    {
        for (var iCol=0; iCol<document.getElementById("tetrisBoard").rows[iRow].cells.length; iCol++)
            if (document.getElementById("tetrisBoard").rows[iRow].cells[iCol].id != "set") bClear = false;
        if (bClear)
        {
            iClear++;
            document.getElementById("tetrisBoard").deleteRow(iRow);
            r = document.getElementById("tetrisBoard").insertRow(0);
            for (var iCols=0; iCols<10; iCols++)
                r.insertCell(-1);
        }
        bClear = true;
    }
    iTotalRows += iClear;
    if (parseInt(document.getElementById("level").innerHTML) < Math.floor(iTotalRows/10)) iLevel = Math.floor(iTotalRows/10);
    iScore = iClear * 10;
    while (iClear)
    {
        iScore *= iClear;
        iClear--;
    }
    if (iScore) oScore.innerHTML = parseInt(oScore.innerHTML) + iScore;
    document.getElementById("rows").innerHTML = iTotalRows;
    document.getElementById("level").innerHTML = iLevel;
}
function gameOver()
{
    bGameOver = true;

    bPause = true;
    alert("game over");
}
function start()
{
    if (bGameOver && !bPause)

    {
        document.getElementById("tetrisBoard").parentNode.removeChild(document.getElementById("tetrisBoard"));
        makeTetrisBoard();
        bGameOver = false;
    }
    if (bPause) return;
    moveShapeDown();
    window.setTimeout(start, 1000 - (iLevel * 50));
}
function catchKey(e)
{
    var keyCode = (e) ? e.which : event.keyCode;
    switch (keyCode)
    {
        case 40 :   //  down
            moveShapeDown();
            break;
        case 37 :   //  left
            moveShape(-1);
            break;
        case 39 :   //  right
            moveShape(1);
            break;
        case 38 :   //  up
            rotate();
            break;
        case 32 :   // space
            bPause = (!bPause);
            start();
            break;
/*        case 76 :
            iLevel++;
            document.getElementById("level").innerHTML = iLevel;
            break;*/
        default :
            window.status = keyCode;
    }
}
function makeShapeCoords(x1,y1,x2,y2,x3,y3,x4,y4)
{
    var a = new Array();
    a.push(new coord(x1,y1));
    a.push(new coord(x2,y2));
    a.push(new coord(x3,y3));
    a.push(new coord(x4,y4));
    return a;
}
function coord(x,y)
{
    this.x = x;
    this.y = y;
}
function makeShapeLibrary()
{
    var a = new Array()
    a.push(new Array(makeShapeCoords(0,0,1,0,2,0,3,0),makeShapeCoords(3,-1,3,0,3,1,3,2)));
    a.push(new Array(makeShapeCoords(0,0,0,1,1,0,1,1)));
    a.push(new Array(makeShapeCoords(0,0,1,0,2,0,2,1),makeShapeCoords(1,2,1,1,1,0,2,0),makeShapeCoords(2,1,1,1,0,1,0,0),makeShapeCoords(2,0,2,1,2,2,1,2)));
    a.push(new Array(makeShapeCoords(0,1,1,1,2,1,2,0),makeShapeCoords(1,0,2,0,2,1,2,2),makeShapeCoords(0,0,0,1,1,0,2,0),makeShapeCoords(1,0,1,1,1,2,2,2)));
    a.push(new Array(makeShapeCoords(0,0,1,0,1,1,2,1),makeShapeCoords(2,0,2,1,1,1,1,2)));
    a.push(new Array(makeShapeCoords(0,1,1,0,1,1,2,0),makeShapeCoords(1,0,1,1,2,1,2,2)));
    a.push(new Array(makeShapeCoords(0,0,0,1,0,2,1,1),makeShapeCoords(0,2,1,1,1,2,2,2),makeShapeCoords(2,0,2,1,1,1,2,2),makeShapeCoords(0,0,1,0,1,1,2,0)));
    return a;
}
function makeTetrisBoard()
{
    var t = document.createElement("table");
    var r;
    for (var iRows=0; iRows<20; iRows++)
    {
        r = t.insertRow(-1);
        for (var iCols=0; iCols<10; iCols++)
            r.insertCell(-1);
    }
    t.id = "tetrisBoard";
    document.getElementById("controls").parentNode.insertBefore(t,document.getElementById("controls"));
    t.style.float = "left";
    document.onkeydown = catchKey;
    document.getElementById("score").innerHTML = 0;
    document.getElementById("level").innerHTML = 0;
    document.getElementById("rows").innerHTML = 0;
    iLevel = 0;
    iTotalRows = 0;
    newShape();
    bGameOver = true;
}
function toggleSmall()
{
	var sUrl = "small.css";
	var sText = "normal";
	var sDisplay = "none";
	var oLink = event.srcElement;
	if (oLink.innerText == sText)
	{
		sUrl = "tetris.css";
		sText = "small";
		sDisplay = "block";
	}
	applyStyle(sUrl);
	oLink.innerText = sText;
	document.getElementById("controls").style.display = sDisplay;
	event.returnValue = false;
}
function applyStyle(url)
{
	document.styleSheets[0].href = url;
}
function playSmall()
{
	window.open("small.htm","gilly3SmallTetris","width=170,height=140,resizable=yes").focus();
	event.returnValue = false;
}
