// Basic AJAX functions
// IMPORTANT: this is currently busted on IE6 and earlier
// - in particular, since we do not have a replacement for the
//   .huibusy property, our busy count will not be right for the
//   busy indicator (may get cancelled too many times on an abort)
// - however, AJAX calls should still go through

var busy;

function ajaxTestNative() {
  return (typeof XMLHttpRequest != "undefined")
}

function ajaxNewObject() {
  var A;
  var msxmlhttp = new Array(
			    "Msxml2.XMLHTTP.5.0",
			    "Msxml2.XMLHTTP.4.0",
			    "Msxml2.XMLHTTP.3.0",
			    "Msxml2.XMLHTTP",
			    "Microsoft.XMLHTTP");
  if (ajaxTestNative())
    return new XMLHttpRequest();
  for (var i = 0; i < msxmlhttp.length; i++) {
    try {
      A = new ActiveXObject(msxmlhttp[i]);
      if (A)
	return A;
    } catch (e) {
      A = null;
    }
  }
  return A;
}

function ajaxCancel(req) {
  if (req) {
    req.abort();
    if (!ajaxTestNative() || req.huibusy) {
      var o = document.getElementById("HUIAjaxBusy");
      if (o)
	ajaxBusyStop();
      if (ajaxTestNative())
	req.huibusy = false;
    }
  }
}

function ajaxMakeArg(name, value) {
  return "&" + escape(name) + "=" + escape(value);
}

function ajaxCallback(req,cback) {
  if (req.readyState != 4)
    return;
  // decode result...
  var txt = req.responseText.replace(/^\s*|\s*$/g,"");
  var status = txt.charAt(0);
  var data = txt.substring(2);
  if (cback) {
    if (status == "-") {
      // Error!
      if ((typeof cback == "object") && cback.onerror) {
	var callback = cback.onerror;
	callback(data,cback);
      } else if (self.huiDebug) {
	huiDebug("AJAX Error: " + data);
      }
    } else if (status == "+") {
      if (typeof cback == "object") {
	var callback;
	if (cback.onsuccess)
	  callback = cback.onsuccess;
	else
	  callback = cback.callback;
	callback(eval(data),cback);
      } else {
	cback(eval(data),false);
      }
    } else {
      if (typeof cback == "object" && cback.onunknown) {
	var callback = cback.onunknown;
	callback(txt,cback);
      }
    }
  }
  if (!ajaxTestNative() || req.huibusy) {
    var o = document.getElementById("HUIAjaxBusy");
    if (o)
      ajaxBusyStop();
    req.huibusy = false;
  }
}

function ajaxDoCall(uri, func, argdata, cback) {
  if (!uri)
    uri = document.location;

  var req = ajaxNewObject();
  if (req == null) // no AJAX support
    return false;

  req.open("POST",uri,true);
  req.setRequestHeader("Method","POST " + uri + " HTTP/1.1");
  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  req.onreadystatechange = function() {
    ajaxCallback(req,cback);
  }
  var postData = '_ajax=1' + ajaxMakeArg('_ajaxfunc',func) + argdata;
  var o = document.getElementById("HUIAjaxBusy");
  if (o)
    ajaxBusyStart();
  if (ajaxTestNative())
    req.huibusy = true;
  req.send(postData);
  return req;
}
