function VeiculoDetalhesGridModuloViewModel(data) {

    var mSelf = this;

    mSelf.Data = new VeiculoDetalhesGridAlarmesViewModel(data.Data);

    mSelf.ModuloId = data.ModuloId;

    mSelf.Template = data.Template;

    mSelf.UrlIconPadrao = data.UrlIconPadrao;

    mSelf.PendentesIndex = ko.observable(0);
    mSelf.ValidosIndex = ko.observable(-1);
    mSelf.InvalidosIndex = ko.observable(-1);

    mSelf.StatusAlarmeFiltro = ko.observable("P");//Status inicial

    mSelf.ConnectionID = ko.observable(vmEventos.TempoReal.GetId());

    mSelf.ExibeAlarmes = data.ExibeAlarmes;

    mSelf.TratarAlarmeVM = new TratarAlarmeViewModel();

    //mSelf.FiltroGridDetalhesVM = new FiltroVeiculoDetalhesViewModel(data.Data);

    mSelf.NovoFiltro = mSelf.ExibeAlarmes() ? new FerramentaNovoFiltroDetalhesViewModel(data.Data.NovoFiltro.ItensFiltro, mSelf) : null;

    mSelf.MultiTratamento = ko.observable(false);

    mSelf.MultiTratamentoChecked = ko.observable(false);

    mSelf.IconeOn = data.IconeOn;

    mSelf.IconeOff = data.IconeOff;

    mSelf.Titulo = data.Titulo;

    mSelf.AlarmeContextoHistorico = new AlarmeContextoHistorico(vm.Perspectiva.ControleMapa);

    mSelf.UrlIconPadrao = urlGlobal + "SourceVeiculos/MarkerSVG";

    mSelf.Init = function () {

        if (!mSelf.ExibeAlarmes())
            $("footer").css("display", "none");
        else
            gridBuilder();

        mSelf.Data.Init();

        mSelf.TratarAlarmeVM.Init();

        if (vm.Perspectiva.TemQuePlotarVeiculo()) {

            mSelf.plotarVeiculo();
        }

        mSelf.AplicaCssResizable();

        //$("#menu .menu_bloco").css("width", "310px");
        //$("#btnNovaMensagem").css("display", "none");
        //$("#menuChat").css("display", "none");

        //mSelf.AtualizarTamanhoMapa();

        //vm.Perspectiva.AplicarStyleCSS();
    };

    mSelf.AtualizarTamanhoMapa = function () {
        var alturaGrid = $(".grid-footer").height();
        $("#mapa").css("bottom", alturaGrid);
        $("#menu").css("bottom", alturaGrid);

        vm.Perspectiva.ControleMapa.Resize();
    }

    mSelf.AplicaCssResizable = function () {
        $(".table-head").toggle(
            function () {
                $(".grid-footer").css({ "top": "auto", "height": "auto" });
                $("#tab-alarmes").hide();
                $("#menu, #mapa").css({ "bottom": "47px" });
                vm.Perspectiva.ControleMapa.Resize();
            }, function () {
                $("#tab-alarmes").show();
                //Ajusta o menu de acordo com a altura da grid
                var h = $(".grid-footer").outerHeight();
                $("#menu, #mapa").css({ "bottom": +h + "px" });
                vm.Perspectiva.ControleMapa.Resize();
            }
        );

        $('.grid-footer').resizable({
            alsoResize: ".slick-viewport, .wrap-grid, #myGrid, #grid-controle-passagem",
            animate: false,
            minHeight: 171,
            maxHeight: $(window).height(),
            handles: "n",
            resize: function (event, ui) {
                $(".grid-wrap").css({
                    "height": `${ui.size.height - 100}px`,
                    "max-height": `${ui.size.height - 100}px`
                })
            }
        });

        $(window).resize(function (event) {
            $("footer").css("width", `${event.target.innerWidth}px`);
        });

        vm.Perspectiva.ControleMapa.Resize();
    };

    mSelf.plotarVeiculo = function () {

        if (mSelf.Data == null || data.Data.Veiculos == null)
            return;

        var veiculo = data.Data.Veiculos;

        if (veiculo) {

            if (veiculo.Latitude() != null && veiculo.Longitude() != null) {

                if (!ko.isObservable(veiculo.InfoOperacao))
                    veiculo.InfoOperacao = ko.observable(veiculo.InfoOperacao);

                var iconUrl = mSelf.alterarIconeMarker(veiculo);

                vm.Perspectiva.ControleMapa.AddMarker(veiculo.CodigoVeiculo(), veiculo.Latitude() / 1000000, veiculo.Longitude() / 1000000, iconUrl, true, false);

                vm.Perspectiva.AdicionarInfoWindow();

                vm.Perspectiva.ControleMapa.FocarMarker(veiculo.CodigoVeiculo());
            }
        }

        vm.Perspectiva.ControleMapa.RefreshCluster();
    };

    mSelf.divAlarmeScroll = function (id, fila, evt) {

        if (parseInt(evt.target.scrollTop + $(evt.target).height()) + 1 >= evt.target.scrollHeight) {

            mSelf.setStatusAlarmeFiltro(id);

            var filtroAlarmeVM = //mSelf.NovoFiltro.ItemFiltro();
                {
                    CodigoVeiculo: mSelf.NovoFiltro.ItemFiltro().CodigoVeiculo(),
                    timezoneSelecionadoInicial: mSelf.NovoFiltro.ItemFiltro().timezoneSelecionadoInicial(),
                    StatusAlarmeFiltro: mSelf.NovoFiltro.ItemFiltro().StatusAlarmeFiltro(),
                    Data: mSelf.NovoFiltro.ItemFiltro().Data,
                    OrdenacaoData: mSelf.NovoFiltro.ItemFiltro().OrdenacaoData,
                    TiposAlarmesSelecionados: mSelf.NovoFiltro.ItemFiltro().TiposAlarmesSelecionados,
                    CodigoOperacao: mSelf.NovoFiltro.ItemFiltro().CodigoOperacao(),
                    ConnectionID: mSelf.ConnectionID
                };

            $.ajax({
                url: "VeiculoDetalhes/PaginarListaAlarmes?pageIndex=" + mSelf.getPaginacaoIndex(id),
                data: filtroAlarmeVM,
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "GET",
                beforeSend: function () {

                    $("footer:visible .loading-inlog-modulo").fadeIn();
                },
                success: function (data) {

                    if (data && data.length > 0) {

                        ko.utils.arrayForEach(data, function (i) {

                            var kojs = ko.mapping.fromJS(i);

                            mSelf.SetarAlarmesPaginadosMultiTratamento(kojs);

                            if (mSelf.StatusAlarmeFiltro() == "P")
                                mSelf.Data.Pendentes.push(kojs);
                            else if (mSelf.StatusAlarmeFiltro() == "F")
                                mSelf.Data.Validos.push(kojs);
                            else
                                mSelf.Data.Invalidos.push(kojs);
                        });
                    }
                }
            }).done(function () {

                $("footer:visible .loading-inlog-modulo").fadeOut();

                gridBuilder();
            });
        }
    };

    mSelf.CarregamentoAlarmesPorStatus = function (id, fila, evt) {

        mSelf.setStatusAlarmeFiltro(id);

        var filtroAlarmeVM = //mSelf.NovoFiltro.ItemFiltro();
            {
                CodigoVeiculo: mSelf.NovoFiltro.ItemFiltro().CodigoVeiculo(),
                timezoneSelecionadoInicial: mSelf.NovoFiltro.ItemFiltro().timezoneSelecionadoInicial(),
                StatusAlarmeFiltro: mSelf.NovoFiltro.ItemFiltro().StatusAlarmeFiltro(),
                Data: mSelf.NovoFiltro.ItemFiltro().Data,
                OrdenacaoData: mSelf.NovoFiltro.ItemFiltro().OrdenacaoData,
                TiposAlarmesSelecionados: mSelf.NovoFiltro.ItemFiltro().TiposAlarmesSelecionados,
                CodigoOperacao: mSelf.NovoFiltro.ItemFiltro().CodigoOperacao(),
                ConnectionID: mSelf.ConnectionID
            };

        $.ajax({
            url: "VeiculoDetalhes/PaginarListaAlarmes?pageIndex=" + mSelf.GetDefaultPageIndex(),
            data: filtroAlarmeVM,
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            beforeSend: function () {

                $("footer:visible .loading-inlog-modulo").fadeIn();
            },
            success: function (data) {

                if (data && data.length > 0) {

                    ko.utils.arrayForEach(data, function (i) {

                        var kojs = ko.mapping.fromJS(i);

                        mSelf.SetarAlarmesPaginadosMultiTratamento(kojs);

                        if (mSelf.StatusAlarmeFiltro() == "P")
                            mSelf.Data.Pendentes.push(kojs);
                        else if (mSelf.StatusAlarmeFiltro() == "F")
                            mSelf.Data.Validos.push(kojs);
                        else
                            mSelf.Data.Invalidos.push(kojs);
                    });
                }
            }
        }).done(function () {

            if (mSelf.StatusAlarmeFiltro() == "F")
                mSelf.Data.HabilitarContadorAlarmesValidos(true);
            else if (mSelf.StatusAlarmeFiltro() == "I")
                mSelf.Data.HabilitarContadorAlarmesInvalidos(true);

            $("footer:visible .loading-inlog-modulo").fadeOut();

            gridBuilder();
        });
    };

    mSelf.GetDefaultPageIndex = function () {

        return 0;
    };

    mSelf.SetarAlarmesPaginadosMultiTratamento = function (alarme) {

        if (mSelf.MultiTratamentoChecked()) {

            var tipoAlarmeSelecionado = mSelf.TratarAlarmeVM.GetTipoAlarmeSelecionadoMultiTratamento();

            if (tipoAlarmeSelecionado) {

                if (alarme.IdentificadorTipo() === tipoAlarmeSelecionado) {

                    alarme.AlarmeSelecionado(true);

                    alarme.IsMultiTratamento(true);
                }
                else {

                    alarme.AlarmeSelecionado(false);

                    alarme.IsMultiTratamento(false);
                }
            }
        }
    };

    mSelf.getPaginacaoIndex = function (id) {

        if (id == 1) {
            mSelf.PendentesIndex(mSelf.PendentesIndex() + 1);
            return mSelf.PendentesIndex();
        } else if (id == 2) {
            mSelf.ValidosIndex(mSelf.ValidosIndex() + 1);
            return mSelf.ValidosIndex();
        } else {
            mSelf.InvalidosIndex(mSelf.InvalidosIndex() + 1);
            return mSelf.InvalidosIndex();
        }
    };

    mSelf.setStatusAlarmeFiltro = function (id) {

        if (id == 1)
            mSelf.StatusAlarmeFiltro("P");//Pendentes
        else if (id == 2)
            mSelf.StatusAlarmeFiltro("F");//Validos
        else
            mSelf.StatusAlarmeFiltro("I");//Invalidos
    };

    mSelf.ReconfigurarHtml = function (data, evt) {
        alinhaGrid(evt.target);
    };

    mSelf.abaSelecionada = function (id, fila, evt) {

        mSelf.setStatusAlarmeFiltro(id);

        mSelf.AnularTratamentoAlarmes();

        if (mSelf.StatusAlarmeFiltro() == "P" && mSelf.Data.Pendentes().length > 0)
            return;
        else if (mSelf.StatusAlarmeFiltro() == "F" && mSelf.Data.HabilitarContadorAlarmesValidos() && mSelf.Data.Validos().length > 0)
            return;
        else if (mSelf.StatusAlarmeFiltro() == "I" && mSelf.Data.HabilitarContadorAlarmesInvalidos() && mSelf.Data.Invalidos().length > 0)
            return;

        if (id == 1) {
            mSelf.PendentesIndex(0);
        } else if (id == 2) {
            mSelf.ValidosIndex(0);
        } else {
            mSelf.InvalidosIndex(0);
        }

        mSelf.CarregamentoAlarmesPorStatus(id, fila, evt);
    };

    mSelf.GetStatusAlarmes = function () {

        return mSelf.StatusAlarmeFiltro();
    };

    mSelf.AnularTratamentoAlarmes = function () {

        mSelf.MultiTratamentoChecked(false);

        mSelf.MultiTratamento(false);

        mSelf.Data.HabilitarBotao(true);

        var alarmesTratamento = mSelf.TratarAlarmeVM.RetornaListaAlarmes();

        if (alarmesTratamento) {

            ko.utils.arrayForEach(alarmesTratamento, function (alarme) {

                alarme.AlarmeSelecionado(false);

                alarme.IsMultiTratamento(true);
            });
        }
    };

    mSelf.SetarMultiTratamentoAlarmes = function (data, evt) {

        var alarmesTratamento = mSelf.TratarAlarmeVM.RetornaListaAlarmes();

        if (alarmesTratamento) {

            ko.utils.arrayForEach(alarmesTratamento, function (alarme) {

                if (evt.target.checked && alarme.IsMultiTratamento())
                    alarme.AlarmeSelecionado(true);
                else if (evt.target.checked) {

                    alarme.AlarmeSelecionado(false);

                    alarme.IsMultiTratamento(false);
                }
                else {

                    alarme.AlarmeSelecionado(false);

                    alarme.IsMultiTratamento(true);
                }
            });
        }

        if (!evt.target.checked) {

            mSelf.MultiTratamento(false);

            mSelf.MultiTratamentoChecked(false);

            mSelf.Data.HabilitarBotao(true);
        }
        else
            mSelf.Data.HabilitarBotao(false);

        return true;
    };

    mSelf.MultiTratamentoClick = function (data, evt) {

        mSelf.TratarAlarmeVM.MultiTratamentoAlarmes();
    };

    mSelf.TratarAlarmeIndividual = function (data, evt) {

        mSelf.TratarAlarmeVM.TratarAlarmeIndividual(data, evt);
    };

    mSelf.FinalizarAlarmes = function (data, evt) {

        mSelf.TratarAlarmeVM.FinalizarAlarmes();
    };

    mSelf.CloseModal = function () {

        mSelf.TratarAlarmeVM.Fechar();
    };

    mSelf.CancelarModal = function () {

        mSelf.TratarAlarmeVM.Cancelar();
    };

    mSelf.CarregarContexto = function (data, evt) {

        //remove a class da selecao da linha anterior
        $("tr[class=row-fluid-error]").removeClass();

        var codigoAlarme = data.Codigo();

        // verificar se o contexto está vazio
        if (typeof (codigoAlarme) === "undefined" || codigoAlarme == null) {
            return;
        }

        //Insere o css para a linha selecionada
        $("#alarme_" + codigoAlarme)
            .addClass("row-fluid-error")
            .siblings()
            .removeClass("row-fluid-error");

        var paramsContextoAlarme = {
            codigoAlarme: codigoAlarme
        };

        $.ajax({
            url: urlGlobal + "Veiculos/VeiculoDetalhes/CarregarContextoAlarme",
            data: paramsContextoAlarme,
            beforeSend: function () {

                $(".loading-inlog").fadeIn("fast");
            },
            success: mSelf.OnProcessaData
        }).done(function () {

            $(".loading-inlog").fadeOut();
        });
    };

    mSelf.OnProcessaData = function (data) {
        if (data && data.length > 0) {
            var jsonVM = $.parseJSON(data);
            mSelf.AlarmeContextoHistorico.LimparContextoAlarmeMapa();
            mSelf.AlarmeContextoHistorico.ProcessarDados(jsonVM);
        }
    };

    mSelf.alterarIconeMarker = function (veiculo) {

        var iconUrl = mSelf.UrlIconPadrao;

        var cor = "ff0000";

        iconUrl += "?colorHex=" + cor;

        iconUrl += "&codigoTipo=" + veiculo.TipoVeiculo();

        var sinalizador = veiculo.InfoOperacao().CodigoLinhaTabela() != null && veiculo.InfoOperacao().CodigoLinhaTabela() > 0;

        var inconformidade = veiculo.InfoOperacao().InconformidadeChegadaEnlaceVigente() != null && veiculo.InfoOperacao().InconformidadeChegadaEnlaceVigente();

        iconUrl += "&hasSinalizador=" + sinalizador.toString();

        iconUrl += "&hasInconformidade=" + inconformidade.toString();

        return iconUrl;
    };
}

function VeiculoDetalhesGridAlarmesViewModel(data) {

    var mSelf = this;

    mSelf.Veiculo = data.Veiculos;

    mSelf.Pendentes = data.Pendentes;

    mSelf.Validos = data.Validos;

    mSelf.Invalidos = data.Invalidos;

    mSelf.HabilitarBotao = ko.observable(true);

    mSelf.HabilitarContadorAlarmesValidos = ko.observable(false);

    mSelf.HabilitarContadorAlarmesInvalidos = ko.observable(false);

    mSelf.Init = function () {

        if (vm.Perspectiva.SetarVeiculo)
            vm.Perspectiva.SetarVeiculo(mSelf.Veiculo);
    };

    mSelf.SetarAlarmes = function (data, evt) {

        if (evt.target.checked) {

            data.AlarmeSelecionado(true);

            mSelf.SetarAlarmesMultiTratamento(data.IdentificadorTipo());
        }
        else {

            data.AlarmeSelecionado(false);

            mSelf.TravarMultiTratamento(data);
        }
    };

    mSelf.SetarAlarmesMultiTratamento = function (identificador) {

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes) {

            var statusArlarme = moduloGridViewDetalhes.GetStatusAlarmes();

            var alarmes = null;

            if (statusArlarme === "P")
                alarmes = mSelf.Pendentes();
            else if (statusArlarme === "F")
                alarmes = mSelf.Validos();
            else
                alarmes = mSelf.Invalidos();

            ko.utils.arrayForEach(alarmes, function (alarme) {

                if (alarme.IdentificadorTipo() === identificador)
                    alarme.IsMultiTratamento(true);
                else
                    alarme.IsMultiTratamento(false);
            });

            moduloGridViewDetalhes.MultiTratamento(true);

            mSelf.HabilitarBotao(false);
        }
    };

    mSelf.TravarMultiTratamento = function (data) {

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes) {

            var statusArlarme = moduloGridViewDetalhes.GetStatusAlarmes();

            var desabilitarMultiTratamento = true;

            var alarmes = null;

            if (statusArlarme === "P")
                alarmes = mSelf.Pendentes();
            else if (statusArlarme === "F")
                alarmes = mSelf.Validos();
            else
                alarmes = mSelf.Invalidos();

            ko.utils.arrayForEach(alarmes, function (alarme) {

                if (alarme.AlarmeSelecionado())
                    desabilitarMultiTratamento = false;
            });

            if (desabilitarMultiTratamento) {

                ko.utils.arrayForEach(alarmes, function (alarme) {

                    alarme.IsMultiTratamento(true);
                });

                moduloGridViewDetalhes.MultiTratamentoChecked(false);

                moduloGridViewDetalhes.MultiTratamento(false);

                mSelf.HabilitarBotao(true);
            }
        }
    };

    //Inicio Integração Cortex
    mSelf.HabilitaCameras = data.HabilitaCortex;

    mSelf.UrlCameras = data.UrlCortex;
    mSelf.VisualizarCameras = function (data, parent) {
        window.open(mSelf.UrlCameras() + parent.Veiculo.Identificador() + "/" + data.DataCortexInicio() + "/" + data.DataCortexFim(), '_blank');
    };
    //Fim Integração Cortex
    mSelf.AtivarFleetify = data.AtivarFleetify;
    mSelf.VisualizarCamerasFleetify = function (data, parent) {
        var obj = data.VeiculosAlarmesIntegracaos;
        window.open(obj.Url());
    };

}