function RotogramaModel() {

    "use strict";
    var mSelf = this;

    mSelf.Codigo = ko.observable(0);
    mSelf.Descricao = ko.observable("");
    mSelf.VelocidadeSemChuva = ko.observable();
    mSelf.VelocidadeComChuva = ko.observable();
    mSelf.ParadaPermitida = ko.observable("");
    mSelf.PossuiRestricaoHorario = ko.observable("");
    mSelf.RestricaoDe = ko.observable();
    mSelf.RestricaoAte = ko.observable();
    mSelf.SequenciaInicial = ko.observable();
    mSelf.SequenciaFinal = ko.observable();

    mSelf.isRotogramaAtivo = ko.observable(false);
    mSelf.isRotogramasVisiveis = ko.observable(false);
    mSelf.isEditarPontosRotograma = ko.observable(false);
    mSelf.isConfigurarRotograma = ko.observable(false);
    mSelf.isExcluirRotograma = ko.observable(false);

    mSelf.isRotogramaEnlaceHabilitado = ko.observable(false);
    mSelf.isRotogramaDesvioHabilitado = ko.observable(false);

    mSelf.permiteAcao = ko.observable(true);
    mSelf.permiteAcaoBotoes = ko.observable(true);

    //flags para controle do menu
    mSelf.desabilitado = ko.observable(false);

    mSelf.editarPontosDesabilitado = ko.observable(false);

    mSelf.configurarDesabilitado = ko.observable(false);

    mSelf.excluirDesabilitado = ko.observable(false);
    
    mSelf.ItinerarioRotograma = null;

    mSelf.Clone = null;
    mSelf.CloneItinerario = ko.observable();
    mSelf.CancelandoRotograma = false;

    mSelf.polylineRotograma = new google.maps.Polyline({
            strokeColor: '#104E8B',
            strokeOpacity: 1.0,
            strokeWeight: 10,
            map: map,
            zIndex: 3
        });

        
        mSelf.habilitarRotograma = ko.computed(function () {
            
            if (mSelf.isRotogramaEnlaceHabilitado() && mSelf.isRotogramaDesvioHabilitado())
                return true;
            
            return false;
        
        }, mSelf);


        mSelf.gerarInfoWindow = function () {

            var elemento = $("#infoWindowRotogramaTR").html();

            elemento = elemento.replace("{Descricao}", mSelf.Descricao());

            elemento = elemento.replace("{VelocidadeSemChuva}", mSelf.VelocidadeSemChuva());

            elemento = elemento.replace("{VelocidadeComChuva}", mSelf.VelocidadeComChuva());

            elemento = elemento.replace("{ParadaPermitida}", mSelf.ParadaPermitida() == "T" ? "Sim" : "Não");

            elemento = elemento.replace("{RestricaoDe}", mSelf.RestricaoDe() != null ? mSelf.RestricaoDe() + "h" : "");

            elemento = elemento.replace("{RestricaoAte}", mSelf.RestricaoAte() != null ? mSelf.RestricaoAte() + "h" : "");

            return elemento;
        };

        mSelf.toggleVisualizarRotogramas = function () {

            if (!mSelf.isRotogramaDesvioHabilitado() && !mSelf.desabilitado() && mSelf.permiteAcao()) {

                mSelf.ItinerarioRotograma.limparPolylinhaRotograma();

                var aux = mSelf.isRotogramasVisiveis();

                mSelf.isRotogramasVisiveis(!aux);

                mSelf.isRotogramaAtivo(!aux);

                if (!mSelf.isRotogramaAtivo()) {

                    mSelf.isEditarPontosRotograma(false);
                    mSelf.isConfigurarRotograma(false);
                    mSelf.isExcluirRotograma(false);
                } else {
                    mSelf.polylineRotograma.infoWindow.setMap(map);
                }

                mSelf.desabilitarAcaoAdicionar();

                vm.Enlaces.Novo.visualizandoItinerarios(false);

                //Controle do menu
                vm.Enlaces.Novo.Itinerario.Novo.configurarDesabilitado(mSelf.isRotogramasVisiveis());
                vm.Enlaces.Novo.Itinerario.Novo.adicionarDesabilitado(mSelf.isRotogramasVisiveis());
                vm.Enlaces.Novo.visualizarDesabilitado(mSelf.isRotogramasVisiveis());

                 mSelf.desabilitarTodosRotogramas(mSelf.isRotogramasVisiveis());

                //desabilita os outros itinerarios que não sejam do rotograma
                //                if (mSelf.isRotogramasVisiveis()) {
                //                    mSelf.ocultarItinerarios();
                //                } else {
                //                    mSelf.cancelarAlteracoesRotograma();
                //                    mSelf.mostrarItinerarios();
                //                }

                mSelf.ItinerarioRotograma.polylinha.setMap(map);
                mSelf.polylineRotograma.setMap(map);

                vm.Enlaces.permiteAcaoRotogramas(aux);

                mSelf.permiteAcao(false);

                mSelf.permiteAcaoBotoes(true);

                mSelf.criarCopiaItinerario();              
            }
        };

        mSelf.criarCopiaItinerario = function(){
            mSelf.CloneItinerario = new ItinerarioModel();
            mSelf.CloneItinerario.polylinha = mSelf.CloneItinerario.optionsPolylinha();

            var pts = [];
            for (var i in mSelf.ItinerarioRotograma.polylinha.getPath().getArray()) {
                var ponto = mSelf.ItinerarioRotograma.polylinha.getPath().getArray()[i];
                var coordenadas = new google.maps.LatLng(ponto.lat(), ponto.lng());

                if (ponto.CodigoRotograma)
                    coordenadas.CodigoRotograma = ponto.CodigoRotograma;
                else
                    coordenadas.CodigoRotograma = null;

                pts.push(coordenadas);
            }

            mSelf.CloneItinerario.polylinha.setPath(pts);
        }

        mSelf.ocultarItinerarios = function () {
            vm.Enlaces.Novo.Itinerario.Novo.polylinha.setMap(null);
            for (var index in vm.Enlaces.Novo.Desvios.Lista()) {
                vm.Enlaces.Novo.Desvios.Lista()[index].Itinerario.Novo.polylinha.setMap(null);
            }

            for (var indexRotograma in vm.Enlaces.Novo.Rotogramas()) {
                vm.Enlaces.Novo.Rotogramas()[indexRotograma].polylineRotograma.infoWindow.setMap(null);
                vm.Enlaces.Novo.Rotogramas()[indexRotograma].polylineRotograma.setMap(null);
            }

            var bounds = new google.maps.LatLngBounds();
            for (var i in mSelf.polylineRotograma.getPath().getArray()) {
                bounds.extend(mSelf.polylineRotograma.getPath().getArray()[i]);
            }

            mSelf.polylineRotograma.infoWindow.open(map);

            map.fitBounds(bounds);
            map.setZoom(16);
        };

        mSelf.mostrarItinerarios = function () {
            vm.Enlaces.Novo.Itinerario.Novo.polylinha.setMap(map);
            for (var index in vm.Enlaces.Novo.Desvios.Lista()) {
                vm.Enlaces.Novo.Desvios.Lista()[index].Itinerario.Novo.polylinha.setMap(map);
            }

            for (var indexRotograma in vm.Enlaces.Novo.Rotogramas()) {
                vm.Enlaces.Novo.Rotogramas()[indexRotograma].polylineRotograma.infoWindow.setMap(null);
                vm.Enlaces.Novo.Rotogramas()[indexRotograma].polylineRotograma.setMap(map);
            }

            var bounds = new google.maps.LatLngBounds();

            bounds.union(vm.Enlaces.Novo.TerminalInicial().bounds);
            bounds.union(vm.Enlaces.Novo.TerminalFinal().bounds);

            map.fitBounds(bounds);

        };

        mSelf.editarPontosRotograma = function () {
            
            if (!mSelf.editarPontosDesabilitado()) {

                mSelf.desabilitarAcaoAdicionar();

                mSelf.polylineRotograma.infoWindow.setMap(null);

                mSelf.polylineRotograma.setMap(null);

                mSelf.desativarAcoes();

                mSelf.isRotogramaAtivo(true);

                mSelf.isRotogramasVisiveis(true);

                mSelf.isEditarPontosRotograma(true);

                mSelf.ItinerarioRotograma.navegarTeclado(true);

                mSelf.ItinerarioRotograma.idxIni = mSelf.SequenciaInicial();

                mSelf.ItinerarioRotograma.idxFim = mSelf.SequenciaFinal();

                mSelf.ItinerarioRotograma.isEditando(true);

                mSelf.ItinerarioRotograma.setPathSelecionado();

                mSelf.adicionarEventosPolilinhaRotogramaSelecao();

                mSelf.exibirRotogramasEdicaoNovoTrecho();

                vm.visualizarConfiguracaoRotograma(false);

                mSelf.configurarDesabilitado(true);

                mSelf.excluirDesabilitado(true);

                mSelf.permiteAcaoBotoes(false);

                mostrarGuia("guiamapa");
            }
        };

        mSelf.configurarRotograma = function () {
            if (!mSelf.configurarDesabilitado()) {

                mSelf.desabilitarAcaoAdicionar();

                mSelf.editarRotograma();

                mSelf.desativarAcoes();

                mSelf.isConfigurarRotograma(true);

                mSelf.isRotogramaAtivo(true);

                mSelf.isRotogramasVisiveis(true);

                vm.visualizarConfiguracaoRotograma(true);

                mostrarGuia("rotogramaItinerarioEnlace");

                $("#txtDescricaoTrecho").focus();

                vm.visualizarConfiguracaoRotograma(true);

                mostrarGuia("rotogramaItinerarioEnlace");

                mSelf.editarPontosDesabilitado(true);

                mSelf.excluirDesabilitado(true);

                mSelf.permiteAcaoBotoes(false);

                mSelf.CopiaDescricao = mSelf.Descricao();
            }
        };

        mSelf.excluirRotograma = function () {
            if (!mSelf.excluirDesabilitado()) {
                abrirModalMensagem("Confirmação", "Confirma excluir o rotograma " + mSelf.Descricao() + "?",
                {
                    resizable: false,
                    height: 190,
                    modal: true,
                    buttons: {
                        "Sim": function () {
                            mSelf.desabilitarAcaoAdicionar();

                            mSelf.removerRotograma();

                            vm.visualizarConfiguracaoRotograma(false);

                            mostrarGuia("guiamapa");

                            vm.Enlaces.Novo.Itinerario.Novo.adicionarDesabilitado(false);
                            vm.Enlaces.Novo.Itinerario.Novo.configurarDesabilitado(false);
                            vm.Enlaces.Novo.visualizarDesabilitado(false);
                            mSelf.desabilitarTodosRotogramas(false);

                            mSelf.permiteAcao(true);

                            mSelf.permiteAcaoBotoes(true);

                            vm.Enlaces.permiteAcaoRotogramas(true);

                            vm.Enlaces.Novo.PossuiAlteracao(true);

                            $(this).dialog("close");
                        },
                        "Não": function () {
                            $(this).dialog("close");
                        }
                    }
                });
            }
        };

        mSelf.salvarEdicaoNovoTrecho = function () {

            if (mSelf.ItinerarioRotograma.idxIni > -1 && mSelf.ItinerarioRotograma.idxFim > -1) {
                
                mSelf.salvarNovosPontos();
            }
            else
                abrirModalMensagem("Mensagem", "Não existe trecho selecionado!");
        };

        mSelf.cancelarEdicaoNovoTrecho = function () {

            mSelf.polylineRotograma.getPath().clear();
            
            var pontos = null;

            if (mSelf.CancelandoRotograma) {
                pontos = mSelf.CloneItinerario.polylinha.getPath().getArray();
            } else {
                pontos = mSelf.ItinerarioRotograma.polylinha.getPath().getArray();
            }            
            
            for (var index in pontos) {

                if (pontos[index].CodigoRotograma && pontos[index].CodigoRotograma == mSelf.Codigo())
                    mSelf.polylineRotograma.getPath().push(pontos[index]);
            }
            

            mSelf.setarSequencia(pontos);

            var posicao = mSelf.polylineRotograma.getPath().getAt(0);

            var centro = new google.maps.LatLng(posicao.lat(), posicao.lng(), false);

            mSelf.polylineRotograma.infoWindow.setPosition(centro);

            mSelf.polylineRotograma.setMap(map);

            mSelf.polylineRotograma.infoWindow.open(map);

            mSelf.ItinerarioRotograma.limparPolylinhaRotograma();

            mSelf.ocultarRotogramasEdicaoNovoTrecho();

            mSelf.isEditarPontosRotograma(false);

            mSelf.editarPontosDesabilitado(false);

            mSelf.configurarDesabilitado(false);

            mSelf.excluirDesabilitado(false);

            mSelf.permiteAcaoBotoes(true);

            mSelf.AtualizaItinerarioRotograma();
        };

        mSelf.AtualizaItinerarioRotograma = function () {
           
            var pts = [];
            for (var i in mSelf.CloneItinerario.polylinha.getPath().getArray()) {
                var ponto = mSelf.CloneItinerario.polylinha.getPath().getArray()[i];
                var coordenadas = new google.maps.LatLng(ponto.lat(), ponto.lng());

                if (ponto.CodigoRotograma)
                    coordenadas.CodigoRotograma = ponto.CodigoRotograma;
                else
                    coordenadas.CodigoRotograma = null;

                pts.push(coordenadas);
            }

            mSelf.ItinerarioRotograma.polylinha.setPath(pts);
        }

        mSelf.salvarAlteracoesRotograma = function () {

            mSelf.Clone = null;

            mSelf.consolidarAteracoesPontosRotograma();

            mSelf.desabilitarTodosRotogramas(false);

            vm.Enlaces.Novo.Itinerario.Novo.adicionarDesabilitado(false);
            vm.Enlaces.Novo.Itinerario.Novo.configurarDesabilitado(false);
            vm.Enlaces.Novo.visualizarDesabilitado(false);

            mSelf.desativarAcoes();

            mSelf.setarEventoClickRotogramas();

            mSelf.isRotogramaAtivo(false);

            mSelf.isRotogramasVisiveis(false);

            mSelf.mostrarItinerarios();

            vm.Enlaces.permiteAcaoRotogramas(true);

            mSelf.permiteAcao(true);

            mSelf.permiteAcaoBotoes(true);

            vm.Enlaces.Novo.ClonarEnlace(true);

            vm.Enlaces.Novo.PossuiAlteracao(true);

            mSelf.CloneItinerario = ko.observable();
        };

        mSelf.cancelarAlteracoesRotograma = function () {

            mSelf.desativarAcoes();

            mSelf.CancelandoRotograma = true;

            if (mSelf.ItinerarioRotograma)
                mSelf.cancelarEdicaoNovoTrecho();

            mSelf.cancelarDadosConfiguracaoRotograma();

            mSelf.isRotogramasVisiveis(false);

            mSelf.isRotogramaAtivo(false);

            mSelf.mostrarTodosRotogramas();

            mSelf.setarEventoClickRotogramas();

            mSelf.desabilitarTodosRotogramas(false);

            vm.Enlaces.Novo.Itinerario.Novo.adicionarDesabilitado(false);
            vm.Enlaces.Novo.Itinerario.Novo.configurarDesabilitado(false);
            vm.Enlaces.Novo.visualizarDesabilitado(false);

            mSelf.mostrarItinerarios();

            vm.Enlaces.permiteAcaoRotogramas(true);

            mSelf.permiteAcao(true);

            mSelf.permiteAcaoBotoes(true);
        };

        mSelf.consolidarAteracoesPontosRotograma = function () {

            var pontos = mSelf.ItinerarioRotograma.polylinha.getPath().getArray();

            for (var index in pontos) {

                if (pontos[index].CodigoRotograma && pontos[index].CodigoRotograma == mSelf.Codigo())
                    pontos[index].CodigoRotograma = null;

                if (index >= mSelf.SequenciaInicial() && index <= mSelf.SequenciaFinal())
                    pontos[index].CodigoRotograma = mSelf.Codigo();
            }
        };

        mSelf.removerCodigoRotogramaItinerario = function () {

            if (mSelf.ItinerarioRotograma && mSelf.ItinerarioRotograma.polylinha) {
                
                var pontos = mSelf.ItinerarioRotograma.polylinha.getPath().getArray();

                for (var index in pontos) {

                    if (pontos[index].CodigoRotograma && pontos[index].CodigoRotograma == mSelf.Codigo())
                        pontos[index].CodigoRotograma = null;
                }
            }
        };

        mSelf.limparFormularioRotograma = function () {

            $("#txtDescricaoTrecho").val("");

            $("#txtVelocidadeMaximaSemChuva").val("");

            $("#txtVelocidadeMaximaComChuva").val("");

            $("#ckParadaPermitida").prop("checked", false);

            $("#ckRestricaoHorario").prop("checked", false);

            $("#txtRestricaoHorarioDe").prop("disabled", true);

            $("#txtRestricaoHorarioAte").prop("disabled", true);

            $("#txtRestricaoHorarioDe").val("");

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

        mSelf.editarRotograma = function () {

            $("#txtDescricaoTrecho").val(mSelf.Descricao());
            $("#txtVelocidadeMaximaSemChuva").val(mSelf.VelocidadeSemChuva());
            $("#txtVelocidadeMaximaComChuva").val(mSelf.VelocidadeComChuva());

            if (mSelf.ParadaPermitida() == "T")
                $("#ckParadaPermitida").prop("checked", true);
            else
                $("#ckParadaPermitida").prop("checked", false);

            if (mSelf.PossuiRestricaoHorario() == "T")
                $("#ckRestricaoHorario").prop("checked", true);
            else
                $("#ckRestricaoHorario").prop("checked", false);

            if (mSelf.PossuiRestricaoHorario() == "T") {

                $("#txtRestricaoHorarioDe").prop("disabled", false);

                $("#txtRestricaoHorarioAte").prop("disabled", false);

                $("#txtRestricaoHorarioDe").val(mSelf.RestricaoDe());

                $("#txtRestricaoHorarioAte").val(mSelf.RestricaoAte());
            }
            else {

                $("#txtRestricaoHorarioDe").prop("disabled", true);

                $("#txtRestricaoHorarioAte").prop("disabled", true);

                $("#txtRestricaoHorarioDe").val("");

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

        mSelf.removerRotograma = function () {

            mSelf.cancelarAlteracoesRotograma();

            mSelf.polylineRotograma.infoWindow.setMap(null);

            mSelf.polylineRotograma.setMap(null);

            mSelf.desativarAcoes();

            if (vm.visualizarConfiguracaoRotograma())
                vm.visualizarConfiguracaoRotograma(false);

            mSelf.desabilitarAcaoAdicionar();

            if(mSelf.ItinerarioRotograma)
                mSelf.ItinerarioRotograma.limparPolylinhaRotograma();

            mSelf.limparEventosRotogramaPolinhaSelecao();

            mSelf.removerCodigoRotogramaItinerario();

            mSelf.setarEventoClickRotogramas();

            vm.Enlaces.Novo.Rotogramas.remove(mSelf);

            mostrarGuia("guiamapa");
        };

        mSelf.infoWindowPolylineRotograma = function () {

            mSelf.setarAcoesRotogramaEspecifico();
        };

        mSelf.salvarNovosPontos = function () {

            if (mSelf.verificarGeracaoRotograma()) {
                
                mSelf.limparEventosRotograma();

                mSelf.limparEventosRotogramaPolinhaSelecao();

                mSelf.adicionarEventosPolilinhaRotograma();

                mSelf.polylineRotograma.getPath().clear();

                mSelf.polylineRotograma.setPath(mSelf.ItinerarioRotograma.polylinhaSelecionada.getPath().getArray());

                mSelf.verificarSequenciasItinerario();

                mSelf.consolidarAteracoesPontosRotograma();

                mSelf.ItinerarioRotograma.limparPolylinhaRotograma();

                var posicao = mSelf.polylineRotograma.getPath().getAt(0);

                var inicioPolilinha = new google.maps.LatLng(posicao.lat(), posicao.lng(), false);

                mSelf.polylineRotograma.infoWindow.setPosition(inicioPolilinha);

                mSelf.polylineRotograma.setMap(map);

                mSelf.polylineRotograma.infoWindow.open(map);

                mSelf.desativarAcoes();

                mSelf.ocultarRotogramasEdicaoNovoTrecho();

                mSelf.editarPontosDesabilitado(false);

                mSelf.configurarDesabilitado(false);

                mSelf.excluirDesabilitado(false);

                mSelf.permiteAcaoBotoes(true);
            }
        };

        mSelf.cancelarEdicaoNovosPontos = function () {

            mSelf.polylineRotograma.setMap(map);

            mSelf.polylineRotograma.infoWindow.open(map);

            mSelf.desativarAcoes();
        };

        mSelf.verificarSequenciasItinerario = function () {

            if (mSelf.ItinerarioRotograma.idxIni < mSelf.ItinerarioRotograma.idxFim) {

                mSelf.SequenciaInicial(mSelf.ItinerarioRotograma.idxIni);

                mSelf.SequenciaFinal(mSelf.ItinerarioRotograma.idxFim);
            }
            else {

                mSelf.SequenciaInicial(mSelf.ItinerarioRotograma.idxFim);

                mSelf.SequenciaFinal(mSelf.ItinerarioRotograma.idxIni);
            }
        };

        mSelf.verificarGeracaoRotograma = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                if (mSelf.ItinerarioRotograma.polylinhaSelecionada) {

                    var array = vm.Enlaces.Novo.Rotogramas();

                    for (var i in array) {

                        if (array[i] != mSelf && array[i].ItinerarioRotograma === mSelf.ItinerarioRotograma) {

                            var iniAtual = 0, ini = array[i].SequenciaInicial();

                            var fimAtual = 0, fim = array[i].SequenciaFinal();

                            if (mSelf.ItinerarioRotograma.idxIni < mSelf.ItinerarioRotograma.idxFim) {

                                iniAtual = mSelf.ItinerarioRotograma.idxIni;

                                fimAtual = mSelf.ItinerarioRotograma.idxFim;
                            }
                            else {

                                iniAtual = mSelf.ItinerarioRotograma.idxFim;

                                fimAtual = mSelf.ItinerarioRotograma.idxIni;
                            }

                            if ((ini <= iniAtual && iniAtual <= fim)
                                || (ini <= fimAtual && fimAtual <= fim)
                                || ((ini > iniAtual && ini < fimAtual) || (fim > iniAtual && fim < fimAtual))) {

                                abrirModalMensagem("Mensagem", "Já existe um outro rotograma utilizando esse trecho!");

                                vm.Enlaces.Novo.Itinerario.Novo.permiteSalvarRotograma(false);

                                return false;
                            }
                        }
                    }
                }
            }

            return true;
        };

        mSelf.gerarRotograma = function () {

            mSelf.ItinerarioRotograma = vm.Enlaces.Novo.ItinerarioSelecionado();

            if (mSelf.validarConfiguracaoRotograma()) {

                if (mSelf.verificarGeracaoRotograma()) {

                    if (mSelf.ItinerarioRotograma.idxIni > -1 && mSelf.ItinerarioRotograma.idxFim > -1) {

                        if ($('body').data("indiceRotograma"))
                            mSelf.Codigo(($('body').data("indiceRotograma")) + (-1));
                        else
                            mSelf.Codigo(-1);

                        $('body').data("indiceRotograma", mSelf.Codigo());

                        mSelf.Descricao($("#txtDescricaoTrecho").val());
                        mSelf.VelocidadeSemChuva(parseInt($("#txtVelocidadeMaximaSemChuva").val()));
                        mSelf.VelocidadeComChuva(parseInt($("#txtVelocidadeMaximaComChuva").val()));

                        if ($("#ckParadaPermitida").is(':checked'))
                            mSelf.ParadaPermitida("T");
                        else
                            mSelf.ParadaPermitida("F");

                        if ($("#ckRestricaoHorario").is(':checked'))
                            mSelf.PossuiRestricaoHorario("T");
                        else
                            mSelf.PossuiRestricaoHorario("F");

                        if ($("#ckRestricaoHorario").is(':checked')) {

                            mSelf.RestricaoDe($("#txtRestricaoHorarioDe").val());
                            mSelf.RestricaoAte($("#txtRestricaoHorarioAte").val());
                        }
                        else {

                            mSelf.RestricaoDe(null);
                            mSelf.RestricaoAte(null);
                        }

                        if (mSelf.ItinerarioRotograma.idxIni < mSelf.ItinerarioRotograma.idxFim) {

                            mSelf.SequenciaInicial(mSelf.ItinerarioRotograma.idxIni);

                            mSelf.SequenciaFinal(mSelf.ItinerarioRotograma.idxFim);
                        }
                        else {

                            mSelf.SequenciaInicial(mSelf.ItinerarioRotograma.idxFim);

                            mSelf.SequenciaFinal(mSelf.ItinerarioRotograma.idxIni);
                        }

                        mSelf.polylineRotograma.setPath(mSelf.ItinerarioRotograma.polylinhaSelecionada.getPath().getArray());

                        mSelf.ItinerarioRotograma.limparPolylinhaRotograma();

                        var posicao = mSelf.polylineRotograma.getPath().getAt(0);

                        var centro = new google.maps.LatLng(posicao.lat(), posicao.lng(), false);

                        mSelf.polylineRotograma.infoWindow = new google.maps.InfoWindow();

                        var novoHtml = mSelf.gerarInfoWindow();

                        mSelf.polylineRotograma.infoWindow.setContent(novoHtml);

                        mSelf.polylineRotograma.infoWindow.setPosition(centro);

                        mSelf.polylineRotograma.infoWindow.open(map);

                        mSelf.setarCodigoListaPontosItinerario();

                        vm.Enlaces.Novo.Rotogramas.push(mSelf);

                        mSelf.setarEventoClickRotogramas();

                        vm.visualizarConfiguracaoRotograma(false);

                        vm.Enlaces.Novo.Itinerario.Novo.permiteAdicionarRotogramaAcao(false);
                        vm.Enlaces.Novo.Itinerario.Novo.PermiteConfigurarRotograma(false);
                        vm.Enlaces.Novo.Itinerario.Novo.permiteSalvarRotograma(false);

                        mostrarGuia("guiamapa");

                        //Controle do menu
                        vm.Enlaces.Novo.Itinerario.Novo.configurarDesabilitado(mSelf.isRotogramasVisiveis());
                        vm.Enlaces.Novo.Itinerario.Novo.adicionarDesabilitado(mSelf.isRotogramasVisiveis());
                        vm.Enlaces.Novo.visualizarDesabilitado(mSelf.isRotogramasVisiveis());
                        mSelf.desabilitarTodosRotogramas(false);

                        vm.Enlaces.Novo.ClonarEnlace(true);

                        vm.Enlaces.permiteAcaoRotogramas(true);

                        vm.Enlaces.Novo.Itinerario.Novo.permiteAcaoConfigurar(true);

                        vm.Enlaces.setarEventosDesvios();

                        vm.Enlaces.setarEventosItinerarios();

                        vm.Enlaces.Novo.PossuiAlteracao(true);

                        vm.Enlaces.Novo.Itinerario.Novo.permiteAcaoAdicionarRotograma(true);
                    }
                    else
                        abrirModalMensagem("Mensagem", "Não existe trecho selecionado!");
                }
                else
                    vm.cancelarRotogramaConfiguracao();
            }
        };

        mSelf.salvarConfiguracaoRotograma = function () {

            if (mSelf.validarConfiguracaoRotograma() && mSelf.verificarGeracaoRotograma()) {

                var index = vm.Enlaces.Novo.Rotogramas.indexOf(mSelf);

                mSelf.Clone = {};

                mSelf.Clone.Descricao = mSelf.Descricao();

                mSelf.Clone.VelocidadeSemChuva = mSelf.VelocidadeSemChuva();

                mSelf.Clone.VelocidadeComChuva = mSelf.VelocidadeComChuva();

                mSelf.Clone.ParadaPermitida = mSelf.ParadaPermitida();

                mSelf.Clone.PossuiRestricaoHorario = mSelf.PossuiRestricaoHorario();

                mSelf.Clone.RestricaoDe = mSelf.RestricaoDe();

                mSelf.Clone.RestricaoAte = mSelf.RestricaoAte();


                mSelf.Descricao($("#txtDescricaoTrecho").val());
                mSelf.VelocidadeSemChuva(parseInt($("#txtVelocidadeMaximaSemChuva").val()));
                mSelf.VelocidadeComChuva(parseInt($("#txtVelocidadeMaximaComChuva").val()));

                if ($("#ckParadaPermitida").is(':checked'))
                    mSelf.ParadaPermitida("T");
                else
                    mSelf.ParadaPermitida("F");

                if ($("#ckRestricaoHorario").is(':checked'))
                    mSelf.PossuiRestricaoHorario("T");
                else
                    mSelf.PossuiRestricaoHorario("F");

                if ($("#ckRestricaoHorario").is(':checked')) {

                    mSelf.RestricaoDe($("#txtRestricaoHorarioDe").val());
                    mSelf.RestricaoAte($("#txtRestricaoHorarioAte").val());
                }
                else {

                    mSelf.RestricaoDe(null);
                    mSelf.RestricaoAte(null);
                }

                vm.Enlaces.Novo.Rotogramas()[index] = mSelf;

                vm.Enlaces.Novo.Rotogramas.valueHasMutated();

                var novoHtml = mSelf.gerarInfoWindow();

                mSelf.polylineRotograma.infoWindow.setContent(novoHtml);

                mSelf.polylineRotograma.infoWindow.open(map);

                mSelf.isConfigurarRotograma(false);

                vm.visualizarConfiguracaoRotograma(false);

                mostrarGuia("guiamapa");

                mSelf.editarPontosDesabilitado(false);

                mSelf.configurarDesabilitado(false);

                mSelf.excluirDesabilitado(false);

                mSelf.permiteAcaoBotoes(true);
            }
        };

        mSelf.cancelarConfiguracaoRotograma = function () {

            //mSelf.Clone = null;

            mSelf.isConfigurarRotograma(false);

            mSelf.polylineRotograma.infoWindow.open(map);

            vm.visualizarConfiguracaoRotograma(false);

            mostrarGuia("guiamapa");

            mSelf.editarPontosDesabilitado(false);

            mSelf.configurarDesabilitado(false);

            mSelf.excluirDesabilitado(false);

            mSelf.permiteAcaoBotoes(true);
        };

        mSelf.cancelarDadosConfiguracaoRotograma = function () {

            if (mSelf.Clone != null) {

                var index = vm.Enlaces.Novo.Rotogramas.indexOf(mSelf);

                mSelf.Descricao(mSelf.Clone.Descricao);

                mSelf.VelocidadeSemChuva(mSelf.Clone.VelocidadeSemChuva);

                mSelf.VelocidadeComChuva(mSelf.Clone.VelocidadeComChuva);

                mSelf.ParadaPermitida(mSelf.Clone.ParadaPermitida);

                mSelf.PossuiRestricaoHorario(mSelf.Clone.PossuiRestricaoHorario);

                mSelf.RestricaoDe(mSelf.Clone.RestricaoDe);

                mSelf.RestricaoAte(mSelf.Clone.RestricaoAte);

                vm.Enlaces.Novo.Rotogramas()[index] = mSelf;

                vm.Enlaces.Novo.Rotogramas.valueHasMutated();

                var novoHtml = mSelf.gerarInfoWindow();

                mSelf.polylineRotograma.infoWindow.setContent(novoHtml);

                mSelf.polylineRotograma.infoWindow.open(map);

                mSelf.isConfigurarRotograma(false);

                mSelf.Clone = null;

                vm.visualizarConfiguracaoRotograma(false);

                mostrarGuia("guiamapa");
            }
        };

        mSelf.validarConfiguracaoRotograma = function () {

            if ($("#txtDescricaoTrecho").val() != null && $("#txtDescricaoTrecho").val().trim() != "") {

                if ($("#txtVelocidadeMaximaSemChuva").val() != null && $("#txtVelocidadeMaximaSemChuva").val().trim() != "") {

                    if ($("#txtVelocidadeMaximaComChuva").val() != null && $("#txtVelocidadeMaximaComChuva").val().trim() != "") {

                        try {

                            parseInt($("#txtVelocidadeMaximaComChuva").val().trim());
                        }
                        catch (ex) {

                            abrirModalMensagem("Mensagem", "Valor inválido para o campo velocidade máxima com chuva!");

                            return false;
                        }

                        try {

                            parseInt($("#txtVelocidadeMaximaSemChuva").val().trim());
                        }
                        catch (ex) {

                            abrirModalMensagem("Mensagem", "Valor inválido para o campo velocidade máxima sem chuva!");

                            return false;
                        }
                    }
                    else {

                        abrirModalMensagem("Mensagem", "O campo velocidade máxima com chuva deve ser preenchido com um valor válido!");

                        return false;
                    }
                }
                else {

                    abrirModalMensagem("Mensagem", "O campo velocidade máxima sem chuva deve ser preenchido com um valor válido!");

                    return false;
                }
            }
            else {

                abrirModalMensagem("Mensagem", "Preencha o campo descrição do trecho.");

                return false;
            }

            if ($("#ckRestricaoHorario").is(':checked')) {

                if ($("#txtRestricaoHorarioDe").val() != null && $("#txtRestricaoHorarioDe").val().trim() != "") {

                    if ($("#txtRestricaoHorarioAte").val() != null && $("#txtRestricaoHorarioAte").val().trim() != "") {

                        try {

                            parseInt($("#txtRestricaoHorarioDe").val().trim());
                        }
                        catch (ex) {

                            abrirModalMensagem("Mensagem", "Valor inválido para o campo \"restrição horário de\"!");

                            return false;
                        }

                        try {

                            parseInt($("#txtRestricaoHorarioAte").val().trim());
                        }
                        catch (ex) {

                            abrirModalMensagem("Mensagem", "Valor inválido para o campo \"restrição horário até\"!");

                            return false;
                        }

                        if (parseInt($("#txtRestricaoHorarioDe").val().trim()) >= parseInt($("#txtRestricaoHorarioAte").val().trim())) {

                            abrirModalMensagem("Mensagem", "O campo \"restrição de\" deve ser menor que o \"restrição até\"!");

                            return false;
                        }
                    }
                    else {

                        abrirModalMensagem("Mensagem", "Preencha o campo restrição de horário de.");

                        return false;
                    }
                }
                else {

                    abrirModalMensagem("Mensagem", "Preencha o campo restrição de horário até.");

                    return false;
                }
            }

            return true;
        };

        mSelf.desativarAcoes = function () {

            mSelf.isEditarPontosRotograma(false);
            mSelf.isConfigurarRotograma(false);
            mSelf.isExcluirRotograma(false);
        };

        mSelf.limparEventosRotograma = function () {

            google.maps.event.clearListeners(mSelf.polylineRotograma, 'click');
        };

        mSelf.limparEventosRotogramaPolinhaSelecao = function () {

            if (mSelf.ItinerarioRotograma) {
                
                google.maps.event.clearListeners(mSelf.ItinerarioRotograma.polylinha, 'click');

                google.maps.event.clearListeners(mSelf.ItinerarioRotograma.polylinhaSelecionada, 'click');
            }
        };

        mSelf.adicionarEventosPolilinhaRotograma = function () {

            google.maps.event.addListener(mSelf.polylineRotograma, 'click', function (event) { mSelf.infoWindowPolylineRotograma(); });
        };

        mSelf.adicionarEventosPolilinhaRotogramaSelecao = function () {

            google.maps.event.clearListeners(mSelf.ItinerarioRotograma.polylinha, 'click');

            google.maps.event.addListener(mSelf.ItinerarioRotograma.polylinha, 'click', function (event) { mSelf.ItinerarioRotograma.click(event); });
        };

        mSelf.setarAcoesRotogramaEspecifico = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {
             
                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    if (rotograma === mSelf)
                        rotograma.polylineRotograma.infoWindow.setMap(map);
                    else
                        rotograma.polylineRotograma.infoWindow.setMap(null);
                });
            }
        };

        mSelf.setarClickRotograma = function () {
            mSelf.polylineRotograma.infoWindow.setMap(map);
        };

        mSelf.setarAcoesTodosRotogramas = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    rotograma.polylineRotograma.setPath([]);

                    rotograma.ItinerarioRotograma = rotograma.localizarItinerario();

                    if (rotograma.ItinerarioRotograma) {
                        rotograma.ItinerarioRotograma.polylinha.setMap(map);
                        if (rotograma.ItinerarioRotograma == vm.Enlaces.Novo.Itinerario.Novo) {
                            vm.Enlaces.Novo.visualizandoItinerarioEnlace(true);
                        } 
                    }

                    rotograma.setarPontosPorRotograma(null);

                    rotograma.isRotogramaAtivo(false);
                    rotograma.isRotogramasVisiveis(false);
                    rotograma.isEditarPontosRotograma(false);
                    rotograma.isConfigurarRotograma(false);
                    rotograma.isExcluirRotograma(false);

                    rotograma.cancelarAcoesTodosRotogramas();

                    rotograma.polylineRotograma.setMap(map);

                    rotograma.polylineRotograma.infoWindow.setMap(null);
                });
            }

            vm.visualizarConfiguracaoRotograma(false);

            mostrarGuia("guiamapa");
        };

        mSelf.setarPontosPorRotograma = function (enlace) {
            
            var pontos = null;

            if (enlace == null)
                enlace = vm.Enlaces.Novo;

            ko.utils.arrayForEach(enlace.Itinerario.Novo.polylinha.getPath().getArray(), function (ponto) {
                
                if (ponto.CodigoRotograma) {
                    
                    if (ponto.CodigoRotograma == mSelf.Codigo()) {

                        mSelf.polylineRotograma.getPath().push(ponto);

                        pontos = enlace.Itinerario.Novo.polylinha.getPath().getArray();
                    }
                }
            });

            if (pontos == null) {
                
                ko.utils.arrayForEach(enlace.Desvios.Lista(), function (desvio) {

                    ko.utils.arrayForEach(desvio.Itinerario.Novo.polylinha.getPath().getArray(), function (ponto) {

                        if (ponto.CodigoRotograma) {
                            
                            if (ponto.CodigoRotograma == mSelf.Codigo()) {

                                mSelf.polylineRotograma.getPath().push(ponto);

                                pontos = desvio.Itinerario.Novo.polylinha.getPath().getArray();
                            }
                        }
                    });
                });
            }

            if (pontos != null) {

                mSelf.setarSequencia(pontos);

                var posicao = mSelf.polylineRotograma.getPath().getAt(0);

                var centro = new google.maps.LatLng(posicao.lat(), posicao.lng(), false);

                if (mSelf.polylineRotograma.infoWindow == null) {

                    mSelf.polylineRotograma.infoWindow = new google.maps.InfoWindow();

                    var novoHtml = mSelf.gerarInfoWindow();

                    mSelf.polylineRotograma.infoWindow.setContent(novoHtml);
                }

                mSelf.polylineRotograma.infoWindow.setPosition(centro);
            }
            else {

                mSelf.removerCodigoRotogramaItinerario();

                enlace.Rotogramas.remove(mSelf);
            }
        };

        mSelf.localizarItinerario = function () {
            var itinerario;
            for (var index in vm.Enlaces.Novo.Itinerario.Novo.polylinha.getPath().getArray()) {
                var pontoItinerario = vm.Enlaces.Novo.Itinerario.Novo.polylinha.getPath().getArray()[index];
                if (pontoItinerario.CodigoRotograma) {
                    if (pontoItinerario.CodigoRotograma == mSelf.Codigo()) {
                        return vm.Enlaces.Novo.Itinerario.Novo;
                    }
                }
            }

            for (var indexLista in vm.Enlaces.Novo.Desvios.Lista()) {
                var desvio = vm.Enlaces.Novo.Desvios.Lista()[indexLista];
                for (var item in desvio.Itinerario.Novo.polylinha.getPath().getArray()) {
                    var ponto = desvio.Itinerario.Novo.polylinha.getPath().getArray()[item];
                    if (ponto.CodigoRotograma) {
                        if (ponto.CodigoRotograma == mSelf.Codigo()) {
                            return desvio.Itinerario.Novo;
                        }
                    }
                }
            }
        };

        mSelf.setarSequencia = function (pontos) {

            for (var indexInicial in pontos) {

                if (pontos[indexInicial].CodigoRotograma && pontos[indexInicial].CodigoRotograma == mSelf.Codigo()) {

                    mSelf.SequenciaInicial(parseInt(indexInicial));

                    break;
                }
            }

            for (var indexFinal = pontos.length - 1; indexFinal >= 0; indexFinal--) {

                if (pontos[indexFinal].CodigoRotograma && pontos[indexFinal].CodigoRotograma == mSelf.Codigo()) {

                    mSelf.SequenciaFinal(indexFinal);

                    break;
                }
            }
        }

        mSelf.removerAcoesTodosRotogramas = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    rotograma.isRotogramaAtivo(false);
                    rotograma.isRotogramasVisiveis(false);
                    rotograma.isEditarPontosRotograma(false);
                    rotograma.isConfigurarRotograma(false);
                    rotograma.isExcluirRotograma(false);

                    rotograma.limparEventosRotograma();

                    rotograma.polylineRotograma.infoWindow.setMap(null);
                });
            }

            vm.visualizarConfiguracaoRotograma(false);

            mostrarGuia("guiamapa");
        };

        mSelf.cancelarAcoesTodosRotogramas = function () {

            mSelf.isRotogramaAtivo(false);

            mSelf.isRotogramasVisiveis(false);

            mSelf.desativarAcoes();

            mSelf.limparEventosRotograma();

            mSelf.adicionarEventosPolilinhaRotograma();
        };

        mSelf.desabilitarAcaoAdicionar = function () {

            if (mSelf.ItinerarioRotograma)
                mSelf.ItinerarioRotograma.permiteAdicionarRotogramaAcao(false);
        };

        mSelf.esconderRotogramas = function (){
            
            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    rotograma.isRotogramaAtivo(false);
                    rotograma.isRotogramasVisiveis(false);
                    rotograma.isEditarPontosRotograma(false);
                    rotograma.isConfigurarRotograma(false);
                    rotograma.isExcluirRotograma(false);

                    rotograma.limparEventosRotograma();

                    rotograma.polylineRotograma.infoWindow.setMap(null);
                    rotograma.polylineRotograma.setMap(null);
                });
            }

            vm.visualizarConfiguracaoRotograma(false);

            mostrarGuia("guiamapa");
        }

        mSelf.esconderRotogramaEspecifico = function () {
            mSelf.isRotogramaAtivo(false);
            mSelf.isRotogramasVisiveis(false);
            mSelf.isEditarPontosRotograma(false);
            mSelf.isConfigurarRotograma(false);
            mSelf.isExcluirRotograma(false);

            mSelf.limparEventosRotograma();

            mSelf.polylineRotograma.infoWindow.setMap(null);
            mSelf.polylineRotograma.setMap(null);
        }

        mSelf.verificarPosicaoRotogramaItinerario = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    rotograma.polylineRotograma.getPath().clear();

                    var path = rotograma.polylineRotograma.getPath();

                    if (rotograma.ItinerarioRotograma == null)
                        rotograma.ItinerarioRotograma = rotograma.localizarItinerario();

                    for (var index in rotograma.ItinerarioRotograma.polylinha.getPath().getArray()) {

                        if (index >= rotograma.SequenciaInicial() && index <= rotograma.SequenciaFinal())
                            path.push(rotograma.ItinerarioRotograma.polylinha.getPath().getArray()[index]);
                    }


                    if (rotograma.polylineRotograma.infoWindow)
                        rotograma.polylineRotograma.infoWindow.setPosition(rotograma.polylineRotograma.getPath().getArray()[0]);


                    rotograma.setarAcoesTodosRotogramas();

                    rotograma.polylineRotograma.setMap(map);
                });
            }

            vm.visualizarConfiguracaoRotograma(false);

            mostrarGuia("guiamapa");
        };

        mSelf.setarCodigoListaPontosItinerario = function () {

            var pontos = mSelf.ItinerarioRotograma.polylinha.getPath().getArray();

            for (var index in pontos) {

                if (index >= mSelf.SequenciaInicial() && index <= mSelf.SequenciaFinal())
                    pontos[index].CodigoRotograma = mSelf.Codigo();
            }
        };

        mSelf.editarRotogramaPontosRightclick = function (event) {

            var arrayItens = [];

            arrayItens.push({ Texto: "Salvar Novo Trecho", Click: function () { mSelf.salvarNovosPontos(); } });
            arrayItens.push({ Texto: "Cancelar Novo Trecho", Click: function () { mSelf.cancelarEdicaoNovosPontos(); } });

            vm.MenuContexto.show(arrayItens, event);
        };

        mSelf.editarRotogramaRightclick = function (event) {

            var arrayItens = [];

            arrayItens.push({ Texto: "Configurar Rotograma", Click: function () { mSelf.configurarRotograma(); } });
            arrayItens.push({ Texto: "Editar Trecho do Rotograma", Click: function () { mSelf.editarPontosRotograma(); } });
            arrayItens.push({ Texto: "Remover Rotograma", Click: function () { mSelf.removerRotograma(); } });

            vm.MenuContexto.show(arrayItens, event);
        };

        mSelf.clonarDadosRotograma = function (pontos) {
            mSelf.setarSequencia(pontos);

            var item = {};

            item.Codigo = mSelf.Codigo();
            item.Descricao = mSelf.Descricao();
            item.VelocidadeSemChuva = mSelf.VelocidadeSemChuva();
            item.VelocidadeComChuva = mSelf.VelocidadeComChuva();
            item.ParadaPermitida = mSelf.ParadaPermitida();
            item.PossuiRestricaoHorario = mSelf.PossuiRestricaoHorario();
            item.RestricaoDe = mSelf.RestricaoDe();
            item.RestricaoAte = mSelf.RestricaoAte();
            item.SequenciaInicial = mSelf.SequenciaInicial();
            item.SequenciaFinal = mSelf.SequenciaFinal();

            return item;
        };

        mSelf.mostrarTodosRotogramas = function () {
            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {
                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {
                    rotograma.isRotogramaAtivo(false);
                    rotograma.isRotogramasVisiveis(false);
                    rotograma.isEditarPontosRotograma(false);
                    rotograma.isConfigurarRotograma(false);
                    rotograma.isExcluirRotograma(false);

                    rotograma.cancelarAcoesTodosRotogramas();

                    rotograma.polylineRotograma.setMap(map);

                    rotograma.polylineRotograma.infoWindow.setMap(null);
                });
            }
        }

        mSelf.desabilitarTodosRotogramas = function (aux) {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    if (rotograma != mSelf) {
                        rotograma.desabilitado(aux);
                    }
                });
            }
            if (!aux)
                mSelf.desabilitado(aux);
        };

        mSelf.exibirRotogramasEdicaoNovoTrecho = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    if (rotograma != mSelf && rotograma.ItinerarioRotograma === mSelf.ItinerarioRotograma) {

                        google.maps.event.clearListeners(rotograma.polylineRotograma, 'click');

                        google.maps.event.addListener(rotograma.polylineRotograma, 'click', function (event) { rotograma.infoWindowPolylineRotograma(); });

                        rotograma.polylineRotograma.infoWindow.setMap(null);

                        rotograma.polylineRotograma.setMap(map);
                    }
                });
            }
        };

        mSelf.ocultarRotogramasEdicaoNovoTrecho = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    if (rotograma != mSelf && rotograma.ItinerarioRotograma === mSelf.ItinerarioRotograma) {

                        google.maps.event.clearListeners(rotograma.polylineRotograma, 'click');

                        rotograma.polylineRotograma.infoWindow.setMap(null);

                        rotograma.polylineRotograma.setMap(null);
                    }
                });
            }
        };

        mSelf.setarEventoClickRotogramas = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    google.maps.event.clearListeners(rotograma.polylineRotograma, 'click');

                    google.maps.event.addListener(rotograma.polylineRotograma, 'click', function (event) { rotograma.infoWindowPolylineRotograma(); });
                });
            }
        };

        mSelf.validarExclusaoPontosItinerario = function () {

            var totalPontos = 0;

            var pontos = mSelf.ItinerarioRotograma.polylinha.getPath().getArray();

            for (var index in pontos) {

                if (pontos[index].CodigoRotograma && pontos[index].CodigoRotograma == mSelf.Codigo())
                    totalPontos++;
            }

            if (totalPontos >= 2) //O rotograma deve possuir no mínimo 2 (dois) pontos.
                return false;

            return true;
        };

        mSelf.getRotogramaExlusaoItinerario = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                var rotogramaExclusao = ko.utils.arrayFirst(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    if (rotograma.Codigo() == mSelf.Codigo())
                        return rotograma;
                });

                return rotogramaExclusao;
            }

            return null;
        };

        mSelf.habilitarRotogramasVisualizacaoMenu = function () {

            if (vm.Enlaces.Novo.Rotogramas && vm.Enlaces.Novo.Rotogramas().length > 0) {

                ko.utils.arrayForEach(vm.Enlaces.Novo.Rotogramas(), function (rotograma) {

                    rotograma.desabilitado(false);

                    rotograma.isRotogramaAtivo(false);

                    rotograma.isRotogramaEnlaceHabilitado(false);

                    rotograma.isRotogramaDesvioHabilitado(false);
                });
            }
        };
    }

    function localizarRotograma(codigo) {
        for (var e in vm.Enlaces.Lista()) {
            for (var d in vm.Enlaces.Lista()[e].Rotogramas()) {
                var rotograma = vm.Enlaces.Lista()[e].Rotogramas()[d];
                if (rotograma.Codigo() == codigo)
                    return rotograma;
            }
        }
    }

    function localizarRotogramaCopia(codigo) {
        for (var e in vm.CopiaLista()) {
            for (var d in vm.CopiaLista()[e].Rotogramas()) {
                var rotograma = vm.CopiaLista()[e].Rotogramas()[d];
                if (rotograma.Codigo() == codigo)
                    return rotograma;
            }
        }
    }      