AJAX_ENABLED=true;

//Класс для работы с AJAX по сути пул асинхронный метод
AJAX_HttpRequestAsync=function(){
	/*Отсылка данных производиться методом send этот метод принимает 5 параметров
	required	(String)	url				к которому запрос
	required	(Object) 	data			данные посылаемые на сервер пример {'key':'val','key2':'val2'};
	optional	(string)	callback		функциa которая вызывается при изминении readyState
	optional	(array)	parameters	параметры передающиеся функции callback
	optional	(string)	method 		GET or POST default POST
	*/
	this.dataQuery=new Array();
	this.urlQuery=new Array();
	this.callbackQuery=new Array();
	this.parametersQuery=new Array();
	this.methodQuery=new Array();
	//флаг занятости
	this.isBusy=false;
	//Метод отсылки данных
	this.defaultMethod='POST';
	this.http=AJAX_createXmlHttpRequest();
	this.counter=0;
}

//эта функция выполняется при изменении readyState объекта XmlHttpRequest. Сначала выполняет callback передавая в котором к
//XmlHttpRequest можно обращаться как к this. Затем если запрос завершен и очередь не пуста выполняет след запрос.

AJAX_HttpRequestAsync.prototype.registerCallBack=function(ajaxObject,callback,params){
	return function(){
		callback.apply(ajaxObject.http,params);
		//Запрос завершен
		if(ajaxObject.http.readyState==4){
			ajaxObject.http.abort();
			ajaxObject.http=AJAX_createXmlHttpRequest()
			//подготовка к следующему запросу
			//если очередь не пуста произвести след запрос
			if(url=ajaxObject.urlQuery.shift()){
				data=ajaxObject.dataQuery.shift();
				callback=ajaxObject.callbackQuery.shift();
				params=ajaxObject.parametersQuery.shift();
				method=ajaxObject.methodQuery.shift();
				strData=encodeURI(AJAX_getStringData(data));
				if (method=='POST'){
					ajaxObject.http.open('POST',url,true);//асинхронный запрос
					ajaxObject.http.onreadystatechange=ajaxObject.registerCallBack(ajaxObject,callback,params);	
					ajaxObject.http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
					ajaxObject.http.setRequestHeader("Content-length", strData.length);
					ajaxObject.http.setRequestHeader("Connection", "close");
					ajaxObject.http.send(strData);
					ajaxObject.counter++;
				}else if(method=='GET'){
					ajaxObject.http.open('GET',url+'?'+strData,true);//асинхронный запрос
					ajaxObject.http.onreadystatechange=ajaxObject.registerCallBack(ajaxObject,callback,params);
					ajaxObject.http.send();
					ajaxObject.counter++;
				}
			}else{
				ajaxObject.isBusy=false;
			}
		}
	}
}

/*Отсылка данных производиться методом send этот метод принимает 4 параметра
	(String)	url к которому запрос
	(Object) 	data данные посылаемые на сервер пример {'key':'val','key2':'val2'};
	(string)	callback имя функции которая вызывается при изминении readyState
	(array)	parameters параметры передающиеся функции callback
*/
AJAX_HttpRequestAsync.prototype.send=function(url,data,callback,params,method){
	if (!url)return;
	if (!data) data={};
	if(!callback) callback=function(){};
	if(!params) params=new Array();
	if(!method) method=this.defaultMethod;
	//Добавить в очередь запрос
	this.urlQuery.push(url);
	this.dataQuery.push(data);
	this.callbackQuery.push(callback);
	this.parametersQuery.push(params);
	this.methodQuery.push(method);
	if(!this.isBusy){
		this.isBusy=true;
		//Взять из очереди
		data=this.dataQuery.pop();
		params=this.parametersQuery.pop();
		url=this.urlQuery.pop();
		callback=this.callbackQuery.pop();
		method=this.methodQuery.pop();
		strData=AJAX_getStringData(data);
		strData=encodeURI(strData);
		if (method=='POST'){
			this.http.open('POST',url,true);//асинхронный запрос
			this.http.onreadystatechange=this.registerCallBack(this,callback,params);	
			this.http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.http.setRequestHeader("Content-length", strData.length);
			this.http.setRequestHeader("Connection", "close");
			this.http.send(strData);
			this.counter++;
		}else if(method=='GET'){
			this.http.open('GET',url+'?'+strData,true);//асинхронный запрос
			this.http.onreadystatechange=this.registerCallBack(this,callback,params);
			this.http.send();
			this.counter++;
		}
	}
}

AJAX_HttpRequestSync=function(){
	this.status=0;
	this.statusText='';
	this.readystate=0;
	this.http=AJAX_createXmlHttpRequest();
	this.responseText='';
	this.responseXML='';
	this.defaultMethod='POST';
}

AJAX_HttpRequestSync.prototype.send=function(url,data,method){
	if (!url)return;
	if (!data) data={};
	if(!method) method=this.defaultMethod;
	strData=AJAX_getStringData(data);
	strData=encodeURI(strData);
	if (method=='POST'){
		this.http.open('POST',url,false);//асинхронный запрос
		this.http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.http.setRequestHeader("Content-length", strData.length);
		this.http.setRequestHeader("Connection", "close");
		this.http.send(strData);
	}else if(method=='GET'){
		this.http.open('GET',url+'?'+strData,false);//асинхронный запрос
		this.http.send();
	}
	this.status=this.http.status;
	this.statusText=this.http.statusText;
	this.readystate=this.http.readystate;
	this.responseText=this.http.responseText;
	this.responseXML=this.http.responseXML;
	this.http.abort();
	this.http=AJAX_createXmlHttpRequest();
}

//Создает объект XmlHttpRequest который и занимается отсылкой данных. Для кроссбраузерности.
function AJAX_createXmlHttpRequest(){
	if (window.XMLHttpRequest){
		return new XMLHttpRequest();
	}
	else if (window.ActiveXObject){
		try {
            	return new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){}
		try {
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e){}
	}
	return null;
}

function AJAX_getStringData(data){
	if (typeof data == 'string'){
		return data;
	}
	retVal='';
	for (key in data){
		retVal+=key+'='+data[key]+'&';
	}
	return retVal;
}


$Ajax = new AJAX_HttpRequestAsync();
$SAjax = new AJAX_HttpRequestSync();
