g_var_progress_bar      = -1;
g_status_text           = [null];
g_status_timer          = [-1.0];

//-------------------------------------------------------------------------
// PROGRESS BAR STATUS FUNCTIONS
//-------------------------------------------------------------------------

//Update the actual progress bar
function UpdateProgressBarValue(new_status, new_value, new_max)
{
    var progress_bar = GetProgressBar();
    if (progress_bar)
    {
        if (new_value != undefined && new_max != undefined)
        {
            if (progress_bar.value < 0)
                g_var_progress_bar = -1;
            var loading_text = new_status + '[' + (Math.min(1.0, new_value / new_max) * 100.0).toFixed(0) + '%]';
            //update the progress status
            progress_bar.max = new_max;
            progress_bar.value = new_value;
            g_var_progress_bar = AddTextStatus(loading_text, g_var_progress_bar);
        }
        //Load length is not usable
        else
        {
            if (progress_bar.value > 0)
                g_var_progress_bar = -1;
            progress_bar.value = -1;
            g_var_progress_bar = AddTextStatus(new_status, g_var_progress_bar);
        }
        //Force Status text update for coherency
        UpdateTextStatus(0.0);
    }
}

//Add text status to the stack
function GetMaxStatusTime(min_value)
{
    var higher_time = (min_value) ? (min_value) : (0.0);
    for (var i = 0; i < g_status_timer.length; i++)
        if (g_status_timer[i])
            higher_time = Math.max(higher_time, g_status_timer[i]);
}

//Update progress bar status
function UpdateTextStatus(seconds)
{
    var div_progress_status = GetDivProgressStatus();
    if (div_progress_status)
    {
        div_progress_status.innerHTML = '';
        for (var i = 0; i < g_status_text.length; i++)
        {
            if (g_status_timer[i] == undefined || g_status_timer[i] < 0.0)
            {
                g_status_timer[i] = -1.0;
                g_status_text[i] = undefined;
            }
            else
            {
                g_status_timer[i] -= seconds;
                div_progress_status.innerHTML += g_status_text[i];
                //div_progress_status.innerHTML += '[' + g_status_timer[i].toFixed(2) + ']';
                if (i < g_status_text.length - 1)
                    div_progress_status.innerHTML += '<br>';
            }
        }
        window.setTimeout("UpdateTextStatus(0.1)", 100);
    }
}

//Add text status to the stack
function AddTextStatus(message, message_id)
{
    var msg_timer = 2.0;
    if (message_id == undefined || message_id < 0)
    {
        g_status_text[g_status_text.length] = message;
        g_status_timer[g_status_timer.length] = GetMaxStatusTime(msg_timer) + 0.5;
        return g_status_timer.length - 1;
    }
    else
    {
        g_status_text[message_id] = message;
        g_status_timer[message_id] = msg_timer;
        return message_id;
    }
}

//Hide Progress Status and empty status texts
function HideProgressStatus(should_hide)
{
    var progress_bar = GetProgressBar();
    var div_progress = GetDivProgress();
    if (div_progress && progress_bar)
    {
        if (should_hide == true)
        {
            div_progress.style.visibility = "hidden";
            div_progress.style.zIndex = "-999";
            g_status_text.splice(0, g_status_text.length);
            g_status_timer.splice(0, g_status_timer.length);
            progress_bar.value = -1;
            UpdateTextStatus(1.0);
        }
        else
        {
            div_progress.style.visibility = "visible";
            div_progress.style.zIndex = "999";
            progress_bar.value = -1;
            AddTextStatus('Please wait for module loading');
            UpdateTextStatus(1.0);
        }
    }
}