var host = "http://superflac.com/cgi-bin/";

function HttpConnection(url, method, messageObject, contentType) {
    this.url = url;
    this.contentType = contentType;
    this.method = method;
    this.messageObject = messageObject;
    this.responseHandler = null;
    this.invalidResponseHandler = null;
    this.disposed = false;
};

HttpConnection.prototype.connect = function() {
  if (!this.responseHandler) {
    throw "HttpConnection response handler not set.";
  }
  var usingActiveXObject = false;
  if (window.XMLHttpRequest) {
    this.xmlHttpRequest = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) {
    usingActiveXObject = true;
    this.xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else {
    throw "Connect failed: Cannot create XMLHttpRequest.";
  }
  var instance = this;
  this.xmlHttpRequest.onreadystatechange =
    function() {
      if (!instance) {
        return;
      }
      try {
        instance.processReadyStateChange();
      }
      finally {
        if (instance.disposed) {
          instance = null;
        }
      }
    }
  ;
  this.xmlHttpRequest.open(this.method, this.url, true);
  if (this.contentType && (usingActiveXObject || this.xmlHttpRequest.setRequestHeader)) {
    this.xmlHttpRequest.setRequestHeader("Content-Type", this.contentType);
  }
  this.xmlHttpRequest.send(this.messageObject ? this.messageObject : null);
};
HttpConnection.prototype.dispose =
  function() {
    this.messageObject = null;
    this.responseHandler = null;
    this.invalidResponseHandler = null;
    this.xmlHttpRequest = null;
    this.disposed = true;
  }
;
HttpConnection.prototype.getResponseText =
  function() {
    return this.xmlHttpRequest ? this.xmlHttpRequest.responseText : null;
  }
;
HttpConnection.prototype.getResponseXml = 
  function() {
    return this.xmlHttpRequest ? this.xmlHttpRequest.responseXML : null;
  }
;
HttpConnection.prototype.processReadyStateChange = 
  function() {
    if (this.disposed) {
      return;
    }
    if (this.xmlHttpRequest.readyState == 4) {
      if (this.xmlHttpRequest.status == 200) {
        if (!this.responseHandler) {
          this.dispose();
          throw "HttpConnection response handler not set.";
        }
        this.responseHandler(this);
        this.dispose();
      } 
      else {
        if (this.invalidResponseHandler) {
          this.invalidResponseHandler(this);
          this.dispose();
        }
        else {
          var statusValue = this.xmlHttpRequest.status;
          this.dispose();
          throw "Invalid HTTP Response code (" + statusValue + ") and no handler set.";
        }
      }
    }
  }
;
HttpConnection.nullMethod = function() { };

function ProcessData(con) {
  try{
    var t = con.getResponseText();
    var res = t.split(" ");
    if (res.length > 2) {
      var doConnection = false;
      if (res[1] != res[2]) doConnection = true;

      if (res[2] == '-1') {
        Get("stat").innerHTML = '';
      }
      else {
        ShowProgressBar(res, !doConnection);
      }

      if (doConnection) { setTimeout("DoConnection(0)",250);}
    }
  } 
  catch (exception) {
    for (attribute in exception)
      log(attribute +'='+exception[attribute]);
  }
}

function ErrorProcessData(con) {
    log('ErrorProcessData!');
}


function DoConnection(start) {
    var sid = document.upload.sessionid.value;
    con = new HttpConnection(host+'progress.cgi?sid='+sid+'&start='+start, 'GET', null, 'text/html');
    con.responseHandler = ProcessData;
    con.invalidResponseHandler = ErrorProcessData;
    con.connect();
}

var start_time = 0;
var time = 0;
var read = 0;

function ShowProgressBar(res, finished) {
    var curr_time = new Date().getTime();
    var curr_read = res[1];
    var dt = curr_time - time;
    var dr = curr_read - read;
    var speed = 0;
    var total = res[2];

    if (finished) {
        dt = curr_time - start_time;
        dr = total;
    }

    if (dt > 0) {
        speed = dr/dt;
    }

    time = curr_time;
    read = curr_read;

    Get("stat").innerHTML = Math.round(read/10485.76)/100 +' MB / ';
    Get("stat").innerHTML += Math.round(total/10485.76)/100 +'MB';
    Get("stat").innerHTML += '&nbsp; &nbsp; &nbsp;('+Math.round(speed/1.024)+' KB/s)';

    var total_width = 300;
    Get("inner_bar").style.width = Math.floor(read/total*total_width) + 'px';

    Get("upload_bar").className = "unhidden";

    if (finished) {
      Get("stat").innerHTML = 'finished';
    }
}

function filesExist() {
  for(i=0; i<document.upload.elements.length; i++) {
    if (document.upload.elements[i].type == "file")
      if (document.upload.elements[i].value != '')
        return true;
  }
  return false;
}

function disableAllFormElements() {
  for(i=0; i<document.upload.elements.length; i++) {
    if (document.upload.elements[i].type != "hidden")
      document.upload.elements[i].disabled = 'true';
  }
}

function getUploadProgress(this_url) {

   if(typeof window.objectFormValidator == 'function') {
      if (! objectFormValidator(document.upload))
        return false;
    }

    if (filesExist()) {
      start_time = time = new Date().getTime();
      read = 0;
      Get("stat").innerHTML = "";
      document.upload.submit();
      disableAllFormElements();
      setTimeout("DoConnection(1)", 1);
    }
    else {
      document.upload.action = this_url;
      document.upload.submit();
      return true;
    }
}

function Get(elem) { return document.getElementById(elem); }

function Log(text) { log(text); }

function log(text) {
    Get("log").innerHTML = text+"<br>"+Get("log").innerHTML;
//    Get("log").innerHTML += "<br>"+text;

    Get("log").innerHTML = Get("log").innerHTML.substring(0,5120);
}

function turnOn (elem) {
    Get(elem).className = 'unhidden';
}

function hide (elem) {
    Get(elem).className = 'hidden';
}

function toggleDisplay (elem) {
  $current = Get(elem).className;
  if ($current == 'hidden') {
    Get(elem).className = 'unhidden';

  }
  else {
    Get(elem).className = 'hidden';
  }
}

function toggleDisplayAdvanced (elem, link, link_text_unhidden, link_text_hidden) {
  $current = elem.className;
  if ($current == 'hidden') {
    elem.className = 'unhidden';
    link.innerHTML = link_text_hidden;
  }
  else {
    elem.className = 'hidden';
    link.innerHTML = link_text_unhidden;
  }
}

function linkTarget (elem) {
  return Get(stripText("link_", elem.id));
}

function stripText (text, target) {
  return target.substring(text.length, target.length);
}

var num_upload_slots = [];

function tagElements (elem, tag1, tag2) {

  var children = new Array(3);
  children[0] = elem.getElementsByTagName("input");
  children[1] = elem.getElementsByTagName("textarea");
  children[2] = elem.getElementsByTagName("select");
  children[3] = elem.getElementsByTagName("div");
  children[4] = elem.getElementsByTagName("span");

  for(var i=0; i < children.length; i++) {
    for(var j=0; j < children[i].length; j++) {
      if (children[i][j].id != "") {
        children[i][j].id = children[i][j].id + "[" + tag1 + "][" + tag2 + "]";
      }
      else if (children[i][j].name != "") {
        children[i][j].id = children[i][j].name + "[" + tag1 + "][" + tag2 + "]";
        children[i][j].name = children[i][j].name + "[" + tag1 + "][" + tag2 + "]";
      }
    }
  }
}

function duplicateGroups() {
  var elem;
  for(var i=0; elem = document.getElementById("group[" + i + "]"); i++) {
    elem.className = "hidden";
    num_upload_slots[i] = 0;
    addUploadSlot(i, elem.id);
  }
}

function addUploadSlot(group_num, id) {

  var form_footer = Get("form_footer");
  var footer_parent = form_footer.parentNode;
  form_footer = footer_parent.removeChild(form_footer);

  var group = Get(id);
  var new_upload_slot = group.cloneNode(true);
  var group_parent = group.parentNode;
  group = group_parent.removeChild(group);

  group_parent.appendChild(new_upload_slot);
  new_upload_slot.className = "unhidden";
  new_upload_slot.id = "group[" + group_num + "][" + num_upload_slots[group_num] + "]";
  new_upload_slot.name = new_upload_slot.id;
  tagElements(new_upload_slot, group_num, num_upload_slots[group_num]);

  group_parent.appendChild(group);   // append the original back on

  footer_parent.appendChild(form_footer);  // append the footer back on
  num_upload_slots[group_num]++;
}

function getGroupNum (id) {
  var begin = id.indexOf("[");
  var end = id.indexOf("]");
  return id.substr(begin+1, (end - begin - 1));
}

function getPrefix (str) {
  var end = str.indexOf("[");
  return str.substr(0, end) + "[" + getGroupNum(str) + "]";
}

function updateFileSlots(elem) {
  var num_used_slots = 0;
  var candidates = document.getElementsByTagName(elem.tagName);
  var group_num = getGroupNum(elem.name);
  for(var i=0; i < candidates.length; i++) {
    if (getPrefix(candidates[i].name) == getPrefix(elem.name) && candidates[i].value != "")
      num_used_slots++;
  }

  if (num_used_slots >= num_upload_slots[group_num])
    addUploadSlot(group_num, "group[" + group_num + "]");
}

function isColor(color) {
  if (color.length != 6)
    return false;

  var valid_hex = "0123456789ABCDEFabcdef";
  for (var i=0; i < 6; i++) {
    if (valid_hex.indexOf(color.charAt(i)) == -1)
      return false;
  }
  return true;
}







