function GetTolerance(zoom)
{
	var tol = 0.01
//	if ($_GET['tol'] != null) return $_GET['tol'];
	if (zoom >=  5) tol = 0.05;
	if (zoom >=  7) tol = 0.01;
	if (zoom >=  9) tol = 0.005;
	if (zoom >= 10) tol = 0.001;
	if (zoom >= 12) tol = 0.0005;
	if (zoom >= 14) tol = 0.0001;
	if (zoom >= 16) tol = 0.00005;
	return tol;
}

function createListener(marker, title)
{
  var html = "<div style=\"width:200px\">" + title + "</div>";
  GEvent.addListener(marker, "mouseover", function() {
		marker.openInfoWindowHtml(html);
	});
}

function createTrackMarker(point, title, url, points) {
	var div = document.getElementById("tracks");
	if (div) div.innerHTML+= "<li>" + title + "</ul>";
	var marker = new GMarker(point, trackicon);
	createListener(marker, title);
	return marker;
}

function createRouteMarker(point, title, url, points) {
	var div = document.getElementById("routes");
	if (div) div.innerHTML+= "<li>" + title + "</ul>";
	var marker = new GMarker(point, routeicon);
	createListener(marker, title);
	return marker;
}

function createMarker(point, title, url, points) {
	var div = document.getElementById("waypoints");
	if (div) div.innerHTML+= "<li>" + title + "</ul>";
	var marker = new GMarker(point, detailicon);
	createListener(marker, title);
	return marker;
}

function Reset()
{
	map.clearOverlays();
	colors.Reset();
	var div;
	div = document.getElementById("tracks");
	if (div) div.innerHTML = "";
	div = document.getElementById("routes");
	if (div) div.innerHTML = "";
	div = document.getElementById("waypoints");
	if (div) div.innerHTML = "";
}

function Refresh(pid, tol, initial)
{
	var currentbox = map.getBounds();
	var div = document.getElementById("elevationurl");
	if (div) { 
		div.href = "/ElevationGraph.aspx?pid=" + pid + "&minlat=" + currentbox.getSouthWest().lat() + "&maxlat=" + currentbox.getNorthEast().lat() + "&minlon=" + currentbox.getSouthWest().lng() + "&maxlon=" + currentbox.getNorthEast().lng(); 
		div.onclick = function() { popupwindow("/ElevationGraph.aspx?pid=" + pid + "&minlat=" + currentbox.getSouthWest().lat() + "&maxlat=" + currentbox.getNorthEast().lat() + "&minlon=" + currentbox.getSouthWest().lng() + "&maxlon=" + currentbox.getNorthEast().lng()); return false };
	}
	if (WithinLoadedBox()) return;
	var datarequest = GXmlHttp.create();
	var newbox = ExpandBox(currentbox, 3);
	var url;
	if (!initial) {
		url = "/GData/GProject.aspx" + "?pid=" + pid + "&tol=" + tol + "&minlat=" + newbox.getSouthWest().lat() + "&maxlat=" + newbox.getNorthEast().lat() + "&minlon=" + newbox.getSouthWest().lng() + "&maxlon=" + newbox.getNorthEast().lng();
	} else {
		url = "/GData/GProject.aspx" + "?pid=" + pid + "&tol=" + tol;
	}
//	alert(url);
	UpdateProgress("Loading...");
	datarequest.open("GET", url, true);
	datarequest.onreadystatechange = function() 
	{
		if (datarequest.readyState == 4) {
			Reset();
			var xmlDoc = datarequest.responseXML;
			if (initial) {
				var b = xmlDoc.documentElement.getElementsByTagName("boundary");
				if (b && b.length == 1) {
					var bounds = new GLatLngBounds(new GLatLng(b[0].getAttribute("minlat"), b[0].getAttribute("minlng")), 
													new GLatLng(b[0].getAttribute("maxlat"), b[0].getAttribute("maxlng")));
					UpdateProgress("Zooming in...");
					updateZoom(bounds);
				}
				
			} else {
				var pts = [];
				UpdateProgress("Drawing tracks...");
					// Draw tracks
				var tracks = xmlDoc.documentElement.getElementsByTagName("track");
				for (var t = 0; t < tracks.length; t++) {
					var trackpoints = tracks[t].getElementsByTagName("point");
					DrawTrack(map, tracks[t].getAttribute("title"), trackpoints, pts);
				}
				UpdateProgress("Drawing routes...");
					// Draw routes
				var routes = xmlDoc.documentElement.getElementsByTagName("route");
				for (var r = 0; r < routes.length; r++) {
					var routepoints = routes[r].getElementsByTagName("point");
					DrawRoute(map, routes[r].getAttribute("title"), routepoints, pts);
				}
				UpdateProgress("Drawing waypoints...");
					// Draw waypoints
				var waypoints = xmlDoc.documentElement.getElementsByTagName("waypoint");
				DrawPoints(map, waypoints, pts);
			}
			lbox = newbox;
			lzoom = map.getZoom();
			UpdateProgress("");
		}
	}
	datarequest.send(null);
}

function Colors()
{
    this.colors = new Array('#FF0000','#00FF00','#0000FF', '#FFFF00', '#FF00FF', '#00FFFF');
    this.currentIndex = 0;
    this.Reset = function() {
		this.currentIndex = 0;
    }
    this.GetNextColor = function()
    {
        var color = this.colors[this.currentIndex];
        this.currentIndex++;
        if(this.currentIndex >= this.colors.length) this.Reset();
        return color;
    }
}

function DrawTrack(map, title, trackpoints, pts)
{
	//colors.GetNextColor()
	DrawLine(map, title, trackpoints, pts, "#FF0000", "tracks");
}

function DrawRoute(map, title, routepoints, pts)
{
	//colors.GetNextColor()
	DrawLine(map, title, routepoints, pts, "#0000FF", "routes");
}

function DrawLine(map, title, linepoints, pts, color, divname)
{
	var max = 1000;
	if (linepoints.length == 0) { return; }
	var linepts = [];
	for (var i = 0; i < linepoints.length && i < max; i++) {
		var linepoint = new GLatLng(parseFloat(linepoints[i].getAttribute("lat")), parseFloat(linepoints[i].getAttribute("lng")));
		linepts.push(linepoint);
		pts.push(linepoint);
		if (i == 0) {
			var marker;
			if (divname == "routes") {
				marker = createRouteMarker(linepoint, "Route: " + title);
			} else if (divname == "tracks") { 
				marker = createTrackMarker(linepoint, "Track: " + title);
			} else {
				marker = createMarker(linepoint, "Start: " + title);
			}
			map.addOverlay(marker);
		}
		if (linepoints[i].getAttribute("eos") == "yes") {
			if (linepts.length >= 2) map.addOverlay(new GPolyline(linepts, color));
			linepts = [];
		}
	}
	if (linepoints.length == max) {
		if (linealert) alert("Too many points in line: " + linepoints.length + ", skipping remaining " + linepoints.length-max + " data points");
		linealert = 1;
	}
	if (linepts.length >= 2) map.addOverlay(new GPolyline(linepts, color));
}

function DrawPoints(map, waypoints, pts)
{
	var max = 100;
	for (var i = 0; i < waypoints.length; i++) {
		var point = new GLatLng(parseFloat(waypoints[i].getAttribute("lat")), parseFloat(waypoints[i].getAttribute("lng")));
		var title = waypoints[i].getAttribute("title");
		pts.push(point);
		var marker = createMarker(point, "Waypoint: " + title + "<br>" + waypoints[i].getAttribute("desc"));
		map.addOverlay(marker);
		if (i > max) {
			if (!waypointalert) alert("Too many waypoints (" + waypoints.length + "), skipping remaining " + (waypoints.length-max));
			waypointalert = 1;
			return;
		}
	}
}

function updateZoom(bounds)
{
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)-1);
}

/*
function updateZoom(pts) {
	map.setCenter(new GLatLng(0,0),0);
	var bounds = new GLatLngBounds();
	for(var i = 0; i < pts.length; i++) {
		bounds.extend(new GLatLng(pts[i].y, pts[i].x));
	}
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)-1);
}
*/

var linealert = 0;
var waypointalert = 0;
var pid = 0;
var lbox = new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180));
var lzoom = -1;
var map;
var baseIcon;
var detailicon;
var colors = new Colors();

function GetMapType()
{
	switch (window.document.ProjectDetails.MapType.value)
	{
	 case "Hybrid": 	
		return G_HYBRID_MAP;
		break;
	 case "Map": 	
		return G_NORMAL_MAP;
		break;
	 case "Satellite": 	
		return G_SATELLITE_MAP;
		break;
	 case "Topo": 	
		return WMS_TOPO_MAP;
		break;
	 case "Terrain": 	
		return G_PHYSICAL_MAP;
		break;
	}
	return G_SATELLITE_MAP;
}

function WMSCreateMap(name, copyright, baseUrl, layer, format, transparent, minResolution, maxResolution, extraTileLayers, urlArg)
{
	var tileLayer = new GTileLayer(new GCopyrightCollection(copyright), minResolution, maxResolution);
	tileLayer.baseUrl = baseUrl;
	tileLayer.layer = layer;
	tileLayer.format = format;
	tileLayer.transparent = transparent;
	tileLayer.getTileUrl = WMSGetTileUrl;
	tileLayer.getCopyright = function(){
		return {prefix:'', copyrightTexts:[copyright]};	
	};
	var tileLayers=[];
	for(var i in extraTileLayers) tileLayers.push(extraTileLayers[i]);
	tileLayers.push(tileLayer);
//	return new GMapType(tileLayers, G_SATELLITE_MAP.getProjection(), name, {errorMessage:_mMapError,urlArg:'o'});
	return new GMapType(tileLayers, G_SATELLITE_MAP.getProjection(), name, {urlArg:'o'});
}

function WMSGetTileUrl(tile, zoom)
{
	var southWestPixel = new GPoint(tile.x * 256, (tile.y+1) * 256);
	var northEastPixel = new GPoint((tile.x+1) * 256, tile.y*256);
	var southWestCoords = G_NORMAL_MAP.getProjection().fromPixelToLatLng(southWestPixel,zoom);
	var northEastCoords = G_NORMAL_MAP.getProjection().fromPixelToLatLng(northEastPixel,zoom);
	var bbox = southWestCoords.lng() + ',' + southWestCoords.lat() + ',' + northEastCoords.lng() + ',' + northEastCoords.lat();
	var transparency = this.transparent?'&TRANSPARENT=TRUE':'';
	return this.baseUrl+'?VERSION=1.1.1&REQUEST=GetMap&LAYERS='+this.layer+'&STYLES=&SRS=EPSG:4326&BBOX='+bbox+'&WIDTH=256&HEIGHT=256&FORMAT='+this.format+'&BGCOLOR=0xCCCCCC&EXCEPTIONS=INIMAGE'+transparency;
}

var WMS_TOPO_MAP = WMSCreateMap('Topo (USA)','Imagery by USGS/Web Service by TerraServer-USA', 'http://www.terraserver-usa.com/ogcmap6.ashx', 'DRG', 'image/jpeg', false, 4, 17, [], 't');

function createMap() 
{
	if (!GBrowserIsCompatible()) return;
	map = new GMap2(document.getElementById("map"));
	map.addMapType(G_PHYSICAL_MAP);
	map.addMapType(WMS_TOPO_MAP);
	map.enableDoubleClickZoom();
	map.enableContinuousZoom();
	AddDiv(map, "legend", G_ANCHOR_TOP_RIGHT, new GSize(9, 30));
	AddDiv(map, "link", G_ANCHOR_BOTTOM_RIGHT, new GSize(2, 30));
	AddDiv(map, "include_instructions", G_ANCHOR_TOP_LEFT, new GSize(50, 50));
	AddDiv(map, "link_instructions", G_ANCHOR_TOP_LEFT, new GSize(50, 50));
	AddDiv(map, "progress", G_ANCHOR_TOP_RIGHT, new GSize(100, 30));	
//	AddDiv(map, "tracklisting");
	map.addControl(new GLargeMapControl());
	map.addControl(new GHierarchicalMapTypeControl());
	baseIcon = new GIcon();
	baseIcon.shadow = "/images/GMap/mm_20_shadow.png";
	baseIcon.iconSize = new GSize(12, 20);
	baseIcon.shadowSize = new GSize(22, 20);
	baseIcon.iconAnchor = new GPoint(6, 20);
	baseIcon.infoWindowAnchor = new GPoint(13, 13);
	baseIcon.infoShadowAnchor = new GPoint(13, 13);
	detailicon = new GIcon(baseIcon);
	detailicon.image = "/images/GMap/mm_20_gray.png";
	trackicon = new GIcon(baseIcon);
	trackicon.image = "/images/GMap/mm_20_red.png";
	routeicon = new GIcon(baseIcon);
	routeicon.image = "/images/GMap/mm_20_blue.png";

	parseGet();
	if (window && window.document && window.document.ProjectDetails && window.document.ProjectDetails.PID)
		pid = window.document.ProjectDetails.PID.value;
//	pid = $_GET['pid'];

	map.setCenter(new GLatLng(0, 0), 1, GetMapType());
	GEvent.addListener(map, "moveend", function() {
		var tol = GetTolerance(map.getZoom());
		Refresh(pid, tol, 0);
		});
	Refresh(pid, 0.005, 1);
//    if (window.attachEvent) { 
//	    window.attachEvent("onresize", function() {this.map.onResize()} );
//	  } else {
//		window.addEventListener("resize", function() {this.map.onResize()} , false);
//    }
}

if(document.getElementById && document.createTextNode) {
	window.onload=function(){
		createMap();
	}
}