
function xhr() 
{
	/**
	 * @access public
	 * @var Object
	 */
	this.argList = new Object();
	
	for(var i=0; i < arguments.length; i++)
	{
		setArgument(this, arguments[i]);
	}
	
	/**
	 * @access private
	 * @param referenz ref 
	 * @param Object arg 
	 */
	function setArgument(ref, arg)
	{
		if(ref.argList == null)
			ref.argList = new Object();
			
		for(ele in arg)
		{
			ref.argList[ele] = arg[ele];
		}
	}
	
	/**
	 * @access private
	 * @retrun Object 
	 */
	function createXHR()
	{
		var request = false;
		try 
		{
			request = new XMLHttpRequest();
		}
		catch (trymicrosoft)
		{
			try
			{
				request = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (othermicrosoft) 
			{
		    	try 
				{
					request = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch (failed) 
				{
					request = false;
				}
			}
		}
		
		/**
		 * @access public
		 * @param string header 
		 */
		request.setDefaultReqHeader = function(header)
		{
			this.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
			this.setRequestHeader("Connection", "close");
			if( typeof header == "string")
			{
				var headerArr = header.split("&");
				for(headerData in headerArr)
				{
					if(headerArr[headerData] != "")
						this.setRequestHeader(headerArr[headerData].split("=")[0], headerArr[headerData].split("=")[1]);
				}
			}
		}

		return request;
	}
	
	/**
	 * @access public
	 * @return Object 
	 */
	this.getXHR = function()
	{
		return createXHR(); 
	}
	
}

xhr.prototype = {
	/**
	 * @access public
	 * @param string get 
	 * @param function action 
	 */
	req : {},
	newReq : function (get, action)
	{
		this.req = this.getXHR();
		var req = this.req;
		if(req != false)
		{
			var tempRef = this;
			req.onreadystatechange = function() { tempRef.handle(req, action); }; 
			
			if(this.argList["post"])
			{
				req.open("POST", this.buildGet(get), true);
				req.setRequestHeader("Content-length", this.argList["post"].length);
				req.setDefaultReqHeader(this.argList["header"]);
				req.send(this.argList["post"]);
			}
			else
			{
				req.open("GET", this.buildGet(get), true);
				req.setDefaultReqHeader(this.argList["header"]);
				req.send(null);
			}
		}
		else
		{
			alert("Es trat ein Problem auf: " + get + ".xhr");
		}
		return this;
	},
	/**
	 * @access public
	 * @param string get
	 * @return string sid
	 */
	buildGet : function(get)
	{
		
		if(get == "")
		{
			var path = window.location.pathname.split("/");
			get = path[path.length-1] + get;
		}
		
		if(this.argList["SID"])
		{
			if(get.indexOf("?") > -1)
			{
				get+= "&" + this.searchSID(this.argList["SID"]);
			}
			else
			{
				get+= "?" + this.searchSID(this.argList["SID"])
			}
		}

		
		return get;
	},
	/**
	 * @access public
	 * @return string sid
	 */
	searchSID : function(SID)
	{
		var data = window.location.search.substr(1).split("&");
		
		for(var i in data)
		{
			var dataArr = data[i].split("=");
			if(dataArr[0] == SID)
			{
				return SID + "=" + dataArr[1];
			}
		}
	},
	/**
	 * @access public
	 * @param Object req 
	 * @param function action 
	 */
	handle : function(res, action)
	{
		if (res.readyState == 4 && res.responseText != "") 
		{ 
			if(this.argList["res"] && this.argList["res"] == "obj")
			{
				action(eval("(" + res.responseText + ")"));
				return false;
			}
			
			action(res.responseText);
			return false;
		}
	},
	abort : function()
	{
		this.req.abort();
	}
	
};
