function FerramentaLocalizacao(data) {
    var mSelf = this;

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

    mSelf.FerramentaId = data.FerramentaId;

    mSelf.Template = data.Template;

    mSelf.Nome = data.Nome;

    mSelf.Titulo = data.Titulo;

    mSelf.Ordem = 7;

    mSelf.Visivel = data.Visivel;

    mSelf.Icone = data.Icone;

    mSelf.Init = function () {
        var norteOriginal = vm.GetFerramenta("FerramentaConfiguracaoShape");
        if (norteOriginal) {
            if (norteOriginal.Data().Rotacionar())
                mSelf.Visivel(false);
        }
    };

    mSelf.Init();
}

function FerramentaLocalizacaoData(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) {
            var endereco = $("#localizacaoEndName").val();
            if (mSelf.ValidaCaracteresInvalidos(endereco)) {
                vm.ShowMensagemAlerta("Não é permitido caracteres especiais no campo endereço.");
                return;
            }
            vm.Perspectiva.MapaController.GeocodeSearch(endereco);
        }
        else
            vm.ShowMensagemAlerta("O endereço não foi preenchido, por favor verifique novamente.");
    };

    mSelf.btnPontoPartida = function (data, evt) {

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

        mSelf.btnPontoPartidaAtivo(true);

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

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

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

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

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

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

        mSelf.btnPontoPartidaAtivo(false);
        mSelf.btnPontoChegadaAtivo(false);
        mSelf.btnRotearAtivo(false);
        vm.Perspectiva.MapaController.AtivarGeoCodeReversoInicial(false);
        vm.Perspectiva.MapaController.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.MapaController.AtivarGeoCodeReverso(mSelf.GeoCodeAtivo());

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

    mSelf.ValidaCaracteresInvalidos = function (valor) {
        var regex = new RegExp("[`´~!@#$%^&*()+={}|;:'\"<>\/?\]+");
        return regex.test(valor);
    };
}