var g_open1 = 0;
var g_open2 = 0;
var g_open1_card = 0;
var g_open2_card = 0;
var g_locked = new Array();
var g_success = new Array();
var g_moves = 0;
var g_pairsFound = 0;
var g_sMoves = '';
var g_secondsDelayForHiding = 600;
var g_opened = new Array();
var associates = new Array();

var g_blockSize = 32;
var maxStars = 8;
var starsAnimation = 0;
var starsAnimationEnd = 80;
var star = new Array();

function init_cards(sTime, sMoves) {
    g_sMoves = sMoves;
    for (i = 0; i <= 100; i++) {
        g_locked[i] = 0;
    }
    initStars();
}

function initStars() {
    for (var i = 0; i < maxStars; i++) {
        star[i] = new Sprite();
    }
}

function hoverCard(i) {
    if (!g_locked[i]) {
        var elm = document.getElementById('card' + i);
        elm.style.MozOpacity = '.7';
        elm.style.borderColor = 'rgb(48,125,4)';
    }
}

function unhoverCard(i) {
    if (!g_locked[i]) {
        var elm = document.getElementById('card' + i);
        elm.style.MozOpacity = '1';
        elm.style.borderColor = 'rgb(255,255,255)';
    }
}

function clickCard(i, card, x, y) {
    if (!g_locked[i]) {
        increaseMoves();

        var elm = document.getElementById('card' + i);
        elm.style.MozOpacity = '1';

        if (g_open2 != 0) {
            resetOpenCards();
        }

        if (g_open1 == 0) {
            g_open1 = i;
            g_open1_card = card;
            showCard(i, card);
            g_locked[i] = true;
        }
        else if (g_open2 == 0) {
            stopAnimation(g_open1);
            g_open2 = i;
            g_open2_card = card;
            showCard(i, card);
            g_locked[i] = true;
    
            if (g_open1_card == g_open2_card) {
                g_pairsFound++;
                revealCard(g_open1, g_open1_card);
                revealCard(g_open2, g_open2_card);
                g_success[g_open1] = true;
                g_success[g_open2] = true;
                g_open1 = 0;
                g_open2 = 0;
                g_open1_card = '';
                g_open2_card = '';
                var didWin = checkWin();
                if (didWin) {
                    showWinningAnimation();
                }
                else {
                    showAnimation(x, y);
                }
            }
        }
    }
}

function handleStop(i) {
    stop();
    stopAnimation(i);
    if (g_open1 != 0 && g_open2 != 0) {
        resetOpenCards();
    }
}

function handlePlay(i, asin) {
    if (i != g_open1) { stopAnimation(g_open1); }
    else if (i != g_open2) { stopAnimation(g_open2); }

    startAnimation(i);
    play_asin(asin);
}

function stopAnimation(i) {
    if (!g_success[i]) {
        var elm = document.getElementById('soundAnimation' + i);
        if (elm) { elm.src = 'image/no-sound.png'; }
    }
}

function startAnimation(i) {
    if (!g_success[i]) {
        var elm = document.getElementById('soundAnimation' + i);
        if (elm) { elm.src = 'image/sound-animation.gif'; }
    }
}

function revealCard(i, card) {
    var asin = getAsinFromCard(card);
    var guid = getGuidFromCard(card);
    var associate = getRandomAssociate();
    var imageUrl = 'image/' + guid + '.jpg';

    var infoUrl = 'http://www.amazon.com/gp/product/' + asin + '?' +
            'ie=UTF8&tag=' + associate.tag + '&linkCode=as2&camp=' + associate.camp + '&creative=390957&creativeASIN=' + asin;
    var s = '<a href="' + infoUrl + '" target="_blank"><img src="' + imageUrl + '" alt="" class="soundAnimation" id="soundAnimation' + i + '" /></a>' +
            '<div class="overlay" id="overlay' + i + '" style="margin-top: 44px">' +
            '<a href="javascript:handleStop(' + i + ')"><img src="image/stop.png" alt="stop" /></a> &nbsp;' +
            '<a href="javascript:handlePlay(' + i + ',' + "'" + asin + "'" + ')"><img src="image/play.png" alt="play" /></a>' +
            '<span class="songInfo"><a href="' + infoUrl + '" target="_blank">song info at Amazon</a></span></div>'
    var elm = document.getElementById('card' + i);
    elm.innerHTML = s;
}

function getRandomInt(min, max) {
    return Math.floor( ( (max + 1 - min) * Math.random() ) + min );
}

function increaseMoves() {
    g_moves++;
    var elm = document.getElementById('moves');
    elm.innerHTML = g_sMoves + " " + g_moves;

    elm = document.getElementById('movesValue');
    elm.value = g_moves;
}

function checkWin() {
    var didWin = false;
    if (g_pairsFound == 10) {
        var elm = document.getElementById('wins');
        elm.value = 1;
        showElm('continueButton');
        didWin = true;
    }
    return didWin;
}

function resetOpenCards() {
    hideCard(g_open1);
    hideCard(g_open2);
    g_locked[g_open1] = false;
    g_locked[g_open2] = false;

    g_open1 = 0;
    g_open2 = 0;
    g_open1_card = 0;
    g_open2_card = 0;
}

function showCard(i, card) {
    var asin = getAsinFromCard(card);
    var s = '<img src="image/sound-animation.gif" alt="" class="soundAnimation" id="soundAnimation' + i + '" />' +
            '<div class="overlay" id="overlay' + i + '">... listen ...<br /><span class="memorize">... memorize ...</span><br /><br />' +
            '<a href="javascript:handleStop(' + i + ')"><img src="image/stop.png" alt="stop" /></a> &nbsp;' +
            '<a href="javascript:handlePlay(' + i + ',' + "'" + asin + "'" + ')"><img src="image/play.png" alt="play" /></a></div>'
    play_asin(asin);
    setHtml('card' + i, s);
}

function getGuidFromCard(card) {
    var guidAsin = card.split('_');
    return guidAsin[0];
}

function getAsinFromCard(card) {
    var guidAsin = card.split('_');
    return guidAsin[1];
}

function hideCard(i) {
    var elm = document.getElementById('card' + i);
    elm.style.MozOpacity = '1';
    elm.style.borderColor = 'rgb(255,255,255)';
    setHtml('card' + i, '&nbsp;');
}

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'; }
}

function setHtml(id, s) {
    var elm = document.getElementById(id);
    if (elm) { elm.innerHTML = s; }
}

function verboseBool(b) {
    return b ? 'true' : 'false';
}

function getRandomAssociate() {
    if (associates.length == 0) {
        var i = 0;
        associates[i] = new Associate();
        associates[i].tag = 'soundory-20';
        associates[i].camp = '1789';

        i++;
        associates[i] = new Associate();
        associates[i].tag = 'bomomo09-20';
        associates[i].camp = '1789';
    }

    var randomI = getRandomInt(0, associates.length - 1);
    return associates[randomI];
}

function Associate() {
    this.tag = '';
    this.camp = '';
}

function showWinningAnimation() {
    if (starsAnimation == 0) {
        starsAnimation++;
        for (var i = 0; i < maxStars; i++) {
            star[i].gravity = 0;
            star[i].speedMax = 8;
            star[i].fadeStep = 1;
            star[i].x = 350 + getRandomInt(-12, 12);
            star[i].y = 240 + getRandomInt(-12, 12);
            star[i].speedX = getRandomInt(-15, 15);
            star[i].speedY = getRandomInt(-15, 15);
            star[i].show();
        }
        setTimeout("continueAnimation()", 35);
        g_winningAnimation = setTimeout("showWinningAnimation()", 5 * 1000);
    }
    else {
        g_winningAnimation = setTimeout("showWinningAnimation()", 5 * 1000);
    }
}

function showAnimation(x, y) {
    if (starsAnimation == 0) {
        starsAnimation++;
        for (var i = 0; i < maxStars; i++) {
            star[i].x = x - 32 / 2;
            star[i].y = y - 32 / 2;
            star[i].speedX = getRandomInt(-8, 8);
            star[i].speedY = getRandomInt(-8, 8);
            star[i].show();
        }
        setTimeout("continueAnimation()", 35);
    }
}

function continueAnimation() {
    if (++starsAnimation < starsAnimationEnd) {
        for (var i = 0; i < maxStars; i++) {
            star[i].opacity -= star[i].fadeStep;
            star[i].move();
            star[i].render();
        }
        setTimeout("continueAnimation()", 35);
    }
    else {
        for (var i = 0; i < maxStars; i++) {
            star[i].hide();
        }
        starsAnimation = 0;
    }
}
