function FerramentaLocalizacaoViewModel(data) {
    var mSelf = this;

    mSelf.Data = ko.observable(new LocalizacaoFerramentaOpcoes(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 = 5;

    mSelf.Visivel = ko.observable(true);

    mSelf.Init = function () {
        vm.Perspectiva.ControleMapa.VincularAutocomplete($("#localizacaoEndName")[0]);
    };
}

function LocalizacaoFerramentaOpcoes(vModel) {
    var mSelf = this;

    mSelf.GeoCodeAtivo = ko.observable(false);
    mSelf.btnPontoPartidaAtivo = ko.observable(false);
    mSelf.btnPontoChegadaAtivo = ko.observable(false);
    mSelf.btnRotearAtivo = ko.observable(false);

    mSelf.GeoCodeLabel = ko.observable((mSelf.GeoCodeAtivo() ? "Desativar" : "Ativar") + " GeoCode");

    mSelf.btnBuscar = function (data, evt) {
        if ($("#localizacaoEndName").val().trim().length > 0)
            vm.Perspectiva.ControleMapa.GeocodeSearch($("#localizacaoEndName").val());
    };

    mSelf.btnPontoPartida = function (data, evt) {
        if (mSelf.GeoCodeAtivo()) {
            mSelf.btnAtivarGeoCodeReverso(data, evt);
        }

        mSelf.btnPontoPartidaAtivo(true);

        vm.Perspectiva.ControleMapa.AtivarGeoCodeReversoInicial(true);
    };

    mSelf.btnPontoChegada = function (data) {
        if (vm.Perspectiva.ControleMapa.MarkerGeocodePointerInicial) {
            mSelf.btnPontoChegadaAtivo(true);

            vm.Perspectiva.ControleMapa.AtivarGeoCodeReversoInicial(false);
            vm.Perspectiva.ControleMapa.AtivarGeoCodeReversoFinal(true);

            mSelf.btnRotearAtivo(true);
        } else {
            vm.ShowMensagemAlerta("O ponto de partida não foi selecionado!");
        }
    };

    mSelf.btnRotear = function (data) {
        if (vm.Perspectiva.ControleMapa.MarkerGeocodePointerInicial && vm.Perspectiva.ControleMapa.MarkerGeocodePointerFinal) {
            vm.Perspectiva.ControleMapa.CalcularRota(mSelf.FinalRotear);
        } else
            vm.ShowMensagemAlerta("O ponto de chegada não foi selecionado!");
    };

    mSelf.btnLimpar = function () {
        vm.Perspectiva.ControleMapa.LimparBuscaSearchPontos();

        mSelf.btnPontoPartidaAtivo(false);
        mSelf.btnPontoChegadaAtivo(false);
        mSelf.btnRotearAtivo(false);
        vm.Perspectiva.ControleMapa.AtivarGeoCodeReversoInicial(false);
        vm.Perspectiva.ControleMapa.AtivarGeoCodeReversoFinal(false);

        $("#localizacaoEndName").val("");
    };

    mSelf.FinalRotear = function (tudoOk) {
        if (tudoOk) {
            mSelf.btnPontoPartidaAtivo(false);
            mSelf.btnPontoChegadaAtivo(false);
            mSelf.btnRotearAtivo(false);
        }
    };

    mSelf.btnAtivarGeoCodeReverso = function (data, evt) {
        mSelf.GeoCodeAtivo(!mSelf.GeoCodeAtivo());

        vm.Perspectiva.ControleMapa.AtivarGeoCodeReverso(mSelf.GeoCodeAtivo());

        mSelf.GeoCodeLabel((mSelf.GeoCodeAtivo() ? "Desativar" : "Ativar") + " GeoCode");
    };
};