// ========== AJAX Request ====================================================================================================

function _AjaxEngine(){
	this.LoadingDIV = null;
	this.AsynCallsCount = 0;
}

_AjaxEngine.prototype={
	send: function(url, method, callback, data, caller) {
		var xmlHttp;
		try{
		// Firefox, Opera 8.0+, Safari
			xmlHttp=new XMLHttpRequest();
		}
		catch (e){
			// Internet Explorer
			try{
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e){
				try{
					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e){
					alert("Your browser does not support AJAX!");
					return false;
				}
			}
		}
		
		var _this=this;

		xmlHttp.onreadystatechange = function(){
			if (xmlHttp.readyState == 4) {// only if xmlHttp shows "loaded"
				if (xmlHttp.status == 200) {// only if "OK"
				//alert(this.AsynCallsCount);
					_this.AsynCallsCount--;
					if (_this.AsynCallsCount==0)
						_this.HideLoading();
					callback(xmlHttp, caller);
				}
				else{
					alert("There was a problem loading data :\n" + xmlHttp.status+ "/" + xmlHttp.statusText);
				}
			}
		}
		if (method=="POST"){
			xmlHttp.open(method, url, true);	
			xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xmlHttp.send(data);
		}
		else if(method=="GET"){
			xmlHttp.open(method, url, true);
			xmlHttp.send(null);
		}
		this.AsynCallsCount++;
		this.ShowLoading();
		return xmlHttp;
	},
	
	sendPOSTRequest: function(url, data, callback, caller){
		return this.send(url, "POST", callback, data, caller);
	},
	
	submitFormViaPOST: function(url, form, callback, caller){	
		return this.sendPOSTRequest(url,this.getObjSubmitString(form) , callback, caller);	
	},
	
	sendGETRequest: function(url, callback, args, caller){
		return this.send(url, "GET", callback, args, caller);
	},
	
	submitFormViaGET: function(url, form, callback, caller){
		return this.sendGETRequest(url+getObjSubmitString(form), callback, 0, caller);
	},
	
	getObjSubmitString: function get(obj){
		var getstr = "";
		var tags=obj.getElementsByTagName("INPUT");		
		for (i=0; i<tags.length; i++){
			switch (tags[i].type){
				case "text":
					getstr += tags[i].name+"="+tags[i].value+"&";
					break;	
					
				case "checkbox":
					if (tags[i].checked)
						getstr+=tags[i].name+"="+tags[i].value+"&";
					else 
						getstr += tags[i].name+"=&";
					break;
					
				case "radio":
					if (tags[i].checked)
						getstr += tags[i].name+"="+tags[i].value+"&";           
					break;
			}
		}
		
		tags=obj.getElementsByTagName("SELECT");
		for (i=0; i<tags.length; i++){
			getstr+=tags[i].name+"="+tags[i].options[tags[i].selectedIndex].value + "&";
		}
		
		tags=obj.getElementsByTagName("TEXTAREA");
		for (i=0; i<tags.length; i++){
			getstr+=tags[i].name+"="+tags[i].value + "&";
		}
		
		//removing last'&'
		if (getstr.length!=0)
			getstr=getstr.substr(0, getstr.length-1);
		
		return getstr;  
	},
	
	ShowLoading: function(){
		if (this.LoadingDIV)
			this.LoadingDIV.style.display="block";
	},
	
	HideLoading: function(){
		if (this.LoadingDIV)
			this.LoadingDIV.style.display="none";
	}
}

var AjaxEngine = new _AjaxEngine();
