//var req;
var url = "/progress";
var sessionId;
var cycle_count = 0;
var probe_limit = 2;
var average_rate_value = 1;
var average_bytes_rate_value = 1;
var old_eta = 1;
var sum_rate_value = 0;
var transmission_started = 0;
var percent_value = 0;
var old_bytes_value = 1;
var bytes_so_far = 0;
var requestDelay = 500;
var initRequestDelay = 500;
var old_time_value = new Date().getTime();
var lang_complete;
//var lang_error_nofile;

var sta;

function cancelUpload()
{
    alert('stop button pressed');
}

function initTransfer(id, lang_upload_complete, lang_error_nofile, lang_file_uploaded)
{
    if (checkIfAny() == '1')
    {
        lang_complete = lang_upload_complete;
        //        lang_nofile = lang_error_nofile;
        sessionId = id;

        dialogBox(true, 'upload'); 
        document.getElementById('input_space').firstChild.disabled = true;
        document.getElementById('submit_file').onclick = '';
        document.getElementById('global_ovh').href = '#';
        document.getElementById('global_new').href = '#';

        document.getElementById('myForm').submit();
        //        alert(BrowserDetect.browser);
        if (no_progress_bar)
        {
            setTimeout('',2000);
            var p = document.getElementById('processing');
            p.parentNode.removeChild(p);  
            document.getElementById('progressSpace').style.display = 'inline';

            var child = document.getElementById("child");
            var compSpace = document.getElementById("progressSpace");
            var text = document.createTextNode(lang_file_uploaded);
            var textEl = document.createElement('p');
            compSpace.removeChild(child);
            textEl.appendChild(text);
            compSpace.appendChild(textEl);
        }
        else
        {
            setTimeout("pollTaskmaster()", initRequestDelay);
        }
    }
    else
    {
        alert(lang_error_nofile);
    }
}

function checkIfAny()
{
    var allFiles = getElementsByName_iefix('input', 'upload_filename');
    
    if (allFiles.length > 1)
    {
        return '1';
    }
    else
    {
        return '0';
    }
}

// uses prototype.js
function pollTaskmaster()
{
    // remove "processing files..." info and show progress space:

    try
    {
        new Ajax.Request(url, { method: 'post',
                                parameters: { id: sessionId },
                                on200: function(req){ processPollRequest(req); },
                                on204: function(){ setTimeout("pollTaskmaster()", requestDelay); },
                                on500: function(){ setTimeout("pollTaskmaster()", requestDelay); }
                                //on204: function(){ pollTaskmaster(); }
                              });
    }
    catch(e){};
}

function processPollRequest(req)
{
    try
    {  
    var p = document.getElementById('processing');
        p.parentNode.removeChild(p);  
        document.getElementById('progressSpace').style.display = 'inline';
    }
    catch(e){};

    try
    {
        var error = req.responseXML.getElementsByTagName("error")[0];
        var error_value = error.firstChild.nodeValue;
//        document.getElementById('status').innerHTML = error_value;
//
        
        if (error_value == 'client_abort')
        {
            alert('client canceled');
            //document.getElementById('child').innerHTML = 'Client aborted';  
        }

        if (error_value == 'retry')
        {
            if (transmission_started == 1)
            {
                myJsProgressBarHandler.setPercentage('uploadProgressBar', 100);
                setTimeout('complete(lang_complete)', 500);
            }
            setTimeout("pollTaskmaster()", requestDelay);
//            pollTaskmaster();
        }
        else
        {
            var filename = req.responseXML.getElementsByTagName("filename")[0];
            var filename_value = filename.firstChild.nodeValue;
            var bytes = req.responseXML.getElementsByTagName("bytes")[0];
            var bytes_value = parseInt(bytes.firstChild.nodeValue);
            var size = req.responseXML.getElementsByTagName("size")[0];
            var size_value = parseInt(size.firstChild.nodeValue);
            if (old_bytes_value > bytes_value)
            {
                bytes_so_far += bytes_value;
                old_bytes_value = 0;
            }
            else
            {
                bytes_so_far += (bytes_value - old_bytes_value);
            }
            transmission_started = 1;
            var percent_value = parseInt((bytes_so_far*100)/size_value);

            var time_value = new Date().getTime();
            var rate_value = (((bytes_value - old_bytes_value)/1024) / ((time_value - old_time_value)/1000)).toFixed(1);
            var bytes_rate_value = parseInt((bytes_value - old_bytes_value) / ((time_value - old_time_value)/1000));
            old_time_value = time_value;

            cycle_count++;
            sum_rate_value += bytes_rate_value;
//            if (cycle_count < probe_limit)
//            {
//            }
            if (!(cycle_count % probe_limit))
            {
                average_rate_value = ((sum_rate_value / probe_limit)/1024).toFixed(1);
                average_bytes_rate_value = sum_rate_value / probe_limit;
                sum_rate_value = 0;
                sta = 0;
            }
            else
            {
                average_bytes_rate_value = bytes_rate_value;
                sta = 1;
            }
            var eta = (size_value - bytes_so_far) / average_bytes_rate_value;
            
            var formatted_bytes_so_far = formatProgressSize(bytes_so_far, 2);
            var formatted_size = formatProgressSize(size_value, 2);
            var formatted_rate = (average_bytes_rate_value / 1024).toFixed(1);
            var formatted_eta = formatEta(eta);
                    
//                    document.getElementById('status').innerHTML = sta;
            formatted_filename_value = formatFilename(filename_value);
            myJsProgressBarHandler.setPercentage('uploadProgressBar', percent_value);
            document.getElementById('progressFilename').innerHTML = formatted_filename_value;
            document.getElementById('progressBytes').innerHTML = formatted_bytes_so_far;
            document.getElementById('progressSize').innerHTML = formatted_size;
            document.getElementById('progressRate').innerHTML = average_rate_value;
            document.getElementById('progressEta').innerHTML = formatted_eta;

            old_bytes_value = bytes_value;

            if (percent_value < 99)
            {   
                setTimeout("pollTaskmaster()", requestDelay);
//            pollTaskmaster();
            }
            else
            {
                myJsProgressBarHandler.setPercentage('uploadProgressBar', 100);
                setTimeout('complete(lang_complete)', 500);
            }
        }
    }
    catch(e){};
}

function complete(lang_complete)
{
    try
    {
    //    alert('complete');
        var child = document.getElementById("child");
        var compSpace = document.getElementById("progressSpace");
        var text = document.createTextNode(lang_complete);
        var textEl = document.createElement('p');
        compSpace.removeChild(child);
        textEl.appendChild(text);
        compSpace.appendChild(textEl);
    }
    catch(e){};
}

function formatProgressSize(size, afterColon)
{
    var formatted_size;
    // less than 1kB
    if (size < 1024)
    {
        new_size = size;
        formatted_size = new_size + ' B';
    }
    // between 1kB and 1MB
    if (size > 1024 && size < 1048576)
    {
        new_size = (size / 1024).toFixed(afterColon);
        formatted_size = new_size + ' kB';
    }
    // between 1MB and 1GB
    if (size > 1048576 && size < 1073741824)
    {
        new_size = (size / 1048576).toFixed(afterColon);
        formatted_size = new_size + ' MB';
    }
    // more than 1GB
    if (size > 1073741824)
    {
        new_size = (size / 1073741824).toFixed(afterColon);
        formatted_size = new_size + ' GB';
    }
    return formatted_size;
}

var old_hours = '0';
var old_minutes = '0';
var old_seconds = '0';

function formatEta(time)
{
    var hours = parseInt(time/3600);
    var minutes = parseInt((time%(3600))/60);
    var seconds = parseInt((time%(3600))%60);
    if (isNaN(hours))
    {
        hours = old_hours;
    }
    if (isNaN(minutes))
    {
        minutes = old_minutes;
    }
    if (isNaN(seconds))
    {
        seconds = old_seconds;
    }
    old_hours = hours;
    old_minutes = minutes;
    old_seconds = seconds;

    var formatted_time = hours + 'h ' + minutes + 'm ' + seconds + 's';
    return formatted_time;
}

function formatFilename(filename)
{
    // filenames in format: name
    re = /.*(\/|\\)(.*)$/;
    new_name = filename.replace(re, "$2");
    if(new_name.length > 20)
    {
        // filenames in format: name.ext
        reg = /^(.{15}).*(\..{1,4})$/;
        new_name = new_name.replace(reg, "$1[...]$2");
        if(new_name.length > 25)
        {
            reg = /^(.{20}).*$/;
            new_name = new_name.replace(reg, "$1[...]");
        }
    }
    return new_name;
}


