var sprites = new Array();
var spritesCopy = new Array();
var g_inited = false;
var g_timeout = 0;
var g_maxX = 500;
var g_maxY = 460;
var g_spriteCounter = 0;
var g_currentActive = -1;
var g_livingPairs = 0;
var g_pairsMax = 3;
var g_pairsLimit = 40;
var g_level = 1;
var maxSpeed = 6;

function activateCube(n)
{
    if ( n == g_currentActive )
    {
        sprites[n].borderColor = "white";
        g_currentActive = -1;
    }
    else
    {
        if ( g_currentActive == -1 )
        {
            g_currentActive = n;
            sprites[n].borderColor = "gray";
        }
        else
        {
            if (sprites[g_currentActive].color == sprites[n].color) {
                sprites[n].alive = false;
                sprites[g_currentActive].alive = false;

                if (--g_livingPairs == 0) {
                    g_currentActive = -1;
                    g_pairsMax += 2;
                    g_level++;
                    if (g_pairsMax >= g_pairsLimit) {
                        showElm("wasRightCompleted");
                        showElm("rightOrWrongShade");
                    }
                    else {
                        showElm("wasRight");
                        showElm("rightOrWrongShade");
                        setTimeout( "nextLevel()", 1500 );
                    }
                }
                g_currentActive = -1;
            }
            else {
                g_currentActive = -1;
                g_pairsMax -= 2;
                g_level--;
                showElm("wasWrong");
                showElm("rightOrWrongShade");
                var minPairs = 3;
                if (g_pairsMax < minPairs) { g_pairsMax = minPairs; }
                if (g_level <= 1) { g_level = 1; }

                setTimeout( "lastLevel()", 1500 );
            }
        }
    }
}

function lastLevel()
{
    hideElm("rightOrWrongShade");
    hideElm("wasWrong");
    updateLevel();
    startCouples();
}

function nextLevel()
{
    hideElm("rightOrWrongShade");
    hideElm("wasRight");
    updateLevel();
    startCouples();
}

function updateLevel()
{
    var elmLevel = document.getElementById("thisLevel");
    elmLevel.innerHTML = g_level;
}

function initGame()
{
    for (var i = 1; i <= g_pairsLimit; i++) {
        var sColor = "";
        for (var tryN = 1; tryN <= 100 && sColor == ""; tryN++) {
            var tryColor = "rgb(" + rand(1,10) * 25 + "," + rand(1,10) * 25 + "," + rand(1,10) * 25 + ")";
            var tryOk = true;
            for (var trySpriteN = 1; trySpriteN <= g_spriteCounter && tryOk; trySpriteN++) {
                if (sprites[trySpriteN]) {
                    if (sprites[trySpriteN].color == tryColor) { tryOk = false; }
                }
            }
            if (tryOk) { sColor = tryColor; }
        }

        for (var j = 1; j <= 2; j++) {
            var x = rand(20, g_maxX - 50);
            var y = rand(20, g_maxY - 50);
            var speedX = rand(-maxSpeed, maxSpeed);
            var speedY = rand(-maxSpeed, maxSpeed);
            var blnBounceX = false;
            var blnBounceY = false;
            if ( rand(0,100) >= 50 ) {
                blnBounceX = true;
                blnBounceY = true;
            }

            var n = ++g_spriteCounter;
            sprites[n] = new Sprite(x, y, speedX, speedY, 30, 30, sColor, blnBounceX, blnBounceY, false, "white", "c" + n);
            spritesCopy[n] = new Sprite(x, y, speedX, speedY, 30, 30, "", blnBounceX, blnBounceY, true, "white", "");
            sprites[n].alive = false;
            spritesCopy[n].alive = false;
        }
    }
    startCouples();
    move();
}

function startCouples()
{
    g_livingPairs = g_pairsMax;
    for (var i = 1; i <= g_pairsLimit * 2; i++) {
        for (var j = 1; j <= 2; j++) {
            sprites[i].x = rand(20, g_maxX - 50);
            sprites[i].y = rand(20, g_maxY - 50);
            sprites[i].speedX = rand(-maxSpeed, maxSpeed);
            sprites[i].speedY = rand(-maxSpeed, maxSpeed);
            sprites[i].borderColor = "white";
            sprites[i].alive = i <= g_pairsMax * 2;
            spritesCopy[i].alive = !sprites[i].alive;
        }
    }
}

function move()
{
    for (var i = 1; i <= g_spriteCounter; 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.alive)
    {
        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;
        }
    
        if (sprite.borderColor != spriteCopy.borderColor) {
            sprite.ref.style.borderColor = sprite.borderColor;
            spriteCopy.borderColor = sprite.borderColor;
        }
    }

    if (sprite.alive != spriteCopy.alive) {
        sprite.ref.style.display = (sprite.alive) ? "block" : "none";
        spriteCopy.alive = sprite.alive;
    }

}

function Sprite(x, y, speedX, speedY, sizeX, sizeY, sColor, blnBounceX, blnBounceY, isCopy, sBorderColor, sId)
{
    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;
    this.borderColor = sBorderColor;
    this.alive = true;

    if (!isCopy) {
        this.ref = document.getElementById(sId);
    }
}

function rand(min, max)
{
    return Math.round( Math.random() * ( max - min ) ) + min;
}

function showElm(id)
{
    var elm = document.getElementById(id);
    if (elm) { elm.style.display = "block"; }
}

function hideElm(id)
{
    var elm = document.getElementById(id);
    if (elm) { elm.style.display = "none"; }
}
