function FerramentaPosicionamentoViewModel(data) {
    var mSelf = this;

    mSelf.Data = ko.observable(new FerramentaPosicionamentoOpcoes(mSelf));

    mSelf.FerramentaId = data.FerramentaId;

    mSelf.Template = data.Template;

    mSelf.Nome = data.Nome;

    mSelf.Titulo = data.Titulo;

    mSelf.NomeBotao = data.NomeBotao;

    mSelf.Icone = data.Icone;

    mSelf.Ordem = 4;
    
    mSelf.Visivel = ko.observable(false);

    mSelf.Init = function () {
        
    };
}

function FerramentaPosicionamentoOpcoes(data) {
    var mSelf = this;

    mSelf.Data = ko.observable();

    mSelf.Hora = ko.observable();
    
    mSelf.ListaPosicoes = ko.observableArray();

    mSelf.BtnIrInicio = function () {
        var ferramenta = vm.GetFerramenta("FerramentaHistorico");

        if (ferramenta) {

            var posicoes = ferramenta.Data().ListaHistoricoBuscado();

            mSelf.ListaPosicoes([]);

            mSelf.ListaPosicoes.push(0);

            ferramenta.Data().PlanejamentoHistorico().FocarPosicaoMapa(mSelf.ListaPosicoes(), posicoes);

        }
    };

    mSelf.BtnIrFim = function () {
        var ferramenta = vm.GetFerramenta("FerramentaHistorico");

        if (ferramenta) {

            var posicoes = ferramenta.Data().ListaHistoricoBuscado();

            if (posicoes) {
                mSelf.ListaPosicoes([]);

                if (posicoes.length > 1)
                    mSelf.ListaPosicoes.push(posicoes.length - 1);
                else
                    mSelf.ListaPosicoes.push(0);

                ferramenta.Data().PlanejamentoHistorico().FocarPosicaoMapa(mSelf.ListaPosicoes(), posicoes, false);
            }
        }
    };

    mSelf.BtnVoltarPosicionamentoInicial = function () {
        var ferramenta = vm.GetFerramenta("FerramentaHistorico");

        if (ferramenta) {

            var posicoes = ferramenta.Data().ListaHistoricoBuscado();

            if (posicoes) {
                mSelf.ListaPosicoes([]);

                ferramenta.Data().PlanejamentoHistorico().FocarPosicaoMapa(mSelf.ListaPosicoes(), posicoes, true);
            }

            this.Data("");
            this.Hora("");
        }
    };

    mSelf.BtnFiltrarPorData = function () {
        if (mSelf.Data() != null && mSelf.Data() != "" && mSelf.Hora() != null  && mSelf.Hora() != "") {
            var ferramenta = vm.GetFerramenta("FerramentaHistorico");

            if (ferramenta) {

                if (mSelf.Data() >= ferramenta.Data().DataInicial() && mSelf.Data() <= ferramenta.Data().DataFinal()) {

                    var posicoes = ferramenta.Data().ListaHistoricoBuscado();

                    if (posicoes) {
                        var dataParametro = mSelf.Data() +"T"+mSelf.Hora();
                        
                        mSelf.ListaPosicoes([]);

                        for (var index in posicoes) {
                            var dataHist = posicoes[index].DataHora();

                            if (dataHist >= dataParametro) {

                                var resultApos = new Date(dataHist) - new Date(dataParametro);

                                if (index > 0) {
                                    var dataAnterior = new Date(posicoes[index - 1].DataHora());

                                    var resultAnterior = 0;

                                    if (new Date(dataParametro).getTime() >= dataAnterior.getTime()) {
                                        resultAnterior = new Date(dataParametro) - dataAnterior;
                                    } else {
                                        resultAnterior = dataAnterior - new Date(dataParametro);
                                    }

                                    if (resultApos > resultAnterior)
                                        mSelf.ListaPosicoes.push(parseInt(index - 1));
                                    else
                                        mSelf.ListaPosicoes.push(parseInt(index));

                                    break;
                                } else {
                                    mSelf.ListaPosicoes.push(parseInt(index));
                                }
                            }
                        }

                        if (mSelf.ListaPosicoes().length > 0)
                            ferramenta.Data().PlanejamentoHistorico().FocarPosicaoMapa(mSelf.ListaPosicoes(), posicoes, false);
                        
                    }
                } else {
                    vm.ShowMensagemAlerta("Data fora do período do histórico!");
                }                
            }
        } else {
            vm.ShowMensagemAlerta("Data/Hora não informada corretamente!");
        }
    };

    mSelf.PreencherHora = function () {
        if (mSelf.Data()) {
            mSelf.Hora("00:00");
        }
    };
}