function on(obj, evt, code) {
  if (obj.addEventListener) {
    if (obj == window && evt == "load") {
      obj = document;
      evt = "DOMContentLoaded";
    }
    obj.addEventListener(evt,
      (function (code) {
        return function() { code(); }
      })(code), false);
  } else if (obj.attachEvent) {
    if (obj == window && evt == "load") {
      obj = document;
      evt = "DOMContentLoaded";
    }
    obj.attachEvent("on"+evt,
      (function (code) {
        return function() { code(); }
      })(code));
  } else {  
    obj['on'+evt] =
      (function (code) {
        return function() { code(); }
      })(code);
  }
}

function get_xhr() {
  var request = false;
  try {
    request = new ActiveXObject('Msxml2.XMLHTTP');
  } catch (err2) {
    try {
      request = new ActiveXObject('Microsoft.XMLHTTP');
    } catch (err3) {
      try {
        request = new XMLHttpRequest();
      } catch (err1) {
        alert("Unable to initialise XHR (Ajax) object - check your web browser");
        request = false;
      }
    }
  }
  return request;
}

function ajaj_get(url, callback) {
  var xhr = get_xhr();
  if (xhr == false) return;
  xhr.open("GET", url);
  xhr.setRequestHeader("Connection", "close");

  xhr.onreadystatechange = function(callback) { return function() {
    if(xhr.readyState==4) { //finished
      if(xhr.status==200) { //it was good?
        var ret = eval('(' + xhr.responseText + ')');
        callback(ret);
      } else { //it was bad
        alert("Critical XHR (ajax) failure - did we lose access to the server?");
      }
    };
  }}(callback);
  xhr.send();
}

function ajaj_post(url, form, callback) {
  var xhr = get_xhr();
  if (xhr == false) return;
  var post = "";
  for (var x=0; x<form.elements.length; x++) {
    var ele = form.elements[x];
    if (post) post += "&";
    post += ele.name + "=" + encodeURIComponent(ele.value);
  }  
  
  xhr.open("POST", url);
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhr.setRequestHeader("Content-length", post.length);
  xhr.setRequestHeader("Connection", "close");

  xhr.onreadystatechange = function(callback) { return function() {
    if(xhr.readyState==4) { //finished
      if(xhr.status==200) { //it was good?
        var ret = eval('(' + xhr.responseText + ')');
        callback(ret);
      } else { //it was bad
        alert("Critical XHR (ajax) failure - did we lose access to the server?");
      }
    };
  }}(callback);
  xhr.send(post);
}
