﻿function InitMap(Center, ZoomLevel, Marker, IncludeTopo) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map"));
        map.setUIToDefault();

        map.addControl(new GMapTypeControl());
        map.addMapType(G_PHYSICAL_MAP);
        map.removeMapType(G_HYBRID_MAP);
        if (IncludeTopo === true)
            trimble.myTopo.init(map); 

        if (Center != null && ZoomLevel != null)
            map.setCenter(Center, ZoomLevel);

        if (Marker != null)
            map.addOverlay(Marker);

        return map;
    }
}


// Modify this to set the initial zoom level
var zoomlevel = 4;

var minlat = 90;
var minlon = 180;
var maxlat = -90;
var maxlon = -180;

// Modify this to set the icon types used
//
var red_pin = new GIcon();
red_pin.image = "/Images/mm_20_red.png";
red_pin.shadow = "/Images/mm_20_shadow.png";
red_pin.iconSize = new GSize(12, 20);
red_pin.shadowSize = new GSize(22, 20);
red_pin.iconAnchor = new GPoint(6, 20);
red_pin.infoWindowAnchor = new GPoint(5, 1);

var green_pin = new GIcon();
green_pin.image = "/Images/mm_20_green.png";
green_pin.shadow = "/Images/mm_20_shadow.png";
green_pin.iconSize = new GSize(12, 20);
green_pin.shadowSize = new GSize(22, 20);
green_pin.iconAnchor = new GPoint(6, 20);
green_pin.infoWindowAnchor = new GPoint(5, 1);

function GetGPoint(lon, lat) {

    var lon = parseFloat(lon);
    var lat = parseFloat(lat);

    if (lon < minlon)
        minlon = lon;
    if (lon > maxlon)
        maxlon = lon;
    if (lat < minlat)
        minlat = lat;
    if (lat > maxlat)
        maxlat = lat;

    return new GPoint(lon, lat)
}

// Modify this to map attributes to colors or icon types
function chooseIcon(name, type) {
    if (type == "AIRPORT") {
        return (red_pin)
    }
    if (type == "Dot") {
        return (red_pin)
    }
    return (green_pin);
}

// *****************************************************
// *****************************************************
// Internal function to create a marker with pop-up text
//
function createMarker(map, point, thtml, icon) {
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(thtml);
    });
    map.addOverlay(marker);
    return marker;
}

function showTopoLink(latitude, longitude) {
    var topoUrl = 'http://www.mytopo.com/searchgeo.cfm?pid=texashiking&lat=' + latitude + '&lon=' + longitude;
    $('<a href="' + topoUrl + '" target="new">Order a topo map of this area</a>').appendTo('#mapLinks');
    $('.MyTopoLink').attr('href', topoUrl);
}

function showMap(latitude, longitude, label) {
    var map = new GMap(document.getElementById("map"));
    map.setUIToDefault();
    map.addControl(new GMapTypeControl());
    map.addMapType(G_PHYSICAL_MAP);
    map.removeMapType(G_HYBRID_MAP);
    trimble.myTopo.init(map); 

    var center = new GLatLng(latitude, longitude, false);
    map.setCenter(center, 12, G_PHYSICAL_MAP);
    map.addOverlay(new GMarker(center));

    showTopoLink(center.lat(), center.lng());
}

function showTrackFile(TrackID) {
    var map = new GMap(document.getElementById("map"));
    map.setUIToDefault();
    map.addControl(new GMapTypeControl());
    map.addMapType(G_PHYSICAL_MAP);
    map.removeMapType(G_HYBRID_MAP);
    trimble.myTopo.init(map); 

    showTrackFile2(map, TrackID);
}

function showTrackFile2(map, TrackID) {
    //	Load and parse GPX file
    var request = GXmlHttp.create();
    var URL = "/TrackFiles/GetTrackFile.ashx?TrackFileID=" + TrackID;
    request.open("GET", URL, true);

    request.onreadystatechange = function () {
        if (request.readyState == 4) {
            var gpxDoc = request.responseXML;
            if (!gpxDoc) {
                alert("Could not load GPX document " + URL);
            } else if (!gpxDoc.documentElement) {
                alert("Document " + URL + "\nwas not recognized by the XML loader");
            } else if (gpxDoc.documentElement.childNodes.length < 1) {
                alert("The XML loader could not parse document " + URL);
            } else {
                //	Parse waypoints in <wpt></wpt> tags
                var wpt;
                wpt = gpxDoc.documentElement.getElementsByTagName("wpt")
                if (wpt) {
                    for (var i = 0; i < wpt.length; i++) {

                        point = GetGPoint(wpt[i].getAttribute("lon"), wpt[i].getAttribute("lat"));

                        // Extract <name></name> tag
                        tname = "";
                        tlabel = "";
                        element = wpt[i].getElementsByTagName("name");
                        if (element.length) {
                            tname = element[0].firstChild.nodeValue;
                            tlabel += element[0].firstChild.nodeValue;
                        }

                        // Tack on  <cmt></cmt> tag
                        element = wpt[i].getElementsByTagName("cmt");
                        if (element.length) {
                            if (tlabel) { tlabel += ": "; }
                            tlabel += element[0].firstChild.nodeValue;
                        }

                        // Tack on <desc></desc> tag
                        element = wpt[i].getElementsByTagName("desc");
                        if (element.length) {
                            if (tlabel) { tlabel += " - "; }
                            tlabel += element[0].firstChild.nodeValue;
                        }

                        // Extract <url></url> tag, build html for popup
                        element = wpt[i].getElementsByTagName("url");
                        if (element.length) {
                            turl = element[0].firstChild.nodeValue;
                            var thtml = "<a href=\"" + turl + "target=\"_blank\">" + tlabel + "</a>";
                        } else {
                            var thtml = tlabel;
                        }

                        // Determine map symbol based on <type></type> tag
                        myicon = green_pin;
                        type = wpt[i].getElementsByTagName("type");
                        if (type.length) {
                            myicon = chooseIcon(tname, type[0].firstChild.nodeValue);
                        }

                        createMarker(map, point, thtml, myicon);
                    }
                }
                wpt = [];


                //	Parse routes in <rte></rte>
                //
                var rte;
                rte = gpxDoc.documentElement.getElementsByTagName("rte");
                if (rte) {
                    // Process each route
                    //
                    for (var i = 0; i < rte.length; i++) {
                        tcolor = "#4012FE";
                        twidth = 6;
                        topacity = .7;

                        // Extract <name></name> tag
                        tname = "";
                        element = rte[i].getElementsByTagName("name");
                        if (element.length) {
                            if (element[0].firstChild) {
                                tname = element[0].firstChild.nodeValue;
                            }
                        }

                        // Process each point of each route, string 
                        // them into a single polyline
                        points = [];
                        var rtept = rte[i].getElementsByTagName("rtept");
                        for (var k = 0; k < rtept.length; k++) {
                            points.push(GetGPoint(rtept[k].getAttribute("lon"),
                                                rtept[k].getAttribute("lat")));
                        }
                        map.addOverlay(new GPolyline(points, tcolor, twidth, topacity));
                        points = [];
                    }
                    rte = []
                }

                //	Parse tracks in <trk></trk>
                //
                var trk;
                trk = gpxDoc.documentElement.getElementsByTagName("trk");
                if (trk) {
                    // Process each track
                    for (var i = 0; i < trk.length; i++) {
                        tcolor = "#4012FE";
                        twidth = 4;
                        topacity = .7;

                        // Extract <name></name> tag
                        tname = "";
                        element = trk[i].getElementsByTagName("name");
                        if (element.length) {
                            if (element[0].firstChild) {
                                tname = element[0].firstChild.nodeValue;
                            }
                        }

                        // Process each point of each track, string 
                        // them into a single polyline
                        points = [];
                        var trkpt = trk[i].getElementsByTagName("trkpt");
                        for (var k = 0; k < trkpt.length; k++) {
                            points.push(GetGPoint(trkpt[k].getAttribute("lon"),
                                                trkpt[k].getAttribute("lat")));
                        }
                        map.addOverlay(new GPolyline(points, tcolor, twidth, topacity));
                        points = [];
                    }
                    trk = []
                }

                // Now determine the mid point of all of the markers and center the map there.
                zoomlat = minlat + (maxlat - minlat) / 2;
                zoomlon = minlon + (maxlon - minlon) / 2;

                var Boundary = new GLatLngBounds();
                Boundary.extend(new GLatLng(minlat, minlon, false));
                Boundary.extend(new GLatLng(maxlat, maxlon, false));
                zoomlevel = map.getBoundsZoomLevel(Boundary) - 1;

                // Google terrain maps only go down to zoom level 15
                if (zoomlevel > 15)
                    zoomlevel = 15;

                var center = Boundary.getCenter();
                map.setCenter(center, zoomlevel, G_PHYSICAL_MAP);

                showTopoLink(center.lat(), center.lng());
            } // gpxDoc
        } // readyState
    }                               // function
    request.send(null);
}

function GetMyTopoTile(a, b, c) {
    var lURL = this.myBaseURL;
    lURL += b;
    lURL += "/" + a.x;
    lURL += "/" + a.y + ".png";
    return lURL;
}

function AddMyTopo(map) {
    var mytopoCopy = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, '&#169; MyTopo <a href="http://www.mytopo.com/google/index.cfm" target="_blank"><b>(Topo Maps Terms of Use)</b></a>')
    var mytopoc = new GCopyrightCollection('');
    mytopoc.addCopyright(mytopoCopy);

    var tileMytopo = new GTileLayer(mytopoc, 9, 15);
    tileMytopo.myLayers = 'topoG';
    tileMytopo.myFormat = 'image/png';
    tileMytopo.myBaseURL = 'http://maps.mytopo.com/texashiking/tilecache.py/1.0.0/topoG/';

    tileMytopo.getTileUrl = GetMyTopoTile;

    var mytopoLayer = [tileMytopo];

    var MYTOPO_MAP = new GMapType(mytopoLayer, G_SATELLITE_MAP.getProjection(), "MyTopo", G_PHYSICAL_MAP);
    map.addMapType(MYTOPO_MAP);
    MYTOPO_MAP.shortName = 'None';
}
