// Map.js

var nuclearMapId = 'nuclearMap';
var nuclearMap;
var circlesShapeLayer;

function InitializeMap() {
    nuclearMap = new VEMap(nuclearMapId);

    var mapOptions = new VEMapOptions();
    mapOptions.EnableBirdseye = false;

    var show3D = true;
    if (!CheckBrowserSupports3D())
        show3D = false;

    nuclearMap.LoadMap(null, null, VEMapStyle.Hybrid, null, null, show3D, null, mapOptions);
    circlesShapeLayer = new VEShapeLayer();
    circlesShapeLayer.SetTitle("Blast Radii");

    nuclearMap.AddShapeLayer(circlesShapeLayer);
    circlesShapeLayer.Show();
}

function GenerateRadii() {
    try {
        var location = document.getElementById('locationField').value;

        if (location.length > 0) {
            var what = null;
            var where = location;
            var findType = VEFindType.Businesses;
            var localShapeLayer = null;
            var startIndex = 0;
            var numberOfResults = 1;
            var showResults = false;
            var createResults = false;
            var useDefaultDisambiguation = true;
            var setBestMapView = true;
            nuclearMap.Find(what, where, findType, localShapeLayer, startIndex, numberOfResults, showResults, createResults, useDefaultDisambiguation, setBestMapView, onFindLocationComplete);
        }

    } catch (e) { alert(e.message) }
}

/**
* Called when a call to map.Find() is completed.
*/
function onFindLocationComplete(layer, results, places) {
    if (nuclearMap.GetMapStyle() != VEMapStyle.Oblique) {
        if (places != null && places.length > 0) {
            var place = places[0];
            var latLong = place.LatLong;
            var placeName = place.Name;
        }

        GenerateRadiiAtLocation(latLong);
    }
}

function GenerateRadiiAtLocation(latLong) {
    circlesShapeLayer.DeleteAllShapes();

    var mapZoomLevel = 14;

    var innerCircleRadius = 0.3333;
    var middleCircleRadius = 0.75;
    var outerCircleRadius = 1.0;

    var lineColor = new VEColor(0, 0, 0, 0.2);

    var redFillColor = new VEColor(255, 0, 0, 0.5);
    var greenFillColor = new VEColor(0, 255, 0, 0.5);
    var blueFillColor = new VEColor(0, 0, 255, 0.5);

    var innerCircle = GetCircle(latLong, innerCircleRadius, lineColor, redFillColor);
    var middleCircle = GetCircle(latLong, middleCircleRadius, lineColor, greenFillColor);
    var outerCircle = GetCircle(latLong, outerCircleRadius, lineColor, blueFillColor);

    circlesShapeLayer.AddShape(outerCircle);
    circlesShapeLayer.AddShape(middleCircle);
    circlesShapeLayer.AddShape(innerCircle);

    nuclearMap.SetCenterAndZoom(latLong, mapZoomLevel);
}

function GetCircle(loc, radius, lineColor, fillColor) {
    var earthMeanRadiusMiles = 3959; // earth's mean radius in miles
    var lat = (loc.Latitude * Math.PI) / 180;
    var lon = (loc.Longitude * Math.PI) / 180;

    // d = angular distance covered on earth's surface
    var d = parseFloat(radius) / earthMeanRadiusMiles;

    var points = new Array();
    for (x = 0; x <= 360; x++) {
        var p2 = new VELatLong(0, 0)
        //rad
        brng = x * Math.PI / 180;
        p2.Latitude = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brng));
        p2.Longitude = ((lon + Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(p2.Latitude))) * 180) / Math.PI;
        p2.Latitude = (p2.Latitude * 180) / Math.PI;
        points.push(p2);
    }

    var circle = new VEShape(VEShapeType.Polygon, points);
    circle.SetLineColor(lineColor);
    circle.SetFillColor(fillColor);
    circle.HideIcon();
    return circle;
}

