(function($) {
    $.fn.formCounter = function(options) {
        // Определяем значения по умолчанию
        var defaults = {
            min: 0,
            max: 10,
            step: 1,
            default_value: null,
            style: 'counter-blue' // counter-green counter-silver counter-red
        };
        var config = $.extend(defaults, options);
        // Использеться значение из поля или устанавливаем default_value
        if(config.default_value != null){
            $(this).val(config.default_value);
        }
        // Устанавливаем для поля минимальные и максимальные значения, а также возможность редактирования
        $(this).attr('default_value', $(this).val());
        $(this).attr('min', config.min);
        $(this).attr('max', config.max);
        $(this).attr('step', config.step);
        // Оборачиваем текущее поле в div
        $(this).wrap('<div class="counter-field ' + config.style + '"></div>');
        return this.each(function(){
            // Добавляем значок минуса
            $(this).parent().prepend('<span class="minus"></span>');
            $(this).parent().append('<span class="value">' + $(this).val() + '</span>');
            // Добавляем значок плюса
            $(this).parent().append('<span class="plus"></span>');
            // Если значение по умолчанию равняется минимальному или максимальному
            var value = parseInt($(this).val());
            if(value == options.min){
                $(this).parent().find('span.minus').addClass('blocked');
                $(this).parent().find('span.value').addClass('blocked');
            } else if(value == options.max) {
                $(this).parent().find('span.plus').addClass('blocked');
            }
            // Обработка нажатия на -
            $(this).parent().find('span.minus').click(function(){
                var value = parseInt($(this).parent().find('input').val());
                var minimum = $(this).parent().find('input').attr('min');
                var maximum = $(this).parent().find('input').attr('max');
                var step = parseInt($(this).parent().find('input').attr('step'));
                if((value - step) >= minimum){
                    if((value -step) < maximum){
                        $(this).parent().find('span.plus').removeClass('blocked');
						$(this).parent().find('span.value').removeClass('blocked');
                    }
                    value = value - step;
                    $(this).parent().find('input').val(value);
                    if($(this).parent().find('.value')[0].tagName == 'SPAN') {
                        $(this).parent().find('.value').html(value);
                    }
                }
                if((value - step) <= minimum){
                    $(this).addClass('blocked');
                    $(this).parent().find('span.value').addClass('blocked');
                }
            });
            // Обработка нажатия на +
            $(this).parent().find('span.plus').click(function(){
                var value = parseInt($(this).parent().find('input').val());
                var minimum = $(this).parent().find('input').attr('min');
                var maximum = $(this).parent().find('input').attr('max');
                var step = parseInt($(this).parent().find('input').attr('step'));
                if((value + step) <= maximum){
                    if(value + step > minimum){
                        $(this).parent().find('span.minus').removeClass('blocked');
						$(this).parent().find('span.value').removeClass('blocked');
                    }
                    value = value + step;
                    $(this).parent().find('input').val(value);
                    if($(this).parent().find('.value')[0].tagName == 'SPAN') {
                        $(this).parent().find('.value').html(value);
                    }
                }
                if((value + step) >= maximum){
                    $(this).addClass('blocked');
                }
            });
        });
    }
})(jQuery);

