tr = {};
tr.ajax = {};

    tr.ajax.ajaxIdent = 0;
    tr.ajax.ajaxArray = [];
	tr.ajax.traffic = 0;

    tr.ajax.getCalls = function(){
    							return tr.ajax.ajaxIdent;
    						}
    tr.ajax.getTraffic = function(){
    							return tr.ajax.traffic;
    						}

    tr.ajax.New = function(website,paramter,method,async,onComplete,dontDelete){
        tr.ajax.ajaxArray[tr.ajax.ajaxIdent] = new tr.ajax.ajaxClass(tr.ajax.ajaxIdent,website,paramter,method,async,onComplete,dontDelete);
        var r = tr.ajax.ajaxArray[tr.ajax.ajaxIdent];
        tr.ajax.ajaxArray[tr.ajax.ajaxIdent].request();
        tr.ajax.ajaxIdent++;
        try{
            if(r.reqObj.responseText != undefined){
            	tr.ajax.traffic += r.reqObj.responseText.length;
            }
        }
        catch(e){}
        return r;
    }

	tr.ajax.get = function(ident){
	    return tr.ajax.ajaxArray[ident];
	}

	tr.ajax.Delete = function(ident){
	    delete tr.ajax.ajaxArray[ident];
	}

	tr.ajax.garbageCollector = function(){
	    var l = tr.ajax.ajaxArray.length;
	    if(l > 1000){
	        for(var i = 0; i < l-1000; i++){
	            tr.ajax.Delete(i);
	        }
	    }
	}

	tr.ajax.ajaxClass = function(ident,website,parameter,method,async,onComplete,debug){
	   	if(website == undefined)
	       	this.url = '';
	   	else
	       	this.url = website;
	   	if(method == undefined)
	       	this.method = "POST";
	   	else
	       	this.method = method;
	   	if(parameter == undefined)
	       	this.parameter = "";
	   	else{
    	   	this.parameter = parameter;
    	   	if(this.parameter.charAt(0) != "?")
    	   		this.parameter = "?" + this.parameter;
	   	}
       	if(async == undefined)
           	this.async = true;
       	else
	       	this.async = async;
	   	this.status = 'start';
	   	this.errornr = 0;
	   	this.ident = ident;
	   	this.onComplete = onComplete;
	   	if(debug == undefined)
            this.debug = true;
        else
            this.debug = debug;
	    this.reqObj = null;
	    try{
            this.reqObj = new XMLHttpRequest();
        }
        catch (e){
            try{
                this.reqObj = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e){
                try{
                    this.reqObj = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (failed){
                    this.reqObj = null;
                }
            }
        }

	   this.get = function(dontDelete){
	       return this.reqObj.responseText;
	   }
	   this.getObj = function(){
	       return this.reqObj;
	   }

	   this.Delete = function(){
	   	   tr.ajax.Delete(this.ident);
	   }

	   this.request = function(){
	       var reqCode = "new function(){return function(){";
	       reqCode = reqCode + "switch(tr.ajax.get("+this.ident+").reqObj.readyState){";
	       reqCode = reqCode + "case 4:if(tr.ajax.get("+this.ident+").reqObj.status != 200){";
	       reqCode = reqCode + "tr.ajax.get("+this.ident+").status = 'error';tr.ajax.get("+this.ident+").errornr = tr.ajax.get("+this.ident+").reqObj.status;";
	   	   reqCode = reqCode + "}else{tr.ajax.get("+this.ident+").status = 'done';if(is_function(tr.ajax.get("+this.ident+").onComplete)){tr.ajax.get("+this.ident+").onComplete();}if(tr.ajax.get("+this.ident+").dontDelete == false){tr.ajax.Delete("+this.ident+");}";
	   	   reqCode = reqCode + "}break;default:tr.ajax.get("+this.ident+").status = tr.ajax.get("+this.ident+").reqObj.readyState;break;}}}";

	   	   this.reqObj.onreadystatechange = eval(reqCode);
	       this.reqObj.open(this.method, this.url, this.async);
	       this.reqObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	       this.reqObj.setRequestHeader("Content-length", this.parameter.length);
      	   this.reqObj.setRequestHeader("Connection", "close");
	       this.reqObj.send(parameter);
	   }

	}

