function AjaxRequest() {
	var req = new Object();

	// ---------- Properties ----------
	req.count        = null;
	req.element      = null;
	req.outputtype   = "innerHTML";
	req.method       = "GET";
	req.parameters   = new Object();
	req.pause        = null;
	req.queryString  = "";
	req.responseText = null;
	req.spinner      = null;
	req.url          = window.location.href;

	// ---------- 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.pause || (req.pause && req.count == AjaxRequest.count)) {
			AjaxRequest.count = 0;
			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) {
		if (typeof(AjaxRequest.args)!="undefined" && AjaxRequest.args!=null) {
			var myRequest = new AjaxRequest();
			myRequest.count = AjaxRequest.count;
			myRequest.method = method;
			myRequest.handleArguments(AjaxRequest.args);
			myRequest.process();
		}
	}
}