// добавляем возможность кэширования для обёртки getScript
$.getScript = function(url, callback, cache) {
    $.ajax( {
        type:     'GET',
        url:      url,
        success:  callback,
        dataType: 'script',
        cache:    cache
    });
};

$.fn.createValidator = function(submiterCallback, errorCallback) {
    var id = this[0].id;

    DOM.validator[id] = this.validate({
        messages: DOM.messages[id],
        errorElement: 'span',
        errorClass: 'error_text',
        showErrors: function(errorMap, errorList) {
            $.each(errorMap, function (i, val){
                $('.error_text[htmlfor='+i+']')
                   .parents('.error').show();
            });
            if (typeof errorCallback != 'undefined') {
               errorCallback(errorMap, errorList);
            }
            this.defaultShowErrors();
            $('span.error_text:hidden').parents('.error').hide();
        },
        submitHandler: function(form) {
            if (typeof submiterCallback != 'undefined') {
                submiterCallback.apply(form);
            }
            return false;
        }
    });
}

// загружаем js-библиотеку валидации
$.fn.load_validation = function() {
    if (this.length == 0) return this;

    // id формы, совпадает с именем валидатора
    var id = this[0].id;
    var $that = this;

    // если скрипт был уже загружен ранее, ничего не делаем
    if (typeof AUTO.validator[id] == 'undefined') {
        $.getScript('js/plugins/jquery.validate.js',
            function(){
                $.getScript('js/plugins/jquery.validate.extend.js', null, true);
                $that.createValidator([null]);
            }, true);
    }
    return this;
}

/**
 * Отчистка формы (не возвращает в дефолтные, а просто очищает)
 * http://www.learningjquery.com/2007/08/clearing-form-data
 */
$.fn.clearForm = function(selector) {
    var that = $(selector).get(0);
    return this.each(function() {
        var type = this.type, tag = this.tagName.toLowerCase();
        if (that.name == this.name) {
            return true;
        }
        if (tag == 'form')
        return $(':input',this).clearForm(selector);
        if (type == 'text' || type == 'password' || tag == 'textarea')
            this.value = '';
        else if (type == 'checkbox' || type == 'radio')
            this.checked = false;
        else if (tag == 'select')
            this.selectedIndex = -1;
    });
};

// должно быть перед подключением jquery.url.js
// отключаем # в js-библиотеке урлов
jQuery.query = {prefix: false};

/**
*   Склонение существительных с числительными
*    number - число, words - хэш склонений, hide_number (bool) - возвращать ли число
*/
$.fn.declension = function(number, words, hide_number)
{
    if (words.length < 3) {
        words[2] = words[1];
    }

    var n = Math.abs(number) % 100; // десятки
    var n1 = number % 10; // единицы
    var prefix = (!hide_number) ? number+' ' : '';

    if (n > 10 && n < 20) {
        return prefix + words[2];
    }
    if (n1 > 1 && n1 < 5) {
        return prefix + words[1];
    }
    if (n1 == 1) {
        return prefix +words[0];
    }
    return prefix + words[2];
}

/**
 * Уведомление при AJAX
 */

var ajax_message_box = {
    timeout: 0,
    //global_timeout: 0,
    position: function(){
        $('#ajax_message_box').css('top', $(window).scrollTop() + $(window).height() - 70);
    },
    show: function(text, is_good_news){
        // очищаем таймауты
        clearTimeout(this.timeout);
        //clearTimeout(this.global_timeout);
        // устанавливаем цвет сообщения
        if (is_good_news) {
            $('#ajax_message_box').removeClass('ajax_message_box_error');
        }
        else {
            $('#ajax_message_box').addClass('ajax_message_box_error');
        }
        // показываем сообщение
        $('#ajax_message_box td').html(unescape(text));
        this.up();
        this.timeout = setTimeout(ajax_message_box.down, 4000);
    },
    click: function(){
        if ($('.handler', this).hasClass('open')) {
            ajax_message_box.down();
        }
        else {
            ajax_message_box.up();
        }
    },
    up: function(){
        $('#ajax_message_text').css('left', 242);
        $('#ajax_message_box').css('width', 250);
        $('#ajax_message_text').animate(
            {
                'left': 0
            },
            200
        );
        $('#ajax_message_text .handler').addClass('open');
    },
    down: function(){
        clearTimeout(this.timeout);
        //this.global_timeout = setTimeout(ajax_message_box.remove, 10000);
        $('#ajax_message_text').animate(
            {
                'left': 242
            },
            200,
            function(){
                $('#ajax_message_box').css('width', 7);
                $('#ajax_message_text').css('left', 0);
            }
        );
        $('#ajax_message_text .handler').removeClass('open');
    }/*,
    remove: function(){
        $('#ajax_message_text').css('left', 250);
    }*/
}

if ($.browser.msie && $.browser.version == 6) {
    $('#ajax_message_box').css('top', $(window).height() - 72);
    $(window).scroll(function(){
        $('#ajax_message_box').css('top', $(window).scrollTop()-72)
    });
}

$('#ajax_message_text').click(ajax_message_box.click);

//ajax_message_box.position();
//$(window).scroll(ajax_message_box.position);

$('#ajax_message_box').ajaxSuccess(function(event, XMLHttpRequest, settings){
    if (settings.dataType == 'json') {
        v =  eval("(" + XMLHttpRequest['responseText'] + ")");
        if(v.message != undefined && v.message != '') {
            ajax_message_box.show(v.message, true);
        }
    }
}).ajaxError(function(event, XMLHttpRequest, settings){
    if (settings.dataType == 'json') {
        v =  eval("(" + XMLHttpRequest['responseText'] + ")");
        if(v.message != undefined && v.message != '') {
            ajax_message_box.show(v.message, false);
        }
    }
});