/*
* Ajax классы и методы. 
*/
function SDG_Ajax ()
{
	this.request    = null;
	this.stateFuncs =	{};
	this.params     =	[];
    this.noRandom   =   false;
    this.requestFile =  '';
	this.params['_xrand_'] = Math.random()*10000;
	this.init();
}
/**
 * инициация XMLHttpRequest
 */
SDG_Ajax.prototype.init = function ( ) 	//-- создает объект XMLHttpRequest
{
	if (window.XMLHttpRequest)
	{	try { this.request = new XMLHttpRequest(); } catch (e)	{}	}
	else if (window.ActiveXObject)
	{	try { this.request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try {this.request = new ActiveXObject('Microsoft.XMLHTTP');} catch (e){}}	}

    if (!this.request)
	{
		alert ('Невозможно инициализировать класс XMLHttpRequest. Дальнейшая работа невозможна.\nПроверьте настройки браузера.');
	}
}
/**
 * установить параметры
 * @param string pParam
 * @param mixed pValue
 */
SDG_Ajax.prototype.setParam = function (pParam, pValue)
{
    this.params[pParam]	=	pValue;
}

SDG_Ajax.prototype.getParam = function (pParam) {
    
    return this.params[pParam];
    
}
/**
 * сбросить параметры
 */
SDG_Ajax.prototype.clear = function ()
{
	this.params = [];
    this.stateFuncs = {};
    this.params['_xrand_'] = Math.random()*10000;
}

/**
 * сгенеририровать строку запроса
 */
SDG_Ajax.prototype.generateParamString = function ()
{
	if (this.noRandom) { delete (this.params['_xrand_']); }   //-- если указан noRandom - то уберем _xrand_, чтобы при возможности брать из кеша
    var tmpArray = [];
	for (var i in this.params) tmpArray.push(i+'='+this.params[i]);
	return tmpArray.join('&');
}
/**
 * обработка смены статуса
 * @return SDG_Ajax
 */
SDG_Ajax.prototype.changeAjaxState = function (pObject)
{
//	pObject будет эквивалентен текущему экземпляру класса. А это радует :-)
	try {
        var request     =   pObject.request;
        var status      =   request.status;
        var stateFuncs  =   pObject.stateFuncs;
        switch (true)
        {
            case status==403 : {
                    alert ('Доступ к запрашиваемому объекту (' + request.requestFile + ') запрещен (code 403)!');
                    return false;
                    break;
            }
            case status==404 : {
                    alert ('Запрашиваемый объект (' + request.requestFile + ') не найден (code 404)!');
                    return false;
                    break;
            }
        }
        if (stateFuncs[request.readyState])
        {
            stateFuncs[request.readyState] (pObject);
        }
    }
    catch (e) {
        //alert (e)
        //-- отлов ошибки в связи с багом XMLHttpRequest в Mozilla Firefox
    }
}
/**
 * выполнить собственно запрос
 * @param string psFile
 * @param string psMethod
 * @param string pbSyncRequest
 */
SDG_Ajax.prototype.doRequest = function (psFile, psMethod, pbSyncRequest)
{
	if (!psMethod) psMethod = 'GET';
	if (!psFile) {alert('Не указан файл'); return 0; }

	var request = this;	
    this.requestFile = psFile;
	var readyStateChangeFunc = this.changeAjaxState;
	
	var requestParams = this.generateParamString();
	
	var asyncRequest = !pbSyncRequest;

	var requestURL = psFile + '?' + ((psMethod=='GET') ? requestParams : '');
	this.request.open(psMethod, requestURL, asyncRequest);
	
	if (asyncRequest)
		this.request.onreadystatechange = function ()  {  readyStateChangeFunc (request); }
    this.request.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
	this.request.send((psMethod=='POST') ? (requestParams) : null);
	
	if (!asyncRequest)
    {
		/** тут вставить функцию на проверку статуса текущего, ня */
        var status = this.request.status;
        switch (true)
        {
            case status==403 : {
                    alert ('Доступ к запрашиваемому объекту (' + request.requestFile + ') запрещен (code 403)!');
                    return false;
                    break;
            }
            case status==404 : {
                    alert ('Запрашиваемый объект (' + request.requestFile + ') не найден (code 404)!');
                    return false;
                    break;
            }
        }
        return (this.request.responseText || this.request.responseXML || this.request.responseText);
    }
}