/*
Объект Ajax

Пример:
    function Success(req,options) {
        if (req.requestIsSuccess) 
            alert(req.responseText);
        }
    }
    var req = new RAjaxRequest( {'url': '/test.html', params: 'aa=bb', callback:Success } );

Параметры: 
    url:	url запроса.
    asynch:	true|false. Флаг фиснхронности запроса. (default - true)
    method:	post|get. HTTP-метод запроса. (default - get)
    contentType: Content-Type запроса для метода post. (default - application/x-www-form-urlencoded )
    params:	параметры запроса. Для метода get - строка uri. Для метода post - тело запроса.
    headers:	{}. Дополнительные заголовки HTTP-запроса.
    callback:	функция, которая будет вызвана по окончанию обработки запроса. На вход передается два аргумента. 
        Первый - объект XMLHttpRequest, второй - набор параметров, переданных в объект RAjaxRequest.

*/

function RAjaxRequest(args) { 
    this.requestSetOptions(args);
    this.requestMakeTransport();
    this.requestSend();
}
(function() {
    RAjaxRequest.prototype = { 
        options: {
            asynch: true,
            method: 'get',
            contentType: 'application/x-www-form-urlencoded',
            params: '',
            url: '',
            headers: {},
            callback: null
        },
        transport: null,
        ActiveXObjects: [ 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ],

        // установка аттрибутов
        requestSetOptions: function(args) {
            for (var e in args) { this.options[e] = args[e]; }
        },

        // функция создания XMLHttp объекта
        requestMakeTransport: function() {
            var xObj = null;
            try {
                xObj = new XMLHttpRequest();
            } catch(e) {
                for (var i=0;i<this.ActiveXObjects.length;++i) {
                    try {
                        xObj = new ActiveXObject(this.ActiveXObjects[i]);
                        if (xObj) break;
                    } catch(e) {}
                }
            }
            this.transport = xObj;
        },

        // непосредственный вызов
        requestSend: function() {
            try {
                // onreadystatechange
                if (typeof(this.options.callback)=='function') {
                    var thisObj = this;
                    this.transport.onreadystatechange = function() {
                        if (thisObj.transport.readyState==4) {
                            thisObj.transport.onreadystatechange = function(){};
                            thisObj.options.callback(thisObj.transport, thisObj.options);
                        }
                    };
                }

                var params = this.options.params || '';
                if (this.options.method == 'get' && params.length > 0)
                    this.options.url += (this.options.url.match(/\?/) ? '&' : '?') + params.replace(new RegExp('\\+','g'), '%2B') + '&_=';

                this.transport.open(this.options.method.toUpperCase(), this.options.url, this.options.asynch);

                // установка http заголовков
                var requestHeaders = this.options.headers;
                requestHeaders['X-Requested-With'] = 'XMLHttpRequest';

                // for post method
                if (this.options.method == 'post') requestHeaders['Content-type'] = this.options.contentType;
                // for mozilla bugs
                if (this.transport.overrideMimeType) requestHeaders['Connection'] = 'close';

                for (var e in requestHeaders) {
                    this.transport.setRequestHeader(e, requestHeaders[e]);
                }

                this.transport.send(this.options.method == 'post' ? this.options.params : null);

            } catch(e) {}
        },

        // проверка на правильность ответа
        responseIsSuccess: function() {
        	try { if (this.transport.status==200) return true; } catch(e) {}
        	return false;
        }
    }
})();
