(function(onebox){
    //атрибут data-name кнопки определяет имена создаваемых инпутов
    function initCompanySelect2Autocomplete(element, disableNew, addButton, onlyCreate) {
        if (disableNew == undefined) {
            disableNew = true;
        }
        if (addButton == undefined) {
            addButton = false;
        }
        if (onlyCreate == undefined) {
            onlyCreate = false;
        }
        var selectInitObject = {
            placeholder: onebox.translate['translate_company'],
            //Does the user have to enter any data before sending the ajax request
            width: '100%',
            minimumInputLength: 1,
            allowClear: true,
            dropdownCssClass: "with-search-animation",
            ajax: {
                //How long the user has to pause their typing before sending the next request
                quietMillis: 500,
                //The url of the json service
                url: "/search/companyautocomplete/",
                dataType: 'json',
                //Our search term and what page we are on
                data: function (term) {
                    return {
                        name: term.term || '',
                        disableNew: disableNew,
                        onlyCreate: onlyCreate
                    }
                },
                processResults: function (data, params) {
                    var resultsArray = [];
                    $j(data).each(function (key, value) {
                        resultsArray.push({id: value.name, text: value.name, add: value.add, disabled: value.disabled});
                    });
                    return {
                        results: resultsArray,
                    };
                }
            },
            templateResult:  function (item) {
                if (item.add != undefined) {
                    return $j("<span class=\"ob-link-add ob-link-dashed white\">Создать компанию: " + item.text+ "</span>")
                } else {
                    return item.text;
                }
            },
            defaultValue: function (element, callback) {
                var result = element.val();
                return {id:result, text:result};
            },
        };
        if ($j(element).is('input')) {
            onebox.utils.refactorOldSelect($j(element), selectInitObject)
        } else {
            $j(element).select2(selectInitObject);
        }
        if (addButton.length) {
            $j(addButton).each(function (key, button) {
                $j(button).on('click', function(event) {
                    button = $j(button);
                    var name = false;
                    if(button.attr('data-name')) {
                        name = button.attr('data-name');
                    } else {
                        name = element.attr('name');
                    }
                    var newField = '<div class="active-wrap mb-2">';
                    newField += '<input type="hidden" value="" ' +
                        'name="'+name+'" class="js-company-select">\n';
                    newField += '</div>';
                    newField = $j(newField);
                    $j(this).closest('.active-wrap').before(newField);
                    initCompanySelect2Autocomplete(
                        newField.find('input'),
                        disableNew,
                        false,
                        onlyCreate
                    );
                    try {
                        addSearchAnimation();
                    } catch (e) {
                        console.log(e);
                    }
                }); 
            });
        }
    }
    // Выбор компании tag it + autocomplete
    function initCompanyTagit() {
        $j('#js-company-tag').each(function (i, e) {
            var $ul = $j(e);
            $ul.tagit({
                singleField: true,
                singleFieldNode: $j($ul.data('input')),
                placeholderText: 'Компания',
                allowSpaces: true,
                autocomplete: {
                    delay: 0,
                    minLength: 2,
                    source: function( request, response ) {
                        $j.ajax({
                            url: "/search/companyautocomplete/",
                            dataType: "json",
                            data:{
                                name: request.term
                            },
                            success: function( data ) {
                                if (data==null) response(null);
                                response( $j.map( data, function( item ) {
                                    var result = name = '';

                                    result = item.name;
                                    var name = item.name;
                                    var label = item.label;

                                    return {
                                        label: label,
                                        value: name
                                    }
                                }));
                            }
                        })
                    }
                }
            });
        });
    }

    // autocomplete должности tag it
    function initPostTagit() {
        $j('#js-post-tag').each(function (i, e) {
            var $ul = $j(e);
            $ul.tagit({
                singleField: true,
                singleFieldNode: $j($ul.data('input')),
                placeholderText: onebox.translate['translate_post'],
                allowSpaces: true,
                autocomplete: {
                    delay: 0,
                    minLength: 2,
                    source: function( request, response ) {
                        $j.ajax({
                            url: "/admin/shop/users/ajax/post/autocomplete/",
                            dataType: "json",
                            data:{
                                name: request.term
                            },
                            success: function( data ) {
                                if (data==null) response(null);
                                response( $j.map( data, function( item ) {
                                    return {
                                        label: item,
                                        value: item
                                    }
                                }));
                            }
                        })
                    }
                }
            });
        });
    }

    // autocomplete тегов tag it
    function initTagsTagit() {
        $j('.js-tags-tag').each(function (i, e) {
            var $ul = $j(e);
            $ul.tagit({
                singleField: true,
                singleFieldNode: $j($ul.data('input')),
                placeholderText: 'Теги',
                allowSpaces: true,
                autocomplete: {
                    delay: 0,
                    minLength: 2,
                    source: function( request, response ) {
                        $j.ajax({
                            url: "/admin/shop/users/ajax/tags/autocomplete/",
                            dataType: "json",
                            data:{
                                name: request.term
                            },
                            success: function( data ) {
                                if (data==null) response(null);
                                response( $j.map( data, function( item ) {
                                    return {
                                        label: item,
                                        value: item
                                    }
                                }));
                            }
                        })
                    }
                }
            });
        });
    }

    // Autocomplete контактов
    function initContactAutocomplete($input, $value, onSelect, params, appendTo) {
        if (!$input.length) {
            return;
        }
        var minLenght = 3;
        if ($input.data('companyfield') != undefined) {
            minLenght = 0;
        }

        var query = '';
        var appendOption = appendTo ? appendTo : $input.parent();
        $input.wrap("<div class='ob-autocomplete-wrapper'></div>");
        $input.after("<span class='border-animation'></span>");
        $input.autocomplete({
            delay: 500,
            appendTo: appendOption,
            source: function( request, response ) {
                query = request.term;

                var data = {
                    name: request.term
                };

                if (params) {
                    for (key in params) {
                        data[key] = params[key];
                    }
                }
                var company = '';
                if ($input.data('companyfield') != undefined) {
                    company = $j('[name="'+$input.data('companyfield')+'"]').val();
                    if (company == undefined) {
                        company = $j('[name="'+$input.data('companyfield')+'[]"]').val();
                    }
                }
                if (company) {
                    data.bycompany = company;
                }
                if ($input.data('addcode1c') != undefined) {
                    data.addcode1c = 1;
                }

                $j.ajax({
                    url: "/admin/shop/users/ajax/autocomplete/select2/",
                    dataType: "json",
                    data: data,
                    success: function(data) {
                        if (data == null) response(null);
                        response($j.map(data, function(item) {
                            name = item.name;
                            label = item.label;
                            if (!label) {
                                label = name;
                            }
                            return {
                                id: item.id,
                                label: label,
                                value: item.nameclear,
                                phone: item.phone,
                                email: item.email,
                                skype: item.skype,
                                whatsapp: item.whatsapp
                            }
                        }));
                    }
                });
            },
            select: function (event, ui) {
                $value.val(ui.item.id);
                if (onSelect) {
                    onSelect(ui.item);
                }

                // check if add link -> open popup window
                if (ui.item.id === 0) {
                    // ссылка на добавление контакта
                    onebox.contact.showSelectWindow(
                        htmlspecialchars(query),
                        $input,
                        $value
                    );
                } else {
                    $j($input).attr('readonly', true);
                    $j($input).attr('title', 'Вы уже выбрали клиента');
                    $j($input).css('border-color', '#6ece26');
                    $j($input).addClass('selected');
                    var icon = '<a class="ob-link-clear-field clear-field js-remove-client js-tooltip position-absolute" style="right: 15px; top: 15px;" title="Очистить поле ввода" onclick="removeClient(\''+$input.attr('id')+'\',\''+$value.attr('id')+'\');" href="javascript:void(0);"></a>';
                    $j($value).parent().addClass('position-relative').append(icon);
                }
            },
            minLength:minLenght
        }).data('ui-autocomplete')._renderItem = function (ul, item) {
            ul.removeClass().addClass("ob-autocomplete");

            item.label = item.label.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $j.ui.autocomplete.escapeRegex(this.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
            // формируем элемент выпадающего списка
            var $innerHTML = $j('<span>' + item.label + '</span>');

            var $el = $j('<li></li>')
            .append($innerHTML)
            .data("item.autocomplete", item)
            .appendTo(ul);

            if (item.id === 0) {
                // ссылка на добавление контакта
                $innerHTML.addClass('ob-link-add ob-link-dashed');
            }

            return $el;
        };
    }

    function showSelectWindow(name, $input, $value) {
        selectwindow_init('w2', $input, $value, {
            usersearch: true,
            useradd: true,
            selectedTab: 1,
            userAddDefault: name
        });
    }

    function initCompanyAutocompleteMulti(block, disableNew) {
        block = $j(block);
        if (!disableNew) {
            disableNew = '';
        }
        $j(block).each(function () {
            var input = $j(this).find('.js-client-name');
            var inputId = $j(this).find('.js-client-id');
            var query = '';
            $j(input).autocomplete({
                delay: 500,
                source: function (request, response) {
                    query = request.term;
                    $j.ajax({
                        url: "/search/companyautocomplete/",
                        async: true,
                        dataType: "json",
                        data: {
                            name: request.term,
                            disableNew: disableNew
                        },
                        success: function (data) {
                            if (data == null)
                                response(null);
                            response($j.map(data, function (item) {
                                name = item.name;
                                label = item.label;
                                if (!label) {
                                    label = name;
                                }
                                return {
                                    id: item.id,
                                    label: label,
                                    value: name,
                                }
                            }));
                        }
                    });
                },
                select: function (event, ui) {
                    $j(inputId).val(ui.item.id).change();
                    $j(input).change();

                    if (ui.item.id === 0) {
                        var id = new Date().getTime();
                        input.attr('id', id+'-name');
                        inputId.attr('id', id+'-id')
                        selectwindow_init('w2', id+'-name', id+'-id', {
                            usersearch: false,
                            useradd: true,
                            selectedTab:false,
                            userAddDefault:htmlspecialchars(query),
                            typesex: 'company'
                        }, function () {
                            $j('select#w2-user-add-typesex').val('company').change();
                        });
                    }
                },
                close: function (event, ui) {
                    if ($j(inputId).val()) {
                        if ($j(inputId).val() == '0' && $j(input).val() != '') {
                            $j(input).val(query);
                        }
                        ;
                        $j(input).change();
                    }
                },
                minLength: 3
            }).data('ui-autocomplete')._renderItem = function (ul, item) {
                ul.removeClass().addClass("ob-autocomplete");
                item.label = item.label.replace(
                    new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $j.ui.autocomplete.escapeRegex(this.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"
                );
                var inner_html = '<span>' + item.label + '</span>';
                ul.css('z-index', '9999');
                if (item.id === 0) {
                    inner_html = '<span class="ob-link-add ob-link-dashed add">' + item.label + '</span>';
                    return $j("<li class='addto'></li>")
                        .data("item.autocomplete", item)
                        .append(inner_html)
                        .appendTo(ul);
                } else {
                    return $j("<li></li>")
                        .data("item.autocomplete", item)
                        .append(inner_html)
                        .appendTo(ul);
                }
            };
            $j(input).on('change keyup', function () {
                if (!$j(this).val()) {
                    $j(inputId).val(0);
                }
            });
            $j(inputId).change(function () {
                if ($j(this).val() > 0) {
                    $j(input).attr('readonly', true);

                    $j(input).attr('title', 'Вы уже выбрали клиента');
                    $j(input).css('border-color', '#d8d9db !important');
                    $j(input).css('background-color', '#f6f8fd !important');
                    var icon = '<a class="ob-link-clear-field clear-field js-remove-client" href="javascript:void(0);"></a>';
                    if (!$j(inputId).parent().find('.js-remove-client').length) {
                        $j(inputId).parent().append(icon);
                        $j(inputId).parent().find('.js-remove-client').click(function () {
                            $j(input).attr('readonly', false);
                            $j(input).attr('title', '');
                            $j(inputId).val('');
                            $j(input).val('');
                            $j(input).css('border-color', '#d7dadd');
                            $j(inputId).parent().find('.js-remove-client').detach();
                            $j(input).css('background-color', '');
                            if ($j(input).hasClass('selected')) {
                                $j(input).removeClass('selected');
                            }
                        });
                    }
                }
            });
            if (inputId.val() > 0) {
                inputId.change();
                inputId.addClass('js-disabled');
            }
            var addButton = block.parent().find('.js-company-autocomplete-add');
            if (addButton.length) {
                addButton.click(function () {
                    var name = $j(this).attr('data-name');
                    var placeholder = input.attr('placeholder');
                    var id =  'js-new-el'+new Date().getTime();
                    var newEl = '<div class="clearable" id="'+id+'">\n' +
                        '<input type="text" placeholder="'+placeholder+'" class="js-client-name" value=""/>\n' +
                        '<span class=\'border-animation\'></span>\n' +
                        '<input class="js-disabled js-client-id" type="hidden"  value="" name="'+name+'"/>\n' +
                        '</div>';
                    ($j(newEl)).insertBefore(addButton.parent());
                    onebox.contact.initCompanyAutocompleteMulti($j('#'+id));
                });
                addButton.removeClass('js-company-autocomplete-add');
            }

        });
    }
    // Autocomplete компаний
    function initCompanyAutocomplete($input, companyAutocompleteSettings) {
        if (companyAutocompleteSettings == undefined) {
            companyAutocompleteSettings = '';
        }

        $input.wrap("<div class='ob-autocomplete-wrapper'></div>");
        $input.after("<span class='border-animation'></span>");
        $input.autocomplete({
            delay: 500,
            appendTo: $input.parent(),
            source: function(request, response) {
                $j.ajax({
                    url: "/search/companyautocomplete/",
                    dataType: "json",
                    data:{
                        name: request.term,
                        companyAutocompleteSettings: companyAutocompleteSettings,
                        disableNew: true
                    },
                    success: function( data ) {
                        if (data==null) response(null);
                        response( $j.map( data, function( item ) {
                            var result = name = '';

                            result = item.name;
                            var name = item.name;
                            var label = item.label;

                            return {
                                label: label,
                                value: name
                            }
                        }));
                    }
                });
            }
        });
    }

    // Autocomplete должностей
    function initPostAutocomplete($input) {
        $input.wrap("<div class='ob-autocomplete-wrapper'></div>");
        $input.after("<span class='border-animation'></span>");
        $input.autocomplete({
            delay: 500,
            appendTo: $input.parent(),
            source: function(request, response) {
                $j.ajax({
                    url: "/admin/shop/users/ajax/post/autocomplete/",
                    dataType: "json",
                    data:{
                        name: request.term
                    },
                    success: function( data ) {
                        if (data == null) response(null);
                        response($j.map(data, function(item) {
                            return {
                                label: item,
                                value: item
                            }
                        }));
                    }
                });
            }
        });
    }

    // Autocomplete должностей
    function initTagsAutocomplete($input) {
        $input.wrap("<div class='ob-autocomplete-wrapper'></div>");
        $input.after("<span class='border-animation'></span>");
        $input.autocomplete({
            delay: 500,
            appendTo: $input.parent(),
            source: function(request, response) {
                $j.ajax({
                    url: "/admin/shop/users/ajax/tags/autocomplete/",
                    dataType: "json",
                    data:{
                        name: request.term
                    },
                    success: function( data ) {
                        if (data == null) response(null);
                        response($j.map(data, function(item) {
                            return {
                                label: item,
                                value: item
                            }
                        }));
                    }
                });
            }
        });
    }

    function initContactSelect2Autocomplete() {
        var pageSize = 20;
        var e = $j('#js-user-filter');
        var select2Data = {
            minimumInputLength: 0,
            allowClear: true,
            multiple: true,
            ajax: {
                //How long the user has to pause their typing before sending the next request
                quietMillis: 150,
                //The url of the json service
                url: "/admin/shop/orders/contact/jsonautocomplete/select2/",
                dataType: 'json',
                //Our search term and what page we are on
                data: function (term) {
                    return {
                        pageSize: pageSize,
                        pageNum: term.page || 1,
                        searchTerm: term.term,
                        arrUserId: $j('#arrUserId').val()
                    };
                },
                processResults: function (data, params) {
                    params.page = params.page || 1;
                    return {
                        results: data.Results,
                        pagination: {
                            more: (params.page * pageSize) < data.Total
                        }
                    };
                }
            }
        };
        if (e.is("input")) {
            onebox.utils.refactorOldSelect($j(el), select2Data, true)
        } else {
            e.select2(select2Data);
        }
    }

    function addSearchAnimation() {
        $j('.with-search-animation').find('.select2-search').append('<span class="border-animation"></span>');
    }

    onebox.contact = onebox.contact || {};
    onebox.contact.initCompanyTagit = initCompanyTagit;
    onebox.contact.initCompanySelect2Autocomplete = initCompanySelect2Autocomplete;
    onebox.contact.initPostTagit = initPostTagit;
    onebox.contact.initTagsTagit = initTagsTagit;
    onebox.contact.initContactAutocomplete = initContactAutocomplete;
    onebox.contact.initCompanyAutocomplete = initCompanyAutocomplete;
    onebox.contact.initCompanyAutocompleteMulti = initCompanyAutocompleteMulti;
    onebox.contact.initPostAutocomplete = initPostAutocomplete;
    onebox.contact.initTagsAutocomplete = initTagsAutocomplete;
    onebox.contact.showSelectWindow = showSelectWindow;
    onebox.contact.initContactSelect2Autocomplete = initContactSelect2Autocomplete;
})(window.onebox = window.onebox || {});