function Dump(d,l) {
    if (l == null) l = 1;
    if (l > 4) return s;
    if (typeof(d) == "object") {
        s += typeof(d) + " {\n";
        for (var k in d) {
            for (var i=0; i<l; i++) s += "  ";
            s += k+": " + Dump(d[k],l+1);
        }
        for (var i=0; i<l-1; i++) s += "  ";
        s += "}\n"
    } else {
        s += "" + d + "\n";
    }
    return s;
}

function get_size_str(bytes_cnt)
{
     if (bytes_cnt < 1024)
     {
          return bytes_cnt + 'Bytes';
     }

     if (bytes_cnt > 1024*1024)
     {
          return Math.round(bytes_cnt/(1024.0*1024.0)*100)/100 + 'Mb';
     }
     return Math.round(bytes_cnt/(1024.0)*100)/100 + 'Kb';
}

function zero_pad(str)
{
     if (str.length < 2)
     {
          return '0' + str;
     }
     return str;
}

function get_time_str(seconds_cnt)
{
     hours = Math.floor(seconds_cnt/3600);
     minutes = Math.floor((seconds_cnt % 3600)/60);
     seconds = Math.floor((seconds_cnt % 3600)%60);
     return zero_pad(hours.toString())+':'+zero_pad(minutes.toString())+':'+zero_pad(seconds.toString());
}

function progress_bar_parse_str(str)
{
     result = new Object();
     strings = str.split(":");
     for (i = 0; i < strings.length; i++)
     {
          if (strings[i].length < 3)
          {
               continue;
          }
          components = strings[i].split('=');
          result[components[0]] = Math.floor(components[1]);
     }
     return result;
}
////////////////////////////////////////////////////////////////////////////
var pbn_start_time = 0;
var pbn_last_time  = 0;
var pbn_last_size  = 0;
function progress_bar_now()
{
     var d = new Date();
     return Math.round(d.getTime()/1000);
}

function progress_bar_nginx_start()
{
     pbn_start_time = progress_bar_now();
     pbn_last_time  = pbn_start_time;
     pbn_last_size  = 0;
}

function progress_bar_nginx_data(data)
{
     var d = new Date();
     //data = eval(str);
     result = new Object();
     
     if ('done' == data.state)
     {
          result.is_done = true;
     }
     if ('uploading' != data.state)
     {
          result.no_file = true;
          return result;
     }

     result.bytes_uploaded = data.received;
     result.bytes_total    = data.size;
     result.time_last      = progress_bar_now();
     result.time_start     = pbn_start_time;
     result.est_sec        = 40;

     result.speed_last     = Math.round((result.bytes_uploaded - pbn_last_size)/(result.time_last - pbn_last_time));
     result.speed_average  = Math.round(result.bytes_uploaded/(result.time_last - pbn_start_time));
     result.est_sec        = Math.round(result.bytes_total - result.bytes_uploaded)/result.speed_average;
     
     pbn_last_time = result.time_last;
     pbn_last_size = result.bytes_uploaded;
     return result;
}
////////////////////////////////////////////////////////////////////////////

var on_done_func = function(text) {alert(text)};
var g_script_span = null;
function req_send(url, on_done)
{
     on_done_func = on_done;
     with (document)
     {
            var span = null;
            // Oh shit! Damned stupid fucked Opera 7.23 does not allow to create SCRIPT 
            // element over createElement (in HEAD or BODY section or in nested SPAN - 
            // no matter): it is created deadly, and does not respons on href assignment.
            // So - always create SPAN.
            span = body.appendChild(createElement("SPAN"));
            span.style.display = 'none';
            span.innerHTML = 'Text for stupid IE.<s'+'cript></' + 'script>';
            setTimeout(function() 
               {
                    var s = span.getElementsByTagName("script")[0];
                    s.language = "JavaScript";
                    if (s.setAttribute) s.setAttribute('src', url); else s.src = url;
               }, 10);
            g_script_span = span;
      }
}

function req_clear()
{
     // Remove last used script element (clean memory).
     var span = g_script_span;
     if (span) 
     {
          g_script_span = null;
          setTimeout(function() 
               {
                    // without setTimeout - crash in IE 5.0!
                    span.parentNode.removeChild(span);
               }, 50);
     }
     return false;
}

function req_send_get_worker_frame()
{
     var name   = 'subdomain_ajax_loader_iframe'
     var result = document.getElementById(name);
     if (result)
     {
          return result;
     }
     result = document.createElement('IFRAME');
     result.id = name;
     result.style.height = 0;
     result.style.width  = 0;
     result.style.border = 'none';
     document.getElementsByTagName('BODY')[0].appendChild(result);
     return result;
}

function req_send_get_domain(url)
{
     var reg = /http:\/\/([^\/]+)/
     var arr = reg.exec(url);
     if (!arr)
     {
          return false;
     }
     return arr[1];
}

function req_send_subdomain(url, on_done)
{
     var f = req_send_get_worker_frame();
     var request_url = 'http://'+req_send_get_domain(url) + '/ajax/callbacker.htm?';
     request_url += 'url='+escape(url)+'&callback='+escape(on_done)+'&domain='+escape(document.domain);
     f.src = request_url;
}
///////////////////////////////////////////////////////////////////////////
