// Copyright (c) 2005 Mark Janssen
// praseodym(at)gmail(dot)com
// All rights reserved.

// Core code

function addRow(rowdatax) {
  id++;
  var rowdata = Array(5);
  if(!rowdatax) {
    rowdata = Array(5);
    rowdata[0] = '';
    rowdata[1] = 1;
    rowdata[2] = 'Please enter an item number.';
    rowdata[3] = '';
    rowdata[4] = '';
  }
  else {
    rowdata[0] = rowdatax[0];
    rowdata[1] = rowdatax[1];
    rowdata[2] = rowdatax[2];
    rowdata[3] = '$' + rowdatax[3].toFixed(2);
    rowdata[4] = '$' + rowdatax[4].toFixed(2);
  }
  var newrow = document.createElement('tr');
  var td1    = document.createElement('td');
  var td2    = document.createElement('td');
  var td3    = document.createElement('td');
  var td4    = document.createElement('td');
  var td5    = document.createElement('td');
  var input1 = document.createElement('input');
  var input2 = document.createElement('input');
  var text1  = rowdata[0];
  var text2  = rowdata[1];
  var text3  = document.createTextNode(rowdata[2]);
  var text4  = document.createTextNode(rowdata[3]);
  var text5  = document.createTextNode(rowdata[4]);
  addEvent(input1, 'blur', inputBlur);
  addEvent(input2, 'blur', inputBlur);
  newrow.id   = 'row-' + id;
  td1.id      = 'td-' + id + '-1';
  td2.id      = 'td-' + id + '-2';
  td3.id      = 'td-' + id + '-3';
  td4.id      = 'td-' + id + '-4';
  td5.id      = 'td-' + id + '-5';
  input1.id   = 'input-' + id + '-code';
  input2.id   = 'input-' + id + '-quantity';
  input1.name = 'PRODUCT';
  input2.name = 'QUANTITY';
  input1.size = 15;
  input2.size = 4;
  input1.value = text1;
  input2.value = text2;
  td4.className    = 'price';
  td5.className    = 'price';
  if (id > 0) {
    document.getElementById('td-'+(id-1)+'-3').className = 'border';
    document.getElementById('td-'+(id-1)+'-4').className = 'price border';
    document.getElementById('td-'+(id-1)+'-5').className = 'price border';
  }
  td1.appendChild(input1);
  td2.appendChild(input2);
  td3.appendChild(text3);
  td4.appendChild(text4);
  td5.appendChild(text5);
  newrow.appendChild(td1);
  newrow.appendChild(td2);
  newrow.appendChild(td3);
  newrow.appendChild(td4);
  newrow.appendChild(td5);
  document.getElementById('ajaxtbody').appendChild(newrow);
}

function initializeForm() {
  total = 0;
  hidden = document.getElementById('formdata');
  totald = document.getElementById('ajaxtotal');
  totald.appendChild(document.createTextNode('$0.00'));
  if (hidden.value != '') {
    var y = hidden.value.split('|');
    var x = Array(y.length);
    for (var i = 0;i<y.length;i++) {
      x[i] = y[i].split(',');
      for(var j = 0;j<x[i].length;j++) {
        if(j == 1 || j == 3 || j == 4) {
          x[i][j] = parseFloat(unescape(x[i][j]));
        }
        else {
          x[i][j] = unescape(x[i][j]);
        }

      }
      addRow(x[i]);
    }
    formdata = x;
  }
  addRow();
  updateTotal();
}

function setHidden() {
  var x = formdata;
  var y = Array(id);
  for (var i = 0;i<id;i++) {
    for (var j = 0;j<5;j++) {
      if (j > 0) {
        y[i] += ",";
      }
      else {
        y[i] = '';
      }
      y[i] += escape(x[i][j]);
    }
  }
  hidden.value = y.join('|');
}

function inputBlur(ref) {
  var splitid = this.id.split('-');
  var rid = splitid[1];
  if(splitid[1] == id && splitid[2] == 'code' && this.value != '') {
    var addrow = true;
  }
  if (splitid[2] == 'code') {
    code = trimAll(this.value);
    if(code != '') {
      xmlhttp = getHTTPObject();
	  // For Cust Discount, we need the webservice to query the db everytime a request is received. So a random no. is appended to the querystring
	  
      xmlhttp.open("GET", 'getdata.asp?id=' + escape(code) + '&RND=' + Math.floor(Math.random()*100000) , true);
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState==4) {
          handleHttpResponse(xmlhttp, rid, code, addrow);
        }
      }
      xmlhttp.send(null);
    }
    else {
      document.getElementById('input-' + rid + '-code').value = formdata[rid][0];
    }
  }
  if (splitid[2] == 'quantity' && formdata[rid]) {
    var quantity = trimAll(document.getElementById('input-' + rid + '-quantity').value);
    if(isNumeric(quantity) && quantity != '' && formdata[rid][3]) {
      formdata[rid][1] = parseFloat(quantity);
      formdata[rid][4] = formdata[rid][3]*formdata[rid][1];
      extended = document.getElementById('td-' + rid + '-5');
      extended.replaceChild(document.createTextNode('$' + formdata[rid][4].toFixed(2)), extended.firstChild);
    }
    else {
      document.getElementById('input-' + rid + '-quantity').value = formdata[rid][1];
    }
  }
//   else if(splitid[2] == 'quantity') {
//     formdata[rid] = Array;
//     formdata[rid][1] = parseFloat(quantity);
//   }
  setHidden();
  updateTotal();
}

// Generic functions

function handleHttpResponse(xmlhttp, rid, code, addrow) {
  if(xmlhttp.responseText != '404') {
    results = xmlhttp.responseText.split("|");
  
    formdata[rid] = Array(5);
    formdata[rid][0] = code;                                                                      // code
    formdata[rid][1] = parseFloat(document.getElementById('input-' + rid + '-quantity').value);   // quantity
    formdata[rid][2] = results[0];                                                                // description
    formdata[rid][3] = parseFloat(results[1]);                                                    // price
    formdata[rid][4] = formdata[rid][1]*formdata[rid][3];                                         // extended
  
    desc = document.getElementById('td-' + rid + '-3');
    desc.replaceChild(document.createTextNode(formdata[rid][2]), desc.firstChild);
    price = document.getElementById('td-' + rid + '-4');
    price.replaceChild(document.createTextNode('$' + formdata[rid][3].toFixed(2)), price.firstChild);
    extended = document.getElementById('td-' + rid + '-5');
    extended.replaceChild(document.createTextNode('$' + formdata[rid][4].toFixed(2)), extended.firstChild);
    if (addrow) {
      addRow();
    }
    setHidden();
    updateTotal();
  }
  else {
    formdata[rid][2] = '';
    formdata[rid][3] = '';
    formdata[rid][4] = '';
    desc = document.getElementById('td-' + rid + '-3');
    desc.replaceChild(document.createTextNode(''), desc.firstChild);
    price = document.getElementById('td-' + rid + '-4');
    price.replaceChild(document.createTextNode(''), price.firstChild);
    extended = document.getElementById('td-' + rid + '-5');
    extended.replaceChild(document.createTextNode(''), extended.firstChild);
  }
}

function updateTotal() {
  total = 0;
  for (var i = 0;i<id;i++) {
    total += formdata[i][4];
  }
  totald.replaceChild(document.createTextNode('$' + total.toFixed(2)), totald.firstChild);
}

function isNumeric(check){
  var anum = /(^\d+$)/
  if (anum.test(check)) {
    return true;
  }
  else {
    return false;
  }
}

function trimAll(sString) {
  while (sString.substring(0,1) == ' ') {
    sString = sString.substring(1, sString.length);
  }
  while (sString.substring(sString.length-1, sString.length) == ' ') {
    sString = sString.substring(0,sString.length-1);
  }
  return sString;
}


function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

function addEvent(element, type, handler) {
  // assign each event handler a unique ID
  if (!handler.$$guid) handler.$$guid = addEvent.guid++;
  // create a hash table of event types for the element
  if (!element.events) element.events = {};
  // create a hash table of event handlers for each element/event pair
  var handlers = element.events[type];
  if (!handlers) {
    handlers = element.events[type] = {};
    // store the existing event handler (if there is one)
    if (element["on" + type]) {
      handlers[0] = element["on" + type];
    }
  }
  // store the event handler in the hash table
  handlers[handler.$$guid] = handler;
  // assign a global event handler to do all the work
  element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
  // delete the event handler from the hash table
  if (element.events && element.events[type]) {
    delete element.events[type][handler.$$guid];
  }
};

function handleEvent(event) {
  var returnValue = true;
  // grab the event object (IE uses a global event object)
  event = event || fixEvent(window.event);
  // get a reference to the hash table of event handlers
  var handlers = this.events[event.type];
  // execute each event handler
  for (var i in handlers) {
    this.$$handleEvent = handlers[i];
    if (this.$$handleEvent(event) === false) {
      returnValue = false;
    }
  }
  return returnValue;
};

function fixEvent(event) {
  // add W3C standard event methods
  event.preventDefault = fixEvent.preventDefault;
  event.stopPropagation = fixEvent.stopPropagation;
  return event;
};
fixEvent.preventDefault = function() {
  this.returnValue = false;
};
fixEvent.stopPropagation = function() {
  this.cancelBubble = true;
};

var id = -1;
var formdata = Array;
addEvent(window,'load',initializeForm);