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) {

  var tag = getSuffix(elem.id);

  var children = new Array(5);
  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 + tag;
      }
      else if (children[i][j].name != "") {
        children[i][j].id = children[i][j].name + tag;
        children[i][j].name = children[i][j].name + tag;
      }
    }
  }
}

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 duplicateGroup(i) {
  var elem = document.getElementById("group[" + i + "]");
  num_upload_slots[i] = 0;
  addCategory(elem.parentNode);
}

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 getSuffix (id) {
  var begin = id.indexOf("[");
  if (begin >= 0)
    return id.substring(begin, id.length);
  else
    return "";
}

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

function getOriginalPrefix (str) {
  return str.substr(0, str.indexOf("["));
}


function getMainPrefix (str) {
  var end = str.indexOf("_");
  return str.substr(0, end);
}

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;
}


function remove (node) {
  var node_parent = node.parentNode;
  node_parent.removeChild(node);
}


function addItem(elem) {
  if (elem.id)
    elem_id = elem.id;
  else
    elem_id = "group[0]";

  var group = Get("group[1]");
  var new_upload_slot = group.cloneNode(true);
  var elem_parent = elem.parentNode;

  if (elem_parent.id)
    elem_parent_id = elem_parent.id
  else
    elem_parent_id = "group[1]";

  elem_parent.appendChild(new_upload_slot);
  new_upload_slot.className = "unhidden";
  new_upload_slot.id = elem_id + "[" + uniqid() + "]";
  new_upload_slot.name = new_upload_slot.id;
  tagElements(new_upload_slot);


  var info_elem = document.getElementById("info" + getSuffix(new_upload_slot.id));
  updatePath(info_elem);
}


function addCategory(elem) {
  if (elem.id)
    elem_id = elem.id;
  else
    elem_id = "group[0]";

  var group = Get("group[0]");
  var new_upload_slot = group.cloneNode(true);


  elem.appendChild(new_upload_slot);

  new_upload_slot.id = elem_id + "[" + uniqid() + "]";
  new_upload_slot.name = new_upload_slot.id;

  tagElements(new_upload_slot);
  new_upload_slot.className = "group unhidden";

  var info_elem = document.getElementById("info" + getSuffix(new_upload_slot.id));
  updatePath(info_elem);
}


function uniqid() {
  var newDate = new Date;
  return newDate.getTime();
}


function divParent(elem) {

  if (elem == document)
    return elem;

  if (elem.parentNode.tagName == "DIV")
    return elem.parentNode;

  return divParent(elem.parentNode);
}


function getContact() {
  var customer_name = Get('customer_name');
  var customer_phone = Get('customer_phone');
  var customer_email = Get('customer_email');
  var special_instructions = Get('special_instructions');
  var standing_order = Get('standing_order');
  var date = Get('date');
  var content = "";

  if (customer_name.value != "")
   content += "Name: " + customer_name.value + "<br />\n";
  if (customer_phone.value != "")
   content += "Phone: " + customer_phone.value + "<br />\n";
  if (customer_email.value != "")
   content += "Email: " + customer_email.value + "<br />\n";
  if (special_instructions.value != "")
   content += "Special Instructions: <br />\n<pre>" + special_instructions.value + "</pre>\n";
  if (standing_order.checked)
   content += standing_order.value + "<br />\n";
  if (date.value != "") {
   content += "<br />\nDate: " + date.value + "<br />\n";
   content += "Pickup: " + pickup + "<br />\n";
  }

  if (content != "")
   content += "<br />\n";

  return content;
}

function submitTheForm() {
  var elem = document.getElementById('upload');

  if (validator())
    elem.submit();
}

function validator() {
  addFormElements();

  var customer_name = Get('customer_name');
  var customer_phone = Get('customer_phone');
  var customer_email = Get('customer_email');

  if (customer_name.value == "")
  {
    alert("Please enter your name.");
    customer_name.focus();
    return (false);
  }

  if (customer_phone.value == "")
  {
    alert("Please enter your phone number.");
    customer_phone.focus();
    return (false);
  }
  
  return (true);
}

function updateOrder() {
  var status_content = Get('status_content');
  var other_content = Get('content');
  var suffix;
  var item_modifier;
  var item_name;
  var variety_parent;
  var content = getContact();

  var candidates = document.getElementsByTagName("input");
  for(var i=0; i < candidates.length; i++) {
    if (getOriginalPrefix(candidates[i].id) == "item_amount" && candidates[i].value != "") {
      suffix = getSuffix(candidates[i].id);
      item_name = Get("item_name" + suffix);
      item_modifier = Get("item_modifier" + suffix);
      variety_parent = getVarietyParent(candidates[i].id);
      content += candidates[i].value + " " + item_modifier.value + " " + item_name.value;

      if (variety_parent != "")
        content += " (" + variety_parent + ")";
      content += "<br />\n";
    }    
  }
  var reg = new RegExp("<br />|<pre>|</pre>","g");
  status_content.innerHTML = content;
  other_content.innerHTML = content.replace(reg, "");
}


function updatePath() {
  var candidates = document.getElementsByTagName("span");
  for(var i=0; i < candidates.length; i++) {
    current_id = candidates[i].id;

   if (current_id.indexOf("info") >= 0) {
      candidates[i].innerHTML = getPath(current_id);
    }
  }
}

function getPath (id) {  
  var parent_id = "category_name" + stripLastSuffix(getSuffix(id));
  var elem = document.getElementById(parent_id);

  if (elem) {
    if (elem.value) {
      return getPath (parent_id) + elem.value + " -&nbsp;";
    }
    else return getPath (parent_id) + " -&nbsp;";;
  }
  else
    return "";
}


function getVarietyParent(id) {  
  var parent_id = "category_name" + stripLastSuffix(getSuffix(id));
  var grand_parent_id = "category_name" + stripLastSuffix(getSuffix(parent_id));

  var parent_elem = Get(parent_id);
  var grand_parent_elem = Get(grand_parent_id);

  if (parent_elem)
    if (parent_elem.value)
      if(grand_parent_elem)
        if (grand_parent_elem.value)
          return parent_elem.value;

  return "";
}


function stripLastSuffix (id) {
  var end = id.lastIndexOf("[");
  return id.substring(0, end);

}


function addFormElements () {
  var form = document.upload;
  var prefix;
  var suffix;
  var children = new Array(3);
  children[0] = document.getElementsByTagName("input");
  children[1] = document.getElementsByTagName("textarea");
  children[2] = document.getElementsByTagName("select");

  for(var i=0; i < children.length; i++) {
    for(var j=0; j < children[i].length; j++) {
      prefix = getMainPrefix(children[i][j].name);
      suffix = getSuffix(children[i][j].name);
      if (suffix != "" && (prefix == "item" || prefix == "category")) {
          children[i][j].id = children[i][j].name;
          children[i][j].name = children[i][j].id + "['value']";
      }
    }
  }
}
