// sends a request to url, calls function with xmlhttprequest to perform task
// typically the function will just handle req.readyState == 4 and req.status == 200
function issueAsyncRequest(url, fn) {
	var req;
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.onreadystatechange = function () {
      fn (req, url);
    };
		req.open("GET", url, true);
		req.send(null);
	}
	else {
		req = new ActiveXObject("Microsoft.XMLHTTP");
		req.onreadystatechange = function () {
      fn (req, url);
    };
		req.open("GET", url, true);
		req.send();
	}
	return req;
}
// sends a request to url, calls function with xmlhttprequest to perform task
// data is pulled from the form
function issueAsyncFormRequest(form, url, fn) {
	var toSend = "";
  var req;
	for (var i = 0; i < form.elements.length; i++) {
		var e = form.elements[i];
		if (toSend != "")
			toSend += "&";
		toSend += escape(e.name) + "=" + escape(e.value);
	}
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.onreadystatechange = function () {
      fn (req, url);
    };
		req.open ("POST", url, true);
    req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
		req.send (toSend);
	}
	else {
		req = new ActiveXObject("Microsoft.XMLHTTP");
		req.onreadystatechange = function () {
      fn (req, url);
    };
		req.open ("POST", url, true);
    req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
		req.send (toSend);
	}
	return req;
}
// useful default json request handler
function defaultJsonRequestHandler (req, url) {
  if (req.readyState != 4)
    return null;
  if (req.status != 200) {
    alert ('url:' + url + '\nerror:' + req.statusText);
    return null;
  }
  var json = eval ('(' + req.responseText + ')');
  if (!json['success']) {
    alert (json['error']);
    return null;
  }
  return json;
}
// loads a javascript
// function called when loaded
function loadJavascript (url, fn) {
  var req = issueAsyncRequest (url, function (req, url) {
    if (req.readyState != 4)
      return;
    if (req.status != 200) {
      alert ('url:' + url + '\n' + req.statusText);
      return;
    }
    eval (req.responseText);
    if (fn ())
      fn ();
  });
  return;
}
// sets an html element with given text
// return true if set
function setHtml (id, txt, cls) {
  var e = document.getElementById (id);
  if (!e) {
    alert ('Element ' + id + ' does not exist!');
    return 0;
  }
  e.innerHTML = txt;
	if (cls)
		e.className = cls;
  return e;
}
// replaces an element's html content with that of a specific page
// function called when completed
function loadHtml (id, url, cls, fn) {
  var req = issueAsyncRequest (url, function (req, url) {
    if (req.readyState != 4) 
      return;
    if (req.status != 200) {
      alert ('url:' + url + '\n' + req.statusText);
      return;
    }
		var e = setHtml (id, req.responseText, cls);
    if (!e)
      return;
    if (fn)
      fn (e);
  });
  return req;
}
// creates a function that will defer calling said function until script is loaded
// arguments can be passed to the target function
// the result cannot be passed from the target function to the caller
function deferFn (fnName, url) {
  var fn = function () {
    var mythis = this;
    var args = arguments;
    eval (fnName + ' = null;');
    loadJavascript (url, function () {
      eval (fnName + '.apply (mythis, args);');
    });
  };
  eval (fnName + ' = fn;');
}

// get parameters as an array
function getParamsAsArray() { 
	var results = new Array ();
	var input = document.location.search.substr(1); 
	if (input) { 
		var srchArray = input.split('&'); 
		var tempArray = new Array(); 
		for (var i = 0; i < srchArray.length; i++) { 
			tempArray = srchArray[i].split('='); 
			results[unescape(tempArray[0])] = unescape(tempArray[1]); 
		} 
	}
	return results; 
}

// html encode stuff
htmlEncode = function (val) {
    var div = document.createElement('div');
    var text = document.createTextNode(val);
    div.appendChild(text);
    return div.innerHTML;
}

