// 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();

// 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)
{
    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;
}

function prepare_timer(id, interval, trigger, add)
{
    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;
}

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(Math.max(0, 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 stop_timer(id, run_trigger)
{
    if(!timers[id])
        return;

    myClearInterval(timers[id]['interval']);
    if(run_trigger)
        eval(timers[id]['trigger']);

    timers[id] = null;
}
