var ctrl=new Object();
ctrl.READY_STATE_UNINITIALIZED = 0;
ctrl.READY_STATE_LOADING = 1;
ctrl.READY_STATE_LOADED = 2;
ctrl.READY_STATE_INTERACTIVE = 3;
ctrl.READY_STATE_COMPLETE = 4;

ctrl.ContentLoader = function(component, url, method, requestParams) {
    this.component = component;
    this.url = url;
    this.requestParams = requestParams;
    this.method = method;
}

ctrl.ContentLoader.prototype = {
    getTransport: function() {
        var transport;
        if (window.XMLHttpRequest) {
            transport = new XMLHttpRequest(); 
        } else if (window.ActiveXObject) {
            try {
                transport = new ActiveXObject('Msxml2.XMLHTTP');
            } catch(err) {
                transport = new ActiveXObject('Microsoft.XMLHTTP');
            }
        }
        return transport;
    },
    sendRequest: function() {
        var requestParams = [];
        for (var i=0; i<arguments.length; i++) {
            requestParams.push(arguments[i]);
        }
        var request = this.getTransport();
        request.open(this.method, this.url, true);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        var oThis = this;
        request.onreadystatechange = function() {
            oThis.handleAjaxResponse(request);
        }
        request.send(this.queryString(requestParams));
    },
    queryString: function(args) {
        var requestParams = [];
        for (var i=0; i<this.requestParams.length; i++) { 
            requestParams.push(this.requestParams[i]);
        }
        for (var i=0; i<args.length; i++)
        {
            requestParams.push(args[i]);
        }
        var queryString = "";
        if (requestParams && requestParams.length > 0) {
            for (var i=0; i<requestParams.length; i++)
            {
                queryString += requestParams[i] + '&';
            }
            queryString = queryString.substring(0, queryString.length-1);
        }
        return queryString;
    },
    handleAjaxResponse: function(request) {
        if (request.readyState ==ctrl.READY_STATE_COMPLETE) {
            if (this.isSuccess(request)) {
                this.component.ajaxUpdate(request);
            } else {
                this.component.handleError(request);
            }
        }
        if (request.readyState == ctrl.READY_STATE_LOADING) {
            if (typeof(this.component.ajaxLoading)=='function') { 
                this.component.ajaxLoading(request);
            }
        }
    },
    isSuccess: function(request) {
        return request.status == 0 || (request.status >= 200 && request.status < 300);
    }
};

//window.ajaxLoading = function(request) {
//    var content = document.getElementById('loaderContent');
//    content.innerHTML = "Загрузка...";
//}
//window.ajaxUpdate = function(request) {
//    var content = document.getElementById('loaderContent');
//    content.innerHTML = request.responseText;
//}

window.handleError = function(request) {
    var content = document.getElementById('loaderContent');
    content.innerHTML = "Ошибка загрузки";
}

function setupEscape() {
    // Инициализируем таблицу перевода
    var trans = [];
    for (var i = 0x410; i <= 0x44F; i++) trans[i] = i - 0x350; // А-Яа-я
    trans[0x401] = 0xA8;    // Ё
    trans[0x451] = 0xB8;    // ё

    // Сохраняем стандартную функцию escape()
    var escapeOrig = window.escape;

    // Переопределяем функцию escape()
    window.escape = function(str) {
        var ret = [];
        // Составляем массив кодов символов, попутно переводим кириллицу
        for (var i = 0; i < str.length; i++) {
            var n = str.charCodeAt(i);
            if (typeof trans[n] != 'undefined')
            n = trans[n];
            if (n <= 0xFF)
            ret.push(n);
        }
        return escapeOrig(String.fromCharCode.apply(null, ret));
    }
}
