function AjaxRequest() {
	var request = null;
	factories = [
		function () {return new XMLHttpRequest();}, 
		function () {return new ActiveXObject("MSXML2.XMLHTTP.5.0");},
		function () {return new ActiveXObject("MSXML2.XMLHTTP.4.0");},
		function () {return new ActiveXObject("MSXML2.XMLHTTP.3.0");},
		function () {return new ActiveXObject("MSXML2.XMLHTTP");},
		function () {return new ActiveXObject("MICROSOFT.XMLHTTP.1.0");},
		function () {return new ActiveXObject("MICROSOFT.XMLHTTP.1");},
		function () {return new ActiveXObject("MICROSOFT.XMLHTTP");}
	];
	
	for (var i = 0; i < factories.length; i++) {
		try {
			request = factories[i]();
			if (request != null) break;
		} catch (e) {
			continue;
		}
	}
	if (request == null) throw new Error("XMLHttpRequest not supported!");

	this.doPost = function (url, listener, params) {
		for (name in params) {
			url += (url.indexOf("?") != -1 ? "&" : "?") + name + "=" + encodeURI(params[name]);
		}
		request.open("post", url, true);
		request.onreadystatechange = function () {
			if (request.readyState == 4 && request.status == 200) {
				if (listener) {
					try {
						var contentType = request.getResponseHeader("Content-Type");
						if (contentType.indexOf("text/xml") != -1) {
							listener(request.responseXML);
						} else if (
							contentType.indexOf("text/json") != -1 ||
							contentType.indexOf("text/javascript") != -1 ||
							contentType.indexOf("application/javascript") != -1 ||
							contentType.indexOf("application/x-javascript") != -1
						) {
							eval("var json = " + request.responseText);
							listener(json);
						} else {
							listener(request.responseText);
						}
					} catch (e) {
						alert(e.message);
						throw e;
					}
				}
			}
		};
		request.setRequestHeader("if-Modified-Since", "0");
		request.send(null);
	};
}
