function SinoticoVeiculosPerspectiva(vm) {
    const mSelf = this;
    vm.UrlPath = ko.observable("");
    mSelf.ListaModulosLaterais = ko.observableArray();
    mSelf.ModuloGridVeiculos = null;
    mSelf.TituloModal = ko.observable("");
    mSelf.TituloModalPassagens = ko.observable("");
    mSelf.ConteudoModalOperacoesVeiculo = ko.observableArray([]);
    mSelf.ConteudoModalPassagens = ko.observableArray([]);

    mSelf.ClickBreadcumb = () => { };

    mSelf.AoAbrirFerramenta = (ferramenta) => {
        if (ferramenta.FerramentaId() === "ControlePassagem") {
            if (!mSelf.AlvoViewModel() || ferramenta.Data().Minimizado) {
                ferramenta.Data().RegistrarAcoesAlvo();
            } else mSelf.AlvoViewModel(false);
        } else {
            mSelf.AlvoViewModel(false);

            if (vm.GetFerramenta("ControlePassagem")) {
                vm.GetFerramenta("ControlePassagem").Data().Cancelar();
            }
        }
    }

    mSelf.HideModalPassagens = () => {
        $(".modalPassgens").hide();
        mSelf.ConteudoModalPassagens([]);
        mSelf.TituloModalPassagens("");
    };

    mSelf.AlvoViewModel = ko.observable(false);

    mSelf.SelecionarLinhaPassagem = (index, data) => {
        vm.GetFerramenta('ControlePassagem').Data().SelecionarLinhaPassagem(index, data);
        return true;
    };

    mSelf.AtualizarPosicao = (conteudo) => {
        let veiculosAtualizacao = null;

        for (let i in mSelf.ModuloGridVeiculos.VeiculosGrid()) {
            if (mSelf.ModuloGridVeiculos.VeiculosGrid()[i].CodigoVeiculo() === conteudo.CodigoVeiculo) {
                veiculosAtualizacao = mSelf.ModuloGridVeiculos.VeiculosGrid()[i];
                break;
            }
        }

        if (veiculosAtualizacao && veiculosAtualizacao.Visivel()) {
            vm.currentMap.alterMarkerPosition('veiculos', [conteudo.Latitude / 1000000, conteudo.Longitude / 1000000],
                true, (item) => item.CodigoVeiculo === conteudo.CodigoVeiculo);
        }

        mSelf.ModuloGridVeiculos.SetarEventoAtualizacaoVelocidadeDataHora(veiculosAtualizacao, conteudo);
    };

    mSelf.AtualizarStatus = (conteudo) =>
        mSelf.ModuloGridVeiculos.SetarEventoAtualizacaoStatusVeiculo(conteudo.CodigoVeiculo, conteudo);

    mSelf.AbriModalOperacoesVeiculo = (codigoVeiculo) => {
        mSelf.RecuperarModuloVeiculos();

        if (mSelf.ModuloGridVeiculos) {
            mSelf.TituloModal(mSelf.ModuloGridVeiculos.SetarTituloModalOperacoesVeiculo(codigoVeiculo));
            mSelf.ConteudoModalOperacoesVeiculo.removeAll();
            const operacoes = mSelf.ModuloGridVeiculos.AbriModalOperacoesVeiculo(codigoVeiculo);
            ko.utils.arrayForEach(operacoes, (op) => mSelf.ConteudoModalOperacoesVeiculo.push(op));
        }
    };

    mSelf.AbriModalGrupoControleVeiculo = (codigoVeiculo) => {
        mSelf.RecuperarModuloVeiculos();

        if (mSelf.ModuloGridVeiculos) {
            mSelf.TituloModal(mSelf.ModuloGridVeiculos.SetarTituloModalGrupoControleVeiculo(codigoVeiculo));
            mSelf.ConteudoModalOperacoesVeiculo.removeAll();
            const operacoes = mSelf.ModuloGridVeiculos.AbriModalGrupoControleVeiculo(codigoVeiculo);
            ko.utils.arrayForEach(operacoes, (op) => mSelf.ConteudoModalOperacoesVeiculo.push(op));
        }
    };

    mSelf.PopUp = null;

    mSelf.TratarEvento = (tipoEvento, conteudo) => {
        mSelf.RecuperarModuloVeiculos();

        if (mSelf.ModuloGridVeiculos) {
            switch (tipoEvento) {
                case 1:
                    for (let i in conteudo) {
                        mSelf.AtualizarPosicao(conteudo[i]);
                    }
                    break;
                case 2:
                    for (let i in conteudo) {
                        mSelf.AtualizarStatus(conteudo[i]);
                    }
                    break;
                case 5:
                    if (mSelf.PopUp != null) {
                        mSelf.PopUp.IncluirAtualizarPopUp(conteudo);
                    }
                    break;
                case 6:
                    mSelf.AtualizarQuantidadeAlarmesPendentes(conteudo);
                    break;
                case 7:
                    mSelf.PopUp.RemoverPopUp(conteudo);
                    break;
                default: break;
            }
        }

        if (tipoEvento == 8) {
            $(".alerta-mensagem").css("display", "block");
            $(".modulo_item_alerta").attr("src", "Content/img/chat/chat_2.png");
            $(".modulo_item_alerta").addClass("mensagem-alerta");
        }
        else if (tipoEvento == 9) {
            vm.GetModulo("GridVeiculosViewModel").AlarmesPendentes(pacoteEvento);
            vm.GetModulo("GridVeiculosViewModel").AtualizarAlarmeMensagem(pacoteEvento);
        }
    };

    mSelf.AtualizarQuantidadeAlarmesPendentes = (conteudo) =>
        mSelf.ModuloGridVeiculos.AtualizarQuantidadeAlarmesPendentes(conteudo);

    mSelf.RecuperarModuloVeiculos = function () {
        if (mSelf.ModuloGridVeiculos == null) {
            mSelf.ModuloGridVeiculos = vm.GetModulo("GridVeiculosViewModel");
        }
    };

    mSelf.PossuiAcessoChat = ko.observable();

    mSelf.Init = () => {
        vm.currentMap.addMarkerClusterer('veiculos', new InlogMaps.MarkerClustererConfig(true, 1, 10));

        mSelf.VoltarMarkers();
        vm.Breadcumbs([{ Item: "Sinótico de Veículos", click: mSelf.ClickBreadcumb }]);

        mSelf.ListaModulosCarregar = ko.observableArray([{
            url: urlGlobal + "RastreamentoGeral/VeiculosGenerico/IndexVeiculo?connectionID=" + vmEventos.TempoReal.GetId(), data: {}
        }]);

        mSelf.ListaFerramentasCarregar = ko.observableArray([
            { url: urlGlobal + "RastreamentoGeral/VeiculosGenerico/NovoFiltroVeiculos", data: {} },
            { url: urlGlobal + "RastreamentoGeral/VeiculosGenerico/ControlePassagem", data: {} },
        ]);

        if (vm.usarGeoGoogle) {
            mSelf.ListaFerramentasCarregar.push({
                url: urlGlobal + "RastreamentoGeral/VeiculosGenerico/ConfiguracoesVeiculosMarkers",
                data: {}
            });
        }

        mSelf.CarregarModulos();
        mSelf.CarregarModulosLaterais();
        mSelf.CarregarTitulo();
        vmEventos.TempoReal.SetHandlers(mSelf);
    };

    mSelf.EsconderVeiculosGeral = (id) => vm.currentMap.toggleMarkers(false, 'veiculos',
        (item) => item.CodigoVeiculo !== id);

    mSelf.VoltarMarkers = () => vm.currentMap.toggleMarkers(true, 'veiculos');

    mSelf.Destroy = () => {
        ko.utils.arrayForEach(vm.Ferramentas(), (func) => {
            try {
                func.Destroy();
            } catch (e) { }
        });

        vm.Modulos.removeAll();
        vm.Ferramentas.removeAll();
        vm.ModulosLaterais.removeAll();
    };

    mSelf.AbrirDetalhes = (data) => {
        mSelf.EsconderVeiculosGeral(data.Codigo());
        vm.TrocarPerspectiva(new SinoticoVeiculosDetalhesPerspectiva(vm, null, {
            Data: "2014-05-30 00:00:00",
            ConnectionId: "52ec259f-e544-4073-8df3-453e5c23d2f2",
            id: data.Codigo(),
            dataHoraHistorico: data.DataHora()
        }));
    };

    mSelf.AbrirDetalhesPopup = (data) =>
        window.open("?Visao=Veiculos&Acao=Detalhes&Data=" + data.Codigo() + ";" + data.DataHora(), "_blank", "");

    mSelf.CarregarFerramentas = () => {
        vm.CarregarFuncionalidades(mSelf.ListaFerramentasCarregar, (data) => {
            if (data) {
                const kojs = ko.mapping.fromJS(data);

                /* Iniciar VIEWMODEL Knockout js pelo JSON; */
                const vmInit = new window[kojs.ViewModelKnockout()](kojs);
                vm.Ferramentas.push(vmInit);
                vmInit.Init();
                mSelf.ReconfigurarFerramentas(vmInit.FerramentaId());

                vm.Ferramentas(vm.Ferramentas().sort((left, right) =>
                    left.Ordem == right.Ordem ? 0 : (left.Ordem < right.Ordem ? -1 : 1)));
            }
        });
    };

    mSelf.CarregarModulos = () => {
        vm.CarregarFuncionalidades(mSelf.ListaModulosCarregar, (data) => {
            if (data) {
                const kojs = ko.mapping.fromJS(data);

                /* Iniciar VIEWMODEL Knockout js pelo JSON; */
                const vmInit = new window[kojs.ViewModelKnockout()](kojs);
                vm.Modulos.push(vmInit);
                vmInit.Init();
                mSelf.ReconfiguarModulos(vmInit.ModuloId()); /* Aplicar enumerador para os módulos. */
                mSelf.CarregarFerramentas();
            }
        });
    };

    mSelf.CarregarModulosLaterais = () => {
        vm.CarregarFuncionalidades(mSelf.ListaModulosLaterais, (data) => {
            if (data) {
                const kojs = ko.mapping.fromJS(data);

                /* Iniciar VIEWMODEL Knockout js pelo JSON; */
                const vmInit = new window[kojs.ViewModelKnockout()](kojs);
                vm.ModulosLaterais.push(vmInit);
                vmInit.Init();
                mSelf.ReconfiguarModulos(vmInit.ModuloId()); /* Aplicar enumerador para os módulos. */
            }
        });
    };

    mSelf.ReconfigurarFerramentas = () => {
        ativarIconeHover(); /* ativa o hint do menu da esquerda */

        /* remove o evento de click no menu */
        $('.menu_item').unbind('click');

        /* FUNÇÃO DO CLIQUE SOBRE UM ITEM DE MENU QUE ABRA OUTRAS JANELAS DE MENU */
        $('.menu_item').click(function () {
            /* desativarIconeHover(); */

            if ($(this).parents('.menu_bloco').length) {
                $(this).next('.menu_bloco').css('left', $(this).parents('.menu_bloco').outerWidth() + 1 + 'px');
                $(this).next('.menu_bloco').css('top', $(this).position().top);
                $(this).parents('.menu_bloco').show(); /* mostra os blocos-pai */
            } else {
                $('.menu_bloco').not($(this).parent().next('.menu_bloco')).hide(); /* esconde todos os blocos */
            }

            $(this).parent().next('.menu_bloco').toggle('fade', 200);
        });

        /* evento do botão para fechar janela do menu */
        $('.menu_titulo .icon_fechar, .menu_bloco .btn-close').click(function () {
            $(this).closest('.menu_bloco').hide();
            $(this).parents('.menu_titulo').parent('.menu_bloco').prev('.icone').removeClass('active');

            /* Fechar todas as paletas de cores abertas */
            $(".simple_color").spectrum("hide");
        });

        $('nav .modulo_item > .menu_bloco > .menu_titulo .icon_fechar')
            .click(() => ativarIconeHover());

        /* ativar/desativar ícones do menu */
        $('#menu .icone').click(function () {
            $('.icone.active').not($(this)).removeClass('active');
            $(this).toggleClass('active');

            if ($('.icone.active').length) {
                desativarIconeHover();
            } else {
                ativarIconeHover();
            }
        });
    };

    mSelf.ReconfiguarModulos = (idModulo) => {
        eventoClicarModuloRodape(idModulo);
        eventoClicarIconeMenuDireito(idModulo);
        eventoDragModulo(idModulo);
    };

    mSelf.CarregarTitulo = () => vm.Titulo("");

    mSelf.alinharGrid = () => {
        $('.grid table tbody tr:first-child td').each(function (index) {
            i = index + 1;
            $('.grid table thead tr th:nth-child(' + i + ')').width($(this).width());
        });

        $('.grid table thead tr:first-child th').each(function (index) {
            i = index + 1;
            $('.grid table tbody tr').children('td:nth-child(' + i + ')').width($(this).width());
        });

        $(".excecao").css("witdh", "152px");

        $('.grid').each(function () {
            $(this).css('margin-top', $(this).find('table thead').height());
        });

        $('.grid table thead').each(function () {
            $(this).css('top', -$(this).height());
        });

        $('.grid table').each(function () {
            $(this).find("tbody").css('margin-top', $(this).find("thead").height());
        });
    };

    mSelf.TextoMensagem = ko.observable();
    mSelf.TituloMensagem = ko.observable();
    mSelf.VeiculosSelecionados = ko.observableArray();
    mSelf.TipoMensagemChat = ko.observable();
}

function EnviarNovaMensagem() {
    if (vm.Perspectiva.VeiculosSelecionados && vm.Perspectiva.VeiculosSelecionados().length > 0) {
        $('#filtro-modal-novaMensagem').modal({ backdrop: 'static' });
    }
};

function EnviarMensagemNotificacao() {
    vm.Perspectiva.TipoMensagemChat(2);
    EnviarMensagemChat();
};

function EnviarMensagemPergunta() {
    vm.Perspectiva.TipoMensagemChat(1);
    EnviarMensagemChat();
};

function AbrirMensagemAlerta(ferramentaChat) {
    if (ferramentaChat && ferramentaChat != undefined && ferramentaChat != null) {
        const classCss = $(".modulo_item_alerta").attr("class");
        if (classCss == "modulo_item_alerta mensagem-normal") {
            window.open(urlGlobal + "?Visao=ChatOperacao&Acao=");
            return;
        }
    }

    const modulo = vm.GetModulo("GridVeiculosViewModel");
    if (modulo) {
        const alarmes = modulo.AlarmesPendentes();
        if (alarmes.ContemAlarme && alarmes.Quantidade == 1) {
            const idGrupo = alarmes.ListaCodigoGrupo[0];
            window.open(urlGlobal + "?Visao=ChatOperacao&Acao=&idGrupo=" + idGrupo);
        }
        else if (alarmes.ContemAlarme) {
            window.open(urlGlobal + "?Visao=ChatOperacao&Acao=");
        }
    }
}

function EnviarMensagemChat() {
    $(".loading-inlog").fadeIn();
    const parametro = {
        'TextoMensagem': vm.Perspectiva.TextoMensagem(),
        'TituloMensagem': vm.Perspectiva.TituloMensagem(),
        'Veiculos': vm.Perspectiva.VeiculosSelecionados(),
        'TipoMensagem': vm.Perspectiva.TipoMensagemChat()
    };

    $.ajax({
        url: urlGlobal + "Chat/Chat/EnviarMensagemNotificacao",
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        type: "POST",
        data: JSON.stringify(parametro),
        success: function () {
            $('#filtro-modal-novaMensagem').modal('hide');

            abrirDialogModal(null, "Enviar mensagem", "Grupo cadastrado com sucesso.");

            /* limpar veículos selecionados */
            vm.Perspectiva.VeiculosSelecionados.removeAll();
            vm.Perspectiva.TextoMensagem("");
            vm.Perspectiva.TituloMensagem("");

            $("[name=checkVeiculos]").each(function () {
                $(this).attr('checked', false);
            });
            $(".loading-inlog").fadeOut();
        },
        complete: () => $('#filtro-modal-novaMensagem').modal('hide')
    });
}

function CancelaEnvioMensagem() {
    $('#filtro-modal-novaMensagem').modal('hide');
}