// fix for firefox bug #234016 (https://bugzilla.mozilla.org/show_bug.cgi?id=234016)
var intlist = [];
var intrate = 500;
var intids = 0;

setInterval('checkint()', intrate);
function mySetInterval(fn,t)
{
    intlist[intids] = [fn, 0, t];
    return intids++;
}

function myClearInterval(id)
{
    intlist[id] = null;
}

function checkint()
{
    for(var i = 0; i < intlist.length; i++)
    {
        if(intlist[i] == null)
            continue;

        intlist[i][1] += intrate;
        if(intlist[i][1] >= intlist[i][2])
        {
            intlist[i][1] %= intlist[i][2];
            eval(intlist[i][0]);
        }
    }
}
// fix end



var timers = new Array();
var prepared_timers = new Array();
var originalPagetitle = '';

// id must be unique for each timer and there must be an element named timer_ID
// interval is the time after which the timer is finished
// trigger can be javascript code which will be eval'd when the timer is finished
// add can be a value that will be added to the displayed remaining time
function start_timer(id, interval, trigger, add, showintaskbar)
{
    if(interval <= 0) // invalid interval
        return;

    timers[id] = new Array();
    timers[id]['time'] = interval;
    timers[id]['interval'] = mySetInterval('inc_timer("'+id+'")', 1000);
    timers[id]['trigger'] = trigger;
    timers[id]['add'] = add ? add : 0;
    timers[id]['showintaskbar'] = showintaskbar ? true : false;
    originalPagetitle = 'Emperor';
}

function prepare_timer(id, interval, trigger, add, showintaskbar)
{
    if(interval <= 0)
    {
        showError("cannot prepare timer "+id+" with interval "+interval);
        return;
    }
        
    prepared_timers[id] = new Array();
    prepared_timers[id]['time'] = interval;
    prepared_timers[id]['trigger'] = trigger;
    prepared_timers[id]['add'] = add ? add : 0;
    prepared_timers[id]['showintaskbar'] = showintaskbar ? true : false;
    originalPagetitle = 'Emperor';
}

function enable_timer(id)
{
    if(!prepared_timers[id])
    {
        showError("cannot enable invalid timer "+id);
        return;
    }
    
    timers[id] = prepared_timers[id];
    timers[id]['interval'] = mySetInterval('inc_timer("'+id+'")', 1000);
    prepared_timers[id] = null;
}

function inc_timer(id)
{
    if(timers[id] == null)
    {
        showError("invalid timer: "+id);
        return;
    }
    
    timers[id]['time']--;
    if(timers[id]['time'] >= 0)
    {
        var elem = document.getElementById('timer_'+id);
        if(elem) {
            elem.innerHTML = formatSeconds(timers[id]['time'] + timers[id]['add'], true);
            if(timers[id]['showintaskbar'] == true) {
            	document.title = originalPagetitle + ' [' + formatSeconds(timers[id]['time'] + timers[id]['add'], true) + ']';
            }
        } else {
            timers[id]['time'] = 0;
            // should we run the trigger code in this case or not? currently we do...
        }
    }

    if(timers[id]['time'] <= 0)
    {
        myClearInterval(timers[id]['interval']);
        if(timers[id]['trigger'])
            eval(timers[id]['trigger']);

        timers[id] = null;
    }
}

function formatSeconds(seconds, showDays)
{
    var days    = seconds >= 86400 ? Math.floor(seconds / 86400) : 0;
    seconds -= days * 86400;

    var hours   = seconds >= 3600  ? Math.floor(seconds / 3600)  : 0;
    seconds -= hours * 3600;

    var minutes = seconds >= 60    ? Math.floor(seconds / 60)    : 0;
    seconds -= minutes * 60;

    seconds = seconds >= 60    ? seconds % 60       : seconds;

    if(!showDays)
        hours += days * 24;

    var formatted = '';
    if(showDays && days)
        formatted += days+':';

    if(hours || (showDays && days))
        formatted += (hours < 10 ? "0" + hours : hours) + ":";

    formatted += (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);

    return formatted;
}