function ModuloGridGrid(data) {
    var mSelf = this;
    mSelf.Titulo = data.Titulo;
    mSelf.ModuloId = data.ModuloId;
    mSelf.Template = data.Template;
    mSelf.Filtro = null;

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

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

    mSelf.Data.selecionarTake = (data) => {
        mSelf.LimparTodosSelecionadosHomologacao();

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

    mSelf.Data.Proximo = () => {
        mSelf.LimparTodosSelecionadosHomologacao();

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

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

    mSelf.Data.Anterior = () => {
        mSelf.LimparTodosSelecionadosHomologacao();

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

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

    mSelf.Data.ExcluirRD = (vModel) =>
        vm.Perspectiva.AbrirConfirmacao("Deseja realmente excluir essa RD? Ao excluir essa RD você não conseguirá recuperá-la!", mSelf.Data.ExclusaoRD, vModel);

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

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

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

    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"
                });
                //$(".box-sel .sel-val, .box-sel .sel-val").next().hide();
                $(".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();

        mSelf.Filtro = ko.observable(new FiltroRDViewModel(data.Filtro.ItensFiltro, mSelf.GridInlog));

        $(".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();
    };

    mSelf.OcultaExibeColuna = function (iniciaEm, oculta) {
        var nrQuantidade = mSelf.Data.Grid ? mSelf.Data.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("ColumnsGrid");
        if (oculta) {
            if (idColumns) {
                idColumns = idColumns.split(',');
                idColumns.splice(idColumns.indexOf(iniciaEm.toString()), 1);

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

    mSelf.VerificarColunasAtivas = function () {
        var idColumns = localStorage.getItem("ColumnsGrid");
        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.Data.Skip() + mSelf.Data.Take() > mSelf.Data.QuantidadeTotal()) {
            mSelf.Data.TakeAntigo(mSelf.Data.Take());
            mSelf.Data.Take(mSelf.Data.QuantidadeTotal() - mSelf.Data.Skip());
        }
    }

    mSelf.Data.EditarRD = (data) =>
        window.open(`${urlGlobal}EditorRD/EditorRD/VisualizarRD?codigo=${data.Codigo()}&origem=${data.TipoOrigem()}`, "_blank");

    mSelf.HomologadosSelecionados = ko.observableArray([]);

    mSelf.Data.HomologarMassa = () => {
        if (mSelf.HomologadosSelecionados().length > 0) {
            vm.Perspectiva.AbrirConfirmacao("Deseja homologar a(s) rd´s selecionada(s)?", mSelf.Data.HomologarMassaEvent, null);
        } else {
            vm.ShowMensagemAlerta("Selecione ao menos uma rd para homologar!");
        }
    };

    mSelf.Data.HomologarMassaEvent = function () {
        $(".loading-div").fadeIn();
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/HomologarEmMassa",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(mSelf.HomologadosSelecionados()),
            success: (data) => {
                if (data.IsSucesso) {
                    ko.utils.arrayForEach(mSelf.HomologadosSelecionados(), (item) => {
                        const result = ko.utils.arrayFirst(mSelf.Data.Grid(), (rd) => rd.Codigo() == item.Codigo && rd.TipoOrigem() == item.TipoOrigem);
                        result.isHomologada("Homologada");
                    });

                    mSelf.LimparTodosSelecionadosHomologacao();
                    vm.ShowMensagemSucesso(data.Resposta);
                } else {
                    vm.ShowMensagemErro(data.Resposta);
                }

                $(".loading-div").fadeOut();
            },
            error: () => $(".loading-div").fadeOut()
        });

    }

    mSelf.Data.SelecionarRD = function (data, evt) {
        var retorno = true;

        if ($(evt.target).hasClass("icon-checkmark")) {
            $(evt.target).parent().removeClass("bold");
            $(evt.target).removeClass("icon-checkmark");

            //remover da lista
            var rd = ko.utils.arrayFirst(mSelf.HomologadosSelecionados(), (item) => item.Codigo == data.Codigo() && item.TipoOrigem == data.TipoOrigem());
            mSelf.HomologadosSelecionados.remove(rd);
        } else {
            $(evt.target).parent().addClass("bold");
            $(evt.target).addClass("icon-checkmark");

            //adicionar na lista
            mSelf.HomologadosSelecionados.push({
                Codigo: data.Codigo(),
                TipoOrigem: data.TipoOrigem()
            });

            retorno = false;
        }

        if (mSelf.HomologadosSelecionados().length == mSelf.Data.Take()) {
            $("#checkbox-todos").parent().addClass("bold");
            $("#checkbox-todos").addClass("icon-checkmark");
        } else {
            $("#checkbox-todos").parent().removeClass("bold");
            $("#checkbox-todos").removeClass("icon-checkmark");
        }

        return retorno;
    };

    mSelf.Data.SelecionarTodasRD = function (data, evt) {
        var todos = $(".checkmark .checkbox-field");

        //remover todos da lista
        mSelf.HomologadosSelecionados.removeAll();

        if ($(evt.target).hasClass("icon-checkmark")) {
            todos.parent().removeClass("bold");
            todos.removeClass("icon-checkmark");

            return true;
        } else {
            todos.parent().addClass("bold");
            todos.addClass("icon-checkmark");

            //adicionar todos na lista
            ko.utils.arrayForEach(data.Grid(), (item) => {
                mSelf.HomologadosSelecionados.push({
                    Codigo: item.Codigo(),
                    TipoOrigem: item.TipoOrigem()
                });
            });

            return false;
        }
    };

    mSelf.LimparTodosSelecionadosHomologacao = () => {
        var todos = $(".checkmark .checkbox-field");

        todos.parent().removeClass("bold");
        todos.removeClass("icon-checkmark");

        mSelf.HomologadosSelecionados.removeAll();
    };

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