function clearSelection(sel)
{
  while (sel.options.length) {
    sel.options.length = 0;
  }
}

function clearTable(tbody)
{
  while (tbody.rows.length > 0) {
    tbody.deleteRow(0);
  }
}

function cleanSel(sel) 
{
  while (sel.options.length) {
    sel.options.length = 0;
  }
}

function SYNSetFieldValue(formName,fieldName,val)
{
  //debugMessage('SYNSetFieldValue:'+formName+":"+fieldName);
  document.forms[formName].elements[fieldName].value = val;
  //debugMessage('SYNSetFieldValue (was set):'+formName+":"+fieldName);
  return val;
}

function SYNSetIDValue(fieldName,val)
{
  debugMessage('SYNSetFieldValue:'+fieldName+":"+val);
  var ted = document.getElementById(fieldName);
  if (ted != null) {
    ted.value = val;
    debugMessage('SYNSetFieldValue (was set):'+fieldName+":"+val);
  }
  return val;
}

function ClearFieldValue(formName,fieldName)
{
    //debugMessage("GetFieldData start: "+formName+":"+fieldName+":\n");
  if (!FieldHasData(formName,fieldName)) {
    return ;
  }
  var fld = document.forms[formName].elements[fieldName];
  var theType = '';
  if (fld.type == null) {
    theType = fld[0].type;
  } else {
    theType = fld.type;
  }
  //debugMessage("GetFieldData HaveType: "+formName+":"+fieldName+":"+theType+":\n");
  switch (theType) {
    case 'select-one':
      if (fld.selectedIndex != -1) {
        fld.selectedIndex = -1;
      }
    break;
    case 'checkbox':
    //debugMessage("GetFieldData CB: "+formName+":"+fieldName+":\n");
      if (fld.checked) {
        fld.checked = false;
      }
    break;
    case 'radio':
    //debugMessage("GetFieldData RADIO: "+formName+":"+fieldName+":\n");
      for (var i=0; i < fld.length; i++) {
        if (fld[i].checked) {
          //debugMessage("GetFieldData RADIO: "+formName+":"+fieldName+":"+fld[i].value+":\n");
          fld.checked = false;
        }
      }
    break;
    default:
    //debugMessage("GetFieldData other: "+formName+":"+fieldName+":\n");
      fld.value = '';
    break;
  }
}

function CheckData(formName,fieldName) {
  var fld = document.forms[formName].elements[fieldName];
  if (fld == null) {
    //alert("CheckData:"+fieldName);
    return 0;
  }
  var theType = '';
  if (fld.type == null) {
    //debugMessage("GetFieldData GotArray: "+formName+":"+fieldName+":"+fld.type+":"+fld[0].type+":\n");
    theType = fld[0].type;
  } else {
    theType = fld.type;
  }
  switch (theType) {
    case 'button':
    case 'hidden':
    case 'reset':
    case 'submit':
      return 1;
    break;
    case 'select-multiple':
    case 'select-one':
      if (fld.selectedIndex == -1) {
        return 0;
      }
      if (fld.options[fld.selectedIndex].value == 'NULL' || fld.options[fld.selectedIndex].value == '') {
        return 0;
      }
      return 1;
    break;
    case 'checkbox':
      if (fld.checked) {
        return 1;
      }
    break;
    case 'radio':
      for (var i=0; i < fld.length; i++) {
        if (fld[i].checked) {
        //debugMessage("CheckData:"+formName+":"+fieldName+":"+i+":"+fld[i].checked+":");
          return 1;
        }
      }
    break;
    default:
      return (fld.value != '' && fld.value != null);
    break;
  }
  return 0;
}


function HaveAllRequiredData(formName,inf)
{
  var i = 0;
  for (;i < inf.length;i++) {
    if (inf[i].required && !FieldHasData(formName,inf[i].data_name)) {
      return(0);
    }
  }
  return(1);
}

function BuildWhereFields(formName,inf)
{
  var i = 0;
  var field_names = '';

  for (;i < inf.length;i++) {
    if (FieldHasData(formName,inf[i].data_name)) {
      if (field_names != '') {
        field_names += ',';
      }
      field_names += inf[i].name;
    }

  }
  return(field_names);
}

function BuildWhereValues(formName,inf)
{
  var i = 0;
  var field_values = '';

  for (;i < inf.length;i++) {
    if (FieldHasData(formName,inf[i].data_name)) {
      var value = GetFieldData(formName,inf[i].data_name);
      if (field_values != '') {
        field_values += ',';
      }
      field_values += value;
    }

  }
  return(field_values);
}

function FieldHasData(formName,fieldName) {
  var fld = document.forms[formName].elements[fieldName];
  if (fld == null) {
    //alert("FieldHasData:"+fieldName);
   //debugMessage("FieldHasData:"+fieldName);
    return 0;
  }
  switch (fld.type) {
    case 'button':
    case 'reset':
    case 'submit':
    case 'select-multiple':
      return 0;
    break;
    case 'select-one':
      if (fld.selectedIndex == -1) {
        return 0;
      }
      if (fld.options[fld.selectedIndex].value == 'NULL') {
        return 0;
      }
      return 1;
    break;
    case 'checkbox':
      if (fld.checked) {
        return 1;
      }
    break;
    case 'radio':
      for (var i=0; i < fld.length; i++) {
        if (fld[i].checked) {
          return 1;
        }
      }
    break;
    case 'hidden':
    case 'text':
    default:
      return (fld.value != '');
    break;
  }
  return 0;
}

function GetFieldData(formName,fieldName) {
    //debugMessage("GetFieldData start: "+formName+":"+fieldName+":\n");
  if (!FieldHasData(formName,fieldName)) {
    return null;
  }
  var fld = document.forms[formName].elements[fieldName];
    //debugMessage("GetFieldData HasData: "+formName+":"+fieldName+":"+fld.type+":"+fld[0].type+":\n");
  var theType = '';
  if (fld.type == null) {
    //debugMessage("GetFieldData GotArray: "+formName+":"+fieldName+":"+fld.type+":"+fld[0].type+":\n");
    theType = fld[0].type;
  } else {
    theType = fld.type;
  }
    //debugMessage("GetFieldData HaveType: "+formName+":"+fieldName+":"+theType+":\n");
  switch (theType) {
    //case 'select-one':
    //  return (fld.options[fld.selectedIndex].value);
    //break;
    case 'select-one':
      if (fld.selectedIndex == -1) {
        return 0;
      }
      if (fld.options[fld.selectedIndex].value == 'NULL') {
        return 0;
      }
      return fld.options[fld.selectedIndex].value;
    break;
    case 'checkbox':
    //debugMessage("GetFieldData CB: "+formName+":"+fieldName+":\n");
      if (fld.checked) {
        return (fld.value);
      }
    break;
    case 'radio':
    //debugMessage("GetFieldData RADIO: "+formName+":"+fieldName+":\n");
      for (var i=0; i < fld.length; i++) {
        if (fld[i].checked) {
          //debugMessage("GetFieldData RADIO: "+formName+":"+fieldName+":"+fld[i].value+":\n");
          return (fld[i].value);
        }
      }
    break;
    default:
    //debugMessage("GetFieldData other: "+formName+":"+fieldName+":\n");
      return (fld.value);
    break;
  }
  return null;
}


function ElHasData(fld) {
  if (fld == null) {
    alert("ElHasData:fld==null");
    return 0;
  }
  switch (fld.type) {
    case 'button':
    case 'reset':
    case 'submit':
    case 'select-multiple':
      return 0;
    break;
    case 'select-one':
      if (fld.selectedIndex == -1) {
        return 0;
      }
      if (fld.options[fld.selectedIndex].value == 'NULL') {
        return 0;
      }
      return 1;
    break;
    case 'checkbox':
      if (fld.checked) {
        return 1;
      }
    break;
    case 'radio':
      //for (var i=0; i < fld.length; i++) {
        if (fld.checked) {
          return 1;
        }
      //}
    break;
    case 'hidden':
    case 'text':
    default:
      return (fld.value != '');
    break;
  }
  return 0;
}

function GetElData(fld) {
    //debugMessage("GetElData start: "+formName+":"+fieldName+":\n");
  if (!ElHasData(fld)) {
    return null;
  }

  switch (fld.type) {
    //case 'select-one':
    //  return (fld.options[fld.selectedIndex].value);
    //break;
    case 'checkbox':
    //debugMessage("GetElData CB: "+formName+":"+fieldName+":\n");
      if (fld.checked) {
        return (fld.value);
      }
    break;
    case 'radio':
    //debugMessage("GetElData RADIO: "+formName+":"+fieldName+":\n");
      if (fld.checked) {
        return (fld.value);
      }
    break;
    default:
    //debugMessage("GetElData other: "+formName+":"+fieldName+":\n");
      return (fld.value);
    break;
  }
  return null;
}


function HideOneZoneKeepSpace(hide,which)
{
  var ted = document.getElementById(which);
  if (ted == null) {
    //alert('HideOneZone:ted == null:'+which);
  } else {
    if (hide) {
      ted.style.visibility = 'hidden';
      ted.style.display = '';
    } else {
      ted.style.visibility = 'visible';
      ted.style.display = '';
    }
  }
}



function HideOneZone(hide,which)
{
  var ted = document.getElementById(which);
  if (ted == null) {
    //alert('HideOneZone:ted == null:'+which);
  } else {
    if (hide) {
      ted.style.visibility = 'hidden';
      ted.style.display = 'none';
    } else {
      ted.style.visibility = 'visible';
      ted.style.display = '';
    }
  }
}

function FixOneRequired(require,which)
{
  var ted = document.getElementById(which);
  //debugMessage('FixOneRequired:'+which+":"+require+"\n");
  if (ted == null) {
    //alert('FixOneRequired:ted == null:'+which);
  } else {
    if (require) {
      ted.className = "required_decoration";
    } else {
      ted.className = "no_decoration";
    }
  }
}
function CopyOneField(fromForm,fromField,toForm,toField)
{
  var fromEl = document[fromForm].elements[fromField];
  var toEl = document[toForm].elements[toField];

  if (fromEl == null) {
    alert("Can't find ("+fromForm+"."+fromField+") for copy.");
  }
  if (toEl == null) {
    alert("Can't find ("+toForm+"."+toField+") for copy.");
  }
  if (fromEl.type == toEl.type) {
    if (toEl.type == 'text' || toEl.type == 'hidden') {
      toEl.value = fromEl.value;
    } else if (toEl.type == 'select-one') {
      toEl.selectedIndex = fromEl.selectedIndex;
    } else {
      alert("field types I don't like for copy from ("+fromForm+"."+fromField+":"+fromEl.type+") to ("+toForm+"."+toField+":"+toEl.type+") for copy.");
    }
  } else {
    alert("field types don't match for copy from ("+fromForm+"."+fromField+":"+fromEl.type+") to ("+toForm+"."+toField+":"+toEl.type+") for copy.");
  }
}

function BlankOneField(formName,fieldName)
{
  var el = document[formName].elements[fieldName];

  if (el == null) {
    alert("Can't find ("+formName+"."+fieldName+") for copy.");
  }
  if (el.type == 'text' || el.type == 'hidden') {
    el.value = '';
  } else if (el.type == 'select-one') {
    if (el[0].value == 'NULL') {
      el.selectedIndex = 0;
    } else {
      el.selectedIndex = -1;
    }
  } else {
    alert("field types I don't like for clearing ("+formName+"."+fieldName+":"+el.type+")");
  }
}

function selectRadio(formName,fieldName,value)
{
  var fld = document.forms[formName].elements[fieldName];
  //debugMessage("selectRadio : "+formName+":"+fieldName+":"+value+":\n");
  for (var i=0; i < fld.length; i++) {
    if (fld[i].value == value) {
      //debugMessage("selectRadio (found): "+formName+":"+fieldName+":"+value+":\n");
      fld[i].checked = true;
    }
  }
}

function cleanRadio(formName,fieldName)
{
  var fld = document.forms[formName].elements[fieldName];
  //debugMessage("cleanRadio : ENTRY:"+formName+":"+fieldName+"\n");
  for (var i=0; i < fld.length; i++) {
    if (fld[i].checked) {
      //debugMessage("cleanRadio : "+formName+":"+fieldName+":"+fld[i].value+":\n");
      fld[i].checked = false;
      return(fld[i].value) ;
    }
  }
  return('');
}


function setRadio(formName,fieldName,value)
{
  var fld = document.forms[formName].elements[fieldName];
  //debugMessage("setRadio : ENTRY:"+formName+":"+fieldName+":"+value+"\n");
  for (var i=0; i < fld.length; i++) {
    if (fld[i].value == value) {
      //debugMessage("setRadio : "+formName+":"+fieldName+":"+fld[i].value+":\n");
      fld[i].checked = true;
      return(fld[i].value) ;
    }
  }
  return('');
}

function populateFrom(formName,fieldName,sources,overwrite,allow_missing)
{
  var toEl = document[formName].elements[fieldName];
  var this_string = '';

  if (toEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for copy.");
  }
  if (toEl.value == '' || overwrite) {
    var i;
    var found_missing = 0;
    for (i = 0;i < sources.length;i++) {
      if ( document[formName].elements[sources[i]].value == '') {
        found_missing = 1;
      }
      if (this_string != '')
      {
        this_string = this_string + ' ';
      }
      this_string = this_string + document[formName].elements[sources[i]].value;
    }
    if (found_missing && allow_missing) {
      toEl.value = this_string;
    } else {
      if (!found_missing) {
        toEl.value = this_string;
      }
    }
  }
}

function checkMagnitude(formName,fieldName,fieldPrompt,min,max,clear)
{
  var thisEl = document[formName].elements[fieldName];

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for copy.");
  }
  var dataVal = Number(thisEl.value);
  if (dataVal < min || dataVal > max) {
    alert(fieldPrompt + ' must be between ' + min + ' and ' + max);
    if (clear) {
      thisEl.value = '';
    }
    thisEl.focus();
  }
}

function checkLength(formName,fieldName,fieldPrompt,length)
{
  var thisEl = document[formName].elements[fieldName];

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for length check.");
  }
  var dataVal = String(thisEl.value);
  if (dataVal.length > length) {
    alert(fieldPrompt + ' may not be longer than ' + length + ' characters.');
    thisEl.focus();
  }
}

var request_obj;
var waiting = 0;
var glob_checked_val = '';
var glob_fieldPrompt = '';
var glob_context = '';
var glob_form_name = '';
var glob_this_el = null;
var glob_field_name = '';
var glob_validate_func = null;

function processDupRequest()
{
  var return_err = 0;
  var good_result = 0;
  if (request_obj == null || typeof request_obj == 'undefined') {
  //alert('nothing');
    return;
  }
  //alert('something');
  // only if request_obj shows "loaded"
  if (request_obj.readyState == 4) {
    // only if "OK"
  //alert('OK');
    if (request_obj.status == 200) {
  //alert('200');
      var resp = request_obj.responseXML.getElementsByTagName("result");
  //alert('typeof resp:'+ typeof resp);
  //alert('resp.length:'+ resp.length);
      for (var i = 0; i < resp.length; i++) {
          var val = getElementTextNS("", "val", resp[i], 0);
  //alert('val:'+val);
          good_result = val;
          waiting = 0;
  //alert('good_result:'+good_result);
      }
      if (good_result == 1) {
      } else {
        if (good_result == 2) {
          alert(glob_fieldPrompt + ' value has already been used. Please enter another value.');
          if (glob_this_el == null) {
            alert('cannot refocus on null element!');
          } else {
            ClearFieldValue(glob_form_name,glob_field_name);
            //glob_this_el.value = '';
            glob_this_el.focus();
          }
        } else {
          if (good_result == 3) {
            alert('Error checking for ' + glob_fieldPrompt + ' in database.');
          }
        }
      }
      glob_checked_val = '';
      glob_fieldPrompt = '';
      glob_this_el = null;
      request_obj = null;
    } else {
      alert('Error checking for ' + glob_fieldPrompt + ' in database.');
      //alert("There was a problem retrieving the XML data:\n" + request_obj.statusText);
      glob_checked_val = '';
      glob_fieldPrompt = '';
      glob_this_el = null;
      request_obj = null;
    }
  }
}


function checkDupValue(formName,tableName,fieldName,fieldPrompt)
{
  var thisEl = document[formName].elements[fieldName];

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for duplicate check.");
  }
  if (thisEl.value == thisEl.defaultValue) {
    return;
  }
  var dataVal = String(thisEl.value);
  dataVal = encodeURIComponent(dataVal);
  var url = "/cgi-bin/check_duplicates_xml.cgi?table_name="+tableName+"&field_name="+fieldName+"&field_data="+dataVal;

  request_obj = loadXMLDoc(url,processDupRequest);

  if (request_obj == null) {
    alert('Cannot create request_obj for XML document!');
  } 
  glob_field_name = fieldName;
  glob_form_name = formName;
  glob_this_el = thisEl;
  glob_checked_val = thisEl.value;
  glob_fieldPrompt = fieldPrompt;
}

var lookupStates = new Object;
var request_list = new Array;

function processLookupRequest_old()
{
  var return_err = 0;
  var key_val = '';
  var good_result = 0;
  var context_obj;
  var request_obj;
  var rq_l_cnt;
alert('RESPONDING in length:'+request_list.length);
  for (rq_l_cnt=0;rq_l_cnt < request_list.length;rq_l_cnt++) {
    request_obj = request_list[rq_l_cnt];
    if (request_obj == null || typeof request_obj == 'undefined') {
    //alert('nothing');
      return;
    }
    //alert('something');
    // only if request_obj shows "loaded"
    if (request_obj.readyState == 4) {
      // only if "OK"
      alert('RESPONDING:'+'rq_l_cnt:'+rq_l_cnt+'context:'+request_obj.syn_context);
      context_obj = lookupStates[request_obj.syn_context];
      if (request_obj.status == 200) {
        //alert('200');
        var resp = request_obj.responseXML.getElementsByTagName("result");
        //alert('typeof resp:'+ typeof resp);
        //alert('resp.length:'+ resp.length);
        for (var i = 0; i < resp.length; i++) {
            key_val = getElementTextNS("", "key", resp[i], 0);
            //alert('key_val:'+key_val);
            var val = getElementTextNS("", "val", resp[i], 0);
            //alert('val:'+val);
            good_result = val;
            var err = getElementTextNS("", "err", resp[i], 0);
            //alert('err:'+err);
            return_err = err;
            waiting = 0;
            //alert('good_result:'+good_result);
        }
        if (waiting == 0) {
          ted = document.getElementById(context_obj.context);
          ted.innerHTML = good_result;
          context_obj.set_el.value = key_val;
          if (return_err == 1) {
            context_obj.this_el.value = '';
            context_obj.this_el.focus();
          }
        }
        context_obj.validate_func(context_obj.field_name);
        delete(lookupStates[request_obj.syn_context]);
        request_list[rq_l_cnt] = null;
        request_obj = null;
      } else {
        alert('Error checking for ' + context_obj.fieldPrompt + ' in database.');
        //alert("There was a problem retrieving the XML data:\n" + request_obj.statusText);
        request_obj = null;
      }
    }
  }
alert('RESPONDING out length:'+request_list.length);
  //for (rq_l_cnt=0;rq_l_cnt < request_list.length;rq_l_cnt++) {
  //  if (request_list[rq_l_cnt] == null) {
  //    //delete(request_list[rq_l_cnt]);
  //    alert('RESPONDING:'+'rq_l_cnt:'+rq_l_cnt+':deleting');
  //  }
  //}
alert('RESPONDING done length:'+request_list.length);
}

function processLookupRequest()
{
alert('processLookupRequest:'+typeof this);
  var return_err = 0;
  var key_val = '';
  var good_result = 0;
  var context_obj;
    if (this.readyState == 4) {
      // only if "OK"
      alert('RESPONDING:'+this.syn_context);
      context_obj = lookupStates[this.syn_context];
      if (this.status == 200) {
        //alert('200');
        var resp = this.responseXML.getElementsByTagName("result");
        //alert('typeof resp:'+ typeof resp);
        //alert('resp.length:'+ resp.length);
        for (var i = 0; i < resp.length; i++) {
            key_val = getElementTextNS("", "key", resp[i], 0);
            //alert('key_val:'+key_val);
            var val = getElementTextNS("", "val", resp[i], 0);
            //alert('val:'+val);
            good_result = val;
            var err = getElementTextNS("", "err", resp[i], 0);
            //alert('err:'+err);
            return_err = err;
            waiting = 0;
            //alert('good_result:'+good_result);
        }
        if (waiting == 0) {
          ted = document.getElementById(context_obj.context);
          ted.innerHTML = good_result;
          context_obj.set_el.value = key_val;
          if (return_err == 1) {
            context_obj.this_el.value = '';
            context_obj.this_el.focus();
          }
        }
        context_obj.validate_func(context_obj.field_name);
        delete(lookupStates[this.syn_context]);
        request_list[rq_l_cnt] = null;
        //this = null;
      } else {
        alert('Error checking for ' + context_obj.fieldPrompt + ' in database.');
        //alert("There was a problem retrieving the XML data:\n" + request_obj.statusText);
        //this = null;
      }
    }
  //}
  //for (rq_l_cnt=0;rq_l_cnt < request_list.length;rq_l_cnt++) {
  //  if (request_list[rq_l_cnt] == null) {
  //    //delete(request_list[rq_l_cnt]);
  //    alert('RESPONDING:'+'rq_l_cnt:'+rq_l_cnt+':deleting');
  //  }
  //}
}

function loadXMLDoc2(url) {
var request_obj;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        request_obj = new XMLHttpRequest();
        //request_obj.onreadystatechange = processReqChange;
        request_obj.open("GET", url, false);
        request_obj.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        isIE = true;
        request_obj = new ActiveXObject("Microsoft.XMLHTTP");
        if (request_obj) {
            //request_obj.onreadystatechange = processReqChange;
            request_obj.open("GET", url, false);
            request_obj.send();
        }
    }
    return (request_obj);
}

function fetchLookupValueSlaved(formName,lookupTableName,keyField,lookupFieldName,fieldName,fieldPrompt,returnField,slave_list,slave_cols,context,validateField)
{
  var thisEl = document[formName].elements[fieldName+"_entered"];
  var setEl = document[formName].elements[fieldName];
  var slaves = slave_list.split(/,/);
  var slave_values = '';

  for (var i=0;i<slaves.length;i++) {
    if (FieldHasData(formName,slaves[i])) {
      var value = GetFieldData(formName,slaves[i]);
      if (slave_values != '') {
        slave_values += ',';
      }
      value = encodeURIComponent(value);
      slave_values += value;
    } else {
      ted = document.getElementById(context);
      ted.innerHTML = 'Must choose ' + slaves[i] +' first';
    }
  }

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for lookup check.");
  }
  if (thisEl.value == thisEl.defaultValue) {
    //return;
  }
  if (thisEl.value == '') {
    ted = document.getElementById(context);
    ted.innerHTML = '';
    setEl.value = '';
    return;
  }
  var dataVal = String(thisEl.value);
  dataVal = encodeURIComponent(dataVal);
  var url = "/cgi-bin/lookup_slaved_value_xml.cgi?lookup_prompt="+fieldPrompt+"&lookup_table="+lookupTableName+"&return_field="+returnField+"&lookup_field="+lookupFieldName+"&lookup_data="+dataVal+"&key_field="+keyField+"&slave_cols="+slave_cols+"&slave_values="+slave_values;

  var request_obj = loadXMLDoc2(url);

  if (request_obj == null) {
    alert('Cannot create request_obj for XML document!');
  }  else {
    if (request_obj.readyState == 4) {
      // only if "OK"
      if (request_obj.status == 200) {
        //alert('200');
        var resp = request_obj.responseXML.getElementsByTagName("result");
        //alert('typeof resp:'+ typeof resp);
        //alert('resp.length:'+ resp.length);
        for (var i = 0; i < resp.length; i++) {
            key_val = getElementTextNS("", "key", resp[i], 0);
            //alert('key_val:'+key_val);
            var val = getElementTextNS("", "val", resp[i], 0);
            //alert('val:'+val);
            good_result = val;
            var err = getElementTextNS("", "err", resp[i], 0);
            //alert('err:'+err);
            return_err = err;
            waiting = 0;
            //alert('good_result:'+good_result);
        }
        if (waiting == 0) {
          ted = document.getElementById(context);
          ted.innerHTML = good_result;
          setEl.value = key_val;
          if (return_err == 1) {
            thisEl.value = '';
            thisEl.focus();
          }
        }
        validateField(fieldName);
      } else {
        alert('Error checking for ' + context_obj.fieldPrompt + ' in database.');
      }
    }
  }
}

function fetchLookupValue(formName,lookupTableName,keyField,lookupFieldName,fieldName,fieldPrompt,returnField,context,validateField)
{
  var thisEl = document[formName].elements[fieldName+"_entered"];
  var setEl = document[formName].elements[fieldName];

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for lookup check.");
  }
  if (thisEl.value == thisEl.defaultValue) {
    //return;
  }
  if (thisEl.value == '') {
    ted = document.getElementById(context);
    ted.innerHTML = '';
    setEl.value = '';
    return;
  }
  var dataVal = String(thisEl.value);
  dataVal = encodeURIComponent(dataVal);
  var url = "/cgi-bin/lookup_value_xml.cgi?lookup_prompt="+fieldPrompt+"&lookup_table="+lookupTableName+"&return_field="+returnField+"&lookup_field="+lookupFieldName+"&lookup_data="+dataVal+"&key_field="+keyField;

  var request_obj = loadXMLDoc2(url);

  if (request_obj == null) {
    alert('Cannot create request_obj for XML document!');
  }  else {
    if (request_obj.readyState == 4) {
      // only if "OK"
      if (request_obj.status == 200) {
        //alert('200');
        var resp = request_obj.responseXML.getElementsByTagName("result");
        //alert('typeof resp:'+ typeof resp);
        //alert('resp.length:'+ resp.length);
        for (var i = 0; i < resp.length; i++) {
            key_val = getElementTextNS("", "key", resp[i], 0);
            //alert('key_val:'+key_val);
            var val = getElementTextNS("", "val", resp[i], 0);
            //alert('val:'+val);
            good_result = val;
            var err = getElementTextNS("", "err", resp[i], 0);
            //alert('err:'+err);
            return_err = err;
            waiting = 0;
            //alert('good_result:'+good_result);
        }
        if (waiting == 0) {
          ted = document.getElementById(context);
          ted.innerHTML = good_result;
          setEl.value = key_val;
          if (return_err == 1) {
            thisEl.value = '';
            thisEl.focus();
          }
        }
        validateField(fieldName);
      } else {
        alert('Error checking for ' + context_obj.fieldPrompt + ' in database.');
      }
    }
  }
}

function fetchLookupValue_old(formName,lookupTableName,keyField,lookupFieldName,fieldName,fieldPrompt,returnField,context,validateField)
{
  var thisEl = document[formName].elements[fieldName+"_entered"];
  var setEl = document[formName].elements[fieldName];

  if (thisEl == null) {
    alert("Can't find ("+formName+"."+fieldName+") for lookup check.");
  }
  if (thisEl.value == thisEl.defaultValue) {
    //return;
  }
  alert('FIRING:'+context);
  var dataVal = String(thisEl.value);
  dataVal.replace(/ /g,'+');
  var url = "/cgi-bin/lookup_value_xml.cgi?lookup_prompt="+fieldPrompt+"&lookup_table="+lookupTableName+"&return_field="+returnField+"&lookup_field="+lookupFieldName+"&lookup_data="+dataVal+"&key_field="+keyField;

  var request_obj = loadXMLDoc2(url,processLookupRequest);

  if (request_obj == null) {
    alert('Cannot create request_obj for XML document!');
  }  else {
    request_obj.syn_context = context;
  }
  //request_list.push(request_obj);  
  var ted = new Object();
  ted.set_el = setEl;
  ted.this_el = thisEl;
  ted.checked_val = thisEl.value;
  ted.fieldPrompt = fieldPrompt;
  ted.context = context;
  ted.field_name = fieldName;
  ted.validate_func = validateField;
  lookupStates[context] = ted;
  //glob_this_el = thisEl;
  //glob_checked_val = thisEl.value;
  //glob_fieldPrompt = fieldPrompt;
  //glob_context = context;
  //glob_field_name = fieldName;
  //glob_validate_func = validateField;
}

// {{{ rawurldecode
function rawurldecode( str ) {
    // Decode URL-encoded strings
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_rawurldecode/
    // +       version: 901.1411
    // +   original by: Brett Zamir
    // *     example 1: rawurldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin+van+Zonneveld!'
    // *     example 2: rawurldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: rawurldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'

    var histogram = {};
    var ret = str.toString(); 

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';

    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }

    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);

    return ret;
}// }}}

// {{{ rawurlencode
function rawurlencode( str ) {
    // URL-encode according to RFC 1738
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_rawurlencode/
    // +       version: 901.1411
    // +   original by: Brett Zamir
    // *     example 1: rawurlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin van Zonneveld%21'
    // *     example 2: rawurlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: rawurlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
 
    var histogram = {}, tmp_arr = [];
    var ret = str.toString();

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The histogram is identical to the one in urldecode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A'; 
    histogram['~']   = '%7E';
    histogram['!']   = '%21';

    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);

    // Restore spaces, converted by encodeURIComponent which is not rawurlencode compatible
    ret = replacer('%20', ' ', ret); // Custom replace. No regexing

    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }

    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });

    return ret;
}// }}}


