var sprites = new Array();
var spritesCopy = new Array();
var g_level = 0;
var g_inited = false;
var g_timeout = 0;
var g_maxX = 580;
var g_maxY = 460;
var g_spriteCounter = 0;
var g_timerTimeout = 0;
var g_timer = 0;
var g_timerElm;

function init()
{
    g_timerElm = document.getElementById("timer");

    var i = 1;
    sprites[i] = new Sprite(0, 0, 0, 0, 0, 0, "rgb(220,50,80)", false, false, false);
    spritesCopy[i] = new Sprite(-1, -1, -1, -1, -1, -1, "", false, false, true);
    for (i = 2; i <= 10; i++)
    {
        sprites[i] = new Sprite(0, 0, 0, 0, 0, 0, "rgb(140,150,180)", false, false, false);
        spritesCopy[i] = new Sprite(-1, -1, -1, -1, -1, -1, "", false, false, true);
    }

    advanceLevel();
    g_timerTimeout = setTimeout("tickTimer()", 1000);
}

function advanceLevel()
{
    g_level++;
    initLevel();
}

function gobackLevel()
{
    if (g_level >= 2) {
        g_level--;
        initLevel();
    }
    else
    {
        resetTimer();
    }
}

function tickTimer()
{
    g_timer++;
    g_timerElm.innerHTML = g_timer;
    g_timerTimeout = setTimeout("tickTimer()", 1000);
}

function initLevel()
{
    var i = 1;

    clearTimeout(g_timeout);

    switch (g_level)
    {
        case 1:
            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 2;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 280;
            sprites[i].sizeY = 80;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 40;
                sprites[i].y = 200;
                sprites[i].speedX = 4;
                sprites[i].speedY = 0;
                sprites[i].sizeX = 30;
                sprites[i].sizeY = 260;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 2:

            sprites[i].x = 10 + i * 70;
            sprites[i].y = 103;
            sprites[i].speedX = 5;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 34;
            sprites[i].sizeY = 34;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 90;
                sprites[i].speedX = -6;
                sprites[i].speedY = 0;
                sprites[i].sizeX = 40;
                sprites[i].sizeY = 60;
                sprites[i].bounceX = false;
                sprites[i].bounceY = false;
            }
            break;

        case 3:

            sprites[i].x = 10 + i * 70;
            sprites[i].y = 103;
            sprites[i].speedX = -5;
            sprites[i].speedY = 10;
            sprites[i].sizeX = 30;
            sprites[i].sizeY = 20;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 10 + i * 90;
                sprites[i].speedX = 6;
                sprites[i].speedY = 5;
                sprites[i].sizeX = 90;
                sprites[i].sizeY = 190;
                sprites[i].bounceX = false;
                sprites[i].bounceY = false;
            }
            break;

        case 4:

            sprites[i].x = 10 + i * 70;
            sprites[i].y = 203;
            sprites[i].speedX = 5;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 20;
            sprites[i].sizeY = 20;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 5 + (i - 2) * 65;
                sprites[i].y = 10 + i * 70;
                sprites[i].speedX = 0;
                sprites[i].speedY = 12;
                sprites[i].sizeX = 65;
                sprites[i].sizeY = 200;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 5:

            sprites[i].x = 10 + i * 70;
            sprites[i].y = 203;
            sprites[i].speedX = 8;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 25;
            sprites[i].sizeY = 15;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 5 + (i - 2) * 65;
                sprites[i].y = 10 + i * 70;
                sprites[i].speedX = 12;
                sprites[i].speedY = 12;
                sprites[i].sizeX = 65;
                sprites[i].sizeY = 200;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 6:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 3;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 50;
            sprites[i].sizeY = 80;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 2;
                sprites[i].speedX = 3;
                sprites[i].speedY = 2;
                sprites[i].sizeX = 50;
                sprites[i].sizeY = 400;
                sprites[i].bounceX = false;
                sprites[i].bounceY = true;
            }
            break;


        case 7:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 2;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 55;
            sprites[i].sizeY = 80;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 2;
                sprites[i].speedX = 2;
                sprites[i].speedY = 8;
                sprites[i].sizeX = 55;
                sprites[i].sizeY = 350;
                sprites[i].bounceX = false;
                sprites[i].bounceY = true;
            }
            break;

        case 8:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 1;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 57;
            sprites[i].sizeY = 80;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 2;
                sprites[i].speedX = 1;
                sprites[i].speedY = 15;
                sprites[i].sizeX = 57;
                sprites[i].sizeY = 290;
                sprites[i].bounceX = false;
                sprites[i].bounceY = true;
            }
            break;

        case 9:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 1;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 60;
            sprites[i].sizeY = 80;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 60;
                sprites[i].y = 2;
                sprites[i].speedX = 1;
                sprites[i].speedY = 14;
                sprites[i].sizeX = 60;
                sprites[i].sizeY = 240;
                sprites[i].bounceX = false;
                sprites[i].bounceY = true;
            }
            break;

        case 10:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 5;
            sprites[i].speedY = 5;
            sprites[i].sizeX = 30;
            sprites[i].sizeY = 30;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = i * 40;
                sprites[i].y = i * 23;
                sprites[i].speedX = 5 + i;
                sprites[i].speedY = 5 + i;
                sprites[i].sizeX = 70 + i * 4;
                sprites[i].sizeY = 70 + i * 4;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 11:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 5;
            sprites[i].speedY = 5;
            sprites[i].sizeX = 30;
            sprites[i].sizeY = 30;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = Math.round( Math.random() * (g_maxX / 2) + g_maxX / 4 );
                sprites[i].y = Math.round( Math.random() * (g_maxY / 2) + g_maxY / 4 );
                sprites[i].speedX = 15 - Math.round( Math.random() * 30);
                sprites[i].speedY = 15 - Math.round( Math.random() * 30);
                sprites[i].sizeX = 90;
                sprites[i].sizeY = 90;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 12:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = 5;
            sprites[i].speedY = 5;
            sprites[i].sizeX = 30;
            sprites[i].sizeY = 30;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = Math.round( Math.random() * (g_maxX / 2) + g_maxX / 4 );
                sprites[i].y = Math.round( Math.random() * (g_maxY / 2) + g_maxY / 4 );
                sprites[i].speedX = 15 - Math.round( Math.random() * 30);
                sprites[i].speedY = 15 - Math.round( Math.random() * 30);
                sprites[i].sizeX = 190;
                sprites[i].sizeY = 190;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 13:

            sprites[i].x = 200;
            sprites[i].y = 200;
            sprites[i].speedX = -5;
            sprites[i].speedY = 5;
            sprites[i].sizeX = 10;
            sprites[i].sizeY = 10;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = Math.round( Math.random() * (g_maxX / 2) + g_maxX / 4 );
                sprites[i].y = Math.round( Math.random() * (g_maxY / 2) + g_maxY / 4 );
                sprites[i].speedX = 30 - Math.round( Math.random() * 60);
                sprites[i].speedY = 30 - Math.round( Math.random() * 60);
                sprites[i].sizeX = 80;
                sprites[i].sizeY = 80;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 14:

            sprites[i].x = 10;
            sprites[i].y = 0;
            sprites[i].speedX = -20;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 50;
            sprites[i].sizeY = g_maxY;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 70;
                sprites[i].y = 10 + i * 2;
                sprites[i].speedX = 25;
                sprites[i].speedY = 20;
                sprites[i].sizeX = 80;
                sprites[i].sizeY = 340;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 15:

            sprites[i].x = 10;
            sprites[i].y = 0;
            sprites[i].speedX = -12;
            sprites[i].speedY = 0;
            sprites[i].sizeX = 22;
            sprites[i].sizeY = g_maxY;
            sprites[i].bounceX = true;
            sprites[i].bounceY = true;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].x = 10 + i * 70;
                sprites[i].y = 10 + i * 2;
                sprites[i].speedX = 25;
                sprites[i].speedY = 20;
                sprites[i].sizeX = 80;
                sprites[i].sizeY = 340;
                sprites[i].bounceX = true;
                sprites[i].bounceY = true;
            }
            break;

        case 16:

            sprites[i].x = Math.round( Math.random() * (g_maxX / 2) + g_maxX / 4 );
            sprites[i].y = Math.round( Math.random() * (g_maxY / 2) + g_maxY / 4 );
            sprites[i].speedX = 0;
            sprites[i].speedY = -3;
            sprites[i].sizeX = 3;
            sprites[i].sizeY = 5;
            sprites[i].bounceX = false;
            sprites[i].bounceY = false;

            for (i = 2; i <= 10; i++)
            {
                sprites[i].sizeX = Math.round( Math.random() * 10 ) + 1;

                sprites[i].x = Math.round( Math.random() * (g_maxX - 2) );
                sprites[i].y = Math.round( Math.random() * (g_maxY - 2) );
                sprites[i].speedX = 0;
                sprites[i].speedY = 4 + sprites[i].sizeX;
                sprites[i].sizeX = sprites[i].sizeX * 2;
                sprites[i].sizeY = sprites[i].sizeX;
                sprites[i].bounceX = false;
                sprites[i].bounceY = false;
            }
            break;


        default:
            clearTimeout(g_timerTimeout);
            alert("Congratulations, you finished the game! Refresh if you want to beat your time of " + g_timer + " seconds.");
    }

    move();
}

function move()
{
    for (var i = 1; i <= 10; i++)
    {
        sprites[i].x += sprites[i].speedX;
        sprites[i].y += sprites[i].speedY;

        if (sprites[i].bounceX)
        {
            if (sprites[i].x < 0) { sprites[i].speedX = Math.abs(sprites[i].speedX); }
            else if (sprites[i].x > g_maxX - sprites[i].sizeX) { sprites[i].speedX = -Math.abs(sprites[i].speedX); }
        }
        else
        {
            if (sprites[i].x < -sprites[i].sizeX) { sprites[i].x = g_maxX; }
            else if (sprites[i].x > g_maxX) { sprites[i].x = -sprites[i].sizeX; }
        }

        if (sprites[i].bounceY)
        {
            if (sprites[i].y < 0) { sprites[i].speedY = Math.abs(sprites[i].speedY); }
            else if (sprites[i].y > g_maxY - sprites[i].sizeY) { sprites[i].speedY = -Math.abs(sprites[i].speedY); }
        }
        else
        {
            if (sprites[i].y < -sprites[i].sizeY) { sprites[i].y = g_maxY; }
            else if (sprites[i].y > g_maxY) { sprites[i].y = -sprites[i].sizeY; }
        }

        drawSprite(sprites[i], spritesCopy[i]);
    }

    g_timeout = setTimeout("move()", 50);
}

function drawSprite(sprite, spriteCopy)
{
    if (sprite.x != spriteCopy.x) {
        sprite.ref.style.left = sprite.x + "px";
        spriteCopy.x = sprite.x;
    }

    if (sprite.y != spriteCopy.y) {
        sprite.ref.style.top = sprite.y + "px";
        spriteCopy.y = sprite.y;
    }

    if (sprite.sizeX != spriteCopy.sizeX) {
        sprite.ref.style.width = sprite.sizeX + "px";
        spriteCopy.sizeX = sprite.sizeX;
    }

    if (sprite.sizeY != spriteCopy.sizeY) {
        sprite.ref.style.height = sprite.sizeY + "px";
        spriteCopy.sizeY = sprite.sizeY;
    }

    if (sprite.color != spriteCopy.color) {
        sprite.ref.style.backgroundColor = sprite.color;
        spriteCopy.color = sprite.color;
    }
}

function Sprite(x, y, speedX, speedY, sizeX, sizeY, sColor, blnBounceX, blnBounceY, isCopy)
{
    this.x = x;
    this.y = y;
    this.speedX = speedX;
    this.speedY = speedY;
    this.sizeX = sizeX;
    this.sizeY = sizeY;
    this.color = sColor;
    this.bounceX = blnBounceX;
    this.bounceY = blnBounceY;

    if (!isCopy) {
        this.ref = document.getElementById("c" + ++g_spriteCounter);
    }
}

