ajax = function () {
	var createAjaxObj = function (url, method, callback, resp) {
		var params = null;
		if (/POST/i.test(method)) {
			url = url.split("?");
			params = url[1];
			url = url[0];
		}
		return {
			url : url,
			method : method || "GET",
			callback : callback,
			params : params,
			headers : {},
			respType : resp || "text"
		};
	};
	return {
		initRequest : function () {
			var XMLHttp = null;
			if (typeof XMLHttpRequest !== "undefined") XMLHttp = new XMLHttpRequest();
			else if (typeof window.ActiveXObject !== "undefined") {
				var XMLHttpMS = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
				for (var i=0; i<XMLHttpMS.length; i++) {
					try {
						XMLHttp = new window.ActiveXObject(XMLHttpMS[i]);
						break;
					}
					catch (e) {XMLHttp = null;}
				}
			} return XMLHttp;
		},

		ajax : function (ajaxObj) {
			if (!ajaxObj.method) ajaxObj.method = "GET";
			if (!ajaxObj.respType) ajaxObj.respType = "text";
			if (ajaxObj.url && /\?/.test(ajaxObj.url) && ajaxObj.method && /POST/i.test(ajaxObj.method)) {
				var url = ajaxObj.url.split("?");
				ajaxObj.url = url[0];
				ajaxObj.params = url[1] + ((url[1].length > 0 && ajaxObj.params)? ("&" + ajaxObj.params) : "");
			} 
			return ajax.Request.call(this, ajaxObj);
		},

		get : function (url, callBack, resp) {
		    var ajaxObj = createAjaxObj(url, "GET", callBack, resp);
			return ajax.Request.call(this, ajaxObj);
		},
		
		post : function (url, callBack, resp) {
		    var ajaxObj = createAjaxObj(url, "POST", callBack, resp);
			return ajax.Request.call(this, ajaxObj);
		},
		
		load : function (url, elm, add, resp) {
		    if (typeof loading  == 'undefined') loading = "<span align='center'><br><br><br><b>L O A D I N G ...</b></span>";
			if (!elm) elm = "ajaxresult";
			ajax.element = document.getElementById(elm);
		    if (!add) {
			   ajax.element.innerHTML = loading;
			   return ajax.get.call(this, url, ajax.replContent, resp);
			} else return ajax.get.call(this, url, ajax.addContent, resp);
		},
		
		Request : function  (ajaxObj) {
			var XMLHttp = ajax.initRequest();
			if (XMLHttp) {
				var ajaxCall = function (elm) {
				    var basedomain = "http://"+window.location.hostname+"/";
				    if (ajaxObj.url.indexOf(basedomain) == -1) ajaxObj.url = basedomain+ajaxObj.url;
					var nocache = Math.random();
					if (ajaxObj.method === "GET") {
						if (ajaxObj.url.indexOf("?") == -1) ajaxObj.url += '?nocache='+nocache;
						else ajaxObj.url += '&nocache='+nocache;
					}
					ajax.url = ajaxObj.url;
					XMLHttp.open(ajaxObj.method, ajaxObj.url, true);
					XMLHttp.setRequestHeader("AJAX", "true");
					XMLHttp.setRequestHeader("Accept-Charset", "windows-1251");	
					if (ajaxObj.method === "POST") {
						var contentLength = ajaxObj.params ? ajaxObj.params.length : 0;
						XMLHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=windows-1251");
						XMLHttp.setRequestHeader("Content-length", contentLength);
						if (XMLHttp.overrideMimeType) XMLHttp.setRequestHeader("Connection", "close");
					} else XMLHttp.setRequestHeader("Content-type", "text/html; charset=windows-1251");	
					if (/json/i.test(ajaxObj.respType)) XMLHttp.setRequestHeader("Accept", "application/json, text/javascript, */*");					
					for (var i in ajaxObj.headers) if (typeof i === "string" && i !='foreach') XMLHttp.setRequestHeader(i, ajaxObj.headers[i]);
					if (typeof ajaxObj.callback === "function") {
						XMLHttp.onreadystatechange = function () {
						    ajax.readyState = XMLHttp.readyState;
							if (ajax.readyState === 4) {
							    ajax.status = XMLHttp.status;
								ajax.statusText = XMLHttp.statusText;
								ajax.respHeaders = XMLHttp.getAllResponseHeaders();
								if (ajax.status == 200) {
								   var response = /xml/i.test(ajaxObj.respType)? XMLHttp.responseXML : XMLHttp.responseText;
								   if (/json/i.test(ajaxObj.respType)) { 
										response = (typeof JSON === "object" && typeof JSON.parse === "function")? JSON.parse(response) : eval("(" + response + ")");
								   }
								   ajaxObj.callback.call(elm, response);
								} else ajaxObj.callback.call(elm, ajax.defaultError());
								XMLHttp = null;
							} 
						};
					}
					XMLHttp.send(ajaxObj.params);
				}(this);				
			}
			return this;
		},
		
		replContent : function (content) {
			ajax.element.innerHTML = content;
		},
		
		addContent : function (content) {
			ajax.element.innerHTML += content;
		},
		
		fullError : function() {
            return "<br>REQUEST ERROR!<br>\nURL: "+ajax.url+"<br>\nReadyState: "+ajax.readyState+"<br>\nStatus: "+ajax.getStatus()+"<br>\nHeaders:<br>\n"+ajax.respHeaders;
        },
		
		defaultError : function() {
            return "<br>REQUEST ERROR!<br>\nURL: "+ajax.url+"<br>\nStatus: "+ajax.getStatus();
        },
		
		getUrl : function () {
			return ajax.url;
		},
		
		getReadyState : function () {
			return ajax.readyState;
		},
		
		getStatus : function () {
			return ajax.status+" => "+ajax.statusText;
		},
		
		getHeaders : function () {
			return ajax.respHeaders;
		}
	};
}();

