var runTimers = (function() {
    ////////////////////////////
    /// EDIT PARAMETERS HERE ///
    ////////////////////////////

    // Parameters for timers, each object is another timer.
    var aTimers = [
        { name: 'Guitar Hero: Warriors of Rock', date: 'September 28, 2010 00:00:00 EDT', interval: 106 },
        { name: 'Rock Band 3', date: 'October 26, 2010 00:00:00 EDT', interval: 106 },
        { name: 'DJ Hero 2', date: 'October 19, 2010 00:00:00 EDT', interval: 106 }
    ];

/*
    var aTimers = [
        { name: 'Green Day: Rock Band', date: 'June 8, 2010 00:00:00 EST', interval: 106 }
    ];
*/

    // Change to the timer div id, whatever it may be.
    var sTimerDivId = "timers";

    ///////////////////////////////
    /// LEAVE ALL OF THIS ALONE ///
    ///////////////////////////////

    // Constants that should never be changed
    var TIME_MULTIPLIER = [1000, 60, 60, 24];

    var displayTimeLeft = function (oTimer) {
        var iTimeLeft,
            out,
            now = new Date();

        iTimeLeft = oTimer.date - now;

        if (iTimeLeft <= 0) {
            out = "IN STORES NOW!";
            clearInterval(oTimer.intervalId);
        }
        else {
            out = getTimeText(iTimeLeft);
        }

        oTimer.timeLeftEl.innerHTML = out;
    }

    var prepareTimers = function() {

        var oTimer,
            timerDiv = document.getElementById(sTimerDivId),
            timerHtml = [];

        for (var a = 0; a < aTimers.length; a++) {
            // Do some pre-processing for each timer
            oTimer = aTimers[a];
            oTimer.date = new Date(oTimer.date);
            oTimer.elementId = "timeleft_" + a;
            oTimer.intervalId = "interval_" + a;

            // Build up the div's html
            timerHtml[timerHtml.length] = '<div><table><tr><td><span class="bold underline">';
            timerHtml[timerHtml.length] = oTimer.name;
            timerHtml[timerHtml.length] = '</span>: </td><td><span id="';
            timerHtml[timerHtml.length] = oTimer.elementId;
            timerHtml[timerHtml.length] = '" class="red bold"></span></td></tr></table></div>';
        }

        // Configure display
        timerDiv.innerHTML = timerHtml.join('');
        
        // Run after a timeout to avoid race conditions.
        var startTimers = function() {
            for (var a = 0; a < aTimers.length; a++) {
                var oTimer = aTimers[a];
                oTimer.timeLeftEl = document.getElementById(oTimer.elementId);
                var run = (function() {
                    var timer = oTimer;
                    return function() {
                               displayTimeLeft(timer);
                           };
                })();
                oTimer.intervalId = setInterval(run, oTimer.interval);
            }
        }
        setTimeout(startTimers, 0);
    }

    var getTimeText = function (p_iTime)
    {
        var time = [],
            interval = p_iTime,
            outText = [];

        // Calculate the time
        for (var i = 0; i < TIME_MULTIPLIER.length; i++)
        {
            time[i] = interval % TIME_MULTIPLIER[i];
            interval = Math.floor(interval / TIME_MULTIPLIER[i]);
        }
        time[time.length] = interval;

        // Generate the output text
        formatDatePart(time[4], "day", outText, true);
        formatDatePart(time[3], "hr", outText, true);
        formatDatePart(time[2], "min", outText, true);
        formatDatePart(time[1] + "." + padNumber(time[0], 3), "sec", outText, false);

        return outText.join("");
    }

    var formatDatePart = function(p_nVal, p_sName, p_aOut, p_bAddComma)
    {
        if (p_nVal > 0)
        {
            p_aOut[p_aOut.length] = p_nVal;
            p_aOut[p_aOut.length] = " ";
            p_aOut[p_aOut.length] = p_sName;
            p_aOut[p_aOut.length] = (p_nVal != 1) ? "s" : "";
            p_aOut[p_aOut.length] = (p_bAddComma) ? ", " : "";
        }
    }

    var padNumber = function(p_nNum, p_nPadding)
    {
        var sNum = p_nNum + "",
            zeroes = [],
            len;

        for (len = sNum.length; len < p_nPadding; len++)
        {
            zeroes[zeroes.length] = '0';
        }
        zeroes[zeroes.length] = sNum;

        return zeroes.join('');
    }

    return prepareTimers;
})();
