function AjaxRequest(_url, _isSynchron, _post) {
	
	/* Private Members */
	
	var url = _url;
	var postvars = null;
	var isSynchron = (_isSynchron == null ? false : _isSynchron);
	var http_request = false;
	var method = (_post == null ? "GET" : "POST");
	
	// Overlay Members
	
	var image = null;
	var overlay = null;
	
	var replaceObj = null;
	
	/* Public Members */
	
	this.callFunction = null;
	this.callObject = null;
	
	
	/* Public Methods */
	
	this.doRequest = function() {
		
		if(window.XMLHttpRequest) {
			http_request = new XMLHttpRequest();
		}
		else if(window.ActiveXObject) {
			if(http_request = new ActiveXObject("Msxml2.XMLHTTP")) {
				
			} else {
				http_request = new ActiveXObject("Microsoft.XMLHTTP")
			}
		}
		
		if(http_request) {
			
			http_request.onreadystatechange = delegate(this, checkReadyState);
			http_request.open(method, url, !isSynchron);
			
			if(method == "POST") {
				http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				http_request.send(postvars);
			}
			else {
				http_request.send(null);
			}
			
			return true;
			
		}
		else return false;
	}
	
	// Returns response Text from http_request
	this.getResponseText = function() {
		if(http_request)
			return http_request.responseText;
		else
			return "";
	}
	
	// Returns response XML from http_request
	this.getResponseXML = function() {
		if(http_request)
			return http_request.responseXML;
		else
			return "";
	}
	
	// Sets POST vars
	this.setPostvars = function(_postvars) {
		postvars = _postvars;
	}
	
	// Shows an ajax loading icon and a transparent overlay div

	this.ajaxLoadingOverlay = function(_element) {
		
		if(!overlay && !image) {
			overlay = document.createElement("div");
			image = new Image();
			replaceObj = _element;
		
		} else {
			if(overlay.style.display == "none")
				overlay.style.display = "";
			else
				overlay.style.display = "none";
			
			if(image.style.display == "none")
				image.style.display = "";
			else
				image.style.display = "none";
			
			return;
		}

		var y = posY(_element);
		var x = posX(_element);
		
		// Overlay Div (Transparent)
		
		overlay.style.backgroundColor = "white";
		overlay.style.width = _element.offsetWidth + "px";
		overlay.style.height = _element.offsetHeight + "px";
		if(IE)
			overlay.style.filter = "Alpha(opacity=70)";
		else
			overlay.style.opacity = "0.7";
			
		overlay.style.position = "absolute";
		overlay.style.left = x + "px";
		overlay.style.top = y + "px";
		
		document.body.appendChild(overlay);
		
		
		// Image
		image.src = "images/ajax-loaders/circle_thickbox_blue.gif";
		image.style.position = "absolute";
		
		var imageWidth = 100;
		var imageHeight = 100;
		
		x = x +((_element.offsetWidth/2) -(imageWidth/2));
		y = y +((_element.offsetHeight/2) - (imageHeight/2));
		
		//alert(x);
		
		image.style.top = y + "px";
		image.style.left = x + "px";
		
		document.body.appendChild(image);
		
	}
	
	// This function replaces inner HTML of replaceObj
	// The replaceObj ist given by the ajaxLoadingOverlay function
	
	this.replaceInnerHTML = function(_request) {
		if(replaceObj) {
			replaceObj.innerHTML = _request.responseText;
		}
	}
		
	/* Private Methods */
	
	function checkReadyState(){
		
		if (!http_request) 
			return;
		
		if (http_request.readyState != 4) 
			return;
		
		if (http_request.status != 200) 
			return;
			
		if (replaceObj) {
			this.ajaxLoadingOverlay(replaceObj);
		}
		
		if (this.callFunction != null)
			this.callFunction(http_request);
		
		else if (this.callObject != null)
			this.callObject.updateState(http_request);
	}	
}
