﻿
function MapGeometry()
{
};

MapGeometry.prototype.MilesToRadians = function(miles)
{
    return miles/3963;
};

MapGeometry.prototype.KilometersToRadians = function(kilometers)
{
    return kilometers/6378.8;
};

MapGeometry.prototype.CreateCircle = function(centerLat, centerLon, radius)
{
    var result = null;

    var rCenterLat = (Math.PI/180)*centerLat;
    var rCenterLon = (Math.PI/180)*centerLon;
    var bounds = new GLatLngBounds();
    var gPoints = new Array();
    var pointCounter = 0;
    for(; pointCounter < 361; pointCounter++)
    {
        var tc = (Math.PI/180)*pointCounter;
        var y = Math.asin(Math.sin(rCenterLat)*Math.cos(radius)+Math.cos(rCenterLat)*Math.sin(radius)*Math.cos(tc));
        var dlng = Math.atan2(Math.sin(tc)*Math.sin(radius)*Math.cos(rCenterLat),Math.cos(radius)-Math.sin(rCenterLat)*Math.sin(y));
        var x = ((rCenterLon-dlng+Math.PI) % (2*Math.PI)) - Math.PI;
        var point = new GLatLng(parseFloat(y*(180/Math.PI)), parseFloat(x*(180/Math.PI)));
        gPoints.push(point);
        bounds.extend(point);
    }
    
    if (radius < 1.5678565720686044)
    {
        result = new GPolygon(gPoints, '#1E529E', 2, 1, '#419639', 0.25);
    }
    else
    {
        result = new GPolygon(gPoints, '#1E529E', 2, 1);
    }
    result.InternalBounds = bounds;

    return result;
};

MapGeometry.prototype.IsPointInPolygon = function(point, polygon)
{
    var result = false;

    var bounds = polygon.getBounds();
    if(!bounds.containsLatLng(point))
    {
        return result;
    }
   
    var numPoints = polygon.getVertexCount();
    var i;
    var j = numPoints-1;
   
    for(var i=0; i < numPoints; i++) {
        var vertex1 = polygon.getVertex(i);
        var vertex2 = polygon.getVertex(j);
       
        if (vertex1.lng() < point.lng() && vertex2.lng() >= point.lng() || vertex2.lng() < point.lng() && vertex1.lng() >= point.lng())  {
            if (vertex1.lat() + (point.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < point.lat()) {
                result = !result;
            }
        }
       
        j = i;
    }
   
    return result;
};

MapGeometry.prototype.CalculateDistance = function(_from, _to)
{
    var result = NaN;
    try
    {
        var R = 3963;
        var dLat = (_to.lat() - _from.lat()) * Math.PI / 180;
        var dLon = (_to.lng() - _from.lng()) * Math.PI / 180;
        var lat1 = _from.lat() * Math.PI / 180;
        var lat2 = _to.lat() * Math.PI / 180;
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2)
        * Math.sin(dLon/2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;
        result = Math.round(d);
    }
    catch (error)
    {
        result = NaN;
    }
    return result;
};
