
  var AJAX_CLOSED=0;
  var AJAX_OPEN=1;
  var AJAX_SENT=2;
  var AJAX_RECEIVING=3;
  var AJAX_READY=4;

  xmlhttp=new Array();
  function ajax_assignID() {
    cnt=0;
    while(xmlhttp[cnt++]);
    return cnt;
  }

  function ajax_get_func(myid,myfunc) {
    if (ajax_status(myid)!=AJAX_READY) return;
    eval(myfunc+'(ajax_get(myid))');
    ajax_clean(myid);
  }

  function ajax_get_url(myurl,mystatefunc) {
    ajax_load(myurl,"",'ajax_get_func(#id,"'+mystatefunc+'")');
  }

  var ajaxAbort=false;
  function ajax_load(myurl,mymethod,mystatefunc,myid) {
    if (ajaxAbort) return;
    var cnt=0,myfunc;
    if (!myid) {
      while (true) {
        if (!xmlhttp[cnt]) break;
        cnt++;
      }
    } else {
      cnt=myid;
    }
    if (document.all)
      xmlhttp[cnt]=new ActiveXObject('Microsoft.XMLHTTP');
    else
      xmlhttp[cnt]=new XMLHttpRequest();
    if (!mymethod) mymethod="GET";

    apost="";
    if (mymethod.toUpperCase()=="POST") {
      var p=myurl.indexOf("?");
      if (p!=-1) {
        apost=myurl.substr(p+1);
        myurl=myurl.substr(0,p);
      }
    }

    xmlhttp[cnt].open(mymethod,myurl,true);

    if (mymethod.toUpperCase()=="POST") {
      xmlhttp[cnt].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xmlhttp[cnt].setRequestHeader("Content-length",apost.length);
      xmlhttp[cnt].setRequestHeader("Connection", "close");
    }

    if (mystatefunc) {
      if (mystatefunc.indexOf("#id")==-1) alert("ajax_load: Warning! Need #id as parameter of status function.");
      mystatefunc=mystatefunc.replace(/\#id/g,cnt);
      eval('myfunc=function() {'+mystatefunc+'};');
    } else {
      eval('myfunc=function() {if (ajax_status('+cnt+')==4) ajax_clean('+cnt+')};');
    }
    xmlhttp[cnt].onreadystatechange=myfunc;
    if (apost!="") xmlhttp[cnt].send(apost); else xmlhttp[cnt].send(null);
    return cnt;
  }

  function ajax_abort_all() {
    ajaxAbort=true;
    while (xmlhttp.length>0) {
      e=xmlhttp.shift();
      if (e) {
        e.abort();
        delete e;
      }
    }

    ajaxAbort=false;
  }

  function ajax_abort(myid) {
    if (!xmlhttp[myid]) return;
    xmlhttp[myid].abort();
  }

  function ajax_get(myid) {
    if (!xmlhttp[myid]) return;
    if (xmlhttp[myid].readyState<AJAX_RECEIVING) return;
    mycontent=xmlhttp[myid].responseText;
    //if (xmlhttp[myid].readyState==4) ajax_clean(myid);
    return mycontent;
  }

  function ajax_status(myid) {
    if (!xmlhttp[myid]) return;
    return xmlhttp[myid].readyState;
  }

  function ajax_clean(myid) {
    xmlhttp[myid]=0;
    delete xmlhttp[myid];
  }

  function ajax_debug(myid,ajaxstatus) {
    if (!xmlhttp[myid]) return;
    if (!ajaxstatus) ajaxstatus=AJAX_READY;
    if (ajax_status(myid)<ajaxstatus) return;
    //alert(ajax_get(myid));
    prompt("",ajax_get(myid));
    if (ajax_status(myid)!=AJAX_READY) return;
    ajax_clean(myid);
  }
