Как написать плагин на javascript

```

Статьи:
https://habr.com/ru/post/158235/
https://habr.com/ru/post/170987/

$(".checkselect").checkselect(); - как активировать

$(".checkselect").checkselect('setValue', {value: value, with_trigger: false}); - вызов метода

$('.checkselect').on('changeCheckSelect', function (event, selected){
   console.log('новые селекты проверяем на гет карс коинт');
}); - событие

Внизу непонятый код

(function($) {

    function setChecked(target, with_trigger, element_selected, val_selected) {

        var wrapper = $(target).closest('.checkselect');

        if(!(typeof(with_trigger) != "undefined" && with_trigger !== null)) {

            with_trigger = true;

        }

        if (with_trigger) {

            wrapper.trigger('changeCheckSelect',

                {

                    element_selected: element_selected,

                    val_selected: val_selected

                }

            );

            console.log('with trigger');

        }

        var checked = wrapper.find("input:checked").length;

        console.log(checked);

            if (checked) {

                console.log('заполнено поле');

                var text = *;*

                var name = *;*

                if((wrapper.hasClass('j-enhanced-brands') || wrapper.hasClass('j-enhanced-models')) && checked>1){

                    text = checked;

                    if(wrapper.hasClass('j-enhanced-brands')) {

                        name = ' марки';

                        if(checked>4)

                            name = ' марок';

                    }

                    else {

                        name = ' модели';

                        if(checked>4)

                            name = ' моделей';

                    }

                    text += name;

                }

                else {

                    wrapper.find("input:checked").each(function () {

                        text += ', ' + $(this).closest('label').find('.text').text();

                    });

                    text = text.slice(1);

                }

                wrapper.find('select option:first').html(text);

                wrapper.addClass('-checked');

            } else {

                console.log('дописываем');

                var placeholder = wrapper.attr('data-placeholder');

                wrapper.find('select option:first').html(placeholder);

                wrapper.removeClass('-checked');

            }

    }

    var methods = {

        init : function( options ) {

            this.wrapInner('');

            this.prepend(

                '' +

 '<select class="checkselect-select"><option></option></select>' +

 '' +

 ''

            );

            this.find('.checkselect-clear').click(function (){

                console.log('click 97');

                var wrapper = $(this).closest('.checkselect');

                var selected = wrapper.find('input:checked');

                console.log(selected);

                if(selected.length)

                    checkselectClearElement(wrapper);

                else

                    checkselectClose(wrapper);

                wrapper.trigger('changeCheckSelect', {

                    clear_all: true

                });

            });

            this.find('input').each(function(){

                $(this).parent().find('.text-and-ch').append(*);*

            });

            this.each(function(){

                setChecked(this);

            });

            this.find('input').click(function(){

                console.log('click 94');

                setChecked($(this).parents('.checkselect'), true, $(this), $(this).attr('value'));

            });

            this.parent().find('.checkselect-over').on('click', function(){

                console.log('click 90');

                $wrapper = $(this).closest('.checkselect');

                if($wrapper.hasClass('-disabled'))

                    return false;

                if(!$wrapper.hasClass('-opened')) {

                    checkselectClose($('.checkselect'));

                    checkselectOpen($wrapper);

                }

                else

                    checkselectClose($('.checkselect'));

            });

            $('html, body').on('click', function(e){

                console.log('click 91');

                if ($(e.target).closest('.checkselect').length == 0){

                    checkselectClose($('.checkselect'));

                }

            });

            // А ВОТ ЭТОТ

        },

        show : function( ) {

            console.log('show');

            // ПОДХОД

        },

        hide : function( ) {

            // ПРАВИЛЬНЫЙ

        },

        update : function( content ) {

            // !!!

        },

        setValue: function(param){

            console.log(param);

            var value = param.value;

            var with_trigger = true;

            if (typeof param['with_trigger'] !== "undefined") {

                with_trigger = param['with_trigger'];

                console.log('он есть из параметра');

            }

            var el = this.find('input[value="'+value+'"]');

            if (el.length > 0){

                el.prop( 'checked', true);

                setChecked(el, with_trigger);

            }

        },

        setValueOff: function (value){

            var el = this.find('input[value='+value+']');

            el.prop( 'checked', false);

            setChecked(el);

        }

    };

    $.fn.checkselect = function(method) {

        if ( methods[method] ) {

            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));

        } else if ( typeof method === 'object' || ! method ) {

            return methods.init.apply( this, arguments );

        } else {

            $.error( 'Метод с именем ' +  method + ' не существует для jQuery.tooltip' );

        }

    };

})(jQuery);

$(function(){

    setCheckselects();

});

function setCheckselects(){

    $('.enhanced-search-block .checkselect').checkselect();

}

function checkselectClearAll(){

    $('.checkselect').each(function(){

        checkselectClearElement($(this));

    });

}

function checkselectClearElement(el){

    el.find('input').prop('checked', false).removeClass('-checked');

    var placeholder = el.attr('data-placeholder');

    el.find('select option:first').html(placeholder);

    el.removeClass('-checked');

    if(el.hasClass('j-enhanced-brands')) {

        $('.j-enhanced-models').html(*).addClass('-disabled');*

        $('.j-enhanced-models').checkselect();

    }

}

function checkselectOpen(el) {

    el.addClass('-opened');

}

function checkselectClose(el) {

    el.removeClass('-opened');

}

$('body').on('click', '.checkselect-clear', function (e) {

    console.log('click 93');

});

$(function(){

    $('body').on('input', '.j-input-digit', function () {

        this.value = this.value.replace(/[^0-9]/g, *);*

    });

    $('body').on('blur', '.j-input-digit', function () {

        if(this.value)

            $(this).addClass('-checked');

    });

    $('body').on('focus', '.j-input-digit', function () {

        $(this).removeClass('-checked');

    });

    $('body').on('changeCheckSelect', '.j-enhanced-brands', function () {//смена бренда на панели поиска перенести в search panel

        enhancedChangeModals(

            SEARCH_PANEL.elements.hidden_panel_content.find('.j-enhanced-models')

        );

    });

    /*    $('body').on('click', '.j-close-enhanced-window', function () {

            console.log('click 95');

            c_window_enhanced.close();

        });*/

    $('body').on('click', '.j-send-enhanced', function () {

        console.log('click 96');

        var form = $(this).closest('form');

        //$(this).closest('form').submit();

        window.location.replace("/cars/#search");

        /*$.ajax({

            url: 'someTextPage',

            method: 'get',

            dataType: 'json',

            data: form.serialize(),

            success: function(data){

                //отображение найденных машин

            }

        });*/

        return false;

    });

    $(document).on('change', '.-enhanced-search input', function () {

        var form = $(this).closest('form');

        form.find('.j-enhanced-cnt').text(2200);//tmp

        /*$.ajax({

            url: 'someTextPage',

            method: 'get',

            dataType: 'json',

            data: form.serialize(),

            success: function(data){

                form.find('.j-enhanced-cnt').text(data.cnt);

            }

        });*/

    });

    $('body').on('click', '.j-clear-enhanced', function () {

        console.log('click 99');

        var form = $(this).closest('form');

        form.find('input').each(function(){

            $(this).removeClass('-checked');

            var type = $(this).attr('type');

            if((type=='checkbox') || (type=='radio')) {

                $(this).prop('checked', false);

            }

            else

                $(this).val(*);*

        });

        checkselectClearAll();

    });

});

function enhancedChangeModals(modelsElement) {

    console.log("обновляем модельки");

    //var modelsElement =

    // был инпут, сейчас весь элемент

    //console.log(modelsElement);

    //var modelsElement = $(param1).closest('.section').find('.j-enhanced-models');

    //var modelsElement = c_window_enhanced.content.find('.j-enhanced-models');

    $(modelsElement).html(*);*

    //console.log(modelsElement);

    //console.log($(modelsElement).closest('.section').find('.j-enhanced-brands input:checked'));

    //console.log($(modelsElement).closest('.section').find('.j-enhanced-brands input'));

    $(modelsElement).closest('.section').find('.j-enhanced-brands input:checked').each(function(){

        console.log($(this).val());

        var brandId = $(this).val();

        var brandActive = brands_and_models[brandId];

        var brandText = *;*

        for (var key in brandActive) {

            var modelInfo = models[key];

            if(modelInfo) {

                brandText += '<label><input type="checkbox" name="model[]" value="'+key+'">'+modelInfo[0]+'';

 if(modelInfo[1])

 brandText += ""+modelInfo[1]+" авто";

 brandText += '</label>';

            }

        }

        if(brandText && brandsNames[brandId]) {

            brandText = '<fieldset data-brand-id="'+ brandId +'"><legend>'+brandsNames[brandId]+'</legend>' + brandText + '</fieldset>';

            modelsElement.append(brandText);

        }

    });

    if(modelsElement.html())

        modelsElement.removeClass('-disabled');

    else

        modelsElement.addClass('-disabled');

    modelsElement.checkselect();

}

```