// copyright ©: Jon Pearson 2001-7

var adminMode = 0;

var map = null;
var mgr = null;
var pathOverlays = [];
var PATH_ZOOM = 16;
var DETAIL_LEVEL = 17;
var iconMajor = null;
var iconMinor = null;
var iconBoulder = null;
var iconParking = null;

var cragId = null;			// id of crag to zoom in to
var mapMode; 				// "main" or "mini"

var timer = 0;
var timerTotal = 0;
var TIMER_INTERVAL = 400;
var TIMER_TIMEOUT = 10000;

function createIcon(filename, width, height)
{
    var icon = new GIcon();
	icon.image = "images/" + filename;
	icon.iconSize = new GSize(width, height);
	icon.iconAnchor = new GPoint(width/2, height/2);
	icon.infoWindowAnchor = new GPoint(5, 1);
    return icon
}

function createIcons()
{
    iconMajor = createIcon("map-major-crag.gif", 19, 20);
	iconMinor = createIcon("map-minor-crag.gif", 15, 15);
	iconBoulder = createIcon("map-boulder.gif", 15, 15);
	iconParking = createIcon("map-parking.gif", 15, 15);
}

function createMap()
{
    map = new GMap2(document.getElementById("map"));
    if (mapMode == "main")
    {
	    map.addControl(new GLargeMapControl());
	    map.addControl(new GOverviewMapControl());
		map.addMapType(G_PHYSICAL_MAP);
		map.removeMapType(G_HYBRID_MAP);
		map.addControl(new GMapTypeControl());
	    map.enableScrollWheelZoom();
	    map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(80,10)));

		map.setMapType(G_PHYSICAL_MAP);
	}
	else
	{
		map.addControl(new GSmallZoomControl());
	}
	
    map.enableDoubleClickZoom();
    map.setCenter(new GLatLng(54.0191, -1.9308), 9);
   	
    GEvent.addListener(map, "zoomend", zoomChangedCallback);
}

function showOrHidePaths(zoomLevel)
{
	if (zoomLevel >= PATH_ZOOM)
	{
		for (var i = 0; i != pathOverlays.length; ++i)
			map.addOverlay(pathOverlays[i]);
	}
	else
	{
		for (var i = 0; i != pathOverlays.length; ++i)
			map.removeOverlay(pathOverlays[i]);
	}
}

function zoomChangedCallback(oldLevel, newLevel) 
{
	if (newLevel >= PATH_ZOOM && oldLevel < PATH_ZOOM)
		showOrHidePaths(newLevel);
	else
	if (newLevel < PATH_ZOOM && oldLevel >= PATH_ZOOM)
		showOrHidePaths(newLevel);
}

function loadMap(mode, zoomCragId)
{
	mapMode = mode;
	cragId = zoomCragId;
	
	createIcons();
	createMap();
    createTimer();
    
    mgr = new GMarkerManager(map);
    
	if (mapMode == "mini")
   		hideCopyright();
  
	GDownloadUrl("servlet/mapcreator", parseXml);
}

function getIcon(type)
{
    var icon = null;    
    switch (type)
    {
        case "major": icon = iconMajor; break;
        case "minor": icon = iconMinor; break;
        case "boulder": icon = iconBoulder; break;
        case "parking": icon = iconParking; break;
    };
    return icon
}

function addMainMapClickHandlers(marker, html, link)
{
    GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
//		window.location = link;
    });
}

function addMainMapMouseoverHandlers(marker, html)
{    
    GEvent.addListener(marker, "mouseover", function() {
    	document.getElementById("map-description").innerHTML = html;
    });	
}

function addMiniMapHandlers(marker, title, link)
{
	if (link != null)
	{
	    GEvent.addListener(marker, "mouseover", function() {
	    	document.getElementById("map-description").innerHTML = 
	    		"<a href='" + link + "'>" + title + "</a>";
	    });
    
	    GEvent.addListener(marker, "click", function() {
	        window.location = link;
	    });
	}
}

function CragLocation(id, x, y)
{
	this.id = id;
	this.x = x;
	this.y = y;
}

function parseXml(data, responseCode)
{
	var zoomPoint = null;

    var xml = GXml.parse(data);   
    
    var levels = xml.documentElement.getElementsByTagName("level");
    for (var i = 0; i < levels.length; i++) 
    {
        var gmarkers = [];
        
        var minZoom = parseInt(levels[i].getAttribute("minZoom"));
        var maxZoom = parseInt(levels[i].getAttribute("maxZoom"));
        var markers = levels[i].getElementsByTagName("marker");

        for (var j = 0; j < markers.length; ++j)
        {
            var x = parseFloat(markers[j].getAttribute("x"));
            var y = parseFloat(markers[j].getAttribute("y"));
            var point = new GLatLng(x, y);
            var type = markers[j].getAttribute("type");
            var title = markers[j].getElementsByTagName("title")[0].childNodes[0].nodeValue;
            var items = markers[j].getElementsByTagName("item");
            var photo = markers[j].getElementsByTagName("photo").length == 0 ? null : markers[j].getElementsByTagName("photo")[0].childNodes[0].nodeValue;
            
            if (cragId != null && markers[j].getAttribute("cragId") == cragId)
				zoomPoint = point;
            
            var html = "";

			var firstLink = null;
						            
            if (photo != null)
            {
            	firstLink = items[0].getElementsByTagName("link").length == 0 ? null : items[0].getElementsByTagName("link")[0].childNodes[0].nodeValue;
                var style = "margin-right:8px; float:left; border:1px solid #991100; width:80px; height:80px"
				
				if (firstLink != null)
					html = "<a href='" + firstLink + "'>";
					
	            html += "<img alt=\"" + title + "\" title=\"" + title + "\" src=\"yg/thumbnails/" + photo + ".jpg\" style=\"" + style + "\"/>";
	            
	            if (firstLink != null)
	            	html += "</a>";
            }
            
            html += "<div style=\"background-color:white\">";
            
            for (var k = 0; k < items.length; ++k)
            {
                var text = items[k].getElementsByTagName("text")[0].childNodes[0].nodeValue;
                var link = items[k].getElementsByTagName("link").length == 0 ? null : items[k].getElementsByTagName("link")[0].childNodes[0].nodeValue;
                
                if (k == 0)
                	html += "<b>";
                
                if (link == null)
                    html += text;
                else
                    html += "<a href=\"" + link + "\">" + text + "</a>";
                
                if (k == 0)
                	html += "</b>";
 
 
 				if (text.indexOf("problems") != -1 && k < items.length-1)
 					html += "<br/>Nearby crags: ";
 				else
 				if (k != 0 && text.indexOf("Zoom") == -1 && text.indexOf("problems") == -1 && k != items.length-1)
					html += ", ";
				else
					html += "<br/>";
            }
            html += "</div>";

            // now add the marker
            var gmarker = new GMarker(point, { title: title, icon: getIcon(type) });
            
            if (mapMode == "main")
            {
	            addMainMapClickHandlers(gmarker, html, firstLink);
	            if (type == "major" || type == "minor" || type == "boulder")
	            	addMainMapMouseoverHandlers(gmarker, html);
	        }
	        else
	       	if (mapMode == "mini" && (type == "boulder" || type == "major" || type == "minor"))
		       	addMiniMapHandlers(gmarker, title, firstLink);
		       	
            gmarkers.push(gmarker);
        }
        mgr.addMarkers(gmarkers, minZoom, maxZoom);
    }

    // paths
    var paths = xml.documentElement.getElementsByTagName("path");
    for (var j = 0; j < paths.length; ++j) 
    {
    	var polypoints = [];
    	var points = paths[j].getElementsByTagName("point");
    	for (var k = 0; k != points.length; ++k)
    	{
            var x = parseFloat(points[k].getAttribute("x"));
            var y = parseFloat(points[k].getAttribute("y"));
    		polypoints.push(new GLatLng(x, y));
    	}
		pathOverlays.push(new GPolyline(polypoints, "#dddddd", 3));
	}
 
	if (zoomPoint != null)
	{
   		map.setCenter(zoomPoint, DETAIL_LEVEL);
    	map.setMapType(G_SATELLITE_MAP);
    	map.savePosition();
   	}
   	
    mgr.refresh();
    
    document.getElementById("map-wait").style.display = "none";
	
    stopTimer();
}

function hideCopyright()
{
    document.getElementById("map").childNodes[1].style.display = "none";
}

function createTimer()
{
	timerTotal += TIMER_INTERVAL;
	if (timerTotal > TIMER_TIMEOUT)
	{
		stopTimer();
		document.getElementById("map-wait").innerHTML = "Failed to load map data";
	}
	else
		timer = setTimeout("timerCallback()", TIMER_INTERVAL);
}

function timerCallback()
{
	var el = document.getElementById("dots");
	var dots = "";
	switch (el.innerHTML)
	{
		case "": dots = "."; break;
		case ".": dots = ".."; break;
		case "..": dots = "..."; break;
		case "...": dots = ""; break;
	}
	el.innerHTML = dots;
	
	createTimer();
}

function stopTimer()
{
   if (timer)
   {
      clearTimeout(timer);
      timer  = 0;
   }
}



