var ajaxManager = new Array();
var ajaxAborted = false;
var modalPopup = null;
var modalPopupParams = null;
function init () {
    $('a[@class^=userLink]').click(function () {showProfile($(this));});
}

$(document).ready (function () {
    if (! navigator.cookieEnabled && window.location.toString().indexOf('/error') == -1) {
        window.location = '/error/cookies/';
    }
    $.ajaxSetup({timeout: 60000, error: onAjaxError});
    init();
});

function onAjaxError (requestObj, type, exeption) {
    if (modalPopup) {
        $(modalPopup).hideSplash();
        $(modalPopup).deleteAlerts();
    }
    if (type == 'timeout') {
        if (! ajaxAborted) {
            if (modalPopup) {
                var buttons = new Array();
                buttons[0] = {text: 'Да', action: 'repeatRequest()'};
                buttons[1] = {text: 'Нет', action: 'closeModalPopup()'};
                $(modalPopup).find('div[@class="text"]').addAlert('У тебя тормозит интернет<br />Повторить запрос?', buttons);
            } else {
                alert('У тебя тормозит интернет. Повтори запрос.');
                refreshScreen();
            }
        } else {
            ajaxAborted = false;
        }
    } else {
        if (modalPopup) {
            $(modalPopup).hideSplash();
            var buttons = new Array();
            buttons[0] = {text: 'Ok', action: 'refreshScreen()'};
            $(modalPopup).find('div[@class="text"]').addAlert('Похоже ошибка в коде<br />Если повторится пиши разработчикам', buttons);
        } else {
            closeModalPopup();
        }
    }
}

function closeModalPopup () {
    if (modalPopup) {
        modalPopup.closePopup();
    }
    $('#darken').remove();
}

function repeatRequest() {
    modalPopup.refreshPopup();
}

function afterAjaxLinkClick () {
    if (! $('#darken').attr('id')) {
        $('body').append('<div id="darken"><!--[if lte IE 6.5]><iframe></iframe><![endif]--></div>');
    }
    $('.banner').css('display', 'none');
}

/* ajax forms */
function beforeSubmit (formArray, jqForm) {
    $(jqForm).showSplash();
}

function processFormResponse (responseText) {
    $('body').append(responseText);
    modalPopup = $(currentPopupId);
    modalPopup.find('form:first').ajaxForm({dataType: 'json', beforeSubmit: beforeSubmit, success: proccessFormSumbitResponse});
    modalPopup.openPopup();
    return false;
}

function proccessFormSumbitResponse (responseText) {
    form = modalPopup.find('form');
    if (responseText.status == 'success') {
        modalPopup.closePopup();
        if (responseText.refreshUrl) {
            refreshScreen(responseText.refreshUrl);
        } else {
            refreshScreen();
        }
    } else if (responseText.status == 'access denied') {
        modalPopup.addAlert('Доступ запрещен');
    } else {
        form.highlightFields(responseText.fields, 'highlight');
        form.hideSplash();
    }
}
/* /ajax forms */

function refreshScreen(newLocation) {
    if (newLocation && (newLocation != window.location)) {
        if (newLocation.substr(0, 7) == 'http://') {
            window.location = newLocation;
        } else {
            if (newLocation.substr(0, 1) !== '/') {
                newLocation = '/' + newLocation;
            }
            window.location = 'http://' + window.location.host + newLocation;
        }
    } else {
        window.location.reload(false);
    }
}

function showMessages (messages) {
    var str = '';
    for (var i = 0; i < messages.length; i++) {
        str = str + messages[i].text + '\n';
    }
    if (str.length) {
        alert(str);
    }
}

$.fn.addAlert = function (alerts, buttons, type) {
    if (! type) {
        type = 'alert';
    }
    if (! this.find('.splash').attr('class')) {
        this.append('<div class="splash"></div>');
    }
    if (! this.find('.message').attr('class')) {
        this.append('<div class="message"><div class="inner"><div class="frame"><div class="moz"></div></div></div></div>');
    }
    if (alerts instanceof Array) {
        for (var i = 0; i < alerts.length; i++) {
            this.find('.moz').append('<div class="' + type + '">' + alerts[i] + '</div>');
        }
    } else {
        this.find('.moz').append('<div class="' + type + '">' + alerts + '</div>');
    }
    if (! buttons) {
        var buttons = new Array();
        buttons[0] = {text: 'Ok', action: 'modalPopup.closePopup()'};
    }
    if (! this.find('.buttons').attr('class')) {
        this.find('.moz').append('<div class="buttons"></div>');
    }
    for (var i = 0; i < buttons.length; i++) {
        this.find('.buttons').append('<a class="bt" href="javascript:void(0)" onclick="' + buttons[i].action + '">' + buttons[i].text + '</a>');
    }
};

$.fn.deleteAlerts  = function () {
    this.find('.splash').remove();
    this.find('.progress_bar').remove();
    this.find('.message').remove();
};

$.fn.showSplash = function () {
    $('a[@class=close]').unbind('click');
    $(document).unbind('keydown');
    $(document).keydown(function (event) {
        if (modalPopup) {
            if (event.which == 27) {
                return false;
            }
        }
    });
    this.append('<div class="splash"></div><div class="progress_bar"></div>');
};

$.fn.hideSplash = function () {
    $('a[@class=close]').click(function () {
        if (modalPopup) {
            modalPopup.closePopup();
        }
    });
    $(document).keydown(function (event) {
        if (modalPopup) {
            if (event.which == 27) {
                modalPopup.closePopup();
                return false;
            }
        }
    });
    this.find('div[@class="splash"]').remove();
    this.find('div[@class="progress_bar"]').remove();
};

$.fn.highlightFields = function (fields, prefix) {
    if (! prefix) {
        prefix = 'highlight';
    }
    this.clearHighlight(prefix);
    var i = 0;
    var alerts = new Array();
    while (row = fields[i]) {
        $(this).find('.' + prefix + '_' + row.field).css('color', '#ff0000');
        if (row.text) {
            alerts.push(row.text);
           }
        i++;
    }
    if (alerts.length > 0) {
        var buttons = new Array();
        buttons[0] = {text: 'Ok', action: 'modalPopup.deleteAlerts()'};
        $(modalPopup).find('div[@class="text"]').addAlert(alerts, buttons);
       }
    return this;
};

$.fn.clearHighlight = function (prefix) {
    if (! prefix) {
        prefix = 'highlight';
    }
    this.find('[@name]').each(function (i) {
        $('.' + prefix + '_' + this.name).css('color', '#000');
    });
};

$.fn.showMessages = function (messages) {
    var i = 0;
    while (message = messages[i]) {
        var span = $('<span class="tl"></span>');
        if (message.type == 'error') {
            span.css('color', 'red');
        } else if(message.type == 'message') {
            span.css('color', 'gray');
        }
        span.html(message.text);
        this.append(span);
        i++;
    }
    this.parent().css('display', 'block');
};

$.fn.clearMessages = function () {
    this.html('');
};

$.fn.setNewCaptcha = function () {
    Recaptcha.destroy();
    $('.recaptcha_widget').html('');
    var widget = $(this);
    widget.append('<div class="clear"></div><div class="recaptcha_image" id="recaptcha_image"></div><div class="recaptcha_note"><a class="recaptcha_reload" href="javascript:Recaptcha.reload()">Перезагрузить</a><a class="recaptcha_only_if_image" href="javascript:Recaptcha.switch_type(\'audio\')">Прослушать</a><a class="recaptcha_only_if_audio" href="javascript:Recaptcha.switch_type(\'image\')">Увидеть</a></div><span class="highlight_word">Слова:</span><input type="text" id="recaptcha_response_field" name="word" /><span class="comment"><b>Набери слова с картинки</b></span>');
    var RecaptchaOptions = {
       theme: 'custom',
       lang: 'ru',
       callback: function () {
           Recaptcha.focus_response_field;
           widget.css('visibility', 'visible');
       }
    };
    Recaptcha.create("6LeFyQgAAAAAAKaNNLmOh8xxlc7zU9Kus1Tp3b7Y",
       widget.attr('id'),
       RecaptchaOptions
    );
};

$.fn.toggleDefaultText = function (defaultText) {
    if (this.val() == defaultText) {
        this.val('');
    } else if (this.val() == '') {
        this.val(defaultText);
    }
};
function showPopup (className, options, id, header) {
    afterAjaxLinkClick();
    modalPopupParams = {className: className, options: options, header: header};
    var popup = $(id);
    if (! popup.attr('id')) {
        var dummy = $('#dummy');
        dummy.find('h3').html(header + ' ' + '<a href="javascript:void(0)" title="Закрыть" class="close"></a>');
        dummy.attr('class', 'layer_over_message ' + className);
        dummy.find('div[@class="text"]').showSplash();
        dummy.openPopup();
        addRequest($.ajax(options));
    } else {
        popup.openPopup();
    }
}
$.fn.openPopup = function () {
    modalPopup = $(this);
    if (! modalPopup.attr('id')) {
        return false;
    }
    if (modalPopup.attr('id') != 'dummy') {
        if ($('#dummy').css('display') == 'block') {
            $('#dummy').hidePopup();
        }
    }
    if (modalPopup.css('display') == 'none') {
        $('a[@class=close]').click(function () {
            if (modalPopup) {
                modalPopup.closePopup();
            }
        });
        $(document).keydown(function (event) {
            if (modalPopup) {
                if (event.which == 27) {
                    modalPopup.closePopup();
                    return false;
                }
            }
        });
        $(window).resize(function (event) {
            if (modalPopup) {
                var top = (($(window).height() / 2) - (modalPopup.height() / 2)) / $(window).height() * 100;
                var left = (($(window).width() / 2) - (modalPopup.width() / 2)) / $(window).width() * 100;
                modalPopup.css('top', top + '%');
                modalPopup.css('left', left + '%');
            }
        });
        var top = (($(window).height() / 2) - (modalPopup.height() / 2)) / $(window).height() * 100;
        var left = (($(window).width() / 2) - (modalPopup.width() / 2)) / $(window).width() * 100;
        modalPopup.css('top', top + '%');
        modalPopup.css('left', left + '%');
        modalPopup.css('display', 'block');
        var firstInput = modalPopup.find('form').find('input:first');
        if (firstInput) {
            firstInput.focus();
        }
    }
    return this;
};
$.fn.closePopup = function (leftDarken) {
    abortRequest();
    $('.banner').css('display', 'block');
    if (this.css('display') == 'block') {
        if (! leftDarken) {
            $('#darken').remove();
        }
        this.hidePopup();
    }
    this.clearHighlight();
    modalPopup = null;
    modalPopupParams = null;
    return this;
};
$.fn.killPopup = function () {
    this.remove();
};
$.fn.hidePopup = function () {
    if (this.css('display') == 'block') {
        this.css('display', 'none');
        this.blur();
    }
    return this;
};
$.fn.refreshPopup = function () {
    var params = modalPopupParams;
    var id = modalPopup.attr('id');
    modalPopup.deleteAlerts();
    if (params.className == 'navigation') {
        showNavigationPopup(params.category, params.currentId, params.options);
    } else {
        showPopup(params.className, params.options, id, params.header);
    }
    ajaxAborted = false;
};

$.fn.confirm = function (text) {
    if(window.confirm(text)) {
        window.location = $(this).attr('href');
    } else {
        return false;
    }
};

$.fn.insertAtCaret = function (myValue) {
    return this.each(function(){
        if (document.selection) {
            this.focus();
            sel = document.selection.createRange();
            sel.text = myValue;
            this.focus();
        }
        else if (this.selectionStart || this.selectionStart == '0') {
            var startPos = this.selectionStart;
            var endPos = this.selectionEnd;
            var scrollTop = this.scrollTop;
            this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos, this.value.length);
            this.focus();
            this.selectionStart = startPos + myValue.length;
            this.selectionEnd = startPos + myValue.length;
            this.scrollTop = scrollTop;
        } else {
            this.value += myValue;
            this.focus();
        }
    });
};

function addRequest (req) {
    ajaxManager.push(req);
}
function abortRequest () {
    ajaxAborted = true;
    for (var i = 0; i < ajaxManager.length; i++) {
        if (ajaxManager[i]) {
            ajaxManager[i].abort();
            ajaxManager[i] = null;
        }
    }
}

function showAddTopicForm (forumId, discussId, discussTable) {
    currentPopupId = '#popup_discuss_topic_' + discussId;
    showPopup('topic_window', {type: 'GET', data: {parentId: forumId, discussId: discussId, discussTable: discussTable, gotoTopic: 1}, dataType: 'html', url: '/forum/index/topic-form/', success: processFormResponse}, currentPopupId, 'Добавление темы');
    return false;
}

function stripslashes(str) {
    return (str+'').replace(/\0/g, '0').replace(/\\([\\'"])/g, '$1');
}
