
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 extractScripts(d) {
  var tags=d.getElementsByTagName("script");
  var scripts=new Array();
  for (var k=tags.length-1;k>=0;k--) {
    var tag=tags[k];
    scripts[k]=tag.innerHTML;
    tag.parentNode.removeChild(tag);
  }
  return scripts;
}

function removeScripts(str) {
  var AJAX_SCRIPT_REGEXP=/<script[^>]*>([\s\S]*?)<\/script>/gi;
  return str.replace(AJAX_SCRIPT_REGEXP,'');
}

function runScripts(scripts) {
  if (typeof scripts=="string") {
    var AJAX_SCRIPT_REGEXP=/<script[^>]*>([\s\S]*?)<\/script>/gi;
    while ((script=AJAX_SCRIPT_REGEXP.exec(scripts))) {
      if (typeof window.execScript!="undefined")  window.execScript(script[1]); else window.eval(script[1]);
    }
    return;
  }
  for (var k=0;k<scripts.length;k++) eval(scripts[k]);
}

function appendChildAndRunScripts(e,d) {
  var tags=d.getElementsByTagName("script");
  var scripts=new Array();
  for (var k=tags.length-1;k>=0;k--) {
    var tag=tags[k];
    scripts[k]=tag.innerHTML;
    tag.parentNode.removeChild(tag);
  }
  e.appendChild(d);

  for (var k=0;k<scripts.length;k++) eval(scripts[k]);
}

function get_form_data(aform) {
  var result=new Array();
  for (var k=0;k<aform.elements.length;k++) {
    var el=aform.elements[k];
    var aname=el.name;
    if (el.type=='checkbox') {
      if (typeof result[aname]=='undefined') result[aname]=new Array();
      if (el.checked) result[aname].push(el.value);
    } else {
      if (el.length) {
        if (el.options) {
          var si=el.options.selectedIndex;
          if (si!=-1) result[aname]=el.options[si].value; else result[aname]='';
        }
      } else {
        result[aname]=el.value;
      }
    }
  }
  return result;
}

function ajax_get_func(myid,myfunc) {
  if (ajax_status(myid)!=AJAX_READY) return;
  p=myfunc.indexOf("(");
  if (p>0) {
    myfunc=myfunc.replace(/\#result/g,ajax_get(myid));
    eval(myfunc);
  } else {
    eval(myfunc+'(ajax_get(myid))');
  }
  ajax_clean(myid);
}

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

function ajax_post_url(myurl,mystatefunc) {
  var s=ajax_load(myurl,"POST",'ajax_get_func(#id,"'+mystatefunc+'")');
  return s;
}

function ajax_get_view_rect(win) {
  if(!win) win = window;
  var pos = {left:0,top:0};

  if (typeof win.pageXOffset!='undefined') {
    // Mozilla/Netscape
    pos.left = win.pageXOffset;
    pos.top = win.pageYOffset;
  } else {
    var obj=(win.document.compatMode && win.document.compatMode == "CSS1Compat") ?
    win.document.documentElement : win.document.body || null;

    pos.left=obj.scrollLeft;
    pos.top=obj.scrollTop;
  }


  if (document.all) {
    pos.width=document.documentElement.clientWidth;
    pos.height=document.documentElement.clientHeight;
  } else {
    pos.width=innerWidth;
    pos.height=innerHeight;
  }

  return pos;
}

function ajax_dialog_close(me) {
  while (me) {
    if (me.className=="ajax_dialog") {
      me.parentNode.removeChild(me);
      return;
    }
    me=me.parentNode;
  }
}

function ajax_dialog_load_complete(myid) {
  if (ajax_status(myid)!=AJAX_READY) return;
  var s=ajax_get(myid);
  var r=ajax_get_view_rect(window);
  var mydialog=document.createElement('div');
  mydialog.className='ajax_dialog';
  var prv=document.createElement('div');
  prv.style.position='absolute';
  prv.style.zIndex=500;
  prv.style.left='0px';
  prv.style.top='0px';
  prv.style.width=document.documentElement.scrollWidth+"px";
  prv.style.height=document.documentElement.scrollHeight+"px";
  prv.style.cursor="wait";
  var d=document.createElement('div');
  d.style.position='absolute';
  d.style.zIndex=500;
  d.style.visibility='hidden';
  d.innerHTML=s;
  mydialog.appendChild(prv);
  mydialog.appendChild(d);
  document.body.appendChild(mydialog);
  d.style.left=(r.left+Math.round((r.width-d.offsetWidth)/2))+"px";
  d.style.top=(r.top+Math.round((r.height-d.offsetHeight)/2))+"px";
  d.style.width=d.offsetWidth+"px";
  d.style.height=d.offsetHeight+"px";
  d.style.visibility='';

  ajax_clean(myid);
}

function ajax_dialog_load(myurl) {
  ajax_load(myurl,"POST",'ajax_dialog_load_complete(#id)');
}

function ajax_xml_post_url_array(myurl,arr,mystatefunc) {

  var apost="";
  for (var key in arr) {
    if (!arr.hasOwnProperty(key)) continue;
    if (apost!="") apost+="&";
    apost+=key+"="+encodeURIComponent(arr[key]);
  }

  ajax_load(myurl,"POST",mystatefunc,false,apost,true);
}

function ajax_post_url_array(myurl,arr,mystatefunc) {

  var apost="";
  for (var key in arr) {
    if (!arr.hasOwnProperty(key)) continue;
    if (apost!="") apost+="&";
    apost+=key+"="+encodeURIComponent(arr[key]);
  }

  ajax_load(myurl,"POST",mystatefunc,false,apost);
}

function ajax_xml_load(myurl,mymethod,mystatefunc) {
  var s=ajax_load(myurl,mymethod,mystatefunc,false,false,true);
  return s;
}

var ajaxAbort=false;
function ajax_load(myurl,mymethod,mystatefunc,myid,apost,xml) {
  if (ajaxAbort) return;
  if (typeof apost=="undefined") apost=false;
  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";

  if (typeof dom != "undefined") {
    var p=myurl.indexOf("?");
    if (p!=-1) myurl+='&dom='+dom; else myurl+='?dom='+dom;
  }

  if (mymethod.toUpperCase()=="POST" && !apost) {
    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");
    //Die folgenden beiden Zeilen sind nicht erforderlich und werden auf Grund von Sicherheitsproblematiken
    //von neueren Browsern (Chrome) teilweise auch nicht unterstützt.
    //xmlhttp[cnt].setRequestHeader("Content-length",apost.length);
    //xmlhttp[cnt].setRequestHeader("Connection", "close");
  }

  if (typeof mystatefunc=="function") {
  
   if (typeof xml!="undefined" && xml) {
     myfunc=function () {
       if (ajax_status(cnt)!=AJAX_READY) return;
       var result=ajax_get_xml(cnt);
       ajax_clean(cnt);
       mystatefunc(result);
     }
   } else {
     myfunc=function () {
       if (ajax_status(cnt)!=AJAX_READY) return;
       var result=ajax_get(cnt);
       ajax_clean(cnt);
       mystatefunc(result);
     }
   }
   
  } else {
    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_get_xml(myid) {
  if (!xmlhttp[myid]) return;
  if (xmlhttp[myid].readyState<AJAX_RECEIVING) return;
  
  var mycontent=xmlhttp[myid].responseXML;
  //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);
}

