$(document).ready(function () {
    document.addEventListener("dragover", function (event) {
        event.preventDefault();
    });

    // Impedir que o evento "drop" seja tratado na página
    document.addEventListener("drop", function (event) {
        event.preventDefault();
    });

    const verificaParametroRepresentanteUsuario = () => {
        const parametrosLogin = sessionStorage.getItem('web@parametros') ?? [];
        if (parametrosLogin.length > 0) {
            const parametrosObject = JSON.parse(parametrosLogin);
            const valor = (parametrosObject.filter(param => param.TIPO == 'SISTEMA' && param.POSICAO == '2')[0]).VALOR;
            return valor == '1';
        }
    }

    // $('.switcher-icon').off('click');
    $(".switcher-icon").on("click", function (e) {
        e.preventDefault();
        $(".right-sidebar").toggleClass("right-toggled");
    });

    var viewportmeta = document.querySelector('meta[name="viewport"]');
    viewportmeta.content = 'user-scalable=NO, width=device-width, initial-scale=1.0'
    /* todo input com a classe focus irá saltar para o proximo campo disponível ou voltar ao primeiro
     */
    $(".focus").bind("keypress", function (e) {
        if (e.keyCode == 13) {
            var inps = $(".focus:not('.d-none')"); //$("input, select, textarea"); //add select too
            for (var x = 0; x < inps.length; x++) {
                if (inps[x] == this) {
                    while ((inps[x + 1] !== undefined) && ((inps[x]).id == (inps[x + 1]).id)) {
                        x++;
                    }
                    if ((x + 1) < inps.length) {
                        $(inps[x + 1]).focus();
                    } else { $(inps[0]).focus(); }
                }
            }
            e.preventDefault();
        }
    });
    /* funcao que executa uma tarefa com delay 
     */
    jQuery.fn.extend({
        delayKeyup: function (callback, ms) {
            var t = this;
            var timer = 0;
            $(t).keyup(function () {
                clearTimeout(timer);
                timer = setTimeout(callback, ms);
            });
            return $(t);
        }
    });



    jQuery.fn.extend({
        pesquisa_array: async function (arr_txtCod, arr_pk_field, arr_desc_field, data_url, caption, tabela, callback, bSimples, serverSide) {
            let empresa = getCookie('empresa');
            let usuario = getCookie('usuario').toUpperCase();
            var t = this;

            data_url = JSON.parse(data_url.substr(34, data_url.length).trim())
            tabela = tabela.toUpperCase();
            if (['REGIAO', 'REPRESEN'].includes(tabela)) {
                const emp_id = getCookie('emp_id');
                const campoChave = tabela == 'REGIAO' ? 'REGIAO' : 'CODREP';
                const temRegistroNaEmpValor = await fazSelectNaEmpValor('', tabela);
                if (temRegistroNaEmpValor.length > 0) {
                    data_url = {
                        ...data_url,
                        innerjoin: [{
                            "tabela": "EMP_VALOR",
                            "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID = '${emp_id}'`
                        }]
                    }
                }
            }
            if (tabela == 'ENTIDADE') {
                const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                if (apenasClientesVinculadosAoRepresentante) {
                    if (!data_url.where) {
                        data_url.where = [];
                    }
                    data_url = {
                        ...data_url,
                        where: [...data_url.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                    }
                }
            }
            data_url = '/sisplan/funcoes/v1/pesquisa?JSON=' + JSON.stringify(data_url);


            $(t).unbind('pesquisou');
            $(t).on('pesquisou', function () {
                if (callback != undefined) {
                    callback();
                }
            });

            // habilita abrir a pesquisa com a tecla F4
            $(arr_txtCod[0]).keyup(function (e) {
                if (e.keyCode == 115) {
                    $(t).click();
                    e.preventDefault();
                    e.stopPropagation();
                }
            });

            $(t).unbind('click');
            $(t).click(async function () {
                if (serverSide == undefined) {
                    var dataSet = [];
                    var dataSetCols = [];
                    var _url = "";
                    // a url pode ser uma string ou uma function
                    if (typeof (data_url) === "function") {
                        _url = data_url();
                    } else {
                        _url = data_url;
                    }
                    _url += _url != '' ? `&empresa=${empresa}&usuario=${usuario}` : `empresa=${empresa}&usuario=${usuario}`;
                    // abre a tela da pesquisa
                    $("#pesquisaModalLabel").text(caption);
                    $("#pesquisaModal").modal("show");
                    $('#txtTabelaPesquisa').val(tabela);
                    validaBotaoRedirecionar();
                    $.LoadingOverlay("show");

                    var response;
                    try {
                        response = await requisicao('GET', '', _url, '', 10000);
                    } catch (error) {
                        $.LoadingOverlay("hide");
                        msgErro('Erro (' + error + ').');
                        $("#pesquisaModal").modal("hide");
                        return;
                    }

                    try {
                        if (response.status != 200) {
                            $.LoadingOverlay("hide");
                            msgErro(jsonStr['RESULT'][0].mensagem)
                            return
                        }

                        var result = await response.json();

                        $.LoadingOverlay("hide");
                        if (result['RESULT'][0]) {
                            if (!result['RESULT'][0].length) {
                                dataSet.push(result['RESULT']);
                            } else {
                                dataSet = result['RESULT'][0];
                            }

                            if (!$.isEmptyObject(dataSet[0])) {
                                // preciso dinamicamente ter a relação com o nome das colunas para tabela
                                const keys = Object.keys(dataSet[0]);
                                // for (let k in keys) {
                                //     if (['NUMERO', 'CODCLI', 'PED_CLI', 'CODIGO'].indexOf(keys[k].toUpperCase()) >= 0) {
                                //         dataSetCols.push({ 'title': keys[k], 'data': keys[k], 'width': '80px' });
                                //     } else {
                                //         dataSetCols.push({ 'title': keys[k], 'data': keys[k] });
                                //     }
                                // }
                                keys.forEach((item) => {
                                    if (['NUMERO', 'CODCLI', 'PED_CLI', 'CODIGO'].indexOf(item.toUpperCase()) >= 0) {
                                        dataSetCols.push({ 'title': item, 'data': item, 'width': '80px' });
                                    } else {
                                        dataSetCols.push({ 'title': item, 'data': item });
                                    }
                                })

                                $("#pesquisaModalBody").html('<table style="width:100%" width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-select table-hover table-sm table-condensed" id="pesquisaModalTable" ></table>');
                                //cria a tabela usando os dados e colunas
                                var table = $('#pesquisaModalTable').dataTable({
                                    destroy: true,
                                    keys: true,
                                    autoWidth: true,
                                    order: [],
                                    "language": {
                                        "sEmptyTable": "Nenhum registro encontrado",
                                        "sInfo": "_TOTAL_ registros",
                                        "sInfoEmpty": " 0 registros",
                                        "sInfoFiltered": "(Filtrados de _MAX_ registros)",
                                        "sInfoPostFix": "",
                                        "sInfoThousands": ".",
                                        "sLengthMenu": "_MENU_ resultados",
                                        "sLoadingRecords": "Carregando...",
                                        "sProcessing": "Processando...",
                                        "sZeroRecords": "Nenhum registro encontrado",
                                        "sSearch": "Pesquisar",
                                        "oPaginate": {
                                            "sNext": "Próximo",
                                            "sPrevious": "Anterior",
                                            "sFirst": "Primeiro",
                                            "sLast": "Último"
                                        },
                                        "oAria": {
                                            "sSortAscending": ": Ordenar colunas de forma ascendente",
                                            "sSortDescending": ": Ordenar colunas de forma descendente"
                                        }
                                    },
                                    "data": dataSet,
                                    "columns": dataSetCols,
                                });

                                $("body").keydown(function (e) {
                                    const qtdeLinhas = $("#pesquisaModalTable tbody tr").length;
                                    if (e.which === 80 && e.altKey) {
                                        e.preventDefault();
                                        $("input[type='search']").focus();
                                    }
                                    if (e.which === 13 && qtdeLinhas === 1) {
                                        $("#pesquisaModalTable tbody tr td")[0].click();
                                        table.$('tr.selected').removeClass('selected');
                                    }
                                });

                                // desenha a seleção do registro clicaco
                                $('#pesquisaModalTable tbody').on('click', 'tr', function () {
                                    if ($(this).hasClass('selected')) {
                                        $(this).removeClass('selected');
                                    } else {
                                        table.$('tr.selected').removeClass('selected');
                                        $(this).addClass('selected');
                                    }
                                });
                                // duplo click faz escolher o registro e fechar a pesquisa
                                $('#pesquisaModalTable tbody').on('dblclick', 'tr', function (e) {
                                    e.preventDefault();
                                    document.firstElementChild.style.zoom = "reset";
                                    table.$('tr.selected').removeClass('selected');
                                    $(this).addClass('selected');
                                    $("#pesquisaModalSelecionar").click();
                                });
                                // botão selecionar
                                $("#pesquisaModalSelecionar").unbind('click');
                                $("#pesquisaModalSelecionar").click(function () {
                                    var data = table.api().row('.selected').data();
                                    for (var i = 0 in arr_pk_field) {
                                        if (data && data[arr_pk_field[i]].toString() && data[arr_desc_field[i]].toString()) {
                                            if ((bSimples != undefined) && (bSimples[i] != '') && (bSimples[i] != undefined)) {
                                                $(arr_txtCod[i]).val(data[arr_pk_field[i]].toString());
                                            } else {
                                                $(arr_txtCod[i]).val('[' + data[arr_pk_field[i]].toString() + '] - ' + data[arr_desc_field[i]]);
                                            }
                                            $(arr_txtCod[i]).attr('data-selecionado', true);
                                            $(arr_txtCod[i]).attr('data-chave', data[arr_pk_field[i]]);
                                            $(arr_txtCod[i]).attr('data-desc', data[arr_desc_field[i]]);
                                            $("#pesquisaModal").modal("hide");
                                        } else {
                                            // $(arr_txtCod[i]).attr('data-selecionado', false);
                                            // $(arr_txtCod[i]).val('');
                                        }
                                    }
                                    $(t).trigger('pesquisou');
                                    // if (data && data[pk_field].toString() && data[desc_field]) {
                                    //     $(txtCod).val('[' + data[pk_field].toString() + '] - ' + data[desc_field]);
                                    //     $("#pesquisaModal").modal("hide");
                                    // }
                                });
                                // KeyTable ajuda a navegar na tabela com as teclas~
                                try {
                                    var keytable = new $.fn.dataTable.KeyTable(table);
                                    // se precionar enter executa duplo click
                                    keytable.event.action(null, null, function (node) {
                                        $(node).dblclick();
                                    });
                                } catch (error) {

                                }
                                // posiciona a navegacao via teclas no primeiro registro
                                if (dataSet.length >= 1) {
                                    $("#pesquisaModalTable tbody tr td")[0].click();
                                    table.$('tr.selected').removeClass('selected');
                                }
                            }
                        } else {
                            msgErro('Erro ao consultar dados, verifique a conexão.');
                            $("#pesquisaModal").modal("hide");
                        }
                    } catch (error) {
                        console.log(error)
                        $.LoadingOverlay("hide");
                        msgErro('Erro ao consultar dados, verifique a conexão.');
                        $("#pesquisaModal").modal("hide");
                    }

                    // limpa evento
                    //$("#pesquisaModalSelecionar").unbind('click');
                    // seta o titulo da pesquisa
                    $("#pesquisaModalSelecionar").show();
                    $("#pesquisaModalConfirmar").hide();
                    // evento que controla quando a pesquisa fecha
                    $("#pesquisaModal").unbind('hidden.bs.modal');
                    $('#pesquisaModal').on('hidden.bs.modal', function (_) {
                        $('#pesquisaModalBody').empty();
                        $(arr_txtCod[0]).focus();
                    });
                } else {
                    // abre a tela da pesquisa
                    $("#pesquisaModalLabel").text(caption);
                    $("#pesquisaModal").modal("show");
                    $.LoadingOverlay("show");
                    let camposTabela = '';
                    for (let i = 0; i < JSON.parse(data_url).camposSelect.length; i++) {
                        camposTabela += `<th class="th-sm">${JSON.parse(data_url).camposSelect[i]}</th>`
                    };
                    try {
                        const protocolo = getCookie('protocolo');
                        $("#pesquisaModalBody").html(`<table style="width:100%" width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-select table-hover table-sm table-condensed" id="pesquisaModalTable" ><thead><tr>${camposTabela}</tr></thead><tbody></tbody></table>`);
                        //cria a tabela usando os dados e colunas
                        var table = $('#pesquisaModalTable').DataTable({
                            destroy: true,
                            lengthChange: false,
                            autoWidth: true,
                            serverSide: true,
                            processing: false,
                            ajax: {
                                url: `${protocolo}://${getCookie('ip_api')}/sisplan/funcoes/v1/pesquisadatatable`,
                                type: "GET",
                                headers: { 'Authorization': BASIC_AUTH },
                                data: {
                                    "EMPRESA": getCookie('empresa'),
                                    "JSON": data_url
                                }
                            },
                            "language": {
                                "sEmptyTable": "Nenhum registro encontrado",
                                "sInfo": "_TOTAL_ registros",
                                "sInfoEmpty": " 0 registros",
                                "sInfoFiltered": "(Filtrados de _MAX_ registros)",
                                "sInfoPostFix": "",
                                "sInfoThousands": ".",
                                "sLengthMenu": "_MENU_ resultados",
                                "sLoadingRecords": "Carregando...",
                                "sProcessing": "Processando...",
                                "sZeroRecords": "Nenhum registro encontrado",
                                "sSearch": "Pesquisar",
                                "oPaginate": {
                                    "sNext": "Próximo",
                                    "sPrevious": "Anterior",
                                    "sFirst": "Primeiro",
                                    "sLast": "Último"
                                },
                                "oAria": {
                                    "sSortAscending": ": Ordenar colunas de forma ascendente",
                                    "sSortDescending": ": Ordenar colunas de forma descendente"
                                }
                            }
                        });

                        // desenha a seleção do registro clicaco
                        $('#pesquisaModalTable tbody').on('click', 'tr', function () {
                            if ($(this).hasClass('selected')) {
                                $(this).removeClass('selected');
                            } else {
                                $('#pesquisaModalTable').DataTable().$('tr.selected').removeClass('selected');
                                $(this).addClass('selected');
                            }
                        });
                        // duplo click faz escolher o registro e fechar a pesquisa
                        $('#pesquisaModalTable tbody').on('dblclick', 'tr', function (e) {
                            e.preventDefault();
                            document.firstElementChild.style.zoom = "reset";
                            table.$('tr.selected').removeClass('selected');
                            $(this).addClass('selected');
                            $("#pesquisaModalSelecionar").click();
                        });
                        // botão selecionar
                        $("#pesquisaModalSelecionar").unbind('click');
                        $("#pesquisaModalSelecionar").click(function () {
                            var data = table.row('.selected').data();
                            var dataAux = data;
                            data = {};
                            for (let i = 0; i < JSON.parse(data_url).camposSelect.length; i++) {
                                data[JSON.parse(data_url).camposSelect[i]] = dataAux[i]
                            };
                            for (var i = 0 in arr_pk_field) {
                                if (data && data[arr_pk_field[i]].toString() && data[arr_desc_field[i]].toString()) {
                                    if ((bSimples != undefined) && (bSimples[i] != '') && (bSimples[i] != undefined)) {
                                        $(arr_txtCod[i]).val(data[arr_pk_field[i]].toString());
                                    } else {
                                        $(arr_txtCod[i]).val('[' + data[arr_pk_field[i]].toString() + '] - ' + data[arr_desc_field[i]]);
                                    }
                                    $(arr_txtCod[i]).attr('data-selecionado', true);
                                    $(arr_txtCod[i]).attr('data-chave', data[arr_pk_field[i]]);
                                    $(arr_txtCod[i]).attr('data-desc', data[arr_desc_field[i]]);
                                    $("#pesquisaModal").modal("hide");
                                }
                            }
                            $(t).trigger('pesquisou');
                        });

                    } catch (error) {
                        console.log(error)
                        $.LoadingOverlay("hide");
                        msgErro('Erro ao consultar dados, verifique a conexão.');
                        $("#pesquisaModal").modal("hide");
                    }

                    $.LoadingOverlay("hide");
                    $("#pesquisaModalSelecionar").show();
                    $("#pesquisaModalConfirmar").hide();
                    // evento que controla quando a pesquisa fecha
                    $("#pesquisaModal").unbind('hidden.bs.modal');
                    $('#pesquisaModal').on('hidden.bs.modal', function (_) {
                        $('#pesquisaModalBody').empty();
                        $(arr_txtCod[0]).focus();
                    });
                }
            });
        }
    });

    jQuery.fn.extend({
        pesquisa: async function (txtCod, pk_field, desc_field, data_url, caption, tabela, simples, callback, empresa = '', empIds = []) {
            // let empresa = getCookie('empresa');
            // let usuario = getCookie('usuario').toUpperCase();

            data_url = JSON.parse(data_url.substr(34, data_url.length).trim())
            tabela = tabela.toUpperCase();
            if (['REGIAO', 'REPRESEN'].includes(tabela)) {
                const emp_id = getCookie('emp_id');
                const campoChave = tabela == 'REGIAO' ? 'REGIAO' : 'CODREP';
                const temRegistroNaEmpValor = await fazSelectNaEmpValor('', tabela);
                if (temRegistroNaEmpValor.length > 0) {
                    if (empIds.length > 0) {
                        //CRIADO PARAMETRO EMPIDS PARA CASO SEJA NECESSÁRIO FAZER UM IN EM ALGUM SELECT DE PESQUISA QUE FAÇA PESQUISA NA TABELA REGIAO OU REPRESEN POIS CONSIDERA A EMP_VALOR
                        //TEM QUE PASSAR UM DISTINCT LA AONDE VAIS CHAMAR O AUTOCOMPLETA NO CAMPOS SELECT EX: "camposSelect":[ "distinct codrep", "nome"]}` -- BRUNO 25/05/2023
                        data_url = {
                            ...data_url,
                            innerjoin: [{
                                "tabela": "EMP_VALOR",
                                "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID IN (${empIds.toString()})}'`
                            }]
                        }
                    } else {
                        data_url = {
                            ...data_url,
                            innerjoin: [{
                                "tabela": "EMP_VALOR",
                                "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID = '${emp_id}'`
                            }]
                        }

                    }
                }
            }

            if (['NATUREZA'].includes(tabela)) {
                const emp_id = getCookie('emp_id');
                const campoChave = 'NATUREZA';
                const temRegistroNaEmpValor = await fazSelectNaEmpValor('', tabela);
                if (temRegistroNaEmpValor.length > 0) {
                    data_url = {
                        ...data_url,
                        innerjoin: [{
                            "tabela": "EMP_VALOR",
                            "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID = '${emp_id}'`
                        }]
                    }
                }
            }

            if (tabela == 'ENTIDADE') {
                const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                if (apenasClientesVinculadosAoRepresentante) {
                    if (!data_url.where) {
                        data_url.where = [];
                    }
                    data_url = {
                        ...data_url,
                        where: [...data_url.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                    }
                }
            }

            if (empresa != '') {
                data_url = '/sisplan/funcoes/v1/pesquisa?JSON=' + JSON.stringify(data_url) + `&EMPRESA=_${empresa}`;
            } else {
                data_url = '/sisplan/funcoes/v1/pesquisa?JSON=' + JSON.stringify(data_url);
            }


            var t = this;


            $(txtCod).unbind('pesquisou');
            $(txtCod).on('pesquisou', function () {
                if (callback != undefined) {
                    callback();
                }
            });

            $("#pesquisaModalConfirmar").hide();
            // habilita abrir a pesquisa com a tecla F4
            $(txtCod).keyup(function (e) {
                if (e.keyCode == 115) {
                    $(t).click();
                    e.preventDefault();
                    e.stopPropagation();
                }
            });
            $(t).off('click');
            $(t).click(async function () {
                var dataSet = [];
                var dataSetCols = [];
                var _url = "";
                // a url pode ser uma string ou uma function
                if (typeof (data_url) === "function") {
                    _url = data_url();
                } else {
                    _url = data_url;
                }
                //_url += _url != '' ? `&empresa=${empresa}&usuario=${usuario}` : `empresa=${empresa}&usuario=${usuario}`;
                // abre a tela da pesquisa
                $('#txtTabelaPesquisa').val(tabela);
                validaBotaoRedirecionar();
                $("#pesquisaModalLabel").text(caption);
                $("#pesquisaModal").modal("show");
                $.LoadingOverlay("show");

                var response;
                try {
                    response = await requisicao('GET', '', _url, '', 10000);
                } catch (error) {
                    $.LoadingOverlay("hide");
                    msgErro('Erro (' + error + ').');
                    $("#pesquisaModal").modal("hide");
                    return;
                }

                try {
                    if (response.status != 200) {
                        $.LoadingOverlay("hide");
                        msgErro(jsonStr['RESULT'][0].mensagem);
                        return;
                    }

                    var result = await response.json();

                    $.LoadingOverlay("hide");
                    if (result['RESULT'][0]) {
                        if (!result['RESULT'][0].length) {
                            dataSet.push(result['RESULT']);
                        } else {
                            dataSet = result['RESULT'][0];
                        }

                        if (!$.isEmptyObject(dataSet[0])) {
                            // preciso dinamicamente ter a relação com o nome das colunas para tabela
                            var keys = Object.keys(dataSet[0]);
                            for (let i = 0; i < keys.length; i++) {
                                if (['NUMERO', 'CODCLI', 'PED_CLI', 'CODIGO'].indexOf(keys[i].toUpperCase()) >= 0) {
                                    dataSetCols.push({ 'title': keys[i], 'data': keys[i], 'width': '80px' });
                                } else {
                                    dataSetCols.push({ 'title': keys[i], 'data': keys[i] });
                                }
                            }
                            // for (var k in keys) {
                            //     if (['NUMERO', 'CODCLI', 'PED_CLI', 'CODIGO'].indexOf(keys[k].toUpperCase()) >= 0) {
                            //         dataSetCols.push({ 'title': keys[k], 'data': keys[k], 'width': '80px' });
                            //     } else {
                            //         dataSetCols.push({ 'title': keys[k], 'data': keys[k] });
                            //     }
                            // }

                            $("#pesquisaModalBody").html('<table style="width:100%" width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-select table-hover table-sm table-condensed" id="pesquisaModalTable" ></table>');
                            //cria a tabela usando os dados e colunas
                            var table = $('#pesquisaModalTable').dataTable({
                                destroy: true,
                                order: false,
                                keys: true,
                                autoWidth: true,
                                "language": {
                                    "sEmptyTable": "Nenhum registro encontrado",
                                    "sInfo": "_TOTAL_ registros",
                                    "sInfoEmpty": " 0 registros",
                                    "sInfoFiltered": "(Filtrados de _MAX_ registros)",
                                    "sInfoPostFix": "",
                                    "sInfoThousands": ".",
                                    "sLengthMenu": "_MENU_ resultados",
                                    "sLoadingRecords": "Carregando...",
                                    "sProcessing": "Processando...",
                                    "sZeroRecords": "Nenhum registro encontrado",
                                    "sSearch": "Pesquisar",
                                    "oPaginate": {
                                        "sNext": "Próximo",
                                        "sPrevious": "Anterior",
                                        "sFirst": "Primeiro",
                                        "sLast": "Último"
                                    },
                                    "oAria": {
                                        "sSortAscending": ": Ordenar colunas de forma ascendente",
                                        "sSortDescending": ": Ordenar colunas de forma descendente"
                                    }
                                },
                                "data": dataSet,
                                "columns": dataSetCols
                            });

                            $("body").keydown(function (e) {
                                const qtdeLinhas = $("#pesquisaModalTable tbody tr").length;
                                if (e.which === 80 && e.altKey) {
                                    e.preventDefault();
                                    $("input[type='search']").focus();
                                }
                                if (e.which === 13 && qtdeLinhas === 1) {
                                    $("#pesquisaModalTable tbody tr td")[0].click();
                                    table.$('tr.selected').removeClass('selected');
                                }
                            });

                            // desenha a seleção do registro clicaco
                            $('#pesquisaModalTable tbody').on('click', 'tr', function () {
                                if ($(this).hasClass('selected')) {
                                    $(this).removeClass('selected');
                                } else {
                                    table.$('tr.selected').removeClass('selected');
                                    $(this).addClass('selected');
                                }
                            });
                            // duplo click faz escolher o registro e fechar a pesquisa
                            $('#pesquisaModalTable tbody').on('dblclick', 'tr', function (e) {
                                e.preventDefault();
                                document.firstElementChild.style.zoom = "reset";
                                table.$('tr.selected').removeClass('selected');
                                $(this).addClass('selected');
                                $("#pesquisaModalSelecionar").click();
                            });
                            // botão selecionar
                            $("#pesquisaModalSelecionar").unbind('click');
                            $("#pesquisaModalSelecionar").click(function () {
                                var data = table.api().row('.selected').data();
                                if (data && data[pk_field].toString() && data[desc_field].toString()) {
                                    if ((simples != '') && (simples != undefined)) {
                                        $(txtCod).val(data[pk_field].toString());
                                        $(txtCod).attr('data-chave', data[pk_field].toString());
                                        $(txtCod).attr('data-desc', data[desc_field]);
                                    } else {
                                        $(txtCod).val('[' + data[pk_field].toString() + '] - ' + data[desc_field]);
                                        $(txtCod).attr('data-chave', data[pk_field].toString());
                                        $(txtCod).attr('data-desc', data[desc_field]);
                                    }
                                    $(txtCod).attr('data-selecionado', true);
                                    $(txtCod).trigger('pesquisou');
                                    $("#pesquisaModal").modal("hide");
                                } else {
                                    // $(txtCod).attr('data-selecionado', false);
                                }
                            });
                            // KeyTable ajuda a navegar na tabela com as teclas~
                            try {
                                var keytable = new $.fn.dataTable.KeyTable(table);
                                // se precionar enter executa duplo click
                                keytable.event.action(null, null, function (node) {
                                    $(node).dblclick();
                                });
                            } catch { }
                            // posiciona a navegacao via teclas no primeiro registro
                            if (dataSet.length >= 1) {
                                $("#pesquisaModalTable tbody tr td")[0].click();
                                table.$('tr.selected').removeClass('selected');
                            }
                        }
                    } else {
                        msgErro('Erro ao consultar dados, verifique a conexão.');
                        $("#pesquisaModal").modal("hide");
                    }
                } catch (error) {
                    console.log(error);
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao consultar dados, verifique a conexão.');
                    $("#pesquisaModal").modal("hide");
                }

                // limpa evento
                //$("#pesquisaModalSelecionar").unbind('click');
                // seta o titulo da pesquisa

                $("#pesquisaModalSelecionar").show();
                // evento que controla quando a pesquisa fecha
                $('#pesquisaModal').unbind('hidden.bs.modal');
                $('#pesquisaModal').on('hidden.bs.modal', function (_) {
                    $('#pesquisaModalBody').empty();
                    $(txtCod).focus();
                });
            });
        }
    });

    jQuery.extend(jQuery.fn.dataTableExt.oSort, {
        "date-br-pre": function (a) {
            var brDatea = a.split('/');
            return (brDatea[2] + brDatea[1] + brDatea[0]);
        },

        "date-br-asc": function (a, b) {
            return ((a < b) ? -1 : ((a > b) ? 1 : 0));
        },

        "date-br-desc": function (a, b) {
            return ((a < b) ? 1 : ((a > b) ? -1 : 0));
        }
    });

    jQuery.fn.extend({
        autocompleta: async function (numCaracteres, $url, arrCampos, arrChaves, arrDescricoes, callback, bSimples, empresa = '', empIds = []) {
            $url = JSON.parse($url.substr(5, $url.length).trim())
            const tabela = $url.tabela.toUpperCase();
            if (['REGIAO', 'REPRESEN'].includes(tabela)) {
                const emp_id = getCookie('emp_id');
                const temRegistroNaEmpValor = await fazSelectNaEmpValor('', tabela);
                const campoChave = tabela.toUpperCase() == 'REGIAO' ? 'REGIAO' : 'CODREP';
                if (temRegistroNaEmpValor.length > 0) {
                    //CRIADO PARAMETRO EMPIDS PARA CASO SEJA NECESSÁRIO FAZER UM IN EM ALGUM SELECT DE PESQUISA QUE FAÇA PESQUISA NA TABELA REGIAO OU REPRESEN POIS CONSIDERA A EMP_VALOR
                    //TEM QUE PASSAR UM DISTINCT LA AONDE VAIS CHAMAR O AUTOCOMPLETA NO CAMPOS SELECT EX: "camposSelect": ["distinct codrep chave", "nome descricao"] -- BRUNO 25/05/2023
                    if (empIds.length > 0) {
                        $url = {
                            ...$url,
                            innerjoin: [{
                                "tabela": "EMP_VALOR",
                                "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID IN (${empIds.toString()})}'`,
                            }]
                        }
                    } else {
                        $url = {
                            ...$url,
                            innerjoin: [{
                                "tabela": "EMP_VALOR",
                                "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave).toUpperCase()} AND EMP_VALOR.EMP_ID = '${emp_id}'`
                            }]
                        }
                    }

                }
            }
            if (['NATUREZA'].includes(tabela)) {
                const emp_id = getCookie('emp_id');
                const campoChave = 'NATUREZA';
                if (getCookie('naturezanaempvalor') == 'S') {
                    $url = {
                        ...$url,
                        innerjoin: [{
                            "tabela": "EMP_VALOR",
                            "condicao": `EMP_VALOR.TABELA = '${tabela}' AND EMP_VALOR.VALOR = ${(tabela + '.' + campoChave)} AND EMP_VALOR.EMP_ID = '${emp_id}'`
                        }]
                    }
                }
            }
            if (tabela == 'ENTIDADE') {
                const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                if (apenasClientesVinculadosAoRepresentante) {
                    if (!$url.where) {
                        $url.where = [];
                    }
                    $url = {
                        ...$url,
                        where: [...$url.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                    }
                }
            }
            const consultaCliente = $url.tabela.toUpperCase() === 'ENTIDADE';
            const consultaPedido = $url.tabela.toUpperCase() === 'PEDIDO';
            const consultaNota = $url.tabela.toUpperCase() === 'NOTA';
            const consultaDocumento = $url.tabela.toUpperCase() === 'PA_MOV';
            const consultaReceber = $url.tabela.toUpperCase() === 'RECEBER';
            const consultaPagar = $url.tabela.toUpperCase() === 'PAGAR';
            const consultaReceberB = $url.tabela.toUpperCase() === 'RECEBERB';
            const consultaPagar1 = $url.tabela.toUpperCase() === 'PAGAR1';
            if (consultaCliente) {
                $url.camposSelect = ["CODCLI", "NOME", "CNPJ", "FANTASIA"];
            }
            if (consultaNota) {
                $url.camposSelect = ["FATURA", "SERIE"];
            }
            if (consultaPedido) {
                $url.camposSelect = ["PEDIDO.NUMERO", "ENTIDADE.NOME"];
            }
            if (consultaDocumento) {
                $url.camposSelect = ["NUM_DOCTO", "DT_MVTO"];
                $url.camposWhereServerSide = ["NUM_DOCTO"];
            }
            if (consultaReceber) {
                $url.camposSelect = ["NUMERO", "CODCLI"];
                $url.camposWhereServerSide = ["NUMERO"];
            }
            if (consultaPagar) {
                $url.camposSelect = ["NUM_AP", "CODCRE"];
                $url.camposWhereServerSide = ["NUM_AP"];
            }
            if (consultaReceberB) {
                $url.camposSelect = ["LANCAMENTO", "NUMERO"];
                $url.camposWhereServerSide = ["LANCAMENTO"];
            }
            if (consultaPagar1) {
                $url.camposSelect = ["LANCAMENTO", "NUM_AP"];
                $url.camposWhereServerSide = ["LANCAMENTO"];
            }
            $url = 'JSON=' + JSON.stringify($url);
            var urlOrig = $url;

            var t = this;
            $(t).unbind('keyup');
            $(t).on('keyup', function (event) {
                if ((event.keyCode != '13') && (event.keyCode != '9')) {
                    $(t).attr('data-selecionado', false);
                    $(t).attr('data-chave', '');
                    $(t).attr('data-desc', '');
                }
            });

            $(t).unbind('pesquisou');
            $(t).on('pesquisou', function () {
                if (callback != undefined) {
                    callback();
                }
            });

            $(t).unbind('blur');
            $(t).on('blur', function () {
                if (($(t).attr('data-selecionado') == 'false') && ($(t).val() != '')) {
                    $(t).val('');
                    setTimeout(function () { $(t).focus() }, 150);
                }
            });
            var dados = [];

            $(t).autocomplete({
                autoFocus: true,
                source: async function (request, response) {
                    const urlPadrao = (consultaCliente ||
                        consultaPedido ||
                        consultaNota ||
                        consultaDocumento ||
                        consultaReceber ||
                        consultaPagar ||
                        consultaReceberB ||
                        consultaPagar1
                    ) ? '/sisplan/funcoes/v1/pesquisadatatable?' : `/sisplan/funcoes/v1/pesquisa?`;
                    $url = (consultaCliente ||
                        consultaPedido ||
                        consultaNota ||
                        consultaDocumento ||
                        consultaReceber ||
                        consultaPagar ||
                        consultaReceberB ||
                        consultaPagar1
                    ) ? `${urlOrig}&START=0&LENGTH=100&CLIENTE=S&AUTOCOMPLETA=S&search[value]=${request.term}` : $url;
                    if (empresa != '') {
                        $url = $url.replaceAll(`&EMPRESA=_${empresa}`, '') + `&EMPRESA=_${empresa}`
                    }
                    await requisicao('GET', urlPadrao, $url, null)
                        .then(async function (retorno) {
                            const dataset = await retorno.json();
                            dados = await dataset['RESULT'][0];
                            const array = await dados.map(function (value, index) {
                                if (consultaCliente) {
                                    value.CHAVE = value['CODCLI'];
                                    value.DESCRICAO = value['NOME'];
                                }
                                if (consultaPedido) {
                                    value.DESC_DEPOSITO = value['DESCRICAO'];
                                    value.CHAVE = value['NUMERO'];
                                    value.DESCRICAO = value['NOME'];
                                }
                                if (consultaNota) {
                                    value.CHAVE = value['FATURA'];
                                    value.DESCRICAO = value['SERIE'];
                                }
                                if (consultaDocumento) {
                                    value.CHAVE = value["NUM_DOCTO"];
                                    value.DESCRICAO = value["DT_MVTO"];
                                }
                                if (consultaReceber) {
                                    value.CHAVE = value["NUMERO"];
                                    value.DESCRICAO = value["CODCLI"];
                                }
                                if (consultaPagar) {
                                    value.CHAVE = value["NUM_AP"];
                                    value.DESCRICAO = value["CODCRE"];
                                }
                                if (consultaReceberB) {
                                    value.CHAVE = value["LANCAMENTO"];
                                    value.DESCRICAO = value["NUMERO"];
                                }
                                if (consultaPagar1) {
                                    value.CHAVE = value["LANCAMENTO"];
                                    value.DESCRICAO = value["NUM_AP"];
                                }
                                const keys = Object.keys(value);
                                const arrChaves = [];
                                for (var k in keys) {
                                    arrChaves.push(keys[k]);
                                }
                                const resultado = '[' + value.CHAVE + '] - ' + value.DESCRICAO;
                                return resultado;
                            });
                            response($.ui.autocomplete.filter(array, request.term));
                        });
                },
                minLength: numCaracteres,
                select: function (event, ui) {
                    var chave = pegaChave(ui.item.label, chave);
                    var data = dados.find(campoPesquisado => campoPesquisado.CHAVE == chave);
                    if (consultaCliente) {
                        data.CHAVE = data['CODCLI'];
                        data.DESCRICAO = data['NOME'];
                    }

                    if (arrCampos != undefined) {
                        for (let i = 0; i < arrCampos.length; i++) {
                            if (data[arrChaves[i]].toString()) {
                                if ((bSimples != undefined) && (bSimples[i] != '') && (bSimples[i] != undefined)) {
                                    $(arrCampos[i]).val(data[arrChaves[i]].toString());
                                    $(arrCampos[i]).attr('data-chave', data[arrChaves[i]].toString());
                                    $(arrCampos[i]).attr('data-desc', data[arrDescricoes[i]]);
                                    $(arrCampos[i]).attr('data-selecionado', true);
                                } else {
                                    $(arrCampos[i]).val('[' + data[arrChaves[i]].toString() + '] - ' + data[arrDescricoes[i]]);
                                    $(arrCampos[i]).attr('data-chave', data[arrChaves[i]].toString());
                                    $(arrCampos[i]).attr('data-desc', data[arrDescricoes[i]]);
                                    $(arrCampos[i]).attr('data-selecionado', true);
                                }
                            } else {
                                $(arrCampos[i]).val('');
                                $(arrCampos[i]).attr('data-chave', '');
                                $(arrCampos[i]).attr('data-desc', '');
                                $(arrCampos[i]).attr('data-selecionado', true);
                            }
                        }
                    }
                    $(t).attr('data-chave', chave);
                    $(t).attr('data-desc', data.DESCRICAO);
                    $(t).attr('data-selecionado', true);
                    $(t).trigger('pesquisou');
                },
                open: function () {
                    $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
                },
                close: function () {
                    $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
                }
            });
        }
    });

    jQuery.fn.extend({
        habilita_tags: async function (placeholder) {
            $(this).select2({
                tags: [],
                multiple: true,
                placeholder: placeholder,
                language: {
                    noResults: function () {
                        return "Digite e aperte Enter para confirmar.";
                    }
                }
            });
        }
    });

    jQuery.fn.extend({
        pesquisa_varios: async function (data_url, chave, descricao) {
            $(this).on('click', async function () {
                async function retornaOpcoes() {
                    const response = await requisicao('GET', '/Sisplan/Funcoes/V1/pesquisa?', `JSON=${data_url}`, null);
                    //   `JSON={ "tabela":"entidade", "camposSelect":["codcli", "nome"],"where": ["1=1"]}`, null);
                    // const jsonStr = await response.json();

                    if (!response) {
                        return [];
                    }

                    if (response.status != 200) {
                        console.error('erro ao buscar dados...');
                        return [];
                    }
                    const jsonStr = await response.json();
                    const retorno = jsonStr.RESULT[0];
                    return retorno;
                }

                const myOptions = await retornaOpcoes();
                myOptions.forEach((opt) => {
                    $(this).append(`<option value=${opt[chave]}>${opt[descricao]}</option`)
                });
                $(this).select2();
            });
        }
    });

    jQuery.fn.extend({
        pesquisa_variosServerside: async function (numCaracteres, data_url, chave, descricao) {
            let jsonPesquisa = JSON.parse(data_url);

            if (jsonPesquisa.tabela == 'ENTIDADE') {
                const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                if (apenasClientesVinculadosAoRepresentante) {
                    if (!jsonPesquisa.where) {
                        jsonPesquisa.where = [];
                    }
                    jsonPesquisa = {
                        ...jsonPesquisa,
                        where: [...jsonPesquisa.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                    }
                    data_url = JSON.stringify(jsonPesquisa);
                }
            }



            $(this).select2({
                ajax: {
                    url: `${getCookie('protocolo')}://${getCookie('ip_api')}/sisplan/funcoes/v1/pesquisadatatable`,
                    dataType: 'json',
                    type: 'GET',
                    headers: {
                        'Authorization': BASIC_AUTH
                    },
                    data: function (params) {
                        const ajaxData = {
                            "EMPRESA": getCookie('empresa'),
                            "JSON": data_url,
                            "CLIENTE": 'S',
                            "START": 0,
                            "LENGTH": 100,
                            "AUTOCOMPLETA": 'S',
                            "search[value]": params.term
                        };
                        return ajaxData;
                    },
                    processResults: function (response) {
                        const retorno = response.RESULT[0];
                        const newOption = [];
                        retorno.forEach((dado) => {
                            const option = {
                                id: dado[chave],
                                text: `[${dado[chave]}] - ${dado[descricao]}`
                            };
                            newOption.push(option);
                        });
                        return {
                            results: newOption
                        };

                    },
                },
                multiple: true,
                allowClear: false,
                placeholder: 'Selecione o(s) registro(s)',
                language: {
                    inputTooShort: function (e) {
                        if (e.input == '') {
                            return `Digite ${numCaracteres} ou mais caracteres para pesquisar.`;
                        } else if (e.input.length < numCaracteres) {
                            return `Digite ${numCaracteres - e.input.length} ou mais caracteres para pesquisar.`
                        }
                    },
                    noResults: function () {
                        return 'Nenhum registro encontrado.'
                    }
                },
                minimumInputLength: numCaracteres,

            });

            const id = $(this)[0].id;
            $($($($(this).parent().children()[1]).children()[0]).children().children()[0]).addClass(id);

            const maxWidth = parseFloat($(`.${id}`).css('width')) - 3;
            $('.select2.select2-container.select2-container--default').css('flex', '1');
            $('.select2-search__field').attr('style', function (i, s) { return s + 'height: 100% !important;' });
            //$('.select2-selection__rendered').attr('style', function(i, s) { return s + 'overflow: hidden !important;' });

            if ($(`.select2-selection__rendered.${id}`).length > 0) {
                $(`.select2-selection__rendered.${id}`)[0].style.position = "absolute";
                $(`.select2-selection__rendered.${id}`)[0].style.zIndex = 99999999;

                $(`.select2-selection__rendered.${id}`).on("keydown", function (e) {
                    setTimeout(() => { $(".select2-results").removeClass("d-none"); }, 200);
                })

            } else {
                $(`.select2-selection__rendered`)[0].style.position = "absolute";
                $(`.select2-selection__rendered`)[0].style.zIndex = 99999999;

                $(`.select2-selection__rendered`).on("keydown", function (e) {
                    setTimeout(() => { $(".select2-results").removeClass("d-none"); }, 200);
                })

            }

            function ajustarPosicaoDropdown(componente) {
                const distancia = $(componente).outerHeight() - parseFloat('36px');
                // 
                const tamanhoModal = $('#modal-filtros .modal-content').height();
                const meioModal = tamanhoModal / 2;
                const posicaoTopComponente = $(componente).offset().top;


                if (posicaoTopComponente > meioModal) {
                    $(componente).css('top', `-${distancia}px`);
                }

                $(componente).css('z-index', '999999999');
            }

            // $(`.${id}`).css('max-width', `${maxWidth}px`);
            $(this).on('select2:open', function () {
                $('.select2-search__field').keyup(function (e) {
                    if (e.keyCode == 115) {
                        const idBotaoPesquisa = this.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.children[2].children[0].id
                        $(`#${idBotaoPesquisa}`).trigger('click')
                        e.preventDefault();
                        e.stopPropagation();
                    };
                });

                $('.select2-selection__rendered').css('z-index', ''); // remove z-index de todos os select
                $(this).siblings('.select2-container').find('.select2-selection__rendered').css('z-index', '99999999'); // adiciona z-index no select aberto
                if ($(`.${id}`).length > 0) {
                    $(`.${id}`).css('height', '');
                } else {
                    $(".select2-selection__rendered").css('height', '');
                }

                if ($(this).val().length > 0 && $(".select2-search__field").val() != "") {
                    $(".select2-results").removeClass("d-none");
                    ajustarPosicaoDropdown(`.${id}`);
                    $(`.${id}`).css('z-index', '999999999');
                } else if ($(this).val().length > 0) {
                    $(".select2-results").addClass("d-none");
                    ajustarPosicaoDropdown(`.${id}`);
                } else {
                    $(".select2-results").removeClass("d-none");
                }
            });

            $(this).on('select2:close', function () {
                if ($(`.${id}`).length > 0) {
                    $(`.${id}`).css('height', '94%');
                    $(`.select2-search__field`).attr('placeholder', 'Selecione o(s) registro(s)');
                } else {
                    $(".select2-selection__rendered").css('height', '94%');
                }
            });

            $(`#${id}`).on('select2:closing', function () {
                setTimeout(() => {
                    $('.select2-search__field').attr('placeholder', 'Selecione o(s) registro(s)');
                    $(`.${id}`).css('top', 'auto');
                }, 0);
            });

            $(`#${id}`).on("select2:unselecting", function (e) {
                setTimeout(() => {
                    ajustarPosicaoDropdown(`.${id}`);
                }, 5);
            });

            $(this).val(null).trigger('change');
        }
    });

    jQuery.fn.extend({
        listaFiltros: async function () {
            let arrayCodigos = [];
            let id = $(this)[0].id.replace('txt', '');
            let placeholder = $(this)[0].placeholder;
            $(this).parent().append(`<div class="input-group-bottom" style="display: contents;"">` +
                `<textarea style="overflow:hidden; resize: none; min-height: 22px;" type="text" disabled="" class="col-lg-12 col-12 input-default focus form-control d-none" id="lista${id}"` +
                `placeholder="Lista de ${placeholder}"></textarea>` +
                `</div>`);

            $(`#lista${id}`).css('height', "22px");
            $(`#lista${id}`).on('input', () => {
                $(`#lista${id}`).css('height', ($(`#lista${id}`)[0].scrollHeight + 5) + "px");
            });

            $(this).on('focus', async function () {

                if ($(`#lista${id}`)[0].textLength == 0) {
                    $(`#lista${id}`).css('height', `22px`);
                }

                if ($(`#lista${id}`).val() == '') {
                    arrayCodigos = [];
                }

                $(`#lista${id}`).css('height', ($(`#lista${id}`)[0].scrollHeight + 5) + "px");
                $(`#lista${id}`).removeClass('d-none');
            });

            $(this).on('focusout', async function () {
                if ($(this).val().slice(0, 1) == '[') {
                    if (arrayCodigos.find(cod => cod == pegaChave(this)) != undefined) {
                        return;
                    }
                    let codigo;
                    if ($(`#lista${id}`).val() == '') {
                        codigo = pegaChave(this);
                    } else {
                        codigo = pegaChave(this) + ',' + $(`#lista${id}`).val();
                    }
                    $(`#lista${id}`).val(codigo);
                    arrayCodigos.push(pegaChave(this));
                    $(this).val('');
                }

                if ($(`#lista${id}`).val() == '') {
                    $(`#lista${id}`).addClass('d-none');
                } else {
                    $(`#lista${id}`).css('height', '22px');
                }

            });

            $(this).on('keypress', function (e) {
                if (e.which == 13) {
                    if ($(this).val().slice(0, 1) == '[') {
                        if (arrayCodigos.find(cod => cod == pegaChave(this)) != undefined) {
                            let lista = $(`#lista${id}`).val().split(',');
                            lista = lista.filter(cod => (cod != pegaChave(this)));
                            arrayCodigos = lista;
                            $(`#lista${id}`).val(lista);
                            $(this).val('');
                            return;
                        }
                        let codigo;
                        if ($(`#lista${id}`).val() == '') {
                            codigo = pegaChave(this);
                        } else {
                            codigo = pegaChave(this) + ',' + $(`#lista${id}`).val();
                        }
                        $(`#lista${id}`).val(codigo);
                        arrayCodigos.push(pegaChave(this));
                        $(this).val('');
                    }
                    $(`#lista${id}`).css('height', ($(`#lista${id}`)[0].scrollHeight) + "px");
                }
                if (e.which == 45) {
                    if ($(this).val().slice(0, 1) == '[') {
                        let lista = $(`#lista${id}`).val().split(',');
                        lista = lista.filter(cod => (cod != pegaChave(this)));
                        arrayCodigos = lista;
                        $(`#lista${id}`).val(lista);
                        $(this).val('');
                    }

                }

            });

            $(this).on("input", function () {
                if ($(this).val() == '-') {
                    $(this).val('');
                }
            });

        }
    });

    jQuery.fn.extend({
        pesquisa_serverside: function (arr_txtCod, arr_pk_field, arr_desc_field, data_url, caption, callback, bSimples) {
            var t = this;

            $(t).unbind('pesquisou');
            $(t).on('pesquisou', function () {
                if (callback != undefined) {
                    callback();
                }
            });

            $(arr_txtCod[0]).keyup(function (e) {
                if (e.keyCode == 115) {
                    $(t).click();
                    e.preventDefault();
                    e.stopPropagation();
                }
            });

            $(t).unbind('click');
            $(t).click(async function () {
                let jsonPesquisa = JSON.parse(data_url);
                if (jsonPesquisa.tabela.toUpperCase() == 'ENTIDADE') {
                    const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                    if (apenasClientesVinculadosAoRepresentante) {
                        if (!jsonPesquisa.where) {
                            jsonPesquisa.where = [];
                        }
                        jsonPesquisa = {
                            ...jsonPesquisa,
                            where: [...jsonPesquisa.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                        }
                        data_url = JSON.stringify(jsonPesquisa);
                    }
                }

                $("#pesquisaModalLabel").text(caption);
                $("#pesquisaModal").modal("show");
                $.LoadingOverlay("show");
                let camposTabela = '';
                for (let i = 0; i < JSON.parse(data_url).camposSelect.length; i++) {
                    camposTabela += `<th class="th-sm">${JSON.parse(data_url).camposSelect[i]}</th>`
                };
                $('#txtTabelaPesquisa').val(JSON.parse(data_url).tabela.toUpperCase());
                validaBotaoRedirecionar();
                try {
                    const protocolo = getCookie('protocolo');
                    $("#pesquisaModalBody").html(`<table style="width:100%" width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-select table-hover table-sm table-condensed" id="pesquisaModalTable" ><thead><tr>${camposTabela}</tr></thead><tbody></tbody></table>`);
                    var table = $('#pesquisaModalTable').DataTable({
                        destroy: true,
                        lengthChange: false,
                        autoWidth: true,
                        serverSide: true,
                        processing: true,
                        ajax: {
                            url: `${protocolo}://${getCookie('ip_api')}/sisplan/funcoes/v1/pesquisadatatable`,
                            type: "GET",
                            headers: { 'Authorization': BASIC_AUTH },
                            data: {
                                "EMPRESA": getCookie('empresa'),
                                "USUARIO": getCookie('usuario').toUpperCase(),
                                "JSON": data_url,
                                "CLIENTE": caption == 'Pesquisa Cliente' ? 'S' : 'N'
                            }
                        },
                        "language": {
                            "sEmptyTable": "Nenhum registro encontrado",
                            "sInfo": "_TOTAL_ registros",
                            "sInfoEmpty": " 0 registros",
                            "sInfoFiltered": "(Filtrados de _MAX_ registros)",
                            "sInfoPostFix": "",
                            "sInfoThousands": ".",
                            "sLengthMenu": "_MENU_ resultados",
                            "sLoadingRecords": "Carregando...",
                            "sProcessing": "Processando...",
                            "sZeroRecords": "Nenhum registro encontrado",
                            "sSearch": "Pesquisar",
                            "oPaginate": {
                                "sNext": "Próximo",
                                "sPrevious": "Anterior",
                                "sFirst": "Primeiro",
                                "sLast": "Último"
                            },
                            "oAria": {
                                "sSortAscending": ": Ordenar colunas de forma ascendente",
                                "sSortDescending": ": Ordenar colunas de forma descendente"
                            }
                        }
                    });

                    setTimeout(() => {
                        $("input[type='search']").focus();
                    }, 500);

                    $('#pesquisaModalTable tbody').on('click', 'tr', function () {
                        if ($(this).hasClass('selected')) {
                            $(this).removeClass('selected');
                        } else {
                            $('#pesquisaModalTable').DataTable().$('tr.selected').removeClass('selected');
                            $(this).addClass('selected');
                        }
                    });

                    $('#pesquisaModalTable tbody').on('dblclick', 'tr', function (e) {
                        e.preventDefault();
                        document.firstElementChild.style.zoom = "reset";
                        table.$('tr.selected').removeClass('selected');
                        $(this).addClass('selected');
                        $("#pesquisaModalSelecionar").click();
                    });

                    $("#pesquisaModalSelecionar").unbind('click');
                    $("#pesquisaModalSelecionar").click(function () {
                        var data = table.row('.selected').data();
                        var dataAux = data;
                        data = {};
                        for (let i = 0; i < JSON.parse(data_url).camposSelect.length; i++) {
                            data[JSON.parse(data_url).camposSelect[i]] = dataAux[i]
                        };
                        for (var i = 0 in arr_pk_field) {
                            if (data && data[arr_pk_field[i]].toString() && data[arr_desc_field[i]].toString()) {
                                if ((bSimples != undefined) && (bSimples[i] != '') && (bSimples[i] != undefined)) {
                                    $(arr_txtCod[i]).val(data[arr_pk_field[i]].toString());
                                } else {
                                    $(arr_txtCod[i]).val('[' + data[arr_pk_field[i]].toString() + '] - ' + data[arr_desc_field[i]]);
                                }
                                $(arr_txtCod[i]).attr('data-selecionado', true);
                                $(arr_txtCod[i]).attr('data-chave', data[arr_pk_field[i]]);
                                $(arr_txtCod[i]).attr('data-desc', data[arr_desc_field[i]]);
                                $("#pesquisaModal").modal("hide");
                            }
                        }
                        $(t).trigger('pesquisou');
                    });

                } catch (error) {
                    console.log(error)
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao consultar dados, verifique a conexão.');
                    $("#pesquisaModal").modal("hide");
                }

                $.LoadingOverlay("hide");
                $("#pesquisaModalSelecionar").show();
                $("#pesquisaModalConfirmar").hide();
                $("#pesquisaModal").unbind('hidden.bs.modal');
                $('#pesquisaModal').on('hidden.bs.modal', function (_) {
                    $('#pesquisaModalBody').empty();
                    $(arr_txtCod[0]).focus();
                });

            });
        }
    });

    jQuery.fn.extend({
        pesquisa_serversideSel: function (arr_txtCod, data_url, caption, callback) {
            let t = this;
            let registrosSelecionados = [];
            let lista = [];

            $(t).unbind('pesquisou');
            $(t).on('pesquisou', function () {
                if (callback != undefined) {
                    callback();
                }
            });


            $(t).unbind('click');
            $(t).click(async function () {
                lista = $(arr_txtCod).val().length > 0 ? ajustaListaOptions($(arr_txtCod)[0].options) : [];
                registrosSelecionados = [];

                $("#pesquisaModalLabel").text(caption);
                $("#pesquisaModal").modal("show");
                $.LoadingOverlay("show");

                function ajustaListaOptions(listaOptions) {
                    const listaFormatada = [];
                    let option = {};

                    for (let i = 0; i < listaOptions.length; i++) {
                        if (listaOptions[i].selected) {
                            const text = listaOptions[i].text;
                            listaFormatada.push(
                                option = {
                                    id: listaOptions[i].value,
                                    text: text.substr(text.indexOf(']') + 4)
                                }
                            )
                        }
                    }
                    return listaFormatada;
                }

                Array.prototype.insert = function (index, ...items) {
                    return this.splice(index, 0, ...items);
                };

                function ajustaData_URL(data_url) {
                    const obj = JSON.parse(data_url);
                    obj.camposWhereServerSide = JSON.parse(data_url).camposSelect;
                    obj.camposSelect.insert(0, `'' AS SEL`);
                    return JSON.stringify(obj)

                }

                let camposTabela = `<th class="th-sm">SEL</th>`;

                if (JSON.parse(data_url).camposSelect[0] != `'' AS SEL`) {
                    for (let i = 0; i < JSON.parse(data_url).camposSelect.length; i++) {
                        camposTabela += `<th class="th-sm">${JSON.parse(data_url).camposSelect[i]}</th>`
                    };
                    data_url = ajustaData_URL(data_url);
                } else {
                    for (let i = 1; i < JSON.parse(data_url).camposSelect.length; i++) {
                        camposTabela += `<th class="th-sm">${JSON.parse(data_url).camposSelect[i]}</th>`
                    };
                }

                let jsonPesquisa = JSON.parse(data_url);
                if (!jsonPesquisa.where) {
                    jsonPesquisa.where = [];
                }
                if (jsonPesquisa.tabela == 'ENTIDADE') {
                    const apenasClientesVinculadosAoRepresentante = (await verificaParametroRepresentanteUsuario()) && (retornaRepresentanteUsuario() != '');
                    if (apenasClientesVinculadosAoRepresentante) {
                        jsonPesquisa = {
                            ...jsonPesquisa,
                            where: [...jsonPesquisa.where, `CODREP ='${retornaRepresentanteUsuario()}'`]
                        }
                        data_url = JSON.stringify(jsonPesquisa);
                    }
                }
                $('#txtTabelaPesquisa').val(JSON.parse(data_url).tabela.toUpperCase());
                validaBotaoRedirecionar();
                try {
                    const protocolo = getCookie('protocolo');
                    $("#pesquisaModalBody").html(`<table style="width:100%" width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-select table-hover table-sm table-condensed" id="pesquisaModalTable" ><thead><tr>${camposTabela}</tr></thead><tbody></tbody></table>`);

                    function retornaTabela() {
                        return new Promise((resolve, reject) => {
                            setTimeout(() => {
                                var table = $('#pesquisaModalTable').dataTable({
                                    destroy: true,
                                    lengthChange: false,
                                    autoWidth: true,
                                    serverSide: true,
                                    processing: true,
                                    timeout: 100000000,
                                    ajax: {
                                        url: `${protocolo}://${getCookie('ip_api')}/sisplan/funcoes/v1/pesquisadatatable`,
                                        type: "GET",
                                        headers: { 'Authorization': BASIC_AUTH },
                                        data: {
                                            "EMPRESA": getCookie('empresa'),
                                            "USUARIO": getCookie('usuario').toUpperCase(),
                                            "JSON": data_url,
                                            "CLIENTE": caption == 'Pesquisa Cliente' ? 'S' : 'N'
                                        }
                                    },
                                    rowId: 'extn',
                                    "language": {
                                        "sEmptyTable": "Nenhum registro encontrado",
                                        "sInfo": "_TOTAL_ registros",
                                        "sInfoEmpty": " 0 registros",
                                        "sInfoFiltered": "(Filtrados de _MAX_ registros)",
                                        "sInfoPostFix": "",
                                        "sInfoThousands": ".",
                                        "sLengthMenu": "_MENU_ resultados",
                                        "sLoadingRecords": "Carregando...",
                                        "sProcessing": "Processando...",
                                        "sZeroRecords": "Nenhum registro encontrado",
                                        "sSearch": "Pesquisar",
                                        "oPaginate": {
                                            "sNext": "Próximo",
                                            "sPrevious": "Anterior",
                                            "sFirst": "Primeiro",
                                            "sLast": "Último"
                                        },
                                        "oAria": {
                                            "sSortAscending": ": Ordenar colunas de forma ascendente",
                                            "sSortDescending": ": Ordenar colunas de forma descendente"
                                        }
                                    },
                                    columnDefs: [
                                        {
                                            render(data, type, row, meta) {
                                                return `<div class="icheck-primary d-inline">
                                              <input type="checkbox" id="check${meta.row}" class="campoSel">
                                              <label for="check${meta.row}"></label>
                                            </div>`;
                                            },
                                            targets: [0],
                                        },
                                        {
                                            className: 'fixed-width',
                                            targets: 0,
                                        },
                                    ],
                                });

                                resolve(table); // Resolve a Promise com o valor da variável 'table'
                            }, 500);
                        });
                    }

                    retornaTabela().then((table) => {  // Chamada da função e utilização do valor exportado, aqui você tem acesso à variável 'table' exportada
                        // setTimeout(() => {
                        //     $("input[type='search']").focus();
                        // }, 500);

                        table.api().on('click', ".campoSel", async function () {
                            const dados = table.api().rows($(this).closest('tr').index()).data().toArray();
                            if (!$(this).prop('checked')) {
                                registrosSelecionados = registrosSelecionados.filter(cod => (cod[1] != dados[0][1]));
                                $($(this).closest('tr')).removeClass('selected');
                            } else {
                                const indexJaExistente = registrosSelecionados.findIndex(index => dados[0][0] == index[0] && dados[0][1] == index[1] && dados[0][2] == index[2])
                                if (indexJaExistente == '-1') {
                                    registrosSelecionados.push(dados[0]);
                                }
                                $($(this).closest('tr')).addClass('selected');
                            }
                        });

                        $('#pesquisaModalTable').on('draw.dt', function () {
                            const dados = table.api().rows().data().toArray();
                            if (registrosSelecionados.length > 0) {
                                for (let j = 0; j < registrosSelecionados.length; j++) {
                                    for (let i = 0; i < dados.length; i++) {
                                        if (registrosSelecionados[j][1] == dados[i][1]) {
                                            $($(".campoSel")[i]).prop('checked', true);
                                            $($(".campoSel")[i].closest('tr')).addClass('selected');
                                        }
                                    }
                                }
                            }
                            if (lista.length > 0) {
                                for (let j = lista.length - 1; j >= 0; j--) {
                                    for (let i = 0; i < dados.length; i++) {
                                        if (lista[j].id == dados[i][1]) {
                                            $($(".campoSel")[i]).trigger('click');
                                            lista = lista.filter(cod => (cod.id != dados[i][1]));
                                            break;
                                        }
                                    }
                                }
                            }
                        });
                    });

                    $("#pesquisaModalSelecionar").unbind('click');
                    $("#pesquisaModalSelecionar").click(function () {
                        try {
                            let data = registrosSelecionados;

                            if (data.length > 0 || lista.length > 0) {
                                $(arr_txtCod).empty().trigger('change');
                                for (let i = 0; i < data.length; i++) {
                                    const option = {
                                        id: data[i][1].toString(),
                                        text: `[${data[i][1]}] - ${data[i][2]}`
                                    }
                                    const newOption = new Option(option.text, option.id, true, true);
                                    $(arr_txtCod).append(newOption).trigger('change');
                                };

                                for (let i = 0; i < lista.length; i++) {
                                    const newOption = new Option(`[${lista[i].id}] - ${lista[i].text}`, lista[i].id, true, true);
                                    $(arr_txtCod).append(newOption).trigger('change');
                                }

                            } else if (data.length == 0 && lista.length == 0) {
                                $(arr_txtCod).empty().trigger('change');
                            }
                            $(t).trigger('pesquisou');
                        } finally {
                            $("#pesquisaModal").modal("hide");
                        }
                    });

                } catch (error) {
                    console.log(error)
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao consultar dados, verifique a conexão.');
                    $("#pesquisaModal").modal("hide");
                }

                $.LoadingOverlay("hide");
                $("#pesquisaModalSelecionar").show();
                $("#pesquisaModalConfirmar").hide();
                $("#pesquisaModal").unbind('hidden.bs.modal');
                $('#pesquisaModal').on('hidden.bs.modal', function (_) {
                    $('#pesquisaModalBody').empty();
                    $(arr_txtCod).focus();
                    //PASSADO SetTimeout PARA QUANDO FECHAR O MODAL DE PESQUISA O COMPONENTE RECEBER NOVAMENTE O PLACEHOLDER E PARA DAR UM TRIGGER PARA MANTER SELECIONADO O DROPDOWN COM AS INFOEMAÇÕES
                    setTimeout(() => {
                        $(`.select2-search__field`).attr('placeholder', 'Selecione o(s) registro(s)');
                        $(arr_txtCod).parent().find(".select2-search__field").trigger('click');
                    }, 0);
                });
                $(`.${arr_txtCod[0].id}`).trigger('click');
            });

            //!!!!!!!CASO ALGUEM MEXER, FOI SETADO PARA DAR TRIGGER CLICK DUAS VEZES DE PROPÓSITO PARA NÃO BUGAR O SEARCH DO COMPONENTE!!!!!!!!!
            setTimeout(() => {
                $(arr_txtCod).parent().find(".select2-search__field").trigger('click');
                $(arr_txtCod).parent().find(".select2-search__field").trigger('click');
            }, 0);
        }
    });

    // $(function () {
    //     $('[data-toggle="tooltip"]').tooltip()
    // })

    // $('#btnFiltrosTour, #btnFiltros, #btn-filtros').attr('data-toggle', 'tooltip');
    // $('#btnFiltrosTour, #btnFiltros, #btn-filtros').attr('data-placement', 'top');
    // $('#btnFiltrosTour, #btnFiltros, #btn-filtros').attr('title', 'ALT + F');

    // ATALHOS
    $("body").keydown(function (e) {
        // ALT + F
        if (e.which === 70 && e.altKey) {
            e.preventDefault();
            if (($('.show').data('bs.modal') || {})._isShown != true) {
                $('#modal-filtros').modal('show');
                $('.modal-body input:text:visible:first').focus();
            }
            $('#btn-sair').trigger('click');
        }
        // ALT + S
        if (e.which === 83 && e.altKey) {
            e.preventDefault();
            $('#btn-msg-alerta').trigger('click');
            $('#btn-confirmarduplicata').trigger('click'); // modal duplicatas em aberto
        }
        // ALT + N
        if (e.which === 78 && e.altKey) {
            e.preventDefault();
            $('#btn-msg-cancelar').trigger('click');
        }
        // ALT + I
        if (e.which === 73 && e.altKey) {
            e.preventDefault();
            $('#btn-novoClientes, #btnNovaMoeda, #btnGravar, #btnNovaSped, #btnNovoProduto, #btnNovoPreco, #btnNovaRegiao, #btnNovoDeposito, #btn-novoPagar, #btn-novoReceber').trigger('click');
        }
        // CTRL + J
        if (e.ctrlKey && e.key.toUpperCase() === 'J') {
            e.preventDefault();
        }

        //FEITO ISTO PARA CASO O MODAL ESTIVER ABERTO E CLICAR ENTER, ELE SEMPRE DAR O CLICK NO CANCELAR, PARA EVITAR DE PERDER INFORMAÇÕES.
        if (e.which === 13) {
            if (($('#modal-warning').data('bs.modal') || {})._isShown == true) {
                e.preventDefault();
                $('#btn-msg-cancelar').click();
            }
        }
    });

    $('#txtSenhaSupervisor').keydown(function (e) {
        if (e.which === 13) {
            e.preventDefault();
            $('#btn-supervisor-confirmar').focus();
        }
    });

    $('#btnAbrirCadastro').on('click', function () {
        const tela = retornaNomeTela($('#txtTabelaPesquisa').val());
        if (tela == '') {
            return;
        }
        window.open(`${BASE_URI}/${tela}`, '_blank');
    });

    function retornaNomeTela(sTabela) {
        const tela = arrTelasTabela.find((tTela) => tTela.tabela == sTabela);
        return !tela ? '' : tela.tela.toLowerCase();
    }

    function validaBotaoRedirecionar() {
        const tela = arrTelasTabela.find((tTela) => tTela.tabela == $('#txtTabelaPesquisa').val());
        if (!tela) {
            $('#btnAbrirCadastro').addClass('d-none');
        } else {
            $('#btnAbrirCadastro').removeClass('d-none');
        }
    }

    const arrTelasTabela = [
        { tabela: 'ENTIDADE', tela: 'CLIENTE' },
        { tabela: 'CEP', tela: 'CEP' },
        { tabela: 'MOEDA', tela: 'MOEDA' },
        { tabela: 'UNIDADE', tela: 'UNIDADE' },
        { tabela: 'TABTAM', tela: 'TAMANHO' },
        { tabela: 'CADCOR', tela: 'COR' },
        { tabela: 'GRUPOPA', tela: 'GRUPO' },
        { tabela: 'TABPIS', tela: 'CSTPIS' },
        { tabela: 'TABCOFINS', tela: 'CSTCOFINS' },
        { tabela: 'ENQUADRA', tela: 'ENQUADRA' },
        { tabela: 'TABLIN', tela: 'LINHA' },
        { tabela: 'MARCA', tela: 'MARCA' },
        { tabela: 'COLECAO', tela: 'COLECAO' },
        { tabela: 'GRUPO_COR', tela: 'GRUPOCOR' },
        { tabela: 'REGRA_FISCAL', tela: 'REGRAFISCAL' },
        { tabela: 'OPER_FISCAL', tela: 'OPERACAOFISCAL' },
        { tabela: 'FAIXA', tela: 'FAIXATAMANHO' },
        { tabela: 'REGIAO', tela: 'TABELADEPRECO' },
        { tabela: 'PRODUTO', tela: 'PRODUTO' },
        { tabela: 'TABTRAN', tela: 'TRANSPORTADORA' },
        { tabela: 'REPRESEN', tela: 'REPRESENTANTE' },
        { tabela: 'TABSPED', tela: 'SPED' },
        { tabela: 'TABFIS', tela: 'CLAFISCAL' },
        { tabela: 'TABTRI', tela: 'CLATRIB' },
        { tabela: 'TABCSOSN', tela: 'CSOSN' },
        { tabela: 'TABIPI', tela: 'CSTIPI' },
        { tabela: 'DEPOSITO', tela: 'DEPOSITO' },
        { tabela: 'ETQ_PROD', tela: 'ETIQUETA' },
        { tabela: 'NATUREZA', tela: 'NATUREZA' },
        { tabela: 'REGRA', tela: 'REGRA' },
        { tabela: 'SITPROD', tela: 'SITUACAO' },
        { tabela: 'MAQUINA_CARTAO', tela: 'MAQUINACARTAO' },
        { tabela: 'ACESSO_USUARIOS', tela: 'USUARIO' },
        { tabela: 'REGRA_PROMOCAO', tela: 'REGRAPROMOCAO' },
        { tabela: 'CAIXA_LOJA', tela: 'CADCAIXA' },
        { tabela: 'PRECO_COR_TAM', tela: 'PRECOCORTAM' },
        { tabela: 'VENDA_CAIXA', tela: 'VENDEDORCAIXA' },
        { tabela: 'TABSIT', tela: 'SITUACAODUPLICATA' },
        { tabela: 'CONDICAO', tela: 'CONDICAOPAGAMENTO' },
        { tabela: 'CADCONTA', tela: 'CADCONTA' },
        { tabela: 'CLASSE_GER', tela: 'CLASSEGERENCIAL' },
        { tabela: 'CADBAN', tela: 'CADBANCO' },
        { tabela: 'MATERIAL', tela: 'MATERIAL' },
        { tabela: 'GRUPO_MA', tela: 'GRUPOMATERIAL' },
        { tabela: 'SUBGRUPO_MA', tela: 'SUBGRUPOMA' },
        { tabela: 'EMPRESA', tela: 'EMPRESA' },
        { tabela: 'TABPRZ', tela: 'CADPRAZO' },
        { tabela: 'TIPO_APL', tela: 'CADPARTE' },
        { tabela: 'CADFLUXO', tela: 'CADSETOR' },
        { tabela: 'TEF_OPERADORA', tela: 'OPERADORATEF' },
        { tabela: 'FATCONF_XML', tela: 'CONFIMPRESSAO' }
    ];
});