function Transport() {

	// public fields
	this.url = "";
	this.urlparameter = null;
	this.method = "GET";
	this.requestObject = getRequestObject();
	this.async = true;

	// private methods
	function getRequestObject() {
		var req;
		if (window.XMLHttpRequest) {try {req = new XMLHttpRequest();} catch (e) {req = false;}} 
		else if (window.ActiveXObject) {try {req = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {req = false;}
		if (!req) {try {req = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {req = false;}}}
		return req;
	}
	
	function send() {
		if (!this.requestObject) this.requestObject = getRequestObject();
		if (!this.requestObject) return;
		
		if (this.method == "POST") {
			this.requestObject.open(this.method, this.url, this.async);
			this.requestObject.onreadystatechange = this.callbackFunc;
			this.requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.requestObject.setRequestHeader("Content-length", this.urlparameter.length);
			this.requestObject.setRequestHeader("Connection", "close");
      		this.requestObject.send(this.urlparameter);
		}
		else {
			if (this.urlparams!=null) {this.requestObject.open(this.method, this.url+"?"+this.urlparams, this.async);} 
			else {this.requestObject.open(this.method, this.url, this.async);}
			this.requestObject.onreadystatechange = this.callbackFunc;
			this.requestObject.send(null);
		}
	}
	
	function sendXML(xml) {
		if (!this.requestObject) this.requestObject = getRequestObject();
		if (!this.requestObject) return;

		this.requestObject.open(this.method, this.url, this.async);
		this.requestObject.onreadystatechange = this.callbackFunc;
		this.requestObject.setRequestHeader("Content-type", "text/xml");
		this.requestObject.setRequestHeader("Connection", "close");
   		this.requestObject.send(xml);		
	}
	
	// public methods
	this.reset = function() {this.url = "";this.urlparameter = null;this.method = "GET";this.async = true;};
	
	this.init = function(method,url,params,async) {this.url = url;this.urlparameter = params;this.method = method;this.async = async;};
	
	this.callbackFunc = function() {};
	
	this.sendRequest = send;
	
	this.sendXMLDocument = sendXML;
}

var TransporterFactory = (function(){
	var stack = new Array();
	var poolSize = 6;
	var nullFunction = function() {};
 
	function getTransportObject() {return new Transport();}

	for (var i=0;i<poolSize;i++) {stack.push(getTransportObject());}
 
	return ({
		release:function(t){t.reset();t.callbackFunc = nullFunction;stack.push(t);},
		getInstance:function(){if (stack.length < 1) {return getTransportObject();} else {return stack.pop();}}
	});
})();

/* functions for synchron requests */
function pageRequest(page,params) {
	if (!page||page=="") return "";	
	var res="";
	var req=TransporterFactory.getInstance();
	req.init("POST",page,params,false);
	req.sendRequest();
	if (req.requestObject.readyState==4) {
		if (req.requestObject.status==200) {
			res=req.requestObject.responseText;
		} else {
			res="HTTP: "+req.requestObject.status;
		}
	}
	TransporterFactory.release(req);
	return res;
}

function xmlRequest(page,params) {
	if (!page||page=="") return "";	
	var res="";
	var req=TransporterFactory.getInstance();
	req.init("POST",page,params,false);
	req.sendRequest();
	if (req.requestObject.readyState==4) {
		if (req.requestObject.status==200) {
			res=req.requestObject.responseXML;
		} else {
			res="HTTP: "+req.requestObject.status;
		}
	}
	TransporterFactory.release(req);
	return res;
} 

function xmlDocumentRequest(page,xml) {
	if (!page||page=="") return "";	
	var res="";
	var req=TransporterFactory.getInstance();
	req.init("POST",page,"",false);
	req.sendXMLDocument(xml);
	if (req.requestObject.readyState==4) {
		if (req.requestObject.status==200) {
			res=req.requestObject.responseXML;
		} else {
			res="HTTP: "+req.requestObject.status;
		}
	}
	TransporterFactory.release(req);
	return res;
}