/*
BOOTSTRAP
*/

/*
Fim bootstrap
*/

function SetoresShapePerspectiva(vm, data) {
    var mSelf = this;

    mSelf.Data = data;

    mSelf.MapaController = new Mapa("mapa", null, null, false, vm.usarGeoGoogle);

    mSelf.PermitirAba = ko.observable(false);

    mSelf.UsuarioLogado = ko.observable("");

    mSelf.TituloModal = ko.observable("");

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

    mSelf.EmpresaUsuarioLogado = ko.observable("");

    mSelf.Filtro = ko.observable(null);

    mSelf.Titulo = "Sinótico de Veículos";

    mSelf.QuantidadeVeiculosGrid = ko.observable("");

    mSelf.CarregarFuncoes = ko.observable(false);

    mSelf.ListaModulosCarregar = ko.observableArray([
         { url: urlGlobal + "SetoresShape/SetoresShape/CarregarGrid", data: {} },
    ]);

    mSelf.ListaFerramentasCarregar = ko.observableArray([
        { url: urlGlobal + "SetoresShape/SetoresShape/FerramentaConfiguracaoShape", data: {} },
        { url: urlGlobal + "SetoresShape/SetoresShape/FerramentaConfiguracaoMarkers", data: {} },
    ]);

    mSelf.SetoresMapa = new ModuloSetoresMapa(mSelf.MapaController);
    
    mSelf.ConfiguracoesUsuario = ko.observable(new FerramentaConfiguracaoUsuario());

    mSelf.Init = function () {

        $(".loading-div").show();

        mSelf.CarregarModulos();

        mSelf.SetoresMapa.Init();

        mSelf.CarregarFerramentas();

        vmEventos.TempoReal.SetHandlers(mSelf);
    };

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

                // Iniciar VIEWMODEL Knockout js pelo JSon;
                var vmInit = new window[kojs.ViewModelKnockout()](kojs, mSelf.Data);

                vm.Modulos.push(vmInit);

                vmInit.Init();

                mSelf.ReconfiguarModulos(vmInit.ModuloId()); //Aplicar enumerador para os módulos.

                vm.Modulos(vm.Modulos().sort(function (left, right) {
                    return left.Ordem == right.Ordem ? 0 : (left.Ordem < right.Ordem ? -1 : 1)
                }));               
            }
        });
    };

    mSelf.ReconfiguarModulos = function (idModulo) {

    };
    
    mSelf.CarregarFerramentas = function () {
        var countFerramentas = 0;
        vm.CarregarFuncionalidades(mSelf.ListaFerramentasCarregar, function (data) {
            if (data) {
                var kojs = ko.mapping.fromJS(data);

                // Iniciar VIEWMODEL Knockout js pelo JSon;
                var vmInit = new window[kojs.ViewModelKnockout()](kojs);

                vm.Ferramentas.push(vmInit);

                if (countFerramentas == mSelf.ListaFerramentasCarregar().length - 1) {
                    $(".loading-div").hide();

                    if (mSelf.CarregarFuncoes())
                        HabilitaFuncoes();
                    else
                        mSelf.CarregarFuncoes(true);
                }

                countFerramentas++;

                vmInit.Init();

                mSelf.ReconfigurarFerramentas(vmInit.FerramentaId());

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

    mSelf.ReconfigurarFerramentas = function (idFerramenta) {

    };

    mSelf.DataBase = ko.observable(new Date().toISOString());

    mSelf.PaginaDetalhes = function (codigoVeiculo) {
        window.open(urlGlobal + "SetoresShape/SetoresShapeDetalhes/Detalhes?codigoVeiculo=" + codigoVeiculo);
    };

    mSelf.ModuloGridVeiculos = null;

    mSelf.TratarEvento = function (tipoEvento, conteudo) {

        mSelf.RecuperarModuloVeiculos();

        if (mSelf.ModuloGridVeiculos) {

            switch (tipoEvento) {

                case 1: // Periódicos
                    for (var i in conteudo) {
                        mSelf.AtualizarPosicao(conteudo[i]);
                    }
                    break;
                case 2: // Status Veículos
                    for (var i in conteudo) {
                        mSelf.AtualizarStatus(conteudo[i]);
                    }
                    break;
                case 3: // Status Tempo Real (Status do comando e Lista de Posições)
                    mSelf.AtualizarStatusTempoReal(conteudo);
                    break;
                case 4: // Veículos Parados
                    for (var i in conteudo) {
                        mSelf.AtualizarTempoParadoVeiculos(conteudo[i]);
                    }
            }
        }
    };

    mSelf.AtualizarPosicao = function (conteudo) {

        mSelf.ModuloGridVeiculos.Data().AtualizarPosicao(conteudo);
    };

    mSelf.AtualizarStatus = function (conteudo) {

        mSelf.ModuloGridVeiculos.Data().AtualizarStatus(conteudo);
    };

    mSelf.AtualizarStatusTempoReal = function (conteudo) {

        mSelf.ModuloGridVeiculos.Data().AtualizarStatusTempoReal(conteudo);
    };

    mSelf.AtualizarTempoParadoVeiculos = function (conteudo) {

        mSelf.ModuloGridVeiculos.Data().AtualizarTempoParadoVeiculos(conteudo);
    };

    mSelf.RecuperarModuloVeiculos = function () {

        if (mSelf.ModuloGridVeiculos == null)
            mSelf.ModuloGridVeiculos = vm.GetModulo("GridSetoresShapeViewModel");
    };

    mSelf.AbriModalOperacoesVeiculo = function (codigoVeiculo, operacao) {

        mSelf.RecuperarModuloVeiculos();

        if (mSelf.ModuloGridVeiculos) {

            mSelf.TituloModal(mSelf.ModuloGridVeiculos.Data().SetarTituloModalOperacoesVeiculo(codigoVeiculo, operacao));

            mSelf.ConteudoModalOperacoesVeiculo.removeAll();

            var operacoes = mSelf.ModuloGridVeiculos.Data().AbriModalOperacoesVeiculo(codigoVeiculo, operacao);

            ko.utils.arrayForEach(operacoes, function (op) {

                mSelf.ConteudoModalOperacoesVeiculo.push(op);
            });
        }
    };
}