function ModuloListagemModeloRD(data) {
    let mSelf = this;
    mSelf.Titulo = data.Titulo;
    mSelf.ModuloId = data.ModuloId;
    mSelf.Template = data.Template;
    mSelf.Data = ko.observable(new ModuloListagemModeloRDData(data));
    mSelf.Init = () => mSelf.Data().Init();
}

function ModuloListagemModeloRDData(data) {
    let mSelf = this;

    mSelf.Grid = data.Grid.Data ? data.Grid.Data : ko.observableArray();
    mSelf.QuantidadeTotal = data.QuantidadeTotal;
    mSelf.ListaTakes = data.ListaTakes;

    mSelf.Take = ko.observable(10);
    mSelf.TakeAntigo = ko.observable(10);
    mSelf.Skip = ko.observable(0);
    mSelf.Ordenacao = ko.observable(null);
    mSelf.Ascendente = ko.observable(false);

    mSelf.Init = function () {
        $(".box-sel .sel-val").on("click", function () {
            if ($(this).next().is(":hidden")) {
                $(".box-sel").css({
                    "z-index": "1"
                });
                $(this).parent().css({
                    "z-index": "8000"
                });
                $(".sel-arrow-up").removeClass("sel-arrow-up").addClass("sel-arrow-down");
                $(".sel-val").css({
                    "background": "#fff"
                });
                $(this).next().show();
                $(this).closest(".efeito-acc").css({
                    "overflow": "inherit"
                });
                $(".sel-arrow-down", this).removeClass("sel-arrow-down").addClass("sel-arrow-up");
            } else {
                $(this).next().hide();
                $(".sel-arrow-up", this).removeClass("sel-arrow-up").addClass("sel-arrow-down");
            }
        });
        $(".box-sel.disabled, .box-sel.disabled .sel-val").off("click");

        // checkbox list
        $(".ctrl-bullets").on("click", () => {
            if ($(".box-ctrl-columnpicker").is(":hidden")) {
                $(".box-ctrl-columnpicker").fadeIn("fast");
            } else {
                $(".box-ctrl-columnpicker").fadeOut("fast");
            }
        });
        $(".checkbox-list li label").on("click", function () {
            var oculta = true;
            if ($(this).children().hasClass("icon-checkmark")) {
                //Oculta
                $(this).removeClass("bold");
                $(this).children().removeClass("icon-checkmark");
            } else {
                //Exibe
                $(this).addClass("bold");
                $(this).children().addClass("icon-checkmark");

                oculta = false;
            }
            mSelf.OcultaExibeColuna(parseInt(this.getAttribute("cod")), oculta);
        });

        mSelf.VerificarColunasAtivas();

        $(".sidebar-btn").on("click", function () {
            var box = $(this).parent().next();
            var btn = $(this);

            if ($(this).hasClass("sidebar-btn-disabled")) {
                return false;
            } else if (box.is(":hidden")) {
                $(".sidebar-box-content").fadeOut("fast");
                $(".sidebar-btn").next().fadeOut("fast");
                box.fadeIn("fast");
                btn.next().fadeIn("fast");
                $(".sidebar-btn").removeClass("sidebar-btn-active");
                btn.addClass("sidebar-btn-active");
            } else {
                box.fadeOut("fast");
                btn.next().fadeOut("fast");
                btn.removeClass("sidebar-btn-active");
            }
        });

        mSelf.CarregarConfiguracoesUsuario();

        if (localStorage.getItem("MostrarMsgModelo") && localStorage.getItem("MostrarMsgModelo") == "true") {
            vm.ShowMensagemSucesso(localStorage.getItem("MsgModelo"));
            localStorage.setItem("MostrarMsgModelo", false);
        }
    };

    mSelf.selecionarTake = (data) => {

        $(".sel-list li").parent().hide();
        $(".sel-arrow-up").removeClass().addClass("sel-arrow-down");
        mSelf.Take(data);
        mSelf.TakeAntigo(data);
        mSelf.Skip(0);
        mSelf.Carregar();
    };

    mSelf.Proximo = () => {

        if (mSelf.Skip() + mSelf.Take() >= mSelf.QuantidadeTotal()) {
            return;
        }

        mSelf.Skip(mSelf.Skip() + mSelf.Take());
        mSelf.Carregar();
    };

    mSelf.Anterior = () => {

        if (mSelf.Skip() <= 0) {
            mSelf.Skip(0);
            return;
        }

        mSelf.Take(mSelf.TakeAntigo());
        mSelf.Skip(mSelf.Skip() - mSelf.Take());
        mSelf.Carregar();
    };

    mSelf.ExcluirModelo = (vModel) =>
        vm.Perspectiva.AbrirConfirmacao("Deseja realmente excluir esse modelo? Essa ação não poderá ser desfeita.", mSelf.ExclusaoModelo, vModel);

    mSelf.ExclusaoModelo = function (vModel) {
        $(".loading-div").show();
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/ExcluirModelo",
            data: {
                codigoSetorManual: vModel.Codigo
            },
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            success: (data) => {
                if (data) {
                    if (data.IsSucesso) {
                        vm.ShowMensagemSucesso(data.Mensagem);
                        mSelf.Take(mSelf.Take() < 10 ? 10 : mSelf.Take());
                        mSelf.Carregar();
                        mSelf.QuantidadeTotal(mSelf.QuantidadeTotal() - 1);
                    } else {
                        vm.ShowMensagemErro(data.Mensagem);
                    }
                }
                $(".loading-div").hide();
            }
        });
    }

    mSelf.EditarModelo = (data) =>
        window.open(`${urlGlobal}EditorRD/EditorRD/CadastroModeloRD?codigo=${data.Codigo()}`, '_self', false);

    mSelf.Carregar = function () {
        $(".loading-div").show();
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/CarregarGridModelos",
            data: {
                take: mSelf.Take(),
                skip: mSelf.Skip(),
                useTakeSkip: true
            },
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            success: (data) => {
                vm.FecharTodosMensagemAlerta();
                if (data && data.Grid) {
                    mSelf.Grid.removeAll();
                    for (var i in data.Grid.Data) {
                        mSelf.Grid.push(ko.mapping.fromJS(data.Grid.Data[i]));
                    }

                    mSelf.QuantidadeTotal(data.QuantidadeTotal);
                } else {
                    mSelf.Grid.removeAll();
                    vm.ShowMensagemInformacao("A consulta não retornou resultados.");
                }
                mSelf.VerificarColunasAtivas();
                mSelf.VerificarQuantidade();
                $(".loading-div").hide();
            },
            error: (data) => {
                mSelf.Grid.removeAll();
                vm.ShowMensagemErro("A consulta não retornou resultados.");
                $(".loading-div").hide();
            }
        });
    };

    mSelf.OcultaExibeColuna = function (iniciaEm, oculta) {
        var nrQuantidade = mSelf.Grid ? mSelf.Grid().length : 0;

        //Oculta/Exibe título
        if (oculta) $($(".tabela-funcoes thead tr th")[iniciaEm]).hide();
        else $($(".tabela-funcoes thead tr th")[iniciaEm]).show();


        //Oculta/Exibe itens
        var qtdGrid = $(".tabela-funcoes thead tr th").length;
        for (i = iniciaEm; i < (qtdGrid * nrQuantidade); i = i + qtdGrid) {
            if (oculta) $($(".tabela-funcoes tbody tr td")[i]).hide();
            else $($(".tabela-funcoes tbody tr td")[i]).show();
        }

        //Armazena localStorage 
        var idColumns = localStorage.getItem("ColumnsModeloGrid");
        if (oculta) {
            if (idColumns) {
                idColumns = idColumns.split(',');
                idColumns.splice(idColumns.indexOf(iniciaEm.toString()), 1);

                if (idColumns.length > 0) localStorage.setItem("ColumnsModeloGrid", idColumns);
                else localStorage.removeItem("ColumnsModeloGrid");
            }
        } else {
            if (idColumns) {
                if (idColumns.split(',').indexOf(iniciaEm.toString()) < 0)
                    localStorage.setItem("ColumnsModeloGrid", idColumns + "," + iniciaEm);
            } else {
                localStorage.setItem("ColumnsModeloGrid", iniciaEm);
            }
        }
    };

    mSelf.VerificarColunasAtivas = function () {
        var idColumns = localStorage.getItem("ColumnsModeloGrid");
        if (idColumns) {
            idColumns = idColumns.split(',');
            $.each(idColumns, function (index, item) {
                $($(".checkbox-list li label")[item]).addClass("bold");
                $($(".checkbox-list li label")[item]).children().addClass("icon-checkmark");

                mSelf.OcultaExibeColuna(parseInt(item), false);
            });
        } else {
            $.each($(".checkbox-list li label"), function (index, item) {
                $(item).addClass("bold");
                $(item).children().addClass("icon-checkmark");

                mSelf.OcultaExibeColuna(parseInt(item.getAttribute("cod")), false);
            });
        }
    };

    mSelf.CarregarConfiguracoesUsuario = function () {
        var cls = "user-menu-active-btn";

        $(".user-menu, .user-menu > ul").on("click", (e) => e.stopPropagation());

        $(".user-menu").on("click", () => {
            if ($(".user-menu > ul").is(":hidden")) {
                $(".user-menu > button").addClass(cls);
                $(".user-menu > ul").fadeIn("fast");
                $(".user-menu .user-data .user-name").removeClass("open-user-menu").addClass("close-user-menu");
            } else {
                $(".user-menu > button").removeClass(cls);
                $(".user-menu > ul").fadeOut("fast");
                $(".user-menu .user-data .user-name").removeClass("close-user-menu").addClass("open-user-menu");
            }
        });

        $("body").on("click", () => {
            $(".user-menu > button").removeClass(cls);
            $(".user-menu > ul").fadeOut("fast");
            $(".user-menu .user-data .user-name").removeClass("close-user-menu").addClass("open-user-menu");
        });
    };

    mSelf.VerificarQuantidade = () => {
        if (mSelf.Skip() + mSelf.Take() > mSelf.QuantidadeTotal()) {
            mSelf.TakeAntigo(mSelf.Take());
            mSelf.Take(mSelf.QuantidadeTotal() - mSelf.Skip());
        }
    };

    mSelf.OrdenarGrid = () => { };
}