var XmlHttp = {
	get: function(url, onStartRequest, onSuccess, onFailure) {
		this._makeRequest("GET", url, null, onStartRequest, onSuccess, onFailure);
	},

	post: function(url, data, onStartRequest, onSuccess, onFailure) {
		this._makeRequest("POST", url, data, onStartRequest, onSuccess, onFailure);
	},

	_makeRequest: function(method, url, data, onStartRequest, onSuccess, onFailure) {
		var req = this._getTransport();
		if (url && req) {
			onStartRequest(req);
			req.open(method, url, true);

			if (method == "POST") {
				req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}

			var me = this;
			req.onreadystatechange = function() {
				if (req.readyState == 4) {
					if (me._responseIsSuccess(req)) {
						onSuccess(req);
					}
					else {
						onFailure(req);
					}
				}
			}

			req.send(data);
		}
		else {
			alert("Error: url = [" + url + "], req = [" + req + "]");
		}
	},

	/*
	 * Return a new XMLHttpRequest object.
	 * Based on http://jibbering.com/2002/4/httprequest.html
	 */
	_getTransport: function() {
		var obj = false;
		try {
			obj = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				obj = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (ee) {
				obj = false;
			}
		}
		if (! obj && typeof XMLHttpRequest != "undefined") {
			obj = new XMLHttpRequest();
		}

		return obj;
	},

	/*
	 * Borrowed from Prototype (http://prototype.conio.net/).
	 */
	_responseIsSuccess: function(req) {
		return (req.status == 0
			|| (req.status >= 200 && req.status < 300));
	},

	_responseIsFailure: function(req) {
		return (! this.responseIsSuccess(req));
	}
};
