var pontoParadaMarkerSelecionado = null;
function Mapa() {
    this.mapOptions = function (o) {
        if (typeof (o) !== "undefined")
            this.gMap.setOptions(o);
    };

    var mapDivId = "map";
    this.MapDivId = function (pId) {
        if (typeof (pId) === "undefined")
            return mapDivId;
        mapDivId = pId;
    };
    this.MapDiv = function () {
        return document.getElementById(mapDivId);
    };

    var centro = new google.maps.LatLng(-14, -54);
    this.Centro = function (pLatLng) {
        if (typeof (pLatLng) === "undefined")
            return this.Centro;
        centro = pLatLng;
    };

    var zoom = 4;
    this.Zoom = function (pZoom) {
        if (typeof (pZoom) === "undefined")
            return this.zoomInicial;
        zoom = pZoom;
    };

    var gMap = null;
    this.getMap = function () {
        return gMap;
    };
    this.GMap = function () {
        var mapOptions = {
            zoom: 5,
            center: new google.maps.LatLng(-21.292933, -46.57082)
        };

        //center: new google.maps.LatLng(-21.292933, -46.57082)

        /*if (_isMobile) {
        // Enable the visual refresh
        google.maps.visualRefresh = true;
        }*/

        gMap = new google.maps.Map(this.MapDiv(), mapOptions);
    };

    this.Listener = function (pEvento, pMetodo) {
        google.maps.event.addListener(gMap, pEvento, pMetodo);
    }

    this.removeListners = function () {
        google.maps.event.clearListeners(gMap, 'rightclick');
    }
}

function AddGoogleMapsListener() {
    var mapObject = null;
    var event = null;
    var method = null;

    this.MapObject = function (pMapObj) {
        if (typeof (pMapObj) === "undefined")
            return this.mapObject;
        mapObject = pMapObj;
    }

    this.Event = function (pEvent) {
        if (typeof (pEvent) === "undefined")
            return this.event;
        event = pEvent;
    }

    this.Method = function (pMethod) {
        if (typeof (pMethod) === "undefined")
            return this.method;
        method = pMethod;
    }

    this.addListener = function () {
        google.maps.event.addListener(mapObject, event, method);
    }
}

function deletePolylines(array) {
    for (var i = 0; i < array.length; i++) {
        array[i].setMap(null);
    }
    array = [];
}

function zoomPolyline(polyline) {
    try {

        var ret = new google.maps.LatLngBounds();
        var aux = null;
        path = polyline.getPath();

        for (var j = 0; j < path.length; j++) {
            ret.extend(path.getAt(j));
        }

        polyline.getMap().panToBounds(ret);

        return ret;
    } catch (e) {
        alert("Javascript: Erro ao dar zoom nas formas. => " + e.message);
    }
}

function distanceToLine(pt1, pt2, pt) {
    var deltaX = pt2.lng() - pt1.lng();
    var deltaY = pt2.lat() - pt1.lat();

    var incIntersect = (pt.lng() - pt1.lng()) * deltaX;
    incIntersect += (pt.lat() - pt1.lat()) * deltaY;

    var deltaSum = (deltaX * deltaX) + (deltaY * deltaY);
    if (deltaSum > 0)
        incIntersect /= deltaSum;
    else
        incIntersect = -1;

    if (incIntersect < 0) // A interseção ocorre fora do segmento de reta, "antes" do pt1.
        return kmTo(pt, pt1);
    else if (incIntersect > 1) // A interseção ocorre fora do segmento de reta, "depois" do pt2.
        return kmTo(pt, pt2);

    //Cálculo do ponto de interseção.
    var intersect = new google.maps.LatLng(pt1.lat() + incIntersect * deltaY, pt1.lng() + incIntersect * deltaX)
    return kmTo(pt, intersect);

};

function kmTo(pt1, pt2) {
    var e = Math, ra = e.PI / 180;
    var b = pt1.lat() * ra, c = pt2.lat() * ra, d = b - c;
    var g = pt1.lng() * ra - pt2.lng() * ra;
    var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d / 2), 2) + e.cos(b) * e.cos(c) * e.pow(e.sin(g / 2), 2)));
    return f * 6378.137 * 1000;
};

function distanciaMetrosTo(pt1, pt2) {
    var e = Math, ra = e.PI / 180;
    var b = pt1.lat() * ra, c = pt2.lat() * ra, d = b - c;
    var g = pt1.lng() * ra - pt2.lng() * ra;
    var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d / 2), 2) + e.cos(b) * e.cos(c) * e.pow(e.sin(g / 2), 2)));
    return f * 6378.137 * 1000;
};

function Polilinha(settings) {
    google.maps.Polyline.apply(this, settings);
}

google.maps.Polyline.prototype.navegar = function (e) {
    var key = e.which ? e.which : e.keyCode;
    switch (key) {
        // navegar para frente                                
        case 38: // seta para cima 
        case 39: // seta para direita
            this.navegarFrente(event.shiftKey);
            break;
        // navegar para trás                                
        case 37: // seta para esquerda
        case 40: // seta para baixo
            this.navegarTras(event.shiftKey);
            break;
    }
}

google.maps.Polyline.prototype.navegarFrente = function (multiSelecao) {
    var a = this.getPath().length - 1;

    if (this.segPontoSel < a) {
        this.segPontoSel++;
        if (multiSelecao) {
            this.multiFrente = true;
            if (this.multiTras) {
                if (this.segFim == 0)
                    return;

                this.segFim++;
                if (this.segIni == this.segFim)
                    this.multiTras = false;
                this.segPontoSel = this.segFim;
            } else {
                if (this.segIni == a)
                    return;

                this.segIni++;
                this.segPontoSel = this.segIni;
            }
        } else {
            this.segFim = this.segPontoSel - 1;
            this.segIni = this.segPontoSel;
            this.multiFrente = false;
            this.multiTras = false;
        }
    } else {
        if (this.linhaPosterior) {
            if (this.linhaPosterior.getPath().length < 2) {
                this.linhaPosterior.navegarFrente(multiSelecao);
            }
            this.linhaPosterior.isAlarme = this.isAlarme;
            deselecionarPolilinhas(linhasHistoricosAlarmes);
            this.linhaPosterior.segmento({
                selecionado: true,
                idxIni: 0,
                idxFim: 1,
                Selecao: 0
            });

            this.linhaPosterior.selecionarSegmento(false);
            //this.linhaPosterior.openHistoricoInfo(this.linhaPosterior.isAlarme);
            $(".NavegacaoHistorico").removeClass("hide");
            return;
        }
    }
    this.selecionarSegmento(true);
}

google.maps.Polyline.prototype.navegarTras = function (multiSelecao) {
    var a = this.getPath().length;

    if (this.segPontoSel > 0) {
        this.segPontoSel--;
        if (multiSelecao) {
            this.multiTras = true;
            if (this.multiFrente) {
                if (this.segIni == a)
                    return;

                this.segIni--;
                if (this.segIni == this.segFim)
                    this.multiFrente = false;
                this.segPontoSel = this.segIni;
            } else {
                if (this.segFim == 0)
                    return;

                this.segFim--;
                this.segPontoSel = this.segFim;
            }
        } else {
            this.segFim = this.segPontoSel;
            this.segIni = this.segPontoSel + 1;
            this.multiTras = false;
            this.multiFrente = false;
        }
        
    } else {
        if (this.linhaAnterior) {
            this.linhaAnterior.isAlarme = this.isAlarme;
            deselecionarPolilinhas(linhasHistoricosAlarmes);

            if (this.linhaAnterior.getPath().length == 1) {
                this.linhaAnterior.navegarTras(multiSelecao);
            }

            var indiceInicial = this.linhaAnterior.getPath().length - 2;
            if (indiceInicial < 0) {
                indiceInicial = 0;
            }
            var indiceFinal = this.linhaAnterior.getPath().length - 1;

            this.linhaAnterior.segmento({
                selecionado: true,
                idxIni: indiceInicial,
                idxFim: indiceFinal,
                Selecao: indiceFinal
            });

            this.linhaAnterior.selecionarSegmento(true);
            //this.linhaAnterior.openHistoricoInfo(this.linhaAnterior.isAlarme);
            $(".NavegacaoHistorico").removeClass("hide");
            return;
        }
    }

    this.selecionarSegmento(false);
}

google.maps.Polyline.prototype.segmento = function (o) {
    this.selecionado = o.selecionado;
    if (o.selecionado) {
        this.segIni = o.idxIni;
        this.segPontoSel = o.Selecao ? o.Selecao : o.idxIni;
        this.segFim = o.idxFim;
    }
    else {
        if (this.highlight) {
            this.highlight.setMap(null);
            this.highlight = null;
        }
        if (this.isAlarmeComboio && this.pontoPrincipal) {
            this.pontoPrincipal.setMap(null);
            this.pontoPrincipal = null;
        }
        if (this.isAlarmeComboio && this.pontoComboio) {
            this.pontoComboio.setMap(null);
            this.pontoComboio = null;
        }
    }
}

google.maps.Polyline.prototype.openHistoricoInfo = function (isAlarme, posIniFim) {

    var pt = this.getPath().getAt(this.segPontoSel);  //posIniFim ? this.getPath().getAt(this.segFim) : this.getPath().getAt(this.segIni);

    if (_isMobile && this.isAlarmeComboio) {
        detalhesInfo.Show(this.processarInfo(true, posIniFim));
    }
    var conteudo = this.processarInfo(false, posIniFim);
    if (conteudo.length > 0) {
        if (isAlarme) {
            closeAllInfoWindow(false);
            infoWindowAlarme.setContent(conteudo);
            infoWindowAlarme.setPosition(pt);
            infoWindowAlarme.open(mapa.getMap());
            infoWindowAlarme.isOpen = true;
            this.isAlarme = true;
        } else {
            closeAllInfoWindow(false);
            historicoInfo.setContent(conteudo);
            historicoInfo.setPosition(pt);
            historicoInfo.open(mapa.getMap());
            historicoInfo.isOpen = true;
        }
    }
}

google.maps.Marker.prototype.openPontoParadaInfo = function () {
    if (terminalSelecionado) {
        terminalSelecionado.setOptions({ fillColor: terminalSelecionado.oldDetails });
        terminalSelecionado = null;
    }
    if (pontoParadaMarkerSelecionado) {
        if (pontoParadaMarkerSelecionado.getPosition() == this.getPosition()) {
            this.setIcon('../../Content/Operacoes/images/pp.png');
            pontoParadaMarkerSelecionado = null;
            infoWindowPParada.close();
            if (detalhesInfo) {
                detalhesInfo.Hide();
            }
        }
        else {
            pontoParadaMarkerSelecionado.setIcon('../../Content/Operacoes/images/pp.png');
            this.setIcon('../../Content/Operacoes/images/pp_selected.png');
            pontoParadaMarkerSelecionado = this;

            closeAllInfoWindow(true);
            infoWindowPParada.setContent(this.processarInfo(false));
            infoWindowPParada.open(mapa.getMap(), this);
            infoWindowPParada.isOpen = true;
            if (detalhesInfo && !_isMobile) {
                detalhesInfo.Show(this.processarInfo(true));
            }
        }
    } else {
        closeAllInfoWindow(true);

        this.setIcon('../../Content/Operacoes/images/pp_selected.png');
        pontoParadaMarkerSelecionado = this;

        infoWindowPParada.setContent(this.processarInfo(false));
        infoWindowPParada.open(mapa.getMap(), this);
        infoWindowPParada.isOpen = true;
        if (detalhesInfo && !_isMobile) {
            detalhesInfo.Show(this.processarInfo(true));
        }
    }
}

google.maps.Marker.prototype.openPontoInfo = function (conteudo, infoWindow) {
    if (terminalSelecionado) {
        terminalSelecionado.setOptions({ fillColor: terminalSelecionado.oldDetails });
        terminalSelecionado = null;
    }
    if (pontoParadaMarkerSelecionado) {
        pontoParadaMarkerSelecionado.setIcon('../../Content/Operacoes/images/pp.png');
        pontoParadaMarkerSelecionado = null;
    }

    var pt = this.getPosition();
    if (_isMobile) {
        detalhesInfo.Show(conteudo);
    } else {
        closeAllInfoWindow(true);
        infoWindow.setContent(conteudo);
        infoWindow.setPosition(pt);
        infoWindow.open(mapa.getMap());
        infoWindow.isOpen = true;
    }
}

google.maps.Marker.prototype.openPontoAlarmeInfo = function () {
    var pt = this.getPosition();
    var content = "";
    var ro = false;
    if (_isMobile) {
        if (detalhesInfo.isHide()) {
            detalhesInfo.Show(pt.InformacaoAlarmePainel);
        } else {
            detalhesInfo.Hide();
        }
        if (this.Situacao) {
            content += "<div id='infoAlarme' class='info-window-mobile'>";
            content += "<span style='color: Blue'>";
            content += "<strong>";
            content += descAlarmes[this.RegraOrigem];
            content += "</strong></span><br />";
            ro |= this.RegraOrigem == 10; // Chegada Adiantada
            ro |= this.RegraOrigem == 11; // Chegada Atrasada
            ro |= this.RegraOrigem == 12; // Saída Adiantada
            ro |= this.RegraOrigem == 13; // Saída Atrasada
            //ro |= this.RegraOrigem == 18; // Supressão de Viagem
            if (ro) {
                content += "<strong>";
                content += pt.DataHoraAlarme;
                content += "</strong><br />"
            }

            content += "<span";
            if (ro) {
                content += " style='color: red'";
            }
            content += ">";

            content += this.Situacao;
            content += "</span></div>";

            closeAllInfoWindow(true);
            infoWindowAlarme.RegraOrigem = this.RegraOrigem;
            infoWindowAlarme.setContent(content);
            infoWindowAlarme.open(mapa.getMap(), this);
            infoWindowAlarme.isOpen = true;
        }

        /*
        Porque existe isso?
        historicoInfo.setContent(pt.InformacaoAlarme);
        historicoInfo.setPosition(pt);
        historicoInfo.open(mapa.getMap());*/
    } else if (pt) {
        if (this.isRotograma) {
            content = pt.InformacaoAlarme;
        } else {
            ro = false;
            ro |= this.RegraOrigem == 10; // Chegada Adiantada
            ro |= this.RegraOrigem == 11; // Chegada Atrasada
            ro |= this.RegraOrigem == 12; // Saída Adiantada
            ro |= this.RegraOrigem == 13; // Saída Atrasada

            content = "<strong>Alarme:</strong> ";
            content += "<span class=\"descricao-alarme\">";
            content += pt.InformacaoAlarme.Alarme;
            content += "</span>";
            content += "<br><strong>Enlace:</strong> ";
            content += pt.InformacaoAlarme.Enlace;
            content += "<br><strong>Data:</strong> ";
            content += pt.InformacaoAlarme.DataHora;
            if (ro) {
                content += "<br><strong>Situação:</strong> ";
                content += "<span style='color: red'>";
                content += this.Situacao;
                content += "</span>";
            }
        }
        infoWindowAlarme.setContent(content);

        closeAllInfoWindow(true);
        //historicoInfo.setPosition(pt);
        infoWindowAlarme.open(mapa.getMap(), this);
        infoWindowAlarme.isOpen = true;
    }
}

google.maps.Marker.prototype.processarInfo = function (isCompleto) {
    var contentStoped = $("#contentInfoWindowParado")[0].innerHTML;
    if (isCompleto) {
        contentStoped = $("#contentInfoWindowParadoCompleto")[0].innerHTML;
        if (_isMobile) {
            contentStoped = $("#contentInfoWindowParadoCompleto-mobile")[0].innerHTML;
        }
    }

    var point = this.getPosition();

    var content = contentStoped;

    if (point.parado) {
        content = content.replace(/{DATAHORAINICIO}/gi, point.dataHoraInicio);
        content = content.replace(/{DATAHORAFIM}/gi, point.dataHoraFim);
        content = content.replace(/{DATAHORAINIFIM}/, point.dataHoraIniFim);
        content = content.replace(/{TEMPOPARADO}/gi, point.tempoParado);
        content = content.replace(/{DATAHORA}/, point.dataHora);
        content = content.replace(/{VELOCIDADE}/, point.velocidade);
        content = content.replace(/{SITUACAO}/, point.situacao);
    }
    return content;
}

google.maps.Polyline.prototype.processarInfo = function (painelMobile, posIniFim) {
    var path = this.getPath();
    var posPoint = posIniFim ? this.segFim > this.segIni ? this.segFim : this.segIni : this.segIni < this.segFim ? this.segIni : this.segFim;
    var point = path.getAt(posPoint);
    var content = "";

    if (point === null || typeof(point) === "undefined") {
        return content;
    }

    //var content = point.template;
    if (painelMobile) {
        if (this.isAlarmeComboio) {
            content = $("#contentInfoWindowAlarmeMobileComboio")[0].innerHTML;
        }
        else {
            content = $("#contentInfoWindowAlarme")[0].innerHTML;
        }
    }
    else {
        if (this.templateConteudo) {
            content = $("#" + this.templateConteudo)[0].innerHTML; //contentInfoWindowAlarmeComboio")[0].innerHTML : _isMobile ? $("#contentInfoWindowBalaoSimples")[0].innerHTML : $("#contentInfoWindow")[0].innerHTML;
        }
        else {
            content = _isMobile ? $("#contentInfoWindowBalaoCompleto")[0].innerHTML : $("#contentInfoWindow")[0].innerHTML;
        }
    }
    if (point.CompararVelocidade) {
        content += "<br><strong>Vel. Acima Permitido: </strong> <span style='color:red'>" + (point.velocidade - point.VelocidadeMax + "</span>");
    }
    var unidade = "m";
    var duracao = "{0}h{1}m{2}s";
    var distancia = 0;
    var tempo = 0;
    var pt = null;
    var inicio = 0;
    var fim = 0;

    acao = "verifica troca inicio -> fim";
    if (this.segFim > this.segIni) {
        inicio = this.segIni;
        fim = this.segFim;
    } else {
        inicio = this.segFim;
        fim = this.segIni;
    };
    if (inicio == -1)
        return;

    if (this.isAlarmeComboio) {
        if (point.trecho) {
            distancia = point.trecho.distancia;
            tempo = point.trecho.duracao;
            tempo = tempo < 0 ? tempo * -1 : tempo;
        }
    } else {
        for (var i = inicio + 1; i <= fim; i++) {
            pt = path.getAt(i);
            if (pt) {
                if (pt.trecho) {
                    distancia += pt.trecho.distancia;
                    tempo += pt.trecho.duracao;
                }
            }
        }
    }
    
    if (isNaN(distancia)) {
        distancia = 0;
    } else if (distancia > 1000) {
        distancia = distancia / 1000;
        unidade = "km";
    }

    var dt = new Date(0, 0, 0, 0, 0, 0, tempo);

    duracao = dt.getSeconds() + "s";

    if (dt.getMinutes() >= 1) {
        duracao = dt.getMinutes() + "m" + duracao;
    }

    if (dt.getHours() >= 1) {
        duracao = dt.getHours() + "h" + duracao;
    }

    if (!this.isAlarmeComboio) {
        content = content.replace(/{distancia}/, RoundNumber(distancia, 2));
        content = content.replace(/{distanciaUnidade}/, unidade);
        content = content.replace(/{duracao}/, duracao);
        content = content.replace(/{dataHora}/, point.dataHora);
        content = content.replace(/{velocidade}/, point.velocidade);
        var ro = true;
        if (this.isAlarme) {
            ro = false;
            ro |= point.RegraOrigem == 10; // Chegada Adiantada
            ro |= point.RegraOrigem == 11; // Chegada Atrasada
            ro |= point.RegraOrigem == 12; // Saída Adiantada
            ro |= point.RegraOrigem == 13; // Saída Atrasada
        }
        if (point.situacao && point.situacao.length > 0 && ro) {
            content = content.replace(/{showSituacao}/, "");
            if (point.situacaoForaPadrao) {
                content = content.replace(/{classSituacao}/, " balao-info-situacao");
            }
            content = content.replace(/{situacao}/, point.situacao);
        }
        else {
            content = content.replace(/{showSituacao}/, "hide");
        }

        if (!point.situacao) {
            $("#situacao").addClass("hidden");
        }
        else {
            $("#situacao").removeClass("hidden");
        }
    }
    else {

        content = content.replace(/{IDENTIFICACAOVEICULOPRINCIPAL}/, alarmeInfosAdicionais.VeiculoPrincipalId);
        content = content.replace(/{IDENTIFICACAOVEICULOCOMBOIO}/, alarmeInfosAdicionais.VeiculoParticipanteId);

        content = content.replace(/{DATAHORAPOSICAOPRINCIPAL}/, point.dataHora.split(" ")[1]);
        content = content.replace(/{DATAHORAPOSICAOCOMBOIO}/, this.HistoricoComboio[posPoint].DataHora.split(" ")[1]);
        content = content.replace(/{DIFERENCATEMPO}/, duracao);
        content = content.replace(/{DIFERENCADISTANCIA}/, distancia);
        content = content.replace(/{DISTANCIAUNIDADE}/, unidade);
    }
    return content;
}

google.maps.Polyline.prototype.selecionarSegmento = function (posIniFim) {
    var acao = "";
    try {
        var path = [];
        var _path = this.getPath();
        var inicio = 0;
        var fim = 0;

        acao = "verifica troca inicio -> fim";
        if (this.segFim > this.segIni) {
            inicio = this.segIni;
            fim = this.segFim;
        } else {
            inicio = this.segFim;
            fim = this.segIni;
        };

        acao = "adiciona pontos para iluminar";
        for (var i = inicio; i <= fim; i++) {
            if (_path.getAt(i))
                path.push(_path.getAt(i));
        };

        acao = "seta trecho iluminado";
        if (!this.highlight) {
            this.highlight = CriarPolilinha(new PolilinhaHighlight({
                mapa: this.getMap(),
                pontos: path
            }));
        } else {
            this.highlight.setPath(path);
        }

        var latlngRua;

        acao = "tem dois pontos";
        if (this.highlight.getPath().length == 2) {
            acao = "pega o meio dos dois pontos";
            var lat = (this.highlight.getPath().getAt(0).lat() + this.highlight.getPath().getAt(this.highlight.getPath().length - 1).lat()) / 2;
            var lng = (this.highlight.getPath().getAt(0).lng() + this.highlight.getPath().getAt(this.highlight.getPath().length - 1).lng()) / 2;
            latlngRua = new google.maps.LatLng(lat, lng);
        } else {
            acao = "pega o meio dos pontos";
            var ind = Math.round(this.highlight.getPath().length / 2);
            _path = this.highlight.getPath()
            if (ind == _path.length)
                ind--;
            latlngRua = _path.getAt(ind);
        }
        var _map = this.getMap();
        if (typeof (map) === "undefined") {
            acao = "não tem mapa";
            _map = this.getMap();
        }
        acao = "verifica se tem no centralizar";
        if (typeof (latlngRua) != undefined) {
            if (typeof (_map.getBounds()) === "undefined") {
                acao = "adiciona o centro";
                _map.setCenter(latlngRua);
            } else if (!_map.getBounds().contains(latlngRua)) {
                acao = "adiciona o centro";
                _map.setCenter(latlngRua);
            }
        }

        this.openHistoricoInfo(this.isAlarme, posIniFim);

        if (this.isAlarmeComboio) {
            this.showMarkerComboio(this.segIni, this.segFim, posIniFim, this.HistoricoComboio, this);
        }
    } catch (e) {
        if (acao.length > 0) {
            alert('Javascript: Erro em selecionarSegmento acao: ' + acao + ' => ' + e.message);
        } else {
            alert('Javascript: Erro em Polyline selecionarSegmento => ' + e.message);
        }
    }
}



google.maps.Polyline.prototype.showMarkerComboio = function(segIni, segFim, posIniFim, historicoComboio, polilinha) {
    var posPoint = posIniFim ? segFim > segIni ? segFim : segIni : segIni < segFim ? segIni : segFim;
    var pontoPrincipal = this.getPath().getAt(posPoint);

    if (polilinha.pontoPrincipal) {
        polilinha.pontoPrincipal.setPosition(pontoPrincipal);
    }
    else {
        polilinha.pontoPrincipal = new google.maps.Marker({
            position: pontoPrincipal,
            map: mapa.getMap()
        });
    }
    var hist = historicoComboio[posPoint];

    if (hist === null || typeof (hist) === "undefined") {
        return;
    }
    var ponto = historicoComboio[posPoint].Ponto;

    if (ponto === null || typeof (ponto) === "undefined") {
        return;
    }

    var pt = CriarPosicao({
        lat: ponto.Latitude,
        lng: ponto.Longitude,
        noWrap: false
    });
    if (polilinha.pontoComboio) {
        polilinha.pontoComboio.setPosition(pt);
    } else {
        polilinha.pontoComboio = new google.maps.Marker({
            position: pt,
            map: mapa.getMap(),
            icon: 'https://maps.google.com/mapfiles/ms/icons/blue-dot.png'
        });
    }
}

function LeiCosenos(pt1, pt2) {

    if (pt1 == null || pt2 == null) {
        return Number.NaN;
    }

    var lat1 = DegToRad(ptr1.Latitude);
    var lon1 = DegToRad(ptr1.Longitude);

    var lat2 = DegToRad(ptr2.Latitude);
    var lon2 = DegToRad(ptr2.Longitude);

    return Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1)) * 6371 * 1000;
}