var Http = {
	xmlHttp: null,
	handler: null,
	requestCounter: 0,
	loader: null,

	init: function() {
		if (!this.xmlHttp) {
			var i = document.createElement("img");
			i.src = "/i/ajax-loader.gif";
			this.xmlHttp = this.createXmlHttpRequestObject();
		}
	},

	createXmlHttpRequestObject: function() {
		var xmlHttp;
		try {
			xmlHttp = new XMLHttpRequest();
		} catch (e) {
			var xmlHttpVersions = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
			for (i=0; i<xmlHttpVersions.length && !xmlHttp; i++)
				try {
					xmlHttp = new ActiveXObject(xmlHttpVersions[i]);
				} catch (e) {}
		}
		return xmlHttp;
	},

	request: function(url, handler, data) {
		if (!this.xmlHttp) this.init();
		if (this.xmlHttp && (this.xmlHttp.readyState == 0 || this.xmlHttp.readyState == 4)) {
			var d = "?aja="+Math.random();
			for (var i in data)
				d += "&" + i + "=" + encodeURIComponent(data[i]);
			try {
				this.showLoader();
				this.handler = handler;
				this.xmlHttp.open("GET", url+d, true);
				this.xmlHttp.onreadystatechange = this.handleRequest;
				this.xmlHttp.send("");
				this.requestCounter++;
			} catch(e) {alert(e.toString());}
		}
	},
	
	handleRequest: function() {
		if (Http.xmlHttp && Http.xmlHttp.readyState == 4 && Http.xmlHttp.status == 200) {
			if (Http.requestCounter) {
				Http.requestCounter--;
			}
			Http.handler(Http.xmlHttp.responseText);
			Http.hideLoader();
		}
	},

	showLoader: function() {
		if (!this.loader) {
			var d = document.createElement("div");
			d.appendChild(document.createTextNode(" Загрузка..."));
			this.loader = document.createElement("div");
			this.loader.className = this.loader["class"] = "loader";
			this.loader.appendChild(d);
			var s = Html.getViewport();
			var s2 = Html.getSize(this.loader);
			Html.setPosition(this.loader, {left: s.width/2-s2.width/2, top: s.height/2-s2.height/2})
			document.body.appendChild(this.loader);
		}
	},

	hideLoader: function() {
		if (this.loader) {
			document.body.removeChild(this.loader);
			this.loader = null;
		}
	}

}