////////////////////////////////////////////////////////////////////
// AJAXConn class
AJAXConn.CLASS_NAME = 'AJAXConn';
AJAXConn.APP_URL = 'IBCSBase/php/index/php';
AJAXConn.DEFAULT_TIMEOUT = 60000;
AJAXConn.uniqueID = 0;
AJAXConn.htObj = new Hashtable();

// Constructor
function AJAXConn(vars) {
  this.id = AJAXConn.uniqueID;
  this.vars = vars;
  this.xmlhttp = null;
  try {
    this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch(e) {
    try {
      this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e2) {
      try {
        this.xmlhttp = new XMLHttpRequest();
      } catch(e3) {
        return;
      }
    }
  }
  AJAXConn.htObj.put(this.id, this); 
  AJAXConn.uniqueID++;
}

/////////////////////////////////////////////////////////////////////////////////////
// Static functions 
/////////////////////////////////////////////////////////////////////////////////////

// Add a query filter to the string
AJAXConn.addAjaxQryFlt = function(cfg, paramName) {
  var retStr = "";

  // Need both the id to locate the field and the field type
  if (cfg.id == undefined || cfg.t == undefined) {
    alert("AJAXConn.addAjaxQryFlt old type not supported");
    return "";
  }

  // Get the html dom elem that is the filter
  var field = $(cfg.id); 
  if (field == undefined) {
    alert("Could not find field for: " + cfg.id);
    return "";
  }

  // Set the paramName that will be sent to the server
  var paramName = cfg.id; 
  if (cfg.pn != undefined) {
    paramName = cfg.pn;
  }

  // Get the fieldVal to be passed in the query
  var fieldVal = "";
  switch(cfg.t) {
    case FormFilter.FILTER_TYPE_CHECKBOX:
      if (field.checked) {
        retStr = "&" + paramName + "=on";
      }
      break;

    case FormFilter.FILTER_TYPE_DATE:
      fieldVal = encodeURIComponent(field.value);
      break;

    case FormFilter.FILTER_TYPE_DATE_RANGE:
      fieldVal = FormFilter.getDateRangeValue(cfg.id);
      break;

    case FormFilter.FILTER_TYPE_MULTI_TEXT:
      fieldVal = FormFilter.getMultiTextValue(cfg.id);
      break;

    case FormFilter.FILTER_TYPE_NUMERIC_RANGE:
      fieldVal = FormFilter.getNumericRangeValue(cfg.id);
      break;

    case FormFilter.FILTER_TYPE_SELECT:
      fieldVal = encodeURIComponent(field.value);
      break;
 
    default:
      alert("Unknown filter type: " + cfg.t);
      return "";
  }

  if (fieldVal != "") {
    retStr = "&" + paramName + "=" + fieldVal;
  }

  return retStr;
}

// Add a query string - passing string
AJAXConn.addAjaxQryFlt2 = function(val, field) {
  var retStr = "";
  if (val != null && val != "") {
    retStr = "&" + field + "=" + encodeURIComponent(val);
  }
  return retStr;
}

// Static utility method to retrieve an xml file via AJAX
// and then call a specified function
AJAXConn.getXML = function(vars) {
  var theUrl = vars.url;
  var desc = vars.desc;
  var f = vars.functionToCall;

  var timeout = $addParam(AJAXConn.DEFAULT_TIMEOUT, 'timeout', 'vars');

  var d = new Date();
  theUrl += "&ajaxQuery=Y&xtm=" + d;

  // Important setting which determines whether the call blocks the client
  var allowAsynchron = true;
  if (vars.allowAsynchron != undefined) {
    allowAsynchron = vars.allowAsynchron;
  }
 
  var xmlDoc = null;
  var ajaxConn = new AJAXConn(vars);
  var xmlhttp = ajaxConn.xmlhttp;
  if (xmlhttp == null) {
    alert("XMLHTTP returned null");
    return;
  }

  xmlhttp.open("GET", theUrl, allowAsynchron);

  xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState != 4) {
      return;
    }

    if (xmlhttp.status != 200) {
      alert("Problem accessing " + desc + " page. " + xmlhttp.status);
      return;
    }

    var xmlDoc = xmlhttp.responseXML;
    f(xmlDoc, vars);
    AJAXConn.htObj.remove(ajaxConn.id);
  }
  xmlhttp.send(null);
  return ajaxConn.id;
}

// Static method to cancel a single AJAX request
AJAXConn.cancelAjaxRequestForID = function(id) {
  var ajaxConn = AJAXConn.htObj.get(id);
  if (ajaxConn != null) {
    ajaxConn.cancelAjaxRequest();
  }
}

// Static method to cancel all oustanding AJAX requests
AJAXConn.cancelAllAjaxRequests = function() {
  var cancelAll = confirm("Are you sure you want to cancel the outstanding queries?");
  if (!cancelAll) {
    return false;
  }

  for (var id in AJAXConn.htObj) {
    var ajaxConn = AJAXConn.htObj.get(id); 
    if (ajaxConn != null) {
      ajaxConn.cancelAjaxRequest();
    } 
  }
  AJAXConn.htObj = new Hashtable(); 
  AJAXConn.uniqueID = 0;
  return true;
}

/////////////////////////////////////////////////////////////////////////////////////
// Instance functions 
/////////////////////////////////////////////////////////////////////////////////////

// Cancel a specific AJAX request
AJAXConn.prototype.cancelAjaxRequest = function() {
  this.xmlhttp.onreadystatechange = function() {}
  this.xmlhttp.abort();
  AJAXConn.htObj.remove(this.id);

  // If there is an abort function defined then call it
  if (this.vars.aboortFunction != undefined) {
    var f = vars.abortFunction;
    f(vars);
  }
}
