/*  Класс необходим для разрешения проблемы с гонкой запросов.
    Ситуации, когда ответ от запроса посланного раньше приходит
    позже. Все запросы с одинаковым непустым значением thread
    обрабатываются как находящиеся в одном потоке. Это значит,
    что если ответ от некоторого запроса пришёл после того,
    как был выполнен ещё один запрос в том же потоке, то этот
    ответ не будет обработан
*/
Requestor = {
    start: function() {
        this.query = [];
        this.num = [];
        this.timer = setInterval(this.check.bind(this), 1000);
    },
    check: function() {
        if (this.query.length == 0) return;
        this.send(); 
    },
    send: function() {
        var r = this.query.shift();
        var cur_num = -1;
        var cur_thread = '';
        if (r.thread != undefined) {
            if (!this.num[r.thread]) {
                this.num[r.thread] = 1;
            }
            else {
                this.num[r.thread]++;
            }
            cur_num = this.num[r.thread];
            cur_thread = r.thread;
        }

        request2(r.url, r.parameters, this.callback.bind(this, r.callback, cur_num, cur_thread), r.return_json)
    },
    callback: function(callback, cur_num, thread, response) {
        if (cur_num < 0 || cur_num >= this.num[thread]) { 
            callback(response);
        }
    },
    add: function(url, parameters, callback, return_json, thread) {
        this.query.push({url:url, parameters:parameters, callback:callback, return_json:return_json, thread:thread});
    },
    stop: function() {
        clearInterval(this.timer);
    }
}

Requestor.start();

function request(url, parameters, callback, return_json, thread) {
    Requestor.add(url, parameters, callback, return_json, thread);
}

function request2(url, parameters, callback, return_json) {
    var f = callback;
    if (return_json) {
        f = function(transport) {callback(transport.responseText.evalJSON())};
    }
    new Ajax.Request('/_services/'+url, {parameters: parameters, onSuccess: f} );
}





function getIFrameBody(iframe) {
   if (iframe.contentDocument) {
        var d = iframe.contentDocument;
    }
    else {
        if (iframe.contentWindow) {
            var d = iframe.contentWindow.document;
        }
        else {
            var d = window.frames[iframe.id].document;
        }
    }
    return d.body;
}

function change_lang(lang, user_id) {
    j$.cookie("lang", lang);
    
    if (user_id!=0) {
      request('profile/change_lang', {id: user_id, lang: lang}, function() {location.reload();});
    }
    else {
      location.reload();
    }      
}

function trim(str, charlist) {
    charlist = !charlist ? ' \s\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
    var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
    return str.replace(re, '');
}

function $confirm(message, f) {
    var el = new Element('div', {'class':'hide', 'id': 'vconfirm', 'title': 'Подтверждение'});
    el.update(message);
    $('body').insert(el);
    j$('#vconfirm').dialog({
                resizable: false,
                width: 320,
                modal: true,
                buttons: {
                    'Удалить': function() {
                        f();
                        j$(this).dialog('close');
                        el.remove();
                    },
                    'Отмена': function() {
                        j$(this).dialog('close');
                        el.remove();
                    }
                }
            });    
}

function urlParams(default_params) {
    if (!default_params) default_params = [];
    var result = default_params;
    var params = [];
    if (location.hash) {
        params = location.hash.substring(1).split(',');
    }
    for (var i=0; i<params.length; i++) {
        result[i] = params[i];
    }
    
    return result;  
}
