// JavaScript Document

var website = "http://www.utahfishinginfo.com";
var map;
var icons = [];
var gMarkers = [];
var gPolylines = [];
var gPolygons = [];
var markerCount = 0;
var initial_lat = 0;
var initial_lng = 0;
var initial_zoom = 0;
var default_zoom = 7;

function createMarker(point,html,icon)
{
	try
	{
		var themarker = new GMarker(point, icon); // point is a GLatLng

		GEvent.addListener(themarker, "click", function()
		{
			// Center the map on the marker that was clicked
			map.setCenter(point);

			// Open the InfoWindow with custom html
			themarker.openInfoWindowHtml(html);
		});

		GEvent.addListener(themarker, "mouseover", function()
		{
		   themarker.openInfoWindowHtml(html); // open but don't center
    });

    gMarkers[markerCount++] = themarker;
		return themarker;
	}
	catch(e)
	{
		alert("createMarker() error:  " + e + 
      "Please report this error to the site administrator.");
	}
} // end createMarker()

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// accepts a color name as a string as input, and returns the correct html hex
// code for that color.  If a nonsupported string is passed, the same string is
// returned (in case the hex code was what was provided)
// supported colors:
//  pink, red, orange, yellow, green, blue, purple, black, gray, white, brown
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function getHtmlColor(color)
{
  var html_color = color;
  switch (color)
  {
    case 'pink':
      html_color = '#FF66FF';
      break;
    case 'red':
      html_color = '#FF0000';
      break;
    case 'orange':
      html_color = '#FF6600';
      break;
    case 'yellow':
      html_color = '#FFFF00';
      break;
    case 'green':
      html_color = '#00FF00';
      break;
    case 'blue':
      html_color = '#0000FF';
      break;
    case 'purple':
      html_color = '#FF00FF';
      break;
    case 'black':
      html_color = '#000000';
      break;
    case 'gray':
      html_color = '#C0C0C0';
      break;
    case 'white':
      html_color = '#FFFFFF';
      break;
    case 'brown':
      html_color = '#CC6600';
      break;
  } // end switch
  return html_color;
} // end getHtmlColor()

function resetMap()
{
  map.setCenter(new GLatLng(initial_lat, initial_lng), initial_zoom);
} // end resetMap()

function load(file)
{
  // Create and initialize map
  map = new GMap2(document.getElementById("map"));
  var XML_FILE = website + "/maps/" + file + ".xml?" + Math.random();

  GDownloadUrl(XML_FILE, function(data, responseCode)
  {
	 try
	 {
	    // Get XML data
      var xml = GXml.parse(data);
      
      // Add optional map controls
      map.addMapType(G_PHYSICAL_MAP); // add Terrain
      map.removeMapType(G_SATELLITE_MAP); // Hybrid already contains satellite

      map.addControl(new GMenuMapTypeControl());
  		//map.addControl(new GMapTypeControl()); default
  		
  		// Set initial maptype
  		var initial_maptype = xml.documentElement.getAttribute('initial_maptype');
  		switch(initial_maptype)
  		{
  		  case 'SATELLITE':
          map.setMapType(G_SATELLITE_MAP);
  		    break;
  		  case 'HYBRID':
          map.setMapType(G_HYBRID_MAP);
  		    break;
  		  case 'TERRAIN':
  		    map.setMapType(G_PHYSICAL_MAP);
  		    break;
  		  case 'MAP':
  		  default:
  		    break;
      } // end switch

      var control = xml.documentElement.getAttribute('control');
      switch(control)
      {
        case 'NONE':
          break; // do nothing
        case 'LARGE':
          map.addControl(new GLargeMapControl()); // large zoom/pan control
          break;
        case 'SMALL':
        default:
          map.addControl(new GSmallMapControl()); // small zoom/pan control
          break;
      } // end switch
      
      var overview = xml.documentElement.getAttribute('overview');
      if (overview)
      {
        if (overview.toUpperCase() == 'TRUE')
        {
          map.addControl(new GOverviewMapControl()); // shows 'zoomed out' view
        }
      }
      
  		map.addControl(new GScaleControl()); // map scale

      // Set the map underlay (shows while map is loading)
      var underlay = xml.documentElement.getAttribute("underlay");
      if (underlay)
      {      
        document.getElementById("map").style.backgroundImage = "url(" + 
          underlay + ")";
      }

      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  		// Set the starting map location
  		//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      var lat = xml.documentElement.getAttribute("lat");
      var lng = xml.documentElement.getAttribute("lng");
      if (!lat)
      {
        lat = 39.55;
      }
      if (!lng)
      {
        lng = -111.538;
      }
      var zoom = xml.documentElement.getAttribute("zoom");
      if (!zoom)
      {
        zoom = default_zoom; // default zoom level
      }
      else
      {
        zoom = parseInt(zoom);
      }
      
      map.setCenter(new GLatLng(lat, lng), zoom);
      initial_lat = lat;
      initial_lng = lng;
      initial_zoom = zoom;
      
    	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// Adds event listeners that display the current coords of the map center
			// A debug function used while creating the map
			//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			var events = ["movestart", "moveend", "dragstart"];
			for (var i=0;i<events.length;i++)
			{
  			GEvent.addListener(map, events[i], function()
  			{
  				document.getElementById("message").innerHTML = "<p>Current Location: " + 
          map.getCenter().toUrlValue() + "</p><p>Current Zoom: " + map.getZoom() +
          "</p>\n";
  			});
  		} // end for
			//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      
      
      // Print initial map center and zoom level
      document.getElementById("message").innerHTML = "<p>Current Location: " + 
        map.getCenter().toUrlValue() + "</p><p>Current Zoom: " + map.getZoom() +
        "</p>\n";
        
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // Add Gmarkers
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      var markers = xml.documentElement.getElementsByTagName("marker");
		  
		  for (var i=0;i<markers.length;i++)
		  {
		    var color = markers[i].getAttribute("color");
		    if (!icons[color])
		    {
		      icons[color] = new GIcon();
		      icons[color].image = "../images/markers/" + color + "marker.png";
        	icons[color].shadow = "../images/markers/markershadow.png";
        	icons[color].iconSize = new GSize(12, 20);
        	icons[color].shadowSize = new GSize(22, 20);
        	icons[color].iconAnchor = new GPoint(6, 20);
        	icons[color].infoWindowAnchor = new GPoint(5, 1);
        }
        var caption = markers[i].getAttribute("caption");
        var html = "<div style='text-align:center;font-size:x-small;'><a href='" + 
          markers[i].getAttribute("url") + "'><img src='" + 
          markers[i].getAttribute("img") + "' alt='" + caption + "' title='" + 
          caption + "' border='0' /><br/>\n" + caption + 
          "</a><br/>\n" + xml.documentElement.getAttribute('title') + "</div>\n";
        
        var coord = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                parseFloat(markers[i].getAttribute("lng")));

        var gMarker = createMarker(coord, html, icons[color]);
        map.addOverlay(gMarker);
        gMarkers[i] = gMarker;
      } // end for
      
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // Add GPolylines
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      var lines = xml.documentElement.getElementsByTagName("line");
      
      for (var i=0;i<lines.length;i++)
      {
        var coords = lines[i].getElementsByTagName("coord");
        var color = getHtmlColor(lines[i].getAttribute('color'));
        var tmpLatLngs = [];
        for (var j=0;j<coords.length;j++)
        {
          tmpLatLngs[j] = new GLatLng(parseFloat(coords[j].getAttribute('lat')),
                                      parseFloat(coords[j].getAttribute('lng')));
        }
        var tmpGPolyline = new GPolyline(tmpLatLngs, color);
        map.addOverlay(tmpGPolyline);
        gPolylines[i] = tmpGPolyline;
      } // end for
      
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // Add GPolygons
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      var polygons = xml.documentElement.getElementsByTagName("polygon");
      
      for (var i=0;i<polygons.length;i++)
      {
        var coords = polygons[i].getElementsByTagName("coord");
        var color = getHtmlColor(polygons[i].getAttribute('color'));
        var fillcolor = getHtmlColor(polygons[i].getAttribute('fillcolor'));
        var weight = polygons[i].getAttribute('weight');
        var opacity = polygons[i].getAttribute('opacity');
        var tmpLatLngs = [];
        for (var j=0;j<coords.length;j++)
        {
          tmpLatLngs[j] = new GLatLng(parseFloat(coords[j].getAttribute('lat')),
                                      parseFloat(coords[j].getAttribute('lng')));
        }
        var tmpPolygon = new GPolygon(tmpLatLngs, color, weight, opacity, 
          fillcolor, opacity);
        map.addOverlay(tmpPolygon);
        gPolygons[i] = tmpPolygon;
      } // end for
   } // end try
   catch (e)
   {
    alert("There was an error: " + e);
   }
  });
} // end load()
