function getHTTPObject2() {
var	req = false;

    if(window.XMLHttpRequest) {
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
    } else if(window.ActiveXObject) {
       	try {
	     	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
	  		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }
    return req;
}

function HttpArgs()
{
  this.ready = true;
  this.values = new Object();
  this.fields = new Array();
}
//----------------------------------------------------------------------
function setValue(name, value)
{
  var el = document.getElementById(name);
  if (!el)
    {
      alert(name + " not found");
      return;
    }
  if (el.getAttribute('type') == 'checkbox')
    el.checked = (value == '1');
  else
    el.value = value;
}
//----------------------------------------------------------------------
function loadValues(ids, values)
{
  for (var i=0;i<ids.length;i++)
    setValue( ids[i], values[ids[i]]);
}

//----------------------------------------------------------------------
function loadElements(ids, values)
{
  for (var i=0;i<ids.length;i++)
    {
      var el = document.getElementById(ids[i]);
      if (el)
        el.innerHTML = values[ids[i]];
    }
}

//----------------------------------------------------------------------
function parsePieces(rest, obj)
{
   var fields = rest.split("#||#");
   obj.fields.length = fields.length;
   obj.values = new Object();
   for (var i=0;i<fields.length;i++)
     {
       var fieldval = fields[i].split("#==#");
       var field = fieldval[0];
       var value = fieldval[1]; 
       obj.fields[i] = field;
       obj.values[field] = value;
     }
}
//----------------------------------------------------------------------   
function miscResponse(res, httpargs)
{
  var command = res.charAt(0);
  var rest = res.substring(1);
  //  alert(res);
  switch (command)
    {
    case 'v':
      parsePieces(rest, httpargs);
      if (httpargs.handleValues) // if we've defined a special fucntion for results, use it
        httpargs.handleValues(httpargs.fields, httpargs.values);
      else
        loadValues(httpargs.fields, httpargs.values);
      break;
    case 'e':
      parsePieces(rest, httpargs);
      loadElements(httpargs.fields, httpargs.values);
      break;
    case 'p':
      document.innerHTML = rest;
      break;
    case 'r':
      window.location = rest;
      break;
    default:
      var er = document.getElementById("errmsg");
      if (er)
        er.innerHTML = "received: " + res;
    }
}

var httpArray;
var argsArray;
function initHttp(nObj)
{
  if (nObj > 11)
    {
      alert("Too many http objects, maxmimum 11");
      nObj=11;
    }
  httpArray = new Array(nObj);
  argsArray = new Array(nObj);
  for (var i=0;i<nObj;i++)
    {
      httpArray[i] = getHTTPObject2();
      argsArray[i] = new HttpArgs();
    }
}
initHttp(4);

function handler0() { wrapHandle(httpArray[0], argsArray[0]); }
function handler1() { wrapHandle(httpArray[1], argsArray[1]); }
function handler2() { wrapHandle(httpArray[2], argsArray[2]); }
function handler3() { wrapHandle(httpArray[3], argsArray[3]); }
function handler4() { wrapHandle(httpArray[4], argsArray[4]); }
function handler5() { wrapHandle(httpArray[5], argsArray[5]); }
function handler6() { wrapHandle(httpArray[6], argsArray[6]); }
function handler7() { wrapHandle(httpArray[7], argsArray[7]); }
function handler8() { wrapHandle(httpArray[8], argsArray[8]); }
function handler9() { wrapHandle(httpArray[9], argsArray[9]); }
function handler10(){ wrapHandle(httpArray[10], argsArray[10]); }

//----------------------------------------------------------------------
function chooseHttpIndex()
{
  var objIndex;
  for (objIndex=0;objIndex<httpArray.length &&
         httpArray[objIndex].readyState != 4 &&
         httpArray[objIndex].readyState != 0;objIndex++);
  if (objIndex == httpArray.length)
    {
      var earliest = httpArray[0].openTime;
      objIndex = 0;
      for (var i=1;i<httpArray.length;i++)
        if (argsArray[i].openTime < earliest)
          {
            earlist = httpArray[i].openTime;
            objIndex = i;
          }
      alerta("all the http objs are busy... aborting one");
      httpArray[objIndex].abort();
    }
  return objIndex;
}
//----------------------------------------------------------------------
// returns value of element, most of time this is just el.value, but for
// some types of input element we need to do something else
function getValue(el)
{
  if (el.getAttribute('type') == 'checkbox')
    return (el.checked) ? "1" : "0";
  return escape(el.value);
}
//----------------------------------------------------------------------
function saveValues(baseurl, ids, customFunc, arg1, arg2, arg3)
{
  var objIndex = chooseHttpIndex();
  var httpargs = argsArray[objIndex];
  var http     = httpArray[objIndex];
  httpargs.ready = false;
  var fullurl=baseurl;
  if (!ids)
    ids = httpargs.fields;
    
  for (var i=0;i<ids.length;i++)
    {
      var el = document.getElementById(ids[i]);
      if (!el)
        alert("no element: " + ids[i]);
      fullurl += ids[i] + "=" + getValue(el);
      if (i < ids.length-1)
        fullurl += "&";
    }
  //  alert("get: " + fullurl);
  httpArray[objIndex].open("GET", fullurl, true);
  httpargs.openTime = new Date().getTime();
  if (customFunc)
    {
      httpargs.myFunc = customFunc;
      httpargs.arg1 = arg1;
      httpargs.arg2 = arg2;
      httpargs.arg3 = arg3;
    }
  else
    httpargs.myFunc = miscResponse;
  httpargs.handleValues = null;
  switch (objIndex) {
  case 0:  http.onreadystatechange = handler0; break;
  case 1:  http.onreadystatechange = handler1; break;
  case 2:  http.onreadystatechange = handler2; break;
  case 3:  http.onreadystatechange = handler3; break;
  case 4:  http.onreadystatechange = handler4; break;
  case 5:  http.onreadystatechange = handler5; break;
  case 6:  http.onreadystatechange = handler6; break;
  case 7:  http.onreadystatechange = handler7; break;
  case 8:  http.onreadystatechange = handler8; break;
  case 9:  http.onreadystatechange = handler9; break;
  case 10:  http.onreadystatechange = handler10; break;
  default:
    alert("huh: " + objIndex);
  }
  httpArray[objIndex].send(null);
}
//----------------------------------------------------------------------
function wrapHandle(http, httpargs)
{
  if (http.readyState == 4)
    {
      httpargs.myFunc(http.responseText, httpargs, httpargs.arg1, httpargs.arg2, httpargs.arg3);
      httpargs.ready = true;
    }
}

//----------------------------------------------------------------------
// this is for dev purposes when we first need to create the form
function genForm(ids, values)
{
  var result="";

  result += "<script>loadFunc('" + httpargs.baseurl + "'); </script>";
  for (var i=0;i<ids.length;i++)
    result += "<span class='label'>" + ids[i].substring(0,1).toUpperCase() + ids[i].substring(1) + ":" + 
              "</span><input class='input' type='text' id='" + ids[i] + "'><br>\n";
  result += "<input type='button' class='submit' onclick=\"saveValues('"+httpargs.baseurl+ "');\" value='Save'> //modifyme";
  document.write(result);
  newWin();
}

