function AjaxRequest() {
	var req = new Object();

	// ---------- Properties ----------
	req.url = window.location.href;
	req.element = null;
	req.parameters = new Object();
	req.outputtype = "innerHTML";
	req.spinner = null;
	req.pause = null;

	req.method = "GET";
	req.queryString = "";
	req.responseText = null;

	// ---------- Handlers-------------
	req.onSuccess = null;
	req.onError = null;
	req.xmlHttpRequest = AjaxRequest.getXmlHttpRequest();
	if (req.xmlHttpRequest==null) return null;

	// ---------- Functions------------
	req.xmlHttpRequest.onreadystatechange = 
	function() {
		if (req == null || req.xmlHttpRequest == null) return;
		if (req.xmlHttpRequest.readyState == 4) req.onComplete(req);
	};

	req.onComplete =
	function() {
		req.responseText = req.xmlHttpRequest.responseText;
		if (req.element) {
			var el = $g(req.element);
			if (el.tagName == "INPUT" || el.tagName == "TEXTAREA" || el.tagName == "SELECT") {
				req.outputtype = "value";
			} else {
				req.outputtype = "innerHTML";
			}
		}
		if (req.xmlHttpRequest.status==200) {
			if (req.element) {
				if (req.outputtype == "innerHTML") {
					el.innerHTML = req.responseText;
				} else {
					el.value = req.responseText;
				}
			}
			if (typeof(req.onSuccess) == "function") {
				req.onSuccess(req);
			}
		} else {
			if (typeof(req.onError) == "function") {
				req.onError(req);
			} else if(req.onError == null) {
				alert('Error: ' + req.xmlHttpRequest.status + ' - ' + req.xmlHttpRequest.statusText +
						'\n\nThere was an error while retrieving external data.');
				if (req.spinner) el.innerHTML = '';
			}
		}
		// clean up to prevent memory leak
		delete req.xmlHttpRequest['onreadystatechange'];
		req.xmlHttpRequest = null;
	};

	req.process =
	function() {
		if (req.xmlHttpRequest!=null) {
			req.parameters["AjaxId"] = new Date().getTime();
			for (var i in req.parameters) {
				if (req.queryString.length>0) { req.queryString += "&"; }
				req.queryString += encodeURIComponent(i) + "=" + encodeURIComponent(req.parameters[i]);
			}
			if (req.method=="GET") {
				if (req.queryString.length>0) {
					req.url += ((req.url.indexOf("?")>-1)?"&":"?") + req.queryString;
				}
			}
			req.xmlHttpRequest.open(req.method,req.url);
			req.xmlHttpRequest.send(null);
		}
	};

	req.handleArguments =
	function(args) {
		for (var i in args) {
			if (typeof(req[i])=="undefined") {
				req.parameters[i] = args[i];
			} else {
				req[i] = args[i];
			}
		}
	};

	return req;
}

AjaxRequest.count = 0;
AjaxRequest.args

AjaxRequest.get = function(args) {
	AjaxRequest.args = args;
	if (args['spinner'] && AjaxRequest.count == 0) {
		var spin = args['spinner'].split(",");
		var img = '<img src="'+spin[0]+'" />';
		if (typeof(spin[1])!="undefined") img += ' '+spin[1];
		$g(args['element']).innerHTML = img;
	}
	if (args['pause']) {
		AjaxRequest.count++;
		setTimeout("AjaxRequest.doRequest('GET',"+AjaxRequest.count+")",500);
	} else {
		AjaxRequest.doRequest("GET",AjaxRequest.count);
	}
}

AjaxRequest.getXmlHttpRequest = function() {
	if (document.all) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else {
		return null;
	}
}

AjaxRequest.doRequest = function(method,count) {
	if (count == AjaxRequest.count) {
		AjaxRequest.count = 0;
		if (typeof(AjaxRequest.args)!="undefined" && AjaxRequest.args!=null) {
			var myRequest = new AjaxRequest();
			myRequest.method = method;
			myRequest.handleArguments(AjaxRequest.args);
			myRequest.process();
		}
	}
}
