function FerramentaOpcoesVisualizacao(data) {
    var mSelf = this;

    mSelf.Data = ko.observable(new FerramentaOpcoesVisualizacaoData(data.Data));

    mSelf.FerramentaId = data.FerramentaId;

    mSelf.Template = data.Template;

    mSelf.Nome = data.Nome;

    mSelf.Titulo = data.Titulo;

    mSelf.Ordem = 3;

    mSelf.Icone = data.Icone;

    mSelf.Visivel = true;

    mSelf.Init = function () {
        mSelf.Data().Init();
    };
}

function FerramentaOpcoesVisualizacaoData(data) {
    var mSelf = this;

    mSelf.Init = function () { };

    mSelf.FerramentaHistoricoId = ko.observable("FerramentaHistoricoVeiculo");

    /* Velocidade */
    mSelf.VelocidadeInicio = ko.observable();
    mSelf.VelocidadeFim = ko.observable();
    mSelf.TrechoVelocidadeSelecionado = ko.observable(false);

    /* Tempo parado */
    mSelf.ValorTempoParado = ko.observable();
    mSelf.PontoParadaSelecionado = ko.observable(false);
    mSelf.TipoFiltroPontoParada = ko.observable();

    /* Sentido */
    mSelf.VerFimSelecionado = ko.observable();
    mSelf.VerInicioSelecionado = ko.observable();
    mSelf.VerSentidoSelecionado = ko.observable();

    mSelf.AplicarOpcoesVisualizacao = function () {
        if (mSelf.TrechoVelocidadeSelecionado() && (mSelf.VelocidadeInicio() == "" || !mSelf.VelocidadeInicio() || mSelf.VelocidadeFim() == "" || !mSelf.VelocidadeFim())) {
            vm.ShowMensagemAlerta("Os dois parâmetros de velocidade devem ser informados.");
            return;
        }
        var ferramenta = vm.GetFerramenta(mSelf.FerramentaHistoricoId());
        if (ferramenta) {
            ferramenta.Data().PlanejamentoHistorico().LimparPolylinesHighlight(mSelf.VerInicioSelecionado(), mSelf.VerFimSelecionado());

            var posicoes = ferramenta.Data().ListaHistorico;

            /* Filtro por Velocidade */
            if (mSelf.TrechoVelocidadeSelecionado()) {

                if (posicoes) {
                    $(".loading-div").fadeIn(500, function () {
                        ferramenta.Data().PlanejamentoHistorico().FiltrarPorVelocidade(posicoes, mSelf.VelocidadeInicio(), mSelf.VelocidadeFim());
                    });

                    $(".loading-div").fadeOut(500);
                }
            } else {
                //limpar filtro velocidade
                mSelf.VelocidadeFim("");
                mSelf.VelocidadeInicio("");

                ferramenta.Data().PlanejamentoHistorico().LimparPolylinesHighlight(mSelf.VerInicioSelecionado(), mSelf.VerFimSelecionado());
            }

            /* Filtro por Ponto de parada */
            if (mSelf.PontoParadaSelecionado()) {
                if (mSelf.ValorTempoParado() != null && mSelf.ValorTempoParado() != "") {
                    if (ferramenta.Data().ListaHistoricoParado() != null) {
                        ferramenta.Data().PlanejamentoHistorico().FiltrarPontosParada(ferramenta.Data().ListaHistoricoParado(), mSelf.ValorTempoParado(), mSelf.TipoFiltroPontoParada());
                    }
                } else {
                    vm.ShowMensagemAlerta("O tempo de parada deve ser informado!");
                }
            } else {
                ferramenta.Data().PlanejamentoHistorico().MostrarPontosParada(ferramenta.Data().ListaHistoricoParado());
            }

            /* Ver início */
            if (mSelf.VerInicioSelecionado()) {
                var posicao = posicoes[0];
                var historico = ferramenta.Data().PlanejamentoHistorico();
                historico.SelecaoMultipla(ferramenta.Data().PlanejamentoHistorico().PolylineHistorico, new google.maps.LatLng(posicao.Latitude(), posicao.Longitude()), true, 0);
                historico.ControleMapa.infoWindowPolylineSelecionada.setMap(null);
                historico.ControleMapa.PolylineHighlight.setMap(null);
            } else {
                ferramenta.Data().PlanejamentoHistorico().DesmarcarPonto(0);
            }

            /* Ver fim */
            var posicao = posicoes[posicoes.length - 1];
            if (mSelf.VerFimSelecionado()) {
                var historico = ferramenta.Data().PlanejamentoHistorico();
                historico.SelecaoMultipla(ferramenta.Data().PlanejamentoHistorico().PolylineHistorico, new google.maps.LatLng(posicao.Latitude(), posicao.Longitude()), true, posicoes.length - 1);
                historico.ControleMapa.infoWindowPolylineSelecionada.setMap(null);
                historico.ControleMapa.PolylineHighlight.setMap(null);
            } else {
                ferramenta.Data().PlanejamentoHistorico().DesmarcarPonto(posicoes.length - 1);
            }

            /* Sentido */
            ferramenta.Data().PlanejamentoHistorico().AlterarIconePolylinha(mSelf.VerSentidoSelecionado());
        }
    };

    mSelf.LimparOpcoesVisualizacao = function () {
        mSelf.VelocidadeFim("");
        mSelf.VelocidadeInicio("");
        mSelf.ValorTempoParado("");
        mSelf.VerFimSelecionado(false);
        mSelf.VerInicioSelecionado(false);
        mSelf.PontoParadaSelecionado(false);
        mSelf.VerSentidoSelecionado(false);
        mSelf.TrechoVelocidadeSelecionado(false);

        var ferramenta = vm.GetFerramenta(mSelf.FerramentaHistoricoId());
        ferramenta.Data().PlanejamentoHistorico().OnMapClick(null);

        //limpar pontos de parada
        ferramenta.Data().PlanejamentoHistorico().MostrarPontosParada(ferramenta.Data().ListaHistoricoParado());

        //limpar sentido
        ferramenta.Data().PlanejamentoHistorico().AlterarIconePolylinha(false);

        //limpar filtro velocidade
        ferramenta.Data().PlanejamentoHistorico().LimparPolylinesHighlight(mSelf.VerInicioSelecionado(), mSelf.VerFimSelecionado());
    }
}