$(document).ready(function() {
    $('#btnLeituraX').on('click', function() {
        realizaLeituraX();
    });
    $(".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"); //$("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: function(arr_txtCod, arr_pk_field, arr_desc_field, data_url, caption, tabela, callback, bSimples) {
            let empresa = getCookie('empresa');
            let usuario = getCookie('usuario').toUpperCase();
            var t = this;
            if (!$('#pesquisa-offline').hasClass('d-none')){
                $('#pesquisa-offline').addClass('d-none');
            }


            $(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() {
                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;
                }
                // abre a tela da pesquisa
                $("#pesquisaModalLabel").text(caption);
                $("#pesquisaModal").modal("show");
                $.LoadingOverlay("show");

                var response;
                try {
                    response = await requisicao_offline('GET', '', _url, '', 10000);
                } catch (error) {
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao efetuar consulta, verifique sua conexão com a internet.');
                    $('#pesquisa-offline').removeClass('d-none');
                    $("#pesquisaModal").modal("hide");
                    return;
                }

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

                    var result = await response.json();

                    $.LoadingOverlay("hide");
                    if (result) {
                        if (!result.length) {
                            dataSet.push(result);
                        } else {
                            dataSet = result;
                        }

                        if (!$.isEmptyObject(dataSet[0])) {
                            // preciso dinamicamente ter a relação com o nome das colunas para tabela
                            var keys = Object.keys(dataSet[0]);
                            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,
                                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
                            });

                            // 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 efetuar consulta, verifique sua conexão com a internet.');
                        $('#pesquisa-offline').removeClass('d-none');
                        $("#pesquisaModal").modal("hide");
                    }
                } catch (error) {
                    console.log(error)
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao efetuar consulta, verifique sua conexão com a internet.');
                    $('#pesquisa-offline').removeClass('d-none');
                    $("#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();
                });
            });
        }
    });

    jQuery.fn.extend({
        pesquisa: function(txtCod, pk_field, desc_field, data_url, caption, tabela, simples, callback) {
            // let empresa = getCookie('empresa');
            // let usuario = getCookie('usuario').toUpperCase();
            var t = this;
            if (!$('#pesquisa-offline').hasClass('d-none')){
                $('#pesquisa-offline').addClass('d-none');
            }


            $(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).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
                $("#pesquisaModalLabel").text(caption);
                $("#pesquisaModal").modal("show");
                $.LoadingOverlay("show");

                var response;
                try {
                    response = await requisicao_offline('GET', '', _url, '', 10000);
                } catch (error) {
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao efetuar consulta, verifique sua conexão com a internet.');
                    $('#pesquisa-offline').removeClass('d-none');
                    $("#pesquisaModal").modal("hide");
                    return;
                }

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

                    var result = await response.json();

                    $.LoadingOverlay("hide");
                    if (result) {
                        if (!result.length) {
                            dataSet.push(result);
                        } else {
                            dataSet = result;
                        }

                        if (!$.isEmptyObject(dataSet[0])) {
                            // preciso dinamicamente ter a relação com o nome das colunas para tabela
                            var keys = Object.keys(dataSet[0]);
                            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
                            });

                            // 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 efetuar consulta, verifique sua conexão com a internet.');
                        $('#pesquisa-offline').removeClass('d-none');
                        $("#pesquisaModal").modal("hide");
                    }
                } catch (error) {
                    console.log(error);
                    $.LoadingOverlay("hide");
                    msgErro('Erro ao efetuar consulta, verifique sua conexão com a internet.');
                    $('#pesquisa-offline').removeClass('d-none');
                    $("#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: function(numCaracteres, $url, arrCampos, arrChaves, arrDescricoes, callback, bSimples) {
            var t = this;
            if (!$('#pesquisa-offline').hasClass('d-none')){
                $('#pesquisa-offline').addClass('d-none');
            }
            $(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('');
                    $(t).focus();
                }
            });
            var dados = [];

            $(t).autocomplete({
                source: async function(request, response) {
                    var _urlPadrao = `/offline/RetornoJson?`;
                    await requisicao_offline('GET', _urlPadrao, $url, null)
                        .then(async function(retorno) {
                            var dataset = await retorno.json();
                            dados = await dataset;
                            var array = await dados.map(function(value, index) {
                                return '[' + value.CHAVE + '] - ' + value.DESCRICAO;
                            });
                            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 (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);
                                }
                            }
                        }
                    }
                    $(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");
                }
            });
        }
    });

});