/*
	xmlHttpRequest
*/

/*public xmlHttpRequest*/ function xmlHttpRequest (/*string*/ method, /*mixed*/ requestData, /*boolean*/ async, /*string*/ succesMethod, /*string*/ failureMethod) {

	this.$method = method.toUpperCase();
	this.$requestData = requestData;
	this.$async = async;
	this.$successMethod = succesMethod;
	this.$failureMethod = failureMethod;

	this.$useXmlHttp = (typeof XMLHttpRequest != "undefined");
	this.$useActiveX = (typeof ActiveXObject != "undefined");
	this.$XMLHTTP_VER = "undefined";

	this.createXMLHttpRequest = function () {
		var XMLHTTP_VERS = ["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.3.0"];

		if (this.$useXmlHttp) {
			return new XMLHttpRequest();
		} else if (this.$useActiveX) {
			if (this.$XMLHTTP_VER == "undefined") {
				for (var i=0; i < XMLHTTP_VERS.length; i++) {
					try {
						new ActiveXObject(XMLHTTP_VERS[i]);
						this.$XMLHTTP_VER = XMLHTTP_VERS[i];
						break;
					} catch (oError) {
					}
				}
			}
			if (this.$XMLHTTP_VER != "undefined") {
				return new ActiveXObject(this.$XMLHTTP_VER);
			} else {
				throw new Error("Could not create XML HTTP Request.");
			}
		} else {
			throw new Error("Browser doesn't support an XML HTTP Request.");
		}
	}

	this.$xmlhttp = this.createXMLHttpRequest();

}

/*private string*/ xmlHttpRequest.prototype.encodeURL = function (/*string*/ url) {

	var $url = url;
	$url = $url.split('?');
	if ($url.length > 1) {
		var params = $url[1].split('&');
		for (var i=0;i<params.length;i++) {
			var keyvalue = params[i].split('=')
			if (keyvalue.length > 1) {
				keyvalue[1] = encodeURIComponent(keyvalue[1]);
				params[i] = keyvalue.join('=');
			}
		}
		$url[1] = params.join('&');
		return $url.join('?');
	}else return $url.toString()
}

/*private void*/ xmlHttpRequest.prototype.prepare = function () {

	if ((this.$method == "GET") && (typeof this.$requestData == "string")) {
		this.$xmlhttp.open(this.$method,this.encodeURL(this.$requestData),this.$async);
	} else if ((this.$method == "POST") && ((this.$requestData.nodeName) && (this.$requestData.nodeName.toUpperCase() == "FORM"))){
		this.$xmlhttp.open(this.$method,this.$requestData.getAttribute('action'),this.$async);
		this.$xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	}

	var _this = this;
	this.$xmlhttp.onreadystatechange = function () { 
		if (_this.$xmlhttp.readyState==4) {
			if (_this.$xmlhttp.status==200) {
/*				if (LOADER) {
					LOADER.hide();
				}
*/
				var methodToExecute = eval(_this.$successMethod);
				methodToExecute(_this.$xmlhttp);
			} else {
/*				if (LOADER) {
					LOADER.hide();
				}
*/
				var methodToExecute = eval(_this.$failureMethod);
				methodToExecute(_this.$xmlhttp);
			}
		}
	}
}

/*public void*/ xmlHttpRequest.prototype.send = function () {

/*	if (LOADER != "undefined") {
		LOADER.show();
	} else {
		LOADER = new Loader();
		LOADER.show();
	}
*/

	this.prepare();
	var requestBody = null;
	if (this.$method == "POST") {
		requestBody = FormUtil.serializeForm(this.$requestData,true);
	}
	this.$xmlhttp.send(requestBody);
}

function defaultFailure() {

}