﻿var map;
var geoXml;
var GMarkers = [];
var GMarkerTypes = [];
var bounds = new GLatLngBounds();

var geoCallback = function()
{
  // recenter the map
  geoXml.gotoDefaultViewport(map);
}

function LoadGMapLarge()
{
  if (GBrowserIsCompatible())
  {
    // init the map
    map = new GMap2(document.getElementById("GMap"));

    // add controls and set the default center
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    //map.addControl(new GOverviewMapControl());
    map.setCenter(new GLatLng(37.5, -120.0), 6);
  }
}

function LoadGMapSmall()
{
  if (GBrowserIsCompatible())
  {
    // init the map
    map = new GMap2(document.getElementById("GMap"));

    // add controls and set the default center
    map.addControl(new GSmallMapControl());
    map.setCenter(new GLatLng(37.5, -120.0), 6);
  }
}

function AddMarker(latitude, longitude, infoHtml, iconImage)
{
  // add a new marker
  var point = new GLatLng(latitude, longitude);
  var marker;
  
  if (iconImage == null)
  {
    marker = new GMarker(point);
  }
  else
  {
    var customIcon = new GIcon();
    customIcon.image = iconImage;
    customIcon.iconSize = new GSize(32, 32)
    customIcon.iconAnchor = new GPoint(32, 16);
    customIcon.infoWindowAnchor = new GPoint(1, 16);
    markerOptions = { icon:customIcon };
		marker = new GMarker(point, markerOptions);
  }
  
  // add the info window if necessary
  if (infoHtml != null)
  {
    GEvent.addListener(marker, "click", function() { map.openInfoWindowHtml(point, infoHtml); });
  }
  
  bounds.extend(point);

  // add the overlay to the map
  map.addOverlay(marker);
}

function CenterMap()
{
  // center the map
  map.setZoom(map.getBoundsZoomLevel(bounds));
  map.setCenter(bounds.getCenter());
}

function LoadXML(url, toggleControl)
{
  // download the file
  GDownloadUrl(url,
    function(data)
    {
      // get the xml document
      var xml = GXml.parse(data);
      
      var bounds = new GLatLngBounds();
            
      // get all the placemarks
      var markers = xml.documentElement.getElementsByTagName("Placemark");
      for (var i = 0; i < markers.length; i++)
      {
        // add the marker
        var marker = CreateMarkerFromNode(markers[i]);
        
        // add the marker to the bounds
        bounds.extend(marker.getPoint());
      }
      
      // set the zoom and center the map
      map.setZoom(map.getBoundsZoomLevel(bounds));
      map.setCenter(bounds.getCenter());
      
      // add the toggle controls if necessary
      if (toggleControl != null)
        AddToggleBoxes(toggleControl);
    }
  );
}

function CreateMarkerFromNode(node)
{
  // get a new point
  var pointNode = node.getElementsByTagName("Point")[0];
  
  var point = new GLatLng(parseFloat(GXml.value(pointNode.getElementsByTagName("Latitude")[0])),
                          parseFloat(GXml.value(pointNode.getElementsByTagName("Longitude")[0])));
  
  // create a new marker (checking if we should use a custom icon or not)
  var marker;
  
  // see if the marker has a custom icon
  var iconNode = pointNode.getElementsByTagName("Icon");
  if (iconNode.length == 0)
  {
    marker = new GMarker(point);
  }
  else
  {
    var customIcon = new GIcon();
    customIcon.image = GXml.value(iconNode[0]);
    customIcon.iconSize = new GSize(32, 32)
    customIcon.iconAnchor = new GPoint(16, 32);
    customIcon.infoWindowAnchor = new GPoint(16, 1);
    markerOptions = { icon:customIcon };
    marker = new GMarker(point, markerOptions);
  }
  
  // see if the marker has a custom type
  var typeNode = node.getElementsByTagName("Type");
  if (typeNode.length > 0)
  {
    marker.Type = GXml.value(typeNode[0]);
    AddToTypes(GXml.value(typeNode[0]));
  }
  
  // see if there are info windows
  var tabs = node.getElementsByTagName("Tab");
  if (tabs.length == 0)
  {
    return;
  }
  else if (tabs.length == 1)
  {
    // only one node, let's not create a tabbed window
    GEvent.addListener(marker, "click", function() { map.openInfoWindowHtml(point, GXml.value(tabs[0])); });
  }
  else
  {
    // multiple tabs, fun!
    GEvent.addListener(marker, "click",
      function()
      {
        var tabCollection = [];
        for (var i = 0; i < tabs.length; i++)
        {
          tabCollection.push(new GInfoWindowTab(tabs[i].getAttribute("Title"), GXml.value(tabs[i])));
        }
        marker.openInfoWindowTabsHtml(tabCollection);
      }
    );
  }
  
   // add the marker
  map.addOverlay(marker);
  
  // add the marker to the array
  GMarkers.push(marker);
  
  return marker;
}

function LoadPolyXML(url)
{
  // download the file
  GDownloadUrl(url,
    function(data)
    {
      // get the xml document
      var xml = GXml.parse(data);
      if (xml.documentElement == null)
        return;
      
      // get all the polys
      var polys = xml.documentElement.getElementsByTagName("Poly");
      if (polys == null)
        return;

      for (var i = 0; i < polys.length; i++)
      {
        var pointsArray = [];
        var points = polys[i].getElementsByTagName("Point");
        for (var j = 0; j < points.length; j++)
        {
          // push on each point to the array
          pointsArray.push(new GLatLng(
                          parseFloat(GXml.value(points[j].getElementsByTagName("Latitude")[0])),
                          parseFloat(GXml.value(points[j].getElementsByTagName("Longitude")[0]))));
        }
        
        // figure out the poly settings
        var outlineWidth = polys[i].getAttribute("OutlineWidth");
        var outlineColor = polys[i].getAttribute("OutlineColor");
        var outlineOpacity = polys[i].getAttribute("OutlineOpacity");
        var fillColor = polys[i].getAttribute("FillColor");
        var fillOpacity = polys[i].getAttribute("FillOpacity");
        
        var polygon = new GPolygon(pointsArray, outlineColor, outlineWidth, outlineOpacity, fillColor, fillOpacity);
		    map.addOverlay(polygon);
      }
    }
  );
}

function LoadControlTL(objectTag, x, y)
{
  var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));
  pos.apply(document.getElementById(objectTag));
  map.getContainer().appendChild(document.getElementById(objectTag)); 
}

function LoadControlBL(objectTag, x, y)
{
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(x,y));
  pos.apply(document.getElementById(objectTag));
  map.getContainer().appendChild(document.getElementById(objectTag)); 
}

function LoadControlBR(objectTag, x, y)
{
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(x,y));
  pos.apply(document.getElementById(objectTag));
  map.getContainer().appendChild(document.getElementById(objectTag)); 
}

function LoadControlTR(objectTag, x, y)
{
  var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(x,y));
  pos.apply(document.getElementById(objectTag));
  map.getContainer().appendChild(document.getElementById(objectTag)); 
}

function AddToTypes(type)
{
  // see if we already have the type
  for (var i = 0; i < GMarkerTypes.length; i++)
  {
    if (GMarkerTypes[i] == type)
      return;
  }
  
  // we don't, let's push it on
  GMarkerTypes.push(type);
}

function AddToggleBoxes(objectTag)
{
  // get the parent object
  var parent = document.getElementById(objectTag);
  if (parent == null)
    return;

  for (var i = 0; i < GMarkerTypes.length; i++)
  {
    // add a checkbox
    var checkbox = document.createElement("input");
    checkbox.type = "checkbox";
    checkbox.id = "chkTypeToggle" + i;
    parent.appendChild(checkbox);
    
    var span = document.createElement("span");
    span.innerHTML = GMarkerTypes[i] + "<br />";
    parent.appendChild(span);
    
    // default the box to checked
    document.getElementById("chkTypeToggle" + i).checked = true;
    
    // set the on click event
    document.getElementById("chkTypeToggle" + i).onclick = function() { ToggleCategory(this); }
  }
}

function ToggleCategory(checkbox)
{
  // get the type
  var index = checkbox.id.replace("chkTypeToggle", "");
  if (index == "")
    return;
  var type = GMarkerTypes[index];
  
  for (var i = 0; i < GMarkers.length; i++)
  {
    // check if the marker is of correct type
    if (GMarkers[i].Type == type)
    {
      if (checkbox.checked)
        GMarkers[i].show();
      else
        GMarkers[i].hide();
    }
  }
  
  // hide the info window if we are turning stuff off
  if (checkbox.checked == false)
    map.closeInfoWindow();
}

function UnloadGMap()
{
  // unload everything
  GUnload();
}