﻿/// <reference path="Hashtable.js" />

var LAYER_NEW_BUILDS = "New Construction";
var LAYER_SBA = "SBA Owned";
var LAYER_AAT = "AAT Managed";
var LAYER_TRILLION = "Trillion";
var LAYER_UPR_GROUP = "Union Pacific Railroad";
var LAYER_UPR_MP = "Milepost Markers";
var LAYER_UPR_TRACK = "Track";
var LAYER_DAS = "DAS Node";
var LAYER_CANADIAN_SITES = "Canadian Sites";
var LAYER_STATE_OF_MICHIGAN = "State of Michigan";

var myMap;          // This is the global variable to GMap2 object
var sitesLayer;     // This holds the SBA site overlay
var sitesLayerURL = "";  // the service URL set in code behind
var findTask;       // esri find task object
var idtask;         // esri identify object
var geocoder;       // google geocoder object
var mapExtension;   // esri object to control adding layers
var info = [];      // holds the info popup descriptions, definitions are in the internal/external code.js file
var UserName = "";  // the user name of the client user if known
var rtClickedPoint = null;  // holds the lat/long of a right mouse click

var gsvc = null;
var buffers = [];

var measurePolyline = null;
var meters2miles = 0.000621371192;

Array.prototype.contains = function(obj) { var i = this.length; while (i--) { if (this[i] === obj) { return true; } } return false; }

var PointsToBuffer = [];

function BufferWindowClosed(window) {
    
    if (window.argument == undefined)
        return;

    var returnArg = window.argument;
    
    //buffer parameters
    var buffParams = new esri.arcgis.gmaps.BufferParameters();
    buffParams.unit = esri.arcgis.gmaps.SRUnitType.STATUTE_MILE;
    buffParams.geometries = PointsToBuffer;
    buffParams.bufferSpatialReference = 4326;  //102113;
    buffParams.unionResults = returnArg.UnionResults;
    buffParams.distances = returnArg.Radius;

    var overlayOptions = { fillOpacity: returnArg.FillOpacity, fillColor: returnArg.FillColor, strokeOpacity: returnArg.StrokeOpacity, strokeColor: returnArg.StrokeColor };

    gsvc.buffer(buffParams, function(results) {
        var ov = mapExtension.addToMap(results, overlayOptions);
        buffers.push(ov);
    });
}

function MenuClicked(index) {
    var tooltipID = "header1_RadToolTip" + index.toString();
    
    var radToolTip = $find(tooltipID);
    var activeTooltip = Telerik.Web.UI.RadToolTip.getCurrent();

    if (activeTooltip != null)
        activeTooltip.hide();

    if (radToolTip != activeTooltip)
        radToolTip.show();
}

function AlertError(error) {
    alert("Error " + error.code + ": " + (error.message || (error.details && error.details.join(" ")) || "Unknown error"));
}

function ClearBuffers() {
    for (var i = 0; i < buffers.length; i++)
        mapExtension.removeFromMap(buffers[i]);
    buffers = [];
}

function SimpleBuffer(point, radius) {
    var points = [];
    points.push(point);

    var buffParams = new esri.arcgis.gmaps.BufferParameters();
    buffParams.unit = esri.arcgis.gmaps.SRUnitType.STATUTE_MILE;
    buffParams.distances = [radius];
    buffParams.geometries = [points];
    buffParams.bufferSpatialReference = 4326;

    gsvc.buffer(buffParams, function(results, error) {

        if (error) {
            AlertError(error);
            return;
        }

        var overlayOptions = { fillOpacity: 0, strokeColor: "#FF0000" };
        var ov = mapExtension.addToMap(results, overlayOptions);
        buffers.push(ov);
    });
}

// function GetLayerVisibility is defined in the Legend UserControl

function SetLayerVisibility(layers) {
    if (layers.length > 0) {
        sitesLayer.show();
        sitesLayer.setVisibleLayers(layers);
    }
    else
        sitesLayer.hide();
}

function RefreshSiteLayer() {
    if (sitesLayer != null)
        sitesLayer.refresh();
}

function FindAddress(street, city, state, zip) {
    var address = "";
    if (street != "") address += "," + street;
    if (city != "") address += "," + city;
    if (state != "") address += "," + state;
    if (zip != "") address += "," + zip;
    if (address.length > 1) address = address.substring(1, address.length);

    if (address.length == 0) {
        alert('Please specify the address');
        return;
    }
    
    geocoder.getLatLng(address,
        function(point) {
            if (!point) {
                alert(address + "Address not found");
            } else {
                myMap.setCenter(point, 15);
                myMap.openInfoWindowHtml(point, address.replace(/,/g, "<br/>"));
            }
        }
    );
}

function ZoomToLatLon(latitude, longitude, zoom) {
    var point = new GLatLng(latitude, longitude);
    myMap.setCenter(point, zoom);
    return point;
}

function FindLatLon(latitude, longitude, zoom) {
    var point = ZoomToLatLon(latitude, longitude, zoom);
    myMap.openInfoWindowHtml(point, latitude.toString() + ',' + longitude.toString());
}

function doIdentify(point) {

    var mylayers = sitesLayer.getLayerDefinitions();
    
    var visible = GetLayerVisibility();
    if (visible.length == 0) {
        alert("No layers visible to identify on.");
        return;
    }
    var dim = myMap.getSize();
    var idparams = new esri.arcgis.gmaps.IdentifyParameters();
    idparams.geometry = point;
    idparams.tolerance = 5;
    idparams.bounds = myMap.getBounds();
    idparams.width = dim.width;
    idparams.height = dim.height;
    idparams.layerIds = visible;
    idtask.execute(idparams, function(idresults, error) {

        if (error) {
            AlertError(error);
            return;
        }

        if (idresults.identifyResults.length == 0) {
            alert("Nothing found.");
            return;
        }
        var firstFeature = idresults.identifyResults[0];
        var html = info[firstFeature.layerName];
        html = applyAttributes(info[firstFeature.layerName], firstFeature.feature.attributes);
        var pnt = null;
        try { pnt = firstFeature.feature.geometry[0].getLatLng(); }
        catch (e) { pnt = point; }
        myMap.openInfoWindowHtml(pnt, html);
    });
}

function SelectChanged() {
    var objListBox = document.getElementById("resultsSelect");
    var x = parseInt(objListBox.value);
    var opt = objListBox[x];
    myMap.setCenter(opt.latlng, 11);
    myMap.openInfoWindowHtml(opt.latlng, opt.html);
}

function FindSite() {
    var objListBox = document.getElementById("resultsSelect");
    objListBox.length = 0;
    var visible = GetLayerVisibility();
    if (visible.length == 0) {
        alert("No layers visible to search on.");
        return;
    }
    params = new esri.arcgis.gmaps.FindParameters();
    params.layerIds = GetLayerVisibility();
    params.searchFields = ["SiteCode", "SiteName"];
    params.searchText = document.getElementById("txtFindSite").value;
    findTask.execute(params, function(findresults, error) {

        if (error) {
            AlertError(error);
            return;
        }

        var optionTexts = new Array();

        for (var x = 0; x < findresults.findResults.length; x++) {
            var f = findresults.findResults[x];

            var optText = "";
            if (f.displayFieldName == "SiteCode")
                optText = " (" + f.feature.attributes["SiteName"] + ")";
            optText = f.feature.attributes[f.displayFieldName] + optText;

            if (optionTexts.contains(optText) == false) {
                var latlng = f.feature.geometry[0].getLatLng();
                var newOpt = document.createElement("option");
                var html = applyAttributes(info[f.layerName], f.feature.attributes);
                newOpt.text = optText;
                newOpt.value = x;
                newOpt.html = html;
                newOpt.latlng = latlng;
                objListBox.options[x] = newOpt;
                optionTexts.push(optText);
            }
        }
    });
}

function MapPaneResized() { myMap.checkResize(); }

function sitesLayerLoaded(ov, error) {

    if (error) {
        AlertError(error);
        return;
    }

    myMap.addOverlay(ov);
    RunPostLoad(ov);

    GEvent.addListener(ov, "update", MapImageUpdated);
    
    alert('Right click the map for more tool options');
}

function applyAttributes(text, attributes) {
    if (text == undefined)
        return "I'm not sure what this is.";
    var html = text;
    var start = html.search(/\{/);
    var end = 0;
    var word = "";
    while (start >= 0) {
        end = html.search(/\}/);
        word = html.substring(start + 1, end);
        html = html.replace("{" + word + "}", attributes[word]);
        start = html.search(/\{/);
    }
    return html;
}


function SplitterLoaded() {

    if (GBrowserIsCompatible()) {
        
        ShowLoading();
        
        myMap = new GMap2(document.getElementById("map"), { draggableCursor: "crosshair", draggingCursor: "move" });
        myMap.enableScrollWheelZoom();
        myMap.addControl(new GLargeMapControl());
        myMap.addControl(new GScaleControl());
        myMap.addMapType(G_PHYSICAL_MAP);
        myMap.addControl(new GMapTypeControl());
        myMap.addControl(new DragZoomControl({}, { overlayRemoveTime: 0 }, {}), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10, 280)));
        myMap.setCenter(new GLatLng(39,-96), 4);

        mapExtension = new esri.arcgis.gmaps.MapExtension(myMap);
        sitesLayer = new esri.arcgis.gmaps.DynamicMapServiceLayer(sitesLayerURL, null, null, sitesLayerLoaded);
        //GEvent.addListener(sitesLayer, "update", MapDoneDrawing);       
        findTask = new esri.arcgis.gmaps.FindTask(sitesLayerURL);
        idtask = new esri.arcgis.gmaps.IdentifyTask(sitesLayerURL);
        geocoder = new GClientGeocoder();

        GEvent.addListener(myMap, "mousemove", function(latlng) {
            window.status = latlng.lng() + ", " + latlng.lat();
        });

        GEvent.addListener(myMap, "zoomend", function(oldlevel, newlevel) {
            if (newlevel < 4)
                myMap.setZoom(4);
        });
        
        esri.arcgis.gmaps.Config.proxyUrl = "proxy.ashx";
        GEvent.addListener(myMap, "singlerightclick", MapRightClicked);
    }
}

function LegendNodeChecked(node, eventArg) {
    ShowLoading();
}

function MapImageUpdated() {
    HideLoading();
}

function ShowLoading() {
    document.getElementById("SplashScreen").className = "ShownSplash";
    document.getElementById("SplashScreenText").className = "ShownSplashText";
}

function HideLoading() {
    document.getElementById("SplashScreen").className = "HiddenSplash";
    document.getElementById("SplashScreenText").className = "HiddenSplashText";
}

function MapRightClicked(point, src, overlay) {
    rtClickedPoint = myMap.fromContainerPixelToLatLng(point);
}

function MapMenuContextClicked(sender, eventArgs) {
    var item = eventArgs.get_item();
    var text = item.get_text();
    var value = item.get_value();

    switch (value) {
        case "Identify":
            doIdentify(rtClickedPoint);
            break;
        case "AddPoint":
            var ctrlLat = $get("MarkerDataGrid1_HiddenLatitude");
            var ctrlLon = $get("MarkerDataGrid1_HiddenLongitude");
            ctrlLat.value = rtClickedPoint.lat();
            ctrlLon.value = rtClickedPoint.lng();
            __doPostBack('MarkerDataGrid1$HiddenLinkButton', '');
            break;
        case "Ignore":
            break;
        case "ClearBuffers":
            ClearBuffers();
            break;
        case "Measure":

            if (measurePolyline != null)
                return;

            // create base measure polyline
            measurePolyline = new GPolyline([rtClickedPoint], "#0000FF", 2, 1.0);
            myMap.addOverlay(measurePolyline);
            measurePolyline.enableDrawing();

            GEvent.addListener(measurePolyline, "endline", MeasureCompleted);

            //            var listener1 = GEvent.addListener(measurePolyline, "endline", function() {
            //                GEvent.removeListener(listener1);
            //                gsvc.getLengths([[measurePolyline]], MeasureCompleted);
            //            });

            break;
        case "Buffer":
            PointsToBuffer = [];
            PointsToBuffer.push(rtClickedPoint);
            var oWnd = radopen(null, "BufferWindow");
            break;
    }
}

function MeasureCompleted() {
    myMap.removeOverlay(measurePolyline);
    var miles = measurePolyline.getLength() * meters2miles;
    measurePolyline = null;
    alert(miles + " Miles");
}
                
//function MeasureCompleted(results, error) {
//    myMap.removeOverlay(measurePolyline);
//    if (error) {
//        AlertError(error);
//        return;
//    }
//    measurePolyline = null;
//    var l = results.lengths[0] * 0.000621371192;
//    alert(l.toString() + " miles");
//    myMap.getDragObject().setDraggableCursor("crosshair");
//    myMap.getDragObject().setDraggingCursor("move");
//}

var contextHideHandler = null;

// this function hides the context menu when mouse moves away
function OnClientShowingHandler(sender, args) {
    var element = sender.get_contextMenuElement();
    contextHideHandler = function(e) {
        var relatedTarget = e.rawEvent.relatedTarget || e.rawEvent.toElement;
        if (!$telerik.isDescendantOrSelf(element, relatedTarget)) {
            sender.hide();
            $removeHandler(element, "mouseout", contextHideHandler);
            return;
        }
    };

    $addHandler(element, "mouseout", contextHideHandler);
}
